Removing atmosphere, revert to plain websockets
Project: http://git-wip-us.apache.org/repos/asf/incubator-wave/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-wave/commit/38bc93ea Tree: http://git-wip-us.apache.org/repos/asf/incubator-wave/tree/38bc93ea Diff: http://git-wip-us.apache.org/repos/asf/incubator-wave/diff/38bc93ea Branch: refs/heads/master Commit: 38bc93ea0fa9270785233170cc0f50eab6a59540 Parents: d35211b Author: Pablo Ojanguren <pablo...@gmail.com> Authored: Mon Apr 17 16:00:34 2017 +0200 Committer: wisebaldone <ehu...@gmail.com> Committed: Tue Apr 25 00:40:52 2017 +1000 ---------------------------------------------------------------------- wave/build.gradle | 20 +- .../compile/runtime/javascript-2.1.5.war | Bin 35299 -> 0 bytes .../javascript/atmosphere-min.js | 1028 ------ .../javascript-2.1.5/javascript/atmosphere.js | 3081 ------------------ .../box/server/rpc/ServerRpcProvider.java | 283 +- .../rpc/atmosphere/AtmosphereChannel.java | 116 - .../atmosphere/AtmosphereClientInterceptor.java | 103 - .../rpc/atmosphere/GuiceAtmosphereFactory.java | 71 - .../box/webclient/client/WaveSocketFactory.java | 52 +- .../webclient/client/WaveWebSocketClient.java | 16 +- .../client/atmosphere/AtmosphereConnection.java | 53 - .../atmosphere/AtmosphereConnectionImpl.java | 232 -- .../AtmosphereConnectionListener.java | 48 - .../atmosphere/AtmosphereConnectionState.java | 53 - 14 files changed, 68 insertions(+), 5088 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-wave/blob/38bc93ea/wave/build.gradle ---------------------------------------------------------------------- diff --git a/wave/build.gradle b/wave/build.gradle index f67a9fa..232a286 100644 --- a/wave/build.gradle +++ b/wave/build.gradle @@ -124,10 +124,26 @@ dependencies { [group: "commons-httpclient", name: "commons-httpclient", version: "3.1"], // [?, ?] [group: "commons-lang", name: "commons-lang", version: "2.5"], // [?, ?] [group: "commons-fileupload", name: "commons-fileupload", version: "1.3.2"], // [11/2016, 6/2017] + [group: "commons-logging", name: "commons-logging-api", version: "1.1"], // [?, ?] + [group: "commons-logging", name: "commons-logging", version: "1.1.1"], // [?, ?] + [group: "com.google.code.findbugs", name: "jsr305", version: "2.0.1"], // [?, ?] + [group: "com.google.code.gson", name: "gson", version: "2.2.4"], // [?, ?] + [group: "com.google.guava", name: "guava", version: "20.0"], // [?, ?] + [group: "com.google.guava", name: "guava-gwt", version: "20.0"], // [?, ?] + [group: "com.google.gxp", name: "google-gxp", version: "0.2.4-beta"], // [?, ?] + [group: "com.google.inject.extensions", name: "guice-assistedinject", version: "3.0"], // [?, ?] + [group: "com.google.inject.extensions", name: "guice-servlet", version: "3.0"], // [?, ?] + [group: "com.google.inject", name: "guice", version: "3.0"], // [?, ?] + [group: "com.google.protobuf", name: "protobuf-java", version: "2.6.1"], // [?, ?] + [group: "com.google.inject", name: "guice", version:"4.1.0"], // [?, ?] + [group: "com.google.inject.extensions", name: "guice-servlet", version:"4.1.0"], // [?, ?] + [group: "com.googlecode.protobuf-java-format", name: "protobuf-java-format", version: "1.2"], // [?, ?] + [group: "com.typesafe", name: "config", version: "1.2.1"], // [?, ?] + [group: "dom4j", name: "dom4j", version: "1.6.1"], // [?, ?] + [group: "eu.infomas", name: "annotation-detector", version: "3.0.0"], // [?, ?] + [group: "org.antlr", name: "antlr", version: "3.2"], // [?, ?] [group: "org.apache.velocity", name: "velocity", version: "1.6.3"], // [?, ?] [group: "org.apache.lucene", name: "lucene-core", version: "3.5.0"], // [?, ?] - [group: "org.atmosphere", name: "atmosphere-guice", version: "0.8.3"], // [?, ?] - [group: "org.atmosphere", name: "atmosphere-runtime", version: "2.1.0"], // [?, ?] [group: "org.bouncycastle", name: "bcprov-jdk16", version: "1.45"], // [?, ?] [group: "org.eclipse.jetty", name: "jetty-annotations", version: "9.2.14.v20151106"], // [?, ?] [group: "org.eclipse.jetty", name: "jetty-client", version: "9.2.14.v20151106"], // [?, ?] http://git-wip-us.apache.org/repos/asf/incubator-wave/blob/38bc93ea/wave/dependencies/compile/runtime/javascript-2.1.5.war ---------------------------------------------------------------------- diff --git a/wave/dependencies/compile/runtime/javascript-2.1.5.war b/wave/dependencies/compile/runtime/javascript-2.1.5.war deleted file mode 100644 index d6a099f..0000000 Binary files a/wave/dependencies/compile/runtime/javascript-2.1.5.war and /dev/null differ http://git-wip-us.apache.org/repos/asf/incubator-wave/blob/38bc93ea/wave/dependencies/compile/runtime/javascript-2.1.5/javascript/atmosphere-min.js ---------------------------------------------------------------------- diff --git a/wave/dependencies/compile/runtime/javascript-2.1.5/javascript/atmosphere-min.js b/wave/dependencies/compile/runtime/javascript-2.1.5/javascript/atmosphere-min.js deleted file mode 100644 index 641d6c4..0000000 --- a/wave/dependencies/compile/runtime/javascript-2.1.5/javascript/atmosphere-min.js +++ /dev/null @@ -1,1028 +0,0 @@ -(function(a,b){if(typeof define==="function"&&define.amd){define(b) -}else{a.atmosphere=b() -}}(this,function(){var c="2.1.5-javascript",a={},d,g=[],f=[],e=0,b=Object.prototype.hasOwnProperty; -a={onError:function(h){},onClose:function(h){},onOpen:function(h){},onReopen:function(h){},onMessage:function(h){},onReconnect:function(i,h){},onMessagePublished:function(h){},onTransportFailure:function(i,h){},onLocalMessage:function(h){},onFailureToReconnect:function(i,h){},onClientTimeout:function(h){},AtmosphereRequest:function(M){var O={timeout:300000,method:"GET",headers:{},contentType:"",callback:null,url:"",data:"",suspend:true,maxRequest:-1,reconnect:true,maxStreamingLength:10000000,lastIndex:0,logLevel:"info",requestCount:0,fallbackMethod:"GET",fallbackTransport:"streaming",transport:"long-polling",webSocketImpl:null,webSocketBinaryType:null,dispatchUrl:null,webSocketPathDelimiter:"@@",enableXDR:false,rewriteURL:false,attachHeadersAsQueryString:true,executeCallbackBeforeReconnect:false,readyState:0,lastTimestamp:0,withCredentials:false,trackMessageLength:false,messageDelimiter:"|",connectTimeout:-1,reconnectInterval:0,dropHeaders:true,uuid:0,async:true,shared:false,readRes ponsesHeaders:false,maxReconnectOnClose:5,enableProtocol:true,pollingInterval:0,onError:function(aA){},onClose:function(aA){},onOpen:function(aA){},onMessage:function(aA){},onReopen:function(aB,aA){},onReconnect:function(aB,aA){},onMessagePublished:function(aA){},onTransportFailure:function(aB,aA){},onLocalMessage:function(aA){},onFailureToReconnect:function(aB,aA){},onClientTimeout:function(aA){}}; -var W={status:200,reasonPhrase:"OK",responseBody:"",messages:[],headers:[],state:"messageReceived",transport:"polling",error:null,request:null,partialMessage:"",errorHandled:false,closedByClientTimeout:false}; -var Z=null; -var o=null; -var v=null; -var E=null; -var G=null; -var ak=true; -var l=0; -var aw=false; -var aa=null; -var aq; -var q=null; -var J=a.util.now(); -var K; -var az; -ay(M); -function ar(){ak=true; -aw=false; -l=0; -Z=null; -o=null; -v=null; -E=null -}function A(){am(); -ar() -}function L(aB,aA){if(W.partialMessage===""&&(aA.transport==="streaming")&&(aB.responseText.length>aA.maxStreamingLength)){W.messages=[]; -aA.reconnectingOnLength=true; -aA.isReopen=true; -ai(true); -D(); -am(); -R(aB,aA,aA.pollingInterval) -}}function D(){if(O.enableProtocol&&!O.firstMessage){var aC="X-Atmosphere-Transport=close&X-Atmosphere-tracking-id="+O.uuid; -a.util.each(O.headers,function(aE,aG){var aF=a.util.isFunction(aG)?aG.call(this,O,O,W):aG; -if(aF!=null){aC+="&"+encodeURIComponent(aE)+"="+encodeURIComponent(aF) -}}); -var aA=O.url.replace(/([?&])_=[^&]*/,aC); -aA=aA+(aA===O.url?(/\?/.test(O.url)?"&":"?")+aC:""); -var aB={connected:false}; -var aD=new a.AtmosphereRequest(aB); -aD.attachHeadersAsQueryString=false; -aD.dropHeaders=true; -aD.url=aA; -aD.contentType="text/plain"; -aD.transport="polling"; -aD.method="GET"; -aD.data=""; -aD.async=false; -n("",aD) -}}function an(){if(O.reconnectId){clearTimeout(O.reconnectId); -delete O.reconnectId -}O.reconnect=false; -aw=true; -W.request=O; -W.state="unsubscribe"; -W.responseBody=""; -W.status=408; -W.partialMessage=""; -C(); -D(); -am() -}function am(){W.partialMessage=""; -if(O.id){clearTimeout(O.id) -}if(E!=null){E.close(); -E=null -}if(G!=null){G.abort(); -G=null -}if(v!=null){v.abort(); -v=null -}if(Z!=null){if(Z.canSendMessage){Z.close() -}Z=null -}if(o!=null){o.close(); -o=null -}at() -}function at(){if(aq!=null){clearInterval(K); -document.cookie=az+"=; expires=Thu, 01 Jan 1970 00:00:00 GMT; path=/"; -aq.signal("close",{reason:"",heir:!aw?J:(aq.get("children")||[])[0]}); -aq.close() -}if(q!=null){q.close() -}}function ay(aA){A(); -O=a.util.extend(O,aA); -O.mrequest=O.reconnect; -if(!O.reconnect){O.reconnect=true -}}function p(){return O.webSocketImpl!=null||window.WebSocket||window.MozWebSocket -}function S(){return window.EventSource -}function t(){if(O.shared){q=ah(O); -if(q!=null){if(O.logLevel==="debug"){a.util.debug("Storage service available. All communication will be local") -}if(q.open(O)){return -}}if(O.logLevel==="debug"){a.util.debug("No Storage service available.") -}q=null -}O.firstMessage=e==0?true:false; -O.isOpen=false; -O.ctime=a.util.now(); -if(O.uuid===0){O.uuid=e -}W.closedByClientTimeout=false; -if(O.transport!=="websocket"&&O.transport!=="sse"){s(O) -}else{if(O.transport==="websocket"){if(!p()){Q("Websocket is not supported, using request.fallbackTransport ("+O.fallbackTransport+")") -}else{aj(false) -}}else{if(O.transport==="sse"){if(!S()){Q("Server Side Events(SSE) is not supported, using request.fallbackTransport ("+O.fallbackTransport+")") -}else{I(false) -}}}}}function ah(aE){var aF,aD,aI,aA="atmosphere-"+aE.url,aB={storage:function(){function aJ(aN){if(aN.key===aA&&aN.newValue){aC(aN.newValue) -}}if(!a.util.storage){return -}var aM=window.localStorage,aK=function(aN){return a.util.parseJSON(aM.getItem(aA+"-"+aN)) -},aL=function(aN,aO){aM.setItem(aA+"-"+aN,a.util.stringifyJSON(aO)) -}; -return{init:function(){aL("children",aK("children").concat([J])); -a.util.on(window,"storage",aJ); -return aK("opened") -},signal:function(aN,aO){aM.setItem(aA,a.util.stringifyJSON({target:"p",type:aN,data:aO})) -},close:function(){var aN=aK("children"); -a.util.off(window,"storage",aJ); -if(aN){if(aG(aN,aE.id)){aL("children",aN) -}}}} -},windowref:function(){var aJ=window.open("",aA.replace(/\W/g,"")); -if(!aJ||aJ.closed||!aJ.callbacks){return -}return{init:function(){aJ.callbacks.push(aC); -aJ.children.push(J); -return aJ.opened -},signal:function(aK,aL){if(!aJ.closed&&aJ.fire){aJ.fire(a.util.stringifyJSON({target:"p",type:aK,data:aL})) -}},close:function(){if(!aI){aG(aJ.callbacks,aC); -aG(aJ.children,J) -}}} -}}; -function aG(aM,aL){var aJ,aK=aM.length; -for(aJ=0; -aJ<aK; -aJ++){if(aM[aJ]===aL){aM.splice(aJ,1) -}}return aK!==aM.length -}function aC(aJ){var aL=a.util.parseJSON(aJ),aK=aL.data; -if(aL.target==="c"){switch(aL.type){case"open":N("opening","local",O); -break; -case"close":if(!aI){aI=true; -if(aK.reason==="aborted"){an() -}else{if(aK.heir===J){t() -}else{setTimeout(function(){t() -},100) -}}}break; -case"message":F(aK,"messageReceived",200,aE.transport); -break; -case"localMessage":ac(aK); -break -}}}function aH(){var aJ=new RegExp("(?:^|; )("+encodeURIComponent(aA)+")=([^;]*)").exec(document.cookie); -if(aJ){return a.util.parseJSON(decodeURIComponent(aJ[2])) -}}aF=aH(); -if(!aF||a.util.now()-aF.ts>1000){return -}aD=aB.storage()||aB.windowref(); -if(!aD){return -}return{open:function(){var aJ; -K=setInterval(function(){var aK=aF; -aF=aH(); -if(!aF||aK.ts===aF.ts){aC(a.util.stringifyJSON({target:"c",type:"close",data:{reason:"error",heir:aK.heir}})) -}},1000); -aJ=aD.init(); -if(aJ){setTimeout(function(){N("opening","local",aE) -},50) -}return aJ -},send:function(aJ){aD.signal("send",aJ) -},localSend:function(aJ){aD.signal("localSend",a.util.stringifyJSON({id:J,event:aJ})) -},close:function(){if(!aw){clearInterval(K); -aD.signal("close"); -aD.close() -}}} -}function ad(){var aB,aA="atmosphere-"+O.url,aF={storage:function(){function aG(aI){if(aI.key===aA&&aI.newValue){aC(aI.newValue) -}}if(!a.util.storage){return -}var aH=window.localStorage; -return{init:function(){a.util.on(window,"storage",aG) -},signal:function(aI,aJ){aH.setItem(aA,a.util.stringifyJSON({target:"c",type:aI,data:aJ})) -},get:function(aI){return a.util.parseJSON(aH.getItem(aA+"-"+aI)) -},set:function(aI,aJ){aH.setItem(aA+"-"+aI,a.util.stringifyJSON(aJ)) -},close:function(){a.util.off(window,"storage",aG); -aH.removeItem(aA); -aH.removeItem(aA+"-opened"); -aH.removeItem(aA+"-children") -}} -},windowref:function(){var aH=aA.replace(/\W/g,""),aG=document.getElementById(aH),aI; -if(!aG){aG=document.createElement("div"); -aG.id=aH; -aG.style.display="none"; -aG.innerHTML='<iframe name="'+aH+'" />'; -document.body.appendChild(aG) -}aI=aG.firstChild.contentWindow; -return{init:function(){aI.callbacks=[aC]; -aI.fire=function(aJ){var aK; -for(aK=0; -aK<aI.callbacks.length; -aK++){aI.callbacks[aK](aJ) -}} -},signal:function(aJ,aK){if(!aI.closed&&aI.fire){aI.fire(a.util.stringifyJSON({target:"c",type:aJ,data:aK})) -}},get:function(aJ){return !aI.closed?aI[aJ]:null -},set:function(aJ,aK){if(!aI.closed){aI[aJ]=aK -}},close:function(){}} -}}; -function aC(aG){var aI=a.util.parseJSON(aG),aH=aI.data; -if(aI.target==="p"){switch(aI.type){case"send":al(aH); -break; -case"localSend":ac(aH); -break; -case"close":an(); -break -}}}aa=function aE(aG){aB.signal("message",aG) -}; -function aD(){document.cookie=az+"="+encodeURIComponent(a.util.stringifyJSON({ts:a.util.now()+1,heir:(aB.get("children")||[])[0]}))+"; path=/" -}aB=aF.storage()||aF.windowref(); -aB.init(); -if(O.logLevel==="debug"){a.util.debug("Installed StorageService "+aB) -}aB.set("children",[]); -if(aB.get("opened")!=null&&!aB.get("opened")){aB.set("opened",false) -}az=encodeURIComponent(aA); -aD(); -K=setInterval(aD,1000); -aq=aB -}function N(aC,aF,aB){if(O.shared&&aF!=="local"){ad() -}if(aq!=null){aq.set("opened",true) -}aB.close=function(){an() -}; -if(l>0&&aC==="re-connecting"){aB.isReopen=true; -ae(W) -}else{if(W.error==null){W.request=aB; -var aD=W.state; -W.state=aC; -var aA=W.transport; -W.transport=aF; -var aE=W.responseBody; -C(); -W.responseBody=aE; -W.state=aD; -W.transport=aA -}}}function z(aC){aC.transport="jsonp"; -var aB=O,aA; -if((aC!=null)&&(typeof(aC)!=="undefined")){aB=aC -}G={open:function(){var aE="atmosphere"+(++J); -function aD(){var aF=aB.url; -if(aB.dispatchUrl!=null){aF+=aB.dispatchUrl -}var aH=aB.data; -if(aB.attachHeadersAsQueryString){aF=X(aB); -if(aH!==""){aF+="&X-Atmosphere-Post-Body="+encodeURIComponent(aH) -}aH="" -}var aG=document.head||document.getElementsByTagName("head")[0]||document.documentElement; -aA=document.createElement("script"); -aA.src=aF+"&jsonpTransport="+aE; -aA.clean=function(){aA.clean=aA.onerror=aA.onload=aA.onreadystatechange=null; -if(aA.parentNode){aA.parentNode.removeChild(aA) -}}; -aA.onload=aA.onreadystatechange=function(){if(!aA.readyState||/loaded|complete/.test(aA.readyState)){aA.clean() -}}; -aA.onerror=function(){aA.clean(); -aB.lastIndex=0; -if(aB.openId){clearTimeout(aB.openId) -}if(aB.reconnect&&l++<aB.maxReconnectOnClose){N("re-connecting",aB.transport,aB); -R(G,aB,aC.reconnectInterval); -aB.openId=setTimeout(function(){ao(aB) -},aB.reconnectInterval+1000) -}else{af(0,"maxReconnectOnClose reached") -}}; -aG.insertBefore(aA,aG.firstChild) -}window[aE]=function(aH){if(aB.reconnect){if(aB.maxRequest===-1||aB.requestCount++<aB.maxRequest){if(!aB.executeCallbackBeforeReconnect){R(G,aB,aB.pollingInterval) -}if(aH!=null&&typeof aH!=="string"){try{aH=aH.message -}catch(aG){}}var aF=x(aH,aB,W); -if(!aF){F(W.responseBody,"messageReceived",200,aB.transport) -}if(aB.executeCallbackBeforeReconnect){R(G,aB,aB.pollingInterval) -}}else{a.util.log(O.logLevel,["JSONP reconnect maximum try reached "+O.requestCount]); -af(0,"maxRequest reached") -}}}; -setTimeout(function(){aD() -},50) -},abort:function(){if(aA&&aA.clean){aA.clean() -}}}; -G.open() -}function j(aA){if(O.webSocketImpl!=null){return O.webSocketImpl -}else{if(window.WebSocket){return new WebSocket(aA) -}else{return new MozWebSocket(aA) -}}}function k(){return X(O,a.util.getAbsoluteURL(O.url)).replace(/^http/,"ws") -}function ax(){var aA=X(O); -return aA -}function I(aB){W.transport="sse"; -var aA=ax(); -if(O.logLevel==="debug"){a.util.debug("Invoking executeSSE"); -a.util.debug("Using URL: "+aA) -}if(O.enableProtocol&&aB){var aD=a.util.now()-O.ctime; -O.lastTimestamp=Number(O.stime)+Number(aD) -}if(aB&&!O.reconnect){if(o!=null){am() -}return -}try{o=new EventSource(aA,{withCredentials:O.withCredentials}) -}catch(aC){af(0,aC); -Q("SSE failed. Downgrading to fallback transport and resending"); -return -}if(O.connectTimeout>0){O.id=setTimeout(function(){if(!aB){am() -}},O.connectTimeout) -}o.onopen=function(aE){y(O); -if(O.logLevel==="debug"){a.util.debug("SSE successfully opened") -}if(!O.enableProtocol){if(!aB){N("opening","sse",O) -}else{N("re-opening","sse",O) -}}else{if(O.isReopen){O.isReopen=false; -N("re-opening",O.transport,O) -}}aB=true; -if(O.method==="POST"){W.state="messageReceived"; -o.send(O.data) -}}; -o.onmessage=function(aF){y(O); -if(!O.enableXDR&&aF.origin&&aF.origin!==window.location.protocol+"//"+window.location.host){a.util.log(O.logLevel,["Origin was not "+window.location.protocol+"//"+window.location.host]); -return -}W.state="messageReceived"; -W.status=200; -aF=aF.data; -var aE=x(aF,O,W); -if(!aE){C(); -W.responseBody=""; -W.messages=[] -}}; -o.onerror=function(aE){clearTimeout(O.id); -if(W.closedByClientTimeout){return -}ai(aB); -am(); -if(aw){a.util.log(O.logLevel,["SSE closed normally"]) -}else{if(!aB){Q("SSE failed. Downgrading to fallback transport and resending") -}else{if(O.reconnect&&(W.transport==="sse")){if(l++<O.maxReconnectOnClose){N("re-connecting",O.transport,O); -if(O.reconnectInterval>0){O.reconnectId=setTimeout(function(){I(true) -},O.reconnectInterval) -}else{I(true) -}W.responseBody=""; -W.messages=[] -}else{a.util.log(O.logLevel,["SSE reconnect maximum try reached "+l]); -af(0,"maxReconnectOnClose reached") -}}}}} -}function aj(aB){W.transport="websocket"; -if(O.enableProtocol&&aB){var aE=a.util.now()-O.ctime; -O.lastTimestamp=Number(O.stime)+Number(aE) -}var aA=k(O.url); -if(O.logLevel==="debug"){a.util.debug("Invoking executeWebSocket"); -a.util.debug("Using URL: "+aA) -}if(aB&&!O.reconnect){if(Z!=null){am() -}return -}Z=j(aA); -if(O.webSocketBinaryType!=null){Z.binaryType=O.webSocketBinaryType -}if(O.connectTimeout>0){O.id=setTimeout(function(){if(!aB){var aF={code:1002,reason:"",wasClean:false}; -Z.onclose(aF); -try{am() -}catch(aG){}return -}},O.connectTimeout) -}Z.onopen=function(aG){y(O); -if(O.logLevel==="debug"){a.util.debug("Websocket successfully opened") -}var aF=aB; -if(Z!=null){Z.canSendMessage=true -}if(!O.enableProtocol){aB=true; -if(aF){N("re-opening","websocket",O) -}else{N("opening","websocket",O) -}}if(Z!=null){if(O.method==="POST"){W.state="messageReceived"; -Z.send(O.data) -}}}; -Z.onmessage=function(aH){y(O); -if(O.enableProtocol){aB=true -}W.state="messageReceived"; -W.status=200; -aH=aH.data; -var aF=typeof(aH)==="string"; -if(aF){var aG=x(aH,O,W); -if(!aG){C(); -W.responseBody=""; -W.messages=[] -}}else{if(!u(O,aH)){return -}W.responseBody=aH; -C(); -W.responseBody=null -}}; -Z.onerror=function(aF){clearTimeout(O.id) -}; -Z.onclose=function(aF){clearTimeout(O.id); -if(W.state==="closed"){return -}var aG=aF.reason; -if(aG===""){switch(aF.code){case 1000:aG="Normal closure; the connection successfully completed whatever purpose for which it was created."; -break; -case 1001:aG="The endpoint is going away, either because of a server failure or because the browser is navigating away from the page that opened the connection."; -break; -case 1002:aG="The endpoint is terminating the connection due to a protocol error."; -break; -case 1003:aG="The connection is being terminated because the endpoint received data of a type it cannot accept (for example, a text-only endpoint received binary data)."; -break; -case 1004:aG="The endpoint is terminating the connection because a data frame was received that is too large."; -break; -case 1005:aG="Unknown: no status code was provided even though one was expected."; -break; -case 1006:aG="Connection was closed abnormally (that is, with no close frame being sent)."; -break -}}if(O.logLevel==="warn"){a.util.warn("Websocket closed, reason: "+aG); -a.util.warn("Websocket closed, wasClean: "+aF.wasClean) -}if(W.closedByClientTimeout){return -}ai(aB); -W.state="closed"; -if(aw){a.util.log(O.logLevel,["Websocket closed normally"]) -}else{if(!aB){Q("Websocket failed. Downgrading to Comet and resending") -}else{if(O.reconnect&&W.transport==="websocket"){am(); -if(l++<O.maxReconnectOnClose){N("re-connecting",O.transport,O); -if(O.reconnectInterval>0){O.reconnectId=setTimeout(function(){W.responseBody=""; -W.messages=[]; -aj(true) -},O.reconnectInterval) -}else{W.responseBody=""; -W.messages=[]; -aj(true) -}}else{a.util.log(O.logLevel,["Websocket reconnect maximum try reached "+O.requestCount]); -if(O.logLevel==="warn"){a.util.warn("Websocket error, reason: "+aF.reason) -}af(0,"maxReconnectOnClose reached") -}}}}}; -var aC=navigator.userAgent.toLowerCase(); -var aD=aC.indexOf("android")>-1; -if(aD&&Z.url===undefined){Z.onclose({reason:"Android 4.1 does not support websockets.",wasClean:false}) -}}function u(aD,aC){var aA=true; -if(aD.transport==="polling"){return aA -}if(a.util.trim(aC).length!==0&&aD.enableProtocol&&aD.firstMessage){aD.firstMessage=false; -var aB=aC.split(aD.messageDelimiter); -var aE=aB.length===2?0:1; -aD.uuid=a.util.trim(aB[aE]); -aD.stime=a.util.trim(aB[aE+1]); -aA=false; -if(aD.transport!=="long-polling"){ao(aD) -}e=aD.uuid -}else{if(aD.enableProtocol&&aD.firstMessage){aA=false -}else{ao(aD) -}}return aA -}function y(aA){clearTimeout(aA.id); -if(aA.timeout>0&&aA.transport!=="polling"){aA.id=setTimeout(function(){r(aA); -D(); -am() -},aA.timeout) -}}function r(aA){W.closedByClientTimeout=true; -W.state="closedByClient"; -W.responseBody=""; -W.status=408; -W.messages=[]; -C() -}function af(aA,aB){am(); -clearTimeout(O.id); -W.state="error"; -W.reasonPhrase=aB; -W.responseBody=""; -W.status=aA; -W.messages=[]; -C() -}function x(aE,aD,aA){if(!u(aD,aE)){return true -}if(aE.length===0){return true -}if(aD.trackMessageLength){aE=aA.partialMessage+aE; -var aC=[]; -var aB=aE.indexOf(aD.messageDelimiter); -while(aB!==-1){var aG=a.util.trim(aE.substring(0,aB)); -var aF=+aG; -if(isNaN(aF)){throw new Error('message length "'+aG+'" is not a number') -}aB+=aD.messageDelimiter.length; -if(aB+aF>aE.length){aB=-1 -}else{aC.push(aE.substring(aB,aB+aF)); -aE=aE.substring(aB+aF,aE.length); -aB=aE.indexOf(aD.messageDelimiter) -}}aA.partialMessage=aE; -if(aC.length!==0){aA.responseBody=aC.join(aD.messageDelimiter); -aA.messages=aC; -return false -}else{aA.responseBody=""; -aA.messages=[]; -return true -}}else{aA.responseBody=aE -}return false -}function Q(aA){a.util.log(O.logLevel,[aA]); -if(typeof(O.onTransportFailure)!=="undefined"){O.onTransportFailure(aA,O) -}else{if(typeof(a.util.onTransportFailure)!=="undefined"){a.util.onTransportFailure(aA,O) -}}O.transport=O.fallbackTransport; -var aB=O.connectTimeout===-1?0:O.connectTimeout; -if(O.reconnect&&O.transport!=="none"||O.transport==null){O.method=O.fallbackMethod; -W.transport=O.fallbackTransport; -O.fallbackTransport="none"; -if(aB>0){O.reconnectId=setTimeout(function(){t() -},aB) -}else{t() -}}else{af(500,"Unable to reconnect with fallback transport") -}}function X(aC,aA){var aB=O; -if((aC!=null)&&(typeof(aC)!=="undefined")){aB=aC -}if(aA==null){aA=aB.url -}if(!aB.attachHeadersAsQueryString){return aA -}if(aA.indexOf("X-Atmosphere-Framework")!==-1){return aA -}aA+=(aA.indexOf("?")!==-1)?"&":"?"; -aA+="X-Atmosphere-tracking-id="+aB.uuid; -aA+="&X-Atmosphere-Framework="+c; -aA+="&X-Atmosphere-Transport="+aB.transport; -if(aB.trackMessageLength){aA+="&X-Atmosphere-TrackMessageSize=true" -}if(aB.lastTimestamp!=null){aA+="&X-Cache-Date="+aB.lastTimestamp -}else{aA+="&X-Cache-Date="+0 -}if(aB.contentType!==""){aA+="&Content-Type="+(aB.transport==="websocket"?aB.contentType:encodeURIComponent(aB.contentType)) -}if(aB.enableProtocol){aA+="&X-atmo-protocol=true" -}a.util.each(aB.headers,function(aD,aF){var aE=a.util.isFunction(aF)?aF.call(this,aB,aC,W):aF; -if(aE!=null){aA+="&"+encodeURIComponent(aD)+"="+encodeURIComponent(aE) -}}); -return aA -}function ao(aA){if(!aA.isOpen){aA.isOpen=true; -N("opening",aA.transport,aA) -}else{if(aA.isReopen){aA.isReopen=false; -N("re-opening",aA.transport,aA) -}}}function s(aC){var aA=O; -if((aC!=null)||(typeof(aC)!=="undefined")){aA=aC -}aA.lastIndex=0; -aA.readyState=0; -if((aA.transport==="jsonp")||((aA.enableXDR)&&(a.util.checkCORSSupport()))){z(aA); -return -}if(a.util.browser.msie&&+a.util.browser.version.split(".")[0]<10){if((aA.transport==="streaming")){if(aA.enableXDR&&window.XDomainRequest){P(aA) -}else{av(aA) -}return -}if((aA.enableXDR)&&(window.XDomainRequest)){P(aA); -return -}}var aD=function(){aA.lastIndex=0; -if(aA.reconnect&&l++<aA.maxReconnectOnClose){N("re-connecting",aC.transport,aC); -R(aB,aA,aC.reconnectInterval) -}else{af(0,"maxReconnectOnClose reached") -}}; -if(aA.force||(aA.reconnect&&(aA.maxRequest===-1||aA.requestCount++<aA.maxRequest))){aA.force=false; -var aB=a.util.xhr(); -aB.hasData=false; -h(aB,aA,true); -if(aA.suspend){v=aB -}if(aA.transport!=="polling"){W.transport=aA.transport; -aB.onabort=function(){ai(true) -}; -aB.onerror=function(){W.error=true; -try{W.status=XMLHttpRequest.status -}catch(aF){W.status=500 -}if(!W.status){W.status=500 -}if(!W.errorHandled){am(); -aD() -}} -}aB.onreadystatechange=function(){if(aw){return -}W.error=null; -var aG=false; -var aL=false; -if(aA.transport==="streaming"&&aA.readyState>2&&aB.readyState===4){if(aA.reconnectingOnLength){return -}am(); -aD(); -return -}aA.readyState=aB.readyState; -if(aA.transport==="streaming"&&aB.readyState>=3){aL=true -}else{if(aA.transport==="long-polling"&&aB.readyState===4){aL=true -}}y(O); -if(aA.transport!=="polling"){var aF=200; -if(aB.readyState===4){aF=aB.status>1000?0:aB.status -}if(aF>=300||aF===0){W.errorHandled=true; -am(); -aD(); -return -}if((!aA.enableProtocol||!aC.firstMessage)&&aB.readyState===2){ao(aA) -}}else{if(aB.readyState===4){aL=true -}}if(aL){var aJ=aB.responseText; -if(a.util.trim(aJ).length===0&&aA.transport==="long-polling"){if(!aB.hasData){R(aB,aA,aA.pollingInterval) -}else{aB.hasData=false -}return -}aB.hasData=true; -ag(aB,O); -if(aA.transport==="streaming"){if(!a.util.browser.opera){var aI=aJ.substring(aA.lastIndex,aJ.length); -aG=x(aI,aA,W); -aA.lastIndex=aJ.length; -if(aG){return -}}else{a.util.iterate(function(){if(W.status!==500&&aB.responseText.length>aA.lastIndex){try{W.status=aB.status; -W.headers=a.util.parseHeaders(aB.getAllResponseHeaders()); -ag(aB,O) -}catch(aN){W.status=404 -}y(O); -W.state="messageReceived"; -var aM=aB.responseText.substring(aA.lastIndex); -aA.lastIndex=aB.responseText.length; -aG=x(aM,aA,W); -if(!aG){C() -}L(aB,aA) -}else{if(W.status>400){aA.lastIndex=aB.responseText.length; -return false -}}},0) -}}else{aG=x(aJ,aA,W) -}try{W.status=aB.status; -W.headers=a.util.parseHeaders(aB.getAllResponseHeaders()); -ag(aB,aA) -}catch(aK){W.status=404 -}if(aA.suspend){W.state=W.status===0?"closed":"messageReceived" -}else{W.state="messagePublished" -}var aH=aC.transport!=="streaming"&&aC.transport!=="polling"; -if(aH&&!aA.executeCallbackBeforeReconnect){R(aB,aA,aA.pollingInterval) -}if(W.responseBody.length!==0&&!aG){C() -}if(aH&&aA.executeCallbackBeforeReconnect){R(aB,aA,aA.pollingInterval) -}L(aB,aA) -}}; -try{aB.send(aA.data); -ak=true -}catch(aE){a.util.log(aA.logLevel,["Unable to connect to "+aA.url]); -af(0,aE) -}}else{if(aA.logLevel==="debug"){a.util.log(aA.logLevel,["Max re-connection reached."]) -}af(0,"maxRequest reached") -}}function h(aC,aD,aB){var aA=aD.url; -if(aD.dispatchUrl!=null&&aD.method==="POST"){aA+=aD.dispatchUrl -}aA=X(aD,aA); -aA=a.util.prepareURL(aA); -if(aB){aC.open(aD.method,aA,aD.async); -if(aD.connectTimeout>0){aD.id=setTimeout(function(){if(aD.requestCount===0){am(); -F("Connect timeout","closed",200,aD.transport) -}},aD.connectTimeout) -}}if(O.withCredentials){if("withCredentials" in aC){aC.withCredentials=true -}}if(!O.dropHeaders){aC.setRequestHeader("X-Atmosphere-Framework",a.util.version); -aC.setRequestHeader("X-Atmosphere-Transport",aD.transport); -if(aD.lastTimestamp!=null){aC.setRequestHeader("X-Cache-Date",aD.lastTimestamp) -}else{aC.setRequestHeader("X-Cache-Date",0) -}if(aD.trackMessageLength){aC.setRequestHeader("X-Atmosphere-TrackMessageSize","true") -}aC.setRequestHeader("X-Atmosphere-tracking-id",aD.uuid); -a.util.each(aD.headers,function(aE,aG){var aF=a.util.isFunction(aG)?aG.call(this,aC,aD,aB,W):aG; -if(aF!=null){aC.setRequestHeader(aE,aF) -}}) -}if(aD.contentType!==""){aC.setRequestHeader("Content-Type",aD.contentType) -}}function R(aB,aC,aD){if(aC.reconnect||(aC.suspend&&ak)){var aA=0; -if(aB&&aB.readyState>1){aA=aB.status>1000?0:aB.status -}W.status=aA===0?204:aA; -W.reason=aA===0?"Server resumed the connection or down.":"OK"; -clearTimeout(aC.id); -if(aC.reconnectId){clearTimeout(aC.reconnectId); -delete aC.reconnectId -}if(aD>0){O.reconnectId=setTimeout(function(){s(aC) -},aD) -}else{s(aC) -}}}function ae(aA){aA.state="re-connecting"; -ab(aA) -}function P(aA){if(aA.transport!=="polling"){E=V(aA); -E.open() -}else{V(aA).open() -}}function V(aC){var aB=O; -if((aC!=null)&&(typeof(aC)!=="undefined")){aB=aC -}var aH=aB.transport; -var aG=0; -var aA=new window.XDomainRequest(); -var aE=function(){if(aB.transport==="long-polling"&&(aB.reconnect&&(aB.maxRequest===-1||aB.requestCount++<aB.maxRequest))){aA.status=200; -P(aB) -}}; -var aF=aB.rewriteURL||function(aJ){var aI=/(?:^|;\s*)(JSESSIONID|PHPSESSID)=([^;]*)/.exec(document.cookie); -switch(aI&&aI[1]){case"JSESSIONID":return aJ.replace(/;jsessionid=[^\?]*|(\?)|$/,";jsessionid="+aI[2]+"$1"); -case"PHPSESSID":return aJ.replace(/\?PHPSESSID=[^&]*&?|\?|$/,"?PHPSESSID="+aI[2]+"&").replace(/&$/,"") -}return aJ -}; -aA.onprogress=function(){aD(aA) -}; -aA.onerror=function(){if(aB.transport!=="polling"){am(); -if(l++<aB.maxReconnectOnClose){if(aB.reconnectInterval>0){aB.reconnectId=setTimeout(function(){N("re-connecting",aC.transport,aC); -P(aB) -},aB.reconnectInterval) -}else{N("re-connecting",aC.transport,aC); -P(aB) -}}else{af(0,"maxReconnectOnClose reached") -}}}; -aA.onload=function(){}; -var aD=function(aI){clearTimeout(aB.id); -var aK=aI.responseText; -aK=aK.substring(aG); -aG+=aK.length; -if(aH!=="polling"){y(aB); -var aJ=x(aK,aB,W); -if(aH==="long-polling"&&a.util.trim(aK).length===0){return -}if(aB.executeCallbackBeforeReconnect){aE() -}if(!aJ){F(W.responseBody,"messageReceived",200,aH) -}if(!aB.executeCallbackBeforeReconnect){aE() -}}}; -return{open:function(){var aI=aB.url; -if(aB.dispatchUrl!=null){aI+=aB.dispatchUrl -}aI=X(aB,aI); -aA.open(aB.method,aF(aI)); -if(aB.method==="GET"){aA.send() -}else{aA.send(aB.data) -}if(aB.connectTimeout>0){aB.id=setTimeout(function(){if(aB.requestCount===0){am(); -F("Connect timeout","closed",200,aB.transport) -}},aB.connectTimeout) -}},close:function(){aA.abort() -}} -}function av(aA){E=w(aA); -E.open() -}function w(aD){var aC=O; -if((aD!=null)&&(typeof(aD)!=="undefined")){aC=aD -}var aB; -var aE=new window.ActiveXObject("htmlfile"); -aE.open(); -aE.close(); -var aA=aC.url; -if(aC.dispatchUrl!=null){aA+=aC.dispatchUrl -}if(aC.transport!=="polling"){W.transport=aC.transport -}return{open:function(){var aF=aE.createElement("iframe"); -aA=X(aC); -if(aC.data!==""){aA+="&X-Atmosphere-Post-Body="+encodeURIComponent(aC.data) -}aA=a.util.prepareURL(aA); -aF.src=aA; -aE.body.appendChild(aF); -var aG=aF.contentDocument||aF.contentWindow.document; -aB=a.util.iterate(function(){try{if(!aG.firstChild){return -}var aJ=aG.body?aG.body.lastChild:aG; -var aL=function(){var aN=aJ.cloneNode(true); -aN.appendChild(aG.createTextNode(".")); -var aM=aN.innerText; -aM=aM.substring(0,aM.length-1); -return aM -}; -if(!aG.body||!aG.body.firstChild||aG.body.firstChild.nodeName.toLowerCase()!=="pre"){var aI=aG.head||aG.getElementsByTagName("head")[0]||aG.documentElement||aG; -var aH=aG.createElement("script"); -aH.text="document.write('<plaintext>')"; -aI.insertBefore(aH,aI.firstChild); -aI.removeChild(aH); -aJ=aG.body.lastChild -}if(aC.closed){aC.isReopen=true -}aB=a.util.iterate(function(){var aN=aL(); -if(aN.length>aC.lastIndex){y(O); -W.status=200; -W.error=null; -aJ.innerText=""; -var aM=x(aN,aC,W); -if(aM){return"" -}F(W.responseBody,"messageReceived",200,aC.transport) -}aC.lastIndex=0; -if(aG.readyState==="complete"){ai(true); -N("re-connecting",aC.transport,aC); -if(aC.reconnectInterval>0){aC.reconnectId=setTimeout(function(){av(aC) -},aC.reconnectInterval) -}else{av(aC) -}return false -}},null); -return false -}catch(aK){W.error=true; -N("re-connecting",aC.transport,aC); -if(l++<aC.maxReconnectOnClose){if(aC.reconnectInterval>0){aC.reconnectId=setTimeout(function(){av(aC) -},aC.reconnectInterval) -}else{av(aC) -}}else{af(0,"maxReconnectOnClose reached") -}aE.execCommand("Stop"); -aE.close(); -return false -}}) -},close:function(){if(aB){aB() -}aE.execCommand("Stop"); -ai(true) -}} -}function al(aA){if(q!=null){m(aA) -}else{if(v!=null||o!=null){i(aA) -}else{if(E!=null){Y(aA) -}else{if(G!=null){U(aA) -}else{if(Z!=null){H(aA) -}else{af(0,"No suspended connection available"); -a.util.error("No suspended connection available. Make sure atmosphere.subscribe has been called and request.onOpen invoked before invoking this method") -}}}}}}function n(aB,aA){if(!aA){aA=ap(aB) -}aA.transport="polling"; -aA.method="GET"; -aA.async=false; -aA.withCredentials=false; -aA.reconnect=false; -aA.force=true; -aA.suspend=false; -aA.timeout=1000; -s(aA) -}function m(aA){q.send(aA) -}function B(aB){if(aB.length===0){return -}try{if(q){q.localSend(aB) -}else{if(aq){aq.signal("localMessage",a.util.stringifyJSON({id:J,event:aB})) -}}}catch(aA){a.util.error(aA) -}}function i(aB){var aA=ap(aB); -s(aA) -}function Y(aB){if(O.enableXDR&&a.util.checkCORSSupport()){var aA=ap(aB); -aA.reconnect=false; -z(aA) -}else{i(aB) -}}function U(aA){i(aA) -}function T(aA){var aB=aA; -if(typeof(aB)==="object"){aB=aA.data -}return aB -}function ap(aB){var aC=T(aB); -var aA={connected:false,timeout:60000,method:"POST",url:O.url,contentType:O.contentType,headers:O.headers,reconnect:true,callback:null,data:aC,suspend:false,maxRequest:-1,logLevel:"info",requestCount:0,withCredentials:O.withCredentials,async:O.async,transport:"polling",isOpen:true,attachHeadersAsQueryString:true,enableXDR:O.enableXDR,uuid:O.uuid,dispatchUrl:O.dispatchUrl,enableProtocol:false,messageDelimiter:"|",maxReconnectOnClose:O.maxReconnectOnClose}; -if(typeof(aB)==="object"){aA=a.util.extend(aA,aB) -}return aA -}function H(aA){var aD=a.util.isBinary(aA)?aA:T(aA); -var aB; -try{if(O.dispatchUrl!=null){aB=O.webSocketPathDelimiter+O.dispatchUrl+O.webSocketPathDelimiter+aD -}else{aB=aD -}if(!Z.canSendMessage){a.util.error("WebSocket not connected."); -return -}Z.send(aB) -}catch(aC){Z.onclose=function(aE){}; -am(); -Q("Websocket failed. Downgrading to Comet and resending "+aA); -i(aA) -}}function ac(aB){var aA=a.util.parseJSON(aB); -if(aA.id!==J){if(typeof(O.onLocalMessage)!=="undefined"){O.onLocalMessage(aA.event) -}else{if(typeof(a.util.onLocalMessage)!=="undefined"){a.util.onLocalMessage(aA.event) -}}}}function F(aD,aA,aB,aC){W.responseBody=aD; -W.transport=aC; -W.status=aB; -W.state=aA; -C() -}function ag(aA,aD){if(!aD.readResponsesHeaders){if(!aD.enableProtocol){aD.lastTimestamp=a.util.now(); -aD.uuid=J -}}else{try{var aC=aA.getResponseHeader("X-Cache-Date"); -if(aC&&aC!=null&&aC.length>0){aD.lastTimestamp=aC.split(" ").pop() -}var aB=aA.getResponseHeader("X-Atmosphere-tracking-id"); -if(aB&&aB!=null){aD.uuid=aB.split(" ").pop() -}}catch(aE){}}}function ab(aA){au(aA,O); -au(aA,a.util) -}function au(aB,aC){switch(aB.state){case"messageReceived":l=0; -if(typeof(aC.onMessage)!=="undefined"){aC.onMessage(aB) -}break; -case"error":if(typeof(aC.onError)!=="undefined"){aC.onError(aB) -}break; -case"opening":delete O.closed; -if(typeof(aC.onOpen)!=="undefined"){aC.onOpen(aB) -}break; -case"messagePublished":if(typeof(aC.onMessagePublished)!=="undefined"){aC.onMessagePublished(aB) -}break; -case"re-connecting":if(typeof(aC.onReconnect)!=="undefined"){aC.onReconnect(O,aB) -}break; -case"closedByClient":if(typeof(aC.onClientTimeout)!=="undefined"){aC.onClientTimeout(O) -}break; -case"re-opening":delete O.closed; -if(typeof(aC.onReopen)!=="undefined"){aC.onReopen(O,aB) -}break; -case"fail-to-reconnect":if(typeof(aC.onFailureToReconnect)!=="undefined"){aC.onFailureToReconnect(O,aB) -}break; -case"unsubscribe":case"closed":var aA=typeof(O.closed)!=="undefined"?O.closed:false; -if(typeof(aC.onClose)!=="undefined"&&!aA){aC.onClose(aB) -}O.closed=true; -break -}}function ai(aA){if(W.state!=="closed"){W.state="closed"; -W.responseBody=""; -W.messages=[]; -W.status=!aA?501:200; -C() -}}function C(){var aC=function(aF,aG){aG(W) -}; -if(q==null&&aa!=null){aa(W.responseBody) -}O.reconnect=O.mrequest; -var aA=typeof(W.responseBody)==="string"; -var aD=(aA&&O.trackMessageLength)?(W.messages.length>0?W.messages:[""]):new Array(W.responseBody); -for(var aB=0; -aB<aD.length; -aB++){if(aD.length>1&&aD[aB].length===0){continue -}W.responseBody=(aA)?a.util.trim(aD[aB]):aD[aB]; -if(q==null&&aa!=null){aa(W.responseBody) -}if(W.responseBody.length===0&&W.state==="messageReceived"){continue -}ab(W); -if(f.length>0){if(O.logLevel==="debug"){a.util.debug("Invoking "+f.length+" global callbacks: "+W.state) -}try{a.util.each(f,aC) -}catch(aE){a.util.log(O.logLevel,["Callback exception"+aE]) -}}if(typeof(O.callback)==="function"){if(O.logLevel==="debug"){a.util.debug("Invoking request callbacks") -}try{O.callback(W) -}catch(aE){a.util.log(O.logLevel,["Callback exception"+aE]) -}}}}this.subscribe=function(aA){ay(aA); -t() -}; -this.execute=function(){t() -}; -this.close=function(){an() -}; -this.disconnect=function(){D() -}; -this.getUrl=function(){return O.url -}; -this.push=function(aC,aB){if(aB!=null){var aA=O.dispatchUrl; -O.dispatchUrl=aB; -al(aC); -O.dispatchUrl=aA -}else{al(aC) -}}; -this.getUUID=function(){return O.uuid -}; -this.pushLocal=function(aA){B(aA) -}; -this.enableProtocol=function(aA){return O.enableProtocol -}; -this.request=O; -this.response=W -}}; -a.subscribe=function(h,k,j){if(typeof(k)==="function"){a.addCallback(k) -}e=0; -if(typeof(h)!=="string"){j=h -}else{j.url=h -}var i=new a.AtmosphereRequest(j); -i.execute(); -g[g.length]=i; -return i -}; -a.unsubscribe=function(){if(g.length>0){var h=[].concat(g); -for(var k=0; -k<h.length; -k++){var j=h[k]; -j.close(); -clearTimeout(j.response.request.id) -}}g=[]; -f=[] -}; -a.unsubscribeUrl=function(j){var h=-1; -if(g.length>0){for(var l=0; -l<g.length; -l++){var k=g[l]; -if(k.getUrl()===j){k.close(); -clearTimeout(k.response.request.id); -h=l; -break -}}}if(h>=0){g.splice(h,1) -}}; -a.addCallback=function(h){if(a.util.inArray(h,f)===-1){f.push(h) -}}; -a.removeCallback=function(i){var h=a.util.inArray(i,f); -if(h!==-1){f.splice(h,1) -}}; -a.util={browser:{},parseHeaders:function(i){var h,k=/^(.*?):[ \t]*([^\r\n]*)\r?$/mg,j={}; -while(h=k.exec(i)){j[h[1]]=h[2] -}return j -},now:function(){return new Date().getTime() -},isArray:function(h){return Object.prototype.toString.call(h)==="[object Array]" -},inArray:function(k,l){if(!Array.prototype.indexOf){var h=l.length; -for(var j=0; -j<h; -++j){if(l[j]===k){return j -}}return -1 -}return l.indexOf(k) -},isBinary:function(h){return/^\[object\s(?:Blob|ArrayBuffer|.+Array)\]$/.test(Object.prototype.toString.call(h)) -},isFunction:function(h){return Object.prototype.toString.call(h)==="[object Function]" -},getAbsoluteURL:function(h){var i=document.createElement("div"); -i.innerHTML='<a href="'+h+'"/>'; -return encodeURI(decodeURI(i.firstChild.href)) -},prepareURL:function(i){var j=a.util.now(); -var h=i.replace(/([?&])_=[^&]*/,"$1_="+j); -return h+(h===i?(/\?/.test(i)?"&":"?")+"_="+j:"") -},trim:function(h){if(!String.prototype.trim){return h.toString().replace(/(?:(?:^|\n)\s+|\s+(?:$|\n))/g,"").replace(/\s+/g," ") -}else{return h.toString().trim() -}},param:function(l){var j,h=[]; -function k(m,n){n=a.util.isFunction(n)?n():(n==null?"":n); -h.push(encodeURIComponent(m)+"="+encodeURIComponent(n)) -}function i(n,o){var m; -if(a.util.isArray(o)){a.util.each(o,function(q,p){if(/\[\]$/.test(n)){k(n,p) -}else{i(n+"["+(typeof p==="object"?q:"")+"]",p) -}}) -}else{if(Object.prototype.toString.call(o)==="[object Object]"){for(m in o){i(n+"["+m+"]",o[m]) -}}else{k(n,o) -}}}for(j in l){i(j,l[j]) -}return h.join("&").replace(/%20/g,"+") -},storage:function(){try{return !!(window.localStorage&&window.StorageEvent) -}catch(h){return false -}},iterate:function(j,i){var k; -i=i||0; -(function h(){k=setTimeout(function(){if(j()===false){return -}h() -},i) -})(); -return function(){clearTimeout(k) -} -},each:function(n,o,j){if(!n){return -}var m,k=0,l=n.length,h=a.util.isArray(n); -if(j){if(h){for(; -k<l; -k++){m=o.apply(n[k],j); -if(m===false){break -}}}else{for(k in n){m=o.apply(n[k],j); -if(m===false){break -}}}}else{if(h){for(; -k<l; -k++){m=o.call(n[k],k,n[k]); -if(m===false){break -}}}else{for(k in n){m=o.call(n[k],k,n[k]); -if(m===false){break -}}}}return n -},extend:function(l){var k,j,h; -for(k=1; -k<arguments.length; -k++){if((j=arguments[k])!=null){for(h in j){l[h]=j[h] -}}}return l -},on:function(j,i,h){if(j.addEventListener){j.addEventListener(i,h,false) -}else{if(j.attachEvent){j.attachEvent("on"+i,h) -}}},off:function(j,i,h){if(j.removeEventListener){j.removeEventListener(i,h,false) -}else{if(j.detachEvent){j.detachEvent("on"+i,h) -}}},log:function(j,i){if(window.console){var h=window.console[j]; -if(typeof h==="function"){h.apply(window.console,i) -}}},warn:function(){a.util.log("warn",arguments) -},info:function(){a.util.log("info",arguments) -},debug:function(){a.util.log("debug",arguments) -},error:function(){a.util.log("error",arguments) -},xhr:function(){try{return new window.XMLHttpRequest() -}catch(i){try{return new window.ActiveXObject("Microsoft.XMLHTTP") -}catch(h){}}},parseJSON:function(h){return !h?null:window.JSON&&window.JSON.parse?window.JSON.parse(h):new Function("return "+h)() -},stringifyJSON:function(j){var m=/[\\\"\x00-\x1f\x7f-\x9f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g,k={"\b":"\\b","\t":"\\t","\n":"\\n","\f":"\\f","\r":"\\r",'"':'\\"',"\\":"\\\\"}; -function h(n){return'"'+n.replace(m,function(o){var p=k[o]; -return typeof p==="string"?p:"\\u"+("0000"+o.charCodeAt(0).toString(16)).slice(-4) -})+'"' -}function i(o){return o<10?"0"+o:o -}return window.JSON&&window.JSON.stringify?window.JSON.stringify(j):(function l(s,r){var q,p,n,o,u=r[s],t=typeof u; -if(u&&typeof u==="object"&&typeof u.toJSON==="function"){u=u.toJSON(s); -t=typeof u -}switch(t){case"string":return h(u); -case"number":return isFinite(u)?String(u):"null"; -case"boolean":return String(u); -case"object":if(!u){return"null" -}switch(Object.prototype.toString.call(u)){case"[object Date]":return isFinite(u.valueOf())?'"'+u.getUTCFullYear()+"-"+i(u.getUTCMonth()+1)+"-"+i(u.getUTCDate())+"T"+i(u.getUTCHours())+":"+i(u.getUTCMinutes())+":"+i(u.getUTCSeconds())+'Z"':"null"; -case"[object Array]":n=u.length; -o=[]; -for(q=0; -q<n; -q++){o.push(l(q,u)||"null") -}return"["+o.join(",")+"]"; -default:o=[]; -for(q in u){if(b.call(u,q)){p=l(q,u); -if(p){o.push(h(q)+":"+p) -}}}return"{"+o.join(",")+"}" -}}})("",{"":j}) -},checkCORSSupport:function(){if(a.util.browser.msie&&!window.XDomainRequest&&+a.util.browser.version.split(".")[0]<11){return true -}else{if(a.util.browser.opera&&+a.util.browser.version.split(".")<12){return true -}else{if(a.util.trim(navigator.userAgent).slice(0,16)==="KreaTVWebKit/531"){return true -}else{if(a.util.trim(navigator.userAgent).slice(-7).toLowerCase()==="kreatel"){return true -}}}}var h=navigator.userAgent.toLowerCase(); -var i=h.indexOf("android")>-1; -if(i){return true -}return false -}}; -d=a.util.now(); -(function(){var i=navigator.userAgent.toLowerCase(),h=/(chrome)[ \/]([\w.]+)/.exec(i)||/(webkit)[ \/]([\w.]+)/.exec(i)||/(opera)(?:.*version|)[ \/]([\w.]+)/.exec(i)||/(msie) ([\w.]+)/.exec(i)||/(trident)(?:.*? rv:([\w.]+)|)/.exec(i)||i.indexOf("compatible")<0&&/(mozilla)(?:.*? rv:([\w.]+)|)/.exec(i)||[]; -a.util.browser[h[1]||""]=true; -a.util.browser.version=h[2]||"0"; -if(a.util.browser.trident){a.util.browser.msie=true -}if(a.util.browser.msie||(a.util.browser.mozilla&&+a.util.browser.version.split(".")[0]===1)){a.util.storage=false -}})(); -a.util.on(window,"unload",function(h){a.unsubscribe() -}); -a.util.on(window,"keypress",function(h){if(h.charCode===27||h.keyCode===27){if(h.preventDefault){h.preventDefault() -}}}); -a.util.on(window,"offline",function(){a.unsubscribe() -}); -return a -})); \ No newline at end of file