/**
 * jQuery Plugin Visual Slider.
 * @author NOSE
 * 
 * @version 1.0.0	initial version			
 */
jQuery.fn.visualSlider = function(op) {	
    jQuery.log("VisualSlider: init");
	
	// defaults
	var defaults =  {
			selectorButtonPrevious:".previous",
			selectorButtonNext:".next",
			selectorButtonExpand:".expand",
			selectorButtonContract:".contract",
			selectorContainer:"#slides",
			selectorSlide:".slide",
			selectorInfo:".info .content",
			selectorSlideInfo:".slideinfo",
			timeLeft:1000,
			timeRight:1000,
			easingLeft:"easeOutExpo",
			easingRight:"easeOutExpo",
			easingExpand:"easeOutExpo",
			easingContract:"easeOutExpo",
			timeFadein:600,
			timeFadeout:300,
			timeExpand:1200,
			timeContract:900,
			heightExpanded:520,
			heightContracted:210,
			lrInc:780,
			autoplay:false,
			interval:12000
	};
	jQuery.extend(defaults, op);
	
	
	
	// vars
	var timeLeft = defaults.timeLeft;
	var timeRight = defaults.timeRight;
	var easingRight = defaults.easingRight;
	var easingLeft = defaults.easingLeft;
	
	var timeFadein = defaults.timeFadein;
	var timeFadeout = defaults.timeFadeout;
	var easingFadein = defaults.easingFadein;
	var easingFadeout = defaults.easingFadeout;
	
	var timeExpand = defaults.timeExpand;
	var timeContract = defaults.timeContract;
	var easingExpand = defaults.easingExpand;
	var easingContract = defaults.easingContract;
	
	var lrInc = defaults.lrInc;
	
	// elements
	var elVisual = jQuery(this);
	var elContainer = jQuery(defaults.selectorContainer,this);
	var elInfo = jQuery(defaults.selectorInfo,this);
	var elButtonPrevious = jQuery(defaults.selectorButtonPrevious,this);
	var elButtonNext = jQuery(defaults.selectorButtonNext,this);
	var elButtonExpand = jQuery(defaults.selectorButtonExpand,this);
	var elButtonContract = jQuery(defaults.selectorButtonContract,this);
	
	// events
	elButtonPrevious.bind("click",buttonSlidePrevious);
	elButtonNext.bind("click",buttonSlideNext);
	elButtonExpand.bind("click",buttonSlideExpand);
	elButtonContract.bind("click",buttonSlideContract);
	
	
	// init
	var autoplay = defaults.autoplay;
	var interval = defaults.interval;
	var posLeft = 0;
	var currentSlide = 0;
	var heightContracted = defaults.heightContracted;
	var heightExpanded = defaults.heightExpanded;
	var slides = jQuery(defaults.selectorSlide,elContainer);
	var nbOfSlides = parseInt(slides.size());
	initializeVisualSlider();
	
	
	/**
	* Initializes the visual slider.
	*/
	function initializeVisualSlider() {
		jQuery.log("VisualSlider: initializeVisualSlider");
		
		// position
		nbOfSlides = parseInt(jQuery(defaults.selectorSlide,elContainer).size());
		jQuery.log("Number of slides: " + nbOfSlides);
		jQuery(elContainer).css("width",nbOfSlides*lrInc+"px");
		
		
		// buttons
		elButtonNext.hide();
		elButtonPrevious.hide();
		elButtonContract.hide();
		
		// autoplay
		if (autoplay) {
			window.setTimeout(autoplaySlides, interval);	
		}
	}
	
	/**
	* Autoplay slides.
	*/
	function autoplaySlides() {
		jQuery.log("VisualSlider: autoplaySlides");
		if (autoplay) {
			if (currentSlide < nbOfSlides - 1) {
				slideNext();
				window.setTimeout(autoplaySlides, interval);
			}
			else {
				autoplay = false;	
			}
		}
	}
	
	/**
	* Expand slides.
	*/
	function buttonSlideExpand() {
		jQuery.log("VisualSlider: buttonSlideExpand");
		return slideExpand();
	}
	
	/**
	* Contract slides.
	*/
	function buttonSlideContract() {
		jQuery.log("VisualSlider: buttonSlideContract");
		return slideContract();
	}
	
	/**
	* Expand.
	*/
	function slideExpand() {
		jQuery.log("VisualSlider: slideExpand");
			
		// visual
		elVisual.animate({"height": heightExpanded},timeExpand,easingExpand,function(){
			// button
			elButtonExpand.hide();
			elButtonContract.show();
		
			// slider
			updateVisualSlider();
			showInfo();
		});
		
		// return
		return false;
	}
	
	/**
	* Contract.
	*/
	function slideContract() {
		jQuery.log("VisualSlider: slideContract");
		
		// info
		hideInfo();
			
		// visual
		elVisual.animate({"height": heightContracted},timeContract,easingContract,function(){
			// button
			elButtonNext.hide();
			elButtonPrevious.hide();
			elButtonContract.hide();
			elButtonExpand.show();
		});
		
		// return
		return false;
	}
	
	/**
	* Previous slide.
	*/
	function buttonSlidePrevious() {
		jQuery.log("VisualSlider: buttonSlidePrevious");
		autoplay = false;
		return slidePrevious();
	}
	/**
	* Next slide.
	*/
	function buttonSlideNext() {
		jQuery.log("VisualSlider: buttonSlideNext");
		autoplay = false;
		return slideNext();
	}
	
	/**
	* Previous slide.
	*/
	function slidePrevious() {
		jQuery.log("VisualSlider: slidePrevious");
		
		
		// index
		currentSlide--;
		
		// animate
		posLeft += lrInc;
		hideInfo();
		elContainer.animate({"left": posLeft},timeLeft,easingLeft,function(){
			showInfo();
		});
		
		// update
		updateVisualSlider();
		
		// return
		return false;
	}
	
	/**
	* Next slide.
	*/
	function slideNext() {
		jQuery.log("VisualSlider: slideNext");
		
		
		// index
		currentSlide++;
		
		// animate
		posLeft -= lrInc;
		hideInfo();
		elContainer.animate({"left": posLeft},timeRight,easingRight,function(){
			showInfo();
		});
		
		// update
		updateVisualSlider();
		
		// return
		return false;
	}
	
	/**
	* Updates the VisualSlider.
	*/
	function updateVisualSlider() {
		jQuery.log("VisualSlider: updateVisualSlider");
		
		// buttons
		if (currentSlide == 0) {
			elButtonPrevious.hide();
		}
		else {
			elButtonPrevious.show();
		}
		if (currentSlide == nbOfSlides-1) {
			elButtonNext.hide();
		}
		else {
			elButtonNext.show();	
		}
		
	}
	
	/**
	* Shows the info.
	*/
	function showInfo() {
		jQuery.log("VisualSlider: showInfo");
		var slideInfo = jQuery(defaults.selectorSlideInfo,slides[currentSlide]).html();
		
		// hide
		jQuery(elInfo).html(slideInfo);jQuery.log(timeFadein);
		elInfo.fadeIn(timeFadein);
	}
	
	/**
	* Hides the Info.
	*/
	function hideInfo() {
		// show
		elInfo.fadeOut(timeFadeout);
	}
	
	
	
	
		
    // chain
    return this;
};
