// On Document Ready

var Slider = function (pars) {

	this.sliderID;
	this.sliderObject;
	this.slideWidth = 			150;
	this.slideHeight = 			150;
	this.sliderPadding = 		10;	
	this.currentSlide =  		0;
	this.imagesOnly = 			false; // false | true
	this.autoPlay = 				false; // false | true
	this.autoPlayDelay = 		0; // 0 | 1 | 2
	this.pagination = 			false; // false | true
	this.liveView = 				"image"; // false | "image" | "static" | "dynamic" 
	this.liveViewPos = 			"bottom"; // "bottom" | "top"
	this.liveViewMask = 		'rgba(0,0,0,0.9)';
	this.liveViewMode = 		"box"; // "box" | "layer" | "popup"
	this.liveViewShowFirst = false; // false | true
	this.liveViewSlide = 		true; // false | true
	this.liveViewClose = 		true; // false | true
	this.opacityEffect = 		false; // false | true	
	this.orientation = 			"horizontal"; // "horizontal" | "vertical" 
	this.multiRow = 				false; // false | true
	this.shuffle = 					false; // false | true
	this.loop =							true; // false | true
	this.visible =					4;
	this.slideTime = 				200;
	this.jump = 						1;
	
	//console.log('Przepisuje parametry ----------------------');
	for(var i in pars) { this[i] = pars[i]; }
	//for(var i in this) { console.log(i," = ",this[i]); }
	
	if (this.sliderID) {
		var slider = WP.$('#' + this.sliderID);
		if (!slider) {
			throw("Nie istnieje slider o podanym ID!");	
			return;
		}		
	} else if (this.sliderObject) {
		var slider = this.sliderObject;		
	} else {
		throw("Brakuje ID slidera!");	
		return;
	}
	
	var sldrHldr = slider.find('.sliderHolder');	
	var sldsCntnr = slider.find('.slidesContainer');
	var slds = slider.find('.slide');
	
	var sldrBtns = slider.find('.sliderNavi');
	var btnPrv = slider.find('.sliderButtonPrev');
	var btnNxt = slider.find('.sliderButtonNext');
	var pgnBtns;

	var sldrVw;
	var sldrVwImg;	
	var sldrVwVsbl = false;
	var sldrVwCls;
	var sldrVwClsBtn;
	
	var dirNxt = 1;
	var dirPrv = -1;
	var dirChngd;
	var lastDir = 1;
	var dir = 0;	
		
	switch(this.orientation) {
		case "horizontal":  
			var cssPosPar = 'left';
			var cssDimPar = 'width';
			var cssDimParOrt = 'height';
			var sldDim = this.slideWidth;
			var sldDimOrt = this.slideHeight;
			break;
		case "vertical":  
			var cssPosPar = 'top'; 
			var cssDimPar = 'height';
			var cssDimParOrt = 'width';
			var sldDim = this.slideHeight;
			var sldDimOrt = this.slideWidth;
			break;
	}
	
	var liveView = this.liveView;
	var liveViewPos = this.liveViewPos;
	var liveViewMask = this.liveViewMask;
	var liveViewMode = this.liveViewMode;
	var liveViewShowFirst = this.liveViewShowFirst;
	var liveViewClose = this.liveViewClose;
	var liveViewSlide = this.liveViewSlide;
	
	var queue = new Array();
	var visible = this.visible;
	var pagination = this.pagination;
	var autoPlay = this.autoPlay;	
	var autoPlayBtn;
	var autoPlayDelay = this.autoPlayDelay;
	var autoDelays = [15000,10000,7000]; // w milisekundach	
	var autoPlayStatus  = false;
	var slideTime = this.slideTime;
	var sliderPadding = this.sliderPadding;
	var imagesOnly = this.imagesOnly;
	var jump = this.jump;
	var loop = this.loop;
	var shuffle = this.shuffle;
	var vIndx;
	var bIndx = 0;
	var sIndx = this.currentSlide-1;
	var multiRow = this.multiRow;
	var opacityEffect = this.opacityEffect;
	var sldsNmbr = slds.length;	
	var queLmt = sldsNmbr - visible;
	var strtd = false;
			
	var onNaviClick = function(e) 
	{
		//console.log("onNaviClick",e);		
		if (WP.$(e.target).hasClass('sliderButtonPrev')) {
			if (queue.length < queLmt) queue.push(dirPrv);
			vIndx = vIndx > 0 ? vIndx - 1 : slds.size()-1;
		}
		if (WP.$(e.target).hasClass('sliderButtonNext')) {
			if (queue.length < queLmt) queue.push(dirNxt);  
			vIndx = vIndx < slds.size()-1 ? vIndx + 1 : 0;
		}
		if (!strtd) onComplete();	
		if (liveViewSlide && sldrVwVsbl)  slds.eq(vIndx).click();
		
		e.preventDefault(); 	
		e.stopPropagation();
	};
	
	
	var onComplete = function ()
	{
		//console.log("---------- onComplete",sIndx,jump,dir);		
		initControls();
		normalizePosition();
		updatePagination();
		if (queue.length)
		{
			strtd = true;
			var newDir = queue.pop();			
			if (lastDir != newDir) dirChngd = true;
			else dirChngd = false;
			lastDir = dir = newDir;
			sIndx += jump * dir;
			bIndx = (slds.size() + sIndx) % slds.size();			
			rangePosition();
			slide();
		} else {
			strtd = false;
			dir = 0;	
		}
	}
	
	var slide = function () 
	{
		//console.log("slide", sIndx, sldDim);
		preparePosition();
		upadePosition();
		var pars = new Object();
		pars[cssPosPar] = -sIndx * sldDim;		
		sldsCntnr.animate( pars, slideTime, onComplete);
	};
	
	var preparePosition = function () 
	{
		//console.log("preparePosition");
		if (dirChngd) {
			if (dir == dirPrv) appendSlide(sldsCntnr.find('.slide').first());
			if (dir == dirNxt) prependSlide(sldsCntnr.find('.slide').last());
		}
	};	
	
	var upadePosition = function () 
	{
		//console.log("upadePosition");
		if (dir == dirNxt) appendSlide(sldsCntnr.find('.slide').first());
		if (dir == dirPrv) prependSlide(sldsCntnr.find('.slide').last());
	};
	
	var appendSlide = function (itemSlide , newPos) 
	{
		//console.log("appendSlide",itemSlide , newPos);
		if (newPos) itemSlide.css(cssPosPar, newPos);
		else itemSlide.css(cssPosPar, parseInt(itemSlide.css(cssPosPar)) + sldDim * sldsNmbr);
		sldsCntnr.append(itemSlide);
	};
	
	var prependSlide = function (itemSlide, newPos) 
	{
		//console.log("prependSlide",itemSlide, newPos);
		if (newPos) itemSlide.css(cssPosPar, newPos);
		else itemSlide.css(cssPosPar, parseInt(itemSlide.css(cssPosPar)) - sldDim * sldsNmbr);
		sldsCntnr.prepend(itemSlide);
	};
	
	var rangePosition = function () 
	{ 
		//console.log("rangePosition");
		if (!loop) sIndx = Math.max(Math.min(sIndx, sldsNmbr-visible), 0);
	};

	var normalizePosition = function () 
	{ 
		//console.log("normalizePosition");
		if (Math.abs(parseInt(sldsCntnr.css('left'))) >= parseInt(sldsCntnr.width())) 
		{
			sldsCntnr.css('left',0);
			sIndx = 0;			
			lastDir = 1;
			initPositions();
		}		
	};

	var initControls = function() 
	{
		//console.log("initControls",sldsNmbr , visible);
		if (!loop) {
			if (sIndx == 0)  btnPrv.removeClass('active').unbind('click')
			else btnPrv.addClass('active').unbind('click').bind('click', onNaviClick);
			if (sIndx == sldsNmbr - visible) btnNxt.removeClass('active').unbind('click')
			else  btnNxt.addClass('active').unbind('click').bind('click', onNaviClick);
		}																
	};
	
	
	var initLiveView = function () 
	{
		//console.log("initLiveView");
		if (liveView) 
		{
			sldrVw = WP.$("<div/>");
			sldrVw.hide();			
			sldrVw.addClass('sliderView');
			
			switch (liveViewMode)
			{
				case "layer": 
					sldrVw.css({
						'position':'fixed',
						'z-index':'1000',
						'left':'0px',
						'top':'0px',
						'width':'100%',
						'height':'100%',
						'background-color': liveViewMask
					}); 	
					WP.$("body").append(sldrVw);
					break; 
				case "popup": 
					break;
				case "box": 
				case false:
				
					if (!liveViewPos || liveViewPos == "bottom") {
						sldrVw.appendTo(slider);	
					} else if (liveViewPos == "top") {
						sldrVw.insertBefore(slider);	
					}
					sldrVw.css({'position':'relative'}); 
					break;
			}					
			switch (liveView) 
			{		
				case "image": initLiveViewImage(); break;
				case "static": initLiveViewStatic(); break;
				case "dynamic": initLiveViewDynamic(); break;			
			}						
		}
	};	
	
	var initLiveViewDynamic = function () 
	{
		// TODO
	};
	
	var initLiveViewStatic = function () 
	{
		// TODO		
	};
	
	var hideLayer = function()
	{
		//console.log("hideLayer");
		WP.$("body").unbind('keyup',onLiveKeyUp).css('overflow','visible');
		sldrVwImg.unbind('mouseover',onLiveMouseOver);
		sldrVwImg.unbind('mousemove',onLiveMouseMove);
		sldrVwImg.unbind('mouseout',onLiveMouseOut);
		slds.find('a').removeClass('active');
		slds.removeClass('active');
		
		if (liveViewSlide) {
			btnPrv.appendTo(slider);
			btnNxt.appendTo(slider);
			autoPlayBtn.appendTo(slider);
		}	
		
		sldrVw.fadeOut();
		sldrVwVsbl = false;
	};
	
	var onLiveKeyUp = function(e) { if (e.keyCode == 27) hideLayer(); };
	var onLiveMouseOver = function(e) { sldrVwCls.show(); };
	var onLiveMouseOut = function(e) { sldrVwCls.hide(); };
	var onLiveMouseMove = function(e) { sldrVwCls.css({left:e.pageX + 10, top:e.pageY - 10}); };
	
	var initLiveViewImage = function () 
	{
		//console.log("initLiveViewImage");
		if (liveViewClose) { 			
			sldrVwCls = WP.$("<div/>");
			sldrVwCls.addClass("sliderViewClose");
			sldrVwCls.css({'display':'block', 'position':'absolute'});
			sldrVwCls.append("zamknij [ESC]");
			sldrVwClsBtn = WP.$("<div/>");
			sldrVwClsBtn.addClass("sliderViewCloseButton");
			sldrVwClsBtn.css({'display':'block', 'position':'absolute'});
			sldrVwClsBtn.append("X");
		}
				
		sldrVwImg = WP.$("<img/>");
		sldrVwImg.addClass("sliderViewImg");
		sldrVwImg.appendTo(sldrVw);
		sldrVwImg.css({'display':'block', 'position':'absolute', 'top':'50%', 'left':'50%'});
		sldrVwImg.error(function() { throw("sliderViewImg.error: Brak pliku do pobrania."); });		
		sldrVw.click(hideLayer);
		sldrVwImg.click(hideLayer);
		sldrVwImg.load(function () 
		{										 		
			sldrVw.removeClass('loading');
			sldrVwImg.appendTo(sldrVw);
			if (liveViewClose) {
				sldrVwClsBtn.appendTo(sldrVw);
				sldrVwCls.appendTo(sldrVw).hide();			
				sldrVwImg.bind('mouseover',onLiveMouseOver);
				sldrVwImg.bind('mousemove',onLiveMouseMove);
				sldrVwImg.bind('mouseout',onLiveMouseOut);
			}
			sldrVwImg.mousemove();
			sldrVwImg.css({ marginTop : (-sldrVwImg.height()*0.5), marginLeft : (-sldrVwImg.width()*0.5) });
			sldrVwImg.fadeIn();			
		});	
	
		if (multiRow) {
			slds.find('a').click(function(e){ 
												
				var sldItm = WP.$(this);				
				if ( sldItm.hasClass('active') ) return false;			
				
				WP.$("body").bind('keyup',onLiveKeyUp).css('overflow','hidden');
	
				if (liveViewSlide) {
					btnPrv.appendTo(sldrVw);
					btnNxt.appendTo(sldrVw);
					autoPlayBtn.appendTo(sldrVw);
				}	
				
				sldrVwImg.hide();					
				sldrVwImg.attr('src', sldItm.attr('href') + "?" + Math.random());
				
				sldrVw.addClass('loading');
				sldrVw.fadeIn();
				
				sldrVwVsbl = true;
				
				slds.find('a').removeClass('active');
				sldItm.addClass('active');							
											
				e.preventDefault(); 	
				e.stopPropagation();
			});		
		} else {
			slds.click(function(e) 
			{
				var sldItm = WP.$(this);	
				vIndx = slds.index(this);
				
				if ( sldItm.hasClass('active') ) return false;			
				
				WP.$("body").bind('keyup',onLiveKeyUp).css('overflow','hidden');
				
				if (liveViewSlide) {
					btnPrv.appendTo(sldrVw);
					btnNxt.appendTo(sldrVw);
					autoPlayBtn.appendTo(sldrVw);
				}	
				
				sldrVwImg.hide();					
				sldrVwImg.attr('src', sldItm.find('a').attr('href') + "?" + Math.random());
				
				sldrVw.addClass('loading');
				sldrVw.fadeIn();
				
				sldrVwVsbl = true;
				
				slds.removeClass('active');
				sldItm.addClass('active');	
				
				e.preventDefault();
				e.stopPropagation();
			});
		}
		
		if (liveViewShowFirst) {
			if (multiRow) {
				slds.find('a').eq(0).click();
			} else {
				slds.eq(0).click();
			}
		}
	};
	
	var initOpacityEffect = function ()
	{
		if (opacityEffect) {
			slds.hover( 
				function () { WP.$(this).css('opacity','0.9'); },
				function () { WP.$(this).css('opacity','1'); }
			);
		}
	}
		
	var initSlides = function () 
	{
		// tasuje slajdy jezeli trzeba
		if (shuffle) slds = slds.detach().shuffle().appendTo(sldsCntnr);
		initPositions();
	}
	
	var initPositions = function() 
	{
		// pozycjonuje slajdy
		slds.each( function (i, v) { 
				var item = WP.$(v).css(cssPosPar, i * sldDim);
				if (imagesOnly) {
					var itemA = item.find("a");
					var itemImg = itemA.find("img");
					itemImg.css({marginTop: - itemImg.height()/2, marginLeft: -itemImg.width()/2 }); 
					itemA.height(itemA.width()*itemImg.height()/itemImg.width());
					if (itemA.height()>slider.height()-sliderPadding*2) itemA.height(slider.height()-sliderPadding*2);
					itemA.css({marginTop: (slider.height()-itemA.height())/2});
				}
		});
		// ostatnie przesuwam na poczatek
		var j;
		console.log("zmiana");
		//for ( j=0  ; j<sIndx; j++) { console.log(j);	 prependSlide( slds.eq( sldsNmbr-j-1 ) , -(j+1)*sldDim ); } 		
		for ( j=0 ; j<queLmt - sIndx; j++) { console.log(j);	 prependSlide( slds.eq( sldsNmbr-j-1 ) , -(j+1)*sldDim ); } 	
	}
	
	var initContainer = function () 
	{
		//console.log("initContainer");	
		// ustawiam rozmiary kontenera slajdera
		sldrHldr.css(cssDimPar , sldDim * visible ).css(cssDimParOrt , sldDimOrt );
		sldsCntnr.css(cssDimPar , sldDim * sldsNmbr ).css(cssDimParOrt , sldDimOrt );
		
		// ustawiam poczatkowa pozycje kontenera 
		sldsCntnr.css(cssPosPar , -sIndx * sldDim);
		
		// ustawiam nawigacje
		sldrBtns.noSelect().removeClass('inactive').addClass('active').click(onNaviClick);
	}	

	var updatePagination = function () 
	{	
		//console.log("updatePagination");
		if (visible == 1) {
			var btnItm = pgnBtns.eq(bIndx);		
			if (!btnItm.hasClass('active')) {
				pgnBtns.removeClass('active');
				btnItm.addClass('active');
			}
		}
	};

	var initPagination = function () 
	{		
		//console.log("initPagination");
		if (pagination || visible == 1) {
			var pgnHldr = WP.$("<div/>").addClass("sliderPagination").noSelect();
			
			for (var i=0; i < slds.length; i++ )
				WP.$("<span/>").addClass('paginButton').text(i+1).appendTo(pgnHldr);
			
			pgnBtns = pgnHldr.find("span");
			updatePagination();
			
			if (visible == 1) {
				pgnHldr.appendTo(slider);
				pgnBtns.click(function(e){ 
					
					var btnItm = WP.$(this);			
					var index = pgnBtns.index(this);		
					if (btnItm.hasClass('active')) return false;
				
					pgnBtns.removeClass('active');
					btnItm.addClass('active');
											
					if (bIndx < index) for (var i =0 ; i < index-bIndx ; i++) queue.push(dirNxt);
					if (bIndx > index) for (var i =0 ; i < bIndx-index ; i++) queue.push(dirPrv);
					if (!strtd) onComplete();	
				
					e.preventDefault();
					e.stopPropagation();
				});
			
				if (pagination) 
				{
					pgnHldr.appendTo(slider);
					pgnBtns.click(function(e){ 
										
						var sldItm = slds.eq(pgnBtns.index(this));				
						if ( sldItm.hasClass('active') ) return false;							
			
						if (liveView) {
							sldrVwImg.hide();					
							sldrVwImg.attr('src', sldItm.find('a').attr('href') + "?" + Math.random());
							sldrVw.addClass('loading');
							sldrVw.fadeIn();
						}
						
						slds.removeClass('active');
						sldItm.addClass('active');
						
						e.preventDefault();
						e.stopPropagation();
					});
				}
			}
		}
	};
	
	var onEnter = function()
	{
		if (autoPlayStatus) {
			slider.stop(true);
		}
	}
	
	var onLeave = function()
	{
		if (autoPlayStatus) {
			slider.wait(autoDelays[autoPlayDelay], function() {
				btnNxt.click();
				slider.mouseleave();
			});
		}
	}
	
	var initAutoPlay = function() 
	{	
		//console.log("initAutoPlay");
		if (autoPlay)
		{							
			slider.mouseleave(onLeave).mouseenter(onEnter);
			sldrBtns.mouseleave(onLeave).mouseenter(onEnter);
			
			autoPlayBtn = WP.$("<div>")
			.text("PLAY")		
			.addClass("autoPlayButton")
			.appendTo(slider)
			.click( function (e) {
				if (autoPlayStatus) {
					WP.$(this).text("PLAY")		
					slider.mouseenter();
					autoPlayStatus = false;
				} else {
					WP.$(this).text("STOP")		
					autoPlayStatus = true;
					btnNxt.click();
					slider.mouseleave();
				} 
				e.preventDefault(); 	
				e.stopPropagation();
			});
		}						
	}

	this.run = function () 
	{
		//console.log("run");
		initContainer ();
		initSlides();	
		initLiveView ();
		initPagination ();
		initOpacityEffect ();
		initControls ();
		initAutoPlay ();
	};
};





(function($){
	$.fn.noSelect = function() {
		return this.each(function() {
			if ($.browser.mozilla) {
				$(this).css('MozUserSelect','none');
			} else if ($.browser.msie) {
				$(this).bind('selectstart', function() {
					return false;
				});
			} else {
				$(this).mousedown(function() {
					return false;
				});
			}
		});
	};
	
	$.fn.wait = function (MiliSeconds,cb) {
		$(this).animate({ opacity: '+=0' }, MiliSeconds, cb);
		return this;
	}
	
	$.fn.shuffle = function() {
			var slds = WP.$(this);
			var newSlds = WP.$();
			var allLen = slds.size();
			do {	
				var elem = slds.eq(Math.floor(Math.random()*(slds.size()-1)));
				slds = slds.not(elem);
				newSlds = newSlds.add(elem.clone());
			}	while (newSlds.size() < allLen);
			return newSlds;
	};
})(WP.$);


