$(function(){
	initSlideshow();
});

function initSlideshow(){
	window.autorotation = 5000;
	$('.gallery').each(function(){
		var _this = $(this);
		_this.find('#switcher > li a').click(function(){
			g1.autoRotation = false;
			window.autorotation = false;
		});
		_this.find('ul.mask > li').mouseenter(function(){
			g1.stop();
			g1.autoRotation = false;
		}).mouseleave(function(){
			g1.autoRotation = window.autorotation;
			g1.play();
		});
	});

	var g1 = new initGallery(jQuery('.gallery'),{
		autoRotation: window.autorotation,
		list: 'ul.mask',
		switcher:'.switcher-holder #switcher > li',
		onChange: function(_this, active){
			
			// stop autorotate after first time through
			//stop_autorotate(_this, active);
		},
		effect: 'fade'
	});
	function stop_autorotate(_this, active){
		var count = _this.children().length - 1;
		if(active == count) {
			g1.autoRotation = false;
			window.autorotation = false;
		}
	}
}

function initGallery(context, options){this.init(context, options)}
(function( $ ){
	initGallery.prototype = {
		autoRotation: false,
		disableBtn: false,
		list: 'ul.g1',
		switcher: false,
		prev: false,
		next: false,
		effect: false,
		event:'click',
		onStart: function(){},
		onChange: function(){},
		activeSlide: 0,
		
		init: function(context, options){
			for ( var i in options ) this[i] = options[i]; 
			this.holder = $(context);
			if(this.holder == undefined) return;
			
			this.list = this.holder.find(this.list);
			this.animation = true, this.active = 0;
			this.prevActive = this.active, this.wait;
			this.count = this.list.children().length,
			this.w = this.list.children().eq(0).outerWidth();
			this.holdW = this.list.parent().width();
			this.visEl = Math.ceil(this.holdW/this.w);
			
			if(this.count <= this.visEl) this.animation = false;
			
			if(this.effect == 'fade') this.list.children().css('opacity', 0).eq(this.active).css('opacity', 1).addClass('active');
			else if(this.effect == 'slide') this.list.css('marginLeft', -this.w*this.active);

			this.initControls(this);
			
			this.toggleState.listItem(this);
			if(this.switcher) this.toggleState.switchItem(this);
			
			this.onStart(this.list, this.active);
			
			if(this.autoRotation && this.animation) this.runTimer(this);
		},
		initControls: function(_this){
			if(_this.prev && _this.next){
				_this.prev = _this.holder.find(_this.prev).attr('rel', 'prev').click(function(e){
					_this.refreshState(e);
					return false;
				});
				_this.next = _this.holder.find(_this.next).attr('rel', 'next').click(function(e){
					_this.refreshState(e);
					return false;
				});
			}
			if(_this.switcher){
				_this.switcher = _this.holder.find(_this.switcher);
				_this.toggleState.switchItem(_this);
				_this.switcher.bind(_this.event, function(){
					var ind = _this.switcher.index($(this))
					_this.refreshState(ind);
					return false;
				});
			}
			if(this.disableBtn) this.disabledConrtol();
		},
		toggleState:{
			listItem: function(_this){
				_this.list.children().eq(_this.prevActive).removeClass('active');
				_this.list.children().eq(_this.active).addClass('active');
			},
			switchItem: function(_this){
				_this.switcher.eq(_this.prevActive).removeClass('active');
				_this.switcher.eq(_this.active).addClass('active');
			}
		},
		disabledConrtol: function(){
			if(this.active == 0) {
				this.prev.parent().addClass('disabled');
				this.next.parent().removeClass('disabled');
			}
			else if(this.active == this.count-1 && this.active + this.visEl == this.count) {
				this.prev.parent().removeClass('disabled');
				this.next.parent().addClass('disabled');
				this.autoRotation = false;
			}
			else {
				this.prev.parent().removeClass('disabled');
				this.next.parent().removeClass('disabled');
			}
		},
		runTimer: function(_this){
			this.wait = setTimeout(function(){_this.refreshState('next')}, this.autoRotation)
		},
		stop: function(){
			if(this.wait) clearTimeout(this.wait)
		},
		play: function(){
			if(this.wait) clearTimeout(this.wait);
			if(this.autoRotation) this.runTimer(this);
		},
		changeSlide:{
			fade:function(_this){
				_this.list.children().eq(_this.prevActive).animate({opacity:0}, {queue:false, duration:700});
				_this.list.children().eq(_this.active).animate({opacity:1}, {queue:false, duration:700, complete:function(){
					_this.play();
					_this.onChange(_this.list, _this.active);
				}});
			},
			slide:function(_this){
				if(_this.active + _this.visEl > _this.count) _this.active = 0;
				_this.list.animate({marginLeft:-_this.w*_this.active}, {queue:false, duration:700, complete:function(){
					_this.play();
					_this.onChange(_this.list, _this.active);
				}});
			}
		},
		refreshState: function(e){
			if(this.animation){
				this.prevActive = this.active;
				if(typeof e == 'string' && e == 'next') this.active++;
				else if(typeof e == 'number') this.active=e;
				else{
					if(e.target.rel == 'next') this.active++;
					else if(e.target.rel == 'prev') this.active--;
				}
				if(this.wait) clearTimeout(this.wait);
				if(this.active == this.count) this.active = 0;
				else if(this.active == -1) this.active=this.count - 1;
				
				this.toggleState.listItem(this);
				if(this.switcher) this.toggleState.switchItem(this);
				
				if(this.disableBtn) this.disabledConrtol();
				
				if(this.effect == 'fade') this.changeSlide.fade(this);
				else if(this.effect == 'slide') this.changeSlide.slide(this);
			}
		}	
	}
})( jQuery );
