// ******************************************************
//
//   StageTrack Global JS Library
//   written by Digital Propulsion Labs
//   Copyright 2010 Digital Propulsion Labs *unless otherwise specified*
//	 version 0.4.2 - 08/11/2010
//
//
//   v0.4.2	- Added field validation regexp's
//			  Added listLen function
//   v0.4.1	- Continued Development
//			  Added roundCorners proc
//   v0.4	- Inital Release
//   v0.3	- Added Date name arrays
//   v0.1	- Created
//
// ******************************************************

//
var proxiedSites = new Array('tweetphoto.com','moby.to','yfrog.com','yfrog.us','twitpic.com','plixi.com','t.co');
	//'yfrog.com','yfrog.us','twitpic.com' ** in the works
	//,'twitc.com','twitrpix.com','twitgoo.com','twic.li','moby.to','mobypicture.com','ow.ly','smugmug.com','posterous.com','flickr.com');

// date defs
// ** FUTURE; should be loaded dynamically for localization?
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");

// regular expressions used for field validation
var validationRegExp = {
	email: /^([a-zA-Z0-9_\-\.]+)@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([a-zA-Z0-9\-]+\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)$/,
	text: /[^0-9+]/,
	numbers: /[0-9]+/,
	dateShort: '^(?:(?:31(\/|-|\.)(?:0?[13578]|1[02]))\1|(?:(?:29|30)(\/|-|\.)(?:0?[1,3-9]|1[0-2])\2))(?:(?:1[6-9]|[2-9]\d)?\d{2})$|^(?:29(\/|-|\.)0?2\3(?:(?:(?:1[6-9]|[2-9]\d)?(?:0[48]|[2468][048]|[13579][26])|(?:(?:16|[2468][048]|[3579][26])00))))$|^(?:0?[1-9]|1\d|2[0-8])(\/|-|\.)(?:(?:0?[1-9])|(?:1[0-2]))\4(?:(?:1[6-9]|[2-9]\d)?\d{2})$',
	dateLong: '',
	time: /^(([0-1]?[0-9])|([2][0-3])):([0-5]?[0-9])(:([0-5]?[0-9]))?$/,
}

var regexp = {
	time: /(([0-1]?[0-9])|([2][0-3])):([0-5]?[0-9])(:([0-5]?[0-9]))?/gi,
	dateTime: /((((19|20)(([02468][048])|([13579][26]))-02-29))|((20[0-9][0-9])|(19[0-9][0-9]))-((((0[1-9])|(1[0-2]))-((0[1-9])|(1\d)|(2[0-8])))|((((0[13578])|(1[02]))-31)|(((0[1,3-9])|(1[0-2]))-(29|30)))))\s(([0-1]?[0-9])|([2][0-3])):([0-5]?[0-9])(:([0-5]?[0-9]))?/gi,
	url: /[a-z]+:\/\/(\w+:{0,1}\w*@)?(\S+)(:[0-9]+)?(\/|\/([\w#!:\.?+=&%@!\-\/]))?/gi,
	latlng: /fd/gi
}


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;
}

// v.3
//	20100207 - added POST Method
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.setRequestHeader("Content-type", "text/xml");
		if (args.length >= 2)
			var frmHndl = getCtrlHandle(args[1]);

		if (frmHndl.method.toUpperCase() == "POST")
		{
			var strFormData = compileFormData(frmHndl.name);
			alert(strFormData);
			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("GET", reqURL, false);
			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 = "", debugPostData = "";
	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 || fTagName.indexOf("textarea") > -1 || frmfields.item(c).value) {
			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 && frmfields.item(c).selectedIndex > 0) {
			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
	strPostData = "";
	//alert(debugPostData);

	if (args[1] != "array" && args[1] != "object") {
		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 strPostDatal;
	}
	else if (args[1] == "object")
	{
		var dobj = new Object;
		for (x=0;x<da.length;x+=2)
			dobj[da[x]] = da[x+1];
		return dobj;
	}
	
	return da;

}

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;
}

// v2
/*
function simpleJSONRequest(url,async,compfunc) {
	var args = simpleJSONRequest.arguments;
	if (typeof(async) == "function")
	{
	    compfunc = async;
	    async = true;
	}
	// branch for native XMLHttpRequest object
	var htreq = getXMLRequestHndl()
	if (htreq && args.length > 1) {
		htreq.onreadystatechange = function () {
			// only if req ready
			if (htreq.readyState == 4) {
				if (htreq.status == 200)
					compfunc(JSON.parse(htreq.responseText),'success');
				else
					compfunc("("+htreq.status+") " + htreq.statusText,'error');
			}
		};
		
		// 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", url, async);
		if (window.ActiveXObject)
			htreq.send();
		else
			htreq.send(null);

	}
	return true;
}
*/

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;
}

// v.3
function simpleSynRequest() {
	var args = simpleSynRequest.arguments;
	var reqURL = args[0];

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

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

		htreq.open("GET", reqURL, false);

		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) {
			if (htreq.status == 200) {
				return htreq;
			} else {
				throw "Data request failed.";	
			}
		}

	}

	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 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);
}

function shortenName(name)
{
	var names = name.split(" ");
	return names[0].substr(0,1)+". "+names[1];
}

/*
****************************************
 	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, "");
}



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

	DateTime Functions
	
 *******************************************************************************/

function normalizeDateTime(dt)
{
	var dpart = dt.split(" ")[0].replace("-","/");
	var tparts = dt.split(" ")[1].split(":");
	var ndate = new Date(dpart);
	ndate.setTime( (tparts[0] * 60 * 1000) + (tparts[1] * 60 * 1000) + (tparts[2] * 1000) );
	return ndate;
}

function mysqlTimeStampToDate(timestamp) {
    //function parses mysql datetime string and returns javascript Date object
    //input has to be in this format: 2007-06-05 15:26:02
    var regex=/^([0-9]{2,4})-([0-1][0-9])-([0-3][0-9]) (?:([0-2][0-9]):([0-5][0-9]):([0-5][0-9]))?$/;
    var parts=timestamp.replace(regex,"$1 $2 $3 $4 $5 $6").split(' ');
    return new Date(parts[0],parts[1]-1,parts[2],parts[3],parts[4],parts[5]);
}


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

	List Functions
	Description: Functions to deal with text lists
	
 *******************************************************************************/

// removes a given value from the given list	
function listDelete() {
	var list = listDelete.arguments[0];
	var val = listDelete.arguments[1];
	var delim = listDelete.arguments[2];

	var tl = list.split(delim);
	for (c=0;c<=(tl.length-1);c++) list = (c == 0 ? "" : list) + (tl[c] == val ? "" : tl[c] + (c == (tl.length-1) ? "" : delim) );
	if (list.lastIndexOf(delim) == list.length-1) list = list.substr(0,list.length - 1);

	return list;
}

// adds item from the given list	
function listAppend() {
	var list = listAppend.arguments[0];
	var val = listAppend.arguments[1];
	var delim = listAppend.arguments[2];

	if (list.length == 0) return val;

	if ((list.lastIndexOf(delim)+1) == list.length) {
		list = list + val;
	} else {
		list = list + delim + val;
	}

	return list;
}

function listGetAt() {
	var list = listGetAt.arguments[0];
	var pos = listGetAt.arguments[1];
	var delim = listGetAt.arguments[2];
	var val = "";
	
	return (list.length > 0 ? list.split(delim)[pos-1] : "");
}

// ** doesn't ignore blank items
function listLen(list,delim) {
	return (list==null || list == "" ? 0 : list.split(delim).length);
}

//

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;
}

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

// 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";
    }
}

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

	Debugging Functions (Eric Windelin)
	Description: Functions to deal with script debugging
	
 *******************************************************************************/

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;
    }

}

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

	jQuery Extension Functions
	
 *******************************************************************************/
/*
(function($){
     $.fn.extend({
          center: function (options) {
               var options =  $.extend({ // Default values
                    inside:window, // element, center into window
                    transition: 0, // millisecond, transition time
                    minX:0, // pixel, minimum left element value
                    minY:0, // pixel, minimum top element value
                    vertical:true, // booleen, center vertical
                    withScrolling:true, // booleen, take care of element inside scrollTop when minX < 0 and window is small or when window is big
                    horizontal:true // booleen, center horizontal
               }, options);
               return this.each(function() {
                    var props = {position:'absolute'};
                    if (options.vertical) {
                         var top = ($(options.inside).height() - $(this).outerHeight()) / 2;
                         if (options.withScrolling) top += $(options.inside).scrollTop() || 0;
                         top = (top > options.minY ? top : options.minY);
                         $.extend(props, {top: top+'px'});
                    }
                    if (options.horizontal) {
                          var left = ($(options.inside).width() - $(this).outerWidth()) / 2;
                          if (options.withScrolling) left += $(options.inside).scrollLeft() || 0;
                          left = (left > options.minX ? left : options.minX);
                          $.extend(props, {left: left+'px'});
                    }
                    if (options.transition > 0) $(this).animate(props, options.transition);
                    else $(this).css(props);
                    return $(this);
               });
          }
     });
})(jQuery);
*/
