/* OmnomIRC COPYRIGHT 2010,2011 Netham45 OmnomIRC JavaScript Client rewrite COPYRIGHT 2013 Nathaniel 'Eeems' van Diepen This file is part of OmnomIRC. OmnomIRC is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. OmnomIRC is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with OmnomIRC. If not, see . */ (function(window,undefined){ document.domain=HOSTNAME; var OmnomIRC = window.OmnomIRC = (function(){ var ret = { options: "----------------------------------------|", //40 for future expansion!(and 40 bytes isn't much.) Pipe is a terminator. cookieLoad: proto('cookieLoad'), getOption: proto('getOption'), setOption: proto('setOption'), clearCookies: proto('clearCookies'), getHTMLToggle: proto('getHTMLToggle'), setAllowNotification: proto('setAllowNotification'), startIndicator: proto('startIndicator'), stopIndicator: proto('stopIndicator') }, _fn = function(fn,args){ if(args === undefined){ args = []; } return proto(fn).call(ret,args); }; if(message.addEventListener ){ message.addEventListener("keydown",_fn('keyHandler'),false); }else if(message.attachEvent ){ message.attachEvent("onkeydown",_fn('keyHandler')); } window.onLoad = this.cookieLoad(); return ret; })(), proto = function(fn){ return function(){ try{ return _proto[fn].apply(OmnomIRC,arguments); }catch(e){ return null; } }; }, run = function(fn,args,scope){ if(scope === undefined){ scope = this; } if(args === undefined){ args = []; }else if(!args instanceof Array){ args = [args]; } return proto(fn).apply(scope,args); }, _proto = { cookieLoad: function() { if (document.cookie.indexOf("OmnomIRC") >= 0) { this.options = document.cookie.replace(/^.*OmnomIRC=(.+?)|.*/, "\$1"); }else{ document.cookie = "OmnomIRC=" + this.options + ";expires=Sat, 20 Nov 2286 17:46:39 GMT;"; } }, getOption: function(Option,def) { //Returns what 'Option' is. Option must be a number 1-40. def is what to return if it is not set(equal to -) if (Option < 1 || Option > 40){ return 0; } var result = this.options.charAt(Option - 1); if (result == '-'){ return def; } return result; }, setOption: function(Option, value,noRefresh) { //Sets 'Option' to 'value'. Value must be a single char. Option must be a number 1-40. if (Option < 1 || Option > 40){ return; } this.options = this.options.substring(0, Option - 1) + value + this.options.substring(Option); document.cookie = "OmnomIRC=" + this.options + ";expires=Sat, 20 Nov 2286 17:46:39 GMT;"; if (!noRefresh){ document.location.reload(); } }, clearCookies: function(){ document.cookie = "OmnomIRC=a;expires=Thu, 01-Jan-1970 00:00:01 GMT;"; document.cookie = "OmnomChannels=a;expires=Thu, 01-Jan-1970 00:00:01 GMT;"; document.location.reload(); }, permissionGranted: function(){ if (window.webkitNotifications.checkPermission() === 0){ run('showNotification',"Notifications Enabled"); this.setOption(7,'T'); window.location.refresh(true); } }, getHTMLToggle: function(State, StateOn, StateOff,StateOnFunc,StateOffFunc){ var result = ""; if (State){ result += ""; result += StateOn; result += ""; }else{ result += ''; result += StateOn; result += ''; } result += ""; if(!State){ result += ""; result += StateOff; result += ""; }else{ result += ''; result += StateOff; result += ''; } return result; }, setAllowNotification: function(){ if (window.webkitNotifications === undefined || window.webkitNotifications === null || !window.webkitNotifications){ alert("This feature only works in chrome."); return; } window.webkitNotifications.requestPermission(run('permissionGranted')); }, showNotification: function(message){ if (window.webkitNotifications === undefined || window.webkitNotifications === null || !window.webkitNotifications){ return 0; } if (window.webkitNotifications.checkPermission() !== 0){ return 0; } var n; n = window.webkitNotifications.createNotification('http://www.omnimaga.org/favicon.ico', 'OmnomIRC Highlight', message); n.show(); }, keyHandler: function(e){ var getCurrentWord = run('getCurrentWord'), TABKEY = 9; if (getCurrentWord() === ""){ return true; } if(e.keyCode == TABKEY){ if(e.preventDefault) { e.preventDefault(); } tabWord = getCurrentWord(); getTabComplete(); tabCount++; isInTab = true; //setTimeout(1,1); //Who woulda thought that a bogus call makes it not parse it in FF4? return false; }else{ tabWord = ""; tabCount = 0; isInTab = false; } }, getCurrentWord: function(){ if (isInTab){ return tabWord; } startPos = message.selectionStart; endPos = message.selectionStart; var startChar = message.value.charAt(startPos); while (startChar != " " && --startPos > 0){ startChar = message.value.charAt(startPos); } if (startChar == " "){ startPos++; } var endChar = message.value.charAt(endPos); while (endChar != " " && ++endPos <= message.value.length){ endChar = message.value.charAt(endPos); } endPosO = endPos; return message.value.substr(startPos,endPos - startPos).trim(); }, getTabComplete: function(){ var getCurrentWord = run('getCurrentWord'), name = searchUser(getCurrentWord(),tabCount); if (!isInTab){ startPos = message.selectionStart; var startChar = message.value.charAt(startPos); while (startChar != " " && --startPos > 0){ startChar = message.value.charAt(startPos); } if (startChar == " "){ startChar+=2; } endPos = message.selectionStart; var endChar = message.value.charAt(endPos); while (endChar != " " && ++endPos <= message.value.length){ endChar = message.value.charAt(endPos); } if (endChar == " "){ endChar-=2; } } if (name == getCurrentWord()){ tabCount = 0; name = searchUser(getCurrentWord(),tabCount); } message.value = message.value.substr(0,startPos) + name + message.value.substr(endPos + 1); endPos = endPosO + name.length; }, startIndicator: function(){ if(!indicatorTimer){ indicatorTimer = setInterval(run('updateIndicator'),50); indicatorPixels = Array(true,true,true,true,true,false,false,false); } }, stopIndicator: function() { clearInterval(indicatorTimer); document.getElementById('indicator').innerHTML = ''; indicatorTimer = false; }, updateIndicator: function() { var indicator = document.getElementById('indicator'), div, temp = indicatorPixels[7]; indicator.innerHTML = ""; for (var i=0;i<8;i++){ div = document.createElement('div'); div.style.padding = 0; div.style.margin = 0; div.style.width = '3px'; div.style.height = '3px'; if (indicatorPixels[i]){ div.style.backgroundColor = 'black'; } indicator.appendChild(div); } for(i=6;i>=0;i--){ indicatorPixels[(i+1)] = indicatorPixels[i]; } indicatorPixels[0] = temp; }, readOldMessagesCookies: function() { var oldMessages = [], temp = getCookie("oldMessages-"+run('getChannelEn')); if (temp!==null){ oldMessages = temp.split("\n"); } messageCounter = oldMessages.length; }, startLoop: function(){ xmlhttp=getAjaxObject(); if (xmlhttp===null) { alert ("Your browser does not support AJAX! Please update for OmnomIRC compatibility."); return; } xmlhttp.onreadystatechange=getIncomingLine; run('sendRequest'); }, cancelRequest: function(){ xmlhttp.abort(); inRequest = false; }, sendRequest: function(){ if(inRequest){ return; } var url = "Update.php?lineNum=" + curLine + "&channel=" + run('getChannelEn') + "&nick=" + base64.encode(userName) + "&signature=" + base64.encode(Signature); xmlhttp.open("GET",url,true); if(isBlurred()){ setTimeout(function(){ xmlhttp.send(null); },2500); //Only query every 2.5 seconds maximum if not foregrounded. }else{ setTimeout(function(){ xmlhttp.send(null); },75); //Wait for everything to get parsed before requesting again. } inRequest = true; }, getIncomingLine: function(){ if(xmlhttp.readyState==4 || xmlhttp.readyState=="complete"){ inRequest = false; if(xmlhttp.responseText == "Could not connect to SQL DB." || xmlhttp.status != 200){ errorCount++; if(errorCount == 10){ OmnomIRC_Error("OmnomIRC has lost connection to server. Please refresh to reconnect."); return; }else{ run('sendRequest'); return; } } if(xmlhttp.status == 200){ run('addLines',xmlhttp.responseText); //Filter out 500s from timeouts } errorCount = 0; run('sendRequest'); } }, getAjaxObject: function(){ xmlhttp=new XMLHttpRequest(); //Decent Browsers if(!xmlhttp || xmlhttp === undefined || xmlhttp === null){ xmlhttp = new ActiveXObject("Msxml2.XMLHTTP"); //IE7+ } if(!xmlhttp || xmlhttp === undefined || xmlhttp === null){ xmlhttp = new ActiveXObject("Microsoft.XMLHTTP"); //IE6- } return xmlhttp; }, addLines: function(message){ var parts = message.split("\n"); for (var i=0;i 2){ run('addLine',parts[i]); } } }, addLine: function(message){ if(!message || message === null || message === undefined){ return; } var lnNum = parseInt(message.split(":")[0]); curLine = parseInt(curLine); if (lnNum > curLine){ curLine = lnNum; } var doScroll = false; if(mBoxCont.clientHeight + mBoxCont.scrollTop > mBoxCont.scrollHeight - 50){ doScroll = true; } //messageBox = document.getElementById("MessageBox"); /* if ("\v" != "v") //If IE, take the slow but sure route (This is enough of a performance hit in all browsers to use the optimized code if possible. Also, IE can go fuck itself.) mBoxCont.innerHTML = '' + messageBox.innerHTML + parseMessage(message) + '
'; else //If not IE, yay! messageBox.innerHTML = messageBox.innerHTML + parseMessage(message);*/ var row = run('parseMessage',message); if(row){ messageBox.appendChild(row); } if(doScroll){ mBoxCont.scrollTop = mBoxCont.scrollHeight + 50; } }, parseMessage: function(message){ //type of message var //a = message, parts = message.split(":"), //lnumber = parts[0], type = parts[1], online = parts[2], parsedMessage = "", i; for(i = 4;i < parts.length;i++){ parts[i] = base64.decode(parts[i]); } name = clickable_names(parts[4],online); var undefined; if(parts[5] === undefined || parts[5] === ""){ parts[5] = " "; } if(parts[5] !== undefined && parts[5] !== null){ parsedMessage = run('parseColors',parts[5]); if(parts[5].toLowerCase().indexOf(userName.toLowerCase().substr(0,4)) >= 0 && hasLoaded && notifications && parts[4].toLowerCase() != "new"){ run('showNotification',"<" + parts[4] + "> " + parts[5]); if(highDing){ document.getElementById('ding').play(); } } } if((type == "message" || type == "action") && parts[4].toLowerCase() != "new"){ parsedMessage = run('parseHighlight',parsedMessage); } retval = ""; displayMessage = true; var tdTime = document.createElement('td'); tdTime.className="irc-date"; var tdName = document.createElement('td'); tdName.className="name"; tdName.innerHTML = '*'; var tdMessage = document.createElement('td'); tdMessage.className=type; switch(type){ case "reload": run('startIndicator'); run('cancelRequest'); hasLoaded = false; scrolledDown = true; curLine = 0; UserListArr = []; userListDiv.innerHTML = ""; run('drawChannels'); var body= document.getElementsByTagName('body')[0], script= document.createElement('script'); script.type= 'text/javascript'; script.src= 'Load.php?count=125&channel=' + run('getChannelEn') + "&nick=" + base64.encode(userName) + "&signature=" + base64.encode(Signature) + "&time=" + (new Date).getTime();; script.onload= function(){ run('parseUsers'); run('startLoop'); mBoxCont.scrollTop = mBoxCont.scrollHeight; hasLoaded = true; run('stopIndicator'); }; body.appendChild(script); displayMessage = false; break; case "join": tdMessage.innerHTML = name + " has joined "+run('getChannelDe'); run('addUserJoin',[parts[4],online]); if (online == "1"){ return ""; } break; case "part": tdMessage.innerHTML = name + " has left "+run('getChannelDe')+" (" + parsedMessage + ")"; run('removeUser',parts[4]); if (online == "1"){ return ""; } break; case "quit": tdMessage.innerHTML = name + " has quit IRC (" + parsedMessage + ")"; run('removeUser',parts[4]); break; case "kick": tdMessage.innerHTML = name + " has kicked " + parts[5] + " from "+getChannelDe()+" (" + parts[6] + ")"; run('removeUser',parts[4]); break; case "message": tdName.innerHTML = name; tdMessage.innerHTML = parsedMessage; break; case "action": tdMessage.innerHTML = name + " " + parsedMessage; break; case "mode": tdMessage.innerHTML = name + " set "+run('getChannelDe')+" mode " + parts[5]; break; case "nick": tdMessage.innerHTML = name + " has changed his nick to " + parsedMessage; run('removeUser',parts[4]); run('addUserJoin',[parts[5],online]); break; case "topic": if(name!=="" && name!="undefined" && name!=" " && (typeof name != 'undefined')){ tdMessage.innerHTML = name + " has changed the topic to " + parsedMessage; }else{ displayMessage = false; } run('setTopic',parsedMessage); break; case "internal": tdMessage.innerHTML = parts[4]; break; case "server": tdMessage.innerHTML = parsedMessage; break; case "pm": if (run('getChannelDe').toLowerCase() != ("*" + parts[4]).toLowerCase() && parts[4] != userName){//Not in the PM window if (!hasLoaded){ return ""; } tdMessage.innerHTML = parsedMessage; tdName.innerHTML = "(PM)" + name; if (hasLoaded){ run('openPMWindow',parts[4]); if(notifications){ run('showNotification',"(PM) <" + parts[4] + "> " + parts[5]); } if(highDing){ document.getElementById('ding').play(); } document.getElementById("*" + parts[4]).style.color="#C22"; } }else{ tdMessage.className="message"; tdMessage.innerHTML = parsedMessage; //In the PM window tdName.innerHTML = name; } break; case "curline": return ""; case "highlight": if(parts[6].toLowerCase() == "new"){ return ""; } //document.getElementById(parts[4]).style.color="#C22"; //This call will fail if they aren't in the chan. Crude, but effective. if(notifications){ run('showNotification',"(" + parts[4] + ") <" + parts[6] + "> " + parts[7]); } if(highDing){ document.getElementById('ding').play(); } return ""; case "default": return ""; } var row = document.createElement("tr"); //pretag = ''; doHigh = !doHigh; if (lineHigh && doHigh && displayMessage){ //pretag = ''; row.className = "linehigh"; } doLineHigh = !doLineHigh; if(type != "internal"){ d = new Date(parts[3]*1000); } if (type == "internal"){ d = new Date(); } tdTime.innerHTML = '[' + d.toLocaleTimeString() + ']'; tdTime.style.height="1px"; tdName.style.height="1px"; tdMessage.style.height="1px"; if(showTime){ row.appendChild(tdTime); } row.appendChild(tdName); row.appendChild(tdMessage); row.style.width="100%"; row.style.height="1px"; refreshThis(row); if(tdName.innerHTML == "*"){ statusTxt = tdName.innerHTML + " "; }else{ statusTxt = "<" + StripHTML(tdName.innerHTML) + "> "; } if (showTime){ statusTxt = "[" + d.toLocaleTimeString() + "] " + statusTxt; } statusTxt = statusTxt + StripHTML(tdMessage.innerHTML); run('changeStatusBarText',statusTxt); if(displayMessage){ return row; }else{ return; } }, fixMBoxContHeight: function(){ mBoxCont.scrollTop = mBoxCont.scrollHeight; }, parseSmileys: function(s){ //smileys if (showSmileys) { var addStuff = ""; if (scrolledDown){ addStuff = "onload='fixMBoxContHeight();'"; } s = s.replace(/(^| )(::\)|::-\))/g,"$1Roll Eyes"); s = s.replace(/(^| )(:\)|:-\))/g,"$1smiley"); s = s.replace(/(^| )(;\)|;-\))/g,"$1Wink"); s = s.replace(/(^| )(>:D|>:-D)/g,"$1Evil"); s = s.replace(/(^| )(:D|:-D)/g,"$1Cheesy"); s = s.replace(/(^| )(;D|;-D)/g,"$1Grin"); s = s.replace(/(^| )(>:\(|>:-\()/g,"$1Angry"); s = s.replace(/(^| )(:\(|:-\()/g,"$1Sad"); s = s.replace(/(^| )(:o|:O|:-o|:-O)/g,"$1Shocked"); s = s.replace(/(^| )(8\))/g,"$1Cool"); s = s.replace(/(^| )\?\?\?/g,"$1Huh"); s = s.replace(/(^| )(:P|:-P|:p|:-p)/g,"$1Tongue"); s = s.replace(/(^| )(:\[|:-\[)/g,"$1Embarrassed"); s = s.replace(/(^| )(:x|:-x|:X|:-X)/g,"$1Lips Sealed"); s = s.replace(/(^| )(:\\|:-\\)/g,"$1Undecided"); s = s.replace(/(^| ):-\*/g,"$1Kiss"); s = s.replace(/(^| )(:'\(|:'-\()/g,"$1Cry"); s = s.replace(/:thumbsup:/g,"Thumbs Up"); s = s.replace(/(^| )O\.O/g,"$1Shocked"); s = s.replace(/(^| )\^-\^/g,"$1Azn"); s = s.replace(/(^| )>B\)/g,"$1Alien"); s = s.replace(/(:banghead:|:headbang:)/g,"Bandhead"); s = s.replace(/:angel:/g,"Angel"); s = s.replace(/(^| )\._\./g,"$1Blah"); s = s.replace(/:devil:/g,"Devil"); s = s.replace(/(^| )<_</g,"$1Dry"); s = s.replace(/:evillaugh:/g,"Evil Laugh"); s = s.replace(/:crazy:/g,"Crazy"); s = s.replace(/:hyper:/g,"Hyper"); s = s.replace(/:love:/g,"Love"); s = s.replace(/:mad:/g,"Mad"); s = s.replace(/:w00t:/g,"w00t"); s = s.replace(/(^| )\*\.\*/g,"$1O.O.O"); s = s.replace(/(^| )D:/g,"$1Big Frown"); s = s.replace(/(^| )(XD|xD)/g,"$1XD"); s = s.replace(/(^| )x\.x/g,"$1x.x"); s = s.replace(/:ninja:/g,"Ninja"); } return s; }, parseColors: function(colorStr){ //colors if (!colorStr || colorStr === null || colorStr === undefined){ return; } colorStr = clickable_links(colorStr); colorStr = run('parseSmileys',colorStr); //lcount = 0; //a = colorStr; var arrayResults = [], isBool = false, numSpan = 0, isItalic = false, isUnderline = false, s, colorStrTemp = "1,0"; colorStr+="\x0f"; arrayResults = colorStr.split(RegExp("([\x02\x03\x0f\x16\x1d\x1f])")); colorStr=""; for(var i=0;i"); if(s==arrayResults[i]){ s=arrayResults[i].replace(/^([0-9]{1,2})/g,""); }else{ numSpan++; } colorStr+=s; break; case "\x02": isBool = !isBool; if(isBool){ colorStr+=""; }else{ colorStr+=""; } break; case "\x1d": isItalic = !isItalic; if(isItalic){ colorStr+=""; }else{ colorStr+=""; } break; case "\x16": for(j=0;j"); stemp=colorStrTemp.replace(/^([0-9]{1,2}),([0-9]{1,2}).+/g,"$2,$1"); if(s==colorStrTemp){ s=colorStrTemp.replace(/^([0-9]{1,2}).+/g,""); stemp=colorStrTemp.replace(/^([0-9]{1,2}).+/g,"0,$1"); } colorStrTemp = stemp; colorStr+=s; break; case "\x1f": isUnderline = !isUnderline; if(isUnderline){ colorStr+=""; }else{ colorStr+=""; } break; case "\x0f": if(isUnderline){ colorStr+=""; isUnderline=false; } if(isItalic){ colorStr+=""; isItalic=false; } if(isBool){ colorStr+=""; isBool = false; } for(j=0;j= 0){ var style = ""; if(highRed){ style = style + "color:#C73232;"; } if(highBold){ style = style + "font-weight:bold;"; } return '' + text + ""; } return text; }, clickable_links: function(text){ //urls if (!text || text === null || text === undefined){ return; } //text = text.replace(/http:\/\/www\.omnimaga\.org\//g,"h111://www.omnimaga.org/"); //text = text.replace(/http:\/\/ourl\.ca\//g,"h111://ourl.ca/"); //text = text.replace(/((h111:\/\/(www\.omnimaga\.org\/|ourl\.ca))[-a-zA-Z0-9@:;%_+.~#?&//=]+)/, '$1'); text = text.replace(RegExp("(^|.)(((f|ht)(tp|tps):\/\/)[^\\s\x02\x03\x0f\x16\x1d\x1f]*)","g"),'$1$2'); text = text.replace(RegExp("(^|\\s)(www\.[^\\s\x02\x03\x0f\x16\x1d\x1f]*)","g"),'$1$2'); //text = text.replace(/h111/g,"http"); return text; }, clickable_names: function(name,isOnline){ //omnomirc names if (isOnline == "1"){ return '' + run('colored_names',name) + ''; } return run('colored_names',name); }, colored_names: function(name){ //colored neames (duh) if (!coloredNames){ return name; } if (!name || name === null || name === undefined){ return; } var rcolors = [19, 20, 22, 24, 25, 26, 27, 28, 29], sum = 0, i = 0; while (name[i]){ sum += name.charCodeAt(i++); } sum %= 9; return ''+name+''; }, refreshThis: function(elementOnShow){ var msie = 'Microsoft Internet Explorer'; var tmp = 0; if (navigator.appName == msie){ tmp = elementOnShow.offsetTop + 'px'; }else{ tmp = elementOnShow.offsetTop; } }, addUser: function(user){ UserListArr.push(user); }, addUserJoin: function(user,online){ if(!hasLoaded){ return; } UserListArr.push(base64.encode(user) + ":" + online); run('parseUsers'); }, parseUsers: function(){ if (!userListDiv || userListDiv == null){ userListDiv = document.getElementById("UserList"); } userText = ""; i = 0; UserListArr.sort( function(a,b){ var al = base64.decode(a).toLowerCase(), bl = base64.decode(b).toLowerCase(); return al==bl?(a==b?0:a"; } if(parts[1] == "1"){ userText = userText + 'Omnimaga User' + base64.decode(parts[0]) + '
'; } if(parts[1] == "2"){ userText = userText + "!" + base64.decode(parts[0]) + "
"; } } userText = userText + "

"; userListDiv.innerHTML = userText; }, removeUser: function(user){ if(!hasLoaded){ return; } for(var i in UserListArr){ var parts = UserListArr[i].split(":"); if (base64.decode(parts[0]) == user){ UserListArr.splice(i,1); } } run('parseUsers'); }, load: function(){ var getOption = proto('getOption'); run('cookieLoad'); lineHigh = getOption(6,"T") == "T"; doHigh = false; coloredNames = getOption(3,"F") == "T"; highRed = getOption(2,"T") == "T"; highBold = getOption(1,"T") == "T"; enabled = getOption(5,"T") == "T"; notifications = getOption(7,"F") == "T"; highDing = getOption(8,"F") == "T"; showExChans = getOption(9,"F") == "T"; showTime = getOption(10,"F") == "T"; doStatusUpdates = getOption(11,"T") == "T"; showSmileys = getOption(12,"T") == "T"; hasLoaded = false; if (!showSmileys){ document.getElementById('smileyMenuButton').src='smileys/smiley_grey.png'; document.getElementById('smileyMenuButton').style.cursor='default'; } if (!enabled){ mboxCont.appendChild(messageBox); messageBox.innerHTML = 'OmnomIRC is disabled. Click here to enable.'; return false; } doLineHigh=true; var body= document.getElementsByTagName('body')[0], chanScr= document.createElement('script'); chanScr.type= 'text/javascript'; chanScr.src= 'Channels.php'; chanScr.onload= function(){ run('channelSelectorCallback'); run('readOldMessagesCookies'); }; body.appendChild(chanScr); chanList = document.getElementById('chanList'); run('isBlurred'); if (userName == "Guest"){ var message = document.getElementById("message"); message.disabled = "true"; message.value = "You need to login if you want to chat!"; } }, toggleEnable: function(){ run('setOption',[5,!(run('getOption',[5,'T']) == 'T')?'T':'F']); window.location.reload(true); }, sendAJAXMessage: function(name,signature,message,chan){ //'chan' kept for legacy purposes. if (message[0] == "/"){ if (run('parseCommand',message.substr(1))) return; } if (run('getChannelDe')[0] == "*"){ var d = new Date(), str="0:pm:0:" + d.getTime()/1000 + ":" + base64.encode(name) + ":" + base64.encode(HTMLEncode(message)); //Print PMs locally. //addLine(str); } var xmlhttp2=new XMLHttpRequest(); xmlhttp2.onreadyStateChange = function(){ console.log(xmlhttp2.readyState,xmlhttp2.responseText); }; xmlhttp2.open( "GET", "message.php?nick=" + base64.encode(name) + "&signature="+base64.encode(signature)+"&message=" + base64.encode(message) +"&channel=" + run('getChannelEn'), false ); xmlhttp2.send(null); }, channelSelectorCallback: function(){ messageBox.cellPadding = "0px"; messageBox.cellSpacing = "0px"; if (showExChans){ for (var i in exChannels){ channels.push(exChannels[i]); } } /*if (moreChans) for(i in moreChans) channels.push(base64.encode(moreChans[i]));*/ run('loadChannels'); //From cookies run('drawChannels'); scrolledDown = true; var body= document.getElementsByTagName('body')[0], script= document.createElement('script'); script.type= 'text/javascript'; script.src= 'Load.php?count=125&channel=' + run('getChannelEn') + "&nick=" + base64.encode(userName) + "&signature=" + base64.encode(Signature) + "&time=" + (new Date).getTime(); script.onload= function(){ mBoxCont.appendChild(messageBox); run('parseUsers'); run('startLoop'); mBoxCont.scrollTop = mBoxCont.scrollHeight; hasLoaded = true; run('stopIndicator'); }; body.appendChild(script); }, changeChannel: function(){ //Empty out dirty holders cancelRequest(); startIndicator(); mBoxCont.innerHTML = ''; messageBox = document.createElement("table"); messageBox.className='MessageBox'; messageBox.style.width="100%"; messageBox.style.height="100%"; messageBox.cellPadding = "0px"; messageBox.cellSpacing = "0px"; hasLoaded = false; scrolledDown = true; curLine = 0; UserListArr = []; userListDiv.innerHTML = ""; drawChannels(); var body= document.getElementsByTagName('body')[0], script= document.createElement('script'); script.type= 'text/javascript'; script.src= 'Load.php?count=125&channel=' + getChannelEn() + "&nick=" + base64.encode(userName) + "&signature=" + base64.encode(Signature) + "&time=" + (new Date).getTime();; script.onload= function(){mBoxCont.appendChild(messageBox);parseUsers();startLoop();mBoxCont.scrollTop = mBoxCont.scrollHeight;hasLoaded = true;stopIndicator();}; body.appendChild(script); }, drawChannels: function(){ "use strict"; var table, td, span, span2, chanName, docfrag = document.createDocumentFragment(), chanList = document.getElementById("ChanList"); for (var i in channels){ // build elements/variables table = document.createElement('table'); td = document.createElement('td'); span = document.createElement('span'); span2 = document.createElement('span'); table.className = 'chanList'; chanName = base64.decode(channels[i]); // Set properties/events td.id = chanName; td.className = (getChannelIndex()==i)?"curchan" :"chan"; if (chanName.substr(0,1) != "#"){ span.onclick = (function(name){ return function(){ partChannel(name); }; })(chanName); span.onmouseover = function(){ this.style.color = '#C73232'; this.style.fontWeight = 'bolder'; }; span.onmouseout = (function(color){ return function(){ this.style.color = color; this.style.fontWeight = 'normal'; }; })((getChannelIndex()==i)?'#FFF':'#22C'); span.innerHTML = 'x'; td.appendChild(span); } span2.onclick = (function(i){ return function(){ selectChannel(i); }; })(i); span2.innerHTML = chanName; // Append to DOM td.appendChild(span2); table.appendChild(td); docfrag.appendChild(table); } chanList.innerHTML = ''; chanList.appendChild(docfrag); }, selectChannel: function(index){ setOption(4,String.fromCharCode(index + 32),true); changeChannel(); readOldMessagesCookies(); }, getChannelEn: function(){ return channels[getChannelIndex()]; }, getChannelDe: function(){ return base64.decode(channels[getChannelIndex()]); }, getChannelIndex: function(){ var index = getOption(4,String.fromCharCode(32)).charCodeAt(0) - 32; if (index > (channels.length - 1)) index = 0; return index; }, searchUser: function(start,startAt){ if(!startAt){ startAt = 0; } for (var i=0;i'+message+"
"); }, joinChannel: function(paramaters){ if (paramaters.substr(0,1) != "@" && paramaters.substr(0,1) != "#"){ paramaters = "@" + paramaters; } //Check if it already exists or not. If so, try to join it. var count = 0; for (i in channels){ if (base64.decode(channels[i]).toLowerCase() == paramaters.toLowerCase()){ selectChannel(count); return; } count++; } //Channel not in existance. if (paramaters.substr(0,1) == "#"){ sendInternalMessage(' Join Error: Cannot join new channels starting with #.'); return; } //Valid chan, add to list. channels.push(base64.encode(paramaters)); saveChannels(); selectChannel(channels.length-1); }, openPMWindow: function(paramaters){ if (paramaters.substr(0,1) == "@" && paramaters.substr(0,1) == "#"){ sendInternalMessage(' Query Error: Cannot query a channel. Use /join instead.'); } if (paramaters.substr(0,1) != "*"){ paramaters = "*" + paramaters; } for (var i in channels){ if (base64.decode(channels[i]).toLowerCase() == paramaters.toLowerCase()){ return; //PM already opened, don't open another. } } channels.push(base64.encode(paramaters)); saveChannels(); drawChannels(); }, partChannel: function(paramaters){ if (paramaters === ""){ partChannel(getChannelDe()); return; } if (paramaters.substr(0,1) != "#"){ for (var i in channels){ if (base64.decode(channels[i]) == paramaters){ if (getChannelDe() == paramaters){ channels.splice(i,1); selectChannel(i-1); }else{ channels.splice(i,1); drawChannels(); } saveChannels(); return; } } if (paramaters.substr(0,1) != "@" && paramaters.substr(0,1) != "#"){ paramaters = "@" + paramaters; partChannel(paramaters); }else{ sendInternalMessage(' Part Error: I cannot part ' + paramaters + '. (You are not in it.)'); } }else{ sendInternalMessage(' Part Error: I cannot part ' + paramaters + '. (That is not an OmnomIRC channel.)'); } }, parseCommand: function(message){ var command = message.split(" ")[0]; var paramaters = message.substr(command.length+1).toLowerCase(); switch(command){ case "j": case "join": joinChannel(paramaters); return true; case "q": case "query": openPMWindow(paramaters); return true; case "win": case "w": case "window": if (parseInt(paramaters) > channels.length || parseInt(paramaters) <= 0) sendInternalMessage(' Invalid window selection. Valid options: 1-'+channels.length+''); else selectChannel(parseInt(paramaters)-1); return true; case "p": case "part": partChannel(paramaters); return true; case "test": sendInternalMessage(Signature); return true; default: return false; } }, loadChannels: function(){ if (document.cookie.indexOf("OmnomChannels") >= 0){ var moreChans = document.cookie.split(";")[0].replace(/^.*OmnomChannels=(.+?)|.*/, "\$1").split("%"); for (var i in moreChans){ if (moreChans[i][0] != "#" && moreChans[i] !== ""){ if (moreChans[i][0] == "^"){ moreChans[i][0] = "#"; } channels.push(moreChans[i]); } } } }, saveChannels: function(){ var chanList = ""; for(var i in channels){ if (base64.decode(channels[i]).substr(0,1) != "#"){ chanList = chanList + channels[i] + "%"; } } chanList = chanList.substr(0,chanList.length-1); document.cookie = "OmnomChannels=" + chanList + ";expires=Sat, 20 Nov 2286 17:46:39 GMT;"; }, isBlurred: function(){ if(focusHandlerRegistered === undefined){ focusHandlerRegistered = false; } if(!focusHandlerRegistered){ registerFocusHandler(); } if(parent !== undefined){ return parent.window.bIsBlurred; }else{ return bIsBlurred; } }, registerFocusHandler: function() { focusHandlerRegistered = true; if (parent !== undefined){//Child(iframe) parent.window.bIsBlurred = false; parent.window.onblur = function(){ parent.window.bIsBlurred = true; return true; }; parent.window.onfocus= function(){ parent.window.bIsBlurred=false; resize(); return true; }; }else{ //Not a child window.onblur = function(){ bIsBlurred=true; if(console.log){ console.log("Blur"); } return true; }; window.onfocus= function(){ bIsBlurred=false; resize(); if(console.log){ console.log("Focus"); } return true; }; } }, startStatusBarUpdate: function(){ if (!doStatusUpdates) return; if (!statusStarted) setInterval(doStatusBarUpdate,500); statusStarted = true; }, doStatusBarUpdate: function(){ window.status=statusTxt; if (parent) parent.window.status=statusTxt; }, changeStatusBarText: function(msg){ statusTxt = msg; if (!statusStarted){ startStatusBarUpdate(); } }, HTMLEncode: function(str){ var div = document.createElement('div'), text = document.createTextNode(str); div.appendChild(text); return div.innerHTML; }, StripHTML: function(str){ var tmp = document.createElement("div"); tmp.innerHTML = str; return tmp.textContent||tmp.innerText; } }, message = document.getElementById("message"), isInTab = false, tabWord = "", tabCount = 0, startPos = 0, endPos = 0, endPosO = 0, indicatorTimer = false, oldMessages = [], messageCounter = 1, currentMessage, messageList = [], UserListArr = [], curLine = 0, messageBox = window.messageBox = document.createElement("table"), mBoxCont = window.mBoxCont = document.getElementById("mboxCont"), Userlist = [], scrolledDown = true, statusTxt = "", statusStarted = false, focusHandlerRegistered = false, userListContainer = document.getElementById("UserListArrContainer"), userListDiv = document.getElementById("UserList"), xmlhttp, inRequest = false, errorCount = 0; messageBox.style.width="100%"; messageBox.style.height="100%"; messageBox.className='MessageBox'; window.addEventListener('keydown',function(e){ if(document.activeElement.id=="message"){ var messageBoxElement = document.getElementById("message"); if(messageCounter==oldMessages.length){ currentMessage=messageBoxElement.value; } if(oldMessages.length!==0) { if (e.keyCode==38) { //up if(messageCounter!==0){ messageCounter--; } messageBoxElement.value = oldMessages[messageCounter]; }else if(e.keyCode==40){ //down if (messageCounter!=oldMessages.length){ messageCounter++; } if (messageCounter==oldMessages.length){ messageBoxElement.value = currentMessage; }else{ messageBoxElement.value = oldMessages[messageCounter]; } } } } }, false); String.prototype.trim = function(){ return this.replace(/^\s+|\s+$/g, ""); }; })(window);