var ChatBaby=Class.create();ChatBaby.prototype={initialize:function(b,a){this.daddy=b;this.user=a;if(this.user=="Admin"||this.daddy.config.username==""){this.broadcast=true}var c=b.linkTemplate.evaluate({user:a.gsub(/___/," "),safeUser:b.namesafe(a)});this.link=Element.extend(b.doc.createElement("span"));this.link.addClassName("chatBoxLink");this.link.innerHTML=c;this.statusSpan=Element.extend(b.doc.createElement("span"));this.link.insert(this.statusSpan);this.daddy.win.$("activeChatees").insert(this.link);b.showChatBar();this.container=Element.extend(b.doc.createElement("div"));this.container.addClassName("chatContainer");this.container.innerHTML=b.friendTemplate.evaluate({user:a.gsub(/___/," ")});if(this.broadcast){this.container.select(".imInput")[0].remove();this.container.select(".sendIM")[0].remove()
}this.daddy.win.$("chatContainer").insert(this.container);this.msgBox=this.container.select(".msgBox")[0];this.link.select(".onlineFriend")[0].observe("click",this.toggle.bindAsEventListener(this));this.container.select(".closeIM")[0].observe("click",this.close.bindAsEventListener(this));if(!this.broadcast){this.container.select(".sendIM")[0].observe("click",this.sendMsg.bindAsEventListener(this));this.textbox=this.container.select(".imInput")[0];this.textbox.observe("keypress",function(d){if(d.keyCode==13){this.sendMsg()}}.bindAsEventListener(this))}this.daddy.babies.each(function(d){if(d.value.active){d.value.reposition()}}.bind(this));this.showWorks=true;if(!this.broadcast){this.active=true;this.pendingMessages=new Array();this.hide();this.loadHistory()}else{this.hasAHistory=true}this.repositionActive()
},broadcast:false,daddy:null,user:null,chatWith:function(){if(!this.active){this.show()}},link:null,container:null,active:false,textbox:null,msgBox:null,lastMessageTime:null,lastMe:null,hasAHistory:false,toggle:function(){if(this.active){this.hide()}else{this.show()}this.daddy.saveActiveChats()},showWorks:false,show:function(){if(!this.active&&this.showWorks){this.daddy.babies.each(function(a){if(this!==a.value){a.value.hide()}}.bind(this));if(!this.hasAHistory){this.loadHistory()}this.container.show();this.active=true;this.reposition();this.daddy.win.$InfoBarContainer().updateChildBars();this.link.addClassName("activeChattee");this.scrollMsg();if(this.status=="alert"){this.setStatus("clear")}if(!this.broadcast){this.textbox.focus()}this.daddy.saveActiveChats()}else{if(!this.showWorks){this.triedShow=true
}}},reposition:function(){var d=this.link.cumulativeOffset();var c=this.link.getDimensions();var b=this.daddy.doc.viewport.getWidth();if(Prototype.Browser.IE){b-=26}var a=(b-(d.left+c.width))+"px";this.container.setStyle({right:a})},repositionActive:function(){if(this.active){this.reposition()}else{this.daddy.babies.each(function(a){if(a.value.active){a.value.reposition()}}.bind(this))}},hide:function(){if(this.active){this.container.hide();this.active=false;this.link.removeClassName("activeChattee");console.log("hidden");this.daddy.saveActiveChats()}},close:function(){this.container.remove();this.link.remove();this.daddy.recover(this)},status:"clear",statusSpan:null,setStatus:function(a,b){if(this.status!=a){this.status=a;if(a=="alert"){b=b.gsub(/"/,'\\"');this.statusSpan.innerHTML='<img src="/img/forum/tforums/chat/chatNotify.gif" width="16" height="13" alt="'+b+'" title="'+b+'"/>'
}else{if(a=="clear"){this.statusSpan.innerHTML=""}else{if(a=="unavailable"){b=b+" has become unavailable.";this.msgBox.insert({bottom:this.daddy.statusChangeTemplate.evaluate({body:b})});this.scrollMsg();this.textbox.disable();this.statusSpan.innerHTML='<img src="/img/forum/tforums/chat/unavailable.gif" width="16" height="13" alt="'+b+'" title="'+b+'"/>';this.lastMe=null}else{if(a=="available"){b=b+" has become available.";this.msgBox.insert({bottom:this.daddy.statusChangeTemplate.evaluate({body:b})});this.scrollMsg();this.setStatus("clear",null);this.textbox.enable()}else{if(a=="away"){b=b+" has gone idle.";this.msgBox.insert({bottom:this.daddy.statusChangeTemplate.evaluate({body:b})});this.scrollMsg();this.setStatus("clear",null);this.textbox.enable()}}}}}this.repositionActive()}},messageRecieved:function(d){try{Sound.play("/img/forum/tforums/chat/bleep2.wav")
}catch(c){}if(this.pendingMessages!=null){console.log("putting in pending");var a=new ChatPendingMessage();a.body=d;a.time=(new Date()).getTime();this.pendingMessages.push(a)}else{this.lastMessageTime=new Date();var b=new Date();b.setMinutes(b.getMinutes()+b.getTimezoneOffset());this.renderMessageRecieved(d,b);if(!this.active){this.setStatus("alert","Message recieved")}}},fmtTime:function(b){var a=new Date();a.setHours(a.getHours()-24);if(b.getTime()<a.getTime()||b.getDate()!=(new Date()).getDate()){return formatDateTimeDate(b,"TY[MONTH/DAY] HMIL:MINUTE")}return formatDateTimeDate(b,"HMIL:MINUTE")},renderMessageRecieved:function(g,b){if(g=="Pending chat denied."){var d=this.user+" has denied your request to chat.";this.msgBox.insert({bottom:this.daddy.statusChangeTemplate.evaluate({body:d})});this.scrollMsg();
this.setStatus("clear",null);var a=new Date();var f=1000*60*5;if(a.getTime()-b.getTime()<=f){this.textbox.disable()}return}if(!this.broadcast){this.textbox.enable()}if(this.lastMe==true||this.lastMe==null){var c=this.fmtTime(b);var e=Element.extend(this.daddy.doc.createElement("span"));e.innerHTML=this.daddy.messageHeaderTemplate.evaluate({from:this.user.gsub(/___/," "),body:g,time:c});this.msgBox.insert({bottom:e})}var e=Element.extend(this.daddy.doc.createElement("span"));e.innerHTML=this.daddy.continueMessageTemplate.evaluate({body:g});this.msgBox.insert({bottom:e});this.scrollMsg();this.lastMe=false},renderSentMessage:function(e,a){if(e=="Pending chat denied."){var c="You denied "+this.user+"'s request to chat.";this.msgBox.insert({bottom:this.daddy.statusChangeTemplate.evaluate({body:c})});this.scrollMsg();
this.setStatus("clear",null);return}if(this.lastMe==false||this.lastMe==null){var b=this.fmtTime(a);var d=Element.extend(this.daddy.doc.createElement("span"));d.innerHTML=this.daddy.messageHeaderTemplate.evaluate({from:this.daddy.config.username,body:e,time:b});this.msgBox.insert({bottom:d})}var d=Element.extend(this.daddy.doc.createElement("span"));d.innerHTML=this.daddy.continueMessageTemplate.evaluate({body:e});this.msgBox.insert({bottom:d});this.scrollMsg();this.lastMe=true},scrollMsg:function(){this.msgBox.scrollTop=this.msgBox.scrollHeight},sendMsg:function(){var g=this.textbox.value;var c=this.user.gsub(/ /,"___");var b=c;if(g==""){return false}if(c.indexOf("@")==-1){b+="@"+this.daddy.con.domain}try{if(this.user=="Broadcast"){this.daddy.broadcaster.sendMessage(g)}else{this.lastMessageTime=new Date();
var a=new JSJaCMessage();a.setTo(new JSJaCJID(b));a.setBody(g);this.daddy.con.send(a)}var f=new Date();f.setMinutes(f.getMinutes()+f.getTimezoneOffset());this.renderSentMessage(g,f);this.textbox.value="";this.daddy.saveActiveChats();return false}catch(h){var i=Element.extend(this.daddy.doc.createElement("div"));i.addClassName("msg");i.addClassName("error");i.innerHTML="Error: "+h.message;this.msgBox.insert(i);this.scrollMsg();return false}return false},chatHistoryMaxLines:20,makeIQ:function(b,g,e){var c=JSJACPACKET_USE_XMLNS;JSJACPACKET_USE_XMLNS=false;var f=new JSJaCIQ();f.setType("get");f.setID("history_"+this.daddy.transN());var a=null;var d=null;if(f.getDoc().createElementNS!=undefined){a=f.getDoc().createElementNS("http://www.xmpp.org/extensions/xep-0136.html#ns",b);d=f.getDoc().createElementNS("http://jabber.org/protocol/rsm","set")
}else{a=f.getDoc().createElement(b);d=f.getDoc().createElement("set");a.setAttribute("xmlns","http://www.xmpp.org/extensions/xep-0136.html#ns");d.setAttribute("xmlns","http://jabber.org/protocol/rsm")}a.appendChild(d);if(e==null){a.setAttribute("with",this.user+"@"+this.daddy.con.domain)}else{a.setAttribute("with",e)}if(g!=null){a.setAttribute("start",g)}f.getNode().appendChild(a);JSJACPACKET_USE_XMLNS=c;return f},finishTimer:null,triedShow:false,loadHistory:function(){console.log("loading history");this.hasAHistory=true;var a=this.makeIQ("list",null,null);this.daddy.con.send(a,this.historyReply.bind(this));this.triedShow=false;this.showWorks=false;this.finishTimer=setTimeout(this.finishHistory.bind(this),2000)},histChats:null,histPointer:0,histLines:null,histLinesCount:0,pendingMessages:null,historyReply:function(a){clearTimeout(this.finishTimer);
console.log("history reply: "+a.xml());this.histChats=$A(a.getNode().getElementsByTagName("chat"));this.histChats.reverse();this.histPointer=0;this.histLines=new Array();this.histLinesCount=0;if(this.histChats.length==0){console.log("no chat history");this.finishHistory()}else{this.requestNextCollection()}},requestNextCollection:function(){var a=this.histChats[this.histPointer];if(a!=null){this.histPointer++;var b=this.makeIQ("retrieve",a.getAttribute("start"),a.getAttribute("with"));this.daddy.con.send(b,this.collectionReply.bind(this))}},collectionReply:function(d){var a=d.getNode().getElementsByTagName("chat")[0];var b=a.getAttribute("start").match(/(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2})(\.\d+)?Z/);console.log("block starts at "+a.getAttribute("start"));var c=new Date(b[1],b[2]-1,b[3],b[4],b[5],b[6]);
var e=new Array();$A(a.childNodes).each(function(h){var i=h.nodeName.toLowerCase();if(i=="to"||i=="from"){var f=h.getAttribute("secs");var g=new Date();g.setTime(c.getTime());g.setSeconds(g.getSeconds()+parseInt(f));e.push({kind:i,body:h.getElementsByTagName("body")[0].firstChild.data,date:g});this.histLinesCount++}}.bind(this));this.histLines.unshift(e);if(this.histLinesCount<this.chatHistoryMaxLines&&this.histPointer<this.histChats.length){this.requestNextCollection()}else{this.finishHistory()}},finishHistory:function(){var a=new Array();if(this.histLines!=null){this.histLines.each(function(b){b.each(function(d){var c=true;a.each(function(e){if(d.body==e){c=false}});if(c){if(d.kind=="from"){this.renderMessageRecieved(d.body.gsub(/>/,"&gt;").gsub(/</,"&lt;"),d.date);a.push(d.body)}else{if(d.kind=="to"){this.renderSentMessage(d.body.gsub(/>/,"&gt;").gsub(/</,"&lt;"),d.date)
}}}}.bind(this))}.bind(this))}if(this.pendingMessages!=null){this.pendingMessages.each(function(c){var b=true;a.each(function(d){if(c.body==d){b=false}});if(b){this.renderMessageRecieved(c.body,c.time);this.lastMessageTime=new Date()}}.bind(this));if(!this.active){this.setStatus("alert","Message recieved")}this.pendingMessages=null}this.lastMe=null;this.showWorks=true;if(this.triedShow){this.show()}}};
