/*
Name: Slider
Author: Luca Dioli
Company: Ander-Web
*/

(function($) {
	$.fn.slider = function (options){
		
		var defaults = {
			'speed' : 500,
			'sliderDirection' : 'horizontal',
			'slideFade' : false,
			'fadeArrows' : false,
			'nextArrow' : false,
			'previousArrow' : false,
			'numbers' : false,
			'index' : false,
			'autoslide' : false,
			'rewind' : false,
			'debug' : false
		}
		
		var opts = $.extend(defaults, options);
		
    	var sliderId = $(this).attr('id');	
    	var sliderObj = $('#'+sliderId);
    	var sliderUl = $('#'+sliderId+' .itemSet');
    	
    	var itemWidth = parseInt(sliderObj.css('width'));	
    	var items = sliderUl.children().size();
    	var itemsWidth = items * itemWidth;
    	
    	var position = 0;
    	var slide = 1;

    	var newPosition;
    	
    	var stop = false;
    	var moving = false;
    	var direction;
    	
    	var slides = new Array(items);
    	
    	init = function (){
    		
    		if(opts.sliderDirection == 'horizontal'){
    			sliderUl.css({'width':itemsWidth+'px'});
    		}
    		else{
    			sliderUl.css({'width':itemWidth+'px'});
    		}
    		
    		for(i=0;i<slides.length;i++){
    			slides[i] = (i+1);
    		}
    		
    		if(opts.previousArrow || opts.nextArrow){
    			initArrows();
			}

    		if(opts.numbers){
    			initNumbers();
    		}
    		
    		if(opts.indexOf){
    			setIndexOf();
    		}
    		
    		if(opts.autoslide){
    			autosliding();
    		}
    		
    	}
    	
    	initArrows = function (){
    	
    		if(opts.previousArrow){
    			$('#'+opts.previousArrow.id).attr('title',opts.previousArrow.title).click(function (){
    				if(!moving){previousItem()}
    			});
    		}
    		
    		if(opts.nextArrow){
    			$('#'+opts.nextArrow.id).attr('title',opts.nextArrow.title).click(function (){
    				if(!moving){nextItem()}
    			});
    		}
    		
    	}
    	
    	initNumbers = function (){
    		
    		var html = "";
    		var separator = (opts.numbers.separator) ? opts.numbers.separator : "&nbsp;";
    				
    		for(i=0;i<items;i++){
    			if(i > 0){
    				html += separator;
    			}
    						
    			if((i) == position){
    				 html += "<span title='"+(i+1)+"' class='on'>"+(i+1)+"</span>";
    			}
    			else{
    				html += "<span title='"+(i+1)+"'>"+(i+1)+"</span>";
    			}
    		}		
    				
    		$("#"+opts.numbers.id).html(html); 
    		
    		
    		$('#'+opts.numbers.id+' span').click(function (){
	        	var nextSlide = $(this).attr("title");
	        	
	        	if(opts.rewind){
	        		newPosition = '-'+ ((nextSlide-1) * itemWidth);
	        		
	        		slide = nextSlide;
	        		position = (nextSlide-1);
	        		
	        		moveItem();
	        		
	        	}
	        	else{
    				for(i=0;i<slides.length;i++){
    					if(slides[i] == 1){
    						p = i;
    						break;
    					}
    				}
    				
    				for(i=0;i<p;i++){

						var ele = $("#"+sliderId+" .itemSet li:first-child").remove();
						sliderUl.append(ele);

						ele = slides.shift();
						slides.push(ele);
    				}
    				
    				if(opts.sliderDirection == 'horizontal'){
    					sliderUl.css('left','-'+((slide-1)*itemWidth)+'px');
    				}
    				else{
    					sliderUl.css('top','-'+((slide-1)*itemWidth)+'px');
    				}
    				
    				newPosition = '-'+ ((nextSlide-1) * itemWidth);
    				
    				slide = nextSlide;
    				position = nextSlide - 1;
    				
    				moveItem();
	        	}
	    						
	        })
    	
    	}
    	
    	setIndexOf = function(){
    		var separator = (opts.indexOf.separator) ? opts.indexOf.separator : "&nbsp;/&nbsp;";
    		var html = slide+''+separator+''+items;
    	
    		$('#'+opts.indexOf.id).html(html);
    	}
    	
    	selectNumber = function(){
    		$("#"+options.numbers.id+" span[class=on]").removeClass();
    		$("#"+options.numbers.id+" span:eq("+(slide-1)+")").toggleClass("on");
    	}
		
		autoslide = function (){
		
	    	if(stop == false){
	    		if(options.autoslide.direction && options.autoslide.direction == "left"){
	    			previousItem();
	    		}
	    		else{
	    			nextItem();
	    		}
	    	}
	    	
	    	
	    	
	    	setTimeout(autoslide, opts.autoslide.timeout);
	    	
	    }

		autosliding = function (){
    	
	    	setTimeout(autoslide, opts.autoslide.delay);
	    			
	    	sliderObj.hover(function (){stop = true},function (){stop = false});
					
			if(opts.nextArrow){
      			$("#"+opts.nextArrow.id).hover(function (){stop = true},function (){stop = false});
      		}
      		
      		if(opts.previousArrow){
      			$("#"+opts.previousArrow.id).hover(function (){stop = true},function (){stop = false});
      		}
    	
    	}

    	moveItem = function (){
    		
    		if(options.fadeArrows){
    			if(direction == 'next'){
    				arrowId = "#"+options.nextArrow.id;
    				
    			}
    			else{
    				arrowId = "#"+options.previousArrow.id;
  				}
  				$(arrowId).fadeTo('normal','0.5');
  			}
			
			moving = true;
			
    		if(opts.slideFade){
    			if(opts.sliderDirection == 'horizontal'){
	    			sliderUl.animate({'left': newPosition+'px','opacity': opts.slideFade.minOpacity},opts.speed,function (){
    					moving = false;
    				}).animate({'opacity': '1'},(opts.speed/2));
    			}
    			else{
    				sliderUl.animate({'top': newPosition+'px','opacity': opts.slideFade.minOpacity},opts.speed,function (){
    					moving = false;
    				}).animate({'opacity': '1'},(opts.speed/2));
    			}
    		}
    		else{
    			if(opts.sliderDirection == 'horizontal'){
	    			sliderUl.animate({'left': newPosition+'px'},opts.speed,function (){
	    				moving = false;
	    			});
    			}
    			else{
    				sliderUl.animate({'top': newPosition+'px'},opts.speed,function (){
    					moving = false;
    				});
    			}
    		}
    		
    		
    		
    		if(options.fadeArrows){
    			if(direction == 'next'){
    				arrowId = "#"+options.nextArrow.id;
    				
    			}
    			else{
    				arrowId = "#"+options.previousArrow.id;
  				}
  				$(arrowId).fadeTo('normal','1');
    		}
    		
    		
    		if(opts.numbers){
    			selectNumber();
    		}
    		
    		if(opts.indexOf){
    			setIndexOf();
    		}
    		
    		if(opts.debug){
    			console.log("slide:"+slide);
    			console.log("position:"+position);
    			console.log("slides"+slides);
    		}
    		
    	}
    	
    	nextItem = function (){
			
			direction = 'next';
			
    		if((position+1) < items){
    			newPosition = '-='+itemWidth;
      			position++;
      			slide++;
    		}
    		else if(opts.rewind){
    			newPosition = '0px';
      			position = 0;
      			slide = 1;
    		}
    		else{
    			rebuildItems('right');
    			newPosition = '-='+itemWidth;
    			slide++;
    		}
    		
    		if(slide > items){
    			slide = 1;
    		}
    		
    		moveItem();
    		
    	}
    	
    	previousItem = function (){
    	
    		direction = 'previous';
    	
    		if(position > 0){
    			newPosition = '+='+itemWidth;
      			position--;
      			slide--;
    		}
    		else if(opts.rewind){
    			newPosition = "-="+((items-1)*itemWidth);
      			position = (items-1);
      			slide = items;
    		}
    		else{
    			rebuildItems('left');
    			newPosition = '+='+itemWidth;
    			slide--;
    		}
    		
    		if(slide < 1){
    			slide = items;
    		}
    		
    		moveItem();
    	}
    	
    	rebuildItems = function (direction){
    		
    		var relativePosition = getPosition();
			
			if(direction == 'right'){
				var ele = $("#"+sliderId+" .itemSet li:first-child").remove();
				
				if(opts.sliderDirection == 'horizontal'){
  					sliderUl.css('left',(relativePosition+itemWidth)+'px');
  				}
  				else{
  					sliderUl.css('top',(relativePosition+itemWidth)+'px');
  				}
  				
				sliderUl.append(ele);
				
				ele = slides.shift();
				slides.push(ele);
				
				position = items-1;

			}
			else if(direction == 'left'){
				var ele = $("#"+sliderId+" .itemSet li:last-child").remove();
				
				if(opts.sliderDirection == 'horizontal'){
  					sliderUl.css('left',(relativePosition-itemWidth)+'px');
  				}
  				else{
  					sliderUl.css('top',(relativePosition-itemWidth)+'px');
  				}
				
				sliderUl.prepend(ele);
				
				ele = slides.pop();
				slides.unshift(ele);
				
				position = 0;
			}
    	
    	}

    	getPosition = function (){
    		if(opts.sliderDirection == 'horizontal'){
    			return parseInt(sliderUl.css('left'));
    		}
    		else{
    			return parseInt(sliderUl.css('top'));
    		}
    	}
    	
    	init();
			
    }

})(jQuery);

