| 'use strict'; | 
|   | 
| window.EventPubSub=function EventPubSub() { | 
|   this._events_={}; | 
|   this.publish=this.trigger=this.emit=emit; | 
|   this.subscribe=this.on=on; | 
|   this.once=once; | 
|   this.unSubscribe=this.off=off; | 
|   this.emit$=emit$; | 
|   | 
|   function on(type,handler,once){ | 
|       if(!handler){ | 
|           throw new ReferenceError('handler not defined.'); | 
|       } | 
|   | 
|       if(!this._events_[type]){ | 
|           this._events_[type]=[]; | 
|       } | 
|   | 
|       if(once){ | 
|           handler._once_ = once; | 
|       } | 
|       this._events_[type].push(handler); | 
|       return this; | 
|   } | 
|   | 
|   function once(type,handler){ | 
|       return this.on(type, handler, true); | 
|   } | 
|   | 
|   function off(type,handler){ | 
|       if(!this._events_[type]){ | 
|           return this; | 
|       } | 
|   | 
|       if(!handler){ | 
|           throw new ReferenceError('handler not defined. if you wish to remove all handlers from the event please pass "*" as the handler'); | 
|       } | 
|   | 
|       if(handler=='*'){ | 
|           delete this._events_[type]; | 
|           return this; | 
|       } | 
|   | 
|       var handlers=this._events_[type]; | 
|   | 
|       while(handlers.includes(handler)){ | 
|           handlers.splice( | 
|               handlers.indexOf(handler), | 
|               1 | 
|           ); | 
|       } | 
|   | 
|       if(handlers.length<1){ | 
|           delete this._events_[type]; | 
|       } | 
|   | 
|       return this; | 
|   } | 
|   | 
|   function emit(type){ | 
|       this.emit$.apply(this, arguments); | 
|       if(!this._events_[type]){ | 
|           return this; | 
|       } | 
|       arguments.splice=Array.prototype.splice; | 
|       arguments.splice(0,1); | 
|   | 
|       var handlers=this._events_[type]; | 
|       var onceHandled=[]; | 
|   | 
|       for(var i in handlers){ | 
|           var handler=handlers[i]; | 
|           handler.apply(this, arguments); | 
|           if(handler._once_){ | 
|             onceHandled.push(handler); | 
|           } | 
|       } | 
|   | 
|       for(var i in onceHandled){ | 
|           this.off( | 
|             type, | 
|             onceHandled[i] | 
|           ); | 
|       } | 
|   | 
|       return this; | 
|   } | 
|   | 
|   function emit$(type, args){ | 
|       if(!this._events_['*']){ | 
|           return this; | 
|       } | 
|   | 
|       var catchAll=this._events_['*']; | 
|   | 
|       args.shift=Array.prototype.shift; | 
|       args.shift(type); | 
|   | 
|       for(var handler of catchAll){ | 
|           handler.apply(this, args); | 
|       } | 
|   | 
|       return this; | 
|   } | 
|   | 
|   return this; | 
| } | 
|   | 
| if (!Array.prototype.includes) { | 
|   Array.prototype.includes = function(searchElement /*, fromIndex*/) { | 
|     'use strict'; | 
|     if (this == null) { | 
|       throw new TypeError('Array.prototype.includes called on null or undefined'); | 
|     } | 
|   | 
|     var O = Object(this); | 
|     var len = parseInt(O.length, 10) || 0; | 
|     if (len === 0) { | 
|       return false; | 
|     } | 
|     var n = parseInt(arguments[1], 10) || 0; | 
|     var k; | 
|     if (n >= 0) { | 
|       k = n; | 
|     } else { | 
|       k = len + n; | 
|       if (k < 0) {k = 0;} | 
|     } | 
|     var currentElement; | 
|     while (k < len) { | 
|       currentElement = O[k]; | 
|       if (searchElement === currentElement || | 
|          (searchElement !== searchElement && currentElement !== currentElement)) { // NaN !== NaN | 
|         return true; | 
|       } | 
|       k++; | 
|     } | 
|     return false; | 
|   }; | 
| } |