
XtLightbox=new Class({Implements:[Options,Events],options:{adaptors:['Image'],adaptorOptions:{},renderer:'Lightbox',rendererOptions:{},preload:false,incrementalPreLoad:3,loop:false,closeKeys:['esc'],nextKeys:['right','space'],prevKeys:['left']},initialize:function(elements,options){this.setOptions(options);this.loadAdaptors();this.loadRenderer();var self=this;this.onElementClick=function(e){e.preventDefault();self.show(this);};this.onKeyPress=function(e){if(self.shown){if(self.options.closeKeys.contains(e.key)){e.stop();self.hide();}else if(self.options.prevKeys.contains(e.key)){e.stop();self.previous();}else if(self.options.nextKeys.contains(e.key)){e.stop();self.next();}}};$(document).addEvents({'keydown':this.onKeyPress,'keypress':this.onKeyPress});this.attach(elements);},loadAdaptors:function(){if(this.adaptors&&this.adaptors.length>0)return this;var adaptors=this.options.adaptors||['Image'];this.adaptors={};var valid=[];adaptors.each(function(name){if(!XtLightbox.Adaptor[name])return null;var options={};if(this.options.adaptorOptions&&this.options.adaptorOptions[name])options=this.options.adaptorOptions[name];var a=new XtLightbox.Adaptor[name](options);this.adaptors[name]=a;valid.push(a.$name);},this);this.options.adaptors=valid;return this;},loadRenderer:function(){var name=this.options.renderer;if(!name||!XtLightbox.Renderer[name])name='Lightbox';this.renderer=new XtLightbox.Renderer[name](this.options.rendererOptions);this.renderer.addEvents({next:this.next.bind(this),previous:this.previous.bind(this),close:this.hide.bind(this)});return this;},attach:function(elements){if(!instanceOf(elements,Elements))elements=$$(elements);var i,l,a,n,e=new Elements;elements.each(function(el){if(el.$xtlightbox&&el.$xtlightbox.adaptor)return null;for(i=0,l=this.options.adaptors.length;i<l;i++){n=this.options.adaptors[i];a=this.adaptors[n];if(a.check(el)){el.$xtlightbox=el.$xtlightbox||{};el.$xtlightbox.adaptor=a.$name;e.push(el);el.addEvent('click',this.onElementClick);if(this.options.preload)a.load(el);break;}}},this);if(e.length==0)return this;if(this.elements)this.elements.append(e);else this.elements=e;this.fireEvent('attach',e);return this;},detach:function(elements){if(!instanceOf(elements,Elements))elements=$$(elements);elements.each(function(el){this.elements.erase(el);el.removeEvent('click',this.onElementClick);delete el.$xtlightbox.adaptor;});this.fireEvent('detach',elements);return this;},show:function(element){if(!element.$xtlightbox||!element.$xtlightbox.adaptor)return this;if(this.shown&&this.current==element)return this;var name=element.$xtlightbox.adaptor;if(!this.adaptors[name])return this;this.renderer.show();this.renderer.empty();var adaptor=this.adaptors[name];this.renderer.setLoading(true);adaptor.load(element,function(el){this.renderer.setLoading(false);var o={title:adaptor.getTitle(el),total:this.elements.length,position:this.elements.indexOf(el)+1,adaptor:element.$xtlightbox.adaptor};if(this.options.loop||o.position>1)o.prev=true;if(this.options.loop||o.position<o.total)o.next=true;var maxSize=this.renderer.getMaxSize(o);o.size=adaptor.getSize(el);if(maxSize.x<o.size.x){o.size.y=Math.round(maxSize.x*o.size.y/o.size.x);o.size.x=maxSize.x;}
if(maxSize.y<o.size.y){o.size.x=Math.round(o.size.x*maxSize.y/o.size.y);o.size.y=maxSize.y;}
adaptor.setSize(el,o.size);var c=adaptor.getContent(el);this.renderer.render(c,o);var a;for(a=0;a<this.options.incrementalPreLoad;a++){if(o.position+a<o.total){this.adaptors[this.elements[o.position+a].$xtlightbox.adaptor].load(this.elements[o.position+a]);}}
for(a=-this.options.incrementalPreLoad;a<0;a++){if(o.position+a<0){this.adaptors[this.elements[o.total+(o.position+a)].$xtlightbox.adaptor].load(this.elements[o.total+(o.position+a)]);}else{this.adaptors[this.elements[o.position+a].$xtlightbox.adaptor].load(this.elements[o.position+a]);}}}.bind(this));this.current=element;this.shown=true;this.fireEvent('show',element);return this;},hide:function(){this.renderer.hide();this.current=null;this.shown=false;this.fireEvent('hide');return this;},next:function(){if(!this.elements||this.elements.length==0)return this;if(!this.current)return this.show(this.elements[0]);var i=this.elements.indexOf(this.current);if(i+1==this.elements.length){if(this.options.loop)return this.show(this.elements[0]);return this;}
this.fireEvent('next',this.elements[i+1]);this.show(this.elements[i+1]);return this;},previous:function(){if(!this.elements||this.elements.length==0)return this;if(!this.current)return this.show(this.elements[0]);var i=this.elements.indexOf(this.current);if(i==0){if(this.options.loop)return this.show(this.elements.getLast());return this;}
this.fireEvent('previous',this.elements[i-1]);this.show(this.elements[i-1]);return this;},clear:function(){if(!this.elements)return this;this.elements.each(function(el){el.removeEvent('click',this.onElementClick);delete el.$xtlightbox.adaptor;});delete this.elements;this.fireEvent('clear');return this;},destroy:function(){this.clear();for(var i=this.adaptors.length;i--;)this.adaptors[i].destroy();this.adaptors.empty();this.renderer.destroy();delete this.adaptors;delete this.renderer;$(document).removeEvents({'keydown':this.onKeyPress,'keypress':this.onKeyPress});this.fireEvent('destroy');return null;},toElement:function(){return this.renderer.toElement();}});(function(){var Adaptor=this.XtLightbox.Adaptor=new Class({Implements:Options,$name:'',options:{},initialize:function(options){this.setOptions(options);},check:function(element){return element.rel.test(/^lightbox/);},getContent:function(element){return'';},getTitle:function(element){return element.title;},getSize:function(element){return{x:0,y:0};},setSize:function(element,size){return this;},load:function(element,callback){callback(element);return this;},destroy:function(){return null;}});var count=0,cache={};Adaptor.cache=function(element,content){if(!element.$xtlightbox)throw new Error('Element must be attached to a lightbox');var a=element.$xtlightbox.adaptor,i=element.$xtlightbox.id;if(!i)i=element.$xtlightbox.id=++count;cache[a+'-'+i]=content;return element;}
Adaptor.load=function(element){if(!element.$xtlightbox)throw new Error('Element must be attached to a lightbox');if(!Adaptor.cached(element))return null;var a=element.$xtlightbox.adaptor,i=element.$xtlightbox.id;return cache[a+'-'+i];}
Adaptor.clear=function(element){if(!Adaptor.cached(element))return element;var a=element.$xtlightbox.adaptor,i=element.$xtlightbox.id;cache[a+'-'+i]=null;return element;}
Adaptor.cached=function(element){if(!element.$xtlightbox)return false;var i=element.$xtlightbox.id,a=element.$xtlightbox.adaptor;return i&&a&&cache[a+'-'+i];}})();XtLightbox.Renderer=new Class({Implements:[Options,Events],options:{positionText:'Image {x} of {total}',useMask:true,maskOptions:{},hideArrowsFor:[],hideSinglePosition:true},initialize:function(options){this.setOptions(options);},create:function(){if(this.element)return this;this.element=new Element('div.xt-lightbox').grab(this.elWrapper=new Element('div.xt-lightbox-wrapper').adopt(new Element('div.xt-lightbox-content-wrapper').adopt(this.elContent=new Element('div.xt-lightbox-content'),this.elArrows=new Element('div.xt-lightbox-arrows').adopt(this.btnPrev=new Element('span.button.xt-lightbox-prev').addEvent('click',this.fireEvent.pass('previous',this)),this.btnNext=new Element('span.button.xt-lightbox-next').addEvent('click',this.fireEvent.pass('next',this)))),this.elFooter=new Element('div.xt-lightbox-footer').grab(new Element('div.xt-lightbox-footer-wrapper').adopt(this.btnClose=new Element('span.button.xt-lightbox-close').addEvent('click',this.fireEvent.pass('close',this)),this.elTitle=new Element('div.xt-lightbox-title'),this.elPosition=new Element('div.xt-lightbox-position'),new Element('div.xt-clear')))).addEvent('click',function(e){e.stopPropagation();})).addEvent('click',this.fireEvent.pass('close',this));return this;},inject:function(){if(this.injected)return this;if(!this.element)this.create();var i=this.options.inject,t=i&&i.target?i.target:document.body,w=i&&i.where?i.where:'inside';this.element.setStyle('display','none').inject(t,w);if(this.options.useMask&&window.Mask){this.mask=new Mask(document.body,Object.merge({'class':'xt-lightbox-mask',onClick:this.fireEvent.pass('close',this)},this.options.maskOptions));this.addEvents({show:this.mask.show.bind(this.mask),hide:this.mask.hide.bind(this.mask),destroy:this.mask.destroy.bind(this.mask)});}
this.injected=true;return this;},setLoading:function(v){this.toElement()[this.loading=!!v?'addClass':'removeClass']('loading');return this;},show:function(){if(!this.injected)this.inject();if(this.shown)return this;this.element.setStyle('display','');this.shown=true;this.resize();this.fireEvent('show');return this;},hide:function(){if(!this.injected||!this.shown)return this;this.reset();this.element.setStyle('display','none');this.shown=false;this.fireEvent('hide');return this;},reset:function(){if(!this.injected)return this;this.resize();this.empty();this.elFooter.setStyle('display','none');return this;},empty:function(){if(!this.element)return this;this.elTitle.empty();this.elPosition.empty();this.elContent.empty();return this;},render:function(content,options){if(!content)return this;options=Object.append({close:true},options);this.empty();this.elTitle.set('text',options.title||'');if(options.position&&options.total&&(!this.options.hideSinglePosition||options.total>1)){this.elPosition.set('text',this.options.positionText.substitute({x:options.position,total:options.total}));}
this.resize(options.size);this.elFooter.setStyle('display','');this.elContent.empty().grab(content);this.btnPrev.setStyle('display',options.prev?'':'none');this.btnNext.setStyle('display',options.next?'':'none');if(this.options.hideArrowsFor.contains(this.rOpts.adaptor)||(!options.next&&!options.prev))this.elArrows.setStyle('display','none');else this.elArrows.setStyle('display','');this.btnClose.setStyle('display',options.close?'':'none');return this;},resize:function(size,callback){if(!this.shown)this.show();size=size||{};this.element.setStyles({width:size.x||'',height:size.y||''});if(callback)callback();return this;},toElement:function(){if(!this.element)this.create();return this.element;},destroy:function(){this.element.destroy();this.fireEvent('destroy');return null;},getMaxSize:function(options){var t=this.elTitle.get('text'),p,d=this.elFooter.getStyle('display');this.elTitle.set('text',options.title||'');if(options.position&&options.total&&(!this.options.hideSinglePosition||options.total>1)){p=this.elPosition.get('text');this.elPosition.set('text',this.options.positionText.substitute({x:options.position,total:options.total}));}
this.elFooter.setStyle('display','');var winSize=window.getSize();var elSize=this.element.getSize();var contSize=this.elContent.getSize();this.elTitle.set('text',t||'');if(p)this.elPosition.set('text',p);this.elFooter.setStyle('display',d);return{x:winSize.x-(elSize.x-contSize.x),y:winSize.y-(elSize.y-contSize.y)};}});XtLightbox.Adaptor.Image=new Class({Extends:XtLightbox.Adaptor,$name:'Image',options:{extensions:['jpg','png','gif'],lightboxCompat:true},initialize:function(options){this.parent(options);var e=this.options.extensions||[];if(e.contains('jpg')&&!e.contains('jpeg'))e.push('jpeg');},check:function(element){return this.options.lightboxCompat?this.parent(element):element.href.test('\\.(?:'+this.options.extensions.join('|')+')$','i');},getContent:function(element){if(!XtLightbox.Adaptor.cached(element))throw new Error('Element content must be loaded first');return XtLightbox.Adaptor.load(element);},getSize:function(element){if(!XtLightbox.Adaptor.cached(element))throw new Error('Element content must be loaded first');var img=XtLightbox.Adaptor.load(element);return{x:img.naturalWidth,y:img.naturalHeight};},setSize:function(element,size){if(!XtLightbox.Adaptor.cached(element))throw new Error('Element content must be loaded first');var img=XtLightbox.Adaptor.load(element);img.set({width:size.x,height:size.y});return this;},load:function(element,callback){callback=callback||function(){};if(XtLightbox.Adaptor.cached(element)){callback(element);return this;}
new Element('img').addEvent('load',function(){if(!this.naturalWidth)this.naturalWidth=this.width;if(!this.naturalHeight)this.naturalHeight=this.height;XtLightbox.Adaptor.cache(element,this);callback(element);}).set({src:element.href,alt:''});return this;}});XtLightbox.Adaptor.YouTube=new Class({Extends:XtLightbox.Adaptor,$name:'YouTube',options:{width:560,height:345,hd:false,fullscreen:false,related:false,autoplay:true,iframe:false},check:function(element){var l=/http:\/\/(?:www\.)?youtube.com\/watch\?(?:\S+=\S*&)*v=([-a-z0-9_]+)(?:&|$)/i,s=/http:\/\/(?:www\.)?youtu.be\/([-a-z0-9_]+)$/i;var r=l.exec(element.href);if(!r)r=s.exec(element.href);if(r){element.$xtlightbox=element.$xtlightbox||{};element.$xtlightbox.YouTubeId=r[1];}
return r;},getContent:function(element){if(!XtLightbox.Adaptor.cached(element))throw new Error('Element content must be loaded first');return XtLightbox.Adaptor.load(element);},getSize:function(element){if(!XtLightbox.Adaptor.cached(element))throw new Error('Element content must be loaded first');return{x:this.options.width,y:this.options.height};},setSize:function(element,size){if(!XtLightbox.Adaptor.cached(element))throw new Error('Element content must be loaded first');var obj=$(XtLightbox.Adaptor.load(element));if(!obj.set){obj.width=size.x;obj.height=size.y;}else obj.set({width:size.x,height:size.y});return this;},load:function(element,callback){callback=callback||function(){};if(XtLightbox.Adaptor.cached(element)){callback(element);return this;}
var params={};if(this.options.iframe)params.wmode='transparent';if(this.options.fullscreen)params.fs='1';if(!this.options.related)params.rel='0';if(this.options.hd)params.hd='1';if(this.options.autoplay)params.autoplay='1';var a=[];for(var p in params){if(!params.hasOwnProperty(p))continue;a.push(p+'='+params[p]);}
params=a.join('&');var obj;if(this.options.iframe)obj=new Element('iframe',{title:"YouTube video player",width:this.options.width,height:this.options.height,src:'http://www.youtube.com/v/'+element.$xtlightbox.YouTubeId+'?'+params,frameborder:0,allowfullscreen:''});else obj=new Swiff('http://www.youtube.com/v/'+element.$xtlightbox.YouTubeId+'?'+params,{width:this.options.width,height:this.options.height,params:{allowFullScreen:'true',wMode:'transparent',bgcolor:'#ff3300'}});XtLightbox.Adaptor.cache(element,obj);callback(element);return this;}});XtLightbox.Renderer.Lightbox=new Class({Extends:XtLightbox.Renderer,options:{maskFxOptions:{},widthFxOptions:{},heightFxOptions:{},contentFxOptions:{},footerFxOptions:{},hideArrowsFor:['YouTube','Vimeo']},create:function(){this.parent();this.fxWidth=new Fx.Morph(this.element,Object.merge({},this.options.widthFxOptions,{onStart:function(){},onCancel:function(){},onComplete:function(){this.onWidthChange();}.bind(this)}));this.fxTop=new Fx.Tween(this.element,Object.merge({},this.options.heightFxOptions,{property:'top',onStart:function(){},onCancel:function(){},onComplete:function(){}}));this.fxHeight=new Fx.Tween(this.elContent,Object.merge({},this.options.heightFxOptions,{property:'height',onStart:function(){},onCancel:function(){},onComplete:function(){this.onHeightChange();}.bind(this)}));this.fxContent=new Fx.Tween(this.elContent,Object.merge({},this.options.contentFxOptions,{property:'opacity',onStart:function(){},onCancel:function(){},onComplete:function(){this.onContentRender();}.bind(this)}));this.fxFooter=new Fx.Tween(this.elFooter,Object.merge({},this.options.footerFxOptions,{property:'height',onStart:function(){this.elFooter.setStyle('overflow','hidden');}.bind(this),onCancel:function(){},onComplete:function(){this.elFooter.setStyle('overflow','');}.bind(this)}));},destroy:function(){delete this.fxWidth;delete this.fxTop;delete this.fxHeight;delete this.fxContent;delete this.fxFooter;return this.parent();},inject:function(){this.parent();this.removeEvents('show').removeEvents('hide');if(this.mask){this.mask.addEvent('click',this.fireEvent.pass('close',this));var fxShow=new Fx.Tween(this.mask,Object.merge({},this.options.maskFxOptions,{property:'opacity',onStart:function(){this.show();}.bind(this.mask),onCancel:function(){},onComplete:function(){}}));var fxHide=new Fx.Tween(this.mask,Object.merge({},this.options.maskFxOptions,{property:'opacity',onStart:function(){},onCancel:function(){},onComplete:function(){this.hide();}.bind(this.mask)}));var mo=this.options.maskOpacity||this.mask.toElement().getStyle('opacity')||1;this.mask.toElement().setStyle('opacity',0);this.addEvents({show:function(){fxHide.cancel();fxShow.start(mo);},hide:function(){fxShow.cancel();fxHide.start(0);}});}},empty:function(){this.parent();this.elFooter.setStyle('display','none');this.btnPrev.setStyle('display','none');this.btnNext.setStyle('display','none');this._opts={};this._cont=null;this._fwopts=null;this.fxHeight.cancel();this.fxTop.cancel();this.fxWidth.cancel();this.fxContent.cancel();this.fxFooter.cancel();return this;},render:function(content,options){if(!content)return this;options=Object.append({close:true},options);this.empty();this.elTitle.set('text',options.title||'');if(options.position&&options.total&&(!this.options.hideSinglePosition||options.total>1)){this.elPosition.set('text',this.options.positionText.substitute({x:options.position,total:options.total}));}
this._opts=options;this._cont=content;this.resize(options.size);return this;},renderContent:function(){this.fxContent.set(0).start(1);return this;},onContentRender:function(){this.btnPrev.setStyle('display',this._opts.prev?'':'none');this.btnNext.setStyle('display',this._opts.next?'':'none');if(this.options.hideArrowsFor.contains(this._opts.adaptor)||(!this._opts.next&&!this._opts.prev))this.elArrows.setStyle('display','none');else this.elArrows.setStyle('display','');this.btnClose.setStyle('display',this._opts.close?'':'none');this.renderFooter();},renderFooter:function(){this.elFooter.setStyles({visibility:'hidden',display:''});var y=this.elFooter.getSize().y;this.elFooter.setStyles({visibility:'visible',height:0});this.fxFooter.start(y);return this;},resize:function(size){if(!this.shown)this.show();var winSize=window.getSize(),elSize;if(size&&size.x&&size.y){this.elFooter.setStyles({display:'',height:''});var elFull=this.element.getSize();var elBox={x:this.elWrapper.getStyle('width').toInt(),y:this.elWrapper.getStyle('height').toInt()};var fY=this.elFooter.getSize().y;this.elFooter.setStyle('display','none');elSize={x:elFull.x-elBox.x+size.x,y:elFull.y-elBox.y+size.y+fY};this._fwopts={width:elSize.x,left:Math.round((winSize.x-elSize.x)/2)};if(size.y!=this.elContent.getStyle('height').toInt()){this.resizing=true;this.fxHeight.start(size.y);this.fxTop.start(Math.round((winSize.y-elSize.y)/2));}else this.onHeightChange();}else{size=size||{};this.element.setStyle('width',size.x||'');this.elContent.setStyle('height',size.y||'');this.elFooter.setStyle('display','');elSize=this.element.getSize();this.elFooter.setStyle('display','none');this.element.setStyles({left:Math.round((winSize.x-elSize.x)/2),top:Math.round((winSize.y-elSize.y)/2)});}
return this;},onWidthChange:function(){this.resizing=false;this.elContent.grab(this._cont);this.renderContent();return this;},onHeightChange:function(){if(this._fwopts.width!=this.element.getStyle('width').toInt()){this.resizing=true;this.fxWidth.start(this._fwopts);}else this.onWidthChange();return this;},reset:function(){if(!this.injected)return this;this.resize();this.empty();this.elFooter.setStyle('display','none');return this;}});
