/** 
/** ScrollerMa to funkcja pozwalająca na przewijanie zdjęć w zadany sposób
/**	@version 3.0 beta
/** @autor Łukasz Staliś
/**	@date 1-04-2009
/**	@company MediaAmbassador
/**	@rights All rights reserved
/**	
/**	need template like this:
/**			
			
			<div id="your id where scroller must be add">
				<ul class="clearfix">
					<li></li>
					<li></li>
					<li></li>
				</ul>
			</div>
		
			OR 
			
			<div id="your id where scroller must be add" class="clearfix">
				<item></item>
				<item></item>
				<item></item>
			</div>
			
			
			
	OPTIONS: 	

		mode:"horizontal",//how to move the items: custom(not supported),vertical,horizontal
		navType:"button",//type of scroll trigger: button, slider(not supported)
		steps:5,
		duration:500, //in milisecond
		itemsPerStep:1,
		lastFull:true,
		offset:0,
		items:'li',	//items to scroll
		next:'',	//next button if not default
		prev:'', 	//prev button if not default
		scroll:'',	// scroll object
		easing: 'linear', // needs effect.core.js form jQueryUI
		buttonsStillVisible:false,
		afterInit:function(obj){},
		beforeDestruct:function(obj,callback){callback(obj);},
		onBefore:function(obj,callback,pos){callback(obj,pos);},
		onAfter:function(obj){}
**/


jQuery.fn.extend({
	scrollerMa:function(settings,data){
		var obj=this;
		function update(obj,pos){
			
			var set=$(obj).data('set');
			var pSet=$(obj).data('pSet');
			if(pSet.lock)return;
			
			function gotoCallback(obj,pos){
				var set=$(obj).data('set');
				var pSet=$(obj).data('pSet');
				
				function makeMove(obj,a,b){
					
					$('#'+pSet.id+'MovingArea').stop().animate({left:a,top:b},set.duration,set.easing,function(){
						
						set.onAfter(obj);
						
					});
					
					
					
					if(pos>0)$(set.prev).removeClass("disable"); else $(set.prev).addClass("disable");
					if(pos+pSet.visible<pSet.length)$(set.next).removeClass("disable"); else $(set.next).addClass("disable");
					
					if(set.buttonsStillVisible){
						$(set.prev).show();
						$(set.next).show();					
					} else {
						if(pos>0)$(set.prev).show(); else $(set.prev).hide();
						if(pos+pSet.visible<pSet.length)$(set.next).show(); else $(set.next).hide();
						
					};
					
					
				};
				
				switch(set.mode){
					case 'horizontal':makeMove(obj,-1*(Math.floor(pos/set.itemsPerStep)*pSet.width)+set.offset,0);break;
					case 'vertical':makeMove(obj,0,-1*(Math.floor(pos/set.itemsPerStep)*pSet.height)+set.offset);break;
					case 'custom':{};break;
				};
				
				
				
				pSet.current=pos;
				pSet.lock=false;
			};
			pSet.lock=true;
			set.onBefore(obj,gotoCallback,pos);			
		};
		function next(obj){
			reflesh();
			var set=$(obj).data('set');
			var pSet=$(obj).data('pSet');
			if($(set.next).hasClass("disable"))return;
			var pos=pSet.current+pSet.mnoznik;
			if(set.lastFull&&set.itemsPerStep==1&&(pos+pSet.visible>pSet.length))pos=pSet.length-pSet.visible;
			
			update(obj,pos);
		};
		function prev(obj){
			var set=$(obj).data('set');
			var pSet=$(obj).data('pSet');
			if($(set.prev).hasClass("disable"))return;
			var pos=pSet.current-pSet.mnoznik;
			if(pos<0)pos=0;
		
			update(obj,pos);
		};
		function reflesh(){
			var set=$(obj).data('set');
			var pSet=$(obj).data('pSet');
			
			pSet.visible = (set.mode=='horizontal'?Math.floor(parseInt($('#'+pSet.id+'Wraper').css('width'))/pSet.width):Math.floor(parseInt($('#'+pSet.id+'Wraper').css('height'))/pSet.height));
		}
		function goto(obj,pos){
			var set=$(obj).data('set');
			var pSet=$(obj).data('pSet');
			if(pos<0||pos>=pSet.length)return;
			
			if(pos<pSet.current){
				pos=pos-pSet.visible+1;
				if(pos<0)pos=0;
				update(obj,pos);
			} else if(pos>=pSet.current+pSet.visible){
				if(set.lastFull&&set.itemsPerStep==1&&(pos+pSet.visible>pSet.length))pos=pSet.length-pSet.visible;
				update(obj,pos);
			};			
		};
		function destruct(obj){
			var set=$(obj).data('set');
			var pSet=$(obj).data('pSet');
			
			//sprawdza czy już usunięte
			if(set==null)return;
			
			function destructCallback(obj){
				var set=$(obj).data('set');
				var pSet=$(obj).data('pSet');
				//usuwanie przechowywania danych
				$(obj).removeData();
				//usuwanie eventów na buttonach
				if(set.navType=="button"){
					$(set.next).removeData();
					$(set.prev).removeData();
				};
				$(obj).html($('#'+pSet.id+'MovingArea').html());
				
			};	
			set.beforeDestruct(obj,destructCallback);
		};
		function init(obj,data){
			
			var set={
				mode:"horizontal",//how to move the items: custom(not supported),vertical,horizontal
				navType:"button",//type of scroll trigger: button, slider(not supported)
				steps:5,	//steps 
				duration:500, //in milisecond
				itemsPerStep:1,
				lastFull:true,
				offset:0,
				items:'li',
				next:'',
				prev:'',
				scroll:'',
				easing: 'linear',
				buttonsStillVisible:false,
				afterInit:function(obj){},
				beforeDestruct:function(obj,callback){callback(obj);},
				onBefore:function(obj,callback,pos){callback(obj,pos);},
				onAfter:function(obj){}
			};
			
			set=jQuery.extend(set,settings);
			
			var pSet={
				id:$(obj).attr("id"),
				mnoznik:set.steps*set.itemsPerStep,
				length:0,
				width:0,
				height:0,
				current:0,
				lock:false,
				visible: set.steps
			};
			
			var contentHtml='<div id="'+pSet.id+'Wraper"><div id="'+pSet.id+'MovingArea">'+$(obj).html()+'</div></div>';
			switch(set.navType){
				case 'button':{
						if(set.prev==''){
							set.prev='#'+pSet.id+'Prev';
							contentHtml='<a href="#" id="'+pSet.id+'Prev">Poprzednie</a>'+contentHtml;
						};
						if(set.next==''){
							set.next='#'+pSet.id+'Next';
							contentHtml=contentHtml+'<a href="#" id="'+pSet.id+'Next">Następne</a>';
						};
						$(obj).empty().append(contentHtml);
						$(set.next).click(function(){
							obj.scrollerMa('next');
							return false;
						});
						$(set.prev).click(function(){
							obj.scrollerMa('prev');
							return false;
						});						
				};break;
				case 'slider':{
						if(set.scroll=='')contentHtml=contentHtml+'<div id="'+pSet.id+'Slider">Tu powinien być slider</div>';
						$(obj).empty().append(contentHtml);
				};break;
			};
			
			$(obj).css({position:'relative'});
						
			$('#'+pSet.id+'Wraper').css({position:'relative',overflow:'hidden'});
			$('#'+pSet.id+'MovingArea').css({top:0,left:0,position:'relative'});
			$('#'+pSet.id+' '+set.items).css({float:'left',margin:0});
			
			pSet.length=$('#'+pSet.id+' '+set.items).length;
			
			
			pSet.width=$('#'+pSet.id+' '+set.items).outerWidth(true);
			pSet.height=$('#'+pSet.id+' '+set.items).outerHeight(true);
				
			var wd=0;
			var hd=0;
			
			
			switch(set.mode){
				case 'horizontal':{
					wd=pSet.width*pSet.length/set.itemsPerStep+pSet.length;
					hd=pSet.height*set.itemsPerStep+set.itemsPerStep;
					$('#'+pSet.id+'MovingArea').css({'top':0,'left':set.offset,'width':wd,'height':hd});
				};break;
				case 'vertical':{
					wd=pSet.width*set.itemsPerStep+set.itemsPerStep;
					hd=pSet.height*pSet.length/set.itemsPerStep+pSet.length;
					$('#'+pSet.id+'MovingArea').css({'left':0,'top':set.offset,'width':wd,'height':hd});					
				};break;
				case 'custom':{
							
				};break;
			
			};
			
			//sprawdź ile elementów widzi użytkownik( nie mylić z tym o ile przesuwa )
			pSet.visible = (set.mode=='horizontal'?Math.floor(parseInt($('#'+pSet.id+'Wraper').css('width'))/pSet.width):Math.floor(parseInt($('#'+pSet.id+'Wraper').css('height'))/pSet.height));
			
			$(set.prev).addClass("disable");
			if(pSet.visible>=pSet.length)$(set.next).addClass("disable");
			
			if(!set.buttonsStillVisible)$(set.prev).hide();			
			if((!set.buttonsStillVisible)&&pSet.visible>=pSet.length)$(set.next).hide();//?? nie testowane
			
			$(obj).data('set',set);
			$(obj).data('pSet',pSet);
			set.afterInit(obj);		
		};		
		
		
		
		switch(settings){
			case 'goto':goto(obj,data);break;
			case 'next':next(obj);break;
			case 'prev':prev(obj);break;
			case 'destruct':destruct(obj);break;
			default: init(obj,settings);break;
		};
		
}});
