Slideshow=new Class({Implements:[Chain, Events, Options],
	options:{
		captions: false,
		center: true,
		classes:[],
		controller: false,
		delay: 6000,
		duration: 2000,
		info: "InfoSpeed",
		fast: false,
		height: false,
		href: "",
		hu: "",
		linked: false,
		loader: {animate:["theme/loading.gif",12]},
		loop: true,
		match:/\?slide=(\d+)$/,
		overlap: true,
		paused: false,
		properties:["href","rel","rev","title"],
		random: true,
		replace:[/(\.[^\.]+)$/,"t$1"],
		resize:"width",
		slide: 0,
		thumbnails: false,
		titles: false,
		transition:function(A){
			return -(Math.cos(Math.PI*A)-1)/2
		},
		width:false
	},
	
	initialize:function(C,F,L){
		this.setOptions(L);
		this.slideshow=$(C);
		if(!this.slideshow){return}
		this.slideshow.set("styles",{display:"block",position:"relative","z-index":0});
		var H=window.location.href.match(this.options.match);
		this.slide=(this.options.match&&H)?H[1].toInt():this.options.slide;
		this.counter=this.delay=this.transition=0;
		this.direction="left";
		this.paused=false;
		if(!this.options.overlap){this.options.duration*=2}
		var G=this.slideshow.getElement("a")||new Element("a");
		if(!this.options.href){this.options.href=G.get("href")||""}
		if(this.options.hu.length&&!this.options.hu.test(/\/$/)){this.options.hu+="/"}
		if(this.options.fast===true){this.options.fast=2}
		var K=["slideshow","first","prev","play","pause","next","last","images","captions","controller","thumbnails","hidden","visible","inactive","active","loader"];
		var J=K.map(function(N,M){return this.options.classes[M]||N},this);
		this.classes=J.associate(K);
		this.classes.get=function(){
			var O="."+this.slideshow;
			for(var N=0,M=arguments.length;N<M;N++){
				O+=("-"+this[arguments[N]])
			}
			return O
		}
		.bind(this.classes);
		if(!F)
		{this.options.hu="";
			F={};
			var D=this.slideshow.getElements(this.classes.get("thumbnails")+" img");
			this.slideshow.getElements(this.classes.get("images")+" img").each(function(O,Q){
				var S=O.get("src");
				var N=$pick(O.get("alt"),O.get("title"),"");
				var R=O.getParent();
				var P=(R.get("tag")=="a")?R.getProperties:{};
				var M=O.getParent().get("href")||"";
				var T=(D[Q])?D[Q].get("src"):"";
				F[S]={caption:N,href:M,thumbnail:T}
			})
		}
		var E=this.load(F);
		if(!E){return }
		this.events=$H({keydown:[],keyup:[],mousemove:[]});
		var B=function(M){
			switch(M.key){
				case "left":
					this.prev(M.shift);
					break;
				case "right":
					this.next(M.shift);
					break;
				case "up":
					if (this.options.delay > 1000) this.options.delay = this.options.delay - 1000;
					if (this.options.delay <= 2000) this.options.duration = 1000;
					var ss = document.getElementById(this.options.info);
					if (this.options.delay < 10000)
						ss.innerHTML = (this.options.delay / 1000) + ".0";
					else
						ss.innerHTML = (this.options.delay / 1000);
					this.next(M.shift);
					break;
				case "down":
					if (this.options.delay < 32000) this.options.delay = this.options.delay + 1000;
					if (this.options.delay > 2000) this.options.duration = 2000;
					var ss = document.getElementById(this.options.info);
					if (this.options.delay < 10000)
						ss.innerHTML = (this.options.delay / 1000) + ".0";
					else
						ss.innerHTML = (this.options.delay / 1000);
					break;
				case "space":
					this.pause();
					var ss = document.getElementById(this.options.info);
					if (this.paused)
						ss.innerHTML = "&#133";
					else
						if (this.options.delay < 10000)
							ss.innerHTML = (this.options.delay / 1000) + ".0";
						else
							ss.innerHTML = (this.options.delay / 1000);
					break
			}
		}
		.bind(this);
		this.events.keyup.push(B);
		document.addEvent("keyup",B);
		var C=this.slideshow.getElement(this.classes.get("images"));
		var I=(C)?C.empty():new Element("div",{"class":this.classes.get("images").substr(1)}).inject(this.slideshow);
		var A=I.getSize();
		this.height=this.options.height||A.y;
		this.width=this.options.width||A.x;
		I.set({styles:{display:"block",height:this.height,overflow:"hidden",position:"relative",width:this.width}});
		this.slideshow.store("images",I);
		this.a=this.image=this.slideshow.getElement("img")||new Element("img");
		if(Browser.Engine.trident&&Browser.Engine.version>4){
			this.a.style.msInterpolationMode="bicubic"}
		this.a.set("styles",{display:"none",position:"absolute",zIndex:1});
		this.b=this.a.clone();
		[this.a,this.b].each(function(M){G.clone().cloneEvents(G).grab(M).inject(I)});
		if(this.options.captions){this._captions()}
		if(this.options.controller){this._controller()}
		if(this.options.loader){this._loader()}
		if(this.options.thumbnails){this._thumbnails()}
		this._preload()
	},
	go:function(B,A){
		if((this.slide-1+this.data.images.length)%this.data.images.length==B||$time()<this.transition){
			return}
		$clear(this.timer);
		this.delay=0;
		this.direction=(A)?A:((B<this.slide)?"right":"left");
		this.slide=B;
		if(this.preloader){
			this.preloader=this.preloader.destroy()
		}
		this._preload(this.options.fast==2||(this.options.fast==1&&this.paused))
	},
	first:function(){this.prev(true)},
	prev:function(A){
		var B=0;
		if(!A){
			if(this.options.random){
				if(this.showed.i<2){
					return
				}
				this.showed.i-=2;
				B=this.showed.array[this.showed.i]}
			else{
				B=(this.slide-2+this.data.images.length)%this.data.images.length
			}
		}
		this.go(B,"right")
	},
	pause:function(A){
		if($chk(A)){
			this.paused=(A)?false:true
		}
		if(this.paused){
			this.paused=false;
			this.delay=this.transition=0;
			this.timer=this._preload.delay(100,this);
			[this.a,this.b].each(function(B){
				["morph","tween"].each(function(C){if(this.retrieve(C)){this.get(C).resume()}},B)
			});
			if(this.options.controller){
				this.slideshow.getElement("."+this.classes.pause).removeClass(this.classes.play)
			}
		}
		else{
			this.paused=true;
			this.delay=Number.MAX_VALUE;
			this.transition=0;
			$clear(this.timer);
			[this.a,this.b].each(function(B){
				["morph","tween"].each(function(C){
					if(this.retrieve(C)){
						this.get(C).pause()
					}
				},B)
			});
			if(this.options.controller){
				this.slideshow.getElement("."+this.classes.pause).addClass(this.classes.play)
			}
		}
	},
	next:function(A){
		var B=(A)?this.data.images.length-1:this.slide;this.go(B,"left")
	},
	last:function(){
		this.next(true)
	},
	load:function(C){
		this.firstrun=true;
		this.showed={array:[],i:0};
		if($type(C)=="array"){
			this.options.captions=false;C=new Array(C.length).associate(C.map(function(H,G){return H+"?"+G}))
		}
		this.data={images:[],captions:[],hrefs:[],thumbnails:[]};
		for(var E in C){
			var D=C[E]||{};
			var B=(D.caption)?D.caption.trim():"";
			var A=(D.href)?D.href.trim():((this.options.linked)?this.options.hu+E:this.options.href);
			var F=(D.thumbnail)?D.thumbnail.trim():E.replace(this.options.replace[0],this.options.replace[1]);
			this.data.images.push(E);
			this.data.captions.push(B);
			this.data.hrefs.push(A);
			this.data.thumbnails.push(F)
		}
		if(this.options.random){
			this.slide=$random(0,this.data.images.length-1)
		}
		if(this.options.thumbnails&&this.slideshow.retrieve("thumbnails")){
			this._thumbnails()
		}
		if(this.slideshow.retrieve("images")){
			[this.a,this.b].each(function(G){
				["morph","tween"].each(function(H){if(this.retrieve(H)){this.get(H).cancel()}},G)
			});
			this.slide=this.transition=0;
			this.go(0)
		}
		return this.data.images.length
	},
	destroy:function(A){
		this.events.each(function(C,B){
			C.each(function(D){document.removeEvent(B,D)})
		});
		this.pause(1);
		if(this.options.loader){
			$clear(this.slideshow.retrieve("loader").retrieve("timer"))
		}
		if(this.options.thumbnails){
			$clear(this.slideshow.retrieve("thumbnails").retrieve("timer"))
		}
		this.slideshow.uid=Native.UID++;
		if(A){this.slideshow[A]()}
	},
	_preload:function(A){
		if(!this.preloader){
			this.preloader=new Asset.image(this.options.hu+this.data.images[this.slide],{onload:function(){
				this.store("loaded",true)
			}})
		}
		if(this.preloader.retrieve("loaded")&&$time()>this.delay&&$time()>this.transition){
			if(this.stopped){
				if(this.options.captions){
					this.slideshow.retrieve("captions").get("morph").cancel().start(this.classes.get("captions","hidden"))
				}
				this.pause(1);
				if(this.end){
					this.fireEvent("end")
				}
				this.stopped=this.end=false;
				return
			}
			this.image=(this.counter%2)?this.b:this.a;
			this.image.set("styles",{
				display:"block",height:"auto",visibility:"hidden",width:"auto",zIndex:this.counter
			});
			["src","height","width"].each(function(D){
				this.image.set(D,this.preloader.get(D))
			}
			,this);
			this._resize(this.image);
			this._center(this.image);
			var B=this.image.getParent();
			if(this.data.hrefs[this.slide]){
				B.set("href",this.data.hrefs[this.slide])
			}
			else{B.erase("href")}
			var C=(this.data.captions[this.slide])?this.data.captions[this.slide].replace(/<.+?>/gm,"").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"'"):"";
			this.image.set("alt",C);
			if(this.options.titles){
				B.set("title",C)
			}
			if(this.options.loader){
				this.slideshow.retrieve("loader").fireEvent("hide")
			}
			if(this.options.captions){
				this.slideshow.retrieve("captions").fireEvent("update",A)
			}
			if(this.options.thumbnails){
				this.slideshow.retrieve("thumbnails").fireEvent("update",A)
			}
			this._show(A);this._loaded()
		}
		else{
			if($time()>this.delay&&this.options.loader){this.slideshow.retrieve("loader").fireEvent("show")}this.timer=(this.paused&&this.preloader.retrieve("loaded"))?null:this._preload.delay(100,this,A)
		}
	},
	_show:function(B){
		if(!this.image.retrieve("morph")){
			var C=(this.options.overlap)?{duration:this.options.duration,link:"cancel"}:{duration:this.options.duration/2,link:"chain"};
			$$(this.a,this.b).set("morph",$merge(C,{onStart:this._start.bind(this),onComplete:this._complete.bind(this),transition:this.options.transition}))
		}
		var E=this.classes.get("images",((this.direction=="left")?"next":"prev"));
		var F=this.classes.get("images","visible");
		var A=(this.counter%2)?this.a:this.b;
		if(B){
			A.get("morph").cancel().set(E);this.image.get("morph").cancel().set(F)
		}
		else{
			if(this.options.overlap){
				A.get("morph").set(F);this.image.get("morph").set(E).start(F)
			}
			else{
				var D=function(G,H){this.image.get("morph").set(G).start(H)}.pass([E,F],this);
				E=this.classes.get("images",((this.direction=="left")?"prev":"next"));
				A.get("morph").set(F).start(E).chain(D)
			}
		}
	},
	_loaded:function(){
		this.counter++;
		this.delay=(this.paused)?Number.MAX_VALUE:$time()+this.options.duration+this.options.delay;
		this.direction="left";
		this.transition=(this.options.fast==2||(this.options.fast==1&&this.paused))?0:$time()+this.options.duration;
		if(this.slide+1==this.data.images.length&&!this.options.loop&&!this.options.random){
			this.stopped=this.end=true
		}
		if(this.options.random){
			this.showed.i++;if(this.showed.i>=this.showed.array.length){var A=this.slide;if(this.showed.array.getLast()!=A){this.showed.array.push(A)}while(this.slide==A){this.slide=$random(0,this.data.images.length-1)}}else{this.slide=this.showed.array[this.showed.i]}
		}
		else{
			this.slide=(this.slide+1)%this.data.images.length
		}
		if(this.image.getStyle("visibility")!="visible"){
			(function(){this.image.setStyle("visibility","visible")}).delay(1,this)
		}
		if(this.preloader){
			this.preloader=this.preloader.destroy()
		}
		this._preload()
	},
	_center:function(A){
		if(this.options.center){
			var B=A.getSize();
			A.set("styles",{left:(B.x-this.width)/-2,top:(B.y-this.height)/-2})
		}
	},
	_resize:function(B){
		if(this.options.resize){
			var D=this.preloader.get("height"),A=this.preloader.get("width");
			var E=this.height/D,C=this.width/A,F;
			if(this.options.resize=="length"){
				F=(E>C)?C:E
			}
			else{F=(E>C)?E:C}
			B.set("styles",{height:Math.ceil(D*F),width:Math.ceil(A*F)})
		}
	},
	_start:function(){this.fireEvent("start")},
	_complete:function(){
		if(this.firstrun&&this.options.paused){this.firstrun=false;this.pause(1)}this.fireEvent("complete")
	},
	_captions:function(){
		if(this.options.captions===true){
			this.options.captions={}
		}
		var B=this.slideshow.getElement(this.classes.get("captions"));
		var A=(B)?B.empty():new Element("div",{"class":this.classes.get("captions").substr(1)}).inject(this.slideshow);
		A.set({events:
			{update:function(D){
				var C=this.slideshow.retrieve("captions");
				var F=(this.data.captions[this.slide]==="");
				if(D){
					var G=(F)?"hidden":"visible";C.set("html",this.data.captions[this.slide]).get("morph").cancel().set(this.classes.get("captions",G))
				}
				else{
					var E=(F)?$empty:function(H){
						this.slideshow.retrieve("captions").set("html",this.data.captions[H]).morph(this.classes.get("captions","visible"))
					}.pass(this.slide,this);
					C.get("morph").cancel().start(this.classes.get("captions","hidden")).chain(E)
					}
				}
			.bind(this)
			}
		,morph:$merge(this.options.captions,{link:"chain"})});
		this.slideshow.store("captions",A)
	},
	_controller:function(){
		if(this.options.controller===true){
			this.options.controller={}
		}
		var E=this.slideshow.getElement(this.classes.get("controller"));
		var A=(E)?E.empty():new Element("div",{"class":this.classes.get("controller").substr(1)}).inject(this.slideshow);
		var C=new Element("ul").inject(A);
		$H({
			first:"Shift + Leftwards Arrow",prev:"Leftwards Arrow",pause:"P",next:"Rightwards Arrow",last:"Shift + Rightwards Arrow"
		})
		.each(function(J,I){
			var G=new Element("li",{
				"class":(I=="pause"&&this.options.paused)?this.classes.play+" "+this.classes[I]:this.classes[I]
			}).inject(C);
			var H=this.slideshow.retrieve(I,new Element("a",{
				title:((I=="pause")?this.classes.play.capitalize()+" / ":"")+this.classes[I].capitalize()+" ["+J+"]"
			}).inject(G));
			H.set("events",{
				click:function(K){
					this[K]()
				}.pass(I,this),mouseenter:function(K){
					this.addClass(K)
				}.pass(this.classes.active,H),mouseleave:function(K){this.removeClass(K)}.pass(this.classes.active,H)
			})
		},this);
		A.set({events:
			{hide:function(G){
				if(!this.retrieve("hidden")){
					this.store("hidden",true).morph(G)
				}
			}.pass(this.classes.get("controller","hidden"),A),show:function(G){
					if(this.retrieve("hidden")){this.store("hidden",false).morph(G)}
				}.pass(this.classes.get("controller","visible"),A)
			},morph:$merge(this.options.controller,{link:"cancel"})}).store("hidden",false);
			var B=function(H){
				if(["left","right","space"].contains(H.key)){
					var G=this.slideshow.retrieve("controller");
					if(G.retrieve("hidden")){
						G.get("morph").set(this.classes.get("controller","visible"))
					}
					switch(H.key){
						case "left":
							this.slideshow.retrieve((H.shift)?"first":"prev").fireEvent("mouseenter");
							break;
						case "right":
							this.slideshow.retrieve((H.shift)?"last":"next").fireEvent("mouseenter");
							break;
						default:
							this.slideshow.retrieve("pause").fireEvent("mouseenter");
							break
					}
				}
			}.bind(this);
			this.events.keydown.push(B);
			var F=function(H){
				if(["left","right","space"].contains(H.key)){
					var G=this.slideshow.retrieve("controller");
					if(G.retrieve("hidden")){
						G.store("hidden",false).fireEvent("hide")
					}
					switch(H.key){
						case "left":
							this.slideshow.retrieve((H.shift)?"first":"prev").fireEvent("mouseleave");
							break;
						case "right":
							this.slideshow.retrieve((H.shift)?"last":"next").fireEvent("mouseleave");
							break;
						default:
							this.slideshow.retrieve("pause").fireEvent("mouseleave");
							break
					}
				}
			}.bind(this);
			this.events.keyup.push(F);
			var D=function(H){
				var G=this.slideshow.retrieve("images").getCoordinates();
				if(H.page.x>G.left&&H.page.x<G.right&&H.page.y>G.top&&H.page.y<G.bottom){
					this.slideshow.retrieve("controller").fireEvent("show")
				}
				else{
					this.slideshow.retrieve("controller").fireEvent("hide")
				}
			}.bind(this);
			this.events.mousemove.push(D);
			document.addEvents({keydown:B,keyup:F,mousemove:D});
			this.slideshow.retrieve("controller",A).fireEvent("hide")
	},
	_loader:function(){
		if(this.options.loader===true){
			this.options.loader={}
		}
		var A=new Element("div",{"class":this.classes.get("loader").substr(1),morph:$merge(this.options.loader,{link:"cancel"})})
		.store("hidden",false).store("i",1).inject(this.slideshow.retrieve("images"));
		if(this.options.loader.animate){
			for(var B=0;B<this.options.loader.animate[1];B++){
				img=new Asset.image(this.options.loader.animate[0].replace(/#/,B))
			}
			if(Browser.Engine.trident4&&this.options.loader.animate[0].contains("png")){
				A.setStyle("backgroundImage","none")
			}
		}
		A.set("events",{animate:function(){
			var C=this.slideshow.retrieve("loader");
			var E=(C.retrieve("i").toInt()+1)%this.options.loader.animate[1];
			C.store("i",E);
			var D=this.options.loader.animate[0].replace(/#/,E);
			if(Browser.Engine.trident4&&this.options.loader.animate[0].contains("png")){
				C.style.filter='progid:DXImageTransform.Microsoft.AlphaImageLoader(src="'+D+'", sizingMethod="scale")'
			}
			else{
				C.setStyle("backgroundImage","url("+D+")")
			}
		}.bind(this),hide:function(){
			var C=this.slideshow.retrieve("loader");
			if(!C.retrieve("hidden")){C.store("hidden",true).morph(this.classes.get("loader","hidden"));
			if(this.options.loader.animate){$clear(C.retrieve("timer"))}}
		}.bind(this),show:function(){
			var C=this.slideshow.retrieve("loader");
			if(C.retrieve("hidden")){
				C.store("hidden",false).morph(this.classes.get("loader","visible"));
				if(this.options.loader.animate){C.store("timer",function(){
					this.fireEvent("animate")
				}.periodical(50,C))}
			}
		}.bind(this)});this.slideshow.retrieve("loader",A).fireEvent("hide")
	},
	_thumbnails:function(){
		if(this.options.thumbnails===true){
			this.options.thumbnails={}
		}
		var C=this.slideshow.getElement(this.classes.get("thumbnails"));
		var E=(C)?C.empty():new Element("div",{"class":this.classes.get("thumbnails").substr(1)}).inject(this.slideshow);
		E.setStyle("overflow","hidden");
		var A=new Element("ul",{tween:{link:"cancel"}}).inject(E);
		this.data.thumbnails.each(function(J,I){var F=new Element("li").inject(A);
		var G=new Element("a",{events:{
			click:function(K){
				this.go(K);
				return false
			}.pass(I,this),loaded:function(){
				this.data.thumbnails.pop();
				if(!this.data.thumbnails.length){
					var O=E.getCoordinates();
					var M=E.retrieve("props");
					var K=0,N=M[1],L=M[2];
					E.getElements("li").each(function(P){
						var P=P.getCoordinates();if(P[N]>K){K=P[N]}
					},this);
					E.store("limit",O[L]+O[M[0]]-K)
				}
			}.bind(this)
		},href:this.options.hu+this.data.images[I],morph:$merge(this.options.thumbnails,{link:"cancel"})}).inject(F);
		if(this.data.captions[I]&&this.options.titles){
			G.set("title",this.data.captions[I].replace(/<.+?>/gm,"").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"'"))
		}
		var H=new Asset.image(this.options.hu+J,{onload:function(){this.fireEvent("loaded")}.bind(G)}).inject(G)},this);
		E.set("events",{scroll:function(H,K){
			var F=this.getCoordinates();
			var L=this.getElement("ul").getPosition();
			var N=this.retrieve("props");
			var I=N[3],R,O=N[0],T=N[2],P;
			var S=this.getElement("ul").get("tween",{property:O});
			if($chk(H)){
				var Q=this.getElements("li")[H].getCoordinates();R=F[O]+(F[T]/2)-(Q[T]/2)-Q[O];P=(L[I]-F[O]+R).limit(this.retrieve("limit"),0);if(K){S.set(P)}else{S.start(P)}
			}
			else{
				var G=F[N[2]]/3,M=this.retrieve("page"),J=-0.2;if(M[I]<(F[O]+G)){R=(M[I]-F[O]-G)*J}else{if(M[I]>(F[O]+F[T]-G)){R=(M[I]-F[O]-F[T]+G)*J}}if(R){P=(L[I]-F[O]+R).limit(this.retrieve("limit"),0);S.set(P)}
			}
		}.bind(E),update:function(F){
			var G=this.slideshow.retrieve("thumbnails");
			G.getElements("a").each(function(H,I){
				if(I==this.slide){
					if(!H.retrieve("active",false)){H.store("active",true);var K=this.classes.get("thumbnails","active");if(F){H.get("morph").set(K)}else{H.morph(K)}}
				}
				else{
					if(H.retrieve("active",true)){
						H.store("active",false);
						var J=this.classes.get("thumbnails","inactive");
						if(F){H.get("morph").set(J)}
							else {H.morph(J)}
					}
				}
			},this);
			if(!G.retrieve("mouseover")){
				G.fireEvent("scroll",[this.slide,F])
			}
		}.bind(this)});
		var D=E.getCoordinates();
		E.store("props",(D.height>D.width)?["top","bottom","height","y"]:["left","right","width","x"]);
		var B=function(F){
			var G=this.getCoordinates();
			if(F.page.x>G.left&&F.page.x<G.right&&F.page.y>G.top&&F.page.y<G.bottom){
				this.store("page",F.page);if(!this.retrieve("mouseover")){this.store("mouseover",true);this.store("timer",function(){this.fireEvent("scroll")}.periodical(50,this))}
			}
			else{
				if(this.retrieve("mouseover")){
					this.store("mouseover",false);
					$clear(this.retrieve("timer"))
				}
			}
		}.bind(E);
		this.events.mousemove.push(B);
		document.addEvent("mousemove",B);
		this.slideshow.store("thumbnails",E)
	}
});
