/***************************************************************************
This script contains dynamics for the AnoBBS window
Name: anobbs.js
It should be called _after_ the anochat_system.js and anobbs_vars.js 
This revision: # v. 1.0 # June/July 2008.  
Code by Knut Møgster # mogster@boomdesign.no | http://www.redesign.no #
Tip: To navigate this script, just search for -->
****************************************************************************/

/*
The ajax to php routine is extremely difficult to debug
so set this to 1 to debug the AnoBBS. It will pop up (alert) the following:
1. The JX received values in sbbs.php in main window (Search, Create BBS):
Runstate, Query code, Encrypted forum code
and the deccrypted html forms.

2. All ajax xml returns in the forum window

The setting for production should be 0
*/
var debug_mode = "0";

/*****************************
--> BBS Forum functions
*****************************/

// View forum: Returns updated topiclist
function viewForum() {
	var urlauthfrag = retLoginstring();
	var urltx = urlbs+'?c=vf'+urlauthfrag;
	var chmsg = getElement("msgs");
	chmsg.value = bbslang[79];
	retForumdata(urltx);
}

// The exec GET of forumdata
function retForumdata(url) { 
	var xhr = createXHR();
	xhr.onreadystatechange=function()	{ 
		if(xhr.readyState == 4 && xhr.status == 200)	{
		  if(debug_mode == "1") {
        alert(xhr.responseText);
      }
			var xmldoc = xhr.responseXML;
			var tstKey = xmldoc.getElementsByTagName("autherr")[0].firstChild.nodeValue;
			if(tstKey == "none") {
				var tstExec = xmldoc.getElementsByTagName("aexec")[0].firstChild.nodeValue;
				var chexec = getElement("exec");
				chexec.value = tstExec;
				var chmsg = getElement("msgs");
				chmsg.value = bbslang[80];
				parseForumdata(xmldoc);
				chmsg.value = '';
				} else {
				alert(tstKey);
				window.close();
			}
		}
	}; 
	xhr.open("GET", url, true);		
  xhr.send(null);
}

// Main function for treatment of forumdata
function parseForumdata(xmldoc) {
	var xfnameset = getElement("authleftfloat");
	var xmainds = getElement("converse");
	var xrooms = getElement("chroom");
	var authdata = retY();
	var xUsers = retUserarr(xmldoc);
	var xflinkr = getElement("forumlinks");
	var authS = readAuth(xUsers, authdata);
	if(parseInt(authS) == 1) {
		authtforumlinkrows = tlinkrowadm+tlinklogout;
		authtforumlinkstates = admStates('admin');
		} else {
		authtforumlinkrows = tlinkrowuser+tlinklogout;
		authtforumlinkstates = admStates('user');
	}
	xflinkr.innerHTML = authtforumlinkrows;
	var forumName = xmldoc.getElementsByTagName("acforumname")[0].firstChild.nodeValue;
	var serverStamp = xmldoc.getElementsByTagName("acforumtstamp")[0].firstChild.nodeValue;
	var forumStamp = xmldoc.getElementsByTagName("acforumdate")[0].firstChild.nodeValue;
	if(forumName != "^ACFORUMNAME^") {
		var forumlastactStamp = xmldoc.getElementsByTagName("acforumlastact")[0].firstChild.nodeValue;
		var txkey = retK();
		var xcrestr = "";
		var dcforumName = des(txkey, hexToString(forumName), 0, 0);
		xcrestr += '<span class="bbsForumname">'+E2C(RTrim(dcforumName))+'</span> <span class="bbsForumdesc">'+bbslang[16]+'</span> ';
		xfnameset.innerHTML = E2C(RTrim(dcforumName));
		var forumGroupname = xmldoc.getElementsByTagName("acforumgroupname")[0].firstChild.nodeValue;
		if(forumGroupname != "^ACFORUMGROUPNAME^") {
			var dcforumGroupname = des(txkey, hexToString(forumGroupname), 0, 0);
			xcrestr += '<span class="bbsGroupname">'+E2C(RTrim(dcforumGroupname))+'</span> ';
		}
		var forumGroupdescription = xmldoc.getElementsByTagName("acforumgroupdescription")[0].firstChild.nodeValue;
		if(forumGroupdescription != "^ACFORUMGROUPDESC^") {
			var dcforumGroupdescription = des(txkey, hexToString(forumGroupdescription), 0, 0);
			xcrestr += '<span class="bbsGroupdesc">'+E2C(RTrim(dcforumGroupdescription))+'</span>';
		}
		var forumDescription = xmldoc.getElementsByTagName("acforumdescription")[0].firstChild.nodeValue;
		if(forumDescription != "^ACFORUMDESC^") {
			var dcforumDescription = des(txkey, hexToString(forumDescription), 0, 0);
			xcrestr += '<br><span class="bbsForumdesc">'+E2C(RTrim(dcforumDescription))+'</span>';
		}
		xfnameset.innerHTML = xcrestr;
		var itopics = xmldoc.getElementsByTagName("acforumtopic").length;
		var iusers = xmldoc.getElementsByTagName("acforumuser").length;
		if(iusers > 0) {
			var tbbulist = retupUserlist(xmldoc);
			xrooms.innerHTML = tbbulist;
		}
		var itopicsp = bbslang[70]+' <span class="hotValue">'+doextTimestamp(forumStamp)+'</span>&nbsp;&nbsp;&nbsp;'+bbslang[68]+' <span class="hotValue">'+itopics+'</span>';
		var iusersp = '&nbsp;&nbsp;&nbsp;&nbsp;'+bbslang[69]+' <span class="hotValue">'+iusers+'</span>';
		var xfstats = getElement("forumstats");
		xfstats.innerHTML = itopicsp+iusersp;
		if(parseFloat(itopics) > 0) {
			var retList = topicList(xmldoc);
			xmainds.innerHTML = retList;
			} else {
			xmainds.innerHTML = '<div align="center" class="bbsTopicheader"><br><br><br>'+bbslang[35]+'</div>';
		}
		} else {
		xmainds.innerHTML = '<div align="center" class="bbsTopicheader"><br><br><br>'+bbslang[36]+'</div>';
	}
}

// Topiclist, sorted by sticky, and reverse last post date
function topicList(xmldoc) {
	var txkey = retK();
	var itopics = xmldoc.getElementsByTagName("acforumtopic").length;
	var iTopicarr = new Array();
	var istickTopicarr = new Array();
	var rviTopicarr = new Array();
	for(t=0;t<itopics;t++) {
		var vsStatus = xmldoc.getElementsByTagName("actopicstatus")[t].firstChild.nodeValue;
		if(vsStatus == "open") {
			var retStatus = bbslang[22];
			} else {
			var retStatus = bbslang[23];
		}
		var vsReplies = xmldoc.getElementsByTagName("actopicreplies")[t].firstChild.nodeValue;
		var vsSticky = xmldoc.getElementsByTagName("actopicsticky")[t].firstChild.nodeValue;
		var vsPostdate = xmldoc.getElementsByTagName("actopicdate")[t].firstChild.nodeValue;
		var vsPostdatep = doTimestamp(vsPostdate);
		var vsLastpostdate = xmldoc.getElementsByTagName("actopiclastpost")[t].firstChild.nodeValue;
		var vsLastpostdatep = doTimestamp(vsLastpostdate);
		var vsTopic = des(txkey, hexToString(xmldoc.getElementsByTagName("actopictitle")[t].firstChild.nodeValue), 0, 0);
		vsTopic = '<a href="#" class="bbsTopiclink" onClick="goTopic(\''+xmldoc.getElementsByTagName("actid")[t].firstChild.nodeValue+'\');return false;" onFocus="this.blur()">'+E2C(RTrim(vsTopic))+' ('+vsReplies+')</a>';
		var vsAuthor = des(txkey, hexToString(xmldoc.getElementsByTagName("actopicauthor")[t].firstChild.nodeValue), 0, 0);
		vsAuthor = E2C(RTrim(vsAuthor));
		var vslaAuthor = des(txkey, hexToString(xmldoc.getElementsByTagName("actopiclastpostauthor")[t].firstChild.nodeValue), 0, 0);
		vslaAuthor = E2C(RTrim(vslaAuthor));
		var setvsLauthor = '<span class="bbsTime">'+vsLastpostdatep+'</span> - '+vslaAuthor+'';
		if(vsSticky == 'y') {
			istickTopicarr.push(vsLastpostdate+'^'+vsTopic+'^'+vsAuthor+'^'+vsPostdatep+'^'+setvsLauthor+'^'+retStatus);
			} else {
			iTopicarr.push(vsLastpostdate+'^'+vsTopic+'^'+vsAuthor+'^'+vsPostdatep+'^'+setvsLauthor+'^'+retStatus);
		}
	}
	iTopicarr = iTopicarr.sort();
	istickTopicarr = istickTopicarr.sort();
	iTopicarr = iTopicarr.reverse();
	istickTopicarr = istickTopicarr.reverse();
	var retTbl = '<table width="100%" cellpadding="2" cellspacing="0" border="0" class="bbsForumtable">^XTROWS^</table>';
	var retTsr = '<tr><td align="left" valign="top" class="bbsTdhead">'+bbslang[17]+'</td>';
	retTsr += '<td align="left" valign="top" class="bbsTdhead">'+bbslang[18]+'</td>';
	retTsr += '<td align="left" valign="top" class="bbsTdhead">'+bbslang[19]+'</td>';
	retTsr += '<td align="left" valign="top" class="bbsTdhead">'+bbslang[20]+'</td>';
	retTsr += '<td align="left" valign="top" class="bbsTdhead">'+bbslang[21]+'</td></tr>';
	t=0;
	var xnct = 1;
	var trcls = "";
	for(t=0;t<istickTopicarr.length;t++) {	
		var txline = istickTopicarr[t].split("^");
		if(xnct == 2) { 
			trcls = "bbsAltrow1";
			xnct = 0;
			} else {
			trcls = "bbsAltrow2";
		}
		xnct++;
		retTsr += '<tr class="'+trcls+'"><td align="left" valign="top" class="bbsMsg"><li> '+txline[1]+'</td>';
		retTsr += '<td align="left" valign="top" class="bbsAuthor">'+txline[2]+'</span><br></td>';
		retTsr += '<td align="left" valign="top" class="bbsTime">'+txline[3]+'</span><br></td>';
		retTsr += '<td align="left" valign="top" class="bbsAuthor">'+txline[4]+'<br></td>';
		retTsr += '<td align="left" valign="top" class="bbsTime">'+txline[5]+'</span><br></td></tr>';
	}
	for(t=0;t<iTopicarr.length;t++) {	
		var txline = iTopicarr[t].split("^");
		if(xnct == 2) { 
			trcls = "bbsAltrow1";
			xnct = 0;
			} else {
			trcls = "bbsAltrow2";
		}
		xnct++;
		retTsr += '<tr class="'+trcls+'"><td align="left" valign="top">'+txline[1]+'</td>';
		retTsr += '<td align="left" valign="top" class="bbsAuthor">'+txline[2]+'</span><br></td>';
		retTsr += '<td align="left" valign="top" class="bbsTime">'+txline[3]+'</span><br></td>';
		retTsr += '<td align="left" valign="top" class="bbsAuthor">'+txline[4]+'<br></td>';
		retTsr += '<td align="left" valign="top" class="bbsTime">'+txline[5]+'</span><br></td></tr>';
	}
	retTsr += '<tr><td colspan="5" align="left" valign="top" class="bbsTime"> </td></tr>';
	retTbl = retTbl.replace("^XTROWS^", retTsr);
	return retTbl;
}

// Edit forum data init, fetch fresh data from server
function retForumdataEdit(url) { 
	var xhr = createXHR();
	xhr.onreadystatechange=function()	{ 
		if(xhr.readyState == 4 && xhr.status == 200)	{
		  if(debug_mode == "1") {
        alert(xhr.responseText);
      }
			var xmldoc = xhr.responseXML;
			var tstKey = xmldoc.getElementsByTagName("autherr")[0].firstChild.nodeValue;
			if(tstKey == "none") {
				var chmsg = getElement("msgs");
				chmsg.value = bbslang[80];
				var tstExec = xmldoc.getElementsByTagName("aexec")[0].firstChild.nodeValue;
				var chexec = getElement("exec");
				chexec.value = tstExec;
				var txkey = retK();
				var forumName = xmldoc.getElementsByTagName("acforumname")[0].firstChild.nodeValue;
				if(forumName != "^ACFORUMNAME^") {
					var dcforumName = des(txkey, hexToString(forumName), 0, 0);
					putFormvalue("ffname", E2C(RTrim(dcforumName)));
					var forumDescription = xmldoc.getElementsByTagName("acforumdescription")[0].firstChild.nodeValue;
					if(forumDescription != "^ACFORUMDESC^") {
						var dcforumDescription = des(txkey, hexToString(forumDescription), 0, 0);
						putFormvalue("ffdescr", E2C(RTrim(dcforumDescription)));
					}
					var forumGroupname = xmldoc.getElementsByTagName("acforumgroupname")[0].firstChild.nodeValue;
					if(forumGroupname != "^ACFORUMGROUPNAME^") {
						var dcforumGroupname = des(txkey, hexToString(forumGroupname), 0, 0);
						putFormvalue("ffgroupname", E2C(RTrim(dcforumGroupname)));
					}
					var forumGroupdescription = xmldoc.getElementsByTagName("acforumgroupdescription")[0].firstChild.nodeValue;
					if(forumGroupdescription != "^ACFORUMGROUPDESC^") {
						var dcforumGroupdescription = des(txkey, hexToString(forumGroupdescription), 0, 0);
						putFormvalue("ffgroupdescr", E2C(RTrim(dcforumGroupdescription)));
					}
				}
				chmsg.value = '';
				} else {
				alert(tstKey);
			}
		}
	}; 
	xhr.open("GET", url, true);		
  xhr.send(null);
} 

// Compile the forum edit form and fill the layer
function writeForumForm() {
	var xretlayer = getElement("converse");
	var xretmpl = '<table width="70%" cellpadding="0" cellspacing="0" border="0" class="bbsForumtable">^TROWS^</table>';
	var fformstr = '';
	fformstr += '<tr><td align="left" valign="top" class="bbsTdhead">'+bbslang[8]+'&nbsp;&nbsp;&nbsp;'+bbslang[2]+'<br></td></tr>';
	fformstr += '<tr><td align="left" valign="top" class="bbsUtiltext">'+bbslang[3]+'<br><input type="text" name="ffname" id="ffname" value="" maxlength="70" class="fieldSubject" style="width:100%"><br></td></tr>';
	fformstr += '<tr><td align="left" valign="top" class="bbsUtiltext">'+bbslang[4]+'<br><input type="text" name="ffdescr" id="ffdescr" value="" maxlength="70" class="fieldSubject" style="width:100%"><br></td></tr>';
	fformstr += '<tr><td align="left" valign="top" class="bbsUtiltext">'+bbslang[5]+'<br><input type="text" name="ffgroupname" id="ffgroupname" maxlength="30" value="" class="fieldSubject" style="width:100%"><br></td></tr>';
	fformstr += '<tr><td align="left" valign="top" class="bbsUtiltext">'+bbslang[6]+'<br><input type="text" name="ffgroupdescr" id="ffgroupdescr" value="" maxlength="50" class="fieldSubject" style="width:100%"><br></td></tr>';
	fformstr += '<tr><td align="left" valign="top"><input type="button" name="updforum" id="updforum" value="'+bbslang[13]+'" class="cbutton" onClick="doFupdate();"></span></td></tr>';
	xretmpl = xretmpl.replace("^TROWS^", fformstr);
	xretlayer.innerHTML = xretmpl;
	var xfocus = getElement("ffname");
	xfocus.focus();
}

// Init POST of updated forumdata, encrypt and compile strings
function doFupdate() {
	var xdummy = retDummy();
	var xfnset = getElement("ffname");
	var xfname = Trim(getElement("ffname").value);
	if(xfname == "") {
		alert(bbslang[16]);
		xfnset.focus();
		} else {
		var urlauthfrag = retLoginstring();
		var txkey = retK();
		var doFcrypt = des(txkey, C2E(xfname), 1, 0);
		var khexurl = 'xfn='+printHex(doFcrypt);
		var xfdesc = Trim(getElement("ffdescr").value);
		if(xfdesc != "") {
			doFcrypt = des(txkey, C2E(xfdesc), 1, 0);
			khexurl += '&xfd='+printHex(doFcrypt);
			} else {
			khexurl += '&xfd=none';
		}
		var xgname = Trim(getElement("ffgroupname").value);
		if(xgname != "") {
			doFcrypt = des(txkey, C2E(xgname), 1, 0);
			khexurl += '&xgn='+printHex(doFcrypt);
			} else {
			khexurl += '&xgn=none';
		}
		var xgdesc = Trim(getElement("ffgroupdescr").value);
		if(xgdesc != "") {
			doFcrypt = des(txkey, C2E(xgdesc), 1, 0);
			khexurl += '&xgd='+printHex(doFcrypt);
			} else {
			khexurl += '&xgd=none';
		}
		var urltx = urlbs+'?c=fu'+urlauthfrag;
		var chmsg = getElement("msgs");
		chmsg.value = bbslang[81];
		updForumdata(urltx, khexurl);
	}
}

// Exec POST of updated forumdata
function updForumdata(url, content)	{ 
	var xhr = createXHR();
	xhr.onreadystatechange=function()	{ 
		if(xhr.readyState == 4 && xhr.status == 200)	{
		  if(debug_mode == "1") {
        alert(xhr.responseText);
      }
			var xmldoc = xhr.responseXML;
			var tstKey = xmldoc.getElementsByTagName("autherr")[0].firstChild.nodeValue;
			if(tstKey == "none") {
				var tstExec = xmldoc.getElementsByTagName("aexec")[0].firstChild.nodeValue;
				var chexec = getElement("exec");
				chexec.value = tstExec;
				var chmsg = getElement("msgs");
				chmsg.value = '';
				loadBBSlayer("sforum");
				} else {
				alert(tstKey);
				window.close();
			}
		}
	}; 
	xhr.open("POST", url, true);		
	xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
	xhr.send(content); 
}

// Select topic
function goTopic(tid) {
	viewTopic(tid);
}

/*****************************
--> BBS Topic functions
*****************************/

// Init view topic
function viewTopic(tid) {
	var urlauthfrag = retLoginstring();
	var urltx = urlbs+'?c=vt&ft='+tid+urlauthfrag;
	var chmsg = getElement("msgs");
	chmsg.value = bbslang[79];
	retTopicdata(urltx);
}

// Exec view topic
function retTopicdata(urltx) {
	var xhr = createXHR();
	xhr.onreadystatechange=function()	{ 
		if(xhr.readyState == 4 && xhr.status == 200)	{
		  if(debug_mode == "1") {
        alert(xhr.responseText);
      }
			var xmldoc = xhr.responseXML;
			var xmlstring = xhr.responseText;
			var tstKey = xmldoc.getElementsByTagName("autherr")[0].firstChild.nodeValue;
			if(tstKey == "none") {
				var tstExec = xmldoc.getElementsByTagName("aexec")[0].firstChild.nodeValue;
				var chexec = getElement("exec");
				chexec.value = tstExec;
				var chmsg = getElement("msgs");
				chmsg.value = bbslang[80];
				parseTopicdata(xmldoc);
				chmsg.value = '';
				var prntxml = getElement("pxml");
				xmlstring = xmlstring.replaceAll("\\n", "\\\n");
				prntxml.value = escape(xmlstring);
				} else {
				alert(tstKey);
				window.close();
			}
		}
	}; 
	// This may be uncommented to amend max Ajax transfer length woes, if any
	//xhr.open("POST", urltx, true);
	//xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
	//xhr.send(null);
	xhr.open("GET", urltx, true);	
  xhr.send(null);
}

// Main function for treating topicdata
function parseTopicdata(xmldoc) {
	var topicName = xmldoc.getElementsByTagName("actopictitle")[0].firstChild.nodeValue;
	var topicID = parseInt(xmldoc.getElementsByTagName("actid")[0].firstChild.nodeValue);
	var topicAuthor = xmldoc.getElementsByTagName("actopicauthor")[0].firstChild.nodeValue;
	var topicDate = xmldoc.getElementsByTagName("actopicdate")[0].firstChild.nodeValue;
	var serverStamp = xmldoc.getElementsByTagName("acforumtstamp")[0].firstChild.nodeValue;
	var topicLock = xmldoc.getElementsByTagName("actopicstatus")[0].firstChild.nodeValue;
	var topicSticky = xmldoc.getElementsByTagName("actopicsticky")[0].firstChild.nodeValue;
	var topicStatus = 0;
	if(Trim(topicLock) == 'open') {
		topicStatus = 1;
		var threadLockl = bbslang[48];
		var tStats = bbslang[22];
		} else {
		var threadLockl = bbslang[57];
		var tStats = bbslang[23];
	}
	if(Trim(topicSticky) == 'y') {
		var tSticky = bbslang[62];
		} else {
		var tSticky = bbslang[61];
	}
	if(topicName != "^ACTOPICTITLE^") {
		var authdata = retY();
		var xUsers = retUserarr(xmldoc);
		authtlinkrow = '';
		var uauthtlinkrow = '';
		var authS = readAuth(xUsers, authdata);
		if(parseInt(authS) > 0) {
			if(topicStatus == 1) {
				authtlinkrow = '<a href="#" onClick="delTopic('+topicID+');return false;" onFocus="this.blur()" class="pstate_off" style="float:right">'+bbslang[46]+'</a>'
				+'<a href="#" onClick="lockTopic('+topicID+');return false;" onFocus="this.blur()" class="pstate_off" style="float:right">'+threadLockl+'</a>'
				+'<a href="#" onClick="stickyTopic('+topicID+');return false;" onFocus="this.blur()" class="pstate_off" style="float:right">'+tSticky+'</a>';
				uauthtlinkrow = '<a href="#" onClick="editTopic('+topicID+', 0);return false;" onFocus="this.blur()" class="pstate_off" style="float:right">'+bbslang[47]+'</a>';
				} else {
				authtlinkrow = '<a href="#" onClick="delTopic('+topicID+');return false;" onFocus="this.blur()" class="pstate_off" style="float:right">'+bbslang[46]+'</a>'
				+'<a href="#" onClick="lockTopic('+topicID+');return false;" onFocus="this.blur()" class="pstate_off" style="float:right">'+threadLockl+'</a>'
				+'<a href="#" onClick="stickyTopic('+topicID+');return false;" onFocus="this.blur()" class="pstate_off" style="float:right">'+tSticky+'</a>';
				uauthtlinkrow = '<a href="#" onClick="editTopic('+topicID+', 0);return false;" onFocus="this.blur()" class="pstate_off" style="float:right">'+bbslang[47]+'</a>';
			}
			} else {
			if(topicStatus == 1) {
				if(Trim(topicAuthor) == Trim(authdata)) {
					authtlinkrow = '';
					var tDiff = parseInt(serverStamp) - parseInt(topicDate);
					if(pDiff > 0) {
						if(tDiff < pDiff) {
							uauthtlinkrow = '<a href="#" onClick="edTopic('+topicID+');return false;" onFocus="this.blur()" class="pstate_off" style="float:right">'+bbslang[47]+'</a>';
						}
						} else {
						uauthtlinkrow = '<a href="#" onClick="edTopic('+topicID+');return false;" onFocus="this.blur()" class="pstate_off" style="float:right">'+bbslang[47]+'</a>';
					}
					} else {
					authtlinkrow = '';
					uauthtlinkrow = '';
				}
				} else {
				authtlinkrow = '';
				uauthtlinkrow = '';
			}
		}
		var txkey = retK();
		var xtpretstr = "";
		var xtareststr = "";
		var xtdretstr = "";
		var xtmsgretstr = "";
		var xtreplretstr = "";
		var xtopicpath = "";
		xtopicpath = '<a href="#" onClick="viewForum();return false;" onFocus="this.blur()" class="bbsTopicpath" style="float:left">'+bbslang[37]+'&nbsp;</a>';
		var dctopicName = des(txkey, hexToString(topicName), 0, 0);
		xtpretstr = '<span class="bbsTopicheader" style="float:left">'+E2C(RTrim(dctopicName))+'</span>';
		xtopicpath += '<a href="#" class="bbsTopicpath" style="float:left" onClick="goTopic(\''+topicID+'\');return false;" onFocus="this.blur()"> -> '+E2C(RTrim(dctopicName))+'&nbsp; - '+bbslang[58]+tStats+'</a>';
		var dctopicAuthor = des(txkey, hexToString(topicAuthor), 0, 0);
		xtareststr += '<span class="bbstAuthor" style="float:left">'+E2C(RTrim(dctopicAuthor))+'</span>';
		var topicTest = xmldoc.getElementsByTagName("actopicreplies")[0].firstChild.nodeValue;
		xtdretstr = '<span class="bbsTime" style="float:right">'+doextTimestamp(topicDate)+'</span><br clear="all">';
		var imsgparts = xmldoc.getElementsByTagName("actopicmessages").length;
		var drgmsgs = "";
		if(imsgparts > 0) {
			for(r=0;r<imsgparts;r++) {
				drgmsgs += xmldoc.getElementsByTagName("actopicmessages")[r].firstChild.nodeValue;
			}
			var dctopicMessage = des(txkey, hexToString(drgmsgs), 0, 0);
			xtmsgretstr += produceHtml(E2C(RTrim(dctopicMessage)));
		}
		var xmainds = getElement("converse");
		var xrooms = getElement("chroom");
		var transUserlist = retupUserlist(xmldoc);
		xrooms.innerHTML = transUserlist;
		var ireplies = xmldoc.getElementsByTagName("acforumtopicreply").length;
		xtreplretstr = '<span class="bbsTime" style="float:right">Replies: '+ireplies+'</span><br clear="all">';
		if(topicStatus == 1) {
			var xpnavstr = '<a href="#" onClick="tReply('+topicID+', '+ireplies+');return false;" onFocus="this.blur()" class="pstate_off" style="float:right">'+bbslang[29]+'</a>'
			+uauthtlinkrow+authtlinkrow;
			} else {
			var xpnavstr = uauthtlinkrow+authtlinkrow;
		}
		var retTbl = '<table width="100%" cellpadding="2" cellspacing="0" border="0" class="bbsForumtable">^XTROWS^^XTXROWS^</table>';
		var retTsr = '<tr><td align="left" valign="top" class="bbsTdheadtopic">'+xtareststr+''+xtdretstr+''+xtpretstr+''+xtreplretstr+'</td></tr>';
		retTsr += '<tr><td align="left" valign="top" class="bbsTime">&nbsp;</td></tr>';
		retTsr += '<tr><td align="left" valign="top" class="bbsMsg">'+xtmsgretstr+'<br></td></tr>';
		retTsr += '<tr><td align="left" valign="top" class="bbsTime">&nbsp;</td></tr>';
		retTsr += '<tr><td align="left" valign="top" class="bbsTdheadtopic">'+xpnavstr+'</td></tr>';
		retTsr += '<tr><td align="left" valign="top"><div id="tpcrepl" name="tpcrepl" class="switchcontent"></div></td></tr>';
		retTbl = retTbl.replace("^XTROWS^", retTsr);
		var xtnavstr = '<a href="#" onClick="tcPrint(\'t\');return false;" onFocus="this.blur()" class="pstate_off" style="float:right">'+bbslang[24]+'</a>'
		+'<a href="#" onClick="tcPrint(\'p\');return false;" onFocus="this.blur()" class="pstate_off" style="float:right">'+bbslang[25]+'</a>'
		+'<a href="#" onClick="doThsave(\'anobbs.php?c=ttt&ft='+topicID+retLoginstring()+'\');return false;" onFocus="this.blur()" class="pstate_off" style="float:right">'+bbslang[26]+'</a><br clear="all">';
		if(ireplies > 0) {
			var tMsgarr = doMessagerows(xmldoc);
			var retReplies = "";
			var tLeadin = '<tr><td align="left" valign="top">';
			var tLeadout = '</td></tr>';
			var retnavTbl = '<table width="100%" cellpadding="2" cellspacing="0" border="0">^XTSROWS^</table>';
			for(e=0;e<tMsgarr.length;e++) {
				var trowarr = tMsgarr[e].split("^");
				var xRplID = trowarr[0];
				var xRplHeader = trowarr[3];
				var xRplAuthor = trowarr[4];
				var xRplTime = trowarr[2];
				var xRpltoid = trowarr[1];
				var xRplMsg = trowarr[5];
				var xauthmodstr = '<a href="#" onFocus="this.blur()" onClick="delPost('+topicID+','+xRplID+');return false;" class="pstate_off" style="float:right">'+bbslang[31]+'</a>';
				var xauthuserstr = '<a href="#" onClick="editTopic('+topicID+','+xRplID+');return false;" onFocus="this.blur()" class="pstate_off" style="float:right">'+bbslang[30]+'</a>';
				var pauthlinks = postAuth(xUsers, xRplAuthor, authdata, serverStamp, xRplTime, pDiff, xauthmodstr, xauthuserstr, topicStatus);
				var xRplHeaderc = des(txkey, hexToString(xRplHeader), 0, 0);
				var xRplAuthorc = des(txkey, hexToString(xRplAuthor), 0, 0);
				if(Trim(xRplMsg) != "none") {
					var xRplMsgc = des(txkey, hexToString(xRplMsg), 0, 0);			
					xRplMsgc = produceHtml(E2C(RTrim(xRplMsgc)));
					} else {
					var xRplMsgc = "";
				}
				if(topicStatus == 1) {
					var xprepnavstr = '<a href="#" onClick="tReply('+topicID+', '+xRplID+');return false;" onFocus="this.blur()" class="pstate_off" style="float:right">'+bbslang[29]+'</a>'+pauthlinks;
					} else {
					var xprepnavstr = pauthlinks;
				}
				var retReplTsr = "";
				var xRplheaderstr = '<span class="bbstAuthor" style="float:left">'+E2C(RTrim(xRplAuthorc))+'</span><span class="bbsTime" style="float:right">'+doextTimestamp(xRplTime)+'</span><br clear="all"><span class="bbsTopicheader" style="float:left">'+E2C(RTrim(xRplHeaderc))+'</span>'+xprepnavstr+'<br clear="all">';
				retReplTsr += '<tr><td align="left" valign="top" class="bbsTdheadtopic">'+xRplheaderstr+'</td></tr>';
				retReplTsr += '<tr><td align="left" valign="top" class="bbsTime">&nbsp;</td></tr>';
				retReplTsr += '<tr><td align="left" valign="top" class="bbsMsg">'+xRplMsgc+'</td></tr>';
				retReplTsr += '<tr><td align="left" valign="top" class="bbsTime">&nbsp;</td></tr>';
				retReplies += retnavTbl.replace("^XTSROWS^", retReplTsr);
			}
			retReplies = tLeadin+retReplies+tLeadout;
			retTbl = retTbl.replace("^XTXROWS^", retReplies);
			} else {
			retTbl = retTbl.replace("^XTXROWS^", "");
		}
		xmainds.innerHTML = xtopicpath+'<br clear="all">'+xtnavstr+retTbl+'<br><br><br>';
	}
}
	
// Return topic message rows as array
function doMessagerows(xmldoc) {
	var aMsgrows = new Array();
	var root = xmldoc.getElementsByTagName('root')[0];
	var items = root.getElementsByTagName("acforumtopicreply");
	for(var i=0;i<items.length;i++) {
		var topicReplyid = items[i].getElementsByTagName("actreplyid")[0].firstChild.nodeValue;
		var topicReplytoid = items[i].getElementsByTagName("actreplyto")[0].firstChild.nodeValue;
		var topicReplydate = items[i].getElementsByTagName("actopicreplydate")[0].firstChild.nodeValue;
		var topicReplytitle = items[i].getElementsByTagName("actopicreplytitle")[0].firstChild.nodeValue;
		var topicReplyauthor = items[i].getElementsByTagName("actopicreplyauthor")[0].firstChild.nodeValue;
		var tMsgs = items[i].getElementsByTagName("actopicreplytexts");
		var rMsgstr = "";
		for(var t=0;t<tMsgs.length;t++) {
			rMsgstr += tMsgs[t].firstChild.nodeValue;
		}
		aMsgrows.push(topicReplyid+'^'+topicReplytoid+'^'+topicReplydate+'^'+topicReplytitle+'^'+topicReplyauthor+'^'+rMsgstr);
	}
	return aMsgrows;
}

// Form for writing new topic
function doWriter() {
	var retTbl = '<table width="100%" cellpadding="0" cellspacing="0" border="0" class="bbsForumtable">^XTROWS^</table>';
	var xwrtstr = '';
	xwrtstr += '<tr><td align="left" valign="top" class="bbsTdhead">'+bbslang[27]+'&nbsp;&nbsp;&nbsp;<input type="text" name="subject" id="subject" value="" size="60" maxlength="70" class="csubject" autocomplete="off"></td></tr>';
	xwrtstr += '<tr><td align="left" valign="top">&nbsp;</td></tr>';
	xwrtstr += '<tr><td align="left" valign="top" class="bbsUtiltext">'+doCbuttons()+'</td></tr>';
	xwrtstr += '<tr><td align="left" valign="top"><textarea name="message" id="message" class="dcode" wrap="virtual" cols="70" rows="20" style="width: 100%" onselect="storeCaret(this);" onclick="storeCaret(this);" onkeyup="storeCaret(this);"></textarea><br></td></tr>';
	xwrtstr += '<tr><td align="left" valign="top" class="bbsUtiltext">'+doPbuttons()+'</td></tr>';
	xwrtstr += '<tr><td align="left" valign="top">&nbsp;</td></tr>';
	retTbl = retTbl.replace("^XTROWS^", xwrtstr);
	return retTbl;
}

// Form for writing new topic reply
function dorWriter() {
	var retTbl = '<table width="100%" cellpadding="0" cellspacing="0" border="0" class="bbsForumtable">^XTROWS^</table>';
	var xwrtstr = '';
	xwrtstr += '<tr><td align="left" valign="top" class="bbsTdhead">'+bbslang[32]+'&nbsp;&nbsp;&nbsp;<input type="text" name="subject" id="subject" value="" size="60" maxlength="70" class="csubject" autocomplete="off"></td></tr>';
	xwrtstr += '<tr><td align="left" valign="top">&nbsp;</td></tr>';
	xwrtstr += '<tr><td align="left" valign="top" class="bbsUtiltext">'+doCbuttons()+'</td></tr>';
	xwrtstr += '<tr><td align="left" valign="top"><textarea name="message" id="message" class="dcode" wrap="virtual" cols="70" rows="20" style="width: 100%;height:300px" onselect="storeCaret(this);" onclick="storeCaret(this);" onkeyup="storeCaret(this);"></textarea><br></td></tr>';
	xwrtstr += '<tr><td align="left" valign="top" class="bbsUtiltext">'+dorepPbuttons()+'</td></tr>';
	xwrtstr += '<tr><td align="left" valign="top">&nbsp;</td></tr>';
	retTbl = retTbl.replace("^XTROWS^", xwrtstr);
	return retTbl;
}

// Form for updating existing topic
function doredWriter() {
	var retTbl = '<table width="100%" cellpadding="0" cellspacing="0" border="0" class="bbsForumtable">^XTROWS^</table>';
	var xwrtstr = '';
	xwrtstr += '<tr><td align="left" valign="top" class="bbsTdhead">'+bbslang[32]+'&nbsp;&nbsp;&nbsp;<input type="text" name="subject" id="subject" value="" size="60" maxlength="70" class="csubject" autocomplete="off"></td></tr>';
	xwrtstr += '<tr><td align="left" valign="top">&nbsp;</td></tr>';
	xwrtstr += '<tr><td align="left" valign="top" class="bbsUtiltext">'+doCbuttons()+'</td></tr>';
	xwrtstr += '<tr><td align="left" valign="top"><textarea name="message" id="message" class="dcode" wrap="virtual" cols="70" rows="20" style="width: 100%;height:300px" onselect="storeCaret(this);" onclick="storeCaret(this);" onkeyup="storeCaret(this);"></textarea><br></td></tr>';
	xwrtstr += '<tr><td align="left" valign="top" class="bbsUtiltext">'+doEdrepPbuttons()+'</td></tr>';
	xwrtstr += '<tr><td align="left" valign="top">&nbsp;</td></tr>';
	retTbl = retTbl.replace("^XTROWS^", xwrtstr);
	return retTbl;
}

// Form for updating existing topic reply
function dotedWriter() {
	var retTbl = '<table width="100%" cellpadding="0" cellspacing="0" border="0" class="bbsForumtable">^XTROWS^</table>';
	var xwrtstr = '';
	xwrtstr += '<tr><td align="left" valign="top" class="bbsTdhead">'+bbslang[32]+'&nbsp;&nbsp;&nbsp;<input type="text" name="subject" id="subject" value="" size="60" maxlength="70" class="csubject" autocomplete="off"></td></tr>';
	xwrtstr += '<tr><td align="left" valign="top">&nbsp;</td></tr>';
	xwrtstr += '<tr><td align="left" valign="top" class="bbsUtiltext">'+doCbuttons()+'</td></tr>';
	xwrtstr += '<tr><td align="left" valign="top"><textarea name="message" id="message" class="dcode" wrap="virtual" cols="70" rows="20" style="width: 100%;height:300px" onselect="storeCaret(this);" onclick="storeCaret(this);" onkeyup="storeCaret(this);"></textarea><br></td></tr>';
	xwrtstr += '<tr><td align="left" valign="top" class="bbsUtiltext">'+doEdtopicPbuttons()+'</td></tr>';
	xwrtstr += '<tr><td align="left" valign="top">&nbsp;</td></tr>';
	retTbl = retTbl.replace("^XTROWS^", xwrtstr);
	return retTbl;
}

// Init new topic post
function donTopic(mxfield, sxfield) {
	var dxsubelm = getElement(sxfield);
	var dxsub = dxsubelm.value;
	if(Trim(dxsub) != "") {			
		var dxsub = getElement(sxfield).value;
		var dxmsg = Trim(getElement(mxfield).value);
		var txkey = retK();			
		var urlauthfrag = retLoginstring();
		var doTcrypt = des(txkey, C2E(dxsub), 1, 0);
		var thexurl = 'xts='+printHex(doTcrypt);
		if(dxmsg != "") {
			doTcrypt = des(txkey, C2E(dxmsg), 1, 0);
			thexurl += '&xtm='+printHex(doTcrypt);
			} else {
			thexurl += '&xtm=none';
		}
		var urltx = urlbs+'?c=pt'+urlauthfrag;
		var chmsg = getElement("msgs");
		chmsg.value = bbslang[81];
		postTopic(urltx, thexurl);
		} else {
		alert(bbslang[34]);
		dxsubelm.focus();
	}
}

// Exec new topic post
function postTopic(url, content)	{ 
	var xhr = createXHR();
	xhr.onreadystatechange=function()	{ 
		if(xhr.readyState == 4 && xhr.status == 200)	{
		  if(debug_mode == "1") {
        alert(xhr.responseText);
      }
			var xmldoc = xhr.responseXML;
			var xmlstring = xhr.responseText;
			var tstKey = xmldoc.getElementsByTagName("autherr")[0].firstChild.nodeValue;
			if(tstKey == "none") {
				var tstExec = xmldoc.getElementsByTagName("aexec")[0].firstChild.nodeValue;
				var chexec = getElement("exec");
				chexec.value = tstExec;
				var chmsg = getElement("msgs");
				chmsg.value = bbslang[82]+' '+bbslang[80];
				parseTopicdata(xmldoc);
				chmsg.value = '';
				treatXlinks("sforum");
				var prntxml = getElement("pxml");
				xmlstring = xmlstring.replaceAll("\\n", "\\\n");
				prntxml.value = escape(xmlstring);
				} else {
				alert(tstKey);
				window.close();
			}
		}
	}; 
	xhr.open("POST", url, true);		
	xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
	xhr.send(content); 
} 

// Init topic reply
function tReply(tid, trfid) {
	var tReplyform = '<br>'+dorWriter();
	var xreplayer = getElement("tpcrepl");
	xreplayer.innerHTML = tReplyform;
	expandcontent("tpcrepl");
	var xTid = getElement("doTid");
	xTid.value = tid;
	var xrTid = getElement("dotRid");
	xrTid.value = trfid;
	var xrsub = getElement("subject");
	xrsub.focus();
}

// Init topic reply submit
function doTopicrepl(mxfield, sxfield) {
	var dxsubelm = getElement(sxfield);
	var dxsub = dxsubelm.value;
	if(Trim(dxsub) != "") {
		var dxmsg = Trim(getElement(mxfield).value);
		var dxtpic = getElement("doTid").value;
		var dxtpicr = getElement("dotRid").value;
		var dxmsg = Trim(getElement(mxfield).value);
		var urlauthfrag = retLoginstring();
		var txkey = retK();
		var doTcrypt = des(txkey, C2E(dxsub), 1, 0);
		var thexurl = 'xts='+printHex(doTcrypt);
		if(dxmsg != "") {
			doTcrypt = des(txkey, C2E(dxmsg), 1, 0);
			thexurl += '&xtm='+printHex(doTcrypt);
			} else {
			thexurl += '&xtm=none';
		}
		var urltx = urlbs+'?c=ptr&xtpc='+dxtpic+'&xtr='+dxtpicr+urlauthfrag;
		var chmsg = getElement("msgs");
		chmsg.value = bbslang[82];
		postTopicreply(urltx, thexurl);
		} else {
		alert(bbslang[33]);
		dxsubelm.focus();
	}
}

// Exec topic reply submit
function postTopicreply(url, content)	{ 
	var xhr = createXHR();
	xhr.onreadystatechange=function()	{ 
		if(xhr.readyState == 4 && xhr.status == 200)	{
		  if(debug_mode == "1") {
        alert(xhr.responseText);
      }
			var xmldoc = xhr.responseXML;
			var xmlstring = xhr.responseText;
			var tstKey = xmldoc.getElementsByTagName("autherr")[0].firstChild.nodeValue;
			if(tstKey == "none") {
				var tstExec = xmldoc.getElementsByTagName("aexec")[0].firstChild.nodeValue;
				var chexec = getElement("exec");
				chexec.value = tstExec;
				var chmsg = getElement("msgs");
				chmsg.value = bbslang[82]+' '+bbslang[80];
				parseTopicdata(xmldoc);
				chmsg.value = '';
				var prntxml = getElement("pxml");
				xmlstring = xmlstring.replaceAll("\\n", "\\\n");
				prntxml.value = escape(xmlstring);
				var resp = getElement("rescroll");
				resp.scrollIntoView(true);
				} else {
				alert(tstKey);
				window.close();
			}
		}
	}; 
	xhr.open("POST", url, true);		
	xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
	xhr.send(content); 
}

// Init edit topic part 1, request of data
function editTopic(tid, tpid) {
	if(tpid == 0) {
		var xtpa = 't';
		tpid = 0;
		} else {
		var xtpa = 'p';
		tpid = tpid;
	}
	var urlauthfrag = retLoginstring();
	var urltx = urlbs+'?c=tpe&xtpc='+tid+'&xtpp='+tpid+'&xtpk='+pDiff+'&xtpa='+xtpa+urlauthfrag;
	var chmsg = getElement("msgs");
	chmsg.value = bbslang[79];
	doeditTopic(urltx);
}

// Exec edit topic part 1, load form depending which type: topic edit or reply edit
function doeditTopic(urltx) {
	var xhr = createXHR();
	xhr.onreadystatechange=function()	{ 
		if(xhr.readyState == 4 && xhr.status == 200)	{
		  if(debug_mode == "1") {
        alert(xhr.responseText);
      }
			var xmldoc = xhr.responseXML;
			var xmlstring = xhr.responseText;
			var tstKey = xmldoc.getElementsByTagName("autherr")[0].firstChild.nodeValue;
			if(tstKey == "none") {
				var tstExec = xmldoc.getElementsByTagName("aexec")[0].firstChild.nodeValue;
				var edtKid = xmldoc.getElementsByTagName("actopicedit")[0].firstChild.nodeValue;
				var edtTid = xmldoc.getElementsByTagName("actid")[0].firstChild.nodeValue;
				var chexec = getElement("exec");
				chexec.value = tstExec;
				var chmsg = getElement("msgs");
				chmsg.value = bbslang[82]+' '+bbslang[80];
				parseTopicdata(xmldoc);
				chmsg.value = '';
				var prntxml = getElement("pxml");
				xmlstring = xmlstring.replaceAll("\\n", "\\\n");
				prntxml.value = escape(xmlstring);
				if(parseInt(edtKid) > 0) {
					tEdReply(edtTid, edtKid);
					fillEdreplform(edtKid, xmldoc);
					} else {
					tEdTopic(edtTid);
					fillTopicEdreplform(xmldoc);
				}
				} else {
				alert(tstKey);
				window.close();
			}
		}
	}; 
	xhr.open("GET", urltx, true);	
  xhr.send(null);
}

// Form for edit of topic
function tEdTopic(tid) {
	var tReplyform = '<br>'+dotedWriter();
	var xreplayer = getElement("tpcrepl");
	xreplayer.innerHTML = tReplyform;
	expandcontent("tpcrepl");
	var xTid = getElement("doTid");
	xTid.value = tid;
	var xrTid = getElement("dotRid");
	xrTid.value = 0;
	var xrsub = getElement("subject");
	xrsub.focus();
}

// Form for edit of topic reply
function tEdReply(tid, trfid) {
	var tReplyform = '<br>'+doredWriter();
	var xreplayer = getElement("tpcrepl");
	xreplayer.innerHTML = tReplyform;
	expandcontent("tpcrepl");
	var xTid = getElement("doTid");
	xTid.value = tid;
	var xrTid = getElement("dotRid");
	xrTid.value = trfid;
	var xrsub = getElement("subject");
	xrsub.focus();
}

// Fill form for edit of topic
function fillTopicEdreplform(xmldoc) {
	var txkey = retK();
	var eTitle = xmldoc.getElementsByTagName("actopictitle")[0].firstChild.nodeValue;
	var eTitlec = des(txkey, hexToString(eTitle), 0, 0);
	putFormvalue("subject", E2C(RTrim(eTitlec)));
	var msgArr = xmldoc.getElementsByTagName("actopicmessages");
	var rMsgstr = "";
	for(var t=0;t<msgArr.length;t++) {
		rMsgstr += msgArr[t].firstChild.nodeValue;
	}
	var rMsgdec = des(txkey, hexToString(rMsgstr), 0, 0);
	var retMsgs = E2C(RTrim(rMsgdec));
	putFormvalue("message", retMsgs);
}

// Fill form for edit of topic reply
function fillEdreplform(edtKid, xmldoc) {
	var txkey = retK();
	var repliArr = xmldoc.getElementsByTagName("acforumtopicreply");
	repliNum = repliArr.length;
	var edtopic = '';
	var edpost = '';
	for(p=0;p<repliNum;p++) {
		var eId = repliArr[p].getElementsByTagName("actreplyid")[0].firstChild.nodeValue;
		if(parseInt(eId) == parseInt(edtKid)) {
			var eToid = repliArr[p].getElementsByTagName("actreplyto")[0].firstChild.nodeValue;
			var eTitle = repliArr[p].getElementsByTagName("actopicreplytitle")[0].firstChild.nodeValue;
			var eTitlec = des(txkey, hexToString(eTitle), 0, 0);
			putFormvalue("subject", E2C(RTrim(eTitlec)));
			var ePost = repliArr[p].getElementsByTagName("actreplyid")[0].firstChild.nodeValue;
			var tMsgs = repliArr[p].getElementsByTagName("actopicreplytexts");
			var rMsgstr = "";
			for(var t=0;t<tMsgs.length;t++) {
				rMsgstr += tMsgs[t].firstChild.nodeValue;
			}
			var rMsgdec = des(txkey, hexToString(rMsgstr), 0, 0);
			var retMsgs = E2C(RTrim(rMsgdec));
			putFormvalue("message", retMsgs);
		}
	}
}

// Init, submit of edit
function doEdTopicrepl(mxfield, sxfield) {
	var dxsubelm = getElement(sxfield);
	var dxsub = dxsubelm.value;
	if(Trim(dxsub) != "") {			
		var dxsub = getElement(sxfield).value;
		var dxmsg = Trim(getElement(mxfield).value);
		var txkey = retK();			
		var urlauthfrag = retLoginstring();
		var doTcrypt = des(txkey, C2E(dxsub), 1, 0);
		var thexurl = 'xts='+printHex(doTcrypt);
		if(dxmsg != "") {
			doTcrypt = des(txkey, C2E(dxmsg), 1, 0);
			thexurl += '&xtm='+printHex(doTcrypt);
			} else {
			thexurl += '&xtm=none';
		}
		var xTid = getElement("doTid").value;
		var xrTid = getElement("dotRid").value;
		if(parseInt(xrTid) == 0) {
			var xtpa = 't';
			} else {
			var xtpa = 'p';
		}
		var urltx = urlbs+'?c=tpu&xtpc='+xTid+'&xtpp='+xrTid+'&xtpk='+pDiff+'&xtpa='+xtpa+urlauthfrag;
		var chmsg = getElement("msgs");
		chmsg.value = bbslang[81];
		postEdTopic(urltx, thexurl);
		} else {
		alert(bbslang[34]);
		dxsubelm.focus();
	}
}

// Exec, submit of edit
function postEdTopic(url, content)	{ 
	var xhr = createXHR();
	xhr.onreadystatechange=function()	{ 
		if(xhr.readyState == 4 && xhr.status == 200)	{
		  if(debug_mode == "1") {
        alert(xhr.responseText);
      }
			var xmldoc = xhr.responseXML;
			var xmlstring = xhr.responseText;
			var tstKey = xmldoc.getElementsByTagName("autherr")[0].firstChild.nodeValue;
			if(tstKey == "none") {
				var tstExec = xmldoc.getElementsByTagName("aexec")[0].firstChild.nodeValue;
				var chexec = getElement("exec");
				chexec.value = tstExec;
				var chmsg = getElement("msgs");
				chmsg.value = bbslang[82]+' '+bbslang[80];
				parseTopicdata(xmldoc);
				chmsg.value = '';
				var prntxml = getElement("pxml");
				xmlstring = xmlstring.replaceAll("\\n", "\\\n");
				prntxml.value = escape(xmlstring);
				} else {
				alert(tstKey);
				window.close();
			}
		}
	}; 
	xhr.open("POST", url, true);		
	xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
	xhr.send(content); 
} 

// Save thread/topic
function doThsave(newin) {
 	slide5=window.open(newin,"savethread","resizable=yes,scrollbars=yes,menubar=yes,width=700,height=550,top=10,left=15");
	slide5.focus();			
}

// The print window
function tcPrint(xstate) {
	var tXML = unescape(getElement("pxml").value);
	var xmldoc = loadpXdoc(tXML);
	var txkey = retK();
	var topicName = xmldoc.getElementsByTagName("actopictitle")[0].firstChild.nodeValue;
	var topicID = parseInt(xmldoc.getElementsByTagName("actid")[0].firstChild.nodeValue);
	var topicAuthor = xmldoc.getElementsByTagName("actopicauthor")[0].firstChild.nodeValue;
	var topicDate = xmldoc.getElementsByTagName("actopicdate")[0].firstChild.nodeValue;
	var topicLock = xmldoc.getElementsByTagName("actopicstatus")[0].firstChild.nodeValue;
	if(Trim(topicLock) == 'open') {
		topicStatus = 1;
		var threadLockl = bbslang[48];
		var tStats = bbslang[22];
		} else {
		var threadLockl = bbslang[57];
		var tStats = bbslang[23];
	}
	var xtpretstr = "";
	var xtareststr = "";
	var xtdretstr = "";
	var xtmsgretstr = "";
	var xtreplretstr = "";
	var xtopicpath = "";
	xtopicpath = '<a href="#" onClick="return false;" onFocus="this.blur()" class="bbsTopiclink" style="float:left">'+bbslang[37]+'&nbsp;</a>';
	var dctopicName = des(txkey, hexToString(topicName), 0, 0);
	xtpretstr = '<span class="bbsTopicheader" style="float:left">'+E2C(RTrim(dctopicName))+'</span>';
	xtopicpath += '<a href="#" class="bbsTopiclink" style="float:left" onClick="return false;" onFocus="this.blur()"> -> '+E2C(RTrim(dctopicName))+'&nbsp; - '+bbslang[58]+tStats+'</a>';
	var dctopicAuthor = des(txkey, hexToString(topicAuthor), 0, 0);
	xtareststr += '<span class="bbstAuthor" style="float:left">'+E2C(RTrim(dctopicAuthor))+'</span>';
	var topicTest = xmldoc.getElementsByTagName("actopicreplies")[0].firstChild.nodeValue;
	xtdretstr = '<span class="bbsTime" style="float:right">'+doextTimestamp(topicDate)+'</span><br clear="all">';
	var imsgparts = xmldoc.getElementsByTagName("actopicmessages").length;
	var drgmsgs = "";
	if(imsgparts > 0) {
		for(r=0;r<imsgparts;r++) {
			drgmsgs += xmldoc.getElementsByTagName("actopicmessages")[r].firstChild.nodeValue;
		}
		var dctopicMessage = des(txkey, hexToString(drgmsgs), 0, 0);
		xtmsgretstr += produceHtml(E2C(RTrim(dctopicMessage)));
	}
	var ireplies = xmldoc.getElementsByTagName("acforumtopicreply").length;
	xtreplretstr = '<span class="bbsTime" style="float:right">Replies: '+ireplies+'</span><br clear="all">';
	var retTbl = '<table width="100%" cellpadding="2" cellspacing="0" border="0" class="bbsForumtable">^XTROWS^^XTXROWS^</table>';
	var retTsr = '<tr><td align="left" valign="top" class="bbsTdhead">'+xtareststr+''+xtdretstr+''+xtpretstr+''+xtreplretstr+'</td></tr>';
	retTsr += '<tr><td align="left" valign="top" class="bbsTime">&nbsp;</td></tr>';
	retTsr += '<tr><td align="left" valign="top" class="bbsMsg">'+xtmsgretstr+'<br></td></tr>';
	retTsr += '<tr><td align="left" valign="top" class="bbsTime">&nbsp;</td></tr>';
	retTbl = retTbl.replace("^XTROWS^", retTsr);
	if(xstate == 't') {
		retTbl = retTbl.replace("^XTXROWS^", "");
		} else {
		if(ireplies > 0) {
			var tMsgarr = doMessagerows(xmldoc);
			var retReplies = "";
			var tLeadin = '<tr><td align="left" valign="top">';
			var tLeadout = '</td></tr>';
			var retnavTbl = '<table width="100%" cellpadding="2" cellspacing="0" border="0">^XTSROWS^</table>';
			for(e=0;e<tMsgarr.length;e++) {
				var trowarr = tMsgarr[e].split("^");
				var xRplID = trowarr[0];
				var xRplHeader = trowarr[3];
				var xRplAuthor = trowarr[4];
				var xRplTime = trowarr[2];
				var xRpltoid = trowarr[1];
				var xRplMsg = trowarr[5];
				var xRplHeaderc = des(txkey, hexToString(xRplHeader), 0, 0);
				var xRplAuthorc = des(txkey, hexToString(xRplAuthor), 0, 0);
				if(Trim(xRplMsg) != "none") {
					var xRplMsgc = des(txkey, hexToString(xRplMsg), 0, 0);			
					xRplMsgc = produceHtml(E2C(RTrim(xRplMsgc)));
					} else {
					var xRplMsgc = "";
				}
				var retReplTsr = "";
				var xRplheaderstr = '<span class="bbstAuthor" style="float:left">'+E2C(RTrim(xRplAuthorc))+'</span><span class="bbsTime" style="float:right">'+doextTimestamp(xRplTime)+'</span><br clear="all"><span class="bbsTopicheader" style="float:left">'+E2C(RTrim(xRplHeaderc))+'</span><br clear="all">';
				retReplTsr += '<tr><td align="left" valign="top" class="bbsTdheadtopic">'+xRplheaderstr+'</td></tr>';
				retReplTsr += '<tr><td align="left" valign="top" class="bbsTime">&nbsp;</td></tr>';
				retReplTsr += '<tr><td align="left" valign="top" class="bbsMsg">'+xRplMsgc+'</td></tr>';
				retReplTsr += '<tr><td align="left" valign="top" class="bbsTime">&nbsp;</td></tr>';
				retReplies += retnavTbl.replace("^XTSROWS^", retReplTsr);
			}
			retReplies = tLeadin+retReplies+tLeadout;
			retTbl = retTbl.replace("^XTXROWS^", retReplies);
			} else {
			retTbl = retTbl.replace("^XTXROWS^", "");
		}
	}
	var pdox = '<meta http-equiv="Pragma" content="no-cache">\n';
  pdox += '<META HTTP-EQUIV="Expires" CONTENT="-1">\n';
	pdox += '<META http-equiv="Content-Type" content="text/html; charset=iso-8859-1">\n';
	pdox += '<link rel="STYLESHEET" type="text/css" href="anobbs_print.css">\n';
	var xtHeader = '<html>\n<head>\n<title>'+bbslang[65]+' '+topicID+'</title>\n'+pdox+'</head>\n';
	xtHeader = xtHeader + '<body class="cbody">\n';
	var xtEnd = '<br></body>\n</html>';
	windowdprops = 'menubar=no,location=no,toolbars=no,scrollbars=no,resizable=no,status=no,width=602,height=550,top=50,left=50';
	self.name = 'csh_main';
	runprint = window.open("",'dcprint',windowdprops);
	with (runprint.document) {
		open();
		write(xtHeader + retTbl + xtEnd);
		runprint.focus();
		if (window.print) runprint.print();
		runprint.close();
	}
}

// Returns edit links for topic posts
function postAuth(xUsers, usercode, xusercode, servStamp, pDate, pdiff, alinkrow, ulinkrow, tstatus) {
	var linkAuth = '';
	for(i=0;i<xUsers.length;i++) {
		var xuxline = xUsers[i].split("^");
		if(Trim(xuxline[1]) == Trim(xusercode)) {
			if(tstatus == 1) {
				var tDiff = parseInt(servStamp) - parseInt(pDate);
				if(pdiff > 0) {
					if(tDiff < pdiff) {
						linkAuth = ulinkrow;
					}
					} else {
					linkAuth = ulinkrow;
				}	
			}
			if(Trim(xuxline[2]) == 'admin' || Trim(xuxline[2]) == 'moderator') {
				if(tstatus == 1) {
					linkAuth = ulinkrow+alinkrow;
					} else {
					linkAuth = ulinkrow+alinkrow;
				}
			}
		}
	}
	return linkAuth;
}

/*****************************
--> BBS Auth functions
*****************************/

// Init BBS window, set auth code and run startAuth(); It uses a 'nonce' to
// escape autocomplete woes on the auth code field, see:
// http://wiki.mozilla.org/The_autocomplete_attribute_and_web_documents_using_XHTML#Appendix_B:_Autocomplete_alternatives
// It also allows for an extra level of security
function setbsAcode() {
	var kstrea = getElement("converse");
	var tcdes = getElement("srcsessid").value;
	var usessfrag = MD5(tcdes);
	var tcdea = getElement(usessfrag);
	//var tcdea = getElement("srcode");
	var tcdeb = getElement(tcdes);
	tcdea.value = tcdeb.value;
	kstrea.innerHTML = '';
	startAuth();
}

// Function to run when window loads, returns loginform
function startAuth()	{ 
	var tque = retCD();
	var tseed = getElement("srcsessid").value;
	var xdummy = retDummy();
	var xkeyfrag = retCP();
	var urltx = urlbs+'?c=bsx&q='+tque+'&s='+tseed+'&dummy='+xdummy;
	var xhr = createXHR();
	xhr.onreadystatechange=function()	{ 
		if(xhr.readyState == 4 && xhr.status == 200)	{
		  if(debug_mode == "1") {
        alert(xhr.responseText);
      }
			var xmldoc = xhr.responseXML;
			var tstTags = xmldoc.getElementsByTagName("autherr");
			if(tstTags.length > 0) {
				var tstKey = xmldoc.getElementsByTagName("autherr")[0].firstChild.nodeValue;
				alert(tstKey);
				} else {
				var tstForm = xmldoc.getElementsByTagName("loginform")[0].firstChild.nodeValue;
				var tstKey = MD5(xkeyfrag+tseed);
				var acfloginform = des(tstKey, hexToString(tstForm), 0, 0);
				xcform = E2C(RTrim(unescape(acfloginform)));
				var xretlayer = getElement("logform");
				xretlayer.innerHTML = xcform;
				var xnick = getElement("setnick");
				xnick.focus();
			}
		}
	}; 
	xhr.open("GET", urltx, true);
	xhr.send(null); 
}

// Return dummy, for cache triskters							
function retDummy() {
	var uniqseed = new Date();
	var urk = uniqseed.toString();
	var ure = MD5(urk);
	return ure;
}
// Crypt key
function retK() {
	var usessfrag = getElement("srcsessid").value;
	usessfrag = MD5(usessfrag);
	var axfieldval = getElement(usessfrag).value;
	var tkey = MD5(Trim(axfieldval));
	return tkey;
}
// Auth key
function retCP() {
	var usessfrag = getElement("srcsessid").value;
	usessfrag = MD5(usessfrag);
	var axfieldval = getElement(usessfrag).value;
	var tkey = MD5(MD5(Trim(axfieldval)));
	return tkey;
}
// Search code
function retCD() {
	var usessfrag = getElement("srcsessid").value;
	usessfrag = MD5(usessfrag);
	var axfieldval = getElement(usessfrag).value;
	var tkey = MD5(MD5(MD5(Trim(axfieldval))));
	return tkey;
}
// Return usercode
function retY() {
	var uxfieldval = getElement("nick").value;
	return uxfieldval;
}

// Return finished auth for transmit
function retLoginstring() {
	var uxcfieldval = getElement("nick");
	var uxsesskey = getElement("srcsessid").value;
	var exc = getElement("exec").value;
	var uxfieldpassflp = getElement("acxpass").value;
	var txkey = retK();
	var tque = retCD();
	var tcuser = retY();
	var xdummy = retDummy();
	cpkeyx = retCP();
	var crcstr = MD5(MD5(tque)+'^'+MD5(tcuser));
	var doCRCcrypt = des(cpkeyx, C2E(crcstr), 1, 0);
	var cpc = printHex(doCRCcrypt);
	var uxip = getElement("srcip").value;
	var uxagent = getElement("srcagent").value;
	var dHashfrag = MD5(uxip+uxagent+uxsesskey);
	var dHash = MD5(uxcfieldval.value+':'+uxfieldpassflp+':'+dHashfrag+exc);
	var urltxfrag = '&q='+tque+'&x='+tcuser+'&cpc='+cpc+'&s='+uxsesskey+'&dh='+dHash+'&e='+exc+'&dummy='+xdummy;
	var testurl = urltxfrag.replaceAll("&", "\n");
	return urltxfrag;
}

//Init login
function dolocalAuthx() {
	var uxfieldval = getElement("setnick").value;
	var uxcfieldval = getElement("nick");
	var uxsesskey = getElement("sessidkey").value;
	var uxfieldpass = getElement("setpass");
	var uxfieldacpass = getElement("acxpass");
	var exc = getElement("exec").value;
	var uxfieldpassflp = MD5(uxfieldpass.value);
	uxfieldacpass.value = uxfieldpassflp;
	var txkey = retK();
	var doUcrypt = des(txkey, C2E(uxfieldval), 1, 0);
	uxcfieldval.value = printHex(doUcrypt);
	var tque = retCD();
	var tcuser = retY();
	var xdummy = retDummy();
	var cpkeyx = retCP();
	var crcstr = MD5(MD5(tque)+'^'+MD5(tcuser));
	var doCRCcrypt = des(cpkeyx, C2E(crcstr), 1, 0);
	var cpc = printHex(doCRCcrypt);
	var doPASScrypt = des(cpkeyx, C2E(uxfieldpassflp), 1, 0);
	var transpass = printHex(doPASScrypt);
	var xunameset = getElement("authrightfloat");
	xunameset.innerHTML = uxfieldval;
	var uxip = getElement("sessip").value;
	var uxagent = getElement("sessagent").value;
	var dHashfrag = MD5(uxip+uxagent+uxsesskey);
	var dHash = MD5(uxcfieldval.value+':'+uxfieldpassflp+':'+dHashfrag);
	var urltx = urlbs+'?c=blx&q='+tque+'&x='+tcuser+'&cpc='+cpc+'&s='+uxsesskey+'&dh='+dHash+'&e='+exc+'&pk='+transpass+'&dummy='+xdummy;
	/*var testurl = urltx.replaceAll("&", "\n");
	alert(testurl);*/
	chkAuthdatax(urltx);
}

// Exec login
function chkAuthdatax(url)	{ 
	var xhr = createXHR();
	xhr.onreadystatechange=function()	{ 
		if(xhr.readyState == 4 && xhr.status == 200)	{
		  if(debug_mode == "1") {
        alert(xhr.responseText);
      }
			var xmldoc = xhr.responseXML;
			var tstKey = xmldoc.getElementsByTagName("autherr")[0].firstChild.nodeValue;
			if(tstKey == "none") {
				var tstExec = xmldoc.getElementsByTagName("aexec")[0].firstChild.nodeValue;
				var tque = retCD();
				var chexec = getElement("exec");
				chexec.value = tstExec;
				var chsip = getElement("sessip").value;
				var chsagent = getElement("sessagent").value;
				var chrsip = getElement("srcip");
				chrsip.value = chsip;
				var chrsagent = getElement("srcagent");
				chrsagent.value = chsagent;
				var chsessid = getElement("sessidkey").value;
				var chrsessid = getElement("srcsessid");
				chrsessid.value = chsessid;
				var xloginf = getElement("logform");
				xloginf.innerHTML = '';
				var tlinklayer = getElement("xforumlink");
				tlinklayer.innerHTML = '<a href="q.php?s='+tque+'" class="bbsTopicpath" onClick="return false;">'+bbslang[90]+'</a>';
				var bsvish = getElement("chroomh");
				var bsvis = getElement("chroom");
				bsvish.style.visibility = 'visible';
				bsvis.style.visibility = 'visible';
				loadBBSlayer("sforum");
				retMainlinks();
				} else {
				alert(tstKey);
				window.close();
			}
		}
	}; 
	xhr.open("GET", url, true);		
	xhr.send(null); 
}

//Init logout
function log_out() {
var urlauthfrag = retLoginstring();
	var urltx = urlbs+'?c=lgt'+urlauthfrag;
	chkoutAuthdatax(urltx);
}

// Exec logout
function chkoutAuthdatax(url)	{ 
	var xhr = createXHR();
	xhr.onreadystatechange=function()	{ 
		if(xhr.readyState == 4 && xhr.status == 200)	{
		  if(debug_mode == "1") {
        alert(xhr.responseText);
      }
			var xmldoc = xhr.responseXML;
			var tstKey = xmldoc.getElementsByTagName("autherr")[0].firstChild.nodeValue;
			alert(tstKey);
			window.close();
		}
	}; 
	xhr.open("GET", url, true);		
	xhr.send(null); 
}

// For use in topic, returns auth level of current user
function readAuth(xUsers, usercode) {
	var xtAuth = 0;
	for(var i=0;i<xUsers.length;i++) {
		var xuxline = xUsers[i].split("^");
		// This enabled increased response time considerably
		//if(MD5(Trim(xuxline[1])) == MD5(Trim(usercode))) {
		if(Trim(xuxline[1]) == Trim(usercode)) {
			if(Trim(xuxline[2]) == 'admin') {
				xtAuth = 1;
				return xtAuth;
				} else if(Trim(xuxline[2]) == 'moderator') {
				xtAuth = 2;
				return xtAuth;
			}
		}
	}
	return 0;
}
/*****************************
--> BBS Utils functions
*****************************/

// # 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 mAuth(e) {
if (!e) e = window.event;
	// Triggers on keycode Arrow up (Moz) or Ctrl-Enter (IE)
	if (e && e.keyCode == 13) {
		setbsAcode();
	}
}

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

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

// Concat navstates arrays to one array
function admStates(dauth) {
	if(dauth == 'admin') {
		var tlinkrowstatesc = tlinukrowstates.concat(tlinkarowstates);
		} else {
		var tlinkrowstatesc = tlinukrowstates;
	}
	return tlinkrowstatesc;
}

// This responds to the upper link row
function loadBBSlayer(xstate) {
	switch(xstate) {
		case "emods":
		treatXlinks("emods");
		var cxurl = retGeturl("rml");
		getModlist(cxurl);
		break;
		case "eforum":
		treatXlinks("eforum");
		writeForumForm();
		var cxurl = retGeturl("bbsa");
		var chmsg = getElement("msgs");
		chmsg.value = bbslang[79];
		retForumdataEdit(cxurl);
		break;
		case "ntopic":
		var kretx = doWriter();
		var xretlayer = getElement("converse");
		xretlayer.innerHTML = kretx;
		var xretfocusr = getElement("subject");
		xretfocusr.focus();
		treatXlinks("ntopic");
		break;
		case "adminpass":
		treatXlinks("adminpass");
		break;
		case "saveforum":
		treatXlinks("saveforum");
		break;
		case "deleteforum":
		var retdelTbl = '<table width="100%" cellpadding="2" cellspacing="0" border="0" class="bbsForumtable">^XTROWS^</table>';
		var xretlayer = getElement("converse");
		var tstrt = '<span class="bbsUtiltext">'+bbslang[72]+'</span><br><br>';
		var execform = '<span class="bbsUtiltext">'+bbslang[74]+'</span><br><input type="text" name="delpass" id="delpass" value="" class="fieldSubject" style="width:200px"><br><input type="button" name="dBBS" id="dBBS" value="'+bbslang[71]+'" class="cbutton" onClick="doBBSdelAuthx();">';
		var retTsr = '<tr><td align="left" valign="top" class="bbsTdhead">'+bbslang[71]+'</td></tr>';
		retTsr += '<tr><td align="left" valign="top" class="bbsTime">&nbsp;</td></tr>';
		retTsr += '<tr><td align="left" valign="top" class="bbsMsg">'+tstrt+execform+'<br></td></tr>';
		retTsr += '<tr><td align="left" valign="top" class="bbsTime">&nbsp;</td></tr>';
		retdelTbl = retdelTbl.replace("^XTROWS^", retTsr);
		xretlayer.innerHTML = retdelTbl;
		treatXlinks("deleteforum");
		break;
		// Def: show forum
		default:
		viewForum();
		treatXlinks("sforum");
	}
}

// Function for loading strings as xml documents
function loadpXdoc(xmlstring) {
	try {//Internet Explorer
	  xmlDoc=new ActiveXObject("Microsoft.XMLDOM");
		xmlDoc.async=false;
		xmlDoc.loadXML(xmlstring);
	  }
	catch(e)
	  {
	  try { //Firefox, Mozilla, Opera, etc.
	    xmlDoc=(new DOMParser()).parseFromString(xmlstring, "text/xml");
	    }
	  catch(e) {alert(e.message)}
	  }
	return xmlDoc;
}

// Put a loaded value into a form field
function putFormvalue(xfield, zval) {
	var tfField = getElement(xfield);
	tfField.value = zval;
}

// Treament of upper link row, changes classname on click
function treatXlinks(elm) {
	for(i=0;i<authtforumlinkstates.length;i++) {
		if(authtforumlinkstates[i] == elm) {
			var sclass = 'pstate_on';
			} else {
			var sclass = 'pstate_off';
		}
		var dogetelm = getElement(authtforumlinkstates[i]);
		dogetelm.className = sclass;
	}
}

// Function for refreshing forum
function retGeturl(cstate) {
	var urlauthfrag = retLoginstring();
	var urltx = urlbs+'?c='+cstate+''+urlauthfrag;
	return urltx;
}

// Some functions and init for layer expansion, to be rewritten for v. 1.1
function getElementbyClass(classname){
ccollect=new Array()
var inc=0
var alltags=document.all? document.all : document.getElementsByTagName("*")
for (i=0; i<alltags.length; i++){
if (alltags[i].className==classname)
ccollect[inc++]=alltags[i]
}
}

function contractcontent(omit){
var inc=0
while (ccollect[inc]){
if (ccollect[inc].id!=omit)
ccollect[inc].style.display="none"
inc++
}
}

function expandcontent(cid){
if (typeof ccollect!="undefined"){
if (collapseprevious=="yes")
contractcontent(cid)
document.getElementById(cid).style.display=(document.getElementById(cid).style.display!="block")? "block" : "none"
}
}

function revivecontent(){
contractcontent("omitnothing")
selectedItem=getselectedItem()
selectedComponents=selectedItem.split("|")
for (i=0; i<selectedComponents.length-1; i++)
document.getElementById(selectedComponents[i]).style.display="block"
}

function do_onload(){
getElementbyClass("switchcontent")
if (enablepersist=="on" && typeof ccollect!="undefined")
revivecontent()
}
if (window.addEventListener)
window.addEventListener("load", do_onload, false)
else if (window.attachEvent)
window.attachEvent("onload", do_onload)
else if (document.getElementById)
window.onload=do_onload

function regenerate(){
window.location.reload()
}
function regenerate2(){
if (document.layers){
appear()
setTimeout("window.onresize=regenerate",450)
}
}

function changetext(whichcontent){
if (document.all||document.getElementById){
cross_el=document.getElementById? document.getElementById("descriptions"):document.all.descriptions
cross_el.innerHTML='<font face="Verdana"><small>'+whichcontent+'<font></small>'
}
else if (document.layers){
document.d1.document.d2.document.write('<font face="Verdana"><small>'+whichcontent+'</small></font>')
document.d1.document.d2.document.close()
}
}
function appear(){
document.d1.visibility='show'
}

/*****************************
--> BBS Writer functions
*****************************/

/*
Text insert/form functions
*/

// Function for clearing msgfield and link fields
function clean_screen(elm, child1, child2) {
	var exfield = getElement(elm);
	exfield.value= "";
	var exurl = getElement(child1);
	exurl.value = "";
	var exurltext = getElement(child2);
	exurltext.value = "";
}

// Function for removing whitespace from end of text
function rtrim(stringToTrim) {
	return stringToTrim.replace(/\s+$/,"");
}
// Function for checking whitespace
function isWhitespace(charToCheck) {
	var whitespaceChar = " ";
	if(charToCheck == whitespaceChar) {
	return true;
	} else {
	return false;
	}
}

// Function for insert of links
function add_dCcode(elm, child1, child2) {
	var strea = getElement(elm);
	var endx = "";
	var st = "[link:";
	var sep = "|";
	var est = "]";
	var exurl = getElement(child1);
	var exurlv = exurl.value;
	exurlv = exurlv.replace("http://", "");
	var exurltext = getElement(child2);
	var exurltextv = exurltext.value;
	if (document.selection) {
	  var ctail = "";
	  var selText = document.selection.createRange().text;
		var stchar = Math.round(selText.length-1);
		if(isWhitespace(selText.charAt(stchar))) {
			selText = rtrim(selText);
			var ctail = " ";
		}
		if (strea.createTextRange && strea.caretPos) {
			var caretPos = strea.caretPos;
			if (selText) {
				var rxtext = st + exurlv + sep + selText + est+ctail;
				caretPos.text = caretPos.text.charAt(caretPos.text.length - 1) == '' ? rxtext + '' : rxtext;
				strea.focus();
				} else {
				var rxtext = st + exurlv + sep + exurltextv + est+ctail;
				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 selcont = strea.value;
		var ctail = "";
	  var startPos = strea.selectionStart;
	  var endPos = strea.selectionEnd;
		var selxText = selcont.substring(startPos, endPos); 
		var stchar = Math.round(selxText.length-1);
		if(isWhitespace(selxText.charAt(stchar))) {
			selxText = rtrim(selxText);
			var ctail = " ";
		}
		if(selxText.length > 0) {
			var rxtext = st + exurlv + sep + selxText + est+ctail;
			} else {
			var rxtext = st + exurlv + sep + exurltextv + est+ctail;
		}
	  strea.value = strea.value.substring(0, startPos) + rxtext + strea.value.substring(endPos, strea.value.length);
		strea.scrollTop = streascroll;
	  } else {
		endx = st + exurlv + sep + exurltextv + est;
		strea.value += endx;
	}
	exurl.value = "";
	exurltext.value = "";
}
// Function for insert of single tags (b, i, u, and so on
function insertxTcode(dfield, dxtag) {
	var strea = getElement(dfield);
	strea.focus();
  if (document.selection) {
	  var ctail = "";
    var selText = document.selection.createRange().text;
		var stchar = Math.round(selText.length-1);
		if(isWhitespace(selText.charAt(stchar))) {
			selText = rtrim(selText);
			var ctail = " ";
		}
		if (strea.createTextRange && strea.caretPos) {
			var caretPos = strea.caretPos;
			var rxtext = "[" + dxtag + "]" + selText + "[/" + dxtag + "]"+ctail; 
			if (selText) {
				caretPos.text = caretPos.text.charAt(caretPos.text.length - 1) == '' ? rxtext + '' : rxtext;
				strea.focus();
				} else {
				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 selcont = strea.value;
		var ctail = "";
    var startPos = strea.selectionStart;
    var endPos = strea.selectionEnd;
		var selxText = selcont.substring(startPos, endPos); 
		var stchar = Math.round(selxText.length-1);
		if(isWhitespace(selxText.charAt(stchar))) {
			selxText = rtrim(selxText);
			var ctail = " ";
		}
		var rxtext = "[" + dxtag + "]" + selxText + "[/" + dxtag + "]"+ctail;
    strea.value = strea.value.substring(0, startPos) + rxtext + strea.value.substring(endPos, strea.value.length);
		strea.scrollTop = streascroll;
 		} else {
		var rxtext = "[" + dxtag + "][/" + dxtag + "]"+ctail; 
    strea.value += rxtext;
  }
}

// Function for insert of ol, ul (pass-thru 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;
  }
}

// Function for insert of asymetric tags (div)
function insertxTxcode(dfield, axtag, bxtag) {
	var strea = getElement(dfield);
	axtag = axtag.replace(/\*/g,"\"");
	strea.focus();
  if (document.selection) {
	  var ctail = "";
    var selText = document.selection.createRange().text;
		var stchar = Math.round(selText.length-1);
		if(isWhitespace(selText.charAt(stchar))) {
			selText = rtrim(selText);
			var ctail = " ";
		}
		if (strea.createTextRange && strea.caretPos) {
			var caretPos = strea.caretPos;
			var rxtext = "[" + axtag + "]" + selText + "[/" + bxtag + "]"+ctail; 
			if (selText) {
				caretPos.text = caretPos.text.charAt(caretPos.text.length - 1) == '' ? rxtext + '' : rxtext;
				strea.focus();
				} else {
				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 selcont = strea.value;
		var ctail = "";
    var startPos = strea.selectionStart;
    var endPos = strea.selectionEnd;
		var selxText = selcont.substring(startPos, endPos); 
		var stchar = Math.round(selxText.length-1);
		if(isWhitespace(selxText.charAt(stchar))) {
			selxText = rtrim(selxText);
			var ctail = " ";
		}
		var rxtext = "[" + axtag + "]" + selxText + "[/" + bxtag + "]"+ctail;
    strea.value = strea.value.substring(0, startPos) + rxtext + strea.value.substring(endPos, strea.value.length);
		strea.scrollTop = streascroll;
 		} else {
		var rxtext = "[" + axtag + "][/" + bxtag + "]"+ctail; 
    strea.value += rxtext;
  }
}

// Function for insert of font
function insertxTfcode(dfield, axtag, bxtag, xfontcolor) {
	if(xfontcolor == "none") {
		return;
	}
	var strea = getElement(dfield);
	var fsender = getElement("fontxt");
	axtag = axtag.replace(/\*/g,"\"");
	axtag = axtag.replace(/fcolor/g, xfontcolor);
	strea.focus();
  if (document.selection) {
	  var ctail = "";
    var selText = document.selection.createRange().text;
		var stchar = Math.round(selText.length-1);
		if(isWhitespace(selText.charAt(stchar))) {
			selText = rtrim(selText);
			var ctail = " ";
		}
		if (strea.createTextRange && strea.caretPos) {
			var caretPos = strea.caretPos;
			var rxtext = "[" + axtag + "]" + selText + "[/" + bxtag + "]"+ctail; 
			if (selText) {
				caretPos.text = caretPos.text.charAt(caretPos.text.length - 1) == '' ? rxtext + '' : rxtext;
				strea.focus();
				} else {
				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 selcont = strea.value;
		var ctail = "";
    var startPos = strea.selectionStart;
    var endPos = strea.selectionEnd;
		var selxText = selcont.substring(startPos, endPos); 
		var stchar = Math.round(selxText.length-1);
		if(isWhitespace(selxText.charAt(stchar))) {
			selxText = rtrim(selxText);
			var ctail = " ";
		}
		var rxtext = "[" + axtag + "]" + selxText + "[/" + bxtag + "]"+ctail;
    strea.value = strea.value.substring(0, startPos) + rxtext + strea.value.substring(endPos, strea.value.length);
		strea.scrollTop = streascroll;
 		} else {
		var rxtext = "[" + axtag + "][/" + bxtag + "]"+ctail; 
    strea.value += rxtext;
  }
	fsender.options[0].selected = true;
}

// Smiley table for the post form.
function duBBSmilestable() {
	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="smiles/'+linechange[0]+'" height="15" width="15" name="'+icname+'" id="'+icname+'" class="" onClick="insertxSmile(\'message\', \' '+linechange[1]+' \');">';
	}
	return smileys;
}

// Function for inset of smiley code
function insertxSmile(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;
  }
}

// Function for printing button rows
function doCbuttons() {
	var dstret = "";
	var fontsxt = '<SELECT UNSELECTABLE="on" id="fontxt" name="fontxt" class="wrDropdown" onchange="insertxTfcode(\'message\', \'font color=*fcolor* size=*2* face=*Verdana*\', \'font\', this.options[this.selectedIndex].value);"><OPTION VALUE="none" SELECTED>Font color</OPTION><OPTION VALUE="darkred" STYLE="color: darkred">dark red</OPTION><OPTION VALUE="red" STYLE="color: red">red</OPTION><OPTION VALUE="orange"  STYLE="color: orange">orange</OPTION><OPTION VALUE="yellow"  STYLE="color: yellow">yellow</OPTION><OPTION VALUE="lime"    STYLE="color: lime">lime</OPTION><OPTION VALUE="green" STYLE="color: green">green </OPTION><OPTION VALUE="aqua" STYLE="color: aqua">aqua</OPTION><OPTION VALUE="blue" STYLE="color: blue">blue</OPTION><OPTION VALUE="navy" STYLE="color: navy">navy</OPTION><OPTION VALUE="violet" STYLE="color: violet">violet</OPTION><OPTION VALUE="gray" STYLE="color: gray">gray</OPTION></SELECT>';
	dstret += '<input type="button" name="bxt" id="bxt" value=" B " class="cbutton" onClick="insertxTcode(\'message\', \'b\');">&nbsp;';
	dstret += '<input type="button" name="ixt" id="ixt" value=" I " class="cbutton" onClick="insertxTcode(\'message\', \'i\');">&nbsp;';
	dstret += '<input type="button" name="uxt" id="uxt" value=" U " class="cbutton" onClick="insertxTcode(\'message\', \'u\');">&nbsp;';
	dstret += '<input type="button" name="h1xt" id="h1xt" value=" H1 " class="cbutton" onClick="insertxTcode(\'message\', \'h1\');">&nbsp;';
	dstret += '<input type="button" name="h2xt" id="h2xt" value=" H2 " class="cbutton" onClick="insertxTcode(\'message\', \'h2\');">&nbsp;';
	dstret += '<input type="button" name="h3xt" id="h3xt" value=" H3 " class="cbutton" onClick="insertxTcode(\'message\', \'h3\');">&nbsp;';
	dstret += '<input type="button" name="divxt" id="divxt" value="Quote" class="cbutton" onClick="insertxTxcode(\'message\', \'div class=*excerpt*\',\'div\');">&nbsp;';
	dstret += fontsxt;
	dstret += '<input type="button" name="ulxt" id="ulxt" value="Unordered list" class="cbutton" onClick="insertxTzcode(\'message\', \'[ul]\\n[li]item1\\n[li]item2\\n[li]item3\\n[li]item4\\n[/ul]\');">&nbsp;';
	dstret += '<input type="button" name="olxt" id="olxt" value="Ordered list" class="cbutton" onClick="insertxTzcode(\'message\', \'[ol]\\n[li]item1\\n[li]item2\\n[li]item3\\n[li]item4\\n[/ol]\');">&nbsp;'+duBBSmilestable()+'<br>';
	dstret += '<input type="button" name="playtext" value="Add link" class="cbutton" onClick="add_dCcode(\'message\',\'curl\',\'ctxt\');">&nbsp;[link:<input type="text" name="curl" id="curl" value="" class="fieldSubject" style="width:280px;">&nbsp;|<input type="text" name="ctxt" id="ctxt" value="" class="fieldSubject" style="width:300px;">&nbsp;]<br>';
	return dstret;
}

// Function for printing Preview/Clean buttons
function doPbuttons() {
	var pstret = "";
	pstret += '<input type="button" name="xsubmit" value="Submit" class="cbutton" style="float:left; width:100px" onClick="donTopic(\'message\', \'subject\');">';
	pstret += '<input type="button" name="xpreview" value="Preview" class="cbutton" style="float:left; width:100px" onClick="doPreview(\'message\', \'subject\');">';
	pstret += '<input type="button" name="playtext" value="Clean" class="cbutton" style="float:right" onClick="clean_screen(\'message\',\'curl\',\'ctxt\');">';
	return pstret;
}

// Function for printing Preview/Clean buttons
function dorepPbuttons() {
	var pstret = '<input type="hidden" name="doTid" id="doTid" value=""><input type="hidden" name="dotRid" id="dotRid" value="">';
	pstret += '<input type="button" name="xsubmit" value="Submit" class="cbutton" style="float:left; width:100px" onClick="doTopicrepl(\'message\', \'subject\');">';
	pstret += '<input type="button" name="xpreview" value="Preview" class="cbutton" style="float:left; width:100px" onClick="doPreview(\'message\', \'subject\');">';
	pstret += '<input type="button" name="playtext" value="Clean" class="cbutton" style="float:right" onClick="clean_screen(\'message\',\'curl\',\'ctxt\');">';
	return pstret;
}

// Function for printing Preview/Clean buttons
function doEdrepPbuttons() {
	var pstret = '<input type="hidden" name="doTid" id="doTid" value=""><input type="hidden" name="dotRid" id="dotRid" value="">';
	pstret += '<input type="button" name="xsubmit" value="Submit" class="cbutton" style="float:left; width:100px" onClick="doEdTopicrepl(\'message\', \'subject\');">';
	pstret += '<input type="button" name="xpreview" value="Preview" class="cbutton" style="float:left; width:100px" onClick="doPreview(\'message\', \'subject\');">';
	pstret += '<input type="button" name="playtext" value="Clean" class="cbutton" style="float:right" onClick="clean_screen(\'message\',\'curl\',\'ctxt\');">';
	return pstret;
}

// Function for printing Preview/Clean buttons
function doEdtopicPbuttons() {
	var pstret = '<input type="hidden" name="doTid" id="doTid" value=""><input type="hidden" name="dotRid" id="dotRid" value="">';
	pstret += '<input type="button" name="xsubmit" value="Submit" class="cbutton" style="float:left; width:100px" onClick="doEdTopicrepl(\'message\', \'subject\');">';
	pstret += '<input type="button" name="xpreview" value="Preview" class="cbutton" style="float:left; width:100px" onClick="doPreview(\'message\', \'subject\');">';
	pstret += '<input type="button" name="playtext" value="Clean" class="cbutton" style="float:right" onClick="clean_screen(\'message\',\'curl\',\'ctxt\');">';
	return pstret;
}

// Function for Preview, produce html from DU linkcode
function duLinky(text) {
	var text1arr = text.split("[link:");
	var lreturn = "";
	if(text1arr.length > 1) {
		for(var i=1;i<text1arr.length;i++) {
			var xPos = text1arr[i].indexOf("]");
			var xtemp = text1arr[i].slice(0,(xPos));
			text1arr[i] = text1arr[i].replace(xtemp+"]", "");
			var linkparts = xtemp.split("|");
			if(linkparts[0] != "") {
				lreturn += '<a href="http://' + linkparts[0] + '" class="bbsLinky" target="_blank">' +linkparts[1]+ '</a>'+text1arr[i];
			}
		}
		lreturn = text1arr[0] + lreturn;
		} else {
		lreturn = text;
	}
	return lreturn;
}

// Function for Preview, produce content from 'flat' links
function duUrlPic(text) {
	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+'">';
					texturls[i] = texturls[i].replace(urepl, "");
					ures += jpaddress + texturls[i];
					} else {
					texturls[i] = texturls[i].replace(urepl, "");
					ures += '<a href="' + utemp + '" class="bbsLinky" target="_blank">' +utemp+ '</a>'+texturls[i];
				}
				} else {
				ures += texturls[i];
			}
		}
		ures = texturls[0] + ures;
		} else {
		ures = text;
	}
	return ures;
}

// Function for Preview, collective treatment of text before produce
function produceHtml(text) {
  text = text.replace(/>/g,"&gt;");
	text = text.replace(/</g,"&lt;");
	text = duUrlPic(text);
	text = duLinky(text);
	text = duBBSmiles(text);
	text = text.replace(/\n/g,"<br>");
	text = text.replace(/\]/g,">");
	text = text.replace(/\[/g,"<");
	return text;
}

// Function for constructing and printing Preview window
function doPreview(dfield, subfield) {
	var strea = getElement(dfield);
	var stsub = getElement(subfield);
	var skinstr = getElement("gskinstring").value;
	var stsubv = stsub.value;
	var dox = '<link rel="STYLESHEET" type="text/css" href="'+skinstr+'/anobbs.css">\n';
	var xtHeader = '<head><title>Preview '+stsubv+'</title>\n'+dox+'</head>\n';
	xtHeader = xtHeader + '<body class="pbbsbody">';
	var xtEnd = '</body>';
	var tTempl = '<table width="100%" cellpadding="0" cellspacing="0" border="0" class="bbsForumtable"><tr><td class="bbsTdheadtopic" style="height:30px">'+stsubv+'<br></td></tr>';
	var eTempl = '</table>';
	var pContent = strea.value;
	pContent = produceHtml(pContent);
	pReturn = tTempl + '<tr><td class="bbsMsg">' + pContent + '</td></tr>' +  eTempl;
	windowprops = "menubars=no,location=no,toolbars=no,scrollbars=yes,resizable=yes,status=1"+"width=750,height=570,top=50,left=50";
	self.name = "main";
	linkswin = window.open("","BBSprev",windowprops);
	with (linkswin.document) {
		open();
		write(xtHeader + pReturn + xtEnd);
		linkswin.focus();
		close();
	}
}

// Smileys and smiley code. I need to do more work on this. Don't use any other format than :text: for now
function duBBSmiles(text) {
	for(var i=0;i<parseInt(scodearr.length);i++) {
		var linechange = scodearr[i].split('=');
		text = text.replaceAll(linechange[1], '<img src="smiles/'+linechange[0]+'" width="15" height="15" border="0" align="absmiddle">');
	}
	return text;
}

function dformat(dtnum) {
	dtnum = dtnum.toString();
	if (dtnum.length == 1) {dtnumt = '0'+dtnum;} else {dtnumt = dtnum;}
	return dtnumt;
}

/*****************************
--> BBS Admin functions
*****************************/

// Start export of BBS for later import (XML)
function doBBExport() {
	var retTbl = '<table width="100%" cellpadding="2" cellspacing="0" border="0" class="bbsForumtable">^XTROWS^</table>';
	dmodstr = '<tr><td align="left" valign="top" class="bbsTdhead">'+bbslang[83]+'</td></tr>'
	+'<tr><td align="left" valign="top" class="bbsUtiltext"><br>'+bbslang[84]+'<br><br><input type="button" name="expbbs" id="expbbs" value="'+bbslang[83]+'" onClick="iniBBExport();" class="cbutton"><br><br></td></tr>';
	retTbl = retTbl.replace("^XTROWS^", dmodstr);
	var chfxlayer = getElement("converse");
	chfxlayer.innerHTML = retTbl;
}

// Export BBS for later import (XML)
function iniBBExport() {
	doBBSexp(urlbs+'?c=xbbs'+retLoginstring());
}

// Import exec
function runBBImport() {
	if(document.cxmlupload.xmfile.value != "") {
		var xfile = document.cxmlupload.xmfile.value;
		var xlen = xfile.length-6;
		var xpart = xfile.substr(xlen, 6);
		xparts = xpart.split(".");
		if(xparts[1] == "xml") {
			document.cxmlupload.submit();
			} else {
			alert(bbslang[89]);
		}
	}
}

// Start import BBS from file (XML)
function doBBImport() {
	var retTbl = '<table width="100%" cellpadding="2" cellspacing="0" border="0" class="bbsForumtable">^XTROWS^</table>';
	dmodstr = '<tr><td align="left" valign="top" class="bbsTdhead">'+bbslang[85]+'</td></tr>'
	+'<tr><td align="left" valign="top" class="bbsUtiltext"><br>'+bbslang[86]+'<br><br><input type="button" name="imppbbs" id="imppbbs" value="'+bbslang[85]+'" onClick="iniBBImport();" class="cbutton"><br><br></td></tr>';
	retTbl = retTbl.replace("^XTROWS^", dmodstr);
	var chfxlayer = getElement("converse");
	chfxlayer.innerHTML = retTbl;
}

// Import BBS from file (XML) - runs in pop up window
function iniBBImport() {
	var tskin = getElement("gskinstring").value;
	var sdox = '<meta http-equiv="Pragma" content="no-cache">\n';
  sdox += '<META HTTP-EQUIV="Expires" CONTENT="-1">\n';
	sdox += '<META http-equiv="Content-Type" content="text/html; charset=iso-8859-1">\n';
	sdox += '<scr' + 'ipt language="javascript" src="js/anochat_system.js"></scr' + 'ipt>\n';
	sdox += '<scr' + 'ipt language="javascript" src="js/anobbs_vars.js"></scr' + 'ipt>\n';
	sdox += '<scr' + 'ipt language="javascript" src="js/anobbs.js"></scr' + 'ipt>\n';
	sdox += '<scr' + 'ipt language="javascript" src="js/md5.js"></scr' + 'ipt>\n';
	sdox += '<scr' + 'ipt language="javascript" src="js/tripleDes.js"></scr' + 'ipt>\n';
	sdox += '<link rel="STYLESHEET" type="text/css" href="'+tskin+'/anobbs.css">\n';
	var xtcHeader = '<html>\n<head>\n<title>'+bbslang[87]+'</title>\n'+sdox+'</head>\n';
	xtcHeader = xtcHeader + '<body class="bbsbody">\n';
	var xtcEnd = '</body>\n</html>';
	var retTbl = '<table width="100%" cellpadding="2" cellspacing="0" border="0" class="bbsForumtable"><form ENCTYPE="multipart/form-data" name="cxmlupload" action="anobbs.php?c=ibbs'+retLoginstring()+'" method="POST">^XTROWS^</form></table>';
	var dmodstr = '<tr><td align="left" valign="top" class="bbsTdhead">'+bbslang[85]+'</td></tr>'
	+'<tr><td align="left" valign="top" class="bbsUtiltext"><br>'+bbslang[86]+'<br><br>'
	+'<input type="file" name="xmfile" id="xmfile" size="20" accept="text/xml" class="fieldSubject"><br><br>'
	+'<input type="button" name="imppbbs" id="imppbbs" value="'+bbslang[85]+'" onClick="runBBImport();" class="cbutton"><br><br></td></tr>';
	retTbl = retTbl.replace("^XTROWS^", dmodstr);
	var gReturn = retTbl;
	windowdprops = 'menubar=yes,location=no,toolbar=no,scrollbars=yes,resizable=yes,status=yes,width=400,height=300,top=50,left=50';
	self.name = 'cesx_main';
	runbbsdo = window.open("",'bbsupload',windowdprops);
	with (runbbsdo.document) {
		open();
		write(xtcHeader + gReturn + xtcEnd);
		runbbsdo.focus();
		close();
	}
	//alert('OK!');
	//doBBSexp(urlbs+'?c=xbbs'+retLoginstring());
}

// Init save BBS
function iniBBSave() {
	doBBSsave(urlbs+'?c=sbbs'+retLoginstring());
}

// Exec save BBS
function doBBSsave(newin) {
 	slide6=window.open(newin,"saveBBS","resizable=yes,scrollbars=yes,menubar=yes,width=700,height=550,top=10,left=15");
	slide6.focus();			
}

// Exec export BBS
function doBBSexp(newin) {
 	slide6=window.open(newin,"exportBBS","resizable=yes,scrollbars=yes,menubar=yes,width=700,height=550,top=10,left=15");
	slide6.focus();			
}

// Return moderatorlist/userlist
function retModlist(xmldoc) {
	var uSarr = retUserarr(xmldoc);
	var dmodstr = '';
	var txkey = retK();
	var linkstr = '';
	var xnick = getElement("nick").value;
	var chfxlayer = getElement("converse");
	var retTbl = '<table width="100%" cellpadding="2" cellspacing="0" border="0" class="bbsForumtable">^XTROWS^</table>';
	dmodstr = '<tr><td align="left" valign="top" class="bbsTdhead">'+bbslang[49]+'</td><td align="left" valign="top" class="bbsTdhead">'+bbslang[50]+'</td><td align="left" valign="top" class="bbsTdhead">'+bbslang[51]+'</td><td align="left" valign="top" class="bbsTdhead">'+bbslang[55]+'</td><td align="left" valign="top" class="bbsTdhead">'+bbslang[56]+'</td></tr>';
	for(x=0;x<uSarr.length;x++) {
		var uxline = uSarr[x].split("^");
		var vsCusernamec = des(txkey, hexToString(uxline[1]), 0, 0);
		if(uxline[1] == xnick) {
			dmodstr += '<tr><td align="left" valign="middle" class="bbstAuthor">'+E2C(RTrim(vsCusernamec))+'</td>'
			+'<td align="left" valign="middle" class="bbsAuthor">'+uxline[2]+'</td>'
			+'<td align="left" valign="middle" class="bbsTime">-&nbsp;n/a&nbsp;-</td>'
			+'<td align="left" valign="middle" class="bbsTime">'+doextTimestamp(uxline[0])+'</td>'
			+'<td align="left" valign="middle" class="bbstAuthor">'+uxline[3]+'</td></tr>';
			} else {
			if(Trim(uxline[2]) == 'admin') {
				linkstr = '<a href="#" onClick="switchLevel(\''+uxline[1]+'\', \'user\');return false;" onFocus="this.blur()" class="pstate_off">'+bbslang[52]+'</a>&nbsp;<a href="#" onClick="switchLevel(\''+uxline[1]+'\', \'moderator\');return false;" onFocus="this.blur()" class="pstate_off">'+bbslang[53]+'</a>';
				} else if(Trim(uxline[2]) == 'moderator') {
				linkstr = '<a href="#" onClick="switchLevel(\''+uxline[1]+'\', \'user\');return false;" onFocus="this.blur()" class="pstate_off">'+bbslang[52]+'</a>&nbsp;<a href="#" onClick="switchLevel(\''+uxline[1]+'\', \'admin\');return false;" onFocus="this.blur()" class="pstate_off">'+bbslang[54]+'</a>';
				} else {
				linkstr = '<a href="#" onClick="switchLevel(\''+uxline[1]+'\', \'moderator\');return false;" onFocus="this.blur()" class="pstate_off">'+bbslang[53]+'</a>&nbsp;<a href="#" onClick="switchLevel(\''+uxline[1]+'\', \'admin\');return false;" onFocus="this.blur()" class="pstate_off">'+bbslang[54]+'</a>&nbsp;<a href="#" onClick="dUser(\''+uxline[1]+'\');return false;" onFocus="this.blur()" class="pstate_off">'+bbslang[63]+'</a>';
			}
			dmodstr += '<tr><td align="left" valign="middle" class="bbstAuthor">'+E2C(RTrim(vsCusernamec))+'</td>'
			+'<td align="left" valign="middle" class="bbsAuthor">'+uxline[2]+'</td>'
			+'<td align="left" valign="middle" class="bbsTime">'+linkstr+'</td>'
			+'<td align="left" valign="middle" class="bbsTime">'+doextTimestamp(uxline[0])+'</td>'
			+'<td align="left" valign="middle" class="bbstAuthor">'+uxline[3]+'</td></tr>';
		}
	}
	retTbl = retTbl.replace("^XTROWS^", dmodstr);
	chfxlayer.innerHTML = retTbl;
}

// Init load of list
function getModlist(urltx) {
	var xhr = createXHR();
	xhr.onreadystatechange=function()	{ 
		if(xhr.readyState == 4 && xhr.status == 200)	{
		  if(debug_mode == "1") {
        alert(xhr.responseText);
      }
			var xmldoc = xhr.responseXML;
			var tstKey = xmldoc.getElementsByTagName("autherr")[0].firstChild.nodeValue;
			if(tstKey == "none") {
				var tstExec = xmldoc.getElementsByTagName("aexec")[0].firstChild.nodeValue;
				var chexec = getElement("exec");
				chexec.value = tstExec;
				var chmsg = getElement("msgs");
				chmsg.value = bbslang[80];
				retModlist(xmldoc);
				chmsg.value = '';
				} else {
				alert(tstKey);
				window.close();
			}
		}
	}; 
	xhr.open("GET", urltx, true);	
  xhr.send(null);
}

// Init load of list after update
function getuModlist(urltx) {
	var xhr = createXHR();
	xhr.onreadystatechange=function()	{ 
		if(xhr.readyState == 4 && xhr.status == 200)	{
		  if(debug_mode == "1") {
        alert(xhr.responseText);
      }
			var xmldoc = xhr.responseXML;
			var tstKey = xmldoc.getElementsByTagName("autherr")[0].firstChild.nodeValue;
			if(tstKey == "none") {
				var tstExec = xmldoc.getElementsByTagName("aexec")[0].firstChild.nodeValue;
				var chexec = getElement("exec");
				chexec.value = tstExec;
				var chmsg = getElement("msgs");
				chmsg.value = bbslang[82]+' '+bbslang[80];
				retModlist(xmldoc);
				chmsg.value = '';
				var xrooms = getElement("chroom");
				var transUserlist = retupUserlist(xmldoc);
				xrooms.innerHTML = transUserlist;
				} else {
				alert(tstKey);
				window.close();
			}
		}
	}; 
	xhr.open("GET", urltx, true);	
  xhr.send(null);
}

// Switch userlevel for user
function switchLevel(xuser, xlevel) {
	var urlauthfrag = retLoginstring();
	var urltx = urlbs+'?c=uml&xu='+xuser+'&xl='+xlevel+urlauthfrag;
	var chmsg = getElement("msgs");
	chmsg.value = bbslang[81];
	getuModlist(urltx);
}

// Delete user
function dUser(xuname) {
	var confirmdel = confirm(bbslang[64]);
	if(confirmdel) {
		var urlauthfrag = retLoginstring();
		var urltx = urlbs+'?c=udl&xd='+xuname+urlauthfrag;
		var chmsg = getElement("msgs");
		chmsg.value = bbslang[81];
		getuModlist(urltx);
	}
}

// Init delete BBS
function doBBSdelAuthx() {
	var confirmdelbbs = confirm(bbslang[73]);
	if(confirmdelbbs) {
		var uxfield = getElement("delpass");
		var uxfieldpass = uxfield.value;
		var uxfieldac = getElement("acxpass");
		var uxfieldacpass = uxfieldac.value;
		var uxfieldpassflp = MD5(uxfieldpass);
		if(uxfieldpassflp != uxfieldacpass) {
			alert(bbslang[75]);
			uxfield.value = '';
			uxfield.focus();
			} else {
			var uxsesskey = getElement("srcsessid").value;
			var uxcfieldval = getElement("nick");
			var exc = getElement("exec").value;
			var txkey = retK();
			var tque = retCD();
			var tcuser = retY();
			var xdummy = retDummy();
			var cpkeyx = retCP();
			var crcstr = MD5(MD5(tque)+'^'+MD5(tcuser));
			var doCRCcrypt = des(cpkeyx, C2E(crcstr), 1, 0);
			var cpc = printHex(doCRCcrypt);
			var doPASScrypt = des(cpkeyx, C2E(uxfieldpassflp), 1, 0);
			var transpass = printHex(doPASScrypt);
			var uxip = getElement("srcip").value;
			var uxagent = getElement("srcagent").value;
			var dHashfrag = MD5(uxip+uxagent+uxsesskey);
			var dHash = MD5(uxcfieldval.value+':'+uxfieldpassflp+':'+dHashfrag+exc);
			var urltx = urlbs+'?c=dbs&q='+tque+'&x='+tcuser+'&cpc='+cpc+'&s='+uxsesskey+'&dh='+dHash+'&e='+exc+'&pk='+transpass+'&dummy='+xdummy;
			/*var testurl = urltx.replaceAll("&", "\n");
			alert(testurl);*/
			var chmsg = getElement("msgs");
			chmsg.value = bbslang[81];
			delBBS(urltx);
		}
	}
}

// Exec delete BBS
function delBBS(urltx) {
	var xhr = createXHR();
	xhr.onreadystatechange=function()	{ 
		if(xhr.readyState == 4 && xhr.status == 200)	{
		  if(debug_mode == "1") {
        alert(xhr.responseText);
      }
			var xmldoc = xhr.responseXML;
			var tstKey = xmldoc.getElementsByTagName("autherr")[0].firstChild.nodeValue;
			var chmsg = getElement("msgs");
			chmsg.value = bbslang[82];
			alert(tstKey);
			window.close();
		}
	}; 
	xhr.open("GET", urltx, true);	
  xhr.send(null);
}

/*****************************
--> BBS Moderator functions
*****************************/

// Lock topic init
function lockTopic(tid) {
	var urlauthfrag = retLoginstring();
	var urltx = urlbs+'?c=tlc&xtpc='+tid+urlauthfrag;
	var chmsg = getElement("msgs");
	chmsg.value = bbslang[81];
	dolockTopic(urltx);
}
	
// Lock topic exec 
function dolockTopic(urltx) {
	var xhr = createXHR();
	xhr.onreadystatechange=function()	{ 
		if(xhr.readyState == 4 && xhr.status == 200)	{
		  if(debug_mode == "1") {
        alert(xhr.responseText);
      }
			var xmldoc = xhr.responseXML;
			var xmlstring = xhr.responseText;
			var tstKey = xmldoc.getElementsByTagName("autherr")[0].firstChild.nodeValue;
			if(tstKey == "none") {
				var tstExec = xmldoc.getElementsByTagName("aexec")[0].firstChild.nodeValue;
				var chexec = getElement("exec");
				chexec.value = tstExec;
				var chmsg = getElement("msgs");
				chmsg.value = bbslang[82]+' '+bbslang[80];
				parseTopicdata(xmldoc);
				chmsg.value = '';
				var prntxml = getElement("pxml");
				xmlstring = xmlstring.replaceAll("\\n", "\\\n");
				prntxml.value = escape(xmlstring);
				} else {
				alert(tstKey);
				window.close();
			}
		}
	}; 
	xhr.open("GET", urltx, true);	
  xhr.send(null);
}

// Sticky topic init
function stickyTopic(tid) {
	var urlauthfrag = retLoginstring();
	var urltx = urlbs+'?c=tst&xtpc='+tid+urlauthfrag;
	var chmsg = getElement("msgs");
	chmsg.value = bbslang[81];
	dostickyTopic(urltx);
}

// Sticky topic exec
function dostickyTopic(urltx) {
	var xhr = createXHR();
	xhr.onreadystatechange=function()	{ 
		if(xhr.readyState == 4 && xhr.status == 200)	{
		  if(debug_mode == "1") {
        alert(xhr.responseText);
      }
			var xmldoc = xhr.responseXML;
			var xmlstring = xhr.responseText;
			var tstKey = xmldoc.getElementsByTagName("autherr")[0].firstChild.nodeValue;
			if(tstKey == "none") {
				var tstExec = xmldoc.getElementsByTagName("aexec")[0].firstChild.nodeValue;
				var chexec = getElement("exec");
				chexec.value = tstExec;
				var chmsg = getElement("msgs");
				chmsg.value = bbslang[82]+' '+bbslang[80];
				parseTopicdata(xmldoc);
				chmsg.value = '';
				var prntxml = getElement("pxml");
				xmlstring = xmlstring.replaceAll("\\n", "\\\n");
				prntxml.value = escape(xmlstring);
				} else {
				alert(tstKey);
				window.close();
			}
		}
	}; 
	xhr.open("GET", urltx, true);	
  xhr.send(null);
}

// Delete topic init
function delTopic(tid) {
	var confirmdel = confirm(bbslang[59]);
	if(confirmdel) {
		var urlauthfrag = retLoginstring();
		var urltx = urlbs+'?c=tld&xtpc='+tid+urlauthfrag;
		var chmsg = getElement("msgs");
		chmsg.value = bbslang[81];
		dodelTopic(urltx);
	}
}

// Delete topic exec
function dodelTopic(urltx) {
	var xhr = createXHR();
	xhr.onreadystatechange=function()	{ 
		if(xhr.readyState == 4 && xhr.status == 200)	{
		  if(debug_mode == "1") {
        alert(xhr.responseText);
      }
			var xmldoc = xhr.responseXML;
			var tstKey = xmldoc.getElementsByTagName("autherr")[0].firstChild.nodeValue;
			if(tstKey == "none") {
				var tstExec = xmldoc.getElementsByTagName("aexec")[0].firstChild.nodeValue;
				var chexec = getElement("exec");
				chexec.value = tstExec;
				var chmsg = getElement("msgs");
				chmsg.value = bbslang[82]+' '+bbslang[80];
				parseForumdata(xmldoc);
				chmsg.value = '';
				} else {
				alert(tstKey);
				window.close();
			}
		}
	}; 
	xhr.open("GET", urltx, true);	
  xhr.send(null);
}

// Delete post init
function delPost(tid, tpid) {
	var confirmdel = confirm(bbslang[60]);
	if(confirmdel) {
		var urlauthfrag = retLoginstring();
		var urltx = urlbs+'?c=tpd&xtpc='+tid+'&xtpp='+tpid+urlauthfrag;
		var chmsg = getElement("msgs");
		chmsg.value = bbslang[81];
		doldelPost(urltx);
	}
}

// Delete post exec
function doldelPost(urltx) {
	var xhr = createXHR();
	xhr.onreadystatechange=function()	{ 
		if(xhr.readyState == 4 && xhr.status == 200)	{
		  if(debug_mode == "1") {
        alert(xhr.responseText);
      }
			var xmldoc = xhr.responseXML;
			var xmlstring = xhr.responseText;
			var tstKey = xmldoc.getElementsByTagName("autherr")[0].firstChild.nodeValue;
			if(tstKey == "none") {
				var tstExec = xmldoc.getElementsByTagName("aexec")[0].firstChild.nodeValue;
				var chexec = getElement("exec");
				chexec.value = tstExec;
				var chmsg = getElement("msgs");
				chmsg.value = bbslang[82]+' '+bbslang[80];
				parseTopicdata(xmldoc);
				chmsg.value = '';
				var prntxml = getElement("pxml");
				xmlstring = xmlstring.replaceAll("\\n", "\\\n");
				prntxml.value = escape(xmlstring);
				} else {
				alert(tstKey);
				window.close();
			}
		}
	}; 
	xhr.open("GET", urltx, true);	
  xhr.send(null);
}

/********************************
--> BBS User functions
********************************/

// Returns users present in xmldoc as sortable array
function retUserarr(xmldoc) {
	var xcrestr = "";
	var iusers = xmldoc.getElementsByTagName("acforumuser").length;
	if(iusers > 0) {
		var tUstarr = new Array();
		for(x=0;x<iusers;x++) {
			var vsCusername = xmldoc.getElementsByTagName("acusername")[x].firstChild.nodeValue;
			var vsCuserstamp = xmldoc.getElementsByTagName("acuserstamp")[x].firstChild.nodeValue;
			var vsCuserlevel = xmldoc.getElementsByTagName("acuserlevel")[x].firstChild.nodeValue;
			var vsCuserposts = xmldoc.getElementsByTagName("acusereplies")[x].firstChild.nodeValue;
			tUstarr.push(vsCuserstamp+'^'+vsCusername+'^'+vsCuserlevel+'^'+vsCuserposts);
		}
		return tUstarr;
	}
}

// Returns updated userlist, init
function retupUserlist(xmldoc) {
	var serverStamp = xmldoc.getElementsByTagName("acforumtstamp")[0].firstChild.nodeValue;
	var txkey = retK();
	var xcrestr = "";
	var iusers = xmldoc.getElementsByTagName("acforumuser").length;
	if(iusers > 0) {
		var tUstarr = new Array();
		for(x=0;x<iusers;x++) {
			var vsCusername = xmldoc.getElementsByTagName("acusername")[x].firstChild.nodeValue;
			var vsCuserstamp = xmldoc.getElementsByTagName("acuserstamp")[x].firstChild.nodeValue;
			var vsCuserlevel = xmldoc.getElementsByTagName("acuserlevel")[x].firstChild.nodeValue;
			var vsCuserposts = xmldoc.getElementsByTagName("acusereplies")[x].firstChild.nodeValue;
			tUstarr.push(vsCuserstamp+'^'+vsCusername+'^'+vsCuserlevel+'^'+vsCuserposts);
		}
		tUstarr = tUstarr.sort();
		tUstarr = tUstarr.reverse();
		return printUserlist(tUstarr, serverStamp);
		} else {
		return bbslang[44];
	}
}

// Returns updated userlist, exec
function printUserlist(userArr, serverStamp) {
	var txkey = retK();
	var tbbserverDate = comparedateRet(serverStamp);
	var tbbserverDay = dayRet(serverStamp);
	var tbbulist = '';
	var tbbuclock = '';
	var dayPrint = '';
	for(u=0;u<userArr.length;u++) {
		var uxline = userArr[u].split("^");
		var vsCusernamec = des(txkey, hexToString(uxline[1]), 0, 0);
		var userDate = comparedateRet(uxline[0]);
		if(Trim(uxline[2]) == 'admin') {
			var tlevel = ' (a)';
			} else if(Trim(uxline[2]) == 'moderator') { 
			var tlevel = ' (m)';
			} else { 
			var tlevel = '';
		}
		if(tbbuclock == "") {
			// Init
			dayPrint = '<span class="bbsUlistday">'+bbslang[45]+'<br>'+doulistTimestamp(serverStamp)+'</span>';
			tbbulist += dayPrint;
			} else {
			if(tbbuclock != comparedateRet(uxline[0])) {
				dayPrint = '<span class="bbsUlistday">'+doulistTimestamp(uxline[0])+'</span>';
				tbbulist += dayPrint;
				} else {
			}
		}
		tbbulist += colorUsers(E2C(RTrim(vsCusernamec))+tlevel+' ('+uxline[3]+')', uxline[0], serverStamp)+'<br>';
		tbbuclock = comparedateRet(uxline[0]);
	}
	return tbbulist;
}