var tname = "/cometd"+message.channel; dojo.publish(tname, [ message ]); } }  this.disconnect = function(){ dojo.forEach(this._subscriptions, dojo.unsubscribe); this._subscriptions = []; this._messageQ = []; if(this._initialized && this.currentTransport){ this._initialized=false; this.currentTransport.disconnect(); } this._initialized=false; if(!this._polling) this._connected=false; }   this.publish = function(/*string*/channel, /*object*/data, /*object*/properties){           var message = { data: data, channel: channel }; if(properties){ dojo.mixin(message, properties); } this._sendMessage(message); 
try { var tname = "/cometd"+message.channel; dojo.publish(tname, [ message ]); }catch(e){ console.debug(e); } } 
dojox.cometd = new function(){		/* cometd states: 	* DISCONNECTED:  _initialized==false && _connected==false 	* CONNECTING:    _initialized==true  && _connected==false (handshake sent) 	* CONNECTED:     _initialized==true  && _connected==true  (first successful connect) 	* DISCONNECTING: _initialized==false && _connected==true  (disconnect sent) 	*/	this._initialized = false;	this._connected = false;	this._polling = false;	this.connectionTypes = new dojo.AdapterRegistry(true);	this.version = "1.0";	this.minimumVersion = "0.9";	this.clientId = null;	this.messageId = 0;	this.batch=0;	this._isXD = false;	this.handshakeReturn = null;	this.currentTransport = null;	this.url = null;	this.lastMessage = null;	this._subscriptions = {};	this._messageQ = [];	this.handleAs="json-comment-optional";	this.advice;	this._deferredSubscribes = {}	this._deferredUnsubscribes = {}	this._subscriptions = [];	this.tunnelInit = function(childLocation, childDomain){		// placeholder	}	this.tunnelCollapse = function(){		console.debug("tunnel collapsed!");		// placeholder	}	this.init = function(root, props, bargs){		// FIXME: if the root isn't from the same host, we should automatically		// try to select an XD-capable transport		props = props||{};		// go ask the short bus server what we can support		props.version = this.version;		props.minimumVersion = this.minimumVersion;		props.channel = "/meta/handshake";		props.id = ""+this.messageId++;		this.url = root||djConfig["cometdRoot"];		if(!this.url){			console.debug("no cometd root specified in djConfig and no root passed");			return;		}		// Are we x-domain? borrowed from dojo.uri.Uri in lieu of fixed host and port properties		var regexp = "^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\\?([^#]*))?(#(.*))?$";		var r = (""+window.location).match(new RegExp(regexp));		if(r[4]){			var tmp = r[4].split(":");			var thisHost = tmp[0];			var thisPort = tmp[1]||"80"; // FIXME: match 443			r = this.url.match(new RegExp(regexp));			if(r[4]){				tmp = r[4].split(":");				var urlHost = tmp[0];				var urlPort = tmp[1]||"80";				this._isXD = ((urlHost != thisHost)||(urlPort != thisPort));			}		}		if(!this._isXD){			if(props.ext){				if(props.ext["json-comment-filtered"]!==true && props.ext["json-comment-filtered"]!==false){					props.ext["json-comment-filtered"] = true;				}			}else{				props.ext = { "json-comment-filtered": true };			}		} 		var bindArgs = {			url: this.url,			handleAs: this.handleAs,			content: { "message": dojo.toJson([props]) },			load: dojo.hitch(this, "finishInit"),			error: function(e){ console.debug("handshake error!:", e); }		};		if(bargs){			dojo.mixin(bindArgs, bargs);		}		this._props=props;		this._initialized=true;		this.batch=0;		this.startBatch();				// if xdomain, then we assume jsonp for handshake		if(this._isXD){			bindArgs.callbackParamName="jsonp";			return dojo.io.script.get(bindArgs);		}		return dojo.xhrPost(bindArgs);	}	this.finishInit = function(data){		data = data[0];		this.handshakeReturn = data;				// pick a transport		if(data["advice"]){			this.advice = data.advice;		}		if(!data.successful){			console.debug("cometd init failed");			if(this.advice && this.advice["reconnect"]=="none"){				return;			}			if( this.advice && this.advice["interval"] && this.advice.interval>0 ){				var cometd=this;				setTimeout(function(){cometd.init(cometd.url,cometd._props);},this.advice.interval);			}else{				this.init(this.url,this._props);			}			return;		}		if(data.version < this.minimumVersion){			console.debug("cometd protocol version mismatch. We wanted", this.minimumVersion, "but got", data.version);			return;		}		this.currentTransport = this.connectionTypes.match(			data.supportedConnectionTypes,			data.version,			this._isXD		);		this.currentTransport._cometd = this;		this.currentTransport.version = data.version;		this.clientId = data.clientId;		this.tunnelInit = dojo.hitch(this.currentTransport, "tunnelInit");		this.tunnelCollapse = dojo.hitch(this.currentTransport, "tunnelCollapse");		this.currentTransport.startup(data);	}	// public API functions called by cometd or by the transport classes	this.deliver = function(messages){		// console.debug(messages);		dojo.forEach(messages, this._deliver, this);		return messages;	}	this._deliver = function(message){		// dipatch events along the specified path		if(!message["channel"]){			if(message["success"] !== true){				console.debug("cometd error: no channel for message!", message);				return;			}		}		this.lastMessage = message;		if(message.advice){			this.advice = message.advice; // TODO maybe merge?		}		// check to see if we got a /meta channel message that we care about		if(	(message["channel"]) &&			(message.channel.length > 5)&&			(message.channel.substr(0, 5) == "/meta")){			// check for various meta topic actions that we need to respond to			switch(message.channel){				case "/meta/connect":					if(message.successful && !this._connected){						this._connected = this._initialized;						this.endBatch();					} else if(!this._initialized){						this._connected = false; // finish disconnect					}					break;				case "/meta/subscribe":					var deferred = this._deferredSubscribes[message.subscription];					if(!message.successful){						if(deferred){							deferred.errback(new Error(message.error));						}						return;					}					dojox.cometd.subscribed(message.subscription, message);					if(deferred){						deferred.callback(true);					}					break;				case "/meta/unsubscribe":					var deferred = this._deferredUnsubscribes[message.subscription];					if(!message.successful){						if(deferred){							deferred.errback(new Error(message.error));						}						return;					}					this.unsubscribed(message.subscription, message);					if(deferred){						deferred.callback(true);					}					break;			}		}				// send the message down for processing by the transport		this.currentTransport.deliver(message);		if(message.data){			// dispatch the message to any locally subscribed listeners			var tname = "/cometd"+message.channel;			dojo.publish(tname, [ message ]);		}	}	this.disconnect = function(){		dojo.forEach(this._subscriptions, dojo.unsubscribe);		this._subscriptions = [];		this._messageQ = [];		if(this._initialized && this.currentTransport){			this._initialized=false;			this.currentTransport.disconnect();		}		this._initialized=false;		if(!this._polling)			this._connected=false;	}	// public API functions called by end users	this.publish = function(/*string*/channel, /*object*/data, /*object*/properties){		// summary:		//		publishes the passed message to the cometd server for delivery		//		on the specified topic		// channel:		//		the destination channel for the message		// data:		//		a JSON object containing the message "payload"		// properties:		//		Optional. Other meta-data to be mixed into the top-level of the		//		message		var message = {			data: data,			channel: channel		};		if(properties){			dojo.mixin(message, properties);		}		this._sendMessage(message);	}	this._sendMessage = function(/* object */ message){		if(this.currentTransport && this._connected && this.batch==0){			return this.currentTransport.sendMessages([message]);		}		else{			this._messageQ.push(message);		}	}	this.subscribe = function(	/*string */		channel,					/*object, optional*/	objOrFunc,					/*string, optional*/	funcName){ // return: boolean		// summary:		//		inform the server of this client's interest in channel		// channel:		//		name of the cometd channel to subscribe to		// objOrFunc:		//		an object scope for funcName or the name or reference to a		//		function to be called when messages are delivered to the		//		channel		// funcName:		//		the second half of the objOrFunc/funcName pair for identifying		//		a callback function to notifiy upon channel message delivery		if(objOrFunc){			var tname = "/cometd"+channel;			var subs=this._subscriptions[tname];			if (!subs || subs.length==0)			{				subs=[];				this._sendMessage({					channel: "/meta/subscribe",					subscription: channel				});								this._deferredSubscribes[channel] = new dojo.Deferred();				if (this._deferredUnsubscribes[channel]){					this._deferredUnsubscribes[channel].cancel();					delete this._deferredUnsubscribes[channel];				}			}						for (var i in subs){				if (subs[i].objOrFunc===objOrFunc&&(!subs[i].funcName&&!funcName||subs[i].funcName==funcName))					return;			}						var topic = dojo.subscribe(tname, objOrFunc, funcName);			subs.push( { topic: topic, objOrFunc: objOrFunc, funcName: funcName });			this._subscriptions[tname] =subs;		}		return this._deferredSubscribes[channel];	}	this.subscribed = function(	/*string*/  channel,					/*obj*/     message){ 	}	this.unsubscribe = function(	/*string*/		channel,					/*object, optional*/	objOrFunc,					/*string, optional*/	funcName){ 		// summary:		//		inform the server of this client's disinterest in channel		// channel:		//		name of the cometd channel to unsubscribe from		// objOrFunc:		//		an object scope for funcName or the name or reference to a		//		function to be called when messages are delivered to the		//		channel. If null then all subscribers to the channel are unsubscribed.		// funcName:		//		the second half of the objOrFunc/funcName pair for identifying		//		a callback function to notifiy upon channel message delivery				var tname = "/cometd"+channel;		var subs=this._subscriptions[tname];		if (!subs || subs.length==0)		      return;		      		var s=0;		for (var i in subs){			var sb=subs[i];			if (!objOrFunc||(sb.objOrFunc===objOrFunc&&(!sb.funcName&&!funcName||sb.funcName==funcName))){				dojo.unsubscribe(subs[i].topic);  				delete subs[i];    			}			else				s++;		}				if (s==0) {			delete this._subscriptions[tname];			this._sendMessage({				channel: "/meta/unsubscribe",				subscription: channel			});			this._deferredUnsubscribes[channel] = new dojo.Deferred();			if (this._deferredSubscribes[channel]){				this._deferredSubscribes[channel].cancel();				delete this._deferredSubscribes[channel];			}		}		return this._deferredUnsubscribes[channel];	}	this.unsubscribed = function(	/*string*/  channel,					/*obj*/     message){	}	this.startBatch = function(){		this.batch++;	}	this.endBatch = function(){		if(--this.batch <= 0 && this.currentTransport && this._connected){			this.batch=0;			var messages=this._messageQ;			this._messageQ=[];			if(messages.length>0){				this.currentTransport.sendMessages(messages);			}		}	}		this._onUnload = function(){		// make this the last of the onUnload method		dojo.addOnUnload(dojox.cometd,"disconnect");	}}
5168	/local1/tlutelli/issta_data/temp/all_js/javascript/2007_temp/2007/5168/4cd022665475a0b318d3210b38e7eaca6874c8dc/cometd.js/buggy/_cometd/cometd.js