
(function($)
{$.Cometd=function(name)
{var _name=name||'default';var _logPriorities={debug:1,info:2,warn:3,error:4};var _logLevel='info';var _url;var _xd=false;var _transport;var _status='disconnected';var _messageId=0;var _clientId=null;var _batch=0;var _messageQueue=[];var _listeners={};var _backoff=0;var _backoffIncrement=1000;var _maxBackoff=60000;var _scheduledSend=null;var _extensions=[];var _advice={};var _handshakeProps;this.getName=function()
{return _name;};this.configure=function(cometURL)
{_configure(cometURL);};function _configure(cometURL)
{_url=cometURL;_debug('Initializing comet with url: {}',_url);var urlParts=/(^https?:)?(\/\/(([^:\/\?#]+)(:(\d+))?))?([^\?#]*)/.exec(cometURL);if(urlParts[3])_xd=urlParts[3]!=location.host;if(_xd)
_transport=newCallbackPollingTransport();else
_transport=newLongPollingTransport();_debug('Initial transport is {}',_transport.getType());}
this.init=function(cometURL,handshakeProps)
{_configure(cometURL);_handshake(handshakeProps);};this.handshake=function(handshakeProps)
{_handshake(handshakeProps);};this.disconnect=function(disconnectProps)
{var bayeuxMessage={channel:'/meta/disconnect'};var message=$.extend({},disconnectProps,bayeuxMessage);_setStatus('disconnecting');_deliver([message],false);};this.startBatch=function()
{_startBatch();};this.endBatch=function()
{_endBatch(true);};this.subscribe=function(channel,scope,callback,subscribeProps)
{var subscription=this.addListener(channel,scope,callback);var bayeuxMessage={channel:'/meta/subscribe',subscription:channel};var message=$.extend({},subscribeProps,bayeuxMessage);_send(message);return subscription;};this.unsubscribe=function(subscription,unsubscribeProps)
{this.removeListener(subscription);var bayeuxMessage={channel:'/meta/unsubscribe',subscription:subscription[0]};var message=$.extend({},unsubscribeProps,bayeuxMessage);_send(message);};this.publish=function(channel,content,publishProps)
{var bayeuxMessage={channel:channel,data:content};var message=$.extend({},publishProps,bayeuxMessage);_send(message);};this.addListener=function(channel,scope,callback)
{if(!callback)
{callback=scope;scope=undefined;}
var subscription={scope:scope,callback:callback};var subscriptions=_listeners[channel];if(!subscriptions)
{subscriptions=[];_listeners[channel]=subscriptions;}
var subscriptionIndex=subscriptions.push(subscription)-1;_debug('Added listener: channel \'{}\', callback \'{}\', index {}',channel,callback.name,subscriptionIndex);return[channel,subscriptionIndex];};this.removeListener=function(subscription)
{var subscriptions=_listeners[subscription[0]];if(subscriptions)
{delete subscriptions[subscription[1]];_debug('Removed listener: channel \'{}\', index {}',subscription[0],subscription[1]);}};this.clearListeners=function()
{_listeners={};};this.getStatus=function()
{return _status;};this.setBackoffIncrement=function(period)
{_backoffIncrement=period;};this.getBackoffIncrement=function()
{return _backoffIncrement;};this.getBackoffPeriod=function()
{return _backoff;};this.setLogLevel=function(level)
{_logLevel=level;};this.registerExtension=function(name,extension)
{var existing=false;$.each(_extensions,function(index,extension)
{if(extension.name==name)
{existing=true;return false;}});if(!existing)
{_extensions.push({name:name,extension:extension});_debug('Registered extension \'{}\'',name);return true;}
else
{_info('Could not register extension with name \'{}\': another extension with the same name already exists');return false;}};this.unregisterExtension=function(name)
{var unregistered=false;$.each(_extensions,function(index,extension)
{if(extension.name==name)
{_extensions.splice(index,1);unregistered=true;_debug('Unregistered extension \'{}\'',name);return false;}});return unregistered;};function _startBatch()
{++_batch;}
function _endBatch(deliverMessages)
{--_batch;if(_batch<0)_batch=0;if(deliverMessages&&_batch==0&&!_isDisconnected())
{var messages=_messageQueue;_messageQueue=[];if(messages.length>0)_deliver(messages,false);}}
function _nextMessageId()
{return++_messageId;}
function _convertToMessages(response)
{if(response===undefined)return[];if(response instanceof Array)return response;if(response instanceof String||typeof response=='string')return eval('('+response+')');if(response instanceof Object)return[response];throw'Conversion Error '+response+', typeof '+(typeof response);}
function _setStatus(newStatus)
{_debug('{} -> {}',_status,newStatus);_status=newStatus;}
function _isDisconnected()
{return _status=='disconnecting'||_status=='disconnected';}
function _handshake(handshakeProps)
{_debug('Starting handshake');_clientId=null;_batch=0;_startBatch();_handshakeProps=$.extend(true,{},handshakeProps);var bayeuxMessage={version:'1.0',minimumVersion:'0.9',channel:'/meta/handshake',supportedConnectionTypes:_xd?['callback-polling']:['long-polling','callback-polling']};var message=$.extend({},handshakeProps,bayeuxMessage);_setStatus('handshaking');_deliver([message],false);}
function _findTransport(handshakeResponse)
{var transportTypes=handshakeResponse.supportedConnectionTypes;if(_xd)
{if($.inArray('callback-polling',transportTypes)>=0)return _transport;}
else
{if($.inArray('long-polling',transportTypes)>=0)return _transport;if($.inArray('callback-polling',transportTypes)>=0)return newCallbackPollingTransport();}
return null;}
function _delayedHandshake()
{_setStatus('handshaking');_delayedSend(function()
{_handshake(_handshakeProps);});}
function _delayedConnect()
{_setStatus('connecting');_delayedSend(function()
{_connect();});}
function _delayedSend(operation)
{_cancelDelayedSend();var delay=_backoff;_debug("Delayed send: backoff {}, interval {}",_backoff,_advice.interval);if(_advice.interval&&_advice.interval>0)
delay+=_advice.interval;_scheduledSend=_setTimeout(operation,delay);}
function _cancelDelayedSend()
{if(_scheduledSend!==null)clearTimeout(_scheduledSend);_scheduledSend=null;}
function _setTimeout(funktion,delay)
{return setTimeout(function()
{try
{funktion();}
catch(x)
{_debug('Exception during scheduled execution of function \'{}\': {}',funktion.name,x);}},delay);}
function _connect()
{_debug('Starting connect');var message={channel:'/meta/connect',connectionType:_transport.getType()};_setStatus('connecting');_deliver([message],true);_setStatus('connected');}
function _send(message)
{if(_batch>0)
_messageQueue.push(message);else
_deliver([message],false);}
function _deliver(messages,comet)
{$.each(messages,function(index,message)
{message['id']=_nextMessageId();if(_clientId)message['clientId']=_clientId;messages[index]=_applyOutgoingExtensions(message);});var self=this;var envelope={url:_url,messages:messages,onSuccess:function(request,response)
{try
{_handleSuccess.call(self,request,response,comet);}
catch(x)
{_debug('Exception during execution of success callback: {}',x);}},onFailure:function(request,reason,exception)
{try
{_handleFailure.call(self,request,messages,reason,exception,comet);}
catch(x)
{_debug('Exception during execution of failure callback: {}',x);}}};_debug('Sending request to {}, message(s): {}',envelope.url,JSON.stringify(envelope.messages));_transport.send(envelope,comet);}
function _applyIncomingExtensions(message)
{$.each(_extensions,function(index,extension)
{var callback=extension.extension.incoming;if(callback&&typeof callback==='function')
{_debug('Calling incoming extension \'{}\', callback \'{}\'',extension.name,callback.name);message=_applyExtension(extension.name,callback,message)||message;}});return message;}
function _applyOutgoingExtensions(message)
{$.each(_extensions,function(index,extension)
{var callback=extension.extension.outgoing;if(callback&&typeof callback==='function')
{_debug('Calling outgoing extension \'{}\', callback \'{}\'',extension.name,callback.name);message=_applyExtension(extension.name,callback,message)||message;}});return message;}
function _applyExtension(name,callback,message)
{try
{return callback(message);}
catch(x)
{_debug('Exception during execution of extension \'{}\': {}',name,x);return message;}}
function _handleSuccess(request,response,comet)
{var messages=_convertToMessages(response);_debug('Received response {}',JSON.stringify(messages));var success=true;$.each(messages,function(index,message)
{message=_applyIncomingExtensions(message);if(message.advice)_advice=message.advice;var successful=message.successful;success=success&&(successful===undefined||successful);var channel=message.channel;switch(channel)
{case'/meta/handshake':_handshakeSuccess(message);break;case'/meta/connect':_connectSuccess(message);break;case'/meta/disconnect':_disconnectSuccess(message);break;case'/meta/subscribe':_subscribeSuccess(message);break;case'/meta/unsubscribe':_unsubscribeSuccess(message);break;default:_messageSuccess(message);break;}});_transport.complete(request,success,comet);}
function _handleFailure(request,messages,reason,exception,comet)
{var xhr=request.xhr;_debug('Request failed, status: {}, reason: {}, exception: {}',xhr&&xhr.status,reason,exception);$.each(messages,function(index,message)
{var channel=message.channel;switch(channel)
{case'/meta/handshake':_handshakeFailure(xhr,message);break;case'/meta/connect':_connectFailure(xhr,message);break;case'/meta/disconnect':_disconnectFailure(xhr,message);break;case'/meta/subscribe':_subscribeFailure(xhr,message);break;case'/meta/unsubscribe':_unsubscribeFailure(xhr,message);break;default:_messageFailure(xhr,message);break;}});_transport.complete(request,false,comet);}
function _handshakeSuccess(message)
{if(message.successful)
{_debug('Handshake successful');_clientId=message.clientId;var newTransport=_findTransport(message);if(newTransport===null)
{throw'Could not agree on transport with server';}
else
{if(_transport.getType()!=newTransport.getType())
{_debug('Changing transport from {} to {}',_transport.getType(),newTransport.getType());_transport=newTransport;}}
_notifyListeners('/meta/handshake',message);var action=_advice.reconnect?_advice.reconnect:'retry';switch(action)
{case'retry':_delayedConnect();break;default:break;}}
else
{_debug('Handshake unsuccessful');var retry=!_isDisconnected()&&_advice.reconnect!='none';if(!retry)_setStatus('disconnected');_notifyListeners('/meta/handshake',message);_notifyListeners('/meta/unsuccessful',message);if(retry)
{_increaseBackoff();_debug('Handshake failure, backing off and retrying in {} ms',_backoff);_delayedHandshake();}}}
function _handshakeFailure(xhr,message)
{_debug('Handshake failure');var failureMessage={successful:false,failure:true,channel:'/meta/handshake',request:message,xhr:xhr,advice:{action:'retry',interval:_backoff}};var retry=!_isDisconnected()&&_advice.reconnect!='none';if(!retry)_setStatus('disconnected');_notifyListeners('/meta/handshake',failureMessage);_notifyListeners('/meta/unsuccessful',failureMessage);if(retry)
{_increaseBackoff();_debug('Handshake failure, backing off and retrying in {} ms',_backoff);_delayedHandshake();}}
function _connectSuccess(message)
{var action=_isDisconnected()?'none':(_advice.reconnect?_advice.reconnect:'retry');if(!_isDisconnected())_setStatus(action=='retry'?'connecting':'disconnecting');if(message.successful)
{_debug('Connect successful');_notifyListeners('/meta/connect',message);switch(action)
{case'retry':_resetBackoff();_delayedConnect();break;default:_resetBackoff();_setStatus('disconnected');break;}
_endBatch(true);}
else
{_debug('Connect unsuccessful');_notifyListeners('/meta/connect',message);_notifyListeners('/meta/unsuccessful',message);switch(action)
{case'retry':_increaseBackoff();_delayedConnect();break;case'handshake':_endBatch(false);_resetBackoff();_delayedHandshake();break;case'none':_resetBackoff();_setStatus('disconnected');break;}}}
function _connectFailure(xhr,message)
{_debug('Connect failure');var failureMessage={successful:false,failure:true,channel:'/meta/connect',request:message,xhr:xhr,advice:{action:'retry',interval:_backoff}};_notifyListeners('/meta/connect',failureMessage);_notifyListeners('/meta/unsuccessful',failureMessage);if(!_isDisconnected())
{var action=_advice.reconnect?_advice.reconnect:'retry';switch(action)
{case'retry':_increaseBackoff();_debug('Connect failure, backing off and retrying in {} ms',_backoff);_delayedConnect();break;case'handshake':_resetBackoff();_delayedHandshake();break;case'none':_resetBackoff();break;default:_debug('Unrecognized reconnect value: {}',action);break;}}}
function _disconnectSuccess(message)
{if(message.successful)
{_debug('Disconnect successful');_disconnect(false);_notifyListeners('/meta/disconnect',message);}
else
{_debug('Disconnect unsuccessful');_disconnect(true);_notifyListeners('/meta/disconnect',message);_notifyListeners('/meta/usuccessful',message);}}
function _disconnect(abort)
{_cancelDelayedSend();if(abort)_transport.abort();_clientId=null;_setStatus('disconnected');_batch=0;_messageQueue=[];_resetBackoff();}
function _disconnectFailure(xhr,message)
{_debug('Disconnect failure');_disconnect(true);var failureMessage={successful:false,failure:true,channel:'/meta/disconnect',request:message,xhr:xhr,advice:{action:'none',interval:0}};_notifyListeners('/meta/disconnect',failureMessage);_notifyListeners('/meta/unsuccessful',failureMessage);}
function _subscribeSuccess(message)
{if(message.successful)
{_debug('Subscribe successful');_notifyListeners('/meta/subscribe',message);}
else
{_debug('Subscribe unsuccessful');_notifyListeners('/meta/subscribe',message);_notifyListeners('/meta/unsuccessful',message);}}
function _subscribeFailure(xhr,message)
{_debug('Subscribe failure');var failureMessage={successful:false,failure:true,channel:'/meta/subscribe',request:message,xhr:xhr,advice:{action:'none',interval:0}};_notifyListeners('/meta/subscribe',failureMessage);_notifyListeners('/meta/unsuccessful',failureMessage);}
function _unsubscribeSuccess(message)
{if(message.successful)
{_debug('Unsubscribe successful');_notifyListeners('/meta/unsubscribe',message);}
else
{_debug('Unsubscribe unsuccessful');_notifyListeners('/meta/unsubscribe',message);_notifyListeners('/meta/unsuccessful',message);}}
function _unsubscribeFailure(xhr,message)
{_debug('Unsubscribe failure');var failureMessage={successful:false,failure:true,channel:'/meta/unsubscribe',request:message,xhr:xhr,advice:{action:'none',interval:0}};_notifyListeners('/meta/unsubscribe',failureMessage);_notifyListeners('/meta/unsuccessful',failureMessage);}
function _messageSuccess(message)
{if(message.successful===undefined)
{if(message.data)
{_notifyListeners(message.channel,message);}
else
{_debug('Unknown message {}',JSON.stringify(message));}}
else
{if(message.successful)
{_debug('Publish successful');_notifyListeners('/meta/publish',message);}
else
{_debug('Publish unsuccessful');_notifyListeners('/meta/publish',message);_notifyListeners('/meta/unsuccessful',message);}}}
function _messageFailure(xhr,message)
{_debug('Publish failure');var failureMessage={successful:false,failure:true,channel:message.channel,request:message,xhr:xhr,advice:{action:'none',interval:0}};_notifyListeners('/meta/publish',failureMessage);_notifyListeners('/meta/unsuccessful',failureMessage);}
function _notifyListeners(channel,message)
{_notify(channel,message);var channelParts=channel.split("/");var last=channelParts.length-1;for(var i=last;i>0;--i)
{var channelPart=channelParts.slice(0,i).join('/')+'/*';if(i==last)_notify(channelPart,message);channelPart+='*';_notify(channelPart,message);}}
function _notify(channel,message)
{var subscriptions=_listeners[channel];if(subscriptions&&subscriptions.length>0)
{$.each(subscriptions,function(index,subscription)
{if(subscription)
{try
{_debug('Notifying subscription: channel \'{}\', callback \'{}\'',channel,subscription.callback.name);subscription.callback.call(subscription.scope,message);}
catch(x)
{_warn('Exception during execution of callback \'{}\' on channel \'{}\' for message {}, exception: {}',subscription.callback.name,channel,JSON.stringify(message),x);}}});}}
function _resetBackoff()
{_backoff=0;}
function _increaseBackoff()
{if(_backoff<_maxBackoff)_backoff+=_backoffIncrement;}
var _error=this._error=function(text,args)
{_log('error',_format.apply(this,arguments));};var _warn=this._warn=function(text,args)
{_log('warn',_format.apply(this,arguments));};var _info=this._info=function(text,args)
{_log('info',_format.apply(this,arguments));};var _debug=this._debug=function(text,args)
{_log('debug',_format.apply(this,arguments));};function _log(level,text)
{var priority=_logPriorities[level];var configPriority=_logPriorities[_logLevel];if(!configPriority)configPriority=_logPriorities['info'];if(priority>=configPriority)
{if(window.console)window.console.log(text);}}
function _format(text)
{var braces=/\{\}/g;var result='';var start=0;var count=0;while(braces.test(text))
{result+=text.substr(start,braces.lastIndex-start-2);var arg=arguments[++count];result+=arg!==undefined?arg:'{}';start=braces.lastIndex;}
result+=text.substr(start,text.length-start);return result;}
function newLongPollingTransport()
{return $.extend({},new Transport('long-polling'),new LongPollingTransport());}
function newCallbackPollingTransport()
{return $.extend({},new Transport('callback-polling'),new CallbackPollingTransport());}
var Transport=function(type)
{var _maxRequests=2;var _requestIds=0;var _cometRequest=null;var _requests=[];var _pendingPacket=null;this.getType=function()
{return type;};this.send=function(packet,comet)
{if(comet)
_cometSend(this,packet);else
_send(this,packet);};function _cometSend(self,packet)
{if(_cometRequest!==null)throw'Concurrent comet requests not allowed, request '+_cometRequest.id+' not yet completed';var requestId=++_requestIds;_debug('Beginning comet request {}',requestId);var request={id:requestId};self.deliver(packet,request);_cometRequest=request;}
function _send(self,packet)
{if(_requests.length<_maxRequests-1)
{var requestId=++_requestIds;var request={id:requestId};_debug('Delivering request {}',requestId);self.deliver(packet,request);_requests.push(request);}
else if(_pendingPacket)
{var p=_pendingPacket[0];p.messages=p.messages.concat(packet.messages);var request=_pendingPacket[1];_pendingPacket=[p,request];}
else
{var requestId=++_requestIds;var request={id:requestId};_pendingPacket=[packet,request];}}
this.complete=function(request,success,comet)
{if(comet)
_cometComplete(request);else
_complete(this,request,success);};function _cometComplete(request)
{var requestId=request.id;if(_cometRequest!==request)throw'Comet request mismatch, completing request '+requestId;_cometRequest=null;_debug('Ended comet request {}',requestId);}
function _complete(self,request,success)
{var requestId=request.id;var index=$.inArray(request,_requests);if(index>=0)_requests.splice(index,1);if(_pendingPacket)
{if(success)
{_send(self,_pendingPacket[0]);}
else
{_pendingPacket[0].onFailure(_pendingPacket[1],'error');}}
_pendingPacket=null;}
this.abort=function()
{$.each(_requests,function(index,request)
{_debug('Aborting request {}',request.id);if(request.xhr)request.xhr.abort();});if(_cometRequest)
{_debug('Aborting comet request {}',_cometRequest.id);if(_cometRequest.xhr)_cometRequest.xhr.abort();}
_cometRequest=null;_requests=[];_pendingPacket=null;};};var LongPollingTransport=function()
{this.deliver=function(packet,request)
{request.xhr=$.ajax({url:packet.url,type:'POST',contentType:'text/json;charset=UTF-8',beforeSend:function(xhr)
{xhr.setRequestHeader('Connection','Keep-Alive');return true;},data:JSON.stringify(packet.messages),success:function(response){packet.onSuccess(request,response);},error:function(xhr,reason,exception){packet.onFailure(request,reason,exception);}});};};var CallbackPollingTransport=function()
{var _maxLength=2048;this.deliver=function(packet,request)
{var messages=JSON.stringify(packet.messages);var urlLength=packet.url.length+messages.length;if(urlLength>_maxLength)
{var x=packet.messages.length>1?'Too many bayeux messages in the same batch resulting in message too big '+'('+urlLength+' bytes, max is '+_maxLength+') for transport '+this.getType():'Bayeux message too big ('+urlLength+' bytes, max is '+_maxLength+') '+'for transport '+this.getType();_setTimeout(function(){packet.onFailure(request,'error',x);},0);}
else
{$.ajax({url:packet.url,type:'GET',dataType:'jsonp',jsonp:'jsonp',beforeSend:function(xhr)
{xhr.setRequestHeader('Connection','Keep-Alive');return true;},data:{message:messages},success:function(response){packet.onSuccess(request,response);},error:function(xhr,reason,exception){packet.onFailure(request,reason,exception);}});}};};};$.cometd=new $.Cometd();})(jQuery);