var XMPPClient=new Class({boshURL:"/http-bind/",connection:null,connected:false,statuses:{},subscriptions:null,onConnect:function(a){this.connected=(a==Strophe.Status.CONNECTED);if(a==Strophe.Status.DISCONNECTED&&false){alert("Disconnected")}if(this.connected){this.connection.send($pres().tree());this.connection.sendIQ($iq({type:"get"}).c("query",{xmlns:Strophe.NS.ROSTER}).tree(),this.onRosterFetched.bind(this));this.connection.addHandler(this.onMessage.bind(this),null,"message","chat");this.connection.addHandler(this.onIncomingSubscribe.bind(this),null,"presence","subscribe");this.connection.addHandler(this.onStatusChange.bind(this),null,"presence");this.connection.addHandler(this.onRosterFetched.bind(this),Strophe.NS.ROSTER,"iq")}return true},onRawInput:function(a){if(false&&a.indexOf("requests")!=-1){alert("RECVD: "+a)}},onRawOutput:function(a){if(false&&a.indexOf("terminate")!=-1){alert("SENT: "+a)}},initialize:function(){this.connection=new Strophe.Connection(this.boshURL);this.connection.rawInput=this.onRawInput.bind(this);this.connection.rawOutput=this.onRawOutput.bind(this)},connect:function(a,b,c){this.connection.connect(a+"/"+c,b,this.onConnect.bind(this))},disconnect:function(){this.connection.disconnect()},ensureConnection:function(){if(!this.connected){throw"Not connected"}},sendMessage:function(b,a){this.ensureConnection();this.connection.send($msg({to:b,type:"chat"}).c("body").t(a).tree())},sendChatNotification:function(b,a){this.ensureConnection();this.connection.send($msg({to:b,type:"chat"}).c(a).attrs({xmlns:"http://jabber.org/protocol/chatstates"}).tree())},subscribe:function(a){this.ensureConnection();this.connection.send($pres({to:a,type:"subscribe"}).tree())},replyToSubscribe:function(b,a){this.ensureConnection();this.connection.send($pres({to:b,type:a?"subscribed":"unsubscribed"}).tree())},deleteFromRoster:function(a,c){this.ensureConnection();var b={jid:a,subscription:"remove"};this.connection.sendIQ($iq({type:"set"}).c("query",{xmlns:Strophe.NS.ROSTER}).c("item").attrs(b).tree(),c,c)},getChatPanel:function(a,d){var c=Strophe.getBareJidFromJid(a);var b=chatPanelPlacer.getPanel(c);if(b){return{panel:b,created:false}}else{if(d){return null}}return{panel:new ChatPanelParent(c,this,chatPanelPlacer,titleFlasher),created:true}},onMessage:function(d){var a=d.getElementsByTagName("body");var e=d.getAttribute("from");if(!e){return true}var c=Strophe.getBareJidFromJid(e);if(a.length==0&&!chatPanelPlacer.getPanel(c)){return true}var b=this.getChatPanel(e);b.panel.onMessage(d);return true},onIncomingSubscribe:function(b){var c=b.getAttribute("from");if(!c){return true}var a=this.getChatPanel(c,true);if(a){a.panel.onIncomingSubscribe(b)}return true},parseStatus:function(d){var a={status:"available",text:null};var b=d.getAttribute("type");if(b=="unavailable"){a.status="offline"}var c=d.getElementsByTagName("status");if(c&&c.length>0){a.text=Strophe.getText(c[0])}return a},getStatus:function(a){for(var b in this.statuses){if(a==Strophe.getBareJidFromJid(b)){return this.statuses[b]}}return{status:"offline",text:null}},onStatusChange:function(e){var b=e.getAttribute("type");if(b&&b!="unavailable"){return true}var f=e.getAttribute("from");var c=this.parseStatus(e);if(c.status!="offline"){this.statuses[f]=c}else{delete this.statuses[f]}var a=this.getChatPanel(f,true);if(a){a.panel.onStatusChange(e)}var d=document.getElement("img[name=status_"+Base64.encode(Strophe.getBareJidFromJid(f))+"]");if(d){d.src="/static/img/pidgin/"+c.status+".png"}return true},onRosterFetched:function(e){if(!this.subscriptions){this.subscriptions={}}var b=e.getElementsByTagName("item");for(var c=0;c<b.length;c++){var a=b[c].getAttribute("jid");var d=b[c].getAttribute("subscription");if(a&&d){this.subscriptions[a]=d}}}});var ChatPanelPlacer=new Class({panelWidth:250,lowerHeight:200,titleHeight:20,lowerBorder:1,horizontalMargin:20,panels:[],onWindowResize:function(c){for(var a=0;a<this.panels.length;a++){var b=this.panels[a];if(b){b.position()}}},initialize:function(){window.addEvent("resize",this.onWindowResize.bind(this));window.addEvent("scroll",this.onWindowResize.bind(this))},getDims:function(a){return{right:this.horizontalMargin*(a+1)+this.panelWidth*a,height:this.lowerHeight+this.titleHeight+2*this.lowerBorder,titleHeight:this.titleHeight}},getPanelDims:function(b){for(var a=0;a<this.panels.length;a++){if(this.panels[a]==b){return this.getDims(a)}}return null},registerPanel:function(b){var a=0;for(a=0;a<this.panels.length;a++){if(!this.panels[a]){break}}this.panels[a]=b},unregisterPanel:function(b){for(var a=0;a<this.panels.length;a++){if(this.panels[a]==b){this.panels[a]=null}}},getPanel:function(b){for(var a=0;a<this.panels.length;a++){if(this.panels[a]&&this.panels[a].contact==b){return this.panels[a]}}return null},closeChildren:function(){this.panels.each(function(a){a.closeChild()})}});var TitleFlasher=new Class({titles:[],originalTitle:null,flash:function(){if(document.title!=this.originalTitle){document.title=this.originalTitle}else{if(this.titles.length!=0){document.title=this.titles[0]}}},initialize:function(){this.originalTitle=document.title;this.flash.periodical(2000,this)},addTitle:function(a){if(!this.titles.contains(a)){this.titles.push(a)}},removeTitle:function(a){this.titles.erase(a)}});var titleFlasher=new TitleFlasher();var ChatPanelBase=new Class({xmppClient:null,titleFlasher:null,contact:null,resource:null,panel:null,chatDialog:null,lastDialogWidth:0,chatBox:null,testSpan:null,pauseTimeout:null,urlre:null,initialize:function(f,e,d){if(!f||!e||!d){throw"Not enough parameters to create chat panel"}this.contact=f;this.xmppClient=e;this.titleFlasher=d;this.panel=new Element("div",{"class":"chatPanel"}).inject(document.body);this.panel.addEvents({click:(function(j){this.titleFlasher.removeTitle(this.getTitle())}).create({bind:this,event:true})});this.testSpan=new Element("span",{"class":"chatDialog"}).inject(document.body);var i=new Element("div",{"class":"chatTitle"}).inject(this.panel);new Element("img",{"class":"chatStatus",src:""}).inject(i);var a=f;var h=this.getMaxContactLength();if(f.length>h){a=f.substr(0,h-1)+"..."}new Element("div",{"class":"chatContact",html:a}).inject(i);var g=new Element("div",{"class":"chatLowerPanel"}).inject(this.panel);this.chatDialog=new Element("div",{"class":"chatDialog"}).inject(g);var c=new Element("div",{"class":"chatBoxPanel"}).inject(g);var b=new Element("textarea",{"class":"chatBox"}).inject(c);b.addEvent("keypress",this.onKeyPress.create({bind:this,event:true}));b.focused=false;b.addEvent("focus",function(){b.focused=true});b.addEvent("blur",function(){b.focused=false});this.chatBox=b;this.changeStatus(this.xmppClient.getStatus(f));this.urlre=/^(((http|ftp|https):\/\/)|([wW]{3}\.))([A-Za-z0-9-]+\.)+([A-Za-z]{2,3})($|(\/(\S)*$)|(\?(\S)*$))/},getMaxContactLength:function(){return Number.MAX_VALUE},focusChatBox:function(){this.chatBox.focus()},getTextWidth:function(b){this.testSpan.innerHTML=b;var a=this.testSpan.offsetWidth?this.testSpan.offsetWidth:this.testSpan.clientWidth;this.testSpan.innerHTML="";return a},prepareText:function(d){var b=d.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/'/g,"\\'");var c=b.split(" ");var a=c.map(function(h){var e=[];var i=new String(h);while(i.length>0){var f=60;if(this.lastDialogWidth>0){while(this.getTextWidth(i.substr(0,f))>this.lastDialogWidth-30){f-=5}}e.push(i.substr(0,f));i=i.substr(f,i.length)}e=e.join("<br>");if(this.urlre.test(h)){var g=h;if(/^[wW]{3}/.test(h)){g="http://"+g}e="<a href="+g+' target="_blank">'+e+"</a>"}return e},this);return a.join(" ")},addMessage:function(e,g){var f=this.prepareText(g);var a=new Element("div",{"class":"chatMessage",html:"<b>"+e+": </b>"+f,name:"chatMessage"});var c=this.chatDialog.getElementsByTagName("div");var b=null;for(var d=0;d<c.length;d++){if(c[d].name!="chatState"){b=c[d]}}if(!b){a.inject(this.chatDialog,"top")}else{a.inject(b,"after")}this.chatDialog.scrollTop=this.chatDialog.scrollHeight},addInfo:function(c,b){var a=new Element("div",{"class":"chatInfo",html:c,name:b});a.inject(this.chatDialog);this.chatDialog.scrollTop=this.chatDialog.scrollHeight},deleteInfo:function(b){var a=this.panel.getElements("div[name="+b+"]");for(var c=0;c<a.length;c++){a[c].dispose();a[c].destroy()}},changeStatus:function(a){var b=this.panel.getElement("img[class=chatStatus]");b.src="/static/img/pidgin/"+a.status+".png";b.title=a.text?a.text:a.status},checkSubscription:function(){if(!this.xmppClient.subscriptions){return}var a=this.xmppClient.subscriptions[this.contact];if(a!="to"&&a!="both"){this.xmppClient.subscribe(this.contact);this.addInfo(gettext("asked_authorization"),"authInfo")}},getFullContact:function(){var a=this.contact;if(this.resource){if(this.xmppClient.statuses[a+"/"+this.resource]){a+="/"+this.resource}else{this.resource=null}}return a},onPaused:function(){this.xmppClient.sendChatNotification(this.getFullContact(),"paused");this.pauseTimeout=null},onKeyPress:function(a){this.titleFlasher.removeTitle(this.getTitle());if(a.key!="enter"){if(this.pauseTimeout){$clear(this.pauseTimeout)}else{this.xmppClient.sendChatNotification(this.getFullContact(),"composing")}this.pauseTimeout=this.onPaused.delay(5000,this);return}var b=this.chatBox.value;if(/^(\s*)$/.test(b)){return false}if(this.pauseTimeout){$clear(this.pauseTimeout);this.onPaused()}var c=this.getFullContact();this.xmppClient.sendMessage(c,b);this.addMessage(gettext("me"),b);this.checkSubscription();this.chatBox.value="";return false},getTitle:function(){return Strophe.getNodeFromJid(this.contact)+" "+gettext("wrote_message")+"..."},flashTitle:function(){this.titleFlasher.addTitle(this.getTitle())},onMessage:function(d){this.resource=Strophe.getResourceFromJid(d.getAttribute("from"));var a=d.getElementsByTagName("body");if(a.length==0){var c=d.getElementsByTagName("composing").length!=0;var b=d.getElementsByTagName("paused").length!=0;this.deleteInfo("chatState");if(c){this.addInfo(Strophe.getNodeFromJid(this.contact)+" "+gettext("is_typing")+"...","chatState")}}else{this.addMessage(Strophe.getNodeFromJid(this.contact),Strophe.getText(a[0]));this.flashTitle();this.checkSubscription()}return true},onIncomingSubscribe:function(a){var b=a.getAttribute("from");this.xmppClient.replyToSubscribe(b,true);this.addInfo(gettext("authorization_sent"),"authInfo");return true},onStatusChange:function(b){var a=b.getAttribute("type");if(a&&a!="unavailable"){return true}this.changeStatus(this.xmppClient.getStatus(this.contact));return true}});var ChatPanelParent=new Class({Extends:ChatPanelBase,panelRegistrar:null,minimized:null,childWindow:null,maxContactLength:21,initialize:function(f,e,c,d){this.panelRegistrar=c;this.panelRegistrar.registerPanel(this);this.parent(f,e,d);var i=this.panel.getElement("div[class=chatTitle]");var a=new Element("div",{"class":"chatClose"}).inject(i);var b=new Element("a",{"class":"chatCloseLink",href:"javascript: void(0)",html:"[x]"});b.addEvent("click",this.onClose.create({bind:this,event:true}));var h=new Element("a",{"class":"chatMinimizeLink",href:"javascript: void(0)",html:"[_]"});i.addEvent("click",this.onMinimize.create({bind:this,event:true}));var g=new Element("a",{"class":"chatMinimizeLink",href:"javascript: void(0)",html:"[+]"});g.addEvent("click",this.onMaximize.create({bind:this,event:true}));h.inject(a);g.inject(a);b.inject(a);this.position()},getMaxContactLength:function(){return this.maxContactLength},position:function(){var b=this.panelRegistrar.getPanelDims(this);var a=this.panel.getElement("div[class=chatLowerPanel]");var c=this.panel.getElement("a[class=chatMinimizeLink]");if(!this.minimized){this.panel.style.height=b.height;a.style.display="block";c.innerHTML="[_]"}else{this.panel.style.height=b.titleHeight;a.style.display="none";c.innerHTML="[&oline;]"}this.panel.style.right=b.right;this.panel.style.bottom=0;if(!this.childIsOpen()){this.panel.style.display="block";this.lastDialogWidth=this.chatDialog.offsetWidth?this.chatDialog.offsetWidth:this.chatDialog.clientWidth}},addMessage:function(b,c,a){this.parent(b,c);if(this.childIsOpen()&&!a){this.childPanel.addMessage(b,c,true)}},flashTitle:function(){if(this.childIsOpen()){this.childPanel.flashTitle()}else{this.parent()}},addInfo:function(c,a,b){this.parent(c,a);if(this.childIsOpen()&&!b){this.childPanel.addInfo(c,a,true)}},deleteInfo:function(a){this.parent(a);if(this.childIsOpen()){this.childPanel.deleteInfo(a)}},onMessage:function(a){if(!this.childIsOpen()){this.panel.style.display="block"}this.parent(a)},onClose:function(a){this.panelRegistrar.unregisterPanel(this);this.panel.dispose();this.panel.destroy();this.testSpan.dispose();this.testSpan.destroy();this.titleFlasher.removeTitle(this.getTitle());if(this.childWindow){this.childWindow.close()}return false},onMinimize:function(a){this.minimized=!this.minimized;this.position();this.titleFlasher.removeTitle(this.getTitle());return false},onMaximize:function(a){if(!this.childIsOpen()){this.childWindow=window.open("/chat-window/?contact="+encodeURI(this.contact)+"&rnd="+Math.random(),"_blank","toolbar=no, menubar=no, titlebar=no, location=no, status=no, resizable=yes, height=400, width=400, top=200, left=200")}this.childWindow.focus();this.titleFlasher.removeTitle(this.getTitle());this.panel.style.display="none";return false},onChildLoaded:function(a){this.childPanel=a},childIsOpen:function(){if(!this.childPanel){return false}if(this.childWindow.closed){this.childWindow=null;this.childPanel=null;return false}return true},getDialogHTML:function(){return this.chatDialog.innerHTML},closeChild:function(){if(this.childPanel){this.childWindow.close();this.childWindow=null;this.childPanel=null}this.position();this.chatDialog.scrollTop=this.chatDialog.scrollHeight}});var ChatPanelChild=new Class({Extends:ChatPanelBase,parentPanel:null,initialize:function(b,a,g,c){this.parent(b,a,g);this.parentPanel=c;this.parentPanel.onChildLoaded(this);var e=this.panel.getElement("div[class=chatTitle]");var d=new Element("div",{"class":"chatClose"}).inject(e);var f=new Element("a",{"class":"chatMinimizeLink",href:"javascript: void(0)",html:"[_]"});f.inject(d);e.addEvent("click",this.onMinimize.create({bind:this,event:true}));this.position()},position:function(){this.panel.style.height="100%";this.panel.style.width="100%";this.panel.style.border="none";this.panel.style.display="block";this.lastDialogWidth=this.chatDialog.offsetWidth?this.chatDialog.offsetWidth:this.chatDialog.clientWidth},copyDialogHTML:function(){var a=this.parentPanel.getDialogHTML();this.chatDialog.innerHTML=a;this.chatDialog.scrollTop=this.chatDialog.scrollHeight},addMessage:function(b,c,a){this.parent(b,c);if(!a){this.parentPanel.addMessage(b,c,true)}},onWindowClose:function(){this.parentPanel.onClose()},onMinimize:function(){window.onbeforeunload=null;window.onunload=null;this.parentPanel.closeChild()}});var childChatPanel=null;function xmppChildInit(){childChatPanel=new ChatPanelChild(contact,window.opener.xmppClient,titleFlasher,window.opener.chatPanelPlacer.getPanel(contact));childChatPanel.copyDialogHTML();window.addEvent("resize",childChatPanel.position.create({bind:childChatPanel,event:true}))}function xmppChildDeinit(){childChatPanel.onWindowClose()};
