/**
 * jQuery dynamicSLider, dynamicCircular v.1.0 * 
 * Copyright 2011 by Jaroslaw Lach <pan.lach.jarek@gmail.com>
 * Rozpowszechnianie tego programu bez zgody autora jest zabronione. 
 */

(function( $ ){

	/**
	 * dynamic slider plugin
	 */
	 
	$.fn.dynamicSlider = function( externalConfig ) {		
	
		/**
		 *  konfiguracja (ustawienie wartosci poczatkowych)
		 */
		
		var defaults = {
			element 	: 'dynamicElement',
			easing		: 'swing',
			loadSpeed	: 1000,
			loaderDelay	: 1000,
			loaderFade	: 300,
			slideSpeed	: 800,
			isCufon		: false
		}		
		var config 		= $.extend( defaults, externalConfig );
		config.bar 	 	= (config.bar)?config.bar:config.element+'Bar';
		config.content 	= (config.content)?config.content:config.element+'Content';
		config.active  	= (config.active)?config.active:config.element+'Active';
		config.arrow 	= (config.arrow)?config.arrow:config.element+'Arrow';
		config.loader  	= (config.loader)?config.loader:config.element+'Loader';
		config.hover   	= (config.hover)?config.hover:config.element+'Hover';
		for(var i in config) {
			if(i != 'loadSpeed' && i != 'loaderDelay' && i != 'loaderFade' && i != 'slideSpeed' && i != 'easing' && i != 'hover' && i!= 'isCufon')
				config[i] = '.' + config[i];
		}
		return this.each(function() {
			$this = $(this);
			/**
			 *  ustawienie elementow slidera na pozycjach startowych (reset slidera)
			 */
			var barInternalWidth = parseInt($this.find(config.bar).css('width'));
			var barLeftBorder 	 = parseInt($this.find(config.bar).css('borderLeftWidth'));
			var barRightBorder 	 = parseInt($this.find(config.bar).css('borderRightWidth'));
			var barWidth = barInternalWidth+((isNaN(barLeftBorder))?0:barLeftBorder)+((isNaN(barRightBorder))?0:barRightBorder);
			var sliderWidth = parseInt($this.css('width'),10)-$this.children(config.element).length*barWidth;
			var lock = 0;		
			$this.children().find(config.content).css({width: sliderWidth});
			$this.find(config.element).each(function(index){
				if($this.find(config.active).index() < $(this).index()) {
					$(this).css({left:barWidth*index+sliderWidth+'px'});
				}
				else {
					$(this).css({left:barWidth*index+'px'});
				}
			});
			$this.show();
			$this.find(config.active).find(config.bar).append('<div class="'+config.arrow.replace('.','')+'"></div>').find(config.arrow).show();
			
			/**
			 *  definicja funkcji uruchamiajacej slider
			 */	
			function runDynamicSlider() {
				if($this.find(config.active).index() != $this.find(config.element).length-1){
					$element = $this.find(config.active).next();
				}else{
					$element = $this.find(config.element).eq(0);
				}	
				$element.find(config.bar).append('<div class="'+config.loader.replace('.','')+'"></div>');
				$element.find(config.loader).animate({height:$element.height()-parseInt($element.find(config.loader).css('margin-top'),10)-parseInt($element.find(config.loader).css('margin-bottom'),10)+'px'},config.loadSpeed, 'linear', function() {
					$(this).remove();
					moveTabs($element);
				});
			}
			function moveTabs($element) {
				$active = $this.find(config.active);
				if(lock != 2) lock = 1;
				if($active.index() < $element.index()) {
					$element.prevUntil(config.active).andSelf().animate({
						left:'-='+sliderWidth+'px'
					},config.slideSpeed, config.easing, function() {
						if(lock == 1) {
							lock = 0;
							runDynamicSlider();
						}				
					});			
				}else{			
					$element.nextUntil(config.active).add($active).animate({
						left:'+='+sliderWidth+'px'
					},config.slideSpeed, config.easing, function() {
						if(lock ==1 ) {
							lock = 0;
							runDynamicSlider();
						}	
					});
				}			
				$active.removeClass(config.active.replace('.','')).find(config.arrow).remove();
				$element.addClass(config.active.replace('.',''));
				if (config.isCufon)
					Cufon.refresh();
				$element.find(config.bar).append('<div class="'+config.arrow.replace('.','')+'"></div>').find(config.arrow).show();
			}
			
			/**
			 * uruchomienie poczatkowe slidera
			 */	
			runDynamicSlider(); 
			
			/**
			 * obsluga zdarzenia przelaczania zakladek slidera po kliknieciu mysza
			 */	
			
			$this.find(config.element+':not('+config.active+')').live('mouseenter', function() {
				$(this).addClass(config.hover);
			}).live('mouseleave',function() {
				$(this).removeClass(config.hover);
			}).find(config.bar).live('click', function() {
				$this.find(config.loader).stop().remove();
				$this.find(config.element).removeClass(config.hover);
				$element = $(this).parent();
				$this.find(config.element+':animated').stop(true, true);
				moveTabs($element);
			});			
			
			/**
			 * obsluga zdarzenia zatrzymywania slidera po najechaniu na niego kursorem / wznawiania po odjechaniu
			 */	
			/**
			$this.mouseenter(function() {
				if (this.timer) clearTimeout(this.timer);
				lock = 2;
				$(this).find(config.loader).stop().fadeOut(config.loaderFade, function() {$(this).remove();});
			}).mouseleave(function() {
				$this.find(config.element).removeClass(config.hover);
				lock = 0;
				$this = $(this);
				this.timer = setTimeout(function () {runDynamicSlider();},config.loaderDelay);			
			});
			*/
		});
	}
	
	/**
	 * dynamic circular plugin
	 */
	 
	$.fn.dynamicCircular = function( externalConfig ) {			
		var defaults = {
			root		: 'promo',
			easing		: 'swing',
			slideSpeed	: 800,
			slideDelay	: 3000
		}		
		var config 		= $.extend( defaults, externalConfig );
		config.belt 	= config.root+'Belt';
		config.element 	= config.root+'Element';
		for(var i in config) {
			if(i != 'slideSpeed' && i != 'easing' && i != 'slideDelay')
				config[i] = '.' + config[i];
		}
		return this.each(function() {
			var timer;
			var trigger = true;
			var $this 	= $(this);
			$belt = $this.find(config.belt);
			$beltPos = $belt.css('margin-left');
			$elements = $this.find(config.element);
			$belt.width(($elements.length+1)*$elements.width());
			circular();			
			function circular() {
				if (timer) clearTimeout(timer);
					timer = setTimeout(function () {
					$belt.animate({
						marginLeft: '-='+$this.find(config.element).width()+'px'
					}, config.slideSpeed, config.easing, function() {
						$belt.append($this.find(config.element).eq(0).clone()).find(config.element).eq(0).remove();
						$belt.css('margin-left',$beltPos);
						if(trigger) circular();
					});
				},config.slideDelay);
			}			
			$this.hover(function() {
				if (timer) clearTimeout(timer);
				trigger = false;
			}, function() {
				if (timer) clearTimeout(timer);
				trigger = true;
				circular();
			});			
		});
	}
})(jQuery);
