/** * @author Ryan Johnson * @copyright 2008 PersonalGrid Corporation * @package LivePipe UI * @license MIT * @url http://livepipe.net/core * @require prototype.js */ if(typeof(Control) == 'undefined') Control = {}; var $proc = function(proc){ return typeof(proc) == 'function' ? proc : function(){return proc}; }; var $value = function(value){ return typeof(value) == 'function' ? value() : value; }; Object.Event = { extend: function(object){ object._objectEventSetup = function(event_name){ this._observers = this._observers || {}; this._observers[event_name] = this._observers[event_name] || []; }; object.observe = function(event_name,observer){ if(typeof(event_name) == 'string' && typeof(observer) != 'undefined'){ this._objectEventSetup(event_name); if(!this._observers[event_name].include(observer)) this._observers[event_name].push(observer); }else for(var e in event_name) this.observe(e,event_name[e]); }; object.stopObserving = function(event_name,observer){ this._objectEventSetup(event_name); if(event_name && observer) this._observers[event_name] = this._observers[event_name].without(observer); else if(event_name) this._observers[event_name] = []; else this._observers = {}; }; object.observeOnce = function(event_name,outer_observer){ var inner_observer = function(){ outer_observer.apply(this,arguments); this.stopObserving(event_name,inner_observer); }.bind(this); this._objectEventSetup(event_name); this._observers[event_name].push(inner_observer); }; object.notify = function(event_name){ this._objectEventSetup(event_name); var collected_return_values = []; var args = $A(arguments).slice(1); try{ for(var i = 0; i < this._observers[event_name].length; ++i) collected_return_values.push(this._observers[event_name][i].apply(this,args) || null); }catch(e){ if(e == $break) return false; else throw e; } return collected_return_values; }; if(object.prototype){ object.prototype._objectEventSetup = object._objectEventSetup; object.prototype.observe = object.observe; object.prototype.stopObserving = object.stopObserving; object.prototype.observeOnce = object.observeOnce; object.prototype.notify = function(event_name){ if(object.notify){ var args = $A(arguments).slice(1); args.unshift(this); args.unshift(event_name); object.notify.apply(object,args); } this._objectEventSetup(event_name); var args = $A(arguments).slice(1); var collected_return_values = []; try{ if(this.options && this.options[event_name] && typeof(this.options[event_name]) == 'function') collected_return_values.push(this.options[event_name].apply(this,args) || null); var callbacks_copy = this._observers[event_name]; // since original array will be modified after observeOnce calls for(var i = 0; i < callbacks_copy.length; ++i) collected_return_values.push(callbacks_copy[i].apply(this,args) || null); }catch(e){ if(e == $break) return false; else throw e; } return collected_return_values; }; } } }; /* Begin Core Extensions */ //Element.observeOnce Element.addMethods({ observeOnce: function(element,event_name,outer_callback){ var inner_callback = function(){ outer_callback.apply(this,arguments); Element.stopObserving(element,event_name,inner_callback); }; Element.observe(element,event_name,inner_callback); } }); //mouse:wheel (function(){ function wheel(event){ var delta, element, custom_event; // normalize the delta if (event.wheelDelta) { // IE & Opera delta = event.wheelDelta / 120; } else if (event.detail) { // W3C delta =- event.detail / 3; } if (!delta) { return; } element = Event.extend(event).target; element = Element.extend(element.nodeType === Node.TEXT_NODE ? element.parentNode : element); custom_event = element.fire('mouse:wheel',{ delta: delta }); if (custom_event.stopped) { Event.stop(event); return false; } } document.observe('mousewheel',wheel); document.observe('DOMMouseScroll',wheel); })(); /* End Core Extensions */ //from PrototypeUI var IframeShim = Class.create({ initialize: function() { this.element = new Element('iframe',{ style: 'position:absolute;filter:progid:DXImageTransform.Microsoft.Alpha(opacity=0);display:none', src: 'javascript:void(0);', frameborder: 0 }); $(document.body).insert(this.element); }, hide: function() { this.element.hide(); return this; }, show: function() { this.element.show(); return this; }, positionUnder: function(element) { var element = $(element); var offset = element.cumulativeOffset(); var dimensions = element.getDimensions(); this.element.setStyle({ left: offset[0] + 'px', top: offset[1] + 'px', width: dimensions.width + 'px', height: dimensions.height + 'px', zIndex: element.getStyle('zIndex') - 1 }).show(); return this; }, setBounds: function(bounds) { for(prop in bounds) bounds[prop] += 'px'; this.element.setStyle(bounds); return this; }, destroy: function() { if(this.element) this.element.remove(); return this; } });