window.addEvent('load', function(){ 
	if($chk($('slider-stage'))) var splash = new ecceSlider({'sliderID': 'slider-stage',
		'wait':3000,
		'stopAnimationOnRollover':true,
		'listButtons':false
	});
});

var ecceSlider = new Class({
	Implements: [Options],
	options: {
		'sliderID': 'slider',
		'effect':'fade',
		'effectDuration':500,
		'wait':5000,
		'transitionEffect':Fx.Transitions.linear,
		'autorun':true,
		'waitbeforereturning':3000,
		'nextbuttonID':'next',
		'nextbuttonEvent':'click',
		'previousbuttonID':'previous',
		'previousbuttonEvent':'click',
		'stopAnimationOnRollover':false,
		'listButtons':true,
		'listButtonsID':'slider_buttons',
		'listButtonsActiveFunction':function(currentid){
			$(currentid).setStyle('font-weight','bold');
		}
	},
	
	
	initialize: function(options) {
		this.setOptions(options);
		if(this.options.listButtons==true){
			this.assignIDtoSliders();
			this.createButtons();
		}
		this.applySetupStyles();
		this.options.allowButtons = true;
		if(this.options.autorun==true) this.runEffect();
		this.nextbutton();
		this.previousbutton();
		if(this.options.stopAnimationOnRollover==true) this.mouseOver();
		
	},
	assignIDtoSliders: function(){
		var c = this;
		$$('#'+this.options.sliderID+' ul li').each(function(elm,i){
			elm.setProperty('id',c.options.sliderID+'_slider_'+i);
		});
	},
	updateActiveButton :function(sliders,currentid){
		sliders.each(function(elm,i){
			$(elm.getProperty('id')+'_button').removeProperty('style');
		});
		this.options.listButtonsActiveFunction(currentid);
	},
	createButtons: function(){
		var c = this;
		var buttoncontainer = new Element('div', {'id': c.options.listButtonsID}).inject($(c.options.sliderID),'after');
		var buttonlist = new Element('ul').inject(buttoncontainer);
		var updatebutton =0;
		$$('#'+this.options.sliderID+' ul li').each(function(elm,i){
			var list = new Element('li').inject(buttonlist);
			if (i==0) updatebutton = elm.getProperty('id')+'_button';
			var anc = new Element('a',{'href':'#','id':elm.getProperty('id')+'_button','text':(i+1),'events':{
				'click':function(e){
					c.clearTimers();
					e.stop();
					if(c.options.allowButtons){
						switch(c.options.effect){
							case 'fade':
								c.options.runpID = c.fadeUsingID(elm.getProperty('id'));
								if(c.options.autorun){
									var slidefunction = function(){
										c.options.runpID = c.fade.periodical(c.options.effectDuration+c.options.wait,c);
									}
									c.options.runbID = slidefunction.delay(c.options.waitbeforereturning,c);
								}
								break;
							case 'hslide':
								c.options.runpID = c.hslideUsingID(elm.getProperty('id'));
								if(c.options.autorun){
									var slidefunction = function(){
										c.options.runpID = c.hslide.periodical(c.options.effectDuration+c.options.wait,c);
									}
									c.options.runbID = slidefunction.delay(c.options.waitbeforereturning,c);
								}
								break;
							case 'hsliderev':
								c.options.runpID = c.hslideUsingID(elm.getProperty('id'));
								if(c.options.autorun){
									var slidefunction = function(){
										c.options.runpID = c.hslide.periodical(c.options.effectDuration+c.options.wait,c);
									}
									c.options.runbID = slidefunction.delay(c.options.waitbeforereturning,c);
								}
								break;
							case 'vslide':
								c.options.runpID = c.vslideUsingID(elm.getProperty('id'));
								if(c.options.autorun){
									var slidefunction = function(){
										c.options.runpID = c.vslide.periodical(c.options.effectDuration+c.options.wait,c);
									}
									c.options.runbID = slidefunction.delay(c.options.waitbeforereturning,c);
								}
								break;
							case 'vsliderev':
								c.options.runpID = c.vslideUsingID(elm.getProperty('id'));
								if(c.options.autorun){
									var slidefunction = function(){
										c.options.runpID = c.vslide.periodical(c.options.effectDuration+c.options.wait,c);
									}
									c.options.runbID = slidefunction.delay(c.options.waitbeforereturning,c);
								}
								break;
						}
					}
				}
			}}).inject(list);
		});
		c.updateActiveButton($$('#'+this.options.sliderID+' ul li'),updatebutton);	
	},
	
	orderSlides: function(slides,reversed){
		var c = this;
		if(reversed==true){
			var CurrentParts = slides[slides.length-1].getProperty('id').split('_');
			var CurrentID = CurrentParts[CurrentParts.length-1].toInt();
			for(i=CurrentID+1;i<slides.length;i++) $(c.options.sliderID+'_slider_'+i).inject(slides[0].getParent('ul'),'top');
			for(i=0;i<CurrentID;i++) $(c.options.sliderID+'_slider_'+i).inject(slides[0].getParent('ul'),'top');
		}else{
			var CurrentParts = slides[0].getProperty('id').split('_');
			var CurrentID = CurrentParts[CurrentParts.length-1].toInt();
			for(i=CurrentID+1;i<slides.length;i++) $(c.options.sliderID+'_slider_'+i).inject(slides[0].getParent('ul'));
			for(i=0;i<CurrentID;i++) $(c.options.sliderID+'_slider_'+i).inject(slides[0].getParent('ul'));
		}
	},
	
	mouseOver:function(){
		var c = this;
		$(this.options.sliderID).addEvent('mouseover',function(){
			c.clearTimers();
		});
		$(this.options.sliderID).addEvent('mouseout',function(){
			if(c.options.autorun==true) c.runEffect();
		});
	},
	
	clearTimers:function(){
		$clear(this.options.runpID);
		$clear(this.options.runbID);
	},
	previousbutton:function(){
		var c = this;
		if($chk($(c.options.previousbuttonID))){
			$(c.options.previousbuttonID).addEvent(c.options.previousbuttonEvent,function(e){
				c.clearTimers();
				e.stop();
				if(c.options.allowButtons){
					switch(c.options.effect){
						case 'fade':
							c.options.runpID = c.fadeReverse();
							if(c.options.autorun){
								var slidefunction = function(){
									c.options.runpID = c.fade.periodical(c.options.effectDuration+c.options.wait,c);
								}
								c.options.runbID = slidefunction.delay(c.options.waitbeforereturning,c);
							}
							break;
						case 'hslide':
							c.options.runpID = c.hslideReverse();
							if(c.options.autorun){
								var slidefunction = function(){
									c.options.runpID = c.hslide.periodical(c.options.effectDuration+c.options.wait,c);
								}
								c.options.runbID = slidefunction.delay(c.options.waitbeforereturning,c);
							}
							break;
						case 'hsliderev':
							c.options.runpID = c.hslide();
							if(c.options.autorun){
								var slidefunction = function(){
									c.options.runpID = c.hslideReverse.periodical(c.options.effectDuration+c.options.wait,c);
								}
								c.options.runbID = slidefunction.delay(c.options.waitbeforereturning,c);
							}
							break;
						case 'vslide':
							c.options.runpID = c.vslideReverse();
							if(c.options.autorun){
								var slidefunction = function(){
									c.options.runpID = c.vslide.periodical(c.options.effectDuration+c.options.wait,c);
								}
								c.options.runbID = slidefunction.delay(c.options.waitbeforereturning,c);
							}
							break;
						case 'vsliderev':
							c.options.runpID = c.vslide();
							if(c.options.autorun){
								var slidefunction = function(){
									c.options.runpID = c.vslideReverse.periodical(c.options.effectDuration+c.options.wait,c);
								}
								c.options.runbID = slidefunction.delay(c.options.waitbeforereturning,c);
							}
							break;
					}
				}
			});
		}
	},
	nextbutton:function(){
		var c = this;
		if($chk($(c.options.nextbuttonID))){
			$(c.options.nextbuttonID).addEvent(c.options.nextbuttonEvent,function(e){
				c.clearTimers();
				e.stop();
				if(c.options.allowButtons){
					switch(c.options.effect){
						case 'fade':
							c.options.runpID = c.fade();
							if(c.options.autorun){
								var slidefunction = function(){
									c.options.runpID = c.fade.periodical(c.options.effectDuration+c.options.wait,c);
								}
								c.options.runbID = slidefunction.delay(c.options.waitbeforereturning,c);
							}
							break;
						case 'hslide':
							c.options.runpID = c.hslide();
							if(c.options.autorun){
								var slidefunction = function(){
									c.options.runpID = c.hslide.periodical(c.options.effectDuration+c.options.wait,c);
								}
								c.options.runbID = slidefunction.delay(c.options.waitbeforereturning,c);
							}
							break;
						case 'hsliderev':
							c.options.runpID = c.hslideReverse();
							if(c.options.autorun){
								var slidefunction = function(){
									c.options.runpID = c.hslideReverse.periodical(c.options.effectDuration+c.options.wait,c);
								}
								c.options.runbID = slidefunction.delay(c.options.waitbeforereturning,c);
							}
							break;
						case 'vslide':
							c.options.runpID = c.vslide();
							if(c.options.autorun){
								var slidefunction = function(){
									c.options.runpID = c.vslide.periodical(c.options.effectDuration+c.options.wait,c);
								}
								c.options.runbID = slidefunction.delay(c.options.waitbeforereturning,c);
							}
							break;
						case 'vsliderev':
							c.options.runpID = c.vslideReverse();
							if(c.options.autorun){
								var slidefunction = function(){
									c.options.runpID = c.vslideReverse.periodical(c.options.effectDuration+c.options.wait,c);
								}
								c.options.runbID = slidefunction.delay(c.options.waitbeforereturning,c);
							}
							break;
					}
				}
			});
		}
	},
	
	
	runEffect: function(){
		switch(this.options.effect){
			case 'fade':
				this.options.runpID = this.fade.periodical(this.options.effectDuration+this.options.wait,this);
				break;
			case 'hslide':
				this.options.runpID = this.hslide.periodical(this.options.effectDuration+this.options.wait,this);
				break;
			case 'hsliderev':
				this.options.runpID = this.hslideReverse.periodical(this.options.effectDuration+this.options.wait,this);
				break;
			case 'vslide':
				this.options.runpID = this.vslide.periodical(this.options.effectDuration+this.options.wait,this);
				break;
			case 'vsliderev':
				this.options.runpID = this.vslideReverse.periodical(this.options.effectDuration+this.options.wait,this);
				break;
			default:
				alert('ecceSlider cannot run this effect');
		}
	},
	fade:function(){
		var c=this;
		c.options.allowButtons = false;
		var slides = $$('#'+c.options.sliderID+' ul li');
		this.options.slideFX = new Fx.Morph(slides[slides.length-1],{'duration':c.options.effectDuration,'transition':c.options.transitionEffect,'onComplete':function(){
			slides[slides.length-1].inject(slides[slides.length-1].getParent('ul'),'top');
			slides[slides.length-1].setStyle('opacity',1);
			c.options.allowButtons = true;
			var slides2 = $$('#'+c.options.sliderID+' ul li');
			if(c.options.listButtons) c.updateActiveButton(slides2,slides2[slides2.length-1].getProperty('id')+'_button');
		}});
		c.options.slideFX.start({'opacity': 0});
	},
	fadeReverse:function(){
		var c=this;
		c.options.allowButtons = false;
		var slides = $$('#'+c.options.sliderID+' ul li');
		slides[0].setStyle('opacity',0);
		slides[0].inject(slides[0].getParent('ul'));
		this.options.slideFX = new Fx.Morph(slides[0],{'duration':c.options.effectDuration,'transition':c.options.transitionEffect,'onComplete':function(){
			c.options.allowButtons = true;
			var slides2 = $$('#'+c.options.sliderID+' ul li');
			if(c.options.listButtons) c.updateActiveButton(slides2,slides2[slides2.length-1].getProperty('id')+'_button');
		}});
		c.options.slideFX.start({'opacity': 1});
	},
	fadeUsingID:function(ID){
		var c=this;
		c.options.allowButtons = false;
		var slides = $$('#'+c.options.sliderID+' ul li');
		if($(ID).getProperty('id') != slides[slides.length-1].getProperty('id')){
			$(ID).setStyle('opacity',0);
			$(ID).inject(slides[0].getParent('ul'));
			this.options.slideFX = new Fx.Morph($(ID),{'duration':c.options.effectDuration,'transition':c.options.transitionEffect,'onComplete':function(){
				c.options.allowButtons = true;
				var slides2 = $$('#'+c.options.sliderID+' ul li');
				c.orderSlides(slides2,true);
				if(c.options.listButtons) c.updateActiveButton(slides2,slides2[slides2.length-1].getProperty('id')+'_button');
			}});
			c.options.slideFX.start({'opacity': 1});
		}
	},
	
	hslide:function(){
		var c=this;
		c.options.allowButtons = false;
		var slides = $$('#'+c.options.sliderID+' ul li');
		this.options.slideFX = new Fx.Morph(slides[0],{'duration':c.options.effectDuration,'transition':c.options.transitionEffect,'onComplete':function(){
			slides[0].inject(slides[0].getParent('ul'));
			slides[0].setStyle('margin-left',0);
			c.options.allowButtons = true;
			var slides2 = $$('#'+c.options.sliderID+' ul li');
			if(c.options.listButtons) c.updateActiveButton(slides2,slides2[0].getProperty('id')+'_button');
		}});
		c.options.slideFX.start({'margin-left': -slides[0].getSize().x});
	},
	hslideReverse:function(){
		var c=this;
		c.options.allowButtons = false;
		var slides = $$('#'+c.options.sliderID+' ul li');
		slides[slides.length-1].setStyle('margin-left',-slides[slides.length-1].getSize().x);
		slides[slides.length-1].inject(slides[0].getParent('ul'),'top');
		this.options.slideFX = new Fx.Morph(slides[slides.length-1],{'duration':c.options.effectDuration,'transition':c.options.transitionEffect,'onComplete':function(){
			c.options.allowButtons = true;
			var slides2 = $$('#'+c.options.sliderID+' ul li');
			if(c.options.listButtons) c.updateActiveButton(slides2,slides2[0].getProperty('id')+'_button');
		}});
		c.options.slideFX.start({'margin-left':0});
	},
	hslideUsingID:function(ID){
		var c=this;
		var slides = $$('#'+c.options.sliderID+' ul li');
		if($(ID).getProperty('id') != slides[0].getProperty('id')){
			c.options.allowButtons = false;
			$(ID).setStyle('margin-left',-slides[slides.length-1].getSize().x);
			$(ID).inject(slides[0].getParent('ul'),'top');
			this.options.slideFX = new Fx.Morph($(ID),{'duration':c.options.effectDuration,'transition':c.options.transitionEffect,'onComplete':function(){
				c.options.allowButtons = true;
				var slides2 = $$('#'+c.options.sliderID+' ul li');
				c.orderSlides(slides2,false);
				if(c.options.listButtons) c.updateActiveButton(slides2,slides2[0].getProperty('id')+'_button');
			}});
			c.options.slideFX.start({'margin-left':0});
		}
	},
	
	
	
	vslide:function(){
		var c=this;
		c.options.allowButtons = false;
		var slides = $$('#'+c.options.sliderID+' ul li');
		c.options.slideFX = new Fx.Morph(slides[0],{'duration':c.options.effectDuration,'transition':c.options.transitionEffect,'onComplete':function(){
			slides[0].inject(slides[0].getParent('ul'));
			slides[0].setStyle('margin-top',0);
			c.options.allowButtons = true;
			var slides2 = $$('#'+c.options.sliderID+' ul li');
			if(c.options.listButtons) c.updateActiveButton(slides2,slides2[0].getProperty('id')+'_button');
		}});
		c.options.slideFX.start({'margin-top': -slides[0].getSize().y});
	},
	vslideReverse:function(){
		var c=this;
		c.options.allowButtons = false;
		var slides = $$('#'+c.options.sliderID+' ul li');
		slides[slides.length-1].setStyle('margin-top',-slides[slides.length-1].getSize().y);
		slides[slides.length-1].inject(slides[slides.length-1].getParent('ul'),'top');
		c.options.slideFX = new Fx.Morph(slides[slides.length-1],{'duration':c.options.effectDuration,'transition':c.options.transitionEffect,'onComplete':function(){
			c.options.allowButtons = true;
			var slides2 = $$('#'+c.options.sliderID+' ul li');
			if(c.options.listButtons) c.updateActiveButton(slides2,slides2[0].getProperty('id')+'_button');
		}});
		c.options.slideFX.start({'margin-top':0});
	},
	vslideUsingID:function(ID){
		var c=this;
		var slides = $$('#'+c.options.sliderID+' ul li');
		if($(ID).getProperty('id') != slides[0].getProperty('id')){
			c.options.allowButtons = false;
			$(ID).setStyle('margin-top',-slides[slides.length-1].getSize().y);
			$(ID).inject(slides[0].getParent('ul'),'top');
			c.options.slideFX = new Fx.Morph($(ID),{'duration':c.options.effectDuration,'transition':c.options.transitionEffect,'onComplete':function(){
				c.options.allowButtons = true;
				var slides2 = $$('#'+c.options.sliderID+' ul li');
				c.orderSlides(slides2,false);
			if(c.options.listButtons) c.updateActiveButton(slides2,slides2[0].getProperty('id')+'_button');
			}});
			c.options.slideFX.start({'margin-top':0});
		}
	},
	
	
	applySetupStyles: function(){
		if($chk($(this.options.sliderID))){
			var op = this.options;
			var sizes = new Object();
			sizes.x = $(this.options.sliderID).getStyle('width').toInt();
			sizes.y = $(this.options.sliderID).getStyle('height').toInt();
			$(this.options.sliderID).setStyles({'overflow':'hidden','padding':0});
			$$('#'+this.options.sliderID+' ul').each(function(elm){
				elm.setStyles({'padding':0,'margin':0,'height':sizes.y,'width':(sizes.x*3)});
			});
			$$('#'+this.options.sliderID+' ul li').each(function(elm){
				switch(op.effect){
					case 'fade':
						elm.setStyles({'padding':0,'margin':0,'height':sizes.y,'width':sizes.x,'list-style':'none','position':'absolute'});
						break;
					case 'hslide':
						elm.setStyles({'padding':0,'margin':0,'height':sizes.y,'width':sizes.x,'list-style':'none','float':'left'});
						break;
					case 'hsliderev':
						elm.setStyles({'padding':0,'margin':0,'height':sizes.y,'width':sizes.x,'list-style':'none','float':'left'});
						break;
					case 'vslide':
						elm.setStyles({'padding':0,'margin':0,'height':sizes.y,'width':sizes.x,'list-style':'none'});
						break;
					case 'vsliderev':
						elm.setStyles({'padding':0,'margin':0,'height':sizes.y,'width':sizes.x,'list-style':'none'});
						break;
					default:
						alert('ecceSlider cannot run this effect');
				}
			});
			if(op.effect=='fade'){
				var	slides = $$('#'+this.options.sliderID+' ul li');
				for(i=slides.length-2;i>=0;i--){
					slides[i].inject(slides[i].getParent('ul'));	
				}
			}
			if(op.effect=='hsliderev' || op.effect=='vsliderev'){
				var	slides = $$('#'+this.options.sliderID+' ul li');
				for(i=slides.length-2;i>=1;i--){
					slides[i].inject(slides[i].getParent('ul'));	
				}
			}
		}
	}
});
