if(!Function.prototype.bind){Function.prototype.bind=function(b){var a=this;return function(){return a.apply(b,arguments)}}}if(!Function.prototype.prependArg){Function.prototype.prependArg=function(a){var b=this;return function(){var d=[a];for(var c=0;c/g,"\\3e").replace(/@/g,"\\40");return[a,c].join("@")},unescapeJid:function(a){return a.replace(/\\20/g," ").replace(/\\22/g,'"').replace(/\\26/g,"&").replace(/\\27/g,"'").replace(/\\2f/g,"/").replace(/\\3a/g,":").replace(/\\3c/g,"<").replace(/\\3e/g,">").replace(/\\40/g,"@").replace(/\\5c/g,"\\")},getNodeFromJid:function(a){if(a.indexOf("@")<0){return null}return Strophe.escapeJid(a).split("@")[0]},getDomainFromJid:function(a){var b=Strophe.escapeJid(Strophe.getBareJidFromJid(a));if(b.indexOf("@")<0){return b}else{return b.split("@")[1]}},getResourceFromJid:function(a){var b=Strophe.escapeJid(a).split("/");if(b.length<2){return null}return b[1]},getBareJidFromJid:function(a){return this.escapeJid(a).split("/")[0]},log:function(b,a){return},debug:function(a){this.log(this.LogLevel.DEBUG,a)},info:function(a){this.log(this.LogLevel.INFO,a)},warn:function(a){this.log(this.LogLevel.WARN,a)},error:function(a){this.log(this.LogLevel.ERROR,a)},fatal:function(a){this.log(this.LogLevel.FATAL,a)},serialize:function(c){var a;if(!c){return null}var e=c.nodeName;var b,d;if(c.getAttribute("_realname")){e=c.getAttribute("_realname")}a="<"+e;for(b=0;b0){a+=">";for(b=0;b"}else{a+="/>"}return a},_requestId:0};Strophe.Builder=function(b,a){this.nodeTree=this._makeNode(b,a);this.node=this.nodeTree};Strophe.Builder.prototype={tree:function(){return this.nodeTree},toString:function(){return Strophe.serialize(this.nodeTree)},up:function(){this.node=this.node.parentNode;return this},attrs:function(b){for(var a in b){this.node.setAttribute(a,b[a])}return this},c:function(b,a){var c=this._makeNode(b,a);this.node.appendChild(c);this.node=c;return this},cnode:function(a){this.node.appendChild(a);this.node=a;return this},t:function(a){var b=Strophe.xmlTextNode(a);this.node.appendChild(b);return this},_makeNode:function(c,b){var d=Strophe.xmlElement(c);for(var a in b){d.setAttribute(a,b[a])}return d}};Strophe.Handler=function(d,c,a,b,f,e){this.handler=d;this.ns=c;this.name=a;this.type=b;this.id=f;this.from=e;this.user=true};Strophe.Handler.prototype={isMatch:function(c){var d,b;d=false;if(!this.ns){d=true}else{var a=this;Strophe.forEachChild(c,null,function(e){if(e.getAttribute("xmlns")==a.ns){d=true}});d=d||c.getAttribute("xmlns")==this.ns}if(d&&(!this.name||Strophe.isTagEqual(c,this.name))&&(!this.type||c.getAttribute("type")==this.type)&&(!this.id||c.getAttribute("id")==this.id)&&(!this.from||c.getAttribute("from")==this.from)){return true}return false},run:function(b){var a=null;try{a=this.handler(b)}catch(c){if(c.sourceURL){Strophe.fatal("error: "+this.handler+" "+c.sourceURL+":"+c.line+" - "+c.name+": "+c.message)}else{if(c.fileName){if(typeof(console)!="undefined"){console.trace();console.error(this.handler," - error - ",c,c.message)}Strophe.fatal("error: "+this.handler+" "+c.fileName+":"+c.lineNumber+" - "+c.name+": "+c.message)}else{Strophe.fatal("error: "+this.handler)}}throw c}return a},toString:function(){return"{Handler: "+this.handler+"("+this.name+","+this.id+","+this.ns+")}"}};Strophe.TimedHandler=function(b,a){this.period=b;this.handler=a;this.lastCalled=new Date().getTime();this.user=true};Strophe.TimedHandler.prototype={run:function(){this.lastCalled=new Date().getTime();return this.handler()},reset:function(){this.lastCalled=new Date().getTime()},toString:function(){return"{TimedHandler: "+this.handler+"("+this.period+")}"}};Strophe.Request=function(c,b,a,d){this.id=++Strophe._requestId;this.data=c;this.origFunc=b;this.func=b;this.rid=a;this.date=NaN;this.sends=d||0;this.abort=false;this.dead=null;this.age=function(){if(!this.date){return 0}var e=new Date();return(e-this.date)/1000};this.timeDead=function(){if(!this.dead){return 0}var e=new Date();return(e-this.dead)/1000};this.xhr=this._newXHR()};Strophe.Request.prototype={getResponse:function(){var a=null;if(this.xhr.responseXML&&this.xhr.responseXML.documentElement){a=this.xhr.responseXML.documentElement;if(a.tagName=="parsererror"){Strophe.error("invalid response received");Strophe.error("responseText: "+this.xhr.responseText);Strophe.error("responseXML: "+Strophe.serialize(this.xhr.responseXML));throw"parsererror"}}else{if(this.xhr.responseText){Strophe.error("invalid response received");Strophe.error("responseText: "+this.xhr.responseText);Strophe.error("responseXML: "+Strophe.serialize(this.xhr.responseXML))}}return a},_newXHR:function(){var a=null;if(window.XMLHttpRequest){a=new XMLHttpRequest();if(a.overrideMimeType){a.overrideMimeType("text/xml")}}else{if(window.ActiveXObject){a=new ActiveXObject("Microsoft.XMLHTTP")}}a.onreadystatechange=this.func.prependArg(this);return a}};Strophe.Connection=function(a){this.service=a;this.jid="";this.rid=Math.floor(Math.random()*4294967295);this.sid=null;this.streamId=null;this.do_session=false;this.do_bind=false;this.timedHandlers=[];this.handlers=[];this.removeTimeds=[];this.removeHandlers=[];this.addTimeds=[];this.addHandlers=[];this._idleTimeout=null;this._disconnectTimeout=null;this.authenticated=false;this.disconnecting=false;this.connected=false;this.errors=0;this.paused=false;this.window=5;this._data=[];this._requests=[];this._uniqueId=Math.round(Math.random()*10000);this._sasl_success_handler=null;this._sasl_failure_handler=null;this._sasl_challenge_handler=null;this._idleTimeout=setTimeout(this._onIdle.bind(this),100)};Strophe.Connection.prototype={reset:function(){this.rid=Math.floor(Math.random()*4294967295);this.sid=null;this.streamId=null;this.do_session=false;this.do_bind=false;this.timedHandlers=[];this.handlers=[];this.removeTimeds=[];this.removeHandlers=[];this.addTimeds=[];this.addHandlers=[];this.authenticated=false;this.disconnecting=false;this.connected=false;this.errors=0;this._requests=[];this._uniqueId=Math.round(Math.random()*10000)},pause:function(){this.paused=true},resume:function(){this.paused=false},getUniqueId:function(a){if(typeof(a)=="string"||typeof(a)=="number"){return ++this._uniqueId+":"+a}else{return ++this._uniqueId+""}},connect:function(c,d,g,f,e,b){this.jid=c;this.pass=d;this.connect_callback=g;this.disconnecting=false;this.connected=false;this.authenticated=false;this.errors=0;if(!f){f=60}if(!e){e=1}if(b){this.window=b}this.domain=Strophe.getDomainFromJid(this.jid);var a=this._buildBody().attrs({to:this.domain,"xml:lang":"en",wait:f,hold:e,window:this.window,content:"text/xml; charset=utf-8",ver:"1.6","xmpp:version":"1.0","xmlns:xmpp":Strophe.NS.BOSH});this.connect_callback(Strophe.Status.CONNECTING,null);this._requests.push(new Strophe.Request(a.toString(),this._onRequestStateChange.bind(this).prependArg(this._connect_cb.bind(this)),a.tree().getAttribute("rid")));this._throttledRequestHandler()},attach:function(b,a,c,d){this.jid=b;this.sid=a;this.rid=c;this.connect_callback=d;this.domain=Strophe.getDomainFromJid(this.jid);this.authenticated=true;this.connected=true},rawInput:function(a){return},rawOutput:function(a){return},send:function(b){if(b!==null&&typeof(b.sort)=="function"){for(var a=0;a=0;a--){if(b==this._requests[a]){this._requests.splice(a,1)}}b.xhr.onreadystatechange=function(){};this._throttledRequestHandler()},_restartRequest:function(a){var b=this._requests[a];if(b.dead===null){b.dead=new Date()}this._processRequest(a)},_processRequest:function(f){var k=this._requests[f];var n=-1;try{if(k.xhr.readyState==4){n=k.xhr.status}}catch(j){Strophe.error("caught an error in _requests["+f+"], reqStatus: "+n)}if(typeof(n)=="undefined"){n=-1}var a=new Date();var d=k.age();var c=(!isNaN(d)&&d>Strophe.TIMEOUT);var g=(k.dead!==null&&k.timeDead()>Strophe.SECONDARY_TIMEOUT);var m=(k.xhr.readyState==4&&(n<1||n>=500));var b;if(c||g||m){if(g){Strophe.error("Request "+this._requests[f].id+" timed out (secondary), restarting")}k.abort=true;k.xhr.abort();b=k;this._requests[f]=new Strophe.Request(k.data,k.origFunc,k.rid,k.sends);k=this._requests[f]}if(k.xhr.readyState===0){Strophe.debug("request id "+k.id+"."+k.sends+" posting");k.date=new Date();try{k.xhr.open("POST",this.service,true)}catch(j){Strophe.error("XHR open failed.");if(!this.connected){this.connect_callback(Strophe.Status.CONNFAIL,"bad-service")}this.disconnect();return}var l=function(){k.xhr.send(k.data)};if(k.sends>1){var h=Math.pow(k.sends,3)*1000;setTimeout(l,h)}else{l()}k.sends++;this.rawOutput(k.data)}else{Strophe.debug("_throttledRequestHandler: "+(f===0?"first":"second")+" request has readyState of "+k.xhr.readyState)}},_throttledRequestHandler:function(){if(!this._requests){Strophe.debug("_throttledRequestHandler called with undefined requests")}else{Strophe.debug("_throttledRequestHandler called with "+this._requests.length+" requests")}if(!this._requests||this._requests.length===0){return}if(this._requests.length>0){this._processRequest(0)}if(this._requests.length>1&&Math.abs(this._requests[0].rid-this._requests[1].rid)=400){this._hitError(b);return}}var a=(this._requests[0]==c);var g=(this._requests[1]==c);if((b>0&&b<500)||c.sends>5){this._removeRequest(c);Strophe.debug("request id "+c.id+" should now be removed")}if(b==200){if(g||(a&&this._requests.length>0&&this._requests[0].age()>Strophe.SECONDARY_TIMEOUT)){this._restartRequest(0)}Strophe.debug("request id "+c.id+"."+c.sends+" got 200");d(c);this.errors=0}else{Strophe.error("request id "+c.id+"."+c.sends+" error "+b+" happened");if(b===0||(b>=400&&b<600)||b>=12000){this._hitError(b);if(b>=400&&b<500){this.connect_callback(Strophe.Status.DISCONNECTING,null);this._doDisconnect()}}}if(!((b>0&&b<10000)||c.sends>5)){this._throttledRequestHandler()}}},_hitError:function(a){this.errors++;Strophe.warn("request errored, status: "+a+", number of errors: "+this.errors);if(this.errors>4){this._onDisconnectTimeout()}},_doDisconnect:function(){Strophe.info("_doDisconnect was called");this.authenticated=false;this.disconnecting=false;this.sid=null;this.streamId=null;this.rid=Math.floor(Math.random()*4294967295);if(this.connected){this.connect_callback(Strophe.Status.DISCONNECTED,null);this.connected=false}this.handlers=[];this.timedHandlers=[];this.removeTimeds=[];this.removeHandlers=[];this.addTimeds=[];this.addHandlers=[]},_dataRecv:function(j){try{var a=j.getResponse()}catch(g){if(g!="parsererror"){throw g}this.connect_callback(Strophe.Status.DISCONNECTING,"strophe-parsererror");this.disconnect()}if(a===null){return}if(this.disconnecting&&this._requests.length==0){this.deleteTimedHandler(this._disconnectTimeout);this._disconnectTimeout=null;this._doDisconnect()}this.rawInput(Strophe.serialize(a));var b=a.getAttribute("type");var h,d;if(b!==null&&b=="terminate"){h=a.getAttribute("condition");d=a.getElementsByTagName("conflict");if(h!==null){if(h=="remote-stream-error"&&d.length>0){h="conflict"}this.connect_callback(Strophe.Status.CONNFAIL,h)}else{this.connect_callback(Strophe.Status.CONNFAIL,"unknown")}this.connect_callback(Strophe.Status.DISCONNECTING,null);this.disconnect();return}var f,c;while(this.removeHandlers.length>0){c=this.removeHandlers.pop();f=this.handlers.indexOf(c);if(f>=0){this.handlers.splice(f,1)}}while(this.addHandlers.length>0){this.handlers.push(this.addHandlers.pop())}var k=this;Strophe.forEachChild(a,null,function(n){var l,m;m=k.handlers;k.handlers=[];for(l=0;l0){d=this._requests.pop();d.xhr.abort();d.abort=true}this._requests.push(e);this._throttledRequestHandler()},_connect_cb:function(l){Strophe.info("_connect_cb was called");this.connected=true;var a=l.getResponse();if(!a){return}this.rawInput(Strophe.serialize(a));var c=a.getAttribute("type");var k,f;if(c!==null&&c=="terminate"){k=a.getAttribute("condition");f=a.getElementsByTagName("conflict");if(k!==null){if(k=="remote-stream-error"&&f.length>0){k="conflict"}this.connect_callback(Strophe.Status.CONNFAIL,k)}else{this.connect_callback(Strophe.Status.CONNFAIL,"unknown")}return}this.sid=a.getAttribute("sid");this.stream_id=a.getAttribute("authid");var m=false;var d=false;var j=false;var n=a.getElementsByTagName("mechanism");var e,h,g,b;if(n.length>0){for(e=0;e0){b=c[0].getElementsByTagName("jid");if(b.length>0){this.jid=Strophe.getText(b[0]);if(this.do_session){this._addSysHandler(this._sasl_session_cb.bind(this),null,null,null,"_session_auth_2");this.send($iq({type:"set",id:"_session_auth_2"}).c("session",{xmlns:Strophe.NS.SESSION}).tree())}}}else{Strophe.info("SASL binding failed.");this.connect_callback(Strophe.Status.AUTHFAIL,null);return false}},_sasl_session_cb:function(a){if(a.getAttribute("type")=="result"){this.authenticated=true;this.connect_callback(Strophe.Status.CONNECTED,null)}else{if(a.getAttribute("type")=="error"){Strophe.info("Session creation failed.");this.connect_callback(Strophe.Status.AUTHFAIL,null);return false}}return false},_sasl_failure_cb:function(a){if(this._sasl_success_handler){this.deleteHandler(this._sasl_success_handler);this._sasl_success_handler=null}if(this._sasl_challenge_handler){this.deleteHandler(this._sasl_challenge_handler);this._sasl_challenge_handler=null}this.connect_callback(Strophe.Status.AUTHFAIL,null);return false},_auth2_cb:function(a){if(a.getAttribute("type")=="result"){this.authenticated=true;this.connect_callback(Strophe.Status.CONNECTED,null)}else{if(a.getAttribute("type")=="error"){this.connect_callback(Strophe.Status.AUTHFAIL,null);this.disconnect()}}return false},_addSysTimedHandler:function(c,b){var a=new Strophe.TimedHandler(c,b);a.user=false;this.addTimeds.push(a);return a},_addSysHandler:function(e,d,b,c,f){var a=new Strophe.Handler(e,d,b,c,f);a.user=false;this.addHandlers.push(a);return a},_onDisconnectTimeout:function(){Strophe.info("_onDisconnectTimeout was called");var a;while(this._requests.length>0){a=this._requests.pop();a.xhr.abort();a.abort=true}this._doDisconnect();return false},_onIdle:function(){var c,e,g,d;while(this.removeTimeds.length>0){e=this.removeTimeds.pop();c=this.timedHandlers.indexOf(e);if(c>=0){this.timedHandlers.splice(c,1)}}while(this.addTimeds.length>0){this.timedHandlers.push(this.addTimeds.pop())}var b=new Date().getTime();d=[];for(c=0;c0&&!this.paused){a=this._buildBody();for(c=0;c0){f=this._requests[0].age();if(this._requests[0].dead!==null){if(this._requests[0].timeDead()>Strophe.SECONDARY_TIMEOUT){this._throttledRequestHandler()}}if(f>Strophe.TIMEOUT){Strophe.warn("Request "+this._requests[0].id+" timed out, over "+Strophe.TIMEOUT+" seconds since last activity");this._throttledRequestHandler()}}}clearTimeout(this._idleTimeout);this._idleTimeout=setTimeout(this._onIdle.bind(this),100)}};