var gallerySlide = new Class({
	options: {
		galleryEl:'div img',
		elTagName:'img',
		linkNext:'a.next',
		linkPrev:'a.prev',
		numElementLink:'div.nav li a',
		duration:700,
		autoSlideShow:false,
		switchTime:3000,
		event:'click',
		currentEl:'#footer span.cur',
		allEl:'#footer span.all'
	},

	// create class
	initialize: function(element,options){
	    this.setOptions(options);
		//set default parametrs
		this.holder = $$(element)[0];
		if (this.holder) {
			this.timer = false;
			this.elements = this.holder.getElements(options.galleryEl);
			options.numElementLink ? this.numElementLink = this.holder.getElements(options.numElementLink): false;
			options.linkNext ? this.linkNext = this.holder.getElement(options.linkNext): false;
			options.linkPrev ? this.linkPrev = this.holder.getElement(options.linkPrev): false;
			
			this.setDefFunction();
			this.clickNum();
			this.clickNext();
			this.clickPrev();
			if (options.autoSlideShow) this.autoSlide();
			var _this = this;
			this.holder.addEvent('mouseover', function() {
				if (_this.timer) clearTimeout(_this.timer);
			});
			this.holder.addEvent('mouseout', function() {
				if (_this.options.autoSlideShow) {
					_this.timer = setTimeout(function(){
						_this.slideNext();
						_this.autoSlide();
					}, _this.options.switchTime);
				}
			});
		}
		
	},
	//set default parametrs
	setDefFunction : function() {
		var _this = this;
		this.active = this.elements.filter(this.options.elTagName+'.active')[0];
		if(!this.active) {
			this.elements[0].addClass('active');
		}
		var _index = this.getIndex(this.elements,this.active);
		if (this.options.numElementLink) this.numElementLink[_index].getParent().addClass('active');
		
		this.elements.each(function(el,i){
			el.FxHide = new Fx.Tween(el, {
				'duration':_this.options.duration,
				'link': 'chain',
				'onStart': function(obj) {
					obj.removeClass('active');
				},
				'onComplete' : function (obj) {
					obj.setStyle('display','none');
				}
			});
			el.FxShow = new Fx.Tween(el, {
				'duration':_this.options.duration,
				'link': 'chain',
				'onStart': function(obj) {
					obj.setStyle('display','block');
					obj.removeClass('nextItem').addClass('active');
				}
			});
			if (!el.match('.active')) 
				el.FxHide.start('opacity','0');
		});
	},
	
	clickNum: function(){
		if (this.numElementLink) {
			var _this = this;
			this.numElementLink.addEvent(this.options.event, function() {
				if (!this.getParent().match('.active')) {
					var _index = _this.getIndex(_this.numElementLink,this);
					_this.elements[_index].addClass('nextItem');
					_this.hideShow(this);
					_this.addNumClass(this);
				}
				_this.options.autoSlideShow = false;
				if (_this.timer) clearTimeout(_this.timer);
				return false;
			});
		}
	},
	
	clickNext: function() {
		if (this.options.linkNext) {
			var _this = this;
			this.linkNext.addEvent(this.options.event, function() {
				_this.slideNext();
				return false;
			});
		}
	},
	
	slideNext: function(){
		this.active = this.elements.filter(this.options.elTagName+'.active')[0];
		var _nextEl = this.active.getNext(this.options.elTagName);
		if (_nextEl) {
			_nextEl.addClass('nextItem');
			var _index = this.getIndex(this.elements,_nextEl);
			this.hideShow(this.elements[_index]);
			
			if (this.options.numElementLink) {
				this.addNumClass(this.numElementLink[_index]);
			}
		} else {
			this.elements[0].addClass('nextItem');
			this.hideShow(this.elements[0]);
			
			if (this.options.numElementLink) {
				this.addNumClass(this.numElementLink[0]);
			}
		}
	},
	
	clickPrev: function() {
		if (this.options.linkPrev) {
			var _this = this;
			this.linkPrev.addEvent(this.options.event, function() {
				_this.active = _this.elements.filter(_this.options.elTagName+'.active')[0];
				var _prevEl = _this.active.getPrevious(_this.options.elTagName);
				if (_prevEl) {
					_prevEl.addClass('nextItem');
					var _index = _this.getIndex(_this.elements,_prevEl);
					_this.hideShow(_this.numElementLink[_index]);
					_this.addNumClass(_this.numElementLink[_index]);
				} else {
					_this.elements[_this.elements.length-1].addClass('nextItem');
					_this.hideShow(_this.numElementLink[_this.elements.length-1]);
					_this.addNumClass(_this.numElementLink[_this.elements.length-1]);
				}
				return false;
			});
		}
	},
	
	autoSlide: function() {
		var _this = this;
		if (this.options.autoSlideShow) {
			this.timer = setTimeout(function(){
				_this.slideNext();
				_this.autoSlide();
			}, this.options.switchTime);
		}
	},
	
	hideShow: function(_obg) {
		_obg.active = this.elements.filter(this.options.elTagName+'.active')[0];
		_obg.active.FxHide.start('opacity','0');
		_obg.nextItem = this.elements.filter(this.options.elTagName+'.nextItem')[0];
		_obg.nextItem.FxShow.start('opacity','1');
	},
	
	addNumClass: function(_this) {
		this.numElementLink.each(function(el, i){
			el.getParent().removeClass('active');
		});
		_this.getParent().addClass('active');
	},
	
	getIndex: function(objAll, thisObg) {
		var _index = 0;
		for (var i = 0; i < objAll.length; i++ ) {
			if (objAll[i] === thisObg) {
				_index = i;
				break;
			}
		}
		return _index;
	},
	
	// add options and events
	Implements : [Options, Events]
});

window.addEvent('domready', function(){
    var slideShow = new gallerySlide('div.carusel-holder',
	{
		galleryEl:'ul.carusel li',
		elTagName:'li',
		linkNext:'a.next',
		linkPrev:false,
		numElementLink:'ul.pager a',
		duration:600,
		autoSlideShow:false,
		switchTime:2500
    });
});
