/**
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,
        fast:false,
        height:false,
        href:"",
        hu:"",
        linked:false,
        loader:{animate:["../images/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,
        thumbnails:false,
        titles:true,
        transition:function(p){
            return -(Math.cos(Math.PI*p)-1)/2},width:false
            },
            initialize:function(el,data,options){
                this.setOptions(options);
                this.slideshow=$(el);
                if(!this.slideshow){
                    return
                }
                this.slideshow.set("styles",{display:"block",position:"relative","z-index":0});
                var match=window.location.href.match(this.options.match);
                this.slide=(this.options.match&&match)?match[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 anchor=this.slideshow.getElement("a")||new Element("a");
                if(!this.options.href){
                    this.options.href=anchor.get("href")||""
                }
                if(this.options.hu.length&&!this.options.hu.test(/\/$/)){
                    this.options.hu+="/"
                }
                if(this.options.fast===true){
                    this.options.fast=2
                }
                var keys=["slideshow","first","prev","play","pause","next","last","images","captions","controller","thumbnails","hidden","visible","inactive","active","loader"];
                var values=keys.map(function(key,i){return this.options.classes[i]||key},this);
                this.classes=values.associate(keys);
                this.classes.get=function(){
                    var str="."+this.slideshow;
                    for(var i=0,l=arguments.length;i<l;i++){
                        str+=("-"+this[arguments[i]])}return str}.bind(this.classes);
                if(!data){
                    this.options.hu="";
                    data={};
                    var thumbnails=this.slideshow.getElements(this.classes.get("thumbnails")+" img");
                    this.slideshow.getElements(this.classes.get("images")+" img").each(function(img,i){var src=img.get("src");
                    var caption=$pick(img.get("alt"),
                    img.get("title"),"");
                    var parent=img.getParent();
                    var properties=(parent.get("tag")=="a")?parent.getProperties:{};
                    var href=img.getParent().get("href")||"";
                    var thumbnail=(thumbnails[i])?thumbnails[i].get("src"):"";
                    data[src]={caption:caption,href:href,thumbnail:thumbnail}})
            }
            var loaded=this.load(data);
                if(!loaded){return}this.events=$H({keydown:[],keyup:[],mousemove:[]});
                var keyup=function(e){switch(e.key){case"left":this.prev(e.shift);break;case"right":this.next(e.shift);
                                break;
                                case"p":this.pause();
                                    break}}.bind(this);
                            this.events.keyup.push(keyup);
                            document.addEvent("keyup",keyup);
                            var el=this.slideshow.getElement(this.classes.get("images"));
                            var images=(el)?el.empty():new Element("div",{"class":this.classes.get("images").substr(1)}).inject(this.slideshow);
                            var div=images.getSize();
                            this.height=this.options.height||div.y;
                            this.width=this.options.width||div.x;
                            images.set({styles:{display:"block",height:this.height,overflow:"hidden",position:"relative",width:this.width}});
                            this.slideshow.store("images",images);
                            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(img){anchor.clone().cloneEvents(anchor).grab(img).inject(images)});
                            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(n,direction){if((this.slide-1+this.data.images.length)%this.data.images.length==n||$time()<this.transition){return}$clear(this.timer);
                            this.delay=0;
                            this.direction=(direction)?direction:((n<this.slide)?"right":"left");
                            this.slide=n;
                            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(first){
                            var n=0;if(!first){
                                if(this.options.random){
                                    if(this.showed.i<2){return}this.showed.i-=2;
                                    n=this.showed.array[this.showed.i]
                                }
                                else{
                                    n=(this.slide-2+this.data.images.length)%this.data.images.length
                                }
                            }
                            this.go(n,"right")},
                        pause:function(p){
                           
                            if($chk(p)){
                                this.paused=(p)?false:true
                            }
                            if(this.paused){
                               is_music_play(1);
                                this.paused=false;
                                this.delay=this.transition=0;
                                this.timer=this._preload.delay(100,this);
                                [this.a,this.b].each(function(img){["morph","tween"].each(function(p){if(this.retrieve(p)){this.get(p).resume()}},img)});
                                if(this.options.controller){
                                    this.slideshow.getElement("."+this.classes.pause).removeClass(this.classes.play)
                                }
                            }else{
                                is_music_play(0);
                                this.paused=true;
                                this.delay=Number.MAX_VALUE;
                                this.transition=0;
                                $clear(this.timer);
                                [this.a,this.b].each(function(img){["morph","tween"].each(function(p){if(this.retrieve(p)){this.get(p).pause()}},img)});
                                if(this.options.controller){this.slideshow.getElement("."+this.classes.pause).addClass(this.classes.play)}
                            }},
                        next:function(last){var n=(last)?this.data.images.length-1:this.slide;
                            this.go(n,"left")},
                        last:function(){this.next(true)},load:function(data){this.firstrun=true;
                            this.showed={array:[],i:0};
                            if($type(data)=="array"){this.options.captions=false;
                                data=new Array(data.length).associate(data.map(function(image,i){return image+"?"+i}))}this.data={images:[],captions:[],hrefs:[],thumbnails:[]};
                            for(var image in data){var obj=data[image]||{};
                                var caption=(obj.caption)?obj.caption.trim():"";
                                var href=(obj.href)?obj.href.trim():((this.options.linked)?this.options.hu+image:this.options.href);
                                var thumbnail=(obj.thumbnail)?obj.thumbnail.trim():image.replace(this.options.replace[0],this.options.replace[1]);
                                this.data.images.push(image);
                                this.data.captions.push(caption);
                                this.data.hrefs.push(href);
                                this.data.thumbnails.push(thumbnail)}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(img){["morph","tween"].each(function(p){if(this.retrieve(p)){this.get(p).cancel()}},img)});
                                this.slide=this.transition=0;
                                this.go(0)}return this.data.images.length},
                        destroy:function(p){this.events.each(function(array,e){array.each(function(fn){document.removeEvent(e,fn)})});
                            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(p){this.slideshow[p]()}},
                        _preload:function(fast){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(prop){this.image.set(prop,this.preloader.get(prop))},this);
                                //this._resize(this.image);
                                this._center(this.image);
                                var anchor=this.image.getParent();
                                if(this.data.hrefs[this.slide]){anchor.set("href",this.data.hrefs[this.slide])}else{anchor.erase("href")}var text=(this.data.captions[this.slide])?this.data.captions[this.slide].replace(/<.+?>/gm,"").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"'"):"";
                                this.image.set("alt",text);
                                if(this.options.titles){anchor.set("title",text)}if(this.options.loader){this.slideshow.retrieve("loader").fireEvent("hide")}if(this.options.captions){this.slideshow.retrieve("captions").fireEvent("update",fast)}if(this.options.thumbnails){this.slideshow.retrieve("thumbnails").fireEvent("update",fast)}this._show(fast);
                                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,fast)}},
                        _show:function(fast){if(!this.image.retrieve("morph")){var options=(this.options.overlap)?{duration:this.options.duration,link:"cancel"}:{duration:this.options.duration/2,link:"chain"};
                                $$(this.a,this.b).set("morph",$merge(options,{onStart:this._start.bind(this),
                                    onComplete:this._complete.bind(this),
                                    transition:this.options.transition}))}var hidden=this.classes.get("images",((this.direction=="left")?"next":"prev"));
                            var visible=this.classes.get("images","visible");
                            var img=(this.counter%2)?this.a:this.b;if(fast){img.get("morph").cancel().set(hidden);
                                this.image.get("morph").cancel().set(visible)}else{if(this.options.overlap){img.get("morph").set(visible);this.image.get("morph").set(hidden).start(visible)}else{var fn=function(hidden,visible){this.image.get("morph").set(hidden).start(visible)}.pass([hidden,visible],this);
                                    hidden=this.classes.get("images",((this.direction=="left")?"prev":"next"));
                                    img.get("morph").set(visible).start(hidden).chain(fn)}}},
                        _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 n=this.slide;
                                    if(this.showed.array.getLast()!=n){this.showed.array.push(n)}while(this.slide==n){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(img){if(this.options.center){var size=img.getSize();
                                img.set("styles",{left:(size.x-this.width)/-4,top:(size.y-this.height)/-0})}},
                        _resize:function(img){if(this.options.resize){var h=this.preloader.get("height"),w=this.preloader.get("width");
                                var dh=this.height/h,dw=this.width/w,d;
                                if(this.options.resize=="length"){d=(dh>dw)?dw:dh}else{d=(dh>dw)?dh:dw}img.set("styles",{height:Math.ceil(h*d),width:Math.ceil(w*d)})}},
                        _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 el=this.slideshow.getElement(this.classes.get("captions"));
                            var captions=(el)?el.empty():new Element("div",{"class":this.classes.get("captions").substr(1)}).inject(this.slideshow);
                            captions.set({events:{update:function(fast){var captions=this.slideshow.retrieve("captions");
                                        var empty=(this.data.captions[this.slide]==="");
                                        if(fast){var p=(empty)?"hidden":"visible";
                                            captions.set("html",this.data.captions[this.slide]).get("morph").cancel().set(this.classes.get("captions",p))}else{var fn=(empty)?$empty:function(n){this.slideshow.retrieve("captions").set("html",this.data.captions[n]).morph(this.classes.get("captions","visible"))}.pass(this.slide,this);
                                            captions.get("morph").cancel().start(this.classes.get("captions","hidden")).chain(fn)}}.bind(this)},morph:$merge(this.options.captions,{link:"chain"})});
                            this.slideshow.store("captions",captions)},
                        _controller:function(){if(this.options.controller===true){this.options.controller={}}var el=this.slideshow.getElement(this.classes.get("controller"));
                            var controller=(el)?el.empty():new Element("div",{"class":this.classes.get("controller").substr(1)}).inject(this.slideshow);
                            var ul=new Element("ul").inject(controller);$H({first:"Shift + Leftwards Arrow",prev:"Leftwards Arrow",pause:"P",next:"Rightwards Arrow",last:"Shift + Rightwards Arrow"}).each(function(accesskey,action){var li=new Element("li",{"class":(action=="pause"&&this.options.paused)?this.classes.play+" "+this.classes[action]:this.classes[action]}).inject(ul);
                                var a=this.slideshow.retrieve(action,new Element("a",{title:((action=="pause")?this.classes.play.capitalize()+" / ":"")+this.classes[action].capitalize()+" ["+accesskey+"]"}).inject(li));
                                a.set("events",{click:function(action){this[action]()}.pass(action,this),mouseenter:function(active){this.addClass(active)}.pass(this.classes.active,a),mouseleave:function(active){this.removeClass(active)}.pass(this.classes.active,a)})},this);
                            controller.set({events:{hide:function(hidden){if(!this.retrieve("hidden")){this.store("hidden",true).morph(hidden)}}.pass(this.classes.get("controller","unhidden"),controller),
                                    show:function(visible){if(this.retrieve("hidden")){this.store("hidden",false).morph(visible)}}.pass(this.classes.get("controller","visible"),controller)},morph:$merge(this.options.controller,{link:"cancel"})}).store("hidden",false);
                            var keydown=function(e){if(["left","right","p"].contains(e.key)){var controller=this.slideshow.retrieve("controller");
                                    if(controller.retrieve("hidden")){controller.get("morph").set(this.classes.get("controller","disable"))}switch(e.key){case"left":this.slideshow.retrieve((e.shift)?"first":"prev").fireEvent("mouseenter");
                                            break;case"right":this.slideshow.retrieve((e.shift)?"last":"next").fireEvent("mouseenter");
                                                break;default:this.slideshow.retrieve("pause").fireEvent("mouseenter");
                                                    break}}}.bind(this);this.events.keydown.push(keydown);
                                        var keyup=function(e){if(["left","right","p"].contains(e.key)){var controller=this.slideshow.retrieve("controller");
                                                if(controller.retrieve("unhidden")){controller.store("hidden",false).fireEvent("hide")}switch(e.key){case"left":this.slideshow.retrieve((e.shift)?"first":"prev").fireEvent("mouseleave");
                                                        break;case"right":this.slideshow.retrieve((e.shift)?"last":"next").fireEvent("mouseleave");
                                                            break;default:this.slideshow.retrieve("pause").fireEvent("mouseleave");break}}}.bind(this);
                                                    this.events.keyup.push(keyup);
                                                    var mousemove=function(e){var images=this.slideshow.retrieve("images").getCoordinates();if(e.page.x>images.left&&e.page.x<images.right&&e.page.y>images.top&&e.page.y<images.bottom){this.slideshow.retrieve("controller").fireEvent("show")}else{this.slideshow.retrieve("controller").fireEvent("hide")}}.bind(this);
                                                    this.events.mousemove.push(mousemove);document.addEvents({keydown:keydown,keyup:keyup,mousemove:mousemove});
                                                    this.slideshow.retrieve("controller",controller).fireEvent("hide")},
                                                _loader:function(){if(this.options.loader===true){this.options.loader={}}var loader=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 i=0;i<this.options.loader.animate[1];i++){img=new Asset.image(this.options.loader.animate[0].replace(/#/,i))}if(Browser.Engine.trident4&&this.options.loader.animate[0].contains("png")){loader.setStyle("backgroundImage","none")}}loader.set("events",{animate:function(){var loader=this.slideshow.retrieve("loader");
                                                            var i=(loader.retrieve("i").toInt()+1)%this.options.loader.animate[1];
                                                            loader.store("i",i);
                                                            var img=this.options.loader.animate[0].replace(/#/,i);
                                                            if(Browser.Engine.trident4&&this.options.loader.animate[0].contains("png")){loader.style.filter='progid:DXImageTransform.Microsoft.AlphaImageLoader(src="'+img+'", sizingMethod="scale")'}else{loader.setStyle("backgroundImage","url("+img+")")}}.bind(this),hide:function(){var loader=this.slideshow.retrieve("loader");
                                                            if(!loader.retrieve("hidden")){loader.store("hidden",true).morph(this.classes.get("loader","hidden"));
                                                                if(this.options.loader.animate){$clear(loader.retrieve("timer"))}}}.bind(this),show:function(){var loader=this.slideshow.retrieve("loader");
                                                            if(loader.retrieve("hidden")){loader.store("hidden",false).morph(this.classes.get("loader","visible"));
                                                                if(this.options.loader.animate){loader.store("timer",function(){this.fireEvent("animate")}.periodical(50,loader))}}}.bind(this)});
                                                    this.slideshow.retrieve("loader",loader).fireEvent("hide")},
                                                _thumbnails:function(){if(this.options.thumbnails===true){this.options.thumbnails={}}var el=this.slideshow.getElement(this.classes.get("thumbnails"));
                                                    var thumbnails=(el)?el.empty():new Element("div",{"class":this.classes.get("thumbnails").substr(1)}).inject(this.slideshow);
                                                    thumbnails.setStyle("overflow","hidden");
                                                    var ul=new Element("ul",{tween:{link:"cancel"}}).inject(thumbnails);this.data.thumbnails.each(function(thumbnail,i){var li=new Element("li").inject(ul);
                                                        var a=new Element("a",{events:{click:function(i){this.go(i);return false}.pass(i,this),loaded:function(){this.data.thumbnails.pop();
                                                                    if(!this.data.thumbnails.length){var div=thumbnails.getCoordinates();
                                                                        var props=thumbnails.retrieve("props");
                                                                        var limit=0,pos=props[1],size=props[2];
                                                                        thumbnails.getElements("li").each(function(li){var li=li.getCoordinates();
                                                                            if(li[pos]>limit){limit=li[pos]}},this);
                                                                        thumbnails.store("limit",div[size]+div[props[0]]-limit)}}.bind(this)},href:this.options.hu+this.data.images[i],morph:$merge(this.options.thumbnails,{link:"cancel"})}).inject(li);if(this.data.captions[i]&&this.options.titles){a.set("title",this.data.captions[i].replace(/<.+?>/gm,"").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"'"))}var img=new Asset.image(this.options.hu+thumbnail,{onload:function(){this.fireEvent("loaded")}.bind(a)}).inject(a)},this);
                                                    thumbnails.set("events",{scroll:function(n,fast){var div=this.getCoordinates();
                                                            var ul=this.getElement("ul").getPosition();var props=this.retrieve("props");
                                                            var axis=props[3],delta,pos=props[0],size=props[2],value;
                                                            var tween=this.getElement("ul").get("tween",{property:pos});
                                                            if($chk(n)){var li=this.getElements("li")[n].getCoordinates();delta=div[pos]+(div[size]/2)-(li[size]/2)-li[pos];
                                                                value=(ul[axis]-div[pos]+delta).limit(this.retrieve("limit"),0);
                                                                if(fast){tween.set(value)}else{tween.start(value)}}else{var area=div[props[2]]/3,page=this.retrieve("page"),
                                                                velocity=-0.2;
                                                                if(page[axis]<(div[pos]+area)){delta=(page[axis]-div[pos]-area)*velocity}else{if(page[axis]>(div[pos]+div[size]-area)){delta=(page[axis]-div[pos]-div[size]+area)*velocity}}if(delta){value=(ul[axis]-div[pos]+delta).limit(this.retrieve("limit"),0);
                                                                    tween.set(value)}}}.bind(thumbnails),
                                                        update:function(fast){var thumbnails=this.slideshow.retrieve("thumbnails");
                                                            thumbnails.getElements("a").each(function(a,i){if(i==this.slide){if(!a.retrieve("active",false)){a.store("active",true);
                                                                        var active=this.classes.get("thumbnails","active");
                                                                        if(fast){a.get("morph").set(active)}else{a.morph(active)}}}else{if(a.retrieve("active",true)){a.store("active",false);
                                                                        var inactive=this.classes.get("thumbnails","inactive");
                                                                        if(fast){a.get("morph").set(inactive)}else{a.morph(inactive)}}}},this);
                                                            if(!thumbnails.retrieve("mouseover")){thumbnails.fireEvent("scroll",[this.slide,fast])}}.bind(this)});
                                                    var div=thumbnails.getCoordinates();
                                                    thumbnails.store("props",(div.height>div.width)?["top","bottom","height","y"]:["left","right","width","x"]);
                                                    var mousemove=function(e){var div=this.getCoordinates();if(e.page.x>div.left&&e.page.x<div.right&&e.page.y>div.top&&e.page.y<div.bottom){this.store("page",e.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(thumbnails);
                                                    this.events.mousemove.push(mousemove);
                                                    document.addEvent("mousemove",mousemove);
                                                    this.slideshow.store("thumbnails",thumbnails)}});


