// ******************************************************
//
//   Big Red Racing JS Library
//   written by Digital Propulsion Labs
//   Copyright 2009 Digital Propulsion Labs *unless otherwise specified*
//	 version 0.4 - 09/07/2009
//
//
//   v0.7 - Inital Release
//		  - 
//   v0.3 - Added Date name arrays
//   v0.1 - Created
//
// ******************************************************

// date defs
var dMonths = Array("January","Feb","March","April","May","June","July","August","September","October","November","December");
var dMonthsShort = Array("Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec");
var dDays = Array("Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday");


if (typeof DOMParser == "undefined") {
   DOMParser = function () {}
   DOMParser.prototype.parseFromString = function (str, contentType) {
      if (typeof ActiveXObject != "undefined") {
         var d = new ActiveXObject("MSXML.DomDocument");
         d.loadXML(str);
         return d;
      } else if (typeof XMLHttpRequest != "undefined") {
         var req = new XMLHttpRequest;
         req.open("GET", "data:" + (contentType || "application/xml") +
                         ";charset=utf-8," + encodeURIComponent(str), false);
         if (req.overrideMimeType) {
            req.overrideMimeType(contentType);
         }
         req.send(null);
         return req.responseXML;
      }
   }
}


/*
	***********************************************

	cookie functions

	***********************************************
*/

function storeField(frmHndl,tField,dField) {
	
	frmHndl = getCtrlHandle(frmHndl);
	var fHndl = eval("frmHndl."+dField);
	if (typeof fHndl == 'object') {
		if (eval("frmHndl."+tField).checked) setcookie(dField, fHndl.value, 720, "");
	}

	return;
}

function deletecookie(cookie_name, path, domain, secure) {

	if (cookie_name && typeof(getcookie(cookie_name)) == "string") {
		//var expires = new Date();
		//expires = expires.setHours(expires.getHours()-3);
		var expires = ( new Date( ( new Date() ).getTime() + ( 4000 * -10 ) ) );
		document.cookie = escape( cookie_name ) + "=0; expires=" + expires.toGMTString() +
		(domain&&(domain.length > 0) ? "; domain=" + domain : "") +
		((path) ? "; path=" + path : "") +
		((secure) ? "; secure" : "");
		if (!getcookie(cookie_name)) window.status = "cookie removed";
		return true;
	}

	return false;

}

function setcookie(cookieName, cookieValue, length, domain, path, secure) {

	// netscape is not storing the cookie for some reason .. fixed?
	// Wdy, DD-Mon-YYYY HH:MM:SS GMT

	if (cookieName && cookieValue) {
		var expires = new Date();
		if (!length) length = 2;
		expires.setHours(expires.getHours()+length);
		document.cookie = escape( cookieName ) + "=" + escape( cookieValue ) + "; expires=" + expires.toGMTString() + 
		(domain&&(domain.length > 0) ? "; domain=" + domain : "") +
		((path) ? "; path=" + path : "") +
		((secure) ? "; secure" : "");
		//alert("cookie set? [" + document.cookie + "] " + expires.toGMTString());
		return true;
	}

	return false;

}

function cookiecheck() {
	setcookie("test", "true");
	if (getcookie("test")) {
		deletecookie("test");
		return true;
	} else {
		return false;
	}
}

function getcookie(cookieName) {
	var	cVal, vStart, vEnd;
	
	var cookieJar = document.cookie.split( "; " );
	for( var x = 0; x < cookieJar.length; x++ ) {
		var oneCookie = cookieJar[x].split( "=" );
		if( oneCookie[0] == escape( cookieName ) ) { return unescape( oneCookie[1] ); }
	}

	/*
	vStart = document.cookie.indexOf(cookieName + '=') + (cookieName.length + 1);
	if (vStart > -1) {
		vEnd = document.cookie.indexOf(';', vStart);
		if (vEnd == -1) vEnd = document.cookie.length;
		cVal = document.cookie.substring(vStart, vEnd);
		//alert("DEBUG cVal:"+cVal+"["+document.cookie+"]");
		return cVal;
	}
	*/
	
	return null;

}

function getCtrlHandle() {
	var ctrlName = getCtrlHandle.arguments[0];
	var ctrlHndl;

	// get handle of object
	if (document.all) {  // ie or similar
		var ctrlHndl = eval("document.all."+ctrlName);
	} else {  // other
		if (ctrlName.indexOf(".") > 0) {
			while (ctrlName.indexOf(".") > 0) {
				tcName = ctrlName.substr(0, ctrlName.indexOf("."));
				ctrlHndl = document.getElementById(tcName);
				ctrlName = ctrlName.substr(ctrlName.indexOf(".")+1, ctrlName.length);
			}
			ctrlHndl = eval("ctrlHndl."+ctrlName);
		} else {
			ctrlHndl = document.getElementById(ctrlName);
		}
	}
	
	if (ctrlHndl) {
		return ctrlHndl;
	} else {
		return;
	}
}

function getCtrlHndlbyTagName() {
	var args = getCtrlHndlbyTagName.arguments;
	
	var ctrls = document.getElementsByName(args[0]);
	if (args[2]) var ctrls = args[2].getElementsByName(args[0]);

	for (c=0;c<=(ctrls.length-1);c++) {
		if (ctrls.item(c).tagName) {
			var fTagName = ctrls.item(c).tagName.toLowerCase();
			//alert(fTagName);
			if (!args[1] || fTagName.indexOf(args[1]) > -1)	return ctrls.item(c);
		}
	}

	return false;
}

// returns the value from a specified form field
function getFormData(frmName,fldName) {
	var args = getFormData.arguments;

	var fieldValue = "";
	var frmfields = getCtrlHndlbyTagName(args[0],"form").elements;
	for (c=0;c<frmfields.length;c++) {
		var fTagName = frmfields.item(c).tagName.toLowerCase();
		if (frmfields.item(c).name == "") continue;
		//alert(fTagName.indexOf("input")+"-"+frmfields.item(c).name+"/"+frmfields.item(c).value);
		if (frmfields.item(c).name == args[1]) {
			fieldValue = frmfields.item(c).value;
		}
	}
	
	return fieldValue;
}

// assigns a value to a specified form field
function setFieldValue(frmName,fldName,fldValue) {
	var fieldValue = ""; var vsCount = 0;
	var frmfields = getCtrlHndlbyTagName(frmName,"form").elements;
	for (c=0;c<frmfields.length;c++) {
		var fTagName = frmfields.item(c).tagName.toLowerCase();
		if (frmfields.item(c).name == "") continue;
		//alert(fTagName.indexOf("input")+"-"+frmfields.item(c).name+"/"+frmfields.item(c).value);
		if (frmfields.item(c).name == fldName) {
			switch (frmfields.item(c).type.toLowerCase()) {
				case "radio" :
					var rdObj = frmfields.item(c);
					if(rdObj.length == undefined) {
						rdObj.checked = (rdObj.value == fldValue.toString());
						return true;
					} else {
						for(var i = 0; i < rdObj.length; i++) {
							rdObj[i].checked = (rdObj[i].value == fldValue.toString());
						}
					}
					//if (frmfields.item(c).value == fldValue) {
					//		frmfields.item(c).checked = true;
					//		frmfields.item(c).click();
					//}
					//rdObj.checked = (rdObj.value == fldValue.toString());
					//return true;
					break;
				case "checkbox" :
					if (frmfields.item(c).value == fldValue) frmfields.item(c).checked = true;
					return true;
					break;
				case "select" : // needs to accept fldValue as array
					//if (frmfields.item(c).value == "") frmfields.item(c).value = fldValue;
					//return true;
					break;
				default : // text
					frmfields.item(c).value = fldValue;
					return true;
			}
		}
	}	
	return false;
}

function displayHistory() {
	var args = displayHistory.arguments;
	var divHndl;
	
	histDivName = args[0];
	//divHndl = (eval(args[0]) ? eval(args[0]) : document.getElementbyID(args[0]));

	toggleDisplay(histDivName);	
	try {
        loadXMLDoc(args[1]);
	}
	catch(e) {
	    var msg = (typeof e == "string") ? e : ((e.message) ? e.message : "Unknown Error");
	    alert("Error Retriving History - Unable to get XML data:\n" + msg);
	    return;
	}
	
	return;
}


function toggleDisplay() {
	var args = toggleDisplay.arguments;
	var divHndl = args[0];

	if (typeof divHndl != 'object') var divHndl = getCtrlHandle(args[0]);
	if (args.length > 2 && args[2] > 0) {
		setTimeout("toggleDisplay('"+divHndl.id+"','"+args[1]+"')",args[2]);  // delayed call
	} else {
		divHndl.style.display = args[1] ? (args[1] == "show" ? "" : args[1]) : (divHndl.style.display == "" ? "none" : "");
	}

	return true;
} //v1.3

/*
	***********************************************

	AJAX Functions

	***********************************************
*/


var htreq;
var isIE = false;

function getXMLRequestHndl() {

	if (window.XMLHttpRequest)
		return http = new XMLHttpRequest();
	else if (window.ActiveXObject)
		return http = new ActiveXObject("Microsoft.XMLHTTP");

}

function simpleXMLRequest() {
	var args = simpleXMLRequest.arguments;
	var reqURL = args[0];
	var metho = args[1];
	var addlFuncArgs = new Array();
	for (x=2;x<=args.length;x++) { addlFuncArgs[x-2] = args[x]; }

	// pre-submit operations
	if (!eval(metho+"('pre',null,'"+addlFuncArgs.join("','")+"')")) return;

	// branch for native XMLHttpRequest object
	var htreq = getXMLRequestHndl();

	if (htreq && args.length > 1) {
		// set request action
		htreq.onreadystatechange = function () {
			if (htreq.parseError && htreq.parseError != 0) {
				alert("Parse Error line " + htreq.parseError.line + ", character " + htreq.parseError.linePos + '\n' + htreq.parseError.srcText);
			}
			// only if req ready
			if (htreq.readyState == 4) {
				// load if "OK"
				if (htreq.status == 200) {
					// do the stuff
					//alert(metho+"('success',htreq,'"+addlFuncArgs.join("','")+"')");
					if (!eval(metho+"('success',htreq,'"+addlFuncArgs.join("','")+"')")) alert(metho+" failed on execution.");
				} else {
					if (!eval(metho+"('error',htreq,'"+addlFuncArgs.join("','")+"')")) {
						alert("There was a problem retrieving the XML data:\n" + htreq.statusText + " (" + htreq.status + ")");
					}
				}
			}
		};

		htreq.open("GET", reqURL, true);
	    //htreq.setRequestHeader("Content-type", "text/xml");
		if (window.ActiveXObject)
			htreq.send();
		else
			htreq.send(null);

	}

	return;
}

function simpleSynXMLRequest() {
	var args = simpleSynXMLRequest.arguments;
	var reqURL = args[0];
	//var addlFuncArgs = new Array();
	//for (x=2;x<=args.length;x++) { addlFuncArgs[x-2] = args[x]; }

	// branch for native XMLHttpRequest object
	var htreq = getXMLRequestHndl();

	if (htreq && args.length >= 1) {

		htreq.open("GET", reqURL, false);
	    //htreq.setRequestHeader("Content-type", "text/xml");

		if (window.ActiveXObject)
			htreq.send();
		else
			htreq.send(null);
			
		// process sync request
		if (htreq.parseError && htreq.parseError != 0) {
			alert("Parse Error line " + htreq.parseError.line + ", character " + htreq.parseError.linePos + '\n' + htreq.parseError.srcText);
		}

		// only if req ready
		if (htreq.readyState == 4) {
			return htreq;
			/*
			// load if "OK"
			if (htreq.status == 200) {
				// do the stuff
				//alert(metho+"('success',htreq,'"+addlFuncArgs.join("','")+"')");
				if (!eval(metho+"('success',htreq,'"+addlFuncArgs.join("','")+"')")) alert(metho+" failed on execution.");
			} else {
				if (!eval(metho+"('error',htreq,'"+addlFuncArgs.join("','")+"')")) {
					alert("There was a problem retrieving the XML data:\n" + htreq.statusText + " (" + htreq.status + ")");
				}
			}
			*/
		}

	}

	return;
}

function submitXMLRequest() {
	var args = submitXMLRequest.arguments;
	var frmHndl = getCtrlHandle(args[0]);
	var metho = args[1];
	var addlFuncArgs = new Array();
	for (x=2;x<=args.length;x++) { addlFuncArgs[x-2] = args[x]; }
	
	// pre-submit operations
	if (!eval(metho+"('pre','"+frmHndl.name+"',null,'"+addlFuncArgs.join("','")+"')")) return;

    // branch for native XMLHttpRequest object
	var htreq = getXMLRequestHndl();

	if (htreq && frmHndl) {
		// set request action
		htreq.onreadystatechange = function () {
			if (htreq.parseError && htreq.parseError != 0) {
				alert("Parse Error line " + htreq.parseError.line + ", character " + htreq.parseError.linePos + '\n' + htreq.parseError.srcText);
			}
			// only if req ready
			if (htreq.readyState == 4) {
				// load if "OK"
				//alert("sent - "+htreq.readyState+"/");
				if (htreq.status == 200) {
					// do the stuff
					if (!eval(metho+"('success','"+frmHndl.name+"',htreq,'"+addlFuncArgs.join("','")+"')")) alert(metho+" failed on execution");
				} else {
					if (!eval(metho+"('error','"+frmHndl.name+"',htreq,'"+addlFuncArgs.join("','")+"')")) {
						alert("There was a problem retrieving the XML data:\n" + htreq.statusText + " (" + htreq.status + ")");
					}
				}
			}
		};
		
		// prep data
		var strFormData = compileFormData(frmHndl.name);
		
		if (frmHndl.method.toUpperCase() == "POST") {
			htreq.open(frmHndl.method, frmHndl.action, true);
			htreq.setRequestHeader("Content-type","application/x-www-form-urlencoded");
			htreq.setRequestHeader("Content-length",strFormData.length);
			htreq.setRequestHeader("Connection", "close");
			htreq.send(strFormData);
		} else {
			htreq.open(frmHndl.method, frmHndl.action+(frmHndl.action.indexOf("?")>-1?"&":"?")+strFormData, true);
			if (window.ActiveXObject) {
				htreq.send();
			} else {
				htreq.send(null);
			}
		}

	}

	return;
}

// can return an array, ecoded string, or js object for JSON??
function compileFormData() {
	var args = compileFormData.arguments;

	var da = new Array();
	var strPostData = "";
	var dac = 0;
	var frmfields = getCtrlHndlbyTagName(args[0],"form").elements;//  document.getElementsByName(args[0]);
	for (c=0;c<frmfields.length;c++) {
		var fTagName = frmfields.item(c).tagName.toLowerCase();
		if (frmfields.item(c).name == "") continue;
		//alert(fTagName.indexOf("input")+"-"+frmfields.item(c).name+"/"+frmfields.item(c).value);
		da[dac] = frmfields.item(c).name;
		if (fTagName.indexOf("input") > -1) {
			da[dac+1] = frmfields.item(c).value;
			// build url encoded string
			strPostData += escape(da[dac])+"="+escape(da[dac+1])+"&";
			//debugPostData += escape(da[dac])+"="+escape(da[dac+1])+", ";
			dac = dac + 2;
		} else if (fTagName.indexOf("select") > -1) {
			da[dac+1] = frmfields.item(c).options[frmfields.item(c).selectedIndex].value;
			// build url encoded string
			strPostData += escape(da[dac])+"="+escape(da[dac+1])+"&";
			//debugPostData += escape(da[dac])+"="+escape(da[dac+1])+", ";
			dac = dac + 2;
		}
	}
	
	// format into js obj for JSON
	if (args[1] != "array") {
		for (x=0;x<da.length;x+=2) {
			if (args[1] == "json") {
				strPostData += da[x]+": \""+da[x+1]+"\",";
			} else {
				strPostData += escape(da[x])+"="+escape(da[x+1])+"&";
			}
		}
		strPostData = strPostData.substr(0,strPostData.length-1);
	}

	return (args[1] == "array" ? da : strPostData);

}

function getSelectedOptions(selObj) {
	var retArry = new Array();
	if (selObj) {
		for (i=0;i<selObj;i++) {
			if (frmfields.item(c).options[i].selected) retArry[retArry.length+1] = frmfields.item(c).options[i].value;
		}
	}
	return retArry;
}

/*
 ****************************************************
 	Extended JSON Functions
 ****************************************************
*/

/*
if (JSON && typeof JSON.stringifyForm !== 'function') {
	JSON.stringifyForm = function (frmName,ignoreList) {
		
	}
}
*/

function sendJSONRequest(url,frmName,metho) {
	var args = sendJSONRequest.arguments;
	var addlFuncArgs = new Array();
	var	frmHndl = getCtrlHandle(frmName);
	for (x=3;x<=args.length;x++) { addlFuncArgs[x-3] = args[x]; }
	
	// pre-submit operations
	if (!eval(metho+"('pre','"+frmHndl.name+"',null,'"+addlFuncArgs.join("','")+"')")) return;

	var htreq = getXMLRequestHndl();
	if (htreq) {
		// set request action
		htreq.onreadystatechange = function () {
			if (htreq.readyState == 4) {  // load if "OK"
				//alert("sent - "+htreq.readyState+"/");
				if (htreq.status == 200) {
					// do the stuff
					if (!eval(metho+"('success','"+frmHndl.name+"',htreq,'"+addlFuncArgs.join("','")+"')")) alert(metho+" failed on execution");
				} else {
					if (!eval(metho+"('error','"+frmHndl.name+"',htreq,'"+addlFuncArgs.join("','")+"')"))
						alert("An error occured while communicating with the server:\n" + htreq.statusText + " (" + htreq.status + ")");
				}
			}
		};
			
		// complie and stringify form data
		//var strdFormData = JSON.stringify(compileFormData(frmName,"json"));
		var strdJSONFormData = JSON.stringify(parseFormToJSON(frmName,''));

		// send request to submitXMLRequest
		//alert(escape(frmName)+"="+escape(strdJSONFormData));
		htreq.open("POST", url ? url : frmHndl.action, true);
		htreq.setRequestHeader("Content-type","application/x-www-form-urlencoded");
		htreq.setRequestHeader("Content-length",strdJSONFormData.length);
		htreq.setRequestHeader("Connection", "close");
		htreq.send(escape(frmName)+"="+escape(strdJSONFormData)); // not sure if it really needs escaped, also adding \'s to quotes

		// exit
	}

	return;
}

function simpleJSONRequest() {
	var args = simpleJSONRequest.arguments;
	var reqURL = args[0];
	var metho = args[1];
	var addlFuncArgs = new Array();
	for (x=2;x<=args.length;x++) { addlFuncArgs[x-2] = args[x]; }

	// pre-submit operations
	if (!eval(metho+"('pre',null,'"+addlFuncArgs.join("','")+"')")) return;

	// branch for native XMLHttpRequest object
	var htreq = getXMLRequestHndl()
	if (htreq && args.length > 1) {
		htreq.onreadystatechange = function () {
			// only if req ready
			if (htreq.readyState == 4) {
				// load if "OK"
				if (htreq.status == 200) {
					// do the stuff
					if (!eval(metho+"('success',htreq,'"+addlFuncArgs.join("','")+"')"))
						alert(metho+" failed on execution.");
				} else {
					if (!eval(metho+"('error',htreq,'"+addlFuncArgs.join("','")+"')")) 
						alert("There was a problem retrieving the requested data:\n" + htreq.statusText + " (" + htreq.status + ")");
				}
			}
		};
		
		// add formatted JSON to the request URL -- not yet implimented
		//reqURL += (reqURL.indexOf("?") > 0) ? "&json="+JSON.stringify(datastruct) : "?json="+JSON.stringify(datastruct);
		htreq.open("GET", reqURL, true);
		if (window.ActiveXObject)
			htreq.send();
		else
			htreq.send(null);

	}

	return;
}
// returns an js object referring to all fields/values from the given form
function parseFormToJSON(frmName,ignoreList) {
	var frmHndl = getCtrlHandle(frmName);
	if (frmHndl) {
		var frmfields = frmHndl.elements;
		var tmpfldstr = "";
		for (c=0;c<frmfields.length;c++) {
			var fTagName = frmfields.item(c).tagName.toLowerCase();
			if (frmfields.item(c).name == "" || ignoreList.indexOf(frmfields.item(c).name) > -1) continue;
			if (fTagName.indexOf("select") > -1) {
				var retOpsArry = new Array();
				for (i=0;i<frmfields.item(c).length;i++)
					if (frmfields.item(c).options[i].selected) retOpsArry[retOpsArry.length] = frmfields.item(c).options[i].value;
				tmpfldstr += frmfields.item(c).name+": \""+retOpsArry+"\",";
			} else {
				if (tmpfldstr.indexOf(","+frmfields.item(c).name+":") > 0) {
					tmpfldstr = tmpfldstr.substr(0,tmpfldstr.indexOf(","+frmfields.item(c).name+":")+frmfields.item(c).name.length+4) +
						frmfields.item(c).value+","+tmpfldstr.substr(tmpfldstr.indexOf(","+frmfields.item(c).name+":")+frmfields.item(c).name.length+4,tmpfldstr.length);
				} else {
					tmpfldstr += frmfields.item(c).name+": \""+frmfields.item(c).value+"\",";
				}
			}
		}
		tmpfldstr = tmpfldstr.substr(0,tmpfldstr.length-1);
		//alert(tmpfldstr);
		eval("var "+frmName+" = {"+tmpfldstr+"}")
		return eval(frmName);
	}
	return;
}



/*
****************************************
	General RG Page Functions
****************************************
*/

function getStatMsgHndl() {
	return slh ? slh : getCtrlHandle("statmsg");
}

function setStatusMsg(statMsg,autoHide) {
	// slh should be defined at the status box handle
	var sh = getStatMsgHndl();
	thaMsg = (parseInt(statMsg) == statMsg) ? subStatus[statMsg] : statMsg;
	sh.innerHTML = thaMsg;
	// if the message is an error/failure, set the proper style
	
	toggleDisplay(sh, "show");
	if (autoHide) clearStatusMsg();
	return (sh.innerHTML == thaMsg) ? true : false;
}

function clearStatusMsg(statMsg) {
	var tOut = clearStatusMsg.arguments[0] ? clearStatusMsg.arguments[0] : 4000;
	setTimeout("toggleDisplay('statmsg','none')",tOut);
}

function updateBoxTitle(title) {
	getCtrlHandle("boxtitle").innerHTML = title;
	return true;
}

/*
function selectFeed(frm,fid,url,title) {
	var fHndl = getCtrlHandle(frm);
	if (fHndl) {
		 fHndl.feedid.value = fid;
		 fHndl.label.value = title;
		 fHndl.feedurl.value = url;
	}
	return;
}
*/

function selectSubFeed(displ,tpname,fid,ftitle) {
	var daHndl = getCtrlHandle(displ);
	if (daHndl) {
		// get the child elements of the feeds display layer
		//var nTable = getCtrlHndlbyTagName("table",daHndl);
		var nTable = getCtrlHandle(tpname);
		if (!nTable) { 
			nTable = createDOMTable(daHndl,"100%","0","","0","0");
			nTable.setAttribute("id",tpname);
		}
		if (!getCtrlHandle('feed'+fid)) {
			var nRowHndl = addTableCols(nTable, nTable.rows.length, new Array("<input type='hidden' name='feedid' value='"+fid+"'>"+ftitle,"[<a href=\"javascript:;\" onClick=\"removeSubFeed('"+tpname+"','"+fid+"');\">x</a>]"), new Array("left","right"), null, null, "", new Array("92%",""));
			nRowHndl.setAttribute("id","feed"+fid);
		}
	} else {
	}
	return;
}

function removeSubFeed(tblid,frid) {
	removeTableRow(tblid,'feed'+frid);
}

/*
****************************************
 	General Functions
****************************************
*/

function setFieldFocus(fieldName,selAll) {
	var fHndl = getCtrlHandle(fieldName);

	if (fHndl) {
		if (fHndl.type == "text" && selAll) fHndl.select();
		return fHndl.focus();
	}
}

function isArray(obj) {
   if (obj.constructor.toString().indexOf("Array") > -1 || obj.toString().indexOf("NodeList") > -1)
      return true;
   else
      return false;
}

function getObjTopPos(mrObj) {
	var returnValue = mrObj.offsetTop;
	while ((mrObj = mrObj.offsetParent) != null) returnValue += mrObj.offsetTop;
	return returnValue;
}

function getObjLeftPos(mrObj) {
	var returnValue = mrObj.offsetLeft;
	while ((mrObj = mrObj.offsetParent) != null) returnValue += mrObj.offsetLeft;
	return returnValue;
}

/* This script and many more are available free online at
The JavaScript Source!! http://javascript.internet.com
Created by: Robert Nyman | http://robertnyman.com/ */
function removeHTMLTags(txtInput) {
	/* 
		This line is optional, it replaces escaped brackets with real ones, 
		i.e. < is replaced with < and > is replaced with >
	txtInput = txtInput.replace(/&(lt|gt);/g, function (strMatch, p1){
		return (p1 == "lt")? "<" : ">";
	});
	*/
	return txtInput.replace(/<br\s?\/?>/g, " ").replace(/<\/?[^>]+(>|$)/g, "");
}

/*
	***********************************************

	DOM Functions

	***********************************************
*/

function createDOMLayer() {
	var dHndl = createDOMLayer.arguments[0];

	// create the Layer
	var ndHndl = document.createElement('div');
	// set attributes<div 
	ndHndl.innerHTML = createDOMLayer.arguments[1];
	ndHndl.setAttribute("align", createDOMLayer.arguments[2]);
	ndHndl.setAttribute("class", createDOMLayer.arguments[3]);
	ndHndl.setAttribute("id", createDOMLayer.arguments[4]);
	ndHndl.setAttribute("style", createDOMLayer.arguments[5]);
	// append Layer
	dHndl.appendChild(ndHndl);

	return ndHndl;
}

function createDOMForm() {
	var dHndl = createDOMForm.arguments[0];

	// create the form
	var fHndl = document.createElement('form');
	// set attributes
	fHndl.setAttribute("action", createDOMForm.arguments[1]);
	fHndl.setAttribute("method", createDOMForm.arguments[2]);
	fHndl.setAttribute("id", createDOMForm.arguments[3]);
	// append form
	dHndl.appendChild(fHndl);

	return fHndl;
}

function createDOMTable() {
	var dHndl = createDOMTable.arguments[0];
		
	// create the table
	var tHndl = document.createElement('table');
	// set attributes
	tHndl.setAttribute("width", createDOMTable.arguments[1]);
	tHndl.setAttribute("border", createDOMTable.arguments[2]);
	tHndl.setAttribute("align", "center");
	tHndl.setAttribute("cellspacing", "1");
	tHndl.setAttribute("cellpadding", "3");
	//tHndl.setAttribute("id", "datable");
	// append table
	dHndl.appendChild(tHndl);
	
	return tHndl;
}
		
function createDOMInput() {
	// create input
	var iHndl = document.createElement('input');
	// set attributes
	iHndl.setAttribute("type", createDOMInput.arguments[1]);
	iHndl.setAttribute("name", createDOMInput.arguments[2]);
	iHndl.setAttribute("value", createDOMInput.arguments[3]);
	// append to form
	createDOMInput.arguments[0].appendChild(iHndl);
	return iHndl;
}

// example createDOMSelect(formHandle,"mylist",1,new Array("Option 1", "1"),new Array("Option 2", "2"))
function createDOMSelect() {
	var args = createDOMSelect.arguments;
	// create input
	var sHndl = document.createElement('select');
	// set attributes
	sHndl.setAttribute("name", args[1]);
	sHndl.setAttribute("size", args[2]);
	// create options list
	if (args.length > 3) {
		var opHndl, opArray;
		for (c=3; c < args.length; c++) {
			opArray = args[c];
			opHndl = document.createElement('option');
			// append to select
			sHndl.appendChild(opHndl);
			opHndl.text = opArray[0];
			opHndl.value = opArray[1];
		}
	}
	// append to form
	args[0].appendChild(sHndl);
	return sHndl;
}

// v2.1
function addTableCols() {
	var tHndl = addTableCols.arguments[0];
	var rPos = addTableCols.arguments[1];
	var colArray = addTableCols.arguments[2];
	var colAlign = addTableCols.arguments[3];
	var colSpan = addTableCols.arguments[4];
	var rowSpan = addTableCols.arguments[5];
	var colClass = addTableCols.arguments[6];
	var colWidth = addTableCols.arguments[7];
	var c,newCell;
	
	if (colArray.length > 0) {
		var rHndl = tHndl.insertRow(rPos);
		for (c=0; c < colArray.length; c++) {
			newCell = rHndl.insertCell(c);
			newCell.innerHTML = colArray[c];
			newCell.setAttribute("align" ,(typeof colAlign == "array") ? colAlign[c] : colAlign);
			newCell.setAttribute("colspan" ,(typeof colSpan == "array") ? colSpan[c] : colSpan);
			newCell.setAttribute("rowspan" ,(typeof rowSpan == "array") ? rowSpan[c] : rowSpan);
			newCell.setAttribute("class" ,(typeof colClass == "array") ? colClass[c] : colClass);
			newCell.setAttribute("width" ,(typeof colWidth == "array") ? colWidth[c] : colWidth);
		}
	}

	return rHndl;
}

function clearTableRows(parntHndl) {
	var l = parntHndl.rows.length;
	while (parntHndl.rows.length>0) parntHndl.deleteRow(0);
	return l;
}

function removeTableRow(parntName,elemID) {
	var tblHndl = getCtrlHandle(parntName); //.deleteRow();
	for (x=0;x<tblHndl.rows.length;x++) {
		if (tblHndl.rows[x].id = elemID) tblHndl.deleteRow(x);
	}
	//return getCtrlHandle(parntName).removeChild(getCtrlHandle(elemID));
}

function appendInput() {
	var args = appendInput.arguments;
	var frmHndl = (!isString(args[0]) ? args[0] : getCtrlHandle(args[0]));
	var inpType = (args[1].length > 0 ? args[1] : "hidden");

	if (document.all) {
		// this is done because IE doesn't seem handle appendChild correctly
		frmHndl.innerHTML = "<input type=\""+inpType+"\" name='"+args[2]+"' value="+args[3]+">" + frmHndl.innerHTML;
	} else {
		var hfHndl = createDOMInput(frmHndl,inpType,args[2],args[3]);
	}
	
	return frmHndl;
}

function deleteInput() {
	var args = deleteInput.arguments;
	var delCount = 0;

	var cbFlds = document.getElementsByName(args[0]);
	for (c=0;c<cbFlds.length;c++) {
		var fTagName = cbFlds.item(c).tagName.toLowerCase();
		if (fTagName.indexOf("input") > -1) {
			//alert(cbFlds.item(c).name+"/"+cbFlds.item(c).value);
			cbFlds.item(c).parentNode.removeChild(cbFlds.item(c));
			delCount++;
		}
	}

	return delCount;
}
// add item to select element the less
// elegant, but compatible way.
function appendToSelect(select, value, content) {
    var opt;
    opt = document.createElement("option");
    opt.value = value;
    opt.appendChild(content);
    select.appendChild(opt);
}

function uDefChkBox() {
	var args = uDefChkBox.arguments;
	var chkHndl = getCtrlHndlbyTagName(args[0],"img");
	var frmHndl = (args[1] > "" ? getCtrlHndlbyTagName(args[1],"form") : chkHndl.parentNode);
	var chkVal = (args.length > 2 && args[2].length > 0 ? args[2] : "1");
	
	if (args[3] == "status") {
		if (chkHndl.src.indexOf('unchecked') > 0) {
			return "unchecked";
		} else {
			return "checked";
		}
	} else if (chkHndl.src.indexOf('unchecked') > 0) {
		chkHndl.src = udchk_checked;  // change image
		var hfHndl = appendInput(frmHndl,"hidden",args[0],chkVal);
	} else {
		// remove the form value
		deleteInput(args[0]);
		/*
		var cbFlds = document.getElementsByName(args[0]);
		for (c=0;c<cbFlds.length;c++) {
			var fTagName = cbFlds.item(c).tagName.toLowerCase();
			if (fTagName.indexOf("input") > -1) {
				//alert(cbFlds.item(c).name+"/"+cbFlds.item(c).value);
				cbFlds.item(c).parentNode.removeChild(cbFlds.item(c));
			}
		}
		*/
		chkHndl.src = udchk_unchecked;  // change image
	}

	return;
}

function getChildNodebyId(parent,id)
{
	if (parent.childNodes.length > 0)
	   for (var i = 0; i < parent.childNodes.length; i++) if (parent.childNodes[i].id == id) return parent.childNodes[i];

	return null;
}

/*
********************************************
 Borrowed from developer.apple.com Example
********************************************
*/

// display details retrieved from XML document
function grabHistory(dname) {
    var item, content, dHndl;
	dHndl = (eval(dname) ? eval(dname) : document.getElementbyID(dname));
	if (dHndl) {
		//alert(req.responseXML.getElementsByTagName("rss").length + '/' + req.responseXML.getElementsByTagName("item").length);  // debug
		 // copy <content:encoded> element text for the first item
		item = req.responseXML.getElementsByTagName("item")[0];
		content = getElementTextNS("content", "encoded", item, 0);
		dHndl.innerHTML = "";
		// blast new HTML content into "vhist" <div>
		dHndl.innerHTML = content;
		//if (isIE) alert(dHndl.innerHTML);
	}
}

// retrieve text of an XML document element, including
// elements using namespaces
function getElementTextNS(prefix, local, parentElem, index) {
    var result = "";
    if (prefix && isIE) {
        // IE/Windows way of handling namespaces
        result = parentElem.getElementsByTagName(prefix + ":" + local)[index];
    } else {
        // the namespace versions of this method 
        // (getElementsByTagNameNS()) operate
        // differently in Safari and Mozilla, but both
        // return value with just local name, provided 
        // there aren't conflicts with non-namespace element
        // names
        result = parentElem.getElementsByTagName(local)[index];
    }
    if (result) {
        // get text, accounting for possible
        // whitespace (carriage return) text nodes 
        if (result.childNodes.length > 1) {
            return (result.childNodes[1] ? result.childNodes[1].nodeValue : "");
        } else {
            return (result.firstChild ? result.firstChild.nodeValue : "");
        }
    } else {
        return "n/a";
    }
}

// empty Topics select list content
function clearTopicList() {
    var select = document.getElementById("topics");
    while (select.length > 0) {
        select.remove(0);
    }
}

// fill Topics select list with items from
// the current XML document
function buildTopicList() {
    var select = document.getElementById("topics");
    var items = req.responseXML.getElementsByTagName("item");
    // loop through <item> elements, and add each nested
    // <title> element to Topics select element
    for (var i = 0; i < items.length; i++) {
        appendToSelect(select, i,
            document.createTextNode(getElementTextNS("", "title", items[i], 0)));
    }
    // clear detail display
    document.getElementById("details").innerHTML = "";
}

// display details retrieved from XML document
function showDetail(evt) {
    evt = (evt) ? evt : ((window.event) ? window.event : null);
    var item, content, div;
    if (evt) {
        var select = (evt.target) ? evt.target : ((evt.srcElement) ? evt.srcElement : null);
        if (select && select.options.length > 1) {
            // copy <content:encoded> element text for
            // the selected item
            item = req.responseXML.getElementsByTagName("item")[select.value];
            content = getElementTextNS("content", "encoded", item, 0);
            div = document.getElementById("details");
            div.innerHTML = "";
            // blast new HTML content into "details" <div>
            div.innerHTML = content;
        }
    }
}

/*
**
** Eric Windelin
**
*/

function printStackTrace() {
  var callstack = [];
  var isCallstackPopulated = false;
  try {
    i.dont.exist+=0; //doesn't exist- that's the point
  } catch(e) {
    if (e.stack) { //Firefox
      var lines = e.stack.split("\n");
      for (var i=0, len=lines.length; i<len; i++) {
        if (lines[i].match(/^\s*[A-Za-z0-9\-_\$]+\(/)) {
          callstack.push(lines[i]);
        }
      }
      //Remove call to printStackTrace()
      callstack.shift();
      isCallstackPopulated = true;
    }
    else if (window.opera && e.message) { //Opera
      var lines = e.message.split("\n");
      for (var i=0, len=lines.length; i<len; i++) {
        if (lines[i].match(/^\s*[A-Za-z0-9\-_\$]+\(/)) {
          var entry = lines[i];
          //Append next line also since it has the file info
          if (lines[i+1]) {
            entry += " at " + lines[i+1];
            i++;
          }
          callstack.push(entry);
        }
      }
      //Remove call to printStackTrace()
      callstack.shift();
      isCallstackPopulated = true;
    }
  }
  if (!isCallstackPopulated) { //IE and Safari
    var currentFunction = arguments.callee.caller;
    while (currentFunction) {
      var fn = currentFunction.toString();
      var fname = fn.substring(fn.indexOf("function") + 8, fn.indexOf("(")) || "anonymous";
      callstack.push(fname);
      currentFunction = currentFunction.caller;
    }
  }
  output(callstack);
}

function output(arr) {
  //Optput however you want
  alert(arr.join("nn"));
}


/**
*
*  Base64 encode / decode
*  http://www.webtoolkit.info/
*
**/

var Base64 = {

    // private property
    _keyStr : "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",

    // public method for encoding
    encode : function (input) {
        var output = "";
        var chr1, chr2, chr3, enc1, enc2, enc3, enc4;
        var i = 0;

        input = Base64._utf8_encode(input);

        while (i < input.length) {

            chr1 = input.charCodeAt(i++);
            chr2 = input.charCodeAt(i++);
            chr3 = input.charCodeAt(i++);

            enc1 = chr1 >> 2;
            enc2 = ((chr1 & 3) << 4) | (chr2 >> 4);
            enc3 = ((chr2 & 15) << 2) | (chr3 >> 6);
            enc4 = chr3 & 63;

            if (isNaN(chr2)) {
                enc3 = enc4 = 64;
            } else if (isNaN(chr3)) {
                enc4 = 64;
            }

            output = output +
            this._keyStr.charAt(enc1) + this._keyStr.charAt(enc2) +
            this._keyStr.charAt(enc3) + this._keyStr.charAt(enc4);

        }

        return output;
    },

    // public method for decoding
    decode : function (input) {
        var output = "";
        var chr1, chr2, chr3;
        var enc1, enc2, enc3, enc4;
        var i = 0;

        input = input.replace(/[^A-Za-z0-9\+\/\=]/g, "");

        while (i < input.length) {

            enc1 = this._keyStr.indexOf(input.charAt(i++));
            enc2 = this._keyStr.indexOf(input.charAt(i++));
            enc3 = this._keyStr.indexOf(input.charAt(i++));
            enc4 = this._keyStr.indexOf(input.charAt(i++));

            chr1 = (enc1 << 2) | (enc2 >> 4);
            chr2 = ((enc2 & 15) << 4) | (enc3 >> 2);
            chr3 = ((enc3 & 3) << 6) | enc4;

            output = output + String.fromCharCode(chr1);

            if (enc3 != 64) {
                output = output + String.fromCharCode(chr2);
            }
            if (enc4 != 64) {
                output = output + String.fromCharCode(chr3);
            }

        }

        output = Base64._utf8_decode(output);

        return output;

    },

    // private method for UTF-8 encoding
    _utf8_encode : function (string) {
        string = string.replace(/\r\n/g,"\n");
        var utftext = "";

        for (var n = 0; n < string.length; n++) {

            var c = string.charCodeAt(n);

            if (c < 128) {
                utftext += String.fromCharCode(c);
            }
            else if((c > 127) && (c < 2048)) {
                utftext += String.fromCharCode((c >> 6) | 192);
                utftext += String.fromCharCode((c & 63) | 128);
            }
            else {
                utftext += String.fromCharCode((c >> 12) | 224);
                utftext += String.fromCharCode(((c >> 6) & 63) | 128);
                utftext += String.fromCharCode((c & 63) | 128);
            }

        }

        return utftext;
    },

    // private method for UTF-8 decoding
    _utf8_decode : function (utftext) {
        var string = "";
        var i = 0;
        var c = c1 = c2 = 0;

        while ( i < utftext.length ) {

            c = utftext.charCodeAt(i);

            if (c < 128) {
                string += String.fromCharCode(c);
                i++;
            }
            else if((c > 191) && (c < 224)) {
                c2 = utftext.charCodeAt(i+1);
                string += String.fromCharCode(((c & 31) << 6) | (c2 & 63));
                i += 2;
            }
            else {
                c2 = utftext.charCodeAt(i+1);
                c3 = utftext.charCodeAt(i+2);
                string += String.fromCharCode(((c & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63));
                i += 3;
            }

        }

        return string;
    }

}
