var TIME = 1;
var DATE = 2;

///Convenience converters
function chk(chk) {
	return chk?" checked":"";
}

function slct(sel) {
	return sel?" selected":"";
}

///Tests
function isEmptyString(str) {
	return (str=="" || str==null);
}

///Converters

/*Convert from unbounded real number to bounded real number*/
function numToBounded(num, lowerBound, upperBound) {
	if (isNaN(num) || num > upperBound) {
		return upperBound;
	}
	if (num < lowerBound) {
		return lowerBound;
	}
	return num;
}

/*Convert from anything to SQL string*/
function toSqlString(toChange) {
	if (toChange==null) {
		toChange = "";
	}
	toChange = toChange + "";
	re = /\'/gi; /*'*/
	return toChange.replace(re, "\'\'");
}

function toSqlStringFull(val) {
	if (val==null || val=="") { return "NULL"; }
	if (typeof(val)=="number") {
		return "'" +val+ "'";
	}
	///Quote comma so it doesn't interfere with separators'
	val = val.replace(/,/gi, "\\,");
	val = val.replace(/(\r\n|\n)/gi, "\\\n");
	return "'" + toSqlString(val) + "'";
}

/*Convert from anything to SQL Search string*/
function toSqlSearchString(toChange) {
	var str;
	re = /([[%_])/gi;
	str = toChange.replace(re, "\[$1\]");
	str = toSQLString(str);
	return str;
}

/* Converts the date to a version suitable for SQL Statements. */
function toSqlDate(cDate, include) {
	if (typeof(cDate)=="date") {
		cDate = new Date(cDate);
	}
	if (cDate==null || typeof(cDate)!="object") {
		return "NULL";
	}
	cDate = new Date(cDate.getTime()+1);
	var str = "#";
	if (!include || (include&DATE)) {
		str += (cDate.getMonth()+1) + "/" + cDate.getDate() + "/" + cDate.getFullYear();
	}
	if ( include && (include&(DATE|TIME)) ) {
		str += " ";
	}
	if ( include && (include&TIME) ) {
		str += cDate.getHours() + ":" + cDate.getMinutes() + ":" + cDate.getSeconds();
	}
	str += "#";
	return str;
}

/* Converts the number to a version suitable for SQL Statements. */
function toSqlNumber(num) {
	if (typeof(num)=="Number") {
		return num;
	}
	else if (num && !isNaN(num)) {
		return Number(num);
	}
	else {
		return "NULL";
	}
}

/*Convert from anything to Html string*/
function toHtmlString(toChange) {
	if (toChange!=0 && (toChange==null || toChange=="")) {
		return "";
	}
	if (typeof(Server)=="undefined") {
		toChange = String(toChange);
		toChange = toChange.replace(/&/g, "&amp;");
		toChange = toChange.replace(/</g, "&lt;");
		toChange = toChange.replace(/>/g, "&gt;");
		toChange = toChange.replace(/"/g, "&quot;");
	}
	else {
		toChange = Server.HTMLEncode(String(toChange));
	}
	return toChange;
}

/*Convert from anything to URL string*/
function toUrlString(toChange) {
	if (!toChange) {
		return "";
	}
	toChange = Server.URLEncode(String(toChange));
	return toChange;
}

/* Check that number really is a number. */
function toNumber(numValue, returnOnError) {
	if (typeof(numValue)=="number") {
		return numValue;
	}
	return returnOnError;
}

/* Check that string really is a string. */
function toString(strValue, returnOnError) {
	if (typeof(strValue)=="string") {
		return String(strValue);
	}
	return returnOnError;
}

/* Check that date is really a date. */
function toDate(dateValue, returnOnError) {
	if (dateValue==null) {
		return returnOnError;
	}
	return new Date(dateValue);
}

/*Converts form elements refed by the form element names
	to particular types based on standard formatting of widgets*/
function formElNameToValue(formInput, returnType) {
	switch (returnType) {
		case 11: //adBoolean
			return formElNameToBoolean(formInput);
		break;
		///FIX: need to fix the following for proper handling of time/date
		case 133: //adDBDate
			return formElNameToDate(formInput);
		break;
		/*case 134: //adDBTime
			return null;
		break;*/
		case 135: //adDBTimeStamp
		case 7: //adDate
			return formElNameToDate(formInput);
		break;
		case 131: //adNumeric
		case 20: //adBigInt
		case 14: //adDecimal
		case 5: //adDouble
		case 3: //adInteger
		case 4: //adSingle
		case 2: //adSmallInt
		case 16: //adTinyInt
		case 21: //adUnsignedBigInt
		case 19: //adUnsignedInt
		case 18: //adUnsignedSmallInt
		case 17: //adUnsignedTinyInt
			return formElNameToNumber(formInput, 0);
		break;
		case 201: //adLongVarChar
		case 129: //adChar
		default:
			return formElNameToString(formInput, null);
		break;
	}
}

/*Converts form elements refed by the form element names
	to particular types based on standard formatting of widgets*/
function formElNameToRsValue(formInput, returnType) {
	switch (returnType) {
		case 11: //adBoolean
			return formElNameToBoolean(formInput);
		break;
		case 133: //adDBDate
			return formElNameToRsDate(formInput);
		break;
		/*case 134: //adDBTime
			return null;
		break;*/
		case 135: //adDBTimeStamp
		case 7: //adDate
			return formElNameToRsDate(formInput);
		break;
		case 6: //adCurrency
			return formElNameToRsCurrency(formInput);
		break;
		case 131: //adNumeric
		case 20: //adBigInt
		case 14: //adDecimal
		case 5: //adDouble
		case 3: //adInteger
		case 4: //adSingle
		case 2: //adSmallInt
		case 16: //adTinyInt
		case 21: //adUnsignedBigInt
		case 19: //adUnsignedInt
		case 18: //adUnsignedSmallInt
		case 17: //adUnsignedTinyInt
			return formElNameToNumber(formInput, 0);
		break;
		case 201: //adLongVarChar
		case 129: //adChar
		default:
			return formElNameToString(formInput, null);
		break;
	}
}

/*Converts form values refed by the form element names
	to particular types based on standard formatting of widgets*/
function formValueToSqlValue(formInput, returnType) {
	returnType = Number(returnType);
	switch (returnType) {
		case 11: //adBoolean
			return Boolean(formInput);
		break;
		case 133: //adDBDate
			return toSqlDate(valueToDate(formInput));
		break;
		/*case 134: //adDBTime
			return null;
		break;*/
		case 135: //adDBTimeStamp
		case 7: //adDate
			return toSqlDate(valueToDate(formInput));
		break;
		case 131: //adNumeric
		case 20: //adBigInt
		case 14: //adDecimal
		case 5: //adDouble
		case 3: //adInteger
		case 6: //adCurrency
		case 4: //adSingle
		case 2: //adSmallInt
		case 16: //adTinyInt
		case 21: //adUnsignedBigInt
		case 19: //adUnsignedInt
		case 18: //adUnsignedSmallInt
		case 17: //adUnsignedTinyInt
			return toSqlNumber(formInput);
		break;
		case 201: //adLongVarChar
		case 129: //adChar
		default:
			return "'" +toSqlString(formInput, null)+ "'";
		break;
	}
}

function stringToHtmlJsString(val) {
	if (val==null) { return "null"; }
	val = val.replace(/"/gi, '\\"');
	val = val.replace(/'/gi, "\\'");
	///Quote comma for convenience
	val = val.replace(/,/gi, "\\,");
	val = val.replace(/\n/gi, '\\n');
	return '"' +val+ '"';
}

var toJsString = stringToHtmlJsString;

function jsValueToRsValue(val) {
	if (val && val.getTime) {
		return toRsDate(val);
	}
	return val;
}

/*Converts from objects in a particular rs type to client side js conversion string*/
function rsValueToClientJsValue(val, returnType) {
	if (val==null) {
		return '""';
	}
	switch (returnType) {
		case 11: //adBoolean
			return 'new Boolean('+val+')';
		break;
		///FIX: need to fix the following for proper handling of time/date
		case 133: //adDBDate
			return 'new Date("'+new Date(val)+'")';
		break;
		/*case 134: //adDBTime
			return null;
		break;*/
		case 135: //adDBTimeStamp
		case 7: //adDate
			return 'new Date("'+new Date(val)+'")';
		break;
		case 131: //adNumeric
		case 20: //adBigInt
		case 14: //adDecimal
		case 5: //adDouble
		case 3: //adInteger
		case 4: //adSingle
		case 2: //adSmallInt
		case 16: //adTinyInt
		case 21: //adUnsignedBigInt
		case 19: //adUnsignedInt
		case 18: //adUnsignedSmallInt
		case 17: //adUnsignedTinyInt
			return val;
		break;
		case 201: //adLongVarChar
		case 129: //adChar
		default:
			return '"'+String(val).replace(/[ \t]+/g, " ")+'"';
		break;
	}
}

/* Convert from Input Element to Number */
function inputElementToNumber(formInput, returnOnBlank, returnOnAbsent) {
	if (typeof(returnOnAbsent)=="undefined") {
		returnOnAbsent = returnOnBlank;
	}
	if (formInput.Count==1) {
		if (formInput=="") {
			return returnOnBlank;
		}
		num = Number(formInput);
		if (!isNaN(num)) {
			return num;
		}
		return returnOnBlank;
	}
	return returnOnAbsent;
}

/* Convert from Input Element to Number List */
function inputElementToNumberList(formInput, returnOnBlank, returnOnAbsent) {
	if (typeof(returnOnAbsent)=="undefined") {
		returnOnAbsent = returnOnBlank;
	}
	if (formInput.Count>=1) {
		var lst = new Array();
		for (var i=1; i<=formInput.Count; i++) {
			lst.push(Number(formInput(i)));
		}
		return lst;
	}
	return returnOnBlank;
}

/* Convert from Input Element to String */
function inputElementToString(formInput, returnOnBlank, returnOnAbsent) {
	if (typeof(returnOnAbsent)=="undefined") {
		returnOnAbsent = returnOnBlank;
	}
	if (String(formInput)=="") {
		return returnOnBlank;
	}
	if (formInput.Count==1) {
		str = String(formInput);
		return str;
	}
	return returnOnAbsent;
}

/* Convert from Input Element to String List */
function inputElementToStringList(formInput, returnOnBlank, returnOnAbsent) {
	if (typeof(returnOnAbsent)=="undefined") {
		returnOnAbsent = returnOnBlank;
	}
	if (formInput.Count>=1) {
		var lst = new Array();
		for (var i=1; i<=formInput.Count; i++) {
			lst.push(String(formInput(i)));
		}
		return lst;
	}
	return returnOnBlank;
}

/* Convert from Input Element to Boolean */
function inputElementToBoolean(formInput, returnOnBlank, returnOnAbsent) {
	if (typeof(returnOnAbsent)=="undefined") {
		returnOnAbsent = returnOnBlank;
	}
	if (formInput.Count==1) {
		if ((formInput=="true" || formInput=="on" || formInput=="yes" || formInput!=0)) {
			return true;
		}
		return false;
	}
	else {
		return returnOnAbsent;
	}
}

/* Convert from value (String) to Date */
function valueToDate(formInput, returnOnBlank, dontConvertToTz) {
	if (!returnOnBlank) { returnOnBlank = null; }
	var dt = String(formInput);
	var found;
	found = dt.match(/UTC/);
	if (found) {
		var dt2 = new Date(dt);
		return dt2;
	}
	///Match day/month/year
	found = dt.match(/^[^0-9]*([0-9]+)[^0-9]+([0-9]+)[^0-9]+([0-9]+)/);
	if (found) {
		var dt2 = new Date(found[3], found[2]-1, found[1]);
		if (!dontConvertToTz) {
			dt2 = dt2.getTzDate(tz, localTz);
		}
		return dt2;
	}
	///Match day/month
	found = dt.match(/^[^0-9]*([0-9]+)[^0-9]+([0-9]+)/)
	if (found) {
		var dt2 = new Date((new Date()).getFullYear(), found[2]-1, found[1]);
		if (!dontConvertToTz) {
			dt2 = dt2.getTzDate(tz, localTz);
		}
		return dt2;
	}
	return returnOnBlank;
}

/* Convert from value (String) to Date */
function valueToTime(formInput, returnOnBlank) {
	if (!returnOnBlank) { returnOnBlank = null; }
	var tm = String(formInput);
	///Match hrs/mins/secs
	var found = tm.match(/^[^0-9]*([0-9]+)[^0-9]+([0-9]+)[^0-9]+([0-9]+)/);
	if (found) {
		var dt2 = new Date(1970,0,1);
		dt2.setHours(found[1]);
		dt2.setMinutes(found[2]);
		dt2.setSeconds(found[3]);
		return dt2;
	}
	///Match hrs/mins
	var found = tm.match(/^[^0-9]*([0-9]+)[^0-9]+([0-9]+)/);
	if (found) {
		var dt2 = new Date(1970,0,1);
		dt2.setHours(found[1]);
		dt2.setMinutes(found[2]);
		return dt2;
	}
	return returnOnBlank;
}

/* Convert from value (String) to Date */
function valueToDateTime(formInput, returnOnBlank) {
	if (!returnOnBlank) { returnOnBlank = null; }
	var dt = String(formInput);
	if (dt.search(/UTC/)!=-1) {
		return new Date(dt);
	}
	var dtTm = trimWs(dt).split(/[ \t]/);
	var retDt = valueToDate(dtTm[0], returnOnBlank, true);
	if (retDt==returnOnBlank) {
		return returnOnBlank;
	}
	if (dtTm[1]) {
		var retTm = valueToTime(dtTm[1], returnOnBlank);
		if (retTm==returnOnBlank) {
			return returnOnBlank;
		}
		retDt.setHours(retTm.getHours());
		retDt.setMinutes(retTm.getMinutes());
		retDt.setSeconds(retTm.getSeconds());
	}

	retDt = retDt.getTzDate(tz, localTz);

	return retDt;
}

/* Convert from Form Element Name to Sql Date */
function formElNameToSqlDate(comName, returnOnBlank, returnOnAbsent) {
	if (!returnOnBlank) { returnOnBlank = null; }
	if (typeof(returnOnAbsent)=="undefined") { returnOnAbsent = returnOnBlank; }
	if (requestForm(comName).count==1) {
		var dt = valueToDate(String(requestForm(comName)), returnOnBlank);
		if (dt) {
			return toRsDate(dt);
		}
		return dt;
	}
	return returnOnAbsent;
}

/* Convert from Form Element Name to Sql Date */
function formElNameToRsDate(comName, returnOnBlank, returnOnAbsent) {
	if (!returnOnBlank) { returnOnBlank = null; }
	if (typeof(returnOnAbsent)=="undefined") { returnOnAbsent = returnOnBlank; }
	if (requestForm(comName).count==1) {
		var dt = valueToDate(String(requestForm(comName)), returnOnBlank);
		if (dt) {
			return toRsDate(dt);
		}
		return dt;
	}
	return returnOnAbsent;
}

/* Convert from Form Element Name to Sql Date */
function formElNameToRsCurrency(comName, returnOnBlank, returnOnAbsent) {
	return currencyStringToNumber(
		formElNameToString(comName, returnOnBlank, returnOnAbsent),
		returnOnBlank,
		returnOnAbsent
	);
}

function inputElementToDate(val, returnOnBlank, returnOnAbsent) {
	return valueToDate(val, returnOnBlank, returnOnAbsent);
}

var dateStringToDate = valueToDate;
var dateTimeStringToDate = valueToDateTime;
var stringToDate = valueToDateTime;

function currencyStringToNumber(val, returnOnBlank, returnOnAbsent) {
	if (typeof(val)=="number") { return val; }
	if (val == null) { return returnOnBlank; }
	val = val.replace(/^\$/, "");
	val = val.replace(/,/, "");
	return Number(val);
}

var currencyToNumber = currencyStringToNumber;

/* Convert from Form Element Name to Number */
function formElNameToNumber(comName, returnOnBlank, returnOnAbsent) {
	if (typeof(returnOnBlank)=="undefined") { returnOnBlank = 0; }
	if (typeof(returnOnAbsent)=="undefined") { returnOnAbsent = returnOnBlank; }
	if (requestForm(comName).count==1) {
		return inputElementToNumber(requestForm(comName), returnOnBlank, returnOnAbsent);
	}
	return returnOnAbsent;
}

/* Convert from Form Element Name to Number List */
function formElNameToNumberList(comName, returnOnBlank, returnOnAbsent) {
	return inputElementToNumberList(requestForm(comName), returnOnBlank, returnOnAbsent);
}

/* Convert from Form Element Name to String */
function formElNameToString(comName, returnOnBlank, returnOnAbsent) {
	if (typeof(returnOnBlank)=="undefined") { returnOnBlank = null; }
	if (typeof(returnOnAbsent)=="undefined") { returnOnAbsent = returnOnBlank; }
	if (requestForm(comName).count==1) {
		return inputElementToString(requestForm(comName), returnOnBlank, returnOnAbsent);
	}
	return returnOnAbsent;
}

/* Convert from Form Element Name to String List */
function formElNameToStringList(comName, returnOnBlank, returnOnAbsent) {
	return inputElementToStringList(requestForm(comName), returnOnBlank, returnOnAbsent);
}

/* Convert from Form Element Name to Boolean */
function formElNameToBoolean(comName, returnOnBlank, returnOnAbsent) {
	if (typeof(returnOnBlank)=="undefined") { returnOnBlank = false; }
	if (typeof(returnOnAbsent)=="undefined") { returnOnAbsent = returnOnBlank; }
	if (requestForm(comName).count==1) {
		return inputElementToBoolean(requestForm(comName), returnOnBlank, returnOnAbsent);
	}
	else if (requestForm(comName).count>1) {
		return true;
	}
	return returnOnAbsent;
}

/* Convert from Form Element Name to Date */
function formElNameToDate(comName, returnOnBlank, returnOnAbsent) {
	if (typeof(returnOnBlank)=="undefined") { returnOnBlank = null; }
	if (typeof(returnOnAbsent)=="undefined") { returnOnAbsent = returnOnBlank; }
	if (requestForm(comName).count==1) {
		return inputElementToDate(requestForm(comName), returnOnBlank, returnOnAbsent);
	}
	return returnOnAbsent;
}

/* Convert from Form/Query/Cookie Name to String */
function fqcElNameToDate(comName, returnOnBlank, returnOnAbsent, dontSaveToCookie) {
	if (requestForm(comName).Count==1) {
		var dt = formElNameToDate(comName, returnOnBlank, returnOnAbsent);
		if (!dontSaveToCookie) {
			Response.Cookies(comName) = dt?dt.toUTCString():"null";
			Response.Cookies(comName).Path = "/";
		}
		return dt;
	}
	if (Request.QueryString(comName).Count==1) {
		var dt = queryElNameToDate(comName, returnOnBlank, returnOnAbsent);
		if (!dontSaveToCookie) {
			Response.Cookies(comName) = dt?dt.toUTCString():"null";
			Response.Cookies(comName).Path = "/";
		}
		return dt;
	}
	if (Request.Cookies(comName)!="") {
		if (Request.Cookies(comName)!="null") {
			return new Date(Date.parse(Request.Cookies(comName)));
		}
		return returnOnBlank;
	}
	return returnOnAbsent;
}

/* Convert from Query Element Name to Number */
function queryElNameToNumber(comName, returnOnBlank, returnOnAbsent) {
	if (typeof(returnOnBlank)=="undefined") { returnOnBlank = 0; }
	if (typeof(returnOnAbsent)=="undefined") { returnOnAbsent = returnOnBlank; }
	if (Request.QueryString(comName).count==1) {
		return inputElementToNumber(Request.QueryString(comName), returnOnBlank, returnOnAbsent);
	}
	return returnOnAbsent;
}

/* Convert from Query Element Name to Number List*/
function queryElNameToNumberList(comName, returnOnBlank, returnOnAbsent) {
	if (typeof(returnOnAbsent)=="undefined") { returnOnAbsent = returnOnBlank; }
	if (Request.QueryString(comName).count>=1) {
		return inputElementToNumberList(Request.QueryString(comName), returnOnBlank, returnOnAbsent);
	}
	return returnOnAbsent;
}

/* Convert from Query Element Name to String */
function queryElNameToString(comName, returnOnBlank, returnOnAbsent) {
	if (typeof(returnOnBlank)=="undefined") { returnOnBlank = null; }
	if (typeof(returnOnAbsent)=="undefined") { returnOnAbsent = returnOnBlank; }
	if (Request.QueryString(comName).count==1) {
		return inputElementToString(Request.QueryString(comName), returnOnBlank, returnOnAbsent);
	}
	return returnOnAbsent;
}

/* Convert from Query Element Name to String List*/
function queryElNameToStringList(comName, returnOnBlank, returnOnAbsent) {
	if (typeof(returnOnAbsent)=="undefined") { returnOnAbsent = returnOnBlank; }
	if (Request.QueryString(comName).count>=1) {
		return inputElementToStringList(Request.QueryString(comName), returnOnBlank, returnOnAbsent);
	}
	return returnOnAbsent;
}

/* Convert from Query Element Name to Boolean */
function queryElNameToBoolean(comName, returnOnBlank, returnOnAbsent) {
	if (typeof(returnOnBlank)=="undefined") { returnOnBlank = false; }
	if (typeof(returnOnAbsent)=="undefined") { returnOnAbsent = returnOnBlank; }
	if (Request.QueryString(comName).count==1) {
		return inputElementToBoolean(Request.QueryString(comName), returnOnBlank, returnOnAbsent);
	}
	return returnOnAbsent;
}

/* Convert from Query Element Name to Date */
function queryElNameToDate(comName, returnOnBlank, returnOnAbsent) {
	if (typeof(returnOnBlank)=="undefined") { returnOnBlank = null; }
	if (typeof(returnOnAbsent)=="undefined") { returnOnAbsent = returnOnBlank; }
	if (Request.QueryString(comName).count==1) {
		return inputElementToDate(Request.QueryString(comName), returnOnBlank, returnOnAbsent);
	}
	return returnOnAbsent;
}

/* Convert from Form/Query Element Name to Number */
function fqElNameToNumber(comName, returnOnBlank, returnOnAbsent) {
	if (requestForm(comName).Count==1) {
		return formElNameToNumber(comName, returnOnBlank, returnOnAbsent);
	}
	return queryElNameToNumber(comName, returnOnBlank, returnOnAbsent);
}

/* Convert from Form/Query Element Name to Number List */
function fqElNameToNumberList(comName, returnOnBlank, returnOnAbsent) {
	if (requestForm(comName).Count>=1) {
		return formElNameToNumberList(comName, returnOnBlank, returnOnAbsent);
	}
	return queryElNameToNumberList(comName, returnOnBlank, returnOnAbsent);
}

/* Convert from Form/Query Element Name to String */
function fqElNameToString(comName, returnOnBlank, returnOnAbsent) {
	if (requestForm(comName).Count==1) {
		return formElNameToString(comName, returnOnBlank, returnOnAbsent);
	}
	return queryElNameToString(comName, returnOnBlank, returnOnAbsent);
}

/* Convert from Form/Query Element Name to Number List */
function fqElNameToNumberList(comName, returnOnBlank, returnOnAbsent) {
	if (requestForm(comName).Count>=1) {
		return formElNameToNumberList(comName, returnOnBlank, returnOnAbsent);
	}
	return queryElNameToNumberList(comName, returnOnBlank, returnOnAbsent);
}

/* Convert from Form/Query/Cookie Name to String */
function fqcElNameToString(comName, returnOnBlank, returnOnAbsent, dontSaveToCookie) {
	if (requestForm(comName).Count==1) {
		var str = formElNameToString(comName, returnOnBlank, returnOnAbsent);
		if (!dontSaveToCookie) {
			Response.Cookies(comName) = str?str:"null";
			Response.Cookies(comName).Path = "/";
		}
		return str;
	}
	if (Request.QueryString(comName).Count==1) {
		var str = queryElNameToString(comName, returnOnBlank, returnOnAbsent);
		if (!dontSaveToCookie) {
			Response.Cookies(comName) = str?str:"null";
			Response.Cookies(comName).Path = "/";
		}
		return str;
	}
	if (Request.Cookies(comName)!="") {
		if (Request.Cookies(comName)!="null") {
			return String(Request.Cookies(comName));
		}
		return returnOnBlank;
	}
	return returnOnAbsent;
}

/* Convert from Form/Query Element Name to Boolean */
function fqElNameToBoolean(comName, returnOnBlank, returnOnAbsent) {
	if (requestForm(comName).Count==1) {
		return formElNameToBoolean(comName, returnOnBlank, returnOnAbsent);
	}
	return queryElNameToBoolean(comName, returnOnBlank, returnOnAbsent);
}

/* Convert from Form/Query Element Name to Date */
function fqElNameToDate(comName, returnOnBlank, returnOnAbsent) {
	if (requestForm(comName).Count==1) {
		return formElNameToDate(comName, returnOnBlank, returnOnAbsent);
	}
	return queryElNameToDate(comName, returnOnBlank, returnOnAbsent);
}

/* Convert from Query/Form Element Name to Number */
function qfElNameToNumber(comName, returnOnBlank, returnOnAbsent) {
	if (Request.QueryString(comName).Count==1) {
		return queryElNameToNumber(comName, returnOnBlank, returnOnAbsent);
	}
	return formElNameToNumber(comName, returnOnBlank, returnOnAbsent);
}

/* Convert from Query/Form Element Name to Number List */
function qfElNameToNumberList(comName, returnOnBlank, returnOnAbsent) {
	if (Request.QueryString(comName).Count>=1) {
		return queryElNameToNumberList(comName, returnOnBlank, returnOnAbsent);
	}
	return formElNameToNumberList(comName, returnOnBlank, returnOnAbsent);
}

/* Convert from Query/Form Element Name to String */
function qfElNameToString(comName, returnOnBlank, returnOnAbsent) {
	if (Request.QueryString(comName).Count==1) {
		return queryElNameToString(comName, returnOnBlank, returnOnAbsent);
	}
	return formElNameToString(comName, returnOnBlank, returnOnAbsent);
}

/* Convert from Query/Form Element Name to Number List */
function qfElNameToStringList(comName, returnOnBlank, returnOnAbsent) {
	if (Request.QueryString(comName).Count>=1) {
		return queryElNameToStringList(comName, returnOnBlank, returnOnAbsent);
	}
	return formElNameToStringList(comName, returnOnBlank, returnOnAbsent);
}

/* Convert from Query/Form Element Name to Boolean */
function qfElNameToBoolean(comName, returnOnBlank, returnOnAbsent) {
	if (Request.QueryString(comName).Count==1) {
		return queryElNameToBoolean(comName, returnOnBlank, returnOnAbsent);
	}
	return formElNameToBoolean(comName, returnOnBlank, returnOnAbsent);
}

/* Convert from Query/Form Element Name to Date */
function qfElNameToDate(comName, returnOnBlank, returnOnAbsent) {
	if (Request.QueryString(comName).Count==1) {
		return queryElNameToDate(comName, returnOnBlank, returnOnAbsent);
	}
	return formElNameToDate(comName, returnOnBlank, returnOnAbsent);
}

/* Converts from a record set value to a string. */
function rsStringToString(rsStr, returnOnBlank) {
	var str = rsStr.value;
	if (str==null || str=="") {
		return returnOnBlank;
	}
	return String(str);
}

/* Converts from a record set value to a Date. */
function rsDateToDate(rsDate, returnOnBlank) {
	if (typeof(returnOnBlank)=="undefined") { returnOnBlank = null; }
	var date = rsDate;
	if (date==null) {
		return returnOnBlank;
	}
	//Some quirk where date seems to be 1ms too low
	//all the time (when pulling from rs)
	return new Date((new Date(date)).getTime()+1);
}

/*For form values greater than 100K or so, use the following*/
function saveBigFormValues(saveObj, toSave) {
	var encodedStr = RSBinaryToString(Request.BinaryRead(Request.TotalBytes));
	var arrs = encodedStr.split("&");
	var val = "";
	for (var i=0; i<arrs.length; i++) {
		var found = arrs[i].match(/^([^=]*)=/);
		if (found && toSave[found[1]]) {
			saveObj[found[1]] = unescape(arrs[i].substr(found[1].length+1, arrs[i].length-found[1].length-1).replace(/\+/g, " "));
		}
	}
}

/*Allows easy creation of an object, with properties*/
function newObject() {
	var obj = new Object();
	for (var i=0; i<newObject.arguments.length; i+=2) {
		obj[newObject.arguments[i]] = newObject.arguments[i+1];
	}
	return obj;
}

/* Check that number really is a number. */
function toNumber(numValue, returnOnBlank) {
	if (typeof(numValue)=="number") {
		return numValue;
	}
	return returnOnBlank;
}

/* Extract number from string. */
function stringToNumber(numValue, returnOnBlank) {
	return Number(String(numValue).matchSingle( /([0-9.-]+)/ ));
}

/* Check that string really is a string. */
function toString(strValue, returnOnBlank) {
	if (typeof(strValue)=="string") {
		return String(strValue);
	}
	return returnOnBlank;
}

function toRoundedNumber(num, places) {
	var mul = Math.pow(10,places);
	return (Math.round(num*(mul))/mul);
}

/* Currency Formatting functions */
function toCurrency(num, dp) {
	if (typeof(dp)=="undefined") { dp = 2; }
	var mul = Math.pow(10, dp);
	if (typeof(num)=="undefined" || num==null) {
		num = 0;
	}
	else if (typeof(num)=="string") {
		num = currencyToNumber(num);
	}
	curStr = "$"+(Math.round(num*mul)/mul);
	return curStr.replace(/\.(\d)$/, ".$10");
}


/* Percent Formatting functions */
function toPercent(num, dp, fromFloat) {
	if (!dp) { dp = 0; }
	var mul = Math.pow(10, dp);
	if (isNaN(num) && num.search(/%/)!=-1) {
		return num;
	}
	else if (fromFloat) {
		return Math.round(num*100*mul)/mul + "%";
	}
	else {
		return Math.round(num*mul)/mul + "%";
	}
}

function percentToNumber(val) {
	if (!isNaN(val)) { return val; }
	if (val == null) { return val; }
	val = val.replace(/%/, "");
	val = val.replace(/,/, "");
	val /= 100;
	return val;
}

function toOrdinalString(num) {
	var str = "";
	switch (num%10) {
		case 1:
			str = "st";
		break;
		case 2:
			str = "nd";
		break;
		case 3:
			str = "rd";
		break;
		default:
			str = "th";
		break;
	}
	return num+str;
}

function uppercase(val) {
	if (typeof(val)=="string") {
		return val.toUpperCase();
	}
	return val;
}

function lowercase(val) {
	if (typeof(val)=="string") {
		return val.toLowerCase();
	}
	return val;
}

function capitalize(val) {
	if (val==null) { return null; }
	var vsz = val.length;
	var prevCh = "";
	var newStr = "";
	for (var i=0; i<vsz; i++) {
		ch = val.charAt(i);
		if (prevCh.search(/[a-zA-Z']/)!=-1) {
			if (ch.search(/[A-Z]/)!=-1) {
				newStr += ch.toLowerCase();
			}
			else {
				newStr += ch;
			}
		}
		else if (ch.search(/[a-z]/)!=-1) {
			newStr += ch.toUpperCase();
		}
		else {
			newStr += ch;
		}
		prevCh = ch;
	}
	newStr = newStr.replace(/(^ *| *$)/g, "");
	return newStr;
}

function trimWs(val) {
	if (val==null) { return val; }
	return val.replace(/(^[ \t]*|[ \t]*$)/, "");
}

///Utility class for table updating
function TU() {
	this.str = "";
}
TU.prototype.addSqlString = function(val) {
	this.str += ","+toSqlStringFull(val);
}
TU.prototype.addSqlNumber = function(val) {
	this.str += ","+toSqlNumber(val);
}

if (!document.all) {
	HTMLElement.prototype.__defineGetter__("innerText", function () {
	   var r = this.ownerDocument.createRange();
	   r.selectNodeContents(this);
	   return r.toString();
	});
}