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