$(function(){
	initGallery({
		holder:'.slider',
		list:'div.slider-holder > ul',
		switcher:'ul.switcher > li',
		autoRotation:7000
	});
});

function initGallery(option){
	var hold = jQuery(option.holder);
	var duration = option.autoRotation;
	var activeSlide = option.activeSlide || 0;
	var step = option.step || 1;
	var disableBtn = option.disableBtn || false;
	var switcher = option.switcher || false;
	var event = option.event || 'click';
	var onStart = option.onStart;
	var onChange = option.onChange;
	hold.each(function(){
		var _this = jQuery(this);
		var list = _this.find(option.list),
			count = list.children().length,
			w = list.children().outerWidth() * step,
			_t,
			a = 0,
			r = a,
			f = true;

		var holdW = list.parent().width();
		var visEl = Math.ceil(holdW/w);
		
		if(count <= visEl) f = false;
		
		list.css({marginLeft:-w*a});
		
		if(typeof onStart === 'function') onStart(list, a);
		
		if(option.prev && option.next){
			var prev = _this.find(option.prev).attr('rel', 'prev').click(animateSlide);
			var next = _this.find(option.next).attr('rel', 'next').click(animateSlide);
		}
		if(option.switcher){
			switcher = _this.find(switcher);
			switcher.eq(r).removeClass('active');
			switcher.eq(a).addClass('active');
			switcher.bind(event, function(){
				var ind = switcher.index($(this))+activeSlide;
				animateSlide(ind);
				return false;
			});
		}

		if(disableBtn){
			if(a == 0 && count > 1) {
				prev.addClass('disabled');
				next.removeClass('disabled');
			}
			if(a == count-1 && count > 1) {
				prev.removeClass('disabled');
				next.addClass('disabled');
			}
			if(count == 1 || count <= visEl) {
				prev.addClass('disabled');
				next.addClass('disabled');
			}
		}
		
		if(option.autoRotation && f) runTimer();
		if(option.effect == 'fade') {
			list.children().css('opacity', 0);
			list.children().eq(a).css('opacity', 1).addClass('active');
		}
		if(option.stopOnHover && _t){
			list.mouseenter(function(){
				clearTimeout(_t);
			}).mouseleave(runTimer);
		}
		function runTimer(){
			_t = setTimeout(function(){
				animateSlide('next');
			}, duration);
		}
		function animateSlide(e){
			if(f){
				r = a;
				if(typeof e == 'string' && e == 'next') a++;
				else if(typeof e == 'number') a=e;
				else{
					if(e.target.rel == 'next') a++;
					else if(e.target.rel == 'prev') a--;
				}
				if(_t) clearTimeout(_t);
				if(a == count) a=0;
				else if(a == -1) a=count-1;
				
				list.children().eq(r).removeClass('active');
				list.children().eq(a).addClass('active');
				
				if(option.switcher){
					switcher.eq(r).removeClass('active');
					switcher.eq(a).addClass('active');
				}
				
				if(disableBtn){
					if(a == 0) {
						prev.addClass('disabled');
						next.removeClass('disabled');
					}
					else if(a + visEl == count) {
						prev.removeClass('disabled');
						next.addClass('disabled');
					}
					else {
						prev.removeClass('disabled');
						next.removeClass('disabled');
					}
				}
				
				if(option.effect == 'fade'){
					list.children().eq(r).animate({opacity:0}, {queue:false, duration:700});
					list.children().eq(a).animate({opacity:1}, {queue:false, duration:700, complete:function(){
						if(option.autoRotation) runTimer();
					}});
				}
				else{
					if(a + visEl > count) a = 0;
					
					list.animate({marginLeft:-w*a}, {queue:false, duration:700, complete:function(){
						if(option.autoRotation) runTimer();
						if(typeof onChange === 'function') onChange(list, a);
					}});
				}
			}
			return false;
		}
	});
};
