/** * Copyright (c) 2006-2007, TIBCO Software Inc. * Use, modification, and distribution subject to terms of license. * * TIBCO(R) PageBus 1.1.0 */ if(typeof window.PageBus == 'undefined') { PageBus = { version: "1.1.0", S: {c:{},s:[]}, X: 0, P: 0, U: [], H: "undefined" }; PageBus.subscribe = function(name, scope, callback, subscriberData) { if(name == null) this._badName(); if(scope == null) scope = window; var path = name.split("."); var sub = { f: callback, d: subscriberData, i: this.X++, p: path, w: scope }; for(var i = 0; i < path.length; i++) { if((path[i].indexOf("*") != -1) && (path[i] != "*") && (path[i] != "**")) this._badName(); } this._subscribe(this.S, path, 0, sub); return sub; } PageBus.publish = function (name, message) { if((name == null) || (name.indexOf("*") != -1)) this._badName(); var path = name.split("."); if(this.P > 100) this._throw("StackOverflow"); try { this.P++; this._publish(this.S, path, 0, name, message); } catch(err) { this.P--; throw err; } try { this.P--; if((this.U.length > 0) && (this.P == 0)) { for(var i = 0; i < this.U.length; i++) this.unsubscribe(this.U[i]); this.U = []; } } catch(err) { // All unsubscribe exceptions should already have // been handled when unsubscribe was called in the // publish callback. This is a repeat appearance // of this exception. Discard it. } } PageBus.unsubscribe = function(sub) { this._unsubscribe(this.S, sub.p, 0, sub.i); } /* * @private @jsxobf-clobber */ PageBus._throw = function(n) { throw new Error("PageBus." + n); } /* * @private @jsxobf-clobber */ PageBus._badName = function(n) { this._throw("BadName"); } /* * @private @jsxobf-clobber */ PageBus._subscribe = function(tree, path, index, sub) { var tok = path[index]; if(tok == "") this._badName(); if(index == path.length) tree.s.push(sub); else { if(typeof tree.c == this.H) tree.c = {}; if(typeof tree.c[tok] == this.H) { try { tree.c[tok] = { c: {}, s: [] }; this._subscribe(tree.c[tok], path, index + 1, sub); } catch(err) { delete tree.c[tok]; throw err; } } else this._subscribe( tree.c[tok], path, index + 1, sub ); } } /* * @private @jsxobf-clobber */ PageBus._publish = function(tree, path, index, name, msg) { if(path[index] == "") this._badName(); if(typeof tree != this.H) { if(index < path.length) { this._publish(tree.c[path[index]], path, index + 1, name, msg); this._publish(tree.c["*"], path, index + 1, name, msg); this._call(tree.c["**"], name, msg); } else this._call(tree, name, msg); } } /* * @private @jsxobf-clobber */ PageBus._call = function(node, name, msg) { if(typeof node != this.H) { var callbacks = node.s; var max = callbacks.length; for(var i = 0; i < max; i++) if(callbacks[i].f != null) callbacks[i].f.apply(callbacks[i].w, [name, msg, callbacks[i].d]); } } /* * @jsxobf-clobber */ PageBus._unsubscribe = function(tree, path, index, sid) { if(typeof tree != this.H) { if(index < path.length) { var childNode = tree.c[path[index]]; this._unsubscribe(childNode, path, index + 1, sid); if(childNode.s.length == 0) { for(var x in childNode.c) // not empty. We're done. return; delete tree.c[path[index]]; // if we got here, c is empty } return; } else { var callbacks = tree.s; var max = callbacks.length; for(var i = 0; i < max; i++) { if(sid == callbacks[i].i) { if(this.P > 0) { if(callbacks[i].f == null) this._throw("BadParameter"); callbacks[i].f = null; this.U.push(callbacks[i]); } else callbacks.splice(i, 1); return; } } // Not found. Fall through } } this._throw("BadParameter"); } }