
var MooFlow=new Class({Implements:[Events,Options],options:{onStart:$empty,onClickView:$empty,onAutoPlay:$empty,onAutoStop:$empty,onRequest:$empty,onResized:$empty,onEmptyinit:$empty,reflection:0.4,heightRatio:0.6,offsetY:0,startIndex:0,interval:3000,factor:115,bgColor:'#fff',useCaption:false,useResize:false,useSlider:false,useWindowResize:false,useMouseWheel:true,useKeyInput:false,useViewer:false},initialize:function(element,options){this.MooFlow=element;this.setOptions(options);this.foc=150;this.factor=this.options.factor;this.offY=this.options.offsetY;this.isFull=false;this.isAutoPlay=false;this.isLoading=false;this.inMotion=false;this.MooFlow.addClass('mf').setStyles({'overflow':'hidden','background-color':this.options.bgColor,'position':'relative','height':this.MooFlow.getSize().x*this.options.heightRatio,'opacity':0});if(this.options.useWindowResize)window.addEvent('resize',this.update.bind(this,'init'));if(this.options.useMouseWheel||this.options.useSlider)this.MooFlow.addEvent('mousewheel',this.wheelTo.bind(this));if(this.options.useKeyInput)document.addEvent('keydown',this.keyTo.bind(this));this.getElements(this.MooFlow);},clearInit:function(){this.fireEvent('emptyinit');},getElements:function(el){this.master={'images':[]};var els=el.getChildren();if(!els.length){this.clearInit();return;}
$$(els).each(function(el){var hash=$H(el.getElement('img').getProperties('src','title','alt','longdesc'));if(el.get('tag')=='a')hash.combine(el.getProperties('href','rel','target'));this.master['images'].push(hash.getClean());el.dispose();},this);this.clearMain();},clearMain:function(){if(this.cap){this.cap.fade(0);}
if(this.nav){new Fx.Tween(this.nav,{'onComplete':function(){this.MooFlow.empty();this.createAniObj();}.bind(this)}).start('bottom',-50);}
if(!this.nav&&!this.cap){this.MooFlow.empty();this.createAniObj();}},getMooFlowElements:function(key){var els=[];this.master.images.each(function(el){els.push(el[key]);});return els;},createAniObj:function(){this.aniFx=new Fx.Value({'transition':Fx.Transitions.Expo.easeOut,'link':'cancel','duration':750,onMotion:this.process.bind(this),'onStart':this.flowStart.bind(this),'onComplete':this.flowComplete.bind(this)});this.addLoader();},addLoader:function(){this.MooFlow.store('height',this.MooFlow.getSize().y);this.loader=new Element('div',{'class':'loader'}).inject(this.MooFlow);new Fx.Tween(this.MooFlow,{'duration':800,'onComplete':this.preloadImg.bind(this)}).start('opacity',1);},preloadImg:function(){this.loadedImages=new Asset.images(this.getMooFlowElements('src'),{'onComplete':this.loaded.bind(this),'onProgress':this.createMooFlowElement.bind(this)});},createMooFlowElement:function(counter,i){var obj=this.getCurrent(i);var img=this.loadedImages[i];obj['width']=img.width;obj['height']=img.height;img.removeProperties('width','height');obj['div']=new Element('div').setStyles({'position':'absolute','display':'none','height':this.MooFlow.getSize().y}).inject(this.MooFlow);obj['con']=new Element('div').inject(obj['div']);img.setStyles({'vertical-align':'bottom','width':'100%','height':'50%'});img.addEvents({'click':this.clickTo.bind(this,i),'dblclick':this.viewCallBack.bind(this,i)});img.inject(obj['con']);new Element('div').reflect({'img':img,'ref':this.options.reflection,'height':obj.height,'width':obj.width,'color':this.options.bgColor}).setStyles({'width':'100%','height':'50%','background-color':this.options.bgColor}).inject(obj['con']);this.loader.set('text',(counter+1)+' / '+this.loadedImages.length);},loaded:function(){this.index=this.options.startIndex;this.iL=this.master.images.length-1;new Fx.Tween(this.loader,{'duration':800,'onComplete':this.createUI.bind(this)}).start('opacity',0);},createUI:function(){this.loader.dispose();if(this.options.useCaption){this.cap=new Element('div').addClass('caption').set('opacity',0).inject(this.MooFlow);}
this.nav=new Element('div').addClass('mfNav').setStyle('bottom','-50px');this.autoPlayCon=new Element('div').addClass('autoPlayCon');this.sliderCon=new Element('div').addClass('sliderCon');this.resizeCon=new Element('div').addClass('resizeCon');if(this.options.useAutoPlay){this.autoPlayCon.adopt(new Element('a',{'class':'stop','events':{'click':this.stop.bind(this)}}),new Element('a',{'class':'play','events':{'click':this.play.bind(this)}}));}
if(this.options.useSlider){this.sliPrev=new Element('a',{'class':'sliderNext','events':{'click':this.prev.bind(this)}});this.sliNext=new Element('a',{'class':'sliderPrev','events':{'click':this.next.bind(this)}});this.knob=new Element('div',{'class':'knob'});this.knob.adopt(new Element('div',{'class':'knobleft'}));this.slider=new Element('div',{'class':'slider'}).adopt(this.knob);this.sliderCon.adopt(this.sliPrev,this.slider,this.sliNext);this.slider.store('parentWidth',this.sliderCon.getSize().x-this.sliPrev.getSize().x-this.sliNext.getSize().x);}
if(this.options.useResize){this.resizeCon.adopt(new Element('a',{'class':'resize','events':{'click':this.setScreen.bind(this)}}));}
this.MooFlow.adopt(this.nav.adopt(this.autoPlayCon,this.sliderCon,this.resizeCon));this.showUI();},showUI:function(){if(this.cap)this.cap.fade(1);this.nav.tween('bottom',20);this.fireEvent('start');this.update();},update:function(e){if(e=='init')return;this.oW=this.MooFlow.getSize().x;this.sz=this.oW*0.5;if(this.options.useSlider){this.slider.setStyle('width',this.slider.getParent().getSize().x-this.sliPrev.getSize().x-this.sliNext.getSize().x-1);this.knob.setStyle('width',(this.slider.getSize().x/this.iL));this.sli=new SliderEx(this.slider,this.knob,{steps:this.iL}).set(this.index);this.sli.addEvent('onChange',this.glideTo.bind(this));}
this.glideTo(this.index);this.isLoading=false;},setScreen:function(){if(this.isFull=!this.isFull){this.holder=new Element('div').inject(this.MooFlow,'after');this.MooFlow.wraps(new Element('div').inject(document.body));this.MooFlow.setStyles({'position':'absolute','z-index':'100','top':'0','left':'0','width':window.getSize().x,'height':window.getSize().y});if(this.options.useWindowResize){this._initResize=this.initResize.bind(this);window.addEvent('resize',this._initResize);}}else{this.MooFlow.wraps(this.holder);window.removeEvent('resize',this._initResize);delete this.holder,this._initResize;this.MooFlow.setStyles({'position':'relative','z-index':'','top':'','left':'','width':'','height':this.MooFlow.retrieve('height')});this.slider.setStyle('width',this.slider.retrieve('parentWidth'));}
this.fireEvent('resized',this.isFull);this.update();},initResize:function(){this.MooFlow.setStyles({'width':window.getSize().x,'height':window.getSize().y});this.update();},getCurrent:function(index){return this.master.images[$chk(index)?index:this.index];},loadJSON:function(url){if(!url||this.isLoading)return;this.isLoading=true;new Request.JSON({'onComplete':function(data){if($chk(data)){this.master=data;this.clearMain();this.fireEvent('request',data);}}.bind(this)},this).get(url);},loadHTML:function(url,filter){if(!url||!filter||this.isLoading)return;this.isLoading=true;new Request.HTML({'onSuccess':function(tree,els,htm){var result=new Element('div',{'html':htm}).getChildren(filter);this.getElements(result);this.fireEvent('request',result);}.bind(this)},this).get(url);},flowStart:function(){this.inMotion=true;},flowComplete:function(){this.inMotion=false;},viewCallBack:function(index){if(this.index!=index||this.inMotion)return;var el=$H(this.getCurrent());var returnObj={};returnObj['coords']=el.div.getElement('img').getCoordinates();el.each(function(v,k){if($type(v)=='number'||$type(v)=='string')returnObj[k]=v;},this);this.fireEvent('clickView',returnObj);},prev:function(){if(this.index>0)this.clickTo(this.index-1);},next:function(){if(this.index<this.iL)this.clickTo(this.index+1);},stop:function(){$clear(this.autoPlay);this.isAutoPlay=false;this.fireEvent('autoStop');},play:function(){this.autoPlay=this.auto.periodical(this.options.interval,this);this.isAutoPlay=true;this.fireEvent('autoPlay');},auto:function(){if(this.index<this.iL)this.next();else if(this.index==this.iL)this.clickTo(0);},keyTo:function(e){switch(e.code){case 37:e.stop();this.prev();break;case 39:e.stop();this.next();}},wheelTo:function(e){if(e.wheel>0)this.prev();if(e.wheel<0)this.next();e.stop().preventDefault();},clickTo:function(index){if(this.index==index)return;if(this.sli)this.sli.set(index);this.glideTo(index);},glideTo:function(index){this.index=index;this.aniFx.start(this.aniFx.get(),index*-this.foc);if(this.cap)this.cap.set('html',this.getCurrent().title);},process:function(x){var z,W,H,zI=this.iL,foc=this.foc,f=this.factor,sz=this.sz,oW=this.oW,offY=this.offY,div,elh,elw;this.master.images.each(function(el){div=el.div.style;elw=el.width;elh=el.height;if(x>-foc*6&&x<foc*6){with(Math){z=sqrt(10000+x*x)+100;H=round((elh/elw*f)/z*sz);W=round(elw*H/elh);if(H>=elw*0.5){W=round(f/z*sz);}
div.left=round(((x/z*sz)+sz)-(f*0.5)/z*sz)+'px';div.top=round(oW*0.4-H)+offY+'px';}
el.con.style.height=H*2+'px';div.width=W+'px';div.zIndex=x<0?zI++:zI--;div.display='block';}else{div.display='none';}
x+=foc;});}});var SliderEx=new Class({Extends:Slider,set:function(step){this.step=Math.round(step);this.fireEvent('tick',this.toPosition(this.step));return this;},clickedElement:function(event){var dir=this.range<0?-1:1;var position=event.page[this.axis]-this.element.getPosition()[this.axis]-this.half;position=position.limit(-this.options.offset,this.full-this.options.offset);this.step=Math.round(this.min+dir*this.toStep(position));this.checkStep();this.fireEvent('tick',position);}});Fx.Value=new Class({Extends:Fx,compute:function(from,to,delta){this.value=Fx.compute(from,to,delta);this.fireEvent('motion',this.value);return this.value;},get:function(){return this.value||0;}});Element.implement({reflect:function(arg){var i=arg.img.clone().set('src',arg.img.src);if(Browser.Engine.trident){i.style.filter='flipv progid:DXImageTransform.Microsoft.Alpha(opacity=20, style=1, finishOpacity=0, startx=0, starty=0, finishx=0, finishy='+100*arg.ref+')';i.setStyles({'width':'100%','height':'100%'});return new Element('div').adopt(i);}else{var can=new Element('canvas').setProperties({'width':arg.width,'height':arg.height});if(can.getContext){var ctx=can.getContext("2d");ctx.save();ctx.translate(0,arg.height-1);ctx.scale(1,-1);ctx.drawImage(i,0,0,arg.width,arg.height);ctx.restore();ctx.globalCompositeOperation="destination-out";ctx.fillStyle=arg.color;ctx.fillRect(0,arg.height*0.5,arg.width,arg.height);var gra=ctx.createLinearGradient(0,0,0,arg.height*arg.ref);gra.addColorStop(1,"rgba(255, 255, 255, 1.0)");gra.addColorStop(0,"rgba(255, 255, 255, "+(1-arg.ref)+")");ctx.fillStyle=gra;ctx.rect(0,0,arg.width,arg.height);ctx.fill();delete ctx,gra;}
return can;}}});

MooFlow.implement({attachViewer:function(){return this;},flowStart:function(){this.hideIcon();},flowComplete:function(){this.createIconTip();},createIconTip:function(){var cur=this.getCurrent();if(!$chk(cur.rel)||!$chk(cur.href))return;this.tipFx=new Fx({link:'cancel'});if(!$chk(this.icon)){this.icon=new Element('a').addClass('show').setStyles({'display':'none','opacity':'0'}).inject(this.MooFlow);}
this.icon.addEvent('click',this.onClickView.bind(this,cur));if($chk(cur.alt)){console.log(cur.alt);this.icon.addEvent('mouseenter',this.showTip.bind(this,cur));this.icon.addEvent('mouseleave',this.hideTip.bind(this,cur));}
if(!$chk(this.tip)){this.tip=new Element('div').addClass('tooltip').setStyles({'display':'none','opacity':'0'}).inject(this.MooFlow);}
this.tip.set('html',cur.alt);this.icon.addClass(cur.rel.toLowerCase());this.icon.setStyle('display','block').fade(0.6);},showTip:function(cur){this.tip.setStyles({'top':100,'display':'block'});this.tipFx=new Fx.Morph(this.tip,{link:'cancel'}).start({'opacity':0.8,'top':this.icon.getCoordinates().top-this.tip.getSize().y-100});},hideTip:function(cur){this.tipFx.start({'opacity':0,'top':100});},hideIcon:function(){if($chk(this.icon)&&$chk(this.icon.getParent()))this.icon.destroy();if($chk(this.tip)&&$chk(this.tip.getParent()))this.tip.destroy();this.icon=this.tip=null;},onClickView:function(cur){switch(cur.rel.toLowerCase()){case'image':this.loadImage(cur);break;case'link':window.open(cur.href,cur.target||'_blank');break;default:}},loadImage:function(cur){this.icon.removeClass('image').addClass('viewerload');this.image=new Asset.image(cur.href,{onload:this.showImage.bind(this)});},showImage:function(){var cur=this.getCurrent();var c=cur.con.getFirst().getCoordinates();this.image.inject(document.body);this.image.addEvent('click',this.hideImage.bind(this));this.image.setStyles({'left':c.left,'top':c.top,'width':c.width,'height':c.height,'position':'absolute','z-index':'10003'});var imageFx=new Fx.Morph(this.image,{transition:Fx.Transitions.Sine.easeOut});var to={x:this.image.get('width'),y:this.image.get('height')};var box=document.getSize(),scroll=document.getScroll();var pos={x:scroll.x+((box.x-to.x)/2).toInt(),y:scroll.y+((box.y-to.y)/2).toInt()};var vars={left:pos.x,top:pos.y,width:to.x,height:to.y};imageFx.start(vars);},hideImage:function(){this.icon.removeClass('viewerload').addClass('image');this.image.dispose();}});

