/**
* Globale Funktionen von Julian fuer gamescom
**/

if( typeof Object.create !== 'function'){
	Object.create = function(o){
		function F() {}
		F.prototype = o;
		return new F();
	};
}
if(typeof Function.prototype.method !== 'function'){
	Function.prototype.method = function(name, func) {
		this.prototype[name] = func;
		return this;
	}
};
if(typeof isArray !== "function") {
	function isArray(arr) {
		if(arr && typeof arr === 'object' && arr.constructor === Array) {
			return true;
		} else {
			return false;
		}
	}
}

/**
*  ENDE
* 
**/



/* TODO:
Klick auf Bild->Nächstes Bild
*/
$.fn.slider = function (settings) {
  var settings = $.extend({
      'className': 'slides',
      'numThumbs': 4,
      '$text': false,
      'scrollTimeEach': 150
    }, settings);

  function traverse(settings, steps) {
    var current = settings.$images.find('div.active').prevAll('div.slide').length;
    go_to (settings, current+steps);
  }

  function go_to (settings, num) {
    if (settings.$viewport.find('.active').queue().length) {
      return false;
    }
    if (settings.$images.find('div.slide').length  <= num) {
      return false;
    }
    settings.$images.find('div.active').removeClass('active');
    settings.$images.find('div.slide:eq(' + (num) + ')').addClass('active');
    
    settings.$selector.find('a.active').removeClass('active');
    settings.$selector.find('a.slide_select:eq(' + (num) + ')').addClass('active');

    settings.$viewport.append('<div class="slide next"></div>');
    settings.$viewport.find('.slide.next').html(settings.$images.find('div.slide:eq(' + (num) + ')').html());

    if (false && $('html').hasClass('csstransforms3d') && $('html').hasClass('csstransitions')) {
      settings.$viewport.find('.active').addClass('fading');
      var animations = {opacity:1}; //dummy-animation
    } else {
      var animations = {opacity:0};
    }
    settings.$viewport.find('.active').animate(animations, 500, 'swing', function() {
      // slides in $images anpassen
      $(this).parent().find('div.slide.next').addClass('active').removeClass('next').find('img:eq(0)').click(function() {traverse(settings, +1);});
      $(this).remove();
      checkVideo(settings);
      // in $selector auswählen
    });

    // Text handhaben
    if (settings.$text !== false) {
		for(position in settings.$text) {
			settings.$viewport_text[position].append('<div class="slide next"></div>');
			settings.$viewport_text[position].find('.slide.next').html(settings.$text[position].find('div.slide:eq(' + (num) + ')').html()).css('height', settings.$viewport_text[position].find('div.active').css('height'));

			if (false && $('html').hasClass('csstransforms3d') && $('html').hasClass('csstransitions')) {
				settings.$viewport_text[position].find('.active').addClass('fading');
				var animations = {opacity:1}; //dummy-animation
			} else {
				var animations = {opacity:0};
			}
			settings.$viewport_text[position].find('.active').animate(animations, 500, 'swing', function() {
				// slides in $text anpassen
				$(this).parent().find('div.slide.next').addClass('active').removeClass('next');
				$(this).remove();
			});
		}

    } // end if
	
	if(typeof($("a.open-form").fancybox) == 'function') {
		$("a.open-form").fancybox();
	}
    
  } // end goto

  function checkBounds(settings) {
    var $pagination = settings.$selector.find('.slides_pagination');
    var left = parseInt($pagination.css('left'));
    if (isNaN(left)) left = 0;
    if (left >= 0) {
      $('.slides_prev').addClass('inactive');
    } else {
      $('.slides_prev').removeClass('inactive');
    }

    var right_end = ($pagination.width() - settings.$selector.width())*-1 + 9;
    if (left <= right_end) {
      $('.slides_next').addClass('inactive');
    } else {
      $('.slides_next').removeClass('inactive');
    }
  }
  
  function checkVideo(settings) {
    if (settings.$viewport.find('img:eq(0)').attr('rel')) {
      settings.$viewport.find('img:eq(0)').before('<div class="slide-video-play"></div>');
      settings.$viewport.find('div.slide-video-play').css('cursor', 'pointer').click(function() {
        var $img = settings.$viewport.find('img:eq(0)');
        var yt_player = '<object width="640" height="395"><param name="movie" value="http://www.youtube.com/v/'+$img.attr('rel')+'?fs=1&amp;hl=de_DE&autoplay=1"></param><param name="wmode" value="opaque"><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube.com/v/'+$img.attr('rel')+'?fs=1&amp;hl=de_DE&autoplay=1" type="application/x-shockwave-flash" wmode="opaque" allowscriptaccess="always" allowfullscreen="true" width="640" height="395"></embed></object>';
        $img.unbind('click').replaceWith(yt_player);
        $(this).remove();
        return false;
      });
      
/*      settings.$viewport.find('img:eq(0)').css('cursor', 'pointer').click(function() {
        var yt_player = '<object width="640" height="395"><param name="movie" value="http://www.youtube.com/v/'+$(this).attr('rel')+'?fs=1&amp;hl=de_DE&autoplay=1"></param><param name="wmode" value="opaque"><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube.com/v/'+$(this).attr('rel')+'?fs=1&amp;hl=de_DE&autoplay=1" type="application/x-shockwave-flash" wmode="opaque" allowscriptaccess="always" allowfullscreen="true" width="640" height="395"></embed></object>';
        $(this).replaceWith(yt_player);
        
      });*/
    }
  }

  
  return this.each(function() {
    /* ----- init ----- */
    // Elemente in settings speichern (bilder, texte, selector)
    settings.$images = $('.'+settings.className+'.slides_container');
    settings.$selector = $('.'+settings.className+'.slides_control');
    
    // Selector anlegen
    settings.$selector.css({'max-width': ((49+11)*settings.numThumbs-9), 'height': (34+7), 'overflow': 'hidden', 'margin': 'auto', 'position' : 'relative'});
    var prev = '<a href="#" class="slides_prev" style="position: absolute; z-index:1; visibility: hidden; left: 0px; top: 0px"></a>';
    var next = '<a href="#" class="slides_next" style="position: absolute; z-index:1; visibility: hidden; left: 0px; top: 0px"></a>';

    var total_width = 0;
    settings.$selector.find('.slide_select').each(function() {
      total_width += 49+11; // Nicht .width() benutzen, weil hier die Bilder vermutlich noch nicht fertig geladen sind
    });
    settings.$selector.after(prev).after(next);
    settings.$selector.find('.slides_pagination').css({'position':'absolute','width': total_width});
    checkBounds(settings);
    /* positionieren der Next/Prev-Schieber */
    window.onload = function() {
      var pos = settings.$selector.position();
      if (settings.$selector.css('margin-left')) { // Fix for webkit-browsers
        pos.left += parseInt(settings.$selector.css('margin-left'));
      }
      if ($('.slides_prev').hasClass('inactive') && $('.slides_next').hasClass('inactive')) {
      } else {
        $('.slides_prev').css({'left': (pos.left - 45), 'top': (pos.top + 5), 'visibility': 'visible'});
        $('.slides_next').css({'left': (pos.left + ((49+11)*settings.numThumbs)), 'top': (pos.top + 5), 'visibility': 'visible'});
      }
    };
    
    // <a href="#" class="slides_next"><img src="<?php bloginfo('template_directory'); ?>/img/slider-next.png" /></a>
    
    // Viewport anlegen
    var viewport = '<div class="'+settings.className+' viewport"><div class="slide active"></div></div>';
    settings.$images.before(viewport).css({display: 'none'});
    settings.$viewport = $('.'+settings.className+'.viewport');
    settings.$viewport.find('div.active').html(settings.$images.find('div.active').html()).find('img:eq(0)').click(function() {traverse(settings, +1);});
    checkVideo(settings);
    
    if (settings.$text !== false) {
		  // Um nicht nur ein Textfeld, sondern mehrere verwenden zu koennen, wirde $text zu einem Array gemacht
		  if(!isArray(settings.$text)) {
				settings.$text = [settings.$text];
		  }
		  if(!isArray(settings.$viewport_text)) {
		  	settings.$viewport_text = [];
		  }
		  // Loop all passed texts
		  for(position in settings.$text) {
		  	// Jedes Textfeld bekommt einen eigenen Viewport-Namen
		  	settings.$text[position].viewport_name = "viewport_" + settings.$text[position].selector.substr(1);
		  	
			  var viewport_text = '<div class="' + settings.className+ " " + settings.$text[position].viewport_name + ' text"><div class="slide active"></div></div>';
			  var max_height = 0;
			  settings.$text[position].each (function() {
				if (parseInt($(this).height()) > max_height) {
				  max_height = parseInt($(this).height());
				}
			  });

			  settings.$text[position].before(viewport_text).css({display: 'none'});
			  settings.$viewport_text[position] = $('.' + settings.className + '.' + settings.$text[position].viewport_name);
			  settings.$viewport_text[position].find('div.active').html(settings.$text[position].find('div.active').html());
			  settings.$viewport_text[position].find('div.slide').css('height', max_height);
		  }
    }
    
    $('.slides_next').click(function(){return false;}).mousedown(function(e) {
      var $pagination = settings.$selector.find('.slides_pagination');
      $(this).mouseup(function(){
        // Cancel animation
        $pagination.stop();
        checkBounds(settings);
        return false;
      });
      // 
      var right_end = ($pagination.width() - settings.$selector.width())*-1 + 9;
      var time = settings.scrollTimeEach * (settings.$selector.find('.slide_select').length - 4);
      var cur_left = parseInt($pagination.css('left'));
      if (isNaN(cur_left)) {cur_left = 0;}
      var factor = ((right_end - cur_left) / right_end);
      time = time * factor;
      setTimeout(function(){checkBounds(settings)}, 50);
      if (cur_left > right_end) {
        $pagination.animate({left: right_end}, time, 'linear', function(){checkBounds(settings)});
      }
      return false;
    });
    $('.slides_prev').click(function(){return false;}).mousedown(function() {
      var $pagination = settings.$selector.find('.slides_pagination');
      $(this).mouseup(function(){
        // Cancel animation
        $pagination.stop();
        checkBounds(settings);
        return false;
      });
      //
      var right_end = ($pagination.width() - settings.$selector.width())*-1 + 9;
      var time = settings.scrollTimeEach * (settings.$selector.find('.slide_select').length - 4);
      var cur_left = parseInt($pagination.css('left'));
      if (isNaN(cur_left) ) {cur_left = 0;}
      var factor = ((right_end - cur_left) / right_end);
      time = (1 - factor) * time;
      setTimeout(function(){checkBounds(settings)}, 50);
      if (cur_left <= 0) {
        $pagination.animate({left: 0}, time, 'linear', function(){checkBounds(settings)});
      }
      return false;
    });

    settings.$selector.find('.slide_select').click(function() {
      if ($(this).hasClass('active')) {
        return false;
      }
      var selected = $(this).prevAll('.slide_select').length;
      go_to(settings, selected);
      return false;
    });
    
  });   
}

