Browse Source

Merging Omnom_Parser.js into omnomirc.js

Adding functions to _proto.
Going to convert to use proto/run/namespace soon.
Nathaniel van Diepen 12 years ago
parent
commit
68c99c1deb
1 changed files with 632 additions and 8 deletions
  1. 632 8
      omnomirc_www/omnomirc.js

+ 632 - 8
omnomirc_www/omnomirc.js

@@ -31,11 +31,17 @@
 					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",proto('keyHandler').call(ret),false);
+				message.addEventListener("keydown",_fn('keyHandler'),false);
 			}else if(message.attachEvent ){
-				message.attachEvent("onkeydown",proto('keyHandler').call(ret));
+				message.attachEvent("onkeydown",_fn('keyHandler'));
 			}
 			window.onLoad = this.cookieLoad();
 			return ret;
@@ -49,6 +55,17 @@
 				}
 			};
 		},
+		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) {
@@ -84,7 +101,7 @@
 			},
 			permissionGranted: function(){
 				if (window.webkitNotifications.checkPermission() === 0){
-					proto('showNotification').call(this,"Notifications Enabled!");
+					run('showNotification',"Notifications Enabled");
 					this.setOption(7,'T');
 					window.location.refresh(true);
 				}
@@ -117,7 +134,7 @@
 					alert("This feature only works in chrome.");
 					return;
 				}
-				window.webkitNotifications.requestPermission(proto('permissionGranted').call(this));
+				window.webkitNotifications.requestPermission(run('permissionGranted'));
 			},
 			showNotification: function(message){
 				if (window.webkitNotifications === undefined || window.webkitNotifications === null || !window.webkitNotifications){
@@ -131,7 +148,7 @@
 				n.show();
 			},
 			keyHandler: function(e){
-				var getCurrentWord = proto('getCurrentWord').call(this),
+				var getCurrentWord = run('getCurrentWord'),
 					TABKEY = 9;
 				if (getCurrentWord() === ""){
 					return true;
@@ -173,7 +190,7 @@
 				return message.value.substr(startPos,endPos - startPos).trim();
 			},
 			getTabComplete: function(){
-				var getCurrentWord = proto('getCurrentWord').call(this),
+				var getCurrentWord = run('getCurrentWord'),
 					name = searchUser(getCurrentWord(),tabCount);
 				if (!isInTab){
 					startPos = message.selectionStart;
@@ -202,7 +219,7 @@
 			},
 			startIndicator: function(){
 				if(!indicatorTimer){
-					indicatorTimer = setInterval(proto('updateIndicator').call(this),50);
+					indicatorTimer = setInterval(run('updateIndicator'),50);
 					indicatorPixels = Array(true,true,true,true,true,false,false,false);
 				}
 			},
@@ -239,7 +256,614 @@
 					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=" + 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{
+							sendRequest();
+							return;
+						}
+					}
+					if(xmlhttp.status == 200){
+						run('addLines',xmlhttp.responseText); //Filter out 500s from timeouts
+					}
+					errorCount = 0;
+					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<parts.length;i++){
+					if (parts[i].length > 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 = '<table style="width:100%" class="messageBox" id="MessageBox">' + messageBox.innerHTML + parseMessage(message) + '</table>';
+				else //If not IE, yay!
+					messageBox.innerHTML = messageBox.innerHTML + parseMessage(message);*/
+				var row = 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 = parseColors(parts[5]);
+					if(parts[5].toLowerCase().indexOf(userName.toLowerCase().substr(0,4)) >= 0 && hasLoaded && notifications && parts[4].toLowerCase() != "new"){
+						showNotification("<" + parts[4] + "> " + parts[5]);
+						if(highDing){
+							document.getElementById('ding').play();
+						}
+					}
+				}
+				if((type == "message" || type == "action") && parts[4].toLowerCase() != "new"){
+					parsedMessage = 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":
+						startIndicator();
+						cancelRequest();
+						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(){
+							parseUsers();
+							startLoop();
+							mBoxCont.scrollTop = mBoxCont.scrollHeight;
+							hasLoaded = true;
+							stopIndicator();
+						};
+						body.appendChild(script);
+						displayMessage = false;
+						break;
+					case "join":
+						tdMessage.innerHTML = name + " has joined "+getChannelDe();
+						addUserJoin(parts[4],online);
+						if (online == "1"){
+							return "";
+						}
+						break;
+					case "part":
+						tdMessage.innerHTML = name + " has left "+getChannelDe()+" (" + parsedMessage + ")";
+						removeUser(parts[4]);
+						if (online == "1"){
+							return "";
+						}
+						break;
+					case "quit":
+						tdMessage.innerHTML = name + " has quit IRC (" + parsedMessage + ")";
+						removeUser(parts[4]);
+						break;
+					case "kick":
+						tdMessage.innerHTML = name + " has kicked " + parts[5] + " from "+getChannelDe()+" (" + parts[6] + ")";
+						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 "+getChannelDe()+" mode " + parts[5];
+						break;
+					case "nick":
+						tdMessage.innerHTML = name + " has changed his nick to " + parsedMessage;
+						removeUser(parts[4]);
+						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;
+						}
+						setTopic(parsedMessage);
+						break;
+					case "internal":
+						tdMessage.innerHTML = parts[4];
+					break;
+					case "server":
+						tdMessage.innerHTML = parsedMessage;
+						break;
+					case "pm":
+						if (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){
+								openPMWindow(parts[4]);
+								if(notifications){
+									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)
+							showNotification("(" + parts[4] + ") <" + parts[6] + "> " + parts[7]);
+						if (highDing)
+							document.getElementById('ding').play();
+						
+						
+						return "";
+					case "default":
+						return "";
+				}
+				var row = document.createElement("tr");
+				//pretag = '<tr style="width:100%;">';
+				doHigh = !doHigh;
+				if (lineHigh && doHigh && displayMessage){
+					//pretag = '<tr style="width:100%;" class="linehigh">';
+					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);
+				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,"$1<img src='smileys/rolleyes.gif' alt='Roll Eyes' "+addStuff+">");
+					s = s.replace(/(^| )(:\)|:-\))/g,"$1<img src='smileys/smiley.gif' alt='smiley' "+addStuff+">");
+					s = s.replace(/(^| )(;\)|;-\))/g,"$1<img src='smileys/wink.gif' alt='Wink' "+addStuff+">");
+					s = s.replace(/(^| )(&gt;:D|&gt;:-D)/g,"$1<img src='smileys/evil.gif' alt='Evil' "+addStuff+">");
+					s = s.replace(/(^| )(:D|:-D)/g,"$1<img src='smileys/cheesy.gif' alt='Cheesy' "+addStuff+">");
+					s = s.replace(/(^| )(;D|;-D)/g,"$1<img src='smileys/grin.gif' alt='Grin' "+addStuff+">");
+					s = s.replace(/(^| )(&gt;:\(|&gt;:-\()/g,"$1<img src='smileys/angry.gif' alt='Angry' "+addStuff+">");
+					s = s.replace(/(^| )(:\(|:-\()/g,"$1<img src='smileys/sad.gif' alt='Sad' "+addStuff+">");
+					s = s.replace(/(^| )(:o|:O|:-o|:-O)/g,"$1<img src='smileys/shocked.gif' alt='Shocked' "+addStuff+">");
+					s = s.replace(/(^| )(8\))/g,"$1<img src='smileys/cool.gif' alt='Cool' "+addStuff+">");
+					s = s.replace(/(^| )\?\?\?/g,"$1<img src='smileys/huh.gif' alt='Huh' "+addStuff+">");
+					s = s.replace(/(^| )(:P|:-P|:p|:-p)/g,"$1<img src='smileys/tongue.gif' alt='Tongue' "+addStuff+">");
+					s = s.replace(/(^| )(:\[|:-\[)/g,"$1<img src='smileys/embarrassed.gif' alt='Embarrassed' "+addStuff+">");
+					s = s.replace(/(^| )(:x|:-x|:X|:-X)/g,"$1<img src='smileys/lipsrsealed.gif' alt='Lips Sealed' "+addStuff+">");
+					s = s.replace(/(^| )(:\\|:-\\)/g,"$1<img src='smileys/undecided.gif' alt='Undecided' "+addStuff+">");
+					s = s.replace(/(^| ):-\*/g,"$1<img src='smileys/kiss.gif' alt='Kiss' "+addStuff+">");
+					s = s.replace(/(^| )(:'\(|:'-\()/g,"$1<img src='smileys/cry.gif' alt='Cry' "+addStuff+">");
+					s = s.replace(/:thumbsup:/g,"<img src='smileys/thumbsupsmiley.gif' alt='Thumbs Up' "+addStuff+">");
+					s = s.replace(/(^| )O\.O/g,"$1<img src='smileys/shocked2.gif' alt='Shocked' "+addStuff+">");
+					s = s.replace(/(^| )\^-\^/g,"$1<img src='smileys/azn.gif' alt='Azn' "+addStuff+">");
+					s = s.replace(/(^| )&gt;B\)/g,"$1<img src='smileys/alien2.gif' alt='Alien' "+addStuff+">");
+					s = s.replace(/(:banghead:|:headbang:)/g,"<img src='smileys/banghead.gif' alt='Bandhead' "+addStuff+">");
+					s = s.replace(/:angel:/g,"<img src='smileys/ange.gif' alt='Angel' "+addStuff+">");
+					s = s.replace(/(^| )\._\./g,"$1<img src='smileys/blah.gif' alt='Blah' "+addStuff+">");
+					s = s.replace(/:devil:/g,"<img src='smileys/devil.gif' alt='Devil' "+addStuff+">");
+					s = s.replace(/(^| )&lt;_&lt;/g,"$1<img src='smileys/dry.gif' alt='Dry' "+addStuff+">");
+					s = s.replace(/:evillaugh:/g,"<img src='smileys/evillaugh.gif' alt='Evil Laugh' "+addStuff+">");
+					s = s.replace(/:crazy:/g,"<img src='smileys/fou.gif' alt='Crazy' "+addStuff+">");
+					s = s.replace(/:hyper:/g,"<img src='smileys/happy0075.gif' alt='Hyper' "+addStuff+">");
+					s = s.replace(/:love:/g,"<img src='smileys/love.gif' alt='Love' "+addStuff+">");
+					s = s.replace(/:mad:/g,"<img src='smileys/mad.gif' alt='Mad' "+addStuff+">");
+					s = s.replace(/:w00t:/g,"<img src='smileys/smiley_woot.gif' alt='w00t' "+addStuff+">");
+					s = s.replace(/(^| )\*\.\*/g,"$1<img src='smileys/psychedelicO_O.gif' alt='O.O.O' "+addStuff+">");
+					s = s.replace(/(^| )D:/g,"$1<img src='smileys/bigfrown.gif' alt='Big Frown' "+addStuff+">");
+					s = s.replace(/(^| )(XD|xD)/g,"$1<img src='smileys/XD.gif' alt='XD' "+addStuff+">");
+					s = s.replace(/(^| )x\.x/g,"$1<img src='smileys/X_X.gif' alt='x.x' "+addStuff+">");
+					s = s.replace(/:ninja:/g,"<img src='smileys/ninja.gif' alt='Ninja' "+addStuff+">");
+				}
+				return s;
+			},
+			parseColors: function(colorStr){ //colors
+				if (!colorStr || colorStr === null || colorStr === undefined){
+					return;
+				}
+				colorStr = clickable_links(colorStr);
+				colorStr = 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<arrayResults.length;i++){
+					switch (arrayResults[i]){
+						case "\x03":
+							for(var j=0;j<numSpan;j++){
+								colorStr+="</span>";
+							}
+							numSpan=1;
+							i++;
+							colorStrTemp = arrayResults[i];
+							s=arrayResults[i].replace(/^([0-9]{1,2}),([0-9]{1,2})/g,"<span class=\"fg-$1\"><span class=\"bg-$2\">");
+							if(s==arrayResults[i]){
+								s=arrayResults[i].replace(/^([0-9]{1,2})/g,"<span class=\"fg-$1\">");
+							}else{
+								numSpan++;
+							}
+							colorStr+=s;
+							break;
+						case "\x02":
+							isBool = !isBool;
+							if(isBool){
+								colorStr+="<b>";
+							}else{
+								colorStr+="</b>";
+							}
+							break;
+						case "\x1d":
+							isItalic = !isItalic;
+							if(isItalic){
+								colorStr+="<i>";
+							}else{
+								colorStr+="</i>";
+							}
+							break;
+						case "\x16":
+							for(j=0;j<numSpan;j++){
+								colorStr+="</span>";
+							}
+							numSpan=2;
+							var stemp;
+							s=colorStrTemp.replace(/^([0-9]{1,2}),([0-9]{1,2}).+/g,"<span class=\"fg-$2\"><span class=\"bg-$1\">");
+							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,"<span class=\"fg-0\"><span class=\"bg-$1\">");
+								stemp=colorStrTemp.replace(/^([0-9]{1,2}).+/g,"0,$1");
+							}
+							colorStrTemp = stemp;
+							colorStr+=s;
+							break;
+						case "\x1f":
+							isUnderline = !isUnderline;
+							if(isUnderline){
+								colorStr+="<u>";
+							}else{
+								colorStr+="</u>";
+							}
+							break;
+						case "\x0f":
+							if(isUnderline){
+								colorStr+="</u>";
+								isUnderline=false;
+							}
+							if(isItalic){
+								colorStr+="</i>";
+								isItalic=false;
+							}
+							if(isBool){
+								colorStr+="</b>";
+								isBool = false;
+							}
+							for(j=0;j<numSpan;j++){
+								colorStr+="</span>";
+							}
+							numSpan=0;
+							break;
+						default:
+							colorStr+=arrayResults[i];
+					}
+				}
+				/*Strip codes*/
+				colorStr = colorStr.replace(/(\x03|\x02|\x1F|\x09|\x0F)/g,"");
+				return(colorStr);
+			},
+			parseHighlight: function(text){ //highlight
+				if (text.toLowerCase().indexOf(userName.toLowerCase().substr(0,4)) >= 0){
+					var style = "";
+					if(highRed){
+						style = style + "color:#C73232;";
+					}
+					if(highBold){
+						style = style + "font-weight:bold;";
+					}
+					return '<span class="highlight" style="' + style + '">' + text + "</span>";
+				}
+				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@:;%_+.~#?&//=]+)/, '<a target="_top" href="$1">$1</a>');
+				text = text.replace(RegExp("(^|.)(((f|ht)(tp|tps):\/\/)[^\\s\x02\x03\x0f\x16\x1d\x1f]*)","g"),'$1<a target="_blank" href="$2">$2</a>');
+				text = text.replace(RegExp("(^|\\s)(www\.[^\\s\x02\x03\x0f\x16\x1d\x1f]*)","g"),'$1<a target="_blank" href="http://$2">$2</a>');
+				//text = text.replace(/h111/g,"http");
+				return text;
+			},
+			clickable_names: function(name,isOnline){ //omnomirc names
+				if (isOnline == "1"){
+					return '<a target="_top" href="http://www.omnimaga.org/index.php?action=ezportal;sa=page;p=13&userSearch=' + name + '">' + colored_names(name) + '</a>';
+				}
+				return colored_names(name);
+			},
+			colored_names: function(name){ //colored neames (duh)
+				if (!coloredNames){
+					return name;
+				}
+				if (!name || name === null || name === undefined){
+					return;
+				}
+				var rcolors = Array(19, 20, 22, 24, 25, 26, 27, 28, 29),
+					sum = 0,
+					i = 0; 
+				while (name[i]){
+					sum += name.charCodeAt(i++);
+				}
+				sum %= 9;
+				return '<span class="uName-'+rcolors[sum]+'">'+name+'</span>';
+			},
+			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;
+				var userp = base64.encode(user) + ":" + online;
+				UserListArr.push(userp);
+				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<b?-1:1):al<bl?-1:1;
+					}
+				);
+				for (i=0;i<UserListArr.length;i++){
+					parts = UserListArr[i].split(":");
+					if (parts[1] == "0"){
+						userText = userText + "#" + base64.decode(parts[0]) + "<br/>";
+					}
+					if(parts[1] == "1"){
+						userText = userText + '<a target="_top" href="http://www.omnimaga.org/index.php?action=ezportal;sa=page;p=13&userSearch=' +base64.decode(parts[0]) + 
+						'"><img src="http://omnomirc.www.omnimaga.org/omni.png" alt="Omnimaga User" title="Omnimaga User" border=0 width=8 height=8 />' + base64.decode(parts[0]) + '</a><br/>';
+					}
+					if(parts[1] == "2"){
+						userText = userText + "!" + base64.decode(parts[0]) + "<br/>";
+					}
+				}
+				userText = userText + "<br/><br/>";
+				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);
+					}
+				}
+				parseUsers();
+			},
+			load: function(){
+				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 = '<a href="#" onclick="toggleEnable();">OmnomIRC is disabled. Click here to enable.</a>';
+					return false;
+				}
+				doLineHigh=true;
+				var body= document.getElementsByTagName('body')[0];
+				var chanScr= document.createElement('script');
+				chanScr.type= 'text/javascript';
+				chanScr.src= 'Channels.php';
+				chanScr.onload= function(){
+					channelSelectorCallback();
+					readOldMessagesCookies();
+				};
+				body.appendChild(chanScr);
+				chanList = document.getElementById('chanList');
+				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(){
+				setOption(5,!(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 (parseCommand(message.substr(1)))
+						return;
+				}
+				if (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=" + getChannelEn(),
+					false
+				);
+				xmlhttp2.send(null);
+			},
+			
 		},
 		message = document.getElementById("message"),
 		isInTab = false,