/**
Script: Slideshow.js
	Slideshow - A javascript class for Mootools to stream and animate the presentation of images on your website.

License:
	MIT-style license.

Copyright:
	Copyright (c) 2008 [Aeron Glemann](http://www.electricprism.com/aeron/).

Dependencies:
	Mootools 1.2 Core: Fx.Morph, Fx.Tween, Selectors, Element.Dimensions.
	Mootools 1.2 More: Assets.
*/

Slideshow=new Class({
Implements:[Chain,Events,Options],options:{
captions:false,center:true,classes:[],controller:false,delay:2000,duration:750,fast:false,height:false,href:"",hu:"",linked:false,loader:{
animate:["css/loader-#.png",12]}
		,loop:true,match:/\?slide=(\d+)$/,overlap:true,paused:false,properties:["href","rel","rev","title"],random:false,replace:[/(\.[^\.]+)$/,"t$1"],resize:"width",slide:0,nails:false,titles:true,transition:function(A){
			return -(Math.cos(Math.PI*A)-1)/2}
		,width:false}
	,initialize:function(C,F,T,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")||"";
				
				F[S]={
caption:N,href:M,thumbnail:T}
			}
			)}
		var E=this.load(F,T);
		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"p":this.pause();
				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,T){
		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 TT=T[E]||{
			}
			;
			var B=(D.caption)?D.caption.trim():"";
			var A='kikoo';
			var F=(D.thumbnail)?D.thumbnail.trim():TT[0];
			this.data.images.push(E);
			this.data.captions.push(B);
			this.data.hrefs.push(E);
		}
for(var i=0; i<T.length;i++){		
	this.data.thumbnails.push(T[i]);
}
		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(300),width:Math.ceil(400)}
//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","p"].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","p"].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)}
).addClass('miniature').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)}
}
);

