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); 