
var SqueezeBox={
presets:{
size:{x:600,y:450},
sizeLoading:{x:200,y:150},
marginInner:{x:20,y:20},
marginImage:{x:150,y:200},
handler:false,
adopt:null,
closeWithOverlay:true,
zIndex:65555,
overlayOpacity:0.7,
classWindow:'',
classOverlay:'',
disableFx:false,
onOpen:Class.empty,
onClose:Class.empty,
onUpdate:Class.empty,
onResize:Class.empty,
onMove:Class.empty,
onShow:Class.empty,
onHide:Class.empty,
fxOverlayDuration:250,
fxResizeDuration:750,
fxContentDuration:250,
ajaxOptions:{}
},
initialize:function(options){
if(this.options)return this;
this.presets=$merge(this.presets,options)
this.setOptions(this.presets);
this.build();
this.listeners={
window:this.reposition.bind(this,[null]),
close:this.close.bind(this),
key:this.onkeypress.bind(this)};
this.isOpen=this.isLoading=false;
this.window.close=this.listeners.close;
return this;
},
build:function(){
this.overlay=new Element('div',{
id:'sbox-overlay',
styles:{
display:'none',
zIndex:this.options.zIndex
}
});
this.content=new Element('div',{
id:'sbox-content'
});
this.btnClose=new Element('a',{
id:'sbox-btn-close',
href:'#'
});
this.window=new Element('div',{
id:'sbox-window',
styles:{
display:'none',
zIndex:this.options.zIndex+2
}
}).adopt(this.btnClose,this.content);
if(!window.ie6){
this.overlay.setStyles({
position:'fixed',
top:0,
left:0
});
this.window.setStyles({
position:'fixed',
top:'50%',
left:'50%'
});
}else{
this.overlay.style.setExpression('marginTop','document.documentElement.scrollTop + "px"');
this.window.style.setExpression('marginTop','0 - parseInt(this.offsetHeight / 2) + document.documentElement.scrollTop + "px"');
this.overlay.setStyles({
position:'absolute',
top:'0%',
left:'0%'
});
this.window.setStyles({
position:'absolute',
top:'0%',
left:'0%'
});
}
$(document.body).adopt(this.overlay,this.window);
this.fx={
overlay:this.overlay.effect('opacity',{
duration:this.options.fxOverlayDuration,
wait:false}).set(0),
window:this.window.effects({
duration:this.options.fxResizeDuration,
wait:false}),
content:this.content.effect('opacity',{
duration:this.options.fxContentDuration,
wait:false}).set(0)
};
},
addClick:function(el){
return el.addEvent('click',function(){
if(this.fromElement(el))return false;
}.bind(this));
},
fromElement:function(el,options){
this.initialize();
this.element=$(el);
if(this.element&&this.element.rel)options=$merge(options||{},Json.evaluate(this.element.rel));
this.setOptions(this.presets,options);
this.assignOptions();
this.url=(this.element?(this.options.url||this.element.href):el)||'';
if(this.options.handler){
var handler=this.options.handler;
return this.setContent(handler,this.parsers[handler].call(this,true));
}
var res=false;
for(var key in this.parsers){
if((res=this.parsers[key].call(this)))return this.setContent(key,res);
}
return this;
},
assignOptions:function(){
this.overlay.setProperty('class',this.options.classOverlay);
this.window.setProperty('class',this.options.classWindow);
},
close:function(e){
if(e)new Event(e).stop();
if(!this.isOpen)return this;
this.fx.overlay.start(0).chain(this.toggleOverlay.bind(this));
this.window.setStyle('display','none');
this.trashImage();
this.toggleListeners();
this.isOpen=null;
this.fireEvent('onClose',[this.content]).removeEvents();
this.options={};
this.setOptions(this.presets).callChain();
return this;
},
onError:function(){
if(this.image)this.trashImage();
this.setContent('Error during loading');
},
trashImage:function(){
if(this.image)this.image=this.image.onload=this.image.onerror=this.image.onabort=null;
},
setContent:function(handler,content){
this.content.setProperty('class','sbox-content-'+handler);
this.applyTimer=this.applyContent.delay(this.fx.overlay.options.duration,this,[this.handlers[handler].call(this,content)]);
if(this.overlay.opacity)return this;
this.toggleOverlay(true);
this.fx.overlay.start(this.options.overlayOpacity);
this.reposition();
return this;
},
applyContent:function(content,size){
this.applyTimer=$clear(this.applyTimer);
this.hideContent();
if(!content)this.toggleLoading(true);
else{
if(this.isLoading)this.toggleLoading(false);
this.fireEvent('onUpdate',[this.content],20);
}
this.content.empty()[['string','array',false].contains($type(content))?'setHTML':'adopt'](content||'');
this.callChain();
if(!this.isOpen){
this.toggleListeners(true);
this.resize(size,true);
this.isOpen=true;
this.fireEvent('onOpen',[this.content]);
}else this.resize(size);
},
resize:function(size,instantly){
var sizes=window.getSize();
this.size=$merge(this.isLoading?this.options.sizeLoading:this.options.size,size);
var to={
width:this.size.x,
height:this.size.y,
marginLeft:-this.size.x/2,
marginTop:-this.size.y/2
};
$clear(this.showTimer||null);
this.hideContent();
if(!instantly)this.fx.window.start(to).chain(this.showContent.bind(this));
else{
this.window.setStyles(to).setStyle('display','');
this.showTimer=this.showContent.delay(50,this);
}
this.reposition(sizes);
},
toggleListeners:function(state){
var task=state?'addEvent':'removeEvent';
this.btnClose[task]('click',this.listeners.close);
if(this.options.closeWithOverlay)this.overlay[task]('click',this.listeners.close);
document[task]('keydown',this.listeners.key);
window[task]('resize',this.listeners.window);
window[task]('scroll',this.listeners.window);
},
toggleLoading:function(state){
this.isLoading=state;
this.window[state?'addClass':'removeClass']('sbox-loading');
if(state)this.fireEvent('onLoading',[this.window]);
},
toggleOverlay:function(state){
this.overlay.setStyle('display',state?'':'none');
$(document.body)[state?'addClass':'removeClass']('body-overlayed');
},
showContent:function(){
if(this.content.opacity)this.fireEvent('onShow',[this.window]);
this.fx.content.start(1);
},
hideContent:function(){
if(!this.content.opacity)this.fireEvent('onHide',[this.window]);
this.fx.content.stop().set(0);
},
onkeypress:function(e){
switch(e.key){
case'esc':
case'x':
this.close();
break;
}
},
reposition:function(sizes){
sizes=sizes||window.getSize();
this.overlay.setStyles({
width:sizes.size.x,
height:sizes.size.y
});
this.fireEvent('onMove',[this.overlay,this.window,sizes]);
},
removeEvents:function(type){
if(!this.$events)return this;
if(!type)this.$events=null;
else if(this.$events[type])this.$events[type]=null;
return this;
},
parsers:{
'image':function(preset){
return(preset||this.url.test(/\.(jpg|jpeg|png|gif|bmp)$/i))?this.url:false;
},
'adopt':function(preset){
if($(this.options.adopt))return $(this.options.adopt);
if(preset||($(this.element)&&!this.element.parentNode))return $(this.element);
var bits=this.url.match(/#([\w-]+)$/);
return bits?$(bits[1]):false;
},
'url':function(preset){
return(preset||(this.url&&!this.url.test(/^javascript:/i)))?this.url:false;
},
'iframe':function(preset){
return(preset||this.url)?this.url:false;
},
'string':function(preset){
return true;
}
},
handlers:{
'image':function(url){
this.image=new Image();
var events={
loaded:function(){
var win={x:window.getWidth()-this.options.marginImage.x,y:window.getHeight()-this.options.marginImage.y};
var size={x:this.image.width,y:this.image.height};
for(var i=0;i<2;i++)
if(size.x>win.x){
size.y*=win.x/size.x;
size.x=win.x;
}else if(size.y>win.y){
size.x*=win.y/size.y;
size.y=win.y;
}
size={x:parseInt(size.x),y:parseInt(size.y)};
if(window.webkit419)this.image=new Element('img',{'src':this.image.src});
else $(this.image);
this.image.setProperties({
'width':size.x,
'height':size.y});
this.applyContent(this.image,size);
}.bind(this),
failed:this.onError.bind(this)
};
(function(){
this.src=url;
}).delay(10,this.image);
this.image.onload=events.loaded;
this.image.onerror=this.image.onabort=events.failed;
},
'adopt':function(el){
return el.clone();
},
'url':function(url){
this.ajax=new Ajax(url,this.options.ajaxOptions);
this.ajax.addEvent('onSuccess',function(resp){
this.applyContent(resp);
this.ajax=null;
}.bind(this));
this.ajax.addEvent('onFailure',this.onError.bind(this));
this.ajax.request.delay(10,this.ajax);
},
'iframe':function(url){
return new Element('iframe',{
'src':url,
'frameBorder':0,
'width':this.options.size.x,
'height':this.options.size.y
});
},
'string':function(str){
return str;
}
},
extend:$extend
};
SqueezeBox.extend(Events.prototype);
SqueezeBox.extend(Options.prototype);
SqueezeBox.extend(Chain.prototype);