/******************************************************************************* * OpenAjax.js * * Reference implementation of the OpenAjax Hub, as specified by OpenAjax Alliance. * Specification is under development at: * * http://www.openajax.org/member/wiki/OpenAjax_Hub_Specification * * Copyright 2006-2008 OpenAjax Alliance * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy * of the License at http://www.apache.org/licenses/LICENSE-2.0 . Unless * required by applicable law or agreed to in writing, software distributed * under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR * CONDITIONS OF ANY KIND, either express or implied. See the License for the * specific language governing permissions and limitations under the License. * ******************************************************************************/ // prevent re-definition of the OpenAjax object if(!window["OpenAjax"]){ OpenAjax = new function(){ var t = true; var f = false; var g = window; var libs; var ooh = "org.openajax.hub."; var h = {}; this.hub = h; h.implementer = "http://openajax.org"; h.implVersion = "1.0"; h.specVersion = "1.0"; h.implExtraData = {}; var libs = {}; h.libraries = libs; h.registerLibrary = function(prefix, nsURL, version, extra){ libs[prefix] = { prefix: prefix, namespaceURI: nsURL, version: version, extraData: extra }; this.publish(ooh+"registerLibrary", libs[prefix]); } h.unregisterLibrary = function(prefix){ this.publish(ooh+"unregisterLibrary", libs[prefix]); delete libs[prefix]; } h._subscriptions = { c:{}, s:[] }; h._cleanup = []; h._subIndex = 0; h._pubDepth = 0; h.subscribe = function(name, callback, scope, subscriberData, filter) { if(!scope){ scope = window; } var handle = name + "." + this._subIndex; var sub = { scope: scope, cb: callback, fcb: filter, data: subscriberData, sid: this._subIndex++, hdl: handle }; var path = name.split("."); this._subscribe(this._subscriptions, path, 0, sub); return handle; } h.publish = function(name, message) { var path = name.split("."); this._pubDepth++; this._publish(this._subscriptions, path, 0, name, message); this._pubDepth--; if((this._cleanup.length > 0) && (this._pubDepth == 0)) { for(var i = 0; i < this._cleanup.length; i++) this.unsubscribe(this._cleanup[i].hdl); delete(this._cleanup); this._cleanup = []; } } h.unsubscribe = function(sub) { var path = sub.split("."); var sid = path.pop(); this._unsubscribe(this._subscriptions, path, 0, sid); } h._subscribe = function(tree, path, index, sub) { var token = path[index]; if(index == path.length) tree.s.push(sub); else { if(typeof tree.c == "undefined") tree.c = {}; if(typeof tree.c[token] == "undefined") { tree.c[token] = { c: {}, s: [] }; this._subscribe(tree.c[token], path, index + 1, sub); } else this._subscribe( tree.c[token], path, index + 1, sub); } } h._publish = function(tree, path, index, name, msg) { if(typeof tree != "undefined") { var node; if(index == path.length) { node = tree; } else { this._publish(tree.c[path[index]], path, index + 1, name, msg); this._publish(tree.c["*"], path, index + 1, name, msg); node = tree.c["**"]; } if(typeof node != "undefined") { var callbacks = node.s; var max = callbacks.length; for(var i = 0; i < max; i++) { if(callbacks[i].cb) { var sc = callbacks[i].scope; var cb = callbacks[i].cb; var fcb = callbacks[i].fcb; var d = callbacks[i].data; if(typeof cb == "string"){ // get a function object cb = sc[cb]; } if(typeof fcb == "string"){ // get a function object fcb = sc[fcb]; } if((!fcb) || (fcb.call(sc, name, msg, d))) { cb.call(sc, name, msg, d); } } } } } } h._unsubscribe = function(tree, path, index, sid) { if(typeof tree != "undefined") { 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) return; delete tree.c[path[index]]; } return; } else { var callbacks = tree.s; var max = callbacks.length; for(var i = 0; i < max; i++) if(sid == callbacks[i].sid) { if(this._pubDepth > 0) { callbacks[i].cb = null; this._cleanup.push(callbacks[i]); } else callbacks.splice(i, 1); return; } } } } // The following function is provided for automatic testing purposes. // It is not expected to be deployed in run-time OpenAjax Hub implementations. h.reinit = function() { for (var lib in OpenAjax.hub.libraries) { delete OpenAjax.hub.libraries[lib]; } OpenAjax.hub.registerLibrary("OpenAjax", "http://openajax.org/hub", "1.0", {}); delete OpenAjax._subscriptions; OpenAjax._subscriptions = {c:{},s:[]}; delete OpenAjax._cleanup; OpenAjax._cleanup = []; OpenAjax._subIndex = 0; OpenAjax._pubDepth = 0; } }; // Register the OpenAjax Hub itself as a library. OpenAjax.hub.registerLibrary("OpenAjax", "http://openajax.org/hub", "1.0", {}); }