{"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","found","messageHasSubscribers","publishSync","subscribe","token","push","unsubscribe","tokenOrFunction","m","isToken","key","succesfulReturnValue","result","splice"],"mappings":"CAgBC,SAASA,EAAMC,gBAIQ,iBAAZC,QACVC,OAAOD,QAAUD,IAGW,mBAAXG,QAAyBA,OAAOC,IACjDD,OAAOH,GAGPD,EAAKM,OAASL,IAZhB,CAcuB,iBAAXM,QAAuBA,QAAYC,KAAM,wBAIpD,IAAIF,EAAS,CACXG,KAAM,WACNC,QAAS,SAEVC,EAAW,GACXC,GAAW,EAYZ,SAASC,EAAqCC,EAAYC,EAASC,GAClE,IACCF,EAAYC,EAASC,GACpB,MAAOC,GACRC,YAVuBD,EAUKA,EATtB,WACN,MAAMA,IAQ4B,GAVpC,IAAyBA,EAczB,SAASE,EAAuCL,EAAYC,EAASC,GACpEF,EAAYC,EAASC,GAGtB,SAASI,EAAgBC,EAAiBC,EAAgBN,EAAMO,GAC/D,IAECC,EAAGC,EAFAC,EAAcf,EAASW,GAC1BK,EAAiBJ,EAAsBJ,EAAwCN,EAGhF,GAAMF,EAASiB,eAAgBN,GAI/B,IAAME,EAAI,EAAGC,EAAIC,EAAYG,OAAQL,EAAIC,EAAGD,IAC3CG,EAAgBD,EAAYF,GAAGM,KAAMT,EAAiBL,GAmCxD,SAASe,EAAShB,EAASC,EAAMgB,EAAMT,GA/BGP,EAgCMA,EAhCAO,EAgCMA,EAArD,IAhCgCR,EAASC,EAAMO,EAgC3CU,EA/BG,WACN,IAAIC,EAAQC,OAAQpB,GACnBqB,EAAWF,EAAMG,YAAa,KAM/B,IAHAjB,EAAeL,EAASA,EAASC,EAAMO,IAGlB,IAAda,GAENA,GADAF,EAAQA,EAAMI,OAAQ,EAAGF,IACRC,YAAY,KAC7BjB,EAAgBL,EAASmB,EAAOlB,IAuBlC,QAlBD,SAAgCD,GAK/B,IAJA,IAAImB,EAAQC,OAAQpB,GACnBwB,EAAQ5B,EAASiB,eAAgBM,GACjCE,EAAWF,EAAMG,YAAa,MAEtBE,IAAuB,IAAdH,GAEjBA,GADAF,EAAQA,EAAMI,OAAQ,EAAGF,IACRC,YAAY,KAC7BE,EAAQ5B,EAASiB,eAAgBM,GAGlC,OAAOK,EAKWC,CAjCczB,EAgCMA,MAOxB,IAATiB,EACJC,IAEAf,WAAYe,EAAS,IAEf,GA8ER,OArEA3B,EAAOyB,QAAU,SAAUhB,EAASC,GACnC,OAAOe,EAAShB,EAASC,GAAM,EAAOV,EAAOiB,sBAS9CjB,EAAOmC,YAAc,SAAU1B,EAASC,GACvC,OAAOe,EAAShB,EAASC,GAAM,EAAMV,EAAOiB,sBAU7CjB,EAAOoC,UAAY,SAAU3B,EAASe,GAE/BnB,EAASiB,eAAgBb,KAC9BJ,EAASI,GAAW,IAKrB,IAAI4B,EAAQR,SAASvB,GAIrB,OAHAD,EAASI,GAAS6B,KAAM,CAAED,MAAQA,EAAOb,KAAOA,IAGzCa,GASRrC,EAAOuC,YAAc,SAAUC,GAC9B,IAKCC,EAAGvB,EALAwB,EAAqC,iBAApBF,EACpBG,EAAMD,EAAU,QAAU,OAC1BE,GAAuBF,GAAUF,EAEjCK,GAAS,EAGV,IAAMJ,KAAKpC,EACV,GAAKA,EAASiB,eAAgBmB,GAC7B,IAAMvB,EAAIb,EAASoC,GAAGlB,OAAO,EAAS,GAALL,EAAQA,IACxC,GAAKb,EAASoC,GAAGvB,GAAGyB,KAASH,IAC5BnC,EAASoC,GAAGK,OAAQ5B,EAAG,GACvB2B,EAASD,EAGJF,GACJ,OAAOG,EAOZ,OAAOA,GAGD7C"}