// 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.$);



