/*
---
name: FlexSlider
script: flexslider.js
license: Commercial License - Do NOT reproduce without consentement.
description: Create a multi layers easily configurable slideShow to make great presentation
copyright: Copyright (c) 2010, Joffrey Gohin <gohin.j@gmail.com>, FreeLance Web Developper - http://www.agence-flex.com/
authors: [Joffrey Gohin]

requires: [Core/Class.Extras, Core/Element.Event, Core/Element.Style, Core/Fx.Tween]

provides: [Effect, FlexSlider, AnimatedDiv, LoaderLayer]
...
*/
if(!Asset)var Asset={image:function(a,b){if(!b)b={};var c=new Image,d=document.id(c)||new Element("img");["load","abort","error"].each(function(a){var e="on"+a,f="on"+a.capitalize(),g=b[e]||b[f]||function(){};delete b[f];delete b[e];c[e]=function(){if(!c)return;if(!d.parentNode){d.width=c.width;d.height=c.height}c=c.onload=c.onabort=c.onerror=null;g.delay(1,d,d);d.fireEvent(a,d,1)}});c.src=d.src=a;if(c&&c.complete)c.onload.delay(1);return d.set(b)},images:function(a,b){a=Array.from(a);var c=function(){},d=0;b=Object.merge({onComplete:c,onProgress:c,onError:c,properties:{}},b);return new Elements(a.map(function(c,e){return Asset.image(c,Object.append(b.properties,{onload:function(){d++;b.onProgress.call(this,d,e,c);if(d==a.length)b.onComplete()},onerror:function(){d++;b.onError.call(this,d,e,c);if(d==a.length)b.onComplete()}}))}))}};var Effect=new Class({Implements:Events,fx:null,div:null,dir:1,fn:null,where:null,initialize:function(){},animate:function(){},initFrame:function(){},clearTimers:function(){}}),FlexTween=new Class({Extends:Fx.Tween,initialize:function(){}}),None=new Class({Extends:Effect,animate:function(){this.fireEvent("Effect.complete")}}),Slide=new Class({Extends:Effect,initialize:function(a){var b=this;this.div=a.div;this.width=a.w;this.where=a.div.get("prop")?a.div.get("prop"):"left";this.div.store("old"+this.where,this.getOldStyles(a.div));this.fx=new Fx.Tween(this.div,{duration:this.div.get("time")?this.div.get("time"):1e3,onComplete:function(){b.fireEvent("Effect.complete")}});this.fn=function(){this.fx.start(this.where,this.width*this.dir,this.getInitPos())}.bind(this);this.initFrame()},clearTimers:function(){clearTimeout(this.delay)},getOldStyles:function(a){var b=a.getStyles(this.where),c={};if(b)return b;c[this.where]="0px";return c},getInitPos:function(){var a=this.div.retrieve("old"+this.where);try{switch(this.where){case"left":a=a.left;break;case"right":a=a.right;break;case"top":a=a.top;break;case"bottom":a=a.bottom;break}}catch(b){return"0px"}if(a=="auto")a="0px";return a},initFrame:function(){this.fx.stop();this.div.setStyle("visibility","hidden");this.div.setStyle(this.where,-this.width*-this.dir+"px")},animate:function(){this.initFrame();this.div.setStyle("visibility","visible");this.delay=this.fn.delay(this.div.get("delay"))}}),Fade=new Class({Extends:Effect,initialize:function(a){this.div=a.div;this.div.store("old-opacity",a.div.getStyles("opacity"));var b=this;this.fx=new Fx.Tween.CSS3(this.div,{duration:this.div.get("time")?this.div.get("time"):1e3,onComplete:function(){b.fireEvent("Effect.complete")}});this.fn=function(){b.fx.start("opacity",0,b.div.retrieve("old-opacity").opacity)};this.initFrame()},clearTimers:function(){clearTimeout(this.delay)},initFrame:function(){this.fx.stop();this.div.setStyle("opacity",0)},animate:function(){this.initFrame();this.delay=this.fn.delay(this.div.get("delay"))}}),EffectFactory=new Class({initialize:function(){},create:function(a,b){switch(a){case"fade":return new Fade(b);break;case"slide":return new Slide(b);break}return new None(b)}});var effectFactory=new EffectFactory;var AnimatedDiv=new Class({Implements:Events,els:null,fxs:[],width:null,current:0,dir:-1,initialize:function(a){this.els=a.el;this.child=this.els.children.length;this.width=a.width;var b=this;a.el.getChildren().each(function(a,c){a=new Element(a);b.fxs.push(effectFactory.create(a.get("effect"),{w:b.width,div:a}));b.fxs[c].addEvent("Effect.complete",function(){b.onEffectFinish()}.bind(b))})},initFrame:function(){this.current=0;this.fxs.each(function(a){a.clearTimers();a.initFrame()})},animate:function(){var a=this.dir;this.fxs.each(function(b,c){b.animate(a)})},toElement:function(){return $(this.els)},onEffectFinish:function(){this.current++;if(this.current==this.els.children.length){this.fireEvent("Animated.finish");this.current=0}}}),LoaderLayer=new Class({fg:null,bg:null,main:null,initialize:function(a){this.bg=new Element("div",{id:"__fxslider_bg_loader"});this.fg=new Element("div",{id:"__fxslider_fg_loader"});this.fg.adopt(new Element("img",{src:"images/flexslider_fg.png",styles:{position:"absolute"}}));this.fg.adopt(this.bg);this.main=a;this.fg.inject(this.main,"top")},to:function(a){this.bg.set("tween",{duration:200}).morph({width:(this.fg.getStyle("width").replace("px","").replace("%","")*(a/100)).toInt()})},destroy:function(){this.fg.dispose()}}),FlexSlider=new Class({Implements:Events,rotator:[],buttons:[],options:{},fx:null,current:0,lastClicked:null,delay:1e4,fdelay:null,pause:false,finishedPlaying:true,play:null,timeout:5e3,width:0,childs:0,next:0,dragEvent:{click:false,oldX:0,ok:true,last:false},initialize:function(a){if(!a.divs)throw"Cannot instantiate FlexSlider, need div";this.options=a;this.load(a.divs)},load:function(a){var b=[],c=this,d=new LoaderLayer(a),e=a.getElements("img");e.each(function(a){b.push(a.get("src"));a.store("src",a.get("src"));a.set("src","")});new Asset.images(b,{onProgress:function(a,c){d.to((a+1)*(100/b.length));e[c].set("src",e[c].retrieve("src"))},onComplete:function(){d.destroy();c.build();c.firstRun()}})},build:function(){var a=[],b,c,d,e=this,f=this.options;f.divs.getElements(".rotator").each(function(c){c=Browser.ie?new Element(c):c;d=f.width?f.width:c.getSize().x;b=new AnimatedDiv({el:c,width:d});b.addEvent("Animated.finish",function(){e.resetDelay();e.finishedPlaying=true});this.rotator.push(b);a.include(c.getParent())}.bind(this));c=d*this.rotator.length/a.length;a.each(function(a){e.setEvents(a);a.setStyle("width",c);this.fx=new Fx.Tween(a,{duration:1e3})}.bind(this));this.childs=a[0].children.length;this.width=d;if(f.controls)this.controls(f.controls);this.play=function(){this.autoPlay()}.bind(this)},tracef:function(a){$("debug").innerHTML=a},setEvents:function(a){var b=this;a.getElements("img").addEvent("click",function(a){a.preventDefault()});if(Browser.ie7||Browser.ie8){a.ondragstart=function(){return false}}a.addEvents({mousedown:function(a){a.preventDefault();b.clearFrame();b.dragEvent.oldX=a.page.x;b.dragEvent.click=true;b.dragEvent.last=a.page.x},mousemove:function(c){if(b.dragEvent.click&&b.dragEvent.ok){var d=c.page.x-b.dragEvent.oldX;a.setStyle("left",-(b.current*b.width)+d)}},mouseup:function(a){if(b.dragEvent.ok)b.onDragComplete(a);b.dragEvent.click=false},mouseover:function(){b.pauseSlide()},mouseleave:function(){if(b.finishPlaying)b.resetDelay();else b.unPause();b.dragEvent.click=false},touchstart:function(a){a.preventDefault();b.clearFrame();b.dragEvent.oldX=a.touches[0].pageX;b.pauseSlide()},touchmove:function(c){c.preventDefault();b.pauseSlide();if(c.touches.length==1){c=c.touches[0];var d=c.pageX-b.dragEvent.oldX;b.dragEvent.last=c.pageX;a.setStyle("left",-(b.current*b.width)+d)}},touchend:function(a){b.onDragComplete(a,true)}})},onDragComplete:function(a){var b=0,c=0,d=null,e,f=false;try{d=this.dragEvent.click?a.page.x:this.dragEvent.last;e=this.dragEvent.oldX}catch(a){}b=-(this.current*this.width)+d-this.dragEvent.oldX;if(e-d>40)c=this.current+1<this.getMaxChilds()?this.current+1:this.current;else if(e-d<-40)c=this.current-1>0?this.current-1:0;else{c=this.current}f=this.slideTo(c);c=this.next*this.width*-1;this.slide(b,c,f)},nextSlideDelay:function(){var a=null;if(this.current>0)a=this.rotator[this.current].toElement().get("time");else a=this.rotator[0].toElement().get("time");if(!a)a=this.delay;return a},firstRun:function(){this.current=-1;this.run(0);this.setActive(this.buttons[0])},run:function(a){var b;b=this.current*this.width*-1;this.slideTo(a);a=this.next*this.width*-1;this.slide(b,a,false)},clearFrame:function(){if(this.current-1>=0)this.rotator[this.current-1].initFrame();if(this.current+1<this.getMaxChilds())this.rotator[this.current+1].initFrame()},slideTo:function(a){if(this.current==a)return true;this.next=a%this.getMaxChilds();if(this.current==this.next)return true;this._pause();this.setActive(this.buttons[this.next]);this.rotator[this.next].initFrame();this.rotator[this.next].dir=this.next-this.current>0?1:-1;this.current=this.next;return false},slide:function(a,b,c){var d=this;this.dragEvent.ok=false;this.fx.start("left",a,b+"px").chain(function(){if(d.current!=d.next)d.current=d.next;d.unPause();d.dragEvent.ok=true;if(!c){d.rotator[d.current].animate()}d.setActive(d.buttons[d.current])})},setActive:function(a){try{if(!a)a=this.buttons[0];if(this.lastClicked)this.lastClicked.removeClass("active");this.lastClicked=a;a.addClass("active")}catch(b){}},getMaxChilds:function(){return this.childs-1},controls:function(a){var b,c=this;for(var d=0,e=this.getMaxChilds();d<e;d++){b=new Element("a",{"class":"_flex_button",rel:d,href:"#slider_page"+(d+1),html:"",events:{click:function(){if(!c.pause){c.delaySlide();c.run(this.get("rel"))}}}});a.adopt(b);this.buttons.push(b)}b=new Element("a",{"class":"prev"+(Browser.ie7?" IE7":""),href:"#slider_page"+(d+1),html:"<",events:{click:function(){if(!c.pause){c.delaySlide();c.playPrevious()}}}});a.adopt(b);b=new Element("a",{"class":"next"+(Browser.ie7?" IE7":""),href:"#slider_page"+(d+1),html:">",events:{click:function(){if(!c.pause){c.delaySlide();c.playNext()}}}});a.adopt(b)},disallowDrag:function(){this.dragEvent.ok=false},allowDrag:function(){this.dragEvent.ok=true},addSlide:function(a){},autoPlay:function(){this.run(this.current+1)},delaySlide:function(){clearTimeout(this.fdelay);this.fdelay=this.play.delay(this.delay)},_pause:function(){this.finishedPlaying=true;this.pause=true},unPause:function(){this.pause=false},pauseSlide:function(){this._pause();clearTimeout(this.fdelay)},playNext:function(){this.autoPlay()},playPrevious:function(){this.run(this.current-1)},resetDelay:function(){clearTimeout(this.fdelay);this.fdelay=this.play.delay(this.nextSlideDelay());return 1}})
