/**
 * Image Gallery.
 * @author NOSE		
 */
jQuery.fn.gallery = function(op) {	
	// settings
	var settings =  {
			selSlides:"#gallery_images li",
			selSelector:"#gallery_selector li",
			selCaption:"#gallery_images li span",
			classSelected:"selected",
			time:500,
			interval:5000,
			autoplay:true,
			replay:true,
			hidecaption:true,
			minheight:450
	};
	jQuery.extend(settings, op);
	if (jQuery(this).hasClass("autoplay")){
		settings.autoplay = true;
	}
	
	// params
	var current = 0; 
	var next = 1;
	var timer = null;
	
	// references
	var gallery = jQuery(this);
	var slides = jQuery(settings.selSlides,gallery);
	var selectors = jQuery(settings.selSelector,gallery);
	var captions = jQuery(settings.selCaption,gallery);
	
	// prepare
	jQuery(slides).each(function(i,el){
		if (jQuery(el).height() > settings.minheight) {
			settings.minheight = jQuery(el).height();
		}
	});
	jQuery(gallery).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,cursor:"pointer"});
	
		// opacity
		slides[i].xOpacity = 0;
	}
	jQuery(slides[current]).css({display:"block"});
	slides[current].xOpacity = .99;
	jQuery(slides).bind("click",showNext);
	
	// selector
	jQuery(selectors).each(function(i,el){
		jQuery(el).bind("click",function(){
			stopAutoplay();
			showSlide(i);
			return false;
		});
	});
	jQuery(selectors[current]).addClass(settings.classSelected);

	
	// 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) {
			// selector
			jQuery(selectors).removeClass(settings.classSelected);
			jQuery(selectors[i]).addClass(settings.classSelected);
			
			// hide caption
			if (settings.hidecaption) {
				jQuery(captions).hide();
			}

			// 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;
		if (settings.time <= 0) {
			nOpacity = 1.0;
			cOpacity = 0;
		}
	
		// 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;
};

