var userAgent = window.navigator.userAgent;
var browserVers = parseInt(userAgent.charAt(userAgent.indexOf("/")+1),10);
var bgErrClr = '#FFDDDD';	//'#eccc3e';

// Extensions to common JavaScript components
Array.prototype.remove = function(f) {
	if (f && this.length) {
		var found = 0;
		for (var i = 0; i<this.length; i++) {
			if (this[i]==f) {
				found = 1;
			}
			if (found && (i+1)<this.length) {
				this[i] = this[i+1];
			}
		}
		if (found) {
			this.length--;
			delete this[this.length];
		}
	}
	return;
}
Array.prototype.in_array = function(f) {
	var r = 0;
	if (f && this.length) {
		for (var i = 0; i<this.length; i++) {
			if (this[i]===f) {	// BEWARE! Strict comparison being done here!
				r = 1;
				break;
			}
		}
	}
	return r;
}
String.prototype.addline = function (a) {
	return (a.length) ? (this.length) ? this + "\n" + a : a : this;
}
String.prototype.ltrim = function () {
	return this.replace(/^\s+/, '');
}
String.prototype.rtrim = function () {
	for (var i = this.length-1; i>=0; i--) {
		if (/\S/.test(this.charAt(i))) {
			return this.substring(0, i+1);
		}
	}
	return this;
}
String.prototype.trim = function () {
	return this.ltrim().rtrim();
}
String.prototype.basename = function () {
    var b = this.replace(/^.*[\/\\]/g, '');
    if (arguments.length && typeof(arguments[0])=='string' && b.substr(b.length-arguments[0].length)==arguments[0]) {
        b = b.substr(0, b.length-arguments[0].length);
    }
    return b;
}
String.prototype.dirname = function () {
	return this.replace(/\\/g,'/').replace(/\/[^\/]*\/?$/, '');
}
String.prototype.pad = function(l, s, t) {
	return s || (s = " "), (l -= this.length) > 0 ? (s = new Array(Math.ceil(l / s.length)
		+ 1).join(s)).substr(0, t = !t ? l : t == 1 ? 0 : Math.ceil(l / 2))
		+ this + s.substr(0, l - t) : this;
}
String.prototype.digits = function () {
	return this.replace(/[^0-9]/g, '');
}
String.prototype.ucfirst = function () {
	return this.charAt(0).toUpperCase() + this.slice(1);
}
String.prototype.ucwords = function (){
	return this.replace(/(^|\s)([a-z])/g , function (m, p1, p2) { return p1+p2.toUpperCase(); });
};
var mSec		= 1000;
var msMin	= 60*mSec;		// In milliseconds
var msHour	= 60*msMin;		// In milliseconds
Date.prototype.syncMins = function(up, intvl) {
	var min = this.getUTCMinutes(),
		 now = Date.UTC(this.getUTCFullYear(), this.getUTCMonth(), this.getUTCDate(), this.getUTCHours(), 0, 0),
		 m = ((up) ? Math.ceil(min/intvl) : Math.floor(min/intvl)) * intvl;
	if (min==m && up) {
		m += intvl;
	}
	if (min<intvl && !up) {
		m = -1*intvl;
	}
	this.setTime(now+(m*msMin));
	return;
}
Date.prototype.getDBTime = function(secsFlg) {
	var tm = this.getUTCFullYear() + '-',
		 str = new String(this.getUTCMonth()+1);
	tm +=  str.pad(2, '0', 0) + '-';
	str = new String(this.getUTCDate());
	tm +=  str.pad(2, '0', 0) + ' ';
	str = new String(this.getUTCHours());
	tm +=  str.pad(2, '0', 0) + ':';
	str = new String(this.getUTCMinutes());
	tm +=  str.pad(2, '0', 0) + ':';
	if (secsFlg) {
		str = new String(this.getUTCSeconds());
		tm +=  str.pad(2, '0', 0);
	} else {
		tm += '00';
	}
	return tm;
}
Date.prototype.setDBTime = function(txtFld) {
	if ((typeof txtFld=='object' && (txtFld.type=='text' || txtFld.type=='hidden') && txtFld.value.length) ||
		 (typeof txtFld=='string' && txtFld.length)) {
		var cArr = (typeof txtFld=='string') ? txtFld.split(' ') : txtFld.value.split(' '),
			 dArr = cArr[0].split('-'),
			 tArr = cArr[1].split(':');
		this.setTime(
			Date.UTC(
				parseInt(dArr[0], 10), parseInt(dArr[1], 10)-1, parseInt(dArr[2], 10),
				parseInt(tArr[0], 10), parseInt(tArr[1], 10), parseInt(tArr[2], 10)
			)
		);
	}
	return;
}
Date.prototype.toGmt = function(tzone) {
	// Transpose a local datetime to UTC to bypass faulty DST conversions by built-in JS functions
	var offset = (typeof tzone=="undefined") ? 0 : tzone*msHour;
	this.setTime(
		Date.UTC(this.getFullYear(), this.getMonth(), this.getDate(), this.getHours(), this.getMinutes(), 0)-offset
	);
	return;
}
Date.prototype.adjForDst = function(tzone) {
// tzone is timezone offset (ie. Pacific is -8)
	var dstFlg = 0;
	// Make DST adjustment, if required
	if (isArray(dstArr) && dstArr.length) {
		var ms = this.getTime();
		var offset = (typeof tzone=="undefined") ? 0 : tzone*msHour;
		for (var i = 0; i<dstArr.length; i++) {
			if (dstArr[i][0]==this.getFullYear() && ms>=((dstArr[i][1]*mSec)-offset) && ms<=((dstArr[i][2]*mSec)-offset)) {
				this.setTime(ms-msHour);
				dstFlg = 1;
				break;
			}
		}
	}
	return dstFlg;
}
Date.prototype.toLocal = function(tzone, leadtime) {
// leadtime in minutes; tzone is timezone offset (ie. Pacific is -8)
	var l,
		 offset = (typeof tzone=="undefined") ? 0 : tzone*msHour,
		 ms = this.getTime();
	this.setTime(+offset);
	if (l = parseInt(leadtime, 10)) {
		offset += (l*msMin);
	}
	this.setTime(ms+offset);
	return;
}
Date.prototype.getDisplayDate = function() {
	var dayArr = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],
		 monArr = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],
		 tm = dayArr[this.getUTCDay()] + ', ' + this.getUTCDate() + '-' + monArr[this.getUTCMonth()] + '-' + this.getUTCFullYear() + ' at ',
		 h = this.getUTCHours();
	tm += ((h>12) ? h-12 : ((h==0) ? 12 : h)) + ':';
	str = new String(this.getUTCMinutes());
	tm +=  str.pad(2, '0', 0) + ' ' + ((h>11) ? 'PM' : 'AM');
	return tm;
}
Date.prototype.getDisplayTime = function() {
	var h = this.getUTCHours(),
		 tm = ((h>12) ? h-12 : ((h==0) ? 12 : h)) + ':';
	str = new String(this.getUTCMinutes());
	tm +=  str.pad(2, '0', 0) + ' ' + ((h>11) ? 'PM' : 'AM');
	return tm;
}
// Fix FU'd IE8
Function.prototype.type = 'function';

// Standard multiple line error messaging object
function Messages() {
	this.sep = (arguments.length && typeof(arguments[0])=='string') ? arguments[0] : '\n';
   this.buffer = [];
}
Messages.prototype.append = function(msgStr) {
	if (typeof msgStr!='undefined' && msgStr.length) {
		this.buffer.push(msgStr);
	}
   return this;
}
Messages.prototype.count = function() {
	return this.buffer.length;
}
Messages.prototype.isEmpty = function() {
	return (this.buffer.length==0) ? true : false;
}
Messages.prototype.toAlert = function() {
	if (this.buffer.length) {
		alert(this.buffer.join(this.sep));
	}
	return (this.buffer.length>0) ? false : true;
 }
Messages.prototype.toString = function() {
	var s = (arguments.length && typeof(arguments[0])=='string') ? arguments[0] : this.sep;
   return this.buffer.join(s);
 }
Messages.prototype.toHTML = function() {
	var s = (arguments.length && typeof(arguments[0])=='string') ? arguments[0] : '<br />';
   return this.buffer.join(s);
 }

// Library of useful JS functions
function getObjectId (objName) {
	var obj;
	if (objName) {
		if (document.all) {
			obj = document.all(objName);
		} else if (document.getElementById) {
			obj = document.getElementById(objName);
		} else if (document.layers) {
			obj = document.layers[objName];
		}
	}
	return (obj) ? obj : null;
}
function setNodeStr () {
	alert('Obsolete function: setNodeStr');
}
function setNodeHTML () {
	alert('Obsolete function: setNodeHTML');
}
function reverseStr (val) {
	var str = val.toString();
	var result = '';
	for (var e = str.length-1; e>=0; e--) {
		result += str.charAt(e);
	}
	return result;
}
function urlEncode (url) {
	var ch, i, nurl = '', fndStr = " #{}|^~[]`\\";
	var rplArr = new Array("%20", "%23", "%7B", "%7D", "%7C", "%5E", "%7E", "%5B", "%5D", "%60", "%5C");
	for (var x = 0; x<url.length; x++) {
		ch = url.charAt(x);
		nurl += ((i = fndStr.indexOf(ch, 0))==-1) ? ch : rplArr[i];
	}
	return nurl;
}
// Put images into document(cache)
function newImage (arg) {
	if (document.images) {
		rslt = new Image()
		rslt.src = arg
		return rslt
	}
}
function flash () {
	alert('Obsolete function: flash');
}
function rotateStyle () {
	alert('Obsolete function: rotateStyle');
}
function format (expr, decplaces) {
	var str = "" + Math.round(eval(expr) * Math.pow(10, decplaces));
	while (str.length <= decplaces) {
		str = "0" + str;
	}
	var decpoint = str.length - decplaces;
	return str.substring(0, decpoint) + '.' + str.substring(decpoint, str.length);
}
function displayAlert () {
	alert('Obsolete function: displayAlert');
}
function displayError (msg) {
	var elemName = (arguments.length>1 && typeof(arguments[1])=='string') ? arguments[1] : 'errMsg';
	if (fld = getObjectId(elemName)) {
		fld.innerHTML =  msg.replace(/\n/g, '<br />');
		fld.style.display = (msg.length) ? '' : 'none';
	}
	if (msg.length) {
		alert(msg);
	}
	return (msg.length) ? false : true;
}
function blinkText (jqSelector) {
	var timeout = (arguments.length>1) ? parseInt(arguments[1], 10) : 500;
	var interval = (arguments.length>2) ? parseInt(arguments[2], 10) : 500;
	return window.setTimeout(
		function () {
			$(jqSelector).css('visibility', 'hidden');
			setInterval(
				function () {
					$(jqSelector).each(
						function () {
							($(this).css('visibility')=='hidden') ?
								$(this).css('visibility', 'visible') : $(this).css('visibility', 'hidden');
						}
					);
				}, interval
			);
		}, timeout
	);
}
// Generalized form submission function; optional second argument
// can be the ID attribute of the form to use.
function submitCmd (cmd) {
	var frm = (arguments.length>1 && typeof(arguments[1])=='string' && arguments[1].length) ?
		$('form#' + arguments[1])[0] : $('form:first')[0];
	$("input[name='cmd']").val(cmd);
//alert('Here |'+cmd+'|');
	recordPosition(frm);
	$(frm).submit();
	return true;
}
function monthAbbr2Int (Month) {
	var iMonth;
	Month = Month.toLowerCase().substr(0,3)
	if (Month == "jan") { iMonth = 1} else  
	if (Month == "feb") { iMonth = 2} else
	if (Month == "mar") { iMonth = 3} else 
	if (Month == "apr") { iMonth = 4} else 
	if (Month == "may") { iMonth = 5} else 
	if (Month == "jun") { iMonth = 6} else  
	if (Month == "jul") { iMonth = 7} else 
	if (Month == "aug") { iMonth = 8} else 
	if (Month == "sep") { iMonth = 9} else 
	if (Month == "oct") { iMonth = 10} else 
	if (Month == "nov") { iMonth = 11} else 
	if (Month == "dec") { iMonth = 12}
	return (iMonth)
}
function leapYear (Year) {
	return (((Year % 4)==0) && ((Year % 100)!=0) || ((Year % 400)==0)) ? 1 : 0;
}
function getDaysofYear (Year) {
	return new Array(31, (leapYear(Year)==1) ? 29 : 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);
}

// =====================================================================================
// The following datetime* functions work together to support the html_datetime_input() PHP function
function datetimeGetYr (field) {
	var yr = '0000';
	if (field) {
		yr = (field.type=='hidden') ? field.value : field.options[field.selectedIndex].text;
		if (yr.length==2) {
			yr = (yr>=70) ? '19' + yr : '20' + yr;
		}
	}
	return yr;
}
function datetimeGetMon (field) {
	var mon = 0;
	if (field) {
		var m = '' + (field.type=='hidden') ? field.value : field.options[field.selectedIndex].text;
		mon = ((m.length==3) ? monthAbbr2Int(m) : parseInt(m, 10)) - 1;
	}
	return mon;	// 0-11
}
function datetimeSetDays (form, prefix, year, month) {
	var dayCnt = getDaysofYear(year);
	var mon = parseInt(month, 10);
	var fld = form.elements[prefix + 'Day'];
	var selectedDay = parseInt((fld.value) ? fld.value : fld.options[fld.selectedIndex].text, 10);
	fld.options.length = dayCnt[mon];
	for (var count = 1; count<=dayCnt[mon]; count++) {
		fld.options[count-1].text = count;
		fld.options[count-1].value = (count<10) ? '0' + count : count;
	}
	if (selectedDay > dayCnt[mon]) {
		fld.selectedIndex = fld.options.length-1;
	}
	return;
}
function datetimeInput (fld, prefix, time, secAdj) { // prefix is same as name of hidden field
	var f, v, mFld, day, hrs, min, sec, apm;
	var form = fld.form,
		 amhrs = new Array('01', '02', '03', '04', '05', '06', '07', '08', '09', '10', '11', '00'),
		 pmhrs = new Array('13', '14', '15', '16', '17', '18', '19', '20', '21', '22', '23', '12'),
		 yr = datetimeGetYr((f = form.elements[prefix + 'Yr'])),
		 mon = datetimeGetMon((mFld = form.elements[prefix + 'Mon'])),
		 mn = ((mon<9) ? '0' : '') + (mon+1);
	if (fld==f || fld==mFld) {
		datetimeSetDays(form, prefix, yr, mon);
	}
	if (f = form.elements[prefix + 'Day']) {
		day = (f.value) ? f.value : f.options[f.selectedIndex].text;
		if (day.length==1) {
			day = '0' + day;
		}
	} else {
		day = '00';
	}
	if (time) {
		if (f = form.elements[prefix + 'Hr']) {
			if (apm = form.elements[prefix + 'APm']) {
				var v = (apm.value) ? apm.value : apm.options[apm.selectedIndex].text;
				v = (v.toLowerCase()=='am') ? amhrs : pmhrs;
				for (var x = 0; x<12; x++) {
					f.options[x].value = v[x];
				}
			}	
			hrs = parseInt((f.value) ? f.value : f.options[f.selectedIndex].text, 10);
			if (f.value=='' && apm) {
				var am = (f.value) ? f.value : f.options[f.selectedIndex].text;
				am = (am.toLowerCase()=='am') ? 1 : 0;
				hrs = (hrs==12) ? ((am) ? 0 : 12) : ((am && hrs>12) ? hrs-12: ((!am && hrs<12) ? hrs+12 : hrs));
			}
			if (hrs<10) {
				hrs = '0' + hrs;
			}
		} else {
			hrs = '00';
		}
		if (f = form.elements[prefix + 'Min']) {
			min = (f.value) ? f.value : f.options[f.selectedIndex].text;
			if (min.length==1) {
				min = '0' + min;
			}
		} else {
			min = '00';
		}
		if (f = form.elements[prefix + 'Sec']) {
			sec = (f.value) ? f.value : f.options[fld.selectedIndex].text;
			if (sec.length==1) {
				sec = '0' + sec;
			}
		} else {
			sec = '00';
		}
	}
	if (f = form.elements[prefix]) {
		if (time) {
			//var gmtDate = new Date(yr, parseInt(mon, 10)-1, day, hrs, min, sec);
			var gmtDate = new Date(yr, mon, day, hrs, min, sec);
		// secAdj is not being set correctly when current datetime & pickup/flt time straddle the StandardTime/DaylightTime boundary
		// HARDCODED ADJUSTMENT FOR 2012 [DAYLIGHT SAVING HACK] months: 0-11, days: 1-31
			var dst_start = new Date(2012, 2, 11, 2, 0, 0);
			var dst_end = new Date(2012, 10, 4, 1, 59, 59);
			if (gmtDate.getTime()>=dst_start.getTime() && gmtDate.getTime()<dst_end.getTime()) {
				secAdj += 3600;
			}
		// -----------------------------------------------------------------------------------------------
			gmtDate.setTime(gmtDate.getTime()-(secAdj*1000));
			yr = gmtDate.getFullYear();
			mon = gmtDate.getMonth()+1;
			if (mon<10) {
				mon = '0' + mon;
			}
			day = gmtDate.getDate();
			if (day<10) {
				day = '0' + day;
			}
			hrs = gmtDate.getHours();
			if (hrs<10) {
				hrs = '0' + hrs;
			}
			min = gmtDate.getMinutes();
			if (min<10) {
				min = '0' + min;
			}
			sec = gmtDate.getSeconds();
			if (sec<10) {
				sec = '0' + sec;
			}
			f.value = yr + '-' + mon + '-' + day + ' ' + hrs + ':' + min + ':' + sec;
		} else {
			f.value = yr + '-' + mn + '-' + day;
		}
	}
	resetBg(fld, '#fff');
	return ((v = form.elements['_' + prefix]) && f.value!=v.value) ? 1 : 0;
}
function dateSetDays (form, prefix, year, month) {
	var dayCnt = getDaysofYear(year);
	var mon = (month) ? parseInt(month, 10) : 1;
	var fld = form.elements[prefix + 'Day'];
	var selectedDay = parseInt((fld.value) ? fld.value : fld.options[fld.selectedIndex].text, 10);
	fld.options.length = dayCnt[mon]+1;
	fld.options[0].text = '';
	fld.options[0].value = '00';
	for (var count = 1; count<=dayCnt[mon]; count++) {
		fld.options[count].text = count;
		fld.options[count].value = (count<10) ? '0' + count : count;
	} 
	if (selectedDay > dayCnt[mon]) {
		fld.selectedIndex = fld.options.length-1;
	}
	return;
}
function dateInput (fld, prefix) { // prefix is same as name of hidden field
	var f, mFld, yr, mon, day;
	var form = fld.form, name = fld.name;
	yr = datetimeGetYr((f = form.elements[prefix + 'Yr']));
	mon = datetimeGetMon((mFld = form.elements[prefix + 'Mon']))	;
	if (fld==f || fld==mFld) {
		dateSetDays(form, prefix, yr, mon);
	}
	if (f = form.elements[prefix + 'Day']) {
		day = (f.value) ? f.value : f.options[f.selectedIndex].text;
		if (day.length==1) {
			day = '0' + day;
		}
	} else {
		day = '00';
	}
	if (f = form.elements[prefix]) {
		f.value = yr + '-' + mon + '-' + day;
	}
	resetBg(fld,'#fff');
	return;
}
function datetimeCtl (form, prefix, enable, secAdj, time) {
	var fld, ctl = (enable) ? '' : 'none';
	if ((fld = getObjectId(prefix + 'Ctl')) && fld.style) {
		fld.style.display = ctl;
	} else {
		var flds = new Array('Yr', 'Mon', 'Day', 'Hr', 'Min', 'Sec', 'APm', 'Tz');
		for (var cnt = 0; cnt<flds.length; cnt++) {
			if ((fld = getObjectId(prefix+flds[cnt])) && fld.style) {
				fld.style.display = ctl;
			}
		}
	}
	if (fld = getObjectId(prefix)) {
		if (enable) {
			datetimeInput(fld, prefix, time, secAdj);
		} else {
			fld.value = '0000-00-00' + ((time) ? ' 00:00:00' : '');
		}
	}
	return;
}
// =====================================================================================
function timeInput (fld, prefix) { // prefix is same as name of hidden field
	var f, v, hrs, min, sec, apm;
	var form = fld.form;
	var amhrs = new Array('01', '02', '03', '04', '05', '06', '07', '08', '09', '10', '11', '00');
	var pmhrs = new Array('13', '14', '15', '16', '17', '18', '19', '20', '21', '22', '23', '12');
	if (f = form.elements[prefix + 'Hr']) {
		if (apm = form.elements[prefix + 'APm']) {
			var v = (apm.value) ? apm.value : apm.options[apm.selectedIndex].text;
			v = (v.toLowerCase()=='am') ? amhrs : pmhrs;
			for (var x = 0; x<12; x++) {
				f.options[x].value = v[x];
			}
		}	
		hrs = parseInt((f.value) ? f.value : f.options[f.selectedIndex].text, 10);
		if (f.value=='' && apm) {
			var am = (f.value) ? f.value : f.options[f.selectedIndex].text;
			am = (am.toLowerCase()=='am') ? 1 : 0;
			hrs = (hrs==12) ? ((am) ? 0 : 12) : ((am && hrs>12) ? hrs-12 : ((!am && hrs<12) ? hrs+12 : hrs));
		}
		if (hrs<10) {
			hrs = '0' + hrs;
		}
	} else {
		hrs = '00';
	}
	if (f = form.elements[prefix + 'Min']) {
		min = (f.value) ? f.value : f.options[f.selectedIndex].text;
		if (min.length==1) {
			min = '0' + min;
		}
	} else {
		min = '00';
	}
	if (f = form.elements[prefix + 'Sec']) {
		sec = (f.value) ? f.value : f.options[fld.selectedIndex].text;
		if (sec.length==1) {
			sec = '0' + sec;
		}
	} else {
		sec = '00';
	}
	if (f = form.elements[prefix]) {
		f.value = hrs + ':' + min + ':' + sec;
	}
	resetBg(fld, '#fff');
	return;
}
function recordPosition (form) {
	if (form.pg_x_offset) {
		form.pg_x_offset.value =
			(document.documentElement && document.documentElement.scrollLeft) ?
				document.documentElement.scrollLeft :
				((document.body) ? document.body.scrollLeft : window.pageXOffset);
	}
	if (form.pg_y_offset) {
		form.pg_y_offset.value =
			(document.documentElement && document.documentElement.scrollTop) ?
				document.documentElement.scrollTop :
				((document.body) ? document.body.scrollTop : window.pageYOffset);
	}
	return;
}
function addYtoHref (anchor) {
	var y_offset =
		(document.documentElement && document.documentElement.scrollTop) ?
			document.documentElement.scrollTop :
			((document.body) ? document.body.scrollTop : window.pageYOffset);
	if (y_offset) {
		var c = (anchor.href.indexOf('?')==-1) ? '?' : '&';
		anchor.href += c + 'oY=' + y_offset;
	}
	return;
}
function windowScroll () {
	var x = (arguments.length>0) ?
				(isNaN(arguments[0])) ?
					(isNaN(z = $('#'+arguments[0]).val())) ?
						0 : parseInt(z, 10) :
					parseInt(arguments[0], 10) :
				(isNaN(z = $("input[name='pg_y_offset']").val())) ? 0 : parseInt(z, 10);
	var y = (arguments.length>1) ?
				(isNaN(arguments[1])) ?
					(isNaN(z = $('#'+arguments[1]).val())) ?
						0 : parseInt(z, 10) :
					parseInt(arguments[1], 10) :
				(isNaN(z = $("input[name='pg_x_offset']").val())) ? 0 : parseInt(z, 10);
	window.scrollTo(y, x);
	return;
}
function setFocus () {
	alert('Obsolete function: setFocus');
}
function sideMenu () {
	alert('Obsolete function: sideMenu');
}
function doSelection (fld, clr) {
	alert('Obsolete function: doSelection');
}
function resetBg (fld) {
	var clr = (arguments.length>1) ? arguments[1] : '#fff';
	if (fld && fld.style && fld.style.background) {
		fld.style.background = clr;
	}
	return;
}
function getDigits (val) {
// Optional second parameter is a flag to keep decimal chars (def. false)
	var chr, str = val.toString();
	var result = '';
	var dec = (arguments.length>1 && (arguments[1]==true || arguments[1]==1)) ? 1 : 0;
	for (var i = 0; i<str.length; i++) {
		chr = str.charAt(i);
		if ((chr>='0' && chr<='9') || (dec==1 && chr=='.')) {
			result += chr;
		}
	}
	return result;
}
function isPosInt (val) {
	var chr, str = val.toString();
	if (str.length==0) {
		return false;
	}
	for (var i = 0; i<str.length; i++) {
		chr = str.charAt(i);
		if (chr<'0' || chr>'9') {
			return false;
		}
	}
	return true;
}
function isEmpty (val) {
	return (val==null || val=='') ? true : false;
}
// Return a boolean value telling whether // the first argument is a string. 
function isString () {
	if (typeof arguments[0]=='string')
		return true;
	if (typeof arguments[0]=='object') {
		var criterion = arguments[0].constructor.toString().match(/string/i);
		return (criterion!=null);
	}
	return false;
}
// Return a boolean value telling whether // the first argument is an Array object. 
function isArray () {
	if (typeof arguments[0]=='object') {
		var criterion = arguments[0].constructor.toString().match(/array/i);
		return (criterion!=null);
	}
	return false;
}
function isAmount(val) {
// Optional second parameter can be used to specify an alternate value for zero(def. is '0.00')
	var amt = format(getDigits(val, true), 2);
	if (amt=='0.00' && arguments.length>1 && typeof(arguments[1])=='string' && arguments[1].length) {
		amt = arguments[1];
	}
	return amt;
}
function checkAmount (fldObj, clr) {
// Optional third parameter can be a user-friendly name for the field
	var msg = '';
	if (fldObj && fldObj.type=='text') {
		var nm = (arguments.length>2 && typeof(arguments[2])=='string' && arguments[2].length) ?
			arguments[2] : fldObj.name;
		if (fldObj.value.length==0) {
			msg = 'Missing value for ' + nm + ' field.';
			if (clr.length) {
				fldObj.style.background = clr;
			}
		} else {
			fldObj.value = isAmount(fldObj.value);
		}
	}
	return msg;
}
function isCardNumber (val, type) {
	var str = getDigits(val),
		 ccn = '',
		 len = str.length,
		 pan = parseInt(str.substr(0, 6), 10);
	if ((type=='amex' && len==15 && str.substr(0, 2)=='37') ||
		 (type=='dncl' && len==14 && ((pan>=300000 && pan<=305999)||(pan>=309500 && pan<=309599)||(pan>=360000 && pan<=369999)||(pan>=380000 && pan<=389999))) ||
		 (type=='jcb' && len==16 && pan>=352800 && pan<=358999) ||
		 (type=='mstr' && len==16 && pan>=510000 && pan<=559999) ||
		 (type=='visa' && (len==13 || len==16) && pan>=400000 && pan<=499999) ||		
		 (type=='dscr' && len==16 && ((pan>=601100 && pan<=601109)||(pan>=601120 && pan<=601149)||(pan>=601190 && pan<=601199)))) {
	// Check pattern w/luhn algorithm
		var rnArr = str.split('').reverse();
		if (!rnArr.length) {
			return ccn;
		}
		var sum = 0;
		for (var i = 0; i<rnArr.length; i++) {
			rnArr[i] = parseInt(rnArr[i], 10);
			sum += i % 2 ? 2 * rnArr[i] - (rnArr[i] > 4 ? 9 : 0) : rnArr[i];
		}
		if (sum % 10 == 0) {
	// Reformat
			for (var i = 0; i<len; i++) {
				if (i==4 || (type!='amex' && i==8) || (type=='amex' && i==10) || (type!='amex' && i==12)) {
					ccn += '-';
				}
				ccn += str.charAt(i);
			}
		}
	}
	return ccn;
}
function isZipCode (val) {
	var str = getDigits(val),
		 zip = '';
	if (str.length==5 || str.length==9) {
		for (var i = 0; i<str.length; i++) {
			if (i==5) {
				zip += '-';
			}
			zip += str.charAt(i);
		}
	}
	return zip;
}
function isPhone (val) {
	var str = getDigits(val),
		 ph = '';
	if (str.length==10) {
		ph += '(';
		for (var i = 0; i<10; i++) {
			ph += str.charAt(i);
			if (i==2) {
				ph += ') ';
			}
			if (i==5) {
				ph += '-';
			}
		}
	}
	return ph;
}
function isSSN (val) {
	var str = getDigits(val),
		 ssn = '';
	if (str.length==9) {
		for (var i = 0; i<9; i++) {
			ssn += str.charAt(i);
			if (i==2 || i==4) {
				ssn += '-';
			}
		}
	}
	return ssn;
}

function isValidChar (str, chars) {
	var l = str.length,
		 s = str.toLowerCase(),
		 msg = '',
		 valid = 'abcdefghijklmnopqrstuvwxyz';
	if (chars.length) {
		valid += chars;
	}
	for (var i = 0; i<l; i++) {
		if (valid.indexOf(s.charAt(i), 0)==-1) {
			msg += str.charAt(i);
		}
	}
	return msg;
}
// Mirrors the check_name() method of the client object
// Opt. third param is string to use in error instead of field name
function checkName (nameObj, clr) {
	var vowels = 'aeiouy',
		 chr,
		 msg = new Messages(),
		 newArr = new Array(),
		 nm = (arguments.length>2 && typeof(arguments[2])=='string' && arguments[2].length) ?
			arguments[2] : nameObj.name;
	if (window['msgFlg'] == undefined) {
		msgFlg = 0;			// Set this global (msgFlg = 1) if detailed errors are desired
	}
	if (nameObj) {
		var name = nameObj.value,
			 l = name.length;
		if (l) {
			var mu = (name==name.toLowerCase() || name==name.toUpperCase()) ? 0 : -1;
			var vwl = cns = len = pos = wrd = 0;
			var bad = word = null;
			for (; pos<l; pos++) {
				chr = (name.charAt(pos)=='(' || name.charAt(pos)==')') ? ' ' : name.charAt(pos).toLowerCase();
				if (chr.charCodeAt()>=97 && chr.charCodeAt()<=122 || chr=='&') {
					if (vowels.indexOf(chr)==-1) {
						cns++;
					} else {
						cns = 0;
						vwl++;
					}
					len++;
					if (wrd) {
						if (mu==-1) {
							word += name.charAt(pos);
						} else {
							word += (mu) ? chr.toUpperCase() : chr;
							mu = 0;
						}
						if (wrd!=chr.charCodeAt()) {
							wrd = 1;
						}
					} else {
						wrd = chr.charCodeAt();
						word = (mu==-1 && len!=1) ? name.charAt(pos) : chr.toUpperCase();
					}
				} else if (chr=='-' || chr=="'") {
					len++;
					if (wrd) {
						word += chr;
						if (mu!=-1 && !(pos+2==l && name.charAt(pos+1)=='s') && 
							!(pos+2<l && name.charAt(pos+1)=='s' &&
								(name.charAt(pos+2)==' ' || name.charAt(pos+2)=="\t" || name.charAt(pos+2)=="\n"))) {
							mu = 1;
						}
					}
				}
				if (((pos+1)==l || chr==' ' || chr=="\t" || chr=="\n") && wrd) {
					if (word!='Mr' && word!='Mrs' && word!='Ms' && word!='Miss') {
						if ((len==1 && word!='&') || word=='Jr' || word=='Sr' || word=='St' || word=='Dr') {
							word += '.';
						} else if (len==2 && cns==2 && word!='Ng') {
							word = word.charAt(0) + '. ' + word.charAt(1).toUpperCase() + '.';
						}
						newArr.push(word);
						if (len>2 && !vwl) {
							msg.append('No vowels.');
						}
						if (cns>4) {
							msg.append('More than 4 consants in a row.');
						}
						if (len>1 && wrd>1) {
							msg.append('All chars in word are the same.');
						}
					}
					wrd = len = vwl = cns = 0;
					word = null;
				}
			}
		} else {
			msg.append('Empty ' + nm + ' string.');
		}
		nameObj.value = newArr.join(' ');
	} else {
		msg.append('Bad input object.')
	}
	if (msg.count() && clr.length) {
		nameObj.style.background = clr;
	}
	return (msgFlg) ? msg.toString() : msg.isEmpty() ? '' : 'Invalid ' + nm + '.';
}
function checkUrl (fldObj, clr) {
	var urlStr,
		 msg = new Messages(),
		 nm = (arguments.length>2 && typeof(arguments[2])=='string' && arguments[2].length) ?
			arguments[2] : fldObj.name;
	if (fldObj && fldObj.type=='text') {
		fldObj.value = urlStr = fldObj.value.toLowerCase().trim();
		if (urlStr.length==0) {
			msg.append('Missing ' + nm + ' URL.');
		} else {
			if (/^mailto\:/.test(urlStr)) {
	// Check email address
				msg.append(checkEmail(fldObj, clr));
			} else {
				if (/^www./.test(urlStr)) {
					fldObj.value = urlStr = 'http://' + urlStr;
				}
				var RegExp = (/^(http|https|ftp)/.test(urlStr)) ?
	// Check only full URL's
	//		        |     scheme     | : / /|  username :     password   @ |   IP address <xxx.xxx.xxx.xxx>                                                             |or  hostname[/path]    |       domain name                                                               |   port   |   segments(path)         |     query string
					/^(?:http|https|ftp)\:\/\/([\w\.\-\+]+:{0,1}[\w\.\-\+]*@)?(?:(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?))|(?:(?:[-a-z0-9]+\.){1,}(?:com|edu|gov|int|mil|net|org|biz|arpa|info|name|pro|aero|coop|museum|[a-z]{2}))(\:[0-9]+)?(\/[a-z0-9$\-_.&+!(),~%]*)*(\?([a-z0-9$\-_@.+!*"'(),%]+(\=[a-z0-9$\-_@.+!*"'(),%]+)?)+(\&[a-z0-9$\-_@.+!*"'(),%]+(\=[a-z0-9$\-_@.&+!*"'(),%]+)?)*)?$/ :
	// Relative URL
					/^[a-z0-9$\-_.&+!(),~%]+(\/[a-z0-9$\-_.&+!(),~%]*)*(\?([a-z0-9$\-_@.+!*"'(),%]+(\=[a-z0-9$\-_@.+!*"'(),%]+)?)+(\&[a-z0-9$\-_@.+!*"'(),%]+(\=[a-z0-9$\-_@.&+!*"'(),%]+)?)*)?$/;
				if (!RegExp.test(urlStr)) {
					msg.append('Invalid ' + nm + ' URL.');
				}			
			}
		}
	}
	if (msg.count() && clr.length) {
		fldObj.style.background = clr;
	}
	return msg.toString();
}
function checkEmail (fldObj, clr) {
	var i, m, emailStr,
		 msg = new Messages();
	if (fldObj) {
		if (fldObj.type=='text') {
			fldObj.value = emailStr = fldObj.value.toLowerCase().trim();
			if (/^mailto\:/.test(emailStr)) {
				emailStr = emailStr.slice(7);
			}
		}
		if (emailStr.length==0) {
			if (clr.length) {
				fldObj.style.background = clr;
			}
			return 'Missing email address.';
		}

		var checkTLD = 1,
			 knownDomsPat = /^(com|net|org|edu|int|mil|gov|arpa|biz|aero|name|coop|info|pro|museum|[a-z]{2})$/,
			 emailPat = /^(.+)@(.+)$/,
			 specialChars = "\\(\\)><@,;:\\\\\\\"\\.\\[\\]",
			 validChars = "\[^\\s" + specialChars + "\]",
			 quotedUser = "(\"[^\"]*\")",
			 ipDomainPat = /^\[(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})\]$/,
			 atom = validChars + '+',
			 word = "(" + atom + "|" + quotedUser + ")",
			 userPat = new RegExp("^" + word + "(\\." + word + ")*$"),
			 em,
			 emArr = emailStr.split(',');
		for (em = 0; em<emArr.length; em++) {
			var matchArray = emArr[em].trim().match(emailPat);
			if (matchArray==null) {
				if (clr.length) {
					fldObj.style.background = clr;
				}
				return "Email address seems incorrect (check @ and .'s).";
			}
		// user = matchArray[1]; domain = matchArray[2];
			for (i = 0, m = ''; i<matchArray[1].length; i++) {
				if ((matchArray[1].charCodeAt(i) >= 0 && matchArray[1].charCodeAt(i) <= 44)
					 || matchArray[1].charCodeAt(i) == 47
					 || (matchArray[1].charCodeAt(i) >= 58 && matchArray[1].charCodeAt(i) <=64)
					 || (matchArray[1].charCodeAt(i) >= 91 && matchArray[1].charCodeAt(i) <= 94)
					 || matchArray[1].charCodeAt(i) == 96
					 || (matchArray[1].charCodeAt(i) >= 123 && matchArray[1].charCodeAt(i) <= 255)) {
					m += matchArray[1].charAt(i);
				}
			}
			if (m) {
				msg.append('Email username contains invalid character(s): ' + m);
			}
			for (i = 0, m = ''; i<matchArray[2].length; i++) {
				if ((matchArray[2].charCodeAt(i) >= 0 && matchArray[2].charCodeAt(i) <= 44)
					 || matchArray[2].charCodeAt(i) == 47
					 || (matchArray[2].charCodeAt(i) >= 58 && matchArray[2].charCodeAt(i) <=64)
					 || (matchArray[2].charCodeAt(i) >= 91 && matchArray[2].charCodeAt(i) <= 96)
					 || (matchArray[2].charCodeAt(i) >= 123 && matchArray[2].charCodeAt(i) <= 255)) {
					m += matchArray[2].charAt(i);
				}
				if (m) {
					msg.append('Email domain name contains invalid character(s): ' + m);
				}
			}
			if (matchArray[1].match(userPat)==null) {
				msg.append("Email username doesn't seem to be valid.");
			}
			var IPArray = matchArray[2].match(ipDomainPat);
			if (IPArray!=null) {
				for (i = 1; i<=4; i++) {
					if (IPArray[i]>255) {
						msg.append('Email destination IP address is invalid.');
						continue;
					}
				}
			}
			var atomPat = new RegExp("^" + atom + "$");
			var domArr = matchArray[2].split(".");
			var len = domArr.length;
			for (i = 0; i<len; i++) {
				if (domArr[i].search(atomPat)==-1) {
					msg.append('Email domain name does not seem to be valid.');
					continue;
				}
			}
			if (checkTLD && domArr[domArr.length-1].length!=2
				 && domArr[domArr.length-1].search(knownDomsPat)==-1) {
				msg.append('Email address must end in a valid domain or two letter country.');
			} else if (len<2) {
				msg.append('Email address is missing a hostname!');
			}
		}
	}
	if (msg.count() && clr.length) {
		fldObj.style.background = clr;
	}
	return msg.toString();
}
function checkText (fldObj, clr) {
	var msg = '';
	if (fldObj &&
		(fldObj.type=='text' || fldObj.type=='password' || fldObj.type=='textarea' || fldObj.type=='file' || fldObj.type=='hidden') &&
		isEmpty(fldObj.value)) {
		var nm = (arguments.length>2 && typeof(arguments[2])=='string' && arguments[2].length) ?
			arguments[2] : fldObj.name;
		msg = 'Missing value for ' + nm + ' field.';
		if (clr.length) {
			fldObj.style.background = clr;
		}
	}
	return msg;
}
function checkInt (fldObj, clr) {
	var msg = '';
	if (fldObj && (isEmpty(fldObj.value) || !isPosInt(fldObj.value))) {
		var nm = (arguments.length>2 && typeof(arguments[2])=='string' && arguments[2].length) ?
			arguments[2] : fldObj.name;
		msg = 'Missing value for ' + nm + ' field.';
		if (clr.length) {
			fldObj.style.background = clr;
		}
	}
	return msg;
}
function checkCCNum (fldObj, card, clr) {
	var msg = '';
	if (card.length || !fldObj.value.length) {
		tmp = isCardNumber(fldObj.value, card.toLowerCase());
		if (tmp.length==0) {
			var nm = (arguments.length>3 && typeof(arguments[3])=='string' && arguments[3].length) ?
				arguments[3] : fldObj.name;
			msg = 'Invalid value for ' + nm + ' field.';
			if (clr.length) {
				fldObj.style.background = clr;
			}
		} else {
			fldObj.value = tmp;
		}
	}
	return msg;
}
function CheckCCExp (fldMon, fldYr, clr) {
	var msg = '';
	if (fldMon && fldYr) {
		if (!fldMon.selectedIndex) {
			if (clr.length) {
				fldMon.style.background = clr;
			}
			msg = 'Expiration month not set.';
		}
		if (!fldYr.selectedIndex) {
			if (clr.length) {
				fldYr.style.background = clr;
			}
			msg = 'Expiration year ' + ((msg.length) ? '& month ' : '') + 'not set.';
		}
		if (!msg.length) {
			var year = parseInt(fldYr.options[fldYr.selectedIndex].text, 10),
				 month = parseInt(fldMon.options[fldMon.selectedIndex].text, 10)-1,
				 dayCnt = getDaysofYear(year),
				 exp = new Date(year, month, dayCnt[month+1], 23, 59, 59),
				 today = new Date();
			if (exp.getTime()<today.getTime()) {
				if (clr.length) {
					fldMon.style.background = clr;
				}
				if (year<today.getFullYear() && clr.length) {
					fldYr.style.background = clr;
				}
				msg = '';
			}
		}
	}
	return msg;
}
function checkCCCode (fldObj, clr, card) {
	var msg = '';
	if (fldObj && fldObj.value=='' ||
		(card=='amex' && (!isPosInt(fldObj.value) || fldObj.value.length!=4)) ||
		((card=='dscr'||card=='mstr'||card=='visa') && (!isPosInt(fldObj.value) || fldObj.value.length!=3))) {
		if (clr.length) {
			fldObj.style.background = clr;
		}
		msg = 'Invalid ' + 
			((arguments.length>3 && typeof(arguments[3])=='string' && arguments[3].length) ?
				arguments[3] : 'credit card code') + '.';
	}
	return msg;
}
function checkSelect (fldObj, clr, index) {
	var msg = '';
	if (fldObj && (fldObj.type=='select-one' || fldObj.type=='select-multiple') && fldObj.selectedIndex==index) {
		var nm = (arguments.length>3 && typeof(arguments[3])=='string' && arguments[3].length) ?
			arguments[3] : fldObj.name;
		msg = 'Missing value for ' + nm + ' field.';
		if (clr.length) {
			fldObj.style.background = clr;
		}
	}
	return msg;
}
function checkRadio (parObj, radObj, clr) {
	var chk = false,
		 msg = '';
	if (parObj && radObj && radObj[0].type=='radio') {
		var nm = (arguments.length>3 && typeof(arguments[3])=='string' && arguments[3].length) ?
			arguments[3] : radObj.name;
		for (var i = 0; i<radObj.length; i++) {
			if (radObj[i].checked) {
				chk = true;
				break;
			}
		}
		if (!chk) {
			msg = 'No selection for ' + nm + ' field.';
			if (clr.length) {
				parObj.style.background = clr;
			}
		}
	}
	return msg;
}
function checkZipcode (fldObj, clr) {
	var msg = '';
	if (fldObj && fldObj.type=='text') {
		var tmp = isZipCode(fldObj.value);
		if (tmp.length==5 || tmp.length==10) {
			fldObj.value = tmp;
		} else {
			msg = 'Invalid zipcode.';
			if (clr.length) {
				fldObj.style.background = clr;
			}
		}
	}
	return msg;
}
function checkUSPhone (fldObj, clr) {
	var msg = ''
	if (fldObj && fldObj.type=='text') {
		var tmp = isPhone(fldObj.value);
		if (tmp.length==0 || tmp.charAt(1) < 2 || tmp.charAt(6) < 2 ||
			(tmp.charAt(6)==5 && tmp.charAt(7)==5 && tmp.charAt(8)==5)) {
			var nm = (arguments.length>2 && typeof(arguments[2])=='string' && arguments[2].length) ?
				arguments[2] : fldObj.name;
			msg = 'Invalid ' + nm + ' number.';
			if (clr.length) {
				fldObj.style.background = clr;
			}
		} else {
			fldObj.value = tmp;
		}
	}
	return msg;
}
function checkPhone (fldObj, clr) {
	var msg = '', bad = 0;
	var regexIntlObj = /^\s*\+([0-9]{1,3})\s*[-.]?\s*([0-9]{4,14})\s*[-.xX]?\s*([0-9]{1,6})?$/;
	var regexUsObj = /^\s*(?:\+?1)?\s*[-.]?\s*\(?\s*([2-9][0-8][0-9])\s*\)?\s*[-.]?\s*([2-9][0-9]{2})\s*[-.]?\s*([0-9]{4})\s*[-.xX]?\s*([0-9]{1,6})?$/
	if (fldObj && fldObj.type=='text') {
	// Intl (leading '+' required)
		if (regexIntlObj.test(fldObj.value)) {
			var prts = regexIntlObj.exec(fldObj.value);
			fldObj.value = '+' + prts[1] + '.' + prts[2];
			if (prts[3]) {
				fldObj.value += prts[3];
			}
	// US
		} else if (regexUsObj.test(fldObj.value)) {
			var prts = regexUsObj.exec(fldObj.value);
			fldObj.value = '(' + prts[1] + ') ' + prts[2] + '-' + prts[3];
			if (prts[4]) {
				fldObj.value += ' ' + prts[4];
			}
			if (prts[2].substr(1,2)=='11' ||			// to avoid confusion with the N11 codes
				 (prts[2]=='555' && prts[3].substr(0,2)=='01') ||	// fictional numbers
				 prts[2]=='958' || prts[2]=='959' ||	// industry testing codes
				 prts[2]=='950' || prts[2]=='976' ||	// special service codes
				 prts[3]=='1212'								// directory assistance
				) {
				bad = 1;
			}
		} else {
	// Invalid phone number
			bad = 1;
		}
		if (bad) {
			msg =
				'Invalid ' + 
				((arguments.length>2 && typeof(arguments[2])=='string' && arguments[2].length) ?
					arguments[2] : fldObj.name) +
				' number.';
			if (clr.length) {
				fldObj.style.background = clr;
			}
		}
	}
	return msg;
}
function checkSSN (fldObj, clr) {
	var msg = '';
	if (fldObj && fldObj.type=='text') {
		var tmp = isSSN(fldObj.value);
		if (tmp.length==0) {
			var nm = (arguments.length>2 && typeof(arguments[2])=='string' && arguments[2].length) ?
				arguments[2] : fldObj.name;
			msg = 'Invalid ' + nm + ' number.';
			if (clr.length) {
				fldObj.style.background = clr;
			}
		} else {
			fldObj.value = tmp;
		}
	}
	return msg;
}
function checkIntRange (fldObj, min, max, clr) {
	var i,
		 msg = '';
	if (fldObj) {
		if (isEmpty(fldObj.value)) {
			msg = 'Missing value';
		} else if (!isPosInt(fldObj.value)) {
			msg = 'Invalid value\n';
		} else if ((i = parseInt(fldObj.value, 10))<min || i>max) {
			msg = 'Out of range value (' + min + '-' + max + ')';
		}
		if (msg.length && clr.length) {
			fldObj.style.background = clr;
		}
	}
	return msg;
}
function checkPwds (fldObj1, fldObj2, clr) {
	var passed = true,
		 msg = '';
	if (fldObj1 && fldObj2) {
		if (isEmpty(fldObj1.value)) {
			if (clr.length) {
				fldObj1.style.background = clr;
			}
			passed = false;
		}
		if (isEmpty(fldObj2.value)) {
			if (clr.length) {
				fldObj2.style.background = clr;
			}
			passed = false;
		}
		if (!passed) {
			msg = 'Missing new password.';
		} else if (fldObj1.value!=fldObj2.value) {
			if (clr.length) {
				fldObj2.style.background = clr;
			}
			passed = false;
			msg = 'Mismatched passwords.';
			fldObj2.value = '';
		}
	}
	return msg;
}
function checkValidPwd (fldObj, mLen, dCnt, sCnt, clr) {
	var c, d, i, s,
		 msg = new Messages(),
		 spChars = "!@#$%^&*()_-+=[]{}|;:<>,./?~",
		 len = Math.max(6, mLen);
	if (fldObj && !isEmpty(fldObj.value)) {
		var pwd = fldObj.value;
		if (pwd.length<len) {
			if (clr.length) {
				fldObj.style.background = clr;
			}
			msg.append('Password length is less than ' + len + '.');
		}
		if (dCnt>0 || sCnt>0) {
			for (d = 0, i = 0, s = 0; i<pwd.length; i++) {
				c = pwd.charAt(i);
				if (c>='0' && c<='9') {
					d++;
				}
				if (spChars.indexOf(c)>=0) {
					s++;
				}
			}
			if (dCnt>0 && d<dCnt) {
				if (clr.length) {
					fldObj.style.background = clr;
				}
				c = (dCnt>1) ? 's' : '';
				msg.append('Password must contain at least ' + dCnt + ' digit' + c + '.');
			}
			if (sCnt>0 && s<sCnt) {
				if (clr.length) {
					fldObj.style.background = clr;
				}
				c = (sCnt>1) ? 's' : '';
				msg.append('Password must contain at least ' + sCnt + ' special character' + c + '.');
			}
		}
	}
	return msg.toString();
}
function checkEnter (field, event) {
	var keyCode = event.keyCode ? event.keyCode : event.which ? event.which : event.charCode;
	if (keyCode == 13) {
		for (var i = 0; i<field.form.elements.length; i++) {
			if (field == field.form.elements[i]) {
				break;
			}
		}
		i = (i + 1) % field.form.elements.length;
		field.form.elements[i].focus();
		return false;
	} else {
		return true;
	}
}
// Used by the DB_Report object
function sortTable (fid, fld) {
	var obj;
	if (obj = getObjectId(fid)) {
		obj.value = fld;
		if (fid!='rec_id' && obj.form.rec_id) {
			obj.form.rec_id.value = 0;
		}
		obj.form.submit();
	}
	return;
}
function clrFld () {
	alert('Obsolete function: clrFld');
}
function toggle () {
	alert('Obsolete function: toggle');
}
function choice (inp, hdn, val) {
	var obj;
	if (obj = getObjectId(hdn)) {
		if (inp && typeof(inp)=='object') {
			switch (inp.type) {
				case 'button':
				case 'submit':
				case 'reset':
				case 'radio':
				case 'text':
					obj.value = inp.value;
					break;
				case 'checkbox':
					obj.value = (inp.checked) ? inp.value : null;
					break;
				case 'select-one':
					obj.value = inp.options[inp.selectedIndex].value;
					break;
				case 'image':
					obj.value = inp.src;
					break;
				default:
					obj.value = val;
					break;
			}
		} else {
			obj.value = val;
		}
		obj.form.submit();
	}
	return;
}
function reorder (form, recId, upFlg) {
	var rObj = form.elements['rec_id'],
		 uObj = form.elements['up_flg'];
	if (rObj && uObj) {
		rObj.value = recId;
		uObj.value = (upFlg) ? 1 : 0;
		form.submit();
	}
	return;
}
function reorder2 (form, recId, slot) {
	recordPosition(form);
	var rObj = form.elements['rec_id'],
		 uObj = form.elements['new_pos'];
	if (rObj && uObj) {
		rObj.value = recId;
		uObj.value = parseInt(slot, 10);
		form.submit();
	}
	return;
}
function swtchFlds (offArr, onArr) {
	var cnt, fld;
	if (offArr && isArray(offArr) && offArr.length) {
		for (cnt = 0; cnt<offArr.length; cnt++) {
			if (fld = getObjectId(offArr[cnt])) {
				fld.style.display = 'none';
			}
		}
	}
	if (onArr && isArray(onArr) && onArr.length) {
		for (cnt = 0; cnt<onArr.length; cnt++) {
			if (fld = getObjectId(onArr[cnt])) {
				fld.style.display = 'block';
			}
		}
	}
	return;
}
function dispOnCmp (fld, val, dispArr) {
	var cnt, obj,
		 set = (fld && dispArr && dispArr.length && fld.value!=val) ? 'visible' : 'hidden';
	for (cnt = 0; cnt<dispArr.length; cnt++) {
		if (obj = getObjectId(dispArr[cnt])) {
			obj.style.visibility = set;
		}
	}
	return;
}
function chkbxCntrl (chxObj, dspArr) {
// dspArr = array of element ID's to switch on/off based on checkbox checked property value
	if (chxObj && chxObj.type=='checkbox') {
		var state = (chxObj.checked) ? 1 : 0;
	// 0 - display, 1 - visibility, 2 - both
		pFlg = (arguments.length>3) ? ((parseInt(arguments[3], 10)>1) ? 2 : 1) : 0;
		if (dspArr && dspArr.length) {
			var obj;
			for (cnt = 0; cnt<dspArr.length; cnt++) {
				if (obj = getObjectId(dspArr[cnt])) {
					if (pFlg==0 || pFlg==2) {
						obj.style.display = (state) ? '' : 'none';
					}
					if (pFlg) {
						obj.style.visibility = (state) ? 'visible' : 'hidden';
					}
				}
			}
		}
	}
	return;
}
function updateCntrl (form, prefix, dspArr) {
// dspArr = array of element ID's to switch on/off based on compare
// argument[3] = optional, flag to select between visibility(1, default) and display(0)
// Hidden fields with original values are named the same except they have an underscore('_') prefixed
	var hdn, fld, nam, obj;
	if (form.elements) {
		var disp = 0;
		for (var cnt = 0; cnt<form.elements.length; cnt++) {
			if ((fld = form.elements[cnt]) && (nam = fld.name) && nam.indexOf(prefix)==0 &&
				(hdn = form.elements['_' + nam]) && hdn.type=='hidden')
				switch (fld.type) {
					case 'checkbox':
						if ((fld.checked && hdn.value=='0') || (!fld.checked && hdn.value=='1')) {
							disp = 1;
						}
						break;
					case 'text':
					case 'hidden':
						if (fld.value!=hdn.value) {
							disp = 1;
						}
						break;
				}
			if (disp) {
				break;
			}
		}
		pFlg = (arguments.length>3) ? ((arguments[3]) ? 1 : 0) : 1;
		nam = (pFlg) ? ((disp) ? 'visible' : 'hidden') : ((disp) ? '' : 'none');
		if (dspArr && dspArr.length) {
			for (cnt = 0; cnt<dspArr.length; cnt++) {
				if (obj = getObjectId(dspArr[cnt])) {
					(pFlg) ? obj.style.visibility = nam : obj.style.display = nam;
				}
			}
		}
	}
	return;
}
// Switch label class to 'missing' when required field is empty or radio not selected
function updateLabel (inpEl) {
	if (inpEl) {
		var me = inpEl.name,
			 lbl = $("label[for='" + me + "']")[0],
			 cls = (arguments.length>1) ? arguments[1] : 'missing';
		var typ = (typeof $(inpEl).prop=='undefined') ? $(inpEl).attr('type') : $(inpEl).prop('type');
		if (((typ=='hidden' || typ=='password' || typ=='text' || typ=='textarea') && $(inpEl).val()=='') ||
			 (typ=='select-one' && inpEl.selectedIndex==0) ||
			 (typ=='radio' && $("input[name='" + me + "']:checked").attr('checked')!='checked')) {
			$(lbl).addClass(cls);
		} else {
			$(lbl).removeClass(cls);
		}
	}
	return;
}
// Allow a label associated with a checkbox (de)activate it
function activate_checkbox_labels () {
	var nm;
	$('label').each(function () {
		nm = $(this).attr('for');
		if (nm.length && $("input[name='_" + nm + "']").attr('type')=='checkbox') {
			$(this).click(function () {
				var n = $(this).attr('for');
				if ($("input[name='_" + n + "']").is(':checked')) {
					$("input[name='_" + n + "']").attr('checked', false);
					$('input#' + n).val(0);
				} else {
					$("input[name='_" + n + "']").attr('checked', true);
					$('input#' + n).val(1);
				}
			});
		}
	});
	return;
}
function disableAll () {
	alert('Obsolete function: disableAll');
}
// LIMITED protection for images
function right (e) {
	var copyright_alert = 'Images on this website are Copyright protected.\nPlease don\'t make illegal copies.';
	if ((navigator.appName=='Netscape' && e.which==3) ||
		 (navigator.appName=='Microsoft Internet Explorer' && event.button==2)) {
		alert(copyright_alert);
		return false;
	}
	return true;
}
function trapClick () {
	if (document.images) {
		for (var i = 0; i<document.images.length; i++) {
			document.images[i].onmousedown = right;
			document.images[i].onmouseup = right;
		}
	}
	return;
}
function translateRGBcolor (rgbColor) {
// rgbColor can be "rgb(rr,gg,bb)" or "#RRGGBB"
	if (rgbColor.charAt(0)=='#') {
		return rgbColor.toUpperCase();
	} else {
		var clr = '',
			 str = rgbColor.replace(/rgb\(|\)/g, '').split(',');
		for (var i = 0; i<3; i++) {
			str[i] = parseInt(str[i], 10).toString(16);
			clr += (str[i].length == 1) ? '0' + str[i] : str[i];
		}
		return '#' + clr.toUpperCase();
	}
}
 // Natural Sort algorithm for Javascript
 //  Version 0.2
 // Author: Jim Palmer (based on chunking idea from Dave Koelle)
 // Released under MIT license.
function naturalSort (a, b) {
// This function does case-insensitive sorting. This can easily be disabled by removing the .toLowerCase() calls on the x and y variables.
// setup temp-scope variables for comparison evauluation
	var x = a.toString().toLowerCase() || '',
		 y = b.toString().toLowerCase() || '',
		 nC = String.fromCharCode(0),
		 xN = x.replace(/([-]{0,1}[0-9.]{1,})/g, nC + '$1' + nC).split(nC),
		 yN = y.replace(/([-]{0,1}[0-9.]{1,})/g, nC + '$1' + nC).split(nC),
		 xD = (new Date(x)).getTime(),
		 yD = (new Date(y)).getTime();
// natural sorting of dates
	if (xD && yD && xD < yD) {
		return -1;
	} else if (xD && yD && xD > yD) {
		return 1;
	}
// natural sorting through split numeric strings and default strings
	for (var cLoc = 0, numS = Math.max(xN.length, yN.length); cLoc<numS; cLoc++) {
		if ((parseFloat(xN[cLoc]) || xN[cLoc])<(parseFloat(yN[cLoc]) || yN[cLoc])) {
			return -1;
		} else if ((parseFloat(xN[cLoc]) || xN[cLoc])>(parseFloat(yN[cLoc]) || yN[cLoc])) {
			return 1;
		}
	}
	return 0;
}
// -------------
function popupWindow (url, tag, wx, wy, ww, wh) {
	var opt = 'location=0,menubar=0,resizable=1,scrollbars=1,status=0,toolbar=0';
	if (wx.length || wx>-1) {
		var x = parseInt(wx, 10);
		opt += 'left=' + x + ',screenX=' + x;
	}
	if (wy.length || wx>-1) {
		var y = parseInt(wy, 10);
		opt += ',top=' + y + ',screenY=' + y;
	}
	if (ww.length || wx>0) {
		opt += ',width=' + parseInt(ww, 10);
	}
	if (wh.length || wx>0) {
		opt += ',height=' + parseInt(wh, 10);
	}
	var win = window.open(url, tag, opt);
	if (win.opener==null) {
		win.opener = self;
	}
	win.focus();
	return;
}
function dumpProps(obj, parent) {
   // Go through all the properties of the passed-in object
   for (var i in obj) {
      // if a parent (2nd parameter) was passed in, then use that to
      // build the message. Message includes i (the object's property name)
      // then the object's property value on a new line
      if (parent) { var msg = parent + "." + i + "\n" + obj[i]; } else { var msg = i + "\n" + obj[i]; }
      // Display the message. If the user clicks "OK", then continue. If they
      // click "CANCEL" then quit this level of recursion
      if (!confirm(msg)) { return; }
      // If this property (i) is an object, then recursively process the object
      if (typeof obj[i] == "object") {
         if (parent) { dumpProps(obj[i], parent + "." + i); } else { dumpProps(obj[i], i); }
      }
   }
}

//		DELETED
// function lTrim (val)
// function rTrim (val)
// function trimStr (val)
// function newImage (arg)
// function initImgID ()
//	function findElement (n, ly)
//	function changeImagesArray (array)
//	function changeImages ()
//	function changeButton (button, btnName, imagePath)
//	function makeArrayImplicit ()
//	function addItem (form, itemType)
//	function setDayNumArray (Form, Prefix)
//	function setDayNumber (Form, Prefix)
//	function enableDate (chkbx, prefix)
//	function enableDatetime (chkbx, prefix)
//	function setDatetime (form, prefix, time)
//	function clrDate (button, prefix)
//	function clrDateTime (button, prefix)
//	function setTimezoneOffset (form, hdn)
//	function ifExists (checkVar)
//	function isValidFullName (fnObj, lnObj, clr)
//	function containsVowel (str)
//	function emailCheck (emailStr)
//	function _checkName (fldObj, clr, chars)
//	function nameCheck (nameStr)
//	function fldChkTxt (fldObj, clr)
//	function fldChkCCType (parObj, fldObj, clr)
//	function checkCCExp (fldMon, fldYr, clr)
//	function fldChkCCCode (fldObj, clr, card)
//	function fldChkSel (fldObj, clr, index)
//	function fldChkRad (parObj, fldObj, clr)
//	function fldChkZip (fldObj, clr)
//	fldChkUSPhone (fldObj, clr)
//	function fldChkPwds (fldObj1, fldObj2, clr)
//	function fldValidPwd (fldObj, mLen, dCnt, sCnt, clr)
//	function link2hidden (val, hdn)
//	function select2hidden (sel, hdn)
// function swFlds (form, offArr, onArr)
// function updateCtl (form, prefix, updId)
//	function html_datetime_input (prefix, mtFlg)
//	function protect (e)
//	function trap ()
//	function panelEdit(className, selectCol, selectVal, property)

