var Zoom=new Class({Implements:[Events,Options,Chain],options:{link:null,type:"image",container:null,className:null,centered:false,dragging:true,closeOnClick:true,shadow:(Browser.Engine.trident)?"onOpenEnd":"onOpen",resize:true,margin:20,resizeFactor:0.95,resizeLimit:false,fixedSize:false,cutOut:true,addClick:true,opacityLoad:0.6,opacityResize:1,opacityTitle:0.9,resizeOptions:{},fxOptions:{},closer:true,parse:false,parseSecure:false,temporary:false,onBuild:$empty,onLoad:$empty,onOpen:$empty,onOpenEnd:$empty,onClose:$empty,onCloseEnd:$empty,generateTitle:function(B){var D=B.get("title");if(!D){return false}var C=D.split(" :: ");var A=new Element("h6",{html:C[0]});return(C[1])?[A,new Element("p",{html:C[1]})]:A}},initialize:function(C,B){this.element=$(C);this.setOptions(B);if(this.options.parse){var D=this.element.getProperty(this.options.parse);if(D&&(D=JSON.decode(D,this.options.parseSecure))){this.setOptions(D)}}var A=this.options.origin;this.origin=((A)?$(A)||this.element.getElement(A):null)||this.element;this.link=this.options.link||this.element.get("href")||this.element.get("src");this.container=$(this.options.container)||this.element.getDocument();this.bound={click:function(E){this.open.delay(1,this);return false}.bind(this),close:this.close.bind(this),dragClose:function(E){if(E.rightClick){return }this.close()}.bind(this)};if(this.options.addClick){this.bindToElement()}},destroy:function(){if(this.box){this.box.destroy()}this.box=this.tweens=this.body=this.content=null},bindToElement:function(A){($(A)||this.element).addClass("zoom-element").addEvent("click",this.bound.click);return this},getOriginCoordinates:function(){var A=this.origin.getCoordinates();delete A.right;delete A.bottom;return A},open:function(A){if(this.opened){return(A)?this.close():this}this.opened=this.loading=true;if(!this.box){this.build()}this.coords=this.getOriginCoordinates();this.coords.opacity=this.options.opacityLoad;this.coords.display="";this.tweens.box.set(this.coords);this.box.addClass("zoom-loading");Zoom.open(this.fireEvent("onLoad"));this["open"+this.options.type.capitalize()]();return this},finishOpen:function(){this.tweens.fade.start(0,1);this.drag.attach();this.fireEvent("onOpenEnd").callChain()},close:function(){if(!this.opened){return this}this.opened=false;Zoom.close(this.fireEvent("onClose"));if(this.loading){this.box.setStyle("display","none");return this}this.drag.detach();this.tweens.fade.cancel().set(0).fireEvent("onComplete");if(this.tweens.box.timer){this.tweens.box.clearChain()}var A=this.getOriginCoordinates();if(this.options.opacityResize!=1){A.opacity=this.options.opacityResize}this.tweens.box.start(A).chain(this.closeEnd.bind(this));return this},closeEnd:function(){if(this.options.cutOut){this.element.setStyle("visibility","visible")}this.box.setStyle("display","none");this.fireEvent("onCloseEnd").callChain();if(this.options.temporary){this.destroy()}},openImage:function(){var A=new Image();A.onload=A.onabort=A.onerror=function(B){this.loading=A.onload=A.onabort=A.onerror=null;if(!A.width||!this.opened){this.fireEvent("onError").close();return }var C={x:A.width,y:A.height};if(!this.content){this.content=$(A).inject(this.body)}else{A=null}this[(this.options.resize)?"zoomRelativeTo":"zoomTo"].create({delay:(A&&B!==true)?1:null,"arguments":[C],bind:this})()}.bind(this);A.src=this.link;if(A&&A.complete&&A.onload){A.onload(true)}},openElement:function(){this.content=this.content||$(this.link)||$E(this.link);if(!this.content){this.fireEvent("onError").close();return }this.content.inject(this.body);this.zoomTo({x:this.content.scrollWidth,y:this.content.scrollHeight})},zoomRelativeTo:function(C){var B=this.options.resizeLimit;if(!B){B=this.container.getSize();B.x*=this.options.resizeFactor;B.y*=this.options.resizeFactor}for(var A=2;A--;){if(C.x>B.x){C.y*=B.x/C.x;C.x=B.x}else{if(C.y>B.y){C.x*=B.y/C.y;C.y=B.y}}}return this.zoomTo({x:C.x.toInt(),y:C.y.toInt()})},zoomTo:function(E){E=this.options.fixedSize||E;var B=this.container.getSize(),A=this.container.getScroll();var D=(!this.options.centered)?{x:(this.coords.left+(this.coords.width/2)-E.x/2).toInt().limit(A.x+this.options.margin,A.x+B.x-this.options.margin-E.x),y:(this.coords.top+(this.coords.height/2)-E.y/2).toInt().limit(A.y+this.options.margin,A.y+B.y-this.options.margin-E.y)}:{x:A.x+((B.x-E.x)/2).toInt(),y:A.y+((B.y-E.y)/2).toInt()};if(this.options.cutOut){this.element.setStyle("visibility","hidden")}this.box.removeClass("zoom-loading");var C={left:D.x,top:D.y,width:E.x,height:E.y};if(this.options.opacityResize!=1){C.opacity=[this.options.opacityResize,1]}else{this.box.set("opacity",1)}this.tweens.box.start(C).chain(this.finishOpen.bind(this));this.fireEvent("onOpen")},build:function(){this.addEvent("onBlur",function(){this.focused=false;this.box.removeClass("zoom-box-focus").setStyle("z-index",Zoom.options.zIndex)},true);this.addEvent("onFocus",function(){this.focused=true;this.box.addClass("zoom-box-focus").setStyle("z-index",Zoom.options.zIndexFocus)},true);var A=["zoom-box","zoom-type-"+this.options.type,"zoom-engine-"+Browser.Engine.name+Browser.Engine.version];if(this.options.className){A.push(this.options.className)}this.box=new Element("div",{"class":A.join(" "),styles:{display:"none",top:0,left:0,zIndex:Zoom.options.zIndex}});this.tweens={box:new Fx.Morph(this.box,$merge({duration:400,unit:"px",transition:Fx.Transitions.Quart.easeOut,chain:"cancel"},this.options.resizeOptions)),fade:new Fx.Tween(null,$merge({property:"opacity",duration:(Browser.Engine.trident)?0:300,chain:"cancel"},this.options.fxOptions)).addEvents({onComplete:function(){if(!this.element.get("opacity")){this.element.setStyle("display","none")}},onStart:function(){if(!this.element.get("opacity")){this.element.setStyle("display","")}}})};this.tweens.fade.element=$$();if(this.options.shadow){if(Browser.Engine.webkit420){this.box.setStyle("-webkit-box-shadow","0 0 10px rgba(0, 0, 0, 0.7)")}else{if(!Browser.Engine.trident4){var D=new Element("div",{"class":"zoom-bg-wrap"}).inject(this.box);["n","ne","e","se","s","sw","w","nw"].each(function(E){new Element("div",{"class":"zoom-bg zoom-bg-"+E}).inject(D)});this.tweens.bg=new Fx.Tween(D,{property:"opacity",chain:"cancel"}).set(0);this.addEvent(this.options.shadow,this.tweens.bg.set.bind(this.tweens.bg,1),true);this.addEvent("onClose",this.tweens.bg.set.bind(this.tweens.bg,0),true)}}}if(this.options.closer){var C=new Element("a",{"class":"zoom-btn-close",events:{click:this.bound.close}}).inject(this.box);this.tweens.fade.element.push(C)}this.body=new Element("div",{"class":"zoom-body"}).inject(this.box);var B=this.options.title||this.options.generateTitle.call(this,this.element);if(B){var B=new Element("div",{"class":"zoom-title"}).adopt(new Element("div",{"class":"zoom-title-bg",opacity:this.options.opacityTitle}),new Element("div",{"class":"zoom-title-content"}).adopt(B)).inject(this.box);this.tweens.fade.element.push(B)}this.tweens.fade.set(0).fireEvent("onComplete");this.drag=new Drag.Move(this.box,{snap:15,preventDefault:true,onBeforeStart:function(){if(!this.focused&&!this.loading){Zoom.focus(this)}else{if(this.loading||this.options.closeOnClick){this.box.addEvent("mouseup",this.bound.dragClose)}}}.bind(this),onSnap:function(){this.box.removeEvent("mouseup",this.bound.dragClose);if(!this.options.dragging){this.drag.stop()}else{this.box.addClass("zoom-box-dragging")}}.bind(this),onComplete:function(){this.box.removeClass("zoom-box-dragging")}.bind(this)});this.drag.detach();this.fireEvent("onBuild",this.box,this.element);this.box.inject(this.element.getDocument().body)}});Zoom.factory=function(A){return $extend(this,A)};Zoom.factory(new Options).factory({options:{zIndex:41,zIndexFocus:42,query:"a.zoom",modal:false},assign:function(B,A){return $$(B).map(function(C){return new Zoom(C,A)},this)},stack:[],open:function(B){var A=this.stack.getLast();this.focus(B);if(A&&this.options.modal){A.close()}},close:function(B){var A=this.stack.length-1;if(A>1&&this.stack[A]==B){this.focus(this.stack[A-1])}this.stack.erase(B)},focus:function(B){var A=this.stack.getLast();B.fireEvent("onFocus",[B]);if(A==B){return }if(A){A.fireEvent("onBlur",[A])}this.stack.erase(B).push(B)}});window.addEvent("domready",function(){$$("#gallery a").each(function(A){new Zoom(A,{origin:"img",shadow:"onOpenEnd",resizeFactor:0.8,opacityResize:0.4})})});