// ==ClosureCompiler==
// @compilation_level SIMPLE_OPTIMIZATIONS
// @output_file_name jquery.contentFader-0.1.min.js
// ==/ClosureCompiler==

/*============================================================
	Content Fader
============================================================*/

function ContentFaderClass(container_name, optionObj) {
	
	this.container_name = container_name;
	this.container = $(container_name);
	
	this.option = $.extend({
		height: this.container.outerHeight(),
		width: this.container.outerWidth(),
		panelClass: 'ccPanel',
		delayTime: 5,
		transitionTime: 1,
		transitionType: 'step', // 'step'|'continuous'
		direction: 'horizontal', // 'horizontal'|'vertical'
		showControl: false,
		slideStart:function(carousel){},
		slideComplete:function(carousel, currentSlide){}
	}, optionObj || {});
	
	this.slideCount = 0;
	this.slideCurrent = -1;
	this.slideLast;
	this.$slides = {};
	
	this.controlCount = 0;
	this.controlSlide = [];
	
	this.slideRotating = false;
	this.slideRotateIID = -1;
	
	this.imageContainer;
	this.textContainer;
	this.slideControl;
	
	this.isIE6 = navigator.userAgent.toLowerCase().indexOf('msie 6') != -1;

	/*===================================================
		Build Carousel
	===================================================*/
	
	this.buildCarousel = function() {
		var i, ilen;
		
		this.container.css({ position:'relative', overflow:'hidden', height:this.option.height, width:this.option.width });
		this.$slides = $('.'+this.option.panelClass, this.container)
							.css({ position:'absolute', overflow:'hidden', height:this.option.height, width:this.option.width });
		$('.'+this.option.panelClass+':gt(0)', this.container).hide();
		this.slideCount = this.$slides.length;
		this.correctPanelsForPadding();

		if (this.option.showControl) {
			this.controls = $('<div id="'+container_name.substr(1)+'_controls"></div>')
										.css({position:'absolute',left:(this.option.width /2)-(this.slideCount * 9),bottom:0,overflow:'hidden',height:18,width:this.slideCount * 18,background:'#FFFFFF','text-align':'center',opacity:0.7})
										.hover(function(){$(this).css('opacity',1)}, function(){$(this).css('opacity',0.7)})
										.appendTo(this.container);
			for (i = 0, ilen = this.slideCount; i < ilen; i++) {
				$('<div class="control control_'+i+'"></div>')
					.data('index',i)
					.css({'width':12,'height':12,'margin':3,'float':'left','background':'#74B900','cursor':'pointer'})
					.addClass('rounded6')
					.hover(function(){$(this).css('background','#9DF001')}, function(){$(this).css('background','#74B900')})
					.bind('click',{cc:this},function(e){ e.data.cc.nextSlide($(this).data('index')); })
					.appendTo(this.controls);
			}
		}
		
		this.setControls();
		this.changeSlide(0);
			
	}
	
	this.correctPanelsForPadding = function(){
		this.$slides.each(function(i){
			var $this = $(this);
			$this.css({
				width:(parseInt($this.css('width')) - parseInt($this.css('padding-left')) - parseInt($this.css('padding-right'))),
				height:(parseInt($this.css('height')) - parseInt($this.css('padding-top')) - parseInt($this.css('padding-bottom'))),
				'z-index':i
			  });
		});
	};
	
	/*===================================================
		Controls
	===================================================*/
	
	this.clearControls = function(){
		if (!this.option.showControl) { return; }
		$(container_name+'_controls div.control')
			.removeClass('selected')
			.css('background','#74B900');
	};
	
	this.setControls = function(){
		if (!this.option.showControl) { return; }
		this.clearControls();
		var selectedControl = (this.slideCurrent === this.slideCount)?0:this.slideCurrent;
		$(container_name+'_controls div.control_'+selectedControl)
			.addClass('selected')
			.css('background','#9DF001');
	};
	
	/*===================================================
		Slides
	===================================================*/
	
	this.changeSlide = function(index) {
		var slideOld;
		var oldDepth;
		var newDepth;
		var ps;
		var i;
		var newControl;
		
		if (this.slideRotating) { return false; };
		this.slideRotating = true;
		clearInterval(this.slideRotateIID);
		
		this.slideLast = this.slideCurrent;
		
		switch(index) {
			case "next":
				this.slideCurrent++;
				break;
			case "previous": 
				this.slideCurrent--;
				break;
			default: 
				if (isNaN(index)) {
					this.slideCurrent++;
				} else {
					this.slideCurrent = index;
				}
				break;
		}
		
		if (this.slideCurrent >= this.slideCount) {
			this.slideCurrent = 0;
		} else if (this.slideCurrent < 0) {
			this.slideCurrent = this.slideCount-1;
		}
		
		if (this.slideCurrent != this.slideLast) {
		
			this.clearControls();
		
			// Check order 
			oldDepth = (!isNaN(this.slideLast))?$(this.$slides[this.slideLast]).css('z-index'):0;
			newDepth = $(this.$slides[this.slideCurrent]).css('z-index');
			ps = this;
			if (newDepth < oldDepth) {
				// Fade out old slide
				$(this.$slides[this.slideCurrent]).show();
				$(this.$slides[this.slideLast]).fadeOut(this.option.transitionTime * 1000, function(){ps.finishSlide()});
			} else {
				// Fade in new slide
				$(this.$slides[this.slideCurrent]).fadeIn(this.option.transitionTime * 1000, function(){ps.finishSlide()});
			}
		} else {
			this.slideRotating = false;
			ps = this;
			this.slideRotateIID = setInterval(function(){ps.changeSlide('next')}, this.option.delayTime * 1000);
		}
		
	}
	
	this.finishSlide = function() {
		this.slideRotating = false;
		clearInterval(this.slideRotateIID);
		
		// Get rid of old slide
		$(this.$slides[this.slideLast]).hide();
		this.setControls();
		
		var ps = this;
		this.slideRotateIID = setInterval(function(){ps.changeSlide('next')}, this.option.delayTime * 1000);
	}
	
	this.buildCarousel();
	
}

