/*
This script contains dynamics for the AnoChat chatwindow
Anochat: anochat.js
This revision: # v. 1.1 mlk # April 2009. 
Code by Knut Møgster # mogster@redesign.no | http://www.redesign.no #
*/

/*
Editable values and functions
*/
// Set php-script from which to fetch content
var runscript = 'anochat.php';

var imagepath = 'snippets/ac/';

// Declare the timer
var chatTimer = setTimeout("iniTime()",3000);
// times for pinging the server when user not active
// Array string format: Time description#time in seconds#number of refreshes allowed before degrading to next level
// Seprator: _
// Eighty seconds with ping every ten sec
var timetextarr= new Array(7);
timetextarr[0]='10 sec_10000_4';
// 4x20 seconds in 20 sec interval
timetextarr[1]='20 sec_20000_4';
// 4x30 seconds in 30 sec interval
timetextarr[2]='30 sec_30000_4';
// 10 minutes with one minute interval
timetextarr[3]='1 min_60000_10';
// 20 x 5 minutes in 5 minute interval
timetextarr[4]='5 min_300000_4';
// 4 hours in 30 minute interval
timetextarr[5]='30 min_1800000_4';
// For all practical purposes: forever in one hr interval.
timetextarr[6]='1 hr_3590000_2000';

// Language settings
var chatlang = new Array();
chatlang[0] = 'Msg:';
chatlang[1] = 'Send';
chatlang[2] = 'Refresh: ';
chatlang[3] = 'Autorefresh:';
chatlang[4] = 'Show time:';
chatlang[5] = 'Yes';
chatlang[6] = 'No';
chatlang[7] = 'Log out';
chatlang[8] = 'Tip: To post messages without clicking Send:<br>Ctrl+Enter in Internet Explorer - Arrow up in all other browsers';
chatlang[9] = 'Room topic';
chatlang[10] = 'Nick:';
chatlang[11] = 'Auth code:';
chatlang[12] = 'Login';
chatlang[13] = 'ChatURL';
chatlang[14] = 'Copy this for easier distribution';

// Smiley array
var scodearr= new Array(17);
scodearr[0]='icon_biggrin.gif=:biggrin:';
scodearr[1]='icon_smile.gif=:smile:';
scodearr[2]='icon_wink.gif=:wink:';
scodearr[3]='icon_sad.gif=:sad:';
scodearr[4]='icon_confused.gif=:confused:';
scodearr[5]='icon_lol.gif=:lol:';
scodearr[6]='icon_mad.gif=:mad:';
scodearr[7]='icon_cool.gif=:cool:';
scodearr[8]='icon_rolleyes.gif=:rolleyes:';
scodearr[9]='icon_scared.gif=:scared:';
scodearr[10]='icon_eek.gif=:eek:';
scodearr[11]='icon_razz.gif=:razz:';
scodearr[12]='icon_death.gif=:death:';
scodearr[13]='icon_cry.gif=:cry:';
scodearr[14]='icon_nerd.gif=:nerd:';
scodearr[15]='icon_sleep.gif=:sleep:';
scodearr[16]='icon_hoho.gif=:hoho:';

// Colors and text for the user list in the chat.
function colorUsers(lined, utst, servtime) {
	var gtime = (parseInt(servtime) - parseInt(utst));
	lined = lined;
	// > 1 hour
	if(gtime > 3600) {
		return '<i><span class="ulist6"><b>'+lined+'</b> 1hr</span></i>';
		// 30min	
		} else if(gtime > 1800) {
		return '<span class="ulist5"><b>'+lined+'</b> 30min</span>';
		// 15 min
		} else if(gtime > 900) {
		return '<span class="ulist4"><b>'+lined+'</b> 15min</span>';
		// 5min	
		} else if(gtime > 300) {
		return '<span class="ulist3"><b>'+lined+'</b> 5min</span>';
		// 1 min
		} else if(gtime > 180) {
		return '<span class="ulist2"><b>'+lined+'</b> 3min</span>';
		} else {
		return '<span class="ulist1"><b>'+lined+'</b></span>';
	}
}

function colorDrop() {
	var chwrlayer = getElement("lfl");
	var chatlink = getElement("K2").value;
	var linkstr = '&nbsp;<a class="ilink1" onclick="return false;" href="q.php?s='+chatlink+'" title="'+chatlang[14]+'" onFocus="this.blur()">'+chatlang[13]+'</a>';
	var setmsg = '';
	var cdrop = '<SELECT id="fontxt" name="fontxt" class="fontxtsel" onChange=""><OPTION VALUE="fdr1" class="fdr1" style="font-weight:bold" SELECTED>&nbsp;color1&nbsp;</OPTION><OPTION VALUE="fdr2" class="fdr2" style="font-weight:bold">&nbsp;color2&nbsp;</OPTION><OPTION VALUE="fdr3" class="fdr3" style="font-weight:bold">&nbsp;color3&nbsp;</OPTION><OPTION VALUE="fdr4" class="fdr4" style="font-weight:bold">&nbsp;color4&nbsp;</OPTION><OPTION VALUE="fdr5" class="fdr5" style="font-weight:bold">&nbsp;color5&nbsp;</OPTION><OPTION VALUE="fdr6" class="fdr6" style="font-weight:bold">&nbsp;color6&nbsp;</OPTION><OPTION VALUE="fdr7" class="fdr7" style="font-weight:bold">&nbsp;color7&nbsp;</OPTION><OPTION VALUE="fdr8" class="fdr8" style="font-weight:bold">&nbsp;color8&nbsp;</OPTION></SELECT>';
	chwrlayer.innerHTML = setmsg+cdrop+linkstr;
}
// Smileys and smiley code. I need to do more work on this. Don't use any other format than :text: for now
function duSmiles(text) {
	for(var i=0;i<parseInt(scodearr.length);i++) {
		var linechange = scodearr[i].split('=');
		text = text.replaceAll(linechange[1], '<img src="'+imagepath+'smiles/'+linechange[0]+'" width="15" height="15" border="0" align="absmiddle">');
	}
	return text;
}

// Smiley table for the post form.
function duSmilestable() {
	var smileylayer = getElement("rflsmil");
	var smileys = "";
	for(var i=0;i<parseInt(scodearr.length);i++) {
		var linechange = scodearr[i].split('=');
		var icname = linechange[1].replaceAll(":");
		smileys += '<input type="image" src="'+imagepath+'smiles/'+linechange[0]+'" height="15" width="15" name="'+icname+'" id="'+icname+'" class="" onClick="insertxTzcode(\'chamessage\', \' '+linechange[1]+' \');">';
	}
	smileylayer.innerHTML = smileys;
}

var chatwr_tools = '<form name="chwritool" method="" action="" onsubmit="return false"><table width="100%" border="0" cellpadding="0" cellspacing="0"><tr><td align="left" valign="top"><span id="tmvc" name="tmvc" class="timevalue" style="">'+chatlang[2]+'<span id="tmv" name="tmv" class="timevalue" style=""></span></span><br><span id="ttt" name="ttt" class="timevalue" style="">'+chatlang[3]+'<input type="radio" name="killtimer" id="killtimer" value="1" onClick="kill_timer()" checked>On<input type="radio" name="killtimer" id="killtimer" value="2" onClick="kill_timer()">Off</span><br><span id="ttt" name="ttt" class="timevalue" style="">'+chatlang[4]+'<input type="radio" name="notime" id="notime" value="1">'+chatlang[5]+'<input type="radio" name="notime" id="notime" value="2" checked>'+chatlang[6]+'</span></td></tr><tr><td align="left" valign="top" style="padding-top:5px">';
chatwr_tools += '<input type="button" name="chat_do" id="chat_do" value="'+chatlang[1]+'" class="chatwriter_button" style="width:50px" tabindex="2" onClick="chatSender()">&nbsp;<input type="button" name="logoff" id="logoff" value="'+chatlang[7]+'" class="chatwriter_button" style="width:65px" tabindex="4" onClick="dologOut()">';
chatwr_tools += '</td></tr></table></form>';

function writerTools() {
	var wrtoolayer = getElement("chwrtools");
	wrtoolayer.innerHTML = chatwr_tools;
}
/*
End editable values and functions
*/

DOM = (document.getElementById) ? 1 : 0;
NS4 = (document.layers) ? 1 : 0;
IE4 = (document.all) ? 1 : 0;
OPERA = (navigator.userAgent.indexOf("Opera 5") > -1 || navigator.userAgent.indexOf("Opera/5") > -1 || navigator.userAgent.indexOf("Opera 6") > -1 || navigator.userAgent.indexOf("Opera/6") > -1 || navigator.userAgent.indexOf("Opera 7") > -1 || navigator.userAgent.indexOf("Opera/7") > -1) ? 1 : 0;

/*
Chat functions
*/
// Function for inset of smiley code
function insertxTzcode(dfield, dcode) {
	var strea = getElement(dfield);
	strea.focus();
  if (document.selection) {
		if (strea.createTextRange && strea.caretPos) {
			var caretPos = strea.caretPos;
			var rxtext = dcode;
			caretPos.text = caretPos.text.charAt(caretPos.text.length - 1) == '' ? rxtext + '' : rxtext;
			strea.focus();
		}
 		} else if (strea.selectionStart || strea.selectionStart == '0') {
		var streascroll = strea.scrollTop;
    var startPos = strea.selectionStart;
    var endPos = strea.selectionEnd;
		var rxtext = dcode;
    strea.value = strea.value.substring(0, startPos) + rxtext + strea.value.substring(endPos, strea.value.length);
		strea.scrollTop = streascroll;
 		} else {
		var rxtext = dcode; 
    strea.value += rxtext;
  }
}

// # KEY catch functions
// The key catch sending data, in the chat form (equals pressing Send). 
// Cathces 'Ctrl+Enter' for IE, Arrow up for most other browsers it's tested on
function mChat(e) {
if (!e) e = window.event;
	// Triggers on keycode Arrow up (Moz) or Ctrl-Enter (IE)
	if (e && (e.keyCode == 38 || e.keyCode == 10)) {
		chatSender();
	}
}

// These both captures 'Enter' (Carriage return)
// For login screen, in chat
function mCodeset(e) {
if (!e) e = window.event;
	if (e && e.keyCode == 13) {
		setAcode(); 
	}
}

// For topic set, in chat
function mtCodeset(e) {
if (!e) e = window.event;
	if (e && e.keyCode == 13) {
		setTopic(); 
	}
}

// The function for setting auth code (login)
function setAcode() {
	var axfield = getElement("auth_code");
	var axfieldval = Trim(axfield.value);
	var nickfield = getElement("setnick");
	var nickfieldval = Trim(nickfield.value);
	var wocodefieldval = Trim(getElement("wincreatecode").value);
	var axalayer = getElement("authrightfloat");
	if(axfieldval != "" && nickfieldval != "") {
		var doKeyx = MD5(axfieldval);
		var doCode = MD5(MD5(doKeyx));
		var hiddendualcode = getElement("K2");
		hiddendualcode.value = doCode;
		if(wocodefieldval == MD5(doCode)) {
			var reauthfield = getElement("runauthcode");
			reauthfield.value = axfieldval;
			axalayer.innerHTML = nickfieldval;
			axalayer.style.visibility = "visible";
			var url = runscript+'?c=sac';
			var doUsercrypt = des(doKeyx, nickfieldval, 1, 0);
			var phex = printHex(doUsercrypt);
  		var jsel = document.createElement('SCRIPT');
  		jsel.type = 'text/javascript';
  		jsel.src = url+'&q='+doCode+'&x='+phex;
  		document.body.appendChild (jsel);
			} else {
			alert('Wrong auth code: '+wocodefieldval+' '+MD5(doCode));
			self.close();
		}
	}
}

// The function for setting topic (by first person who logs on/chat creator)
function setTopic() {
	var axfield = getElement("set_topic");
	var axfieldval = Trim(axfield.value);
	var nickfield = getElement("setnick");
	var nickfieldval = Trim(nickfield.value);
	var wocodefieldval = Trim(getElement("wincreatecode").value);
	var axalayer = getElement("authleftfloat");
	var reauthfieldval = getElement("runauthcode").value;
	if(axfieldval != "" && nickfieldval != "") {
		var doKeyx = MD5(reauthfieldval);
		var doCode = MD5(MD5(doKeyx));
		if(wocodefieldval == MD5(doCode)) {
			axalayer.innerHTML = axfieldval;
			axalayer.style.visibility = "visible";
			var url = runscript+'?c=sat';
			var doTopiccrypt = des(doKeyx, axfieldval, 1, 0);
			var phex = printHex(doTopiccrypt);
  		var jsel = document.createElement('SCRIPT');
  		jsel.type = 'text/javascript';
  		jsel.src = url+'&q='+doCode+'&t='+phex;
  		document.body.appendChild (jsel);
			} else {
			alert('Wrong auth code');
			self.close();
		}
	}
}

// Decryption and visual display of topic, on chat load
function deCtopic() {
	var axalayer = getElement("authleftfloat");
	var axfieldval = RTrim(axalayer.innerHTML);
	var reauthfieldval = getElement("runauthcode").value;
	var doKeyx = MD5(reauthfieldval);
	var doCode = MD5(MD5(doKeyx));
	var doTdecrypt = des(doKeyx, hexToString(axfieldval), 0, 0);
	axalayer.innerHTML = RTrim(doTdecrypt);
}

// The function for sending chat line
function doChatline(cryptcode, dcode, dcuser) {
	var url = runscript+'?c=cac';
  var jsel = document.createElement('SCRIPT');
  jsel.type = 'text/javascript';
  jsel.src = url+'&q='+dcode+'&cc='+cryptcode+'&x='+dcuser;
  document.body.appendChild (jsel);
}

// The function for sending chat ping
function doChatping(dcode, dcuser, dummy) {
	var url = runscript+'?c=cap';
  var jsel = document.createElement('SCRIPT');
  jsel.type = 'text/javascript';
  jsel.src = url+'&q='+dcode+'&x='+dcuser+'&dummy='+dummy;
  document.body.appendChild (jsel);
}

// Attempting to log out on onunload (user close of window). Does not work in all browsers
function closeLogout() {
	var nickfieldval = getElement("runauthcode").value;
	if(nickfieldval != "") {
		dologOut();
	}
}

// Function for logging out
function dologOut() {
	var nickfield = getElement("setnick");
	var nickfieldval = Trim(nickfield.value);
	var wocodefieldval = Trim(getElement("wincreatecode").value);
	var reauthfieldval = getElement("runauthcode").value;
	if(wocodefieldval != "" && nickfieldval != "") {
		var doKeyx = MD5(reauthfieldval);
		var doCode = MD5(MD5(doKeyx));
		if(wocodefieldval == MD5(doCode)) {
			var url = runscript+'?c=sal';
			var doUsercrypt = des(doKeyx, nickfieldval, 1, 0);
			var phex = printHex(doUsercrypt);
  		var jsel = document.createElement('SCRIPT');
  		jsel.type = 'text/javascript';
  		jsel.src = url+'&q='+doCode+'&x='+phex;
  		document.body.appendChild (jsel);
			} else {
			alert('Wrong auth code');
			self.close();
		}
	}
}

// Function for disabling auth fields. Deprecated.
function disable_line() {
	var f1 = getElement("setnick");
	var f2 = getElement("auth_code");
	var f3 = getElement("autset");
	f1.disabled = true;
	f2.disabled = true;
	f3.disabled = true;
}

// The main function for decrypting the room and the chat lines, after send and on refresh timeout
function treatLines(dummy) {
	var unxtime = getElement("unixtime").value;
	var contl = getElement("converse");
	var contx = contl.innerHTML;
	var controom = getElement("chroom");
	var controomv = controom.innerHTML;
	var tKey = MD5(getElement("auth_code").value);
	var chKey = getElement("osess").value;
	var retclines = "";
	var retroomlines = "";
	if(MD5(MD5(tKey)) == chKey) {
		contx = unescape(contx);
		var strCarr = contx.split("^");
		for(var i=0;i<strCarr.length;i++) {
			if(Trim(strCarr[i]) != "") {
				var retxarr = strCarr[i].split("-");
				var retx = des(tKey, hexToString(retxarr[0]), 0, 0);
				if(document.chwritool.notime[0].checked) {
					retclines += '<span class="timevalue">'+retxarr[1]+'</span> '+Trim(nl2br(retCleanline(retx)))+'<br>';
					} else {
					retclines += Trim(nl2br(retCleanline(retx)))+'<br>';
				}
			}
		}
		controomv = unescape(controomv);
		var strRarr = controomv.split("^");
		strRarr.reverse();
		for(var rexs=0;rexs<strRarr.length;rexs++) {
			if(Trim(strRarr[rexs]) != "") {
				var usline = strRarr[rexs].split(":");
				var rety = des(tKey, hexToString(usline[0]), 0, 0);
				var suppltime = colorUsers(Trim(rety), usline[1], unxtime);
				retroomlines += suppltime+'<br>';
			}
		}
		contl.innerHTML = duUrlPic(retclines)+'<br clear="all"><span id="scrollhere" name="scrollhere"></span>';
		controom.innerHTML = retroomlines;
		var scrolled = getElement("scrollhere");
		scrolled.scrollIntoView(false);
	}
}


// Function for treating text before display, strip html and create links/smilies
function duUrlPic(text) {
	text += " ";
	text = br2nl(text);
	text = stripHTML(text);
	var ures = "";
	if(text.search(/http/) != -1) {
		var texturls = text.split("http://");
		for(var i=1;i<texturls.length;i++) {
			if(texturls[i] != "") {
				var dpos = texturls[i].indexOf(" ");
				var dbrpos = texturls[i].indexOf("\n");
				if(dpos > dbrpos) {
					var nsck = dbrpos;
					}	else {
					var nsck = dpos;
				}
				var urepl = texturls[i].slice(0, nsck);
				urepl = RTrim(urepl);
				var utemp = "http://" + urepl;
				var ulen = utemp.length;
				var uxt = ulen - 4;
				var xend = utemp.substring(uxt, ulen);
				xend = xend.toLowerCase();
				if(xend == ".jpg" || xend == ".gif" || xend == ".png") {
					var jpaddress = '<img src="'+utemp+'" name="img'+i+'" id="img'+i+'" align="top">';
					texturls[i] = texturls[i].replace(urepl, "");
					ures += jpaddress + texturls[i];
					} else {
					texturls[i] = texturls[i].replace(urepl, "");
					if(parseInt(utemp.length) > 60) {
						var ureslinkt = utemp.substring(0, 60);
						} else {
						var ureslinkt = utemp;
					}
					ures += '<a href="' + utemp + '" target="_blank" class="ilink1">' +ureslinkt+ '</a>'+texturls[i];
				}
				} else {
				ures += texturls[i];
			}
		}
		ures = nl2br(texturls[0] + ures);
		} else {
		ures = nl2br(text);
	}
	return htmldctags(duSmiles(ures));
}

// The main chat send function, it prepares and encrypts the contents of the text area 'chamessage', then sends it and resets the refresh timer
function chatSender() {
	var uniqseed = new Date();
	var timest = uniqseed.getTime();
	var setseedf = MD5(timest.toString());
	setseedf = setseedf.substring(0, 10);
	var tstfield = getElement("lastact");
	var charea = getElement("chamessage");
	var chareacont = charea.value;
	chareacont = RTrim(chareacont);
	var insbreak = " ";
	if(parseInt(chareacont.length) > 45) {
		insbreak = "<br>";
	}
	var chnick = getElement("setnick").value;
	var cryptnick = getElement("nick").value;
	if(Trim(chareacont) != "" && Trim(chnick) != "") {
		var chfonto = getElement("fontxt");
		var chfontidx = chfonto.options.selectedIndex;
		var chfont = chfonto.options[chfontidx].value;
		chareacont = '[span class="'+chfont+'"]'+chareacont+' [/span]';
		var tohash = '[b]'+chnick+'[/b]:'+insbreak+nl2br(chareacont);
		tohash = setseedf+'x:-:x'+tohash;
		var tKey = MD5(getElement("auth_code").value);
		var chKey = getElement("osess").value;
		if(MD5(MD5(tKey)) == chKey) {
			tstfield.value = timest;
			var thash = des(tKey, tohash, 1, 0);
			var phex = printHex(thash);
			doChatline(phex, chKey, cryptnick);
			charea.value = "";
			charea.focus();
			doiniTimer();
			} else {
			alert('Wrong code!');
			self.close();
		}
	}
}

// The chat ping function init, for sending encrypted nick
function chatPing() {
	var uniqseed = new Date();
	var timest = uniqseed.getTime();
	var dummy = MD5(timest);
	var chnick = getElement("setnick").value;
	var cryptnick = getElement("nick").value;
	if(Trim(chnick) != "") {
		var tKey = MD5(MD5(getElement("auth_code").value));
		var chKey = getElement("osess").value;
		if(MD5(tKey) == chKey) {
			doChatping(chKey, cryptnick, dummy);
			} else {
			alert('Wrong code!');
			self.close();
		}
	}
}

// Function for returning a line without the prepending seed.
function retCleanline(lined) {
	linedarr = lined.split("x:-:x");
	if(parseInt(linedarr.length) > 1) {
		return linedarr[1];
		} else {
		return linedarr[0];
	}
}

// Function for stopping the timer (by clicking Off) in the chat
function kill_timer() {
	var tmvx = getElement("tmv");
	if(document.chwritool.killtimer[0].checked) {
	var v = timetextarr[0].split("_");
	tmvx.innerHTML = v[0];
	//doiniTimer();
	dorunTimer();
	chatTimer = setTimeout("handlePing()",1000);
	} else {
	clearTimeout(chatTimer);
	tmvx.innerHTML = "off";
	}
}

// Just killing the timer after declaring it
function iniTime() {
	clearTimeout(chatTimer);
}

// Function for setting new timer values in form, on timer restart
function dorunTimer() {
	if(document.chwritool.killtimer[0].checked) {
		var ddate = new Date();
		var time = ddate.getTime();
		var tstfield = getElement("lastact");
		tstfield.value = time;
		var strtime = timetextarr[0].split("_");
		var ctrlfield = getElement("ctrlrefresh");
		ctrlfield.value = "1";
		var ctrltme = getElement("ctrltimeout");
		ctrltme.value = strtime[1];
		var visicontroltime = getElement("tmv");
		visicontroltime.innerHTML = strtime[0];
	}
}

// Function for initiating the timer with values
function doiniTimer() {
	clearTimeout(chatTimer);
	if(document.chwritool.killtimer[0].checked) {
		var ddate = new Date();
		var time = ddate.getTime();
		var tstfield = getElement("lastact");
		tstfield.value = time;
		var strtime = timetextarr[0].split("_");
		var ctrlfield = getElement("ctrlrefresh");
		ctrlfield.value = "1";
		var ctrltme = getElement("ctrltimeout");
		ctrltme.value = strtime[1];
		var visicontroltime = getElement("tmv");
		visicontroltime.innerHTML = strtime[0];
		chatTimer = setTimeout("handlePing()",parseInt(strtime[1]));
	}
}

// Function for handling of the auto refresh pinging, timing and breakdown
function handlePing() {
	clearTimeout(chatTimer);
	if(document.chwritool.killtimer[0].checked) {
		var tstfield = getElement("lastact");
		var ctrlfield = getElement("ctrlrefresh");
		var ctrltme = getElement("ctrltimeout");
		var visicontroltime = getElement("tmv");
		var returnlevel = "";
		var resetmode = "n";
		for(i=0;i<timetextarr.length;i++) {
			if(timetextarr[i] != "") {
				var strtime = timetextarr[i].split("_");
				// if we are on the refresh level and past number of allowed refreshes, anticipate next level
				if((parseInt(ctrltme.value) == parseInt(strtime[1])) && (parseInt(strtime[2]) == parseInt(ctrlfield.value))) {
					resetmode = "y";
					// If we're below the end level proceed down, else: stay
					if(i<timetextarr.length-1) {
						var strxarrt = parseInt(i+1);
						var strxtime = timetextarr[strxarrt].split("_");
						returnlevel = parseInt(strxtime[2]);
						ctrlfield.value = "1";
						ctrltme.value = strxtime[1];
						visicontroltime.innerHTML = strxtime[0];
						} else {
						returnlevel = parseInt(strtime[2]);
						ctrlfield.value = "1";
						ctrltme.value = strtime[1];
						visicontroltime.innerHTML = strtime[0];
					}
					// not past number of allowed refreshes, proceed to count
					} else {
					if(parseInt(ctrltme.value) == parseInt(strtime[1])) {
						if(resetmode == "n") {
							var tr = parseInt(ctrlfield.value);
							var newlevel = Math.round(tr+1);
							returnlevel = parseInt(ctrltme.value);
							ctrlfield.value = newlevel.toString();
							} else {
							var tr = parseInt(ctrlfield.value);
							var newlevel = Math.round(tr+1);
							returnlevel = parseInt(ctrltme.value);
							ctrlfield.value = "1";
						}
					}
				}
			}
		}
		chatPing();
		chatTimer = setTimeout("handlePing()",returnlevel);
	}
}


