{"version":3,"file":"pubsub.min.js","sources":["pubsub.js"],"sourcesContent":["/*\r\nCopyright (c) 2010,2011,2012 Morgan Roderick http://roderick.dk\r\nLicense: MIT - http://mrgnrdrck.mit-license.org\r\n\r\nhttps://github.com/mroderick/PubSubJS\r\n*/\r\n/*jslint white:true, plusplus:true, stupid:true*/\r\n/*global\r\n\tsetTimeout,\r\n\tmodule,\r\n\texports,\r\n\tdefine,\r\n\trequire,\r\n\twindow\r\n*/\r\n\r\n(function(root, factory){\r\n\t'use strict';\r\n\r\n\t// CommonJS\r\n\tif (typeof exports === 'object'){\r\n\t\tmodule.exports = factory();\r\n\r\n\t// AMD\r\n\t} else if (typeof define === 'function' && define.amd){\r\n\t\tdefine(factory);\r\n\t// Browser\r\n\t} else {\r\n\t\troot.PubSub = factory();\r\n\t}\r\n}( ( typeof window === 'object' && window ) || this, function(){\r\n\r\n\t'use strict';\r\n\r\n\tvar PubSub = {\r\n\t\t\tname: 'PubSubJS',\r\n\t\t\tversion: '1.3.4'\r\n\t\t},\r\n\t\tmessages = {},\r\n\t\tlastUid = -1;\r\n\r\n\t/**\r\n\t *\tReturns a function that throws the passed exception, for use as argument for setTimeout\r\n\t *\t@param { Object } ex An Error object\r\n\t */\r\n\tfunction throwException( ex ){\r\n\t\treturn function reThrowException(){\r\n\t\t\tthrow ex;\r\n\t\t};\r\n\t}\r\n\r\n\tfunction callSubscriberWithDelayedExceptions( subscriber, message, data ){\r\n\t\ttry {\r\n\t\t\tsubscriber( message, data );\r\n\t\t} catch( ex ){\r\n\t\t\tsetTimeout( throwException( ex ), 0);\r\n\t\t}\r\n\t}\r\n\r\n\tfunction callSubscriberWithImmediateExceptions( subscriber, message, data ){\r\n\t\tsubscriber( message, data );\r\n\t}\r\n\r\n\tfunction deliverMessage( originalMessage, matchedMessage, data, immediateExceptions ){\r\n\t\tvar subscribers = messages[matchedMessage],\r\n\t\t\tcallSubscriber = immediateExceptions ? callSubscriberWithImmediateExceptions : callSubscriberWithDelayedExceptions,\r\n\t\t\ti, j;\r\n\r\n\t\tif ( !messages.hasOwnProperty( matchedMessage ) ) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tfor ( i = 0, j = subscribers.length; i < j; i++ ){\r\n\t\t\tcallSubscriber( subscribers[i].func, originalMessage, data );\r\n\t\t}\r\n\t}\r\n\r\n\tfunction createDeliveryFunction( message, data, immediateExceptions ){\r\n\t\treturn function deliverNamespaced(){\r\n\t\t\tvar topic = String( message ),\r\n\t\t\t\tposition = topic.lastIndexOf( '.' );\r\n\r\n\t\t\t// deliver the message as it is now\r\n\t\t\tdeliverMessage(message, message, data, immediateExceptions);\r\n\r\n\t\t\t// trim the hierarchy and deliver message to each level\r\n\t\t\twhile( position !== -1 ){\r\n\t\t\t\ttopic = topic.substr( 0, position );\r\n\t\t\t\tposition = topic.lastIndexOf('.');\r\n\t\t\t\tdeliverMessage( message, topic, data );\r\n\t\t\t}\r\n\t\t};\r\n\t}\r\n\r\n\tfunction messageHasSubscribers( message ){\r\n\t\tvar topic = String( message ),\r\n\t\t\tfound = messages.hasOwnProperty( topic ),\r\n\t\t\tposition = topic.lastIndexOf( '.' );\r\n\r\n\t\twhile ( !found && position !== -1 ){\r\n\t\t\ttopic = topic.substr( 0, position );\r\n\t\t\tposition = topic.lastIndexOf('.');\r\n\t\t\tfound = messages.hasOwnProperty( topic );\r\n\t\t}\r\n\r\n\t\treturn found;\r\n\t}\r\n\r\n\tfunction publish( message, data, sync, immediateExceptions ){\r\n\t\tvar deliver = createDeliveryFunction( message, data, immediateExceptions ),\r\n\t\t\thasSubscribers = messageHasSubscribers( message );\r\n\r\n\t\tif ( !hasSubscribers ){\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tif ( sync === true ){\r\n\t\t\tdeliver();\r\n\t\t} else {\r\n\t\t\tsetTimeout( deliver, 0 );\r\n\t\t}\r\n\t\treturn true;\r\n\t}\r\n\r\n\t/**\r\n\t *\tPubSub.publish( message[, data] ) -> Boolean\r\n\t *\t- message (String): The message to publish\r\n\t *\t- data: The data to pass to subscribers\r\n\t *\tPublishes the the message, passing the data to it's subscribers\r\n\t**/\r\n\tPubSub.publish = function( message, data ){\r\n\t\treturn publish( message, data, false, PubSub.immediateExceptions );\r\n\t};\r\n\r\n\t/**\r\n\t *\tPubSub.publishSync( message[, data] ) -> Boolean\r\n\t *\t- message (String): The message to publish\r\n\t *\t- data: The data to pass to subscribers\r\n\t *\tPublishes the the message synchronously, passing the data to it's subscribers\r\n\t**/\r\n\tPubSub.publishSync = function( message, data ){\r\n\t\treturn publish( message, data, true, PubSub.immediateExceptions );\r\n\t};\r\n\r\n\t/**\r\n\t *\tPubSub.subscribe( message, func ) -> String\r\n\t *\t- message (String): The message to subscribe to\r\n\t *\t- func (Function): The function to call when a new message is published\r\n\t *\tSubscribes the passed function to the passed message. Every returned token is unique and should be stored if\r\n\t *\tyou need to unsubscribe\r\n\t**/\r\n\tPubSub.subscribe = function( message, func ){\r\n\t\t// message is not registered yet\r\n\t\tif ( !messages.hasOwnProperty( message ) ){\r\n\t\t\tmessages[message] = [];\r\n\t\t}\r\n\r\n\t\t// forcing token as String, to allow for future expansions without breaking usage\r\n\t\t// and allow for easy use as key names for the 'messages' object\r\n\t\tvar token = String(++lastUid);\r\n\t\tmessages[message].push( { token : token, func : func } );\r\n\r\n\t\t// return token for unsubscribing\r\n\t\treturn token;\r\n\t};\r\n\r\n\t/**\r\n\t *\tPubSub.unsubscribe( tokenOrFunction ) -> String | Boolean\r\n\t * - tokenOrFunction (String|Function): The token of the function to unsubscribe or func passed in on subscribe\r\n\t * Unsubscribes a specific subscriber from a specific message using the unique token\r\n\t * or if using Function as argument, it will remove all subscriptions with that function\r\n\t**/\r\n\tPubSub.unsubscribe = function( tokenOrFunction ){\r\n\t\tvar isToken = typeof tokenOrFunction === 'string',\r\n\t\t\tkey = isToken ? 'token' : 'func',\r\n\t\t\tsuccesfulReturnValue = isToken ? tokenOrFunction : true,\r\n\r\n\t\t\tresult = false,\r\n\t\t\tm, i;\r\n\r\n\t\tfor ( m in messages ){\r\n\t\t\tif ( messages.hasOwnProperty( m ) ){\r\n\t\t\t\tfor ( i = messages[m].length-1 ; i >= 0; i-- ){\r\n\t\t\t\t\tif ( messages[m][i][key] === tokenOrFunction ){\r\n\t\t\t\t\t\tmessages[m].splice( i, 1 );\r\n\t\t\t\t\t\tresult = succesfulReturnValue;\r\n\r\n\t\t\t\t\t\t// tokens are unique, so we can just return here\r\n\t\t\t\t\t\tif ( isToken ){\r\n\t\t\t\t\t\t\treturn result;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn result;\r\n\t};\r\n\r\n\treturn PubSub;\r\n}));"],"names":["root","factory","exports","module","define","amd","PubSub","window","this","name","version","messages","lastUid","callSubscriberWithDelayedExceptions","subscriber","message","data","ex","setTimeout","callSubscriberWithImmediateExceptions","deliverMessage","originalMessage","matchedMessage","immediateExceptions","i","j","subscribers","callSubscriber","hasOwnProperty","length","func","publish","sync","deliver","topic","String","position","lastIndexOf","substr","messageHasSubscribers","found","publishSync","subscribe","token","push","unsubscribe","tokenOrFunction","m","isToken","key","succesfulReturnValue","result","splice"],"mappings":"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"}