! function(root, factory) { if (typeof module === "object" && module.exports) module.exports = factory(); else root.onfire = factory() }(typeof window !== "undefined" ? window : this, function() { var __onfireEvents = {}, __cnt = 0, string_str = "string", function_str = "function", hasOwnKey = Function.call.bind(Object.hasOwnProperty), slice = Function.call.bind(Array.prototype.slice); function _bind(eventName, callback, is_one, context) { if (typeof eventName !== string_str || typeof callback !== function_str) { throw new Error("args: " + string_str + ", " + function_str + "") } if (!hasOwnKey(__onfireEvents, eventName)) { __onfireEvents[eventName] = {} } __onfireEvents[eventName][++__cnt] = [callback, is_one, context]; return [eventName, __cnt] } function _each(obj, callback) { for (var key in obj) { if (hasOwnKey(obj, key)) callback(key, obj[key]) } } function on(eventName, callback, context) { return _bind(eventName, callback, 0, context) } function one(eventName, callback, context) { return _bind(eventName, callback, 1, context) } function _fire_func(eventName, args) { if (hasOwnKey(__onfireEvents, eventName)) { _each(__onfireEvents[eventName], function(key, item) { item[0].apply(item[2], args); if (item[1]) delete __onfireEvents[eventName][key] }) } } function fire(eventName) { var args = slice(arguments, 1); setTimeout(function() { _fire_func(eventName, args) }) } function fireSync(eventName) { _fire_func(eventName, slice(arguments, 1)) } function un(event) { var eventName, key, r = false, type = typeof event; if (type === string_str) { if (hasOwnKey(__onfireEvents, event)) { delete __onfireEvents[event]; return true } return false } else if (type === "object") { eventName = event[0]; key = event[1]; if (hasOwnKey(__onfireEvents, eventName) && hasOwnKey(__onfireEvents[eventName], key)) { delete __onfireEvents[eventName][key]; return true } return false } else if (type === function_str) { _each(__onfireEvents, function(key_1, item_1) { _each(item_1, function(key_2, item_2) { if (item_2[0] === event) { delete __onfireEvents[key_1][key_2]; r = true } }) }); return r } return true } function clear() { __onfireEvents = {} } return { on: on, one: one, un: un, fire: fire, fireSync: fireSync, clear: clear } });