function DOMEvent(){ this.listeners = []; } DOMEvent.prototype.register = function(name, lnr, callslimit){ if(this.hasNamedListener(name)){ return false; } var ev = { name: name, func: lnr, calls: 0, callslimit: callslimit ? callslimit : -1 }; this.listeners.push(ev); } DOMEvent.prototype.remove = function(name){ this.listeners.each( function(lnr, index){ if(lnr.name == name){ this.listeners.remove(index); throw $break; } }.bind(this) ); } DOMEvent.prototype.fire = function(){ var args = arguments; this.listeners.each( function(lnr){ var obj = lnr.func.bound ? lnr.func.bound[0] : this.defaultThis || lnr; lnr.func.apply(obj, args); lnr.calls++; if(lnr.calls == lnr.callslimit){ this.remove(lnr.name) } }.bind(this) ) } DOMEvent.prototype.length = function(){ return this.listeners.length; } DOMEvent.prototype.hasNamedListener = function(name, no_bool){ var ret = false; this.listeners.each( function(lnr){ if(lnr.name == name){ ret = lnr; throw $break; } } ); return !no_bool ? !!(ret) : ret; } DOMEvent.prototype.get = function(name){ return this.hasNamedListener(name, true); }; DOMEvent.prototype.toString = function(){ var str = "object DOMEvent\n"; str += "\n"; str += "Listeners: "; this.listeners.each(function(lnr){ str += lnr.name + ", "; }); var reg = new RegExp(", $"); str = str.replace(reg, ""); str += "\nListeners length: " + this.listeners.length; return str; } DOMEvent.cloneEvent = function(d_event, obj){ var ret = obj ? false : true; obj = obj ? obj : {}; obj.register = function(name, lnr, callslimit){ d_event.register(name, lnr, callslimit); } obj.remove = function(name){ d_event.remove(name) } obj.length = function(){ return d_event.length(); } obj.hasNamedListener = function(name){ return d_event.hasNamedListener(name); } obj.get = function(name){ return d_event.get(name); } obj.eachLnr = function(iterator){ d_event.eachLnr(iterator); } obj.toString = function(){ return d_event.toString(); } if(ret){ return obj; } } DOMEvent.createEventLink = function(obj, name){ obj["_" + name] = new DOMEvent(); obj[name] = function(){ this["_" + name].fire(); } DOMEvent.cloneEvent(obj["_" + name], obj[name]); obj[name].register = function(n, func, callslimit){ func = func.bound ? func : func.bind(obj); obj["_" + name].register(n, func, callslimit); } } DOMEvent.linkObjects = function(elem, d_event, name){ elem.d_event = d_event; elem[name] = function(){ this.d_event.fire.apply(this.d_event, arguments); } } DOMEvent.createLinkedEvent = function(elem, name){ var d_event = new DOMEvent(); DOMEvent.linkObjects(elem, d_event, name); return d_event; } function MajorDOMEvent(){ this.name = name ? name : "major_dom_event"; this.listeners = []; } MajorDOMEvent.prototype.register = DOMEvent.prototype.register; MajorDOMEvent.prototype.remove = DOMEvent.prototype.remove; MajorDOMEvent.prototype.hasNamedListener = DOMEvent.prototype.hasNamedListener; MajorDOMEvent.prototype.length = DOMEvent.prototype.length; MajorDOMEvent.prototype._link = function(d_event, arg){ d_event.register(this.name, function(){ this.listeners.each(function(lnr){ lnr.func(arg); }.bind(this)) }.bind(this)) } MajorDOMEvent.cloneEvent = function(m_d_event){ var obj = {}; obj.register = function(name, lnr, callslimit){ m_d_event.register(name, lnr, callslimit) } obj.remove = function(name){ m_d_event.remove(name) } obj.length = function(){ return m_d_event.length(); } obj.hasNamedListener = function(name){ return m_d_event.hasNamedListener(name); } obj._link = function(d_event, arg){ m_d_event._link(d_event, arg); } return obj; }