/**
 * Fader.
 * @author NOSE		
 */
jQuery.fn.fader = function(op) {	
	// settings
	var settings =  {
			selSlides:".slide",
			selSelector:"",
			selCaption:"",
			eventSelector:"mouseenter",
			eventSlide:"click",
			classSelected:"selected",
			time:600,
			interval:6000,
			autoplay:true,
			replay:true,
			hidecaption:false,
			indicators:true,
			minheight:350
	};
	jQuery.extend(settings, op);
	if (jQuery(this).hasClass("autoplay")){
		settings.autoplay = true;
	}
	
	// params
	var current = 0; 
	var next = 1;
	var timer = null;
	
	// references
	var fader = jQuery(this);
	var slides = jQuery(settings.selSlides,fader);
	var captions = jQuery(settings.selCaption,fader);
	var selectors = jQuery(settings.selSelector);

	
	
	// prepare
	jQuery(slides).each(function(i,el){
		if (jQuery(el).height() > settings.minheight) {
			settings.minheight = jQuery(el).height();
		}
	});
	jQuery(fader).css({position:"relative",height:settings.minheight+"px"});
	
	// slides
	for(var i = 0; i <slides.length; i++) {
		// position
		jQuery(slides[i]).css({display:"none",position:"absolute",top:0,left:0});
	
		// opacity
		slides[i].xOpacity = 0;
	}
	jQuery(slides[current]).css({display:"block"});
	slides[current].xOpacity = .99;
	//jQuery(slides).bind(settings.eventSlide,showNext);
	
	// selector
	jQuery(selectors).each(function(i,el){
		jQuery(el).bind(settings.eventSelector,function(){
			stopAutoplay();
			showSlide(i);
			return false;
		});
	});
	jQuery(selectors[current]).addClass(settings.classSelected);
	
	// page indicator
	var indicators = null;
	if (settings.indicators) {
		
		// markup
		var markupPageIndicator = "<div class='slides_indicator'>";
		for (var p = 0; p < slides.length; p++) {
			markupPageIndicator += "<span>slide "+p+"</span>";
		}
		markupPageIndicator += "</div>";
		
		// append
		jQuery(fader).append(markupPageIndicator);
		indicators = jQuery(".slides_indicator span",fader);
		
		// selected
		jQuery(indicators[0]).addClass("selected");
	}

	
	// autoplay
	if (settings.autoplay && slides.length > 1) {
		timer = setTimeout(function(){showSlide(next);},settings.interval);
	}
	
	/**
	* Shows the slide.
	*/
	function showNext() {
		stopAutoplay();
		next = slides[current+1]?current+1:0;
		showSlide(next);
	}
	function showSlide(i) {
		
		// check
		if (current != i && i < slides.length) {
			
			// selector
			jQuery(selectors).removeClass(settings.classSelected);
			jQuery(selectors[i]).addClass(settings.classSelected);
			
			// hide caption
			if (settings.hidecaption) {
				jQuery(captions).hide();
			}
			
			// indicator
			if (settings.indicators) {

				// index
				var si = next;

				// indicate
				jQuery(indicators).removeClass("selected");
				jQuery(indicators[si]).addClass("selected");
			}

			// next
			next = i;

			// fade
			xfade();
		}
	}
	
	/**
	* Stops the autoplay.
	*/
	function stopAutoplay() {
		settings.autoplay = false;
		if (timer) {
			clearTimeout(timer);
			timer = null;
		}
	}
	
	/**
	* XFade.
	* @author Image Cross Fade Redux
	*/
	function xfade() {
		
		// opacity
		cOpacity = slides[current].xOpacity;
		nOpacity = slides[next].xOpacity;
	
		cOpacity-=.05; 
		nOpacity+=.05;
	
		// image
		slides[next].style.display = "block";
		slides[current].xOpacity = cOpacity;
		slides[next].xOpacity = nOpacity;
	
		// set
		setOpacity(slides[current]); 
		setOpacity(slides[next]);
	
		// check
		if(cOpacity<=0) {

			// next
			jQuery(slides[next]).css("opacity",1.0);
			
			// show caption
			if (settings.hidecaption) {
				jQuery(captions).fadeIn(30);
			}
			
			// update
			slides[current].style.display = "none";
			current = next;
			next = slides[current+1]?current+1:0;
			
			// replay
			if (! slides[current+1] && ! settings.replay) {
				stopAutoplay();
			}
			
			// autoplay
			if (settings.autoplay) {
				timer = setTimeout(function(){showSlide(next);},settings.interval);
			}
		} 
		else {
			timer = setTimeout(xfade,settings.time/20.0);
		}
	
		/*
		* Sets the opacity.
		*/
		function setOpacity(obj) {
			if(obj.xOpacity>.99) {
				obj.xOpacity = 1.0;
				return;
			}
			obj.style.opacity = obj.xOpacity;
			obj.style.MozOpacity = obj.xOpacity;
			obj.style.filter = "alpha(opacity=" + (obj.xOpacity*100) + ")";
		}
	
	}
  
  
    // return
    return this;
};
