var sm_reEmpty = /^\s*$/;
var sm_reLeading = /^(\s+)/i;
var sm_reEnding = /(\s+)$/i;
var sm_reCRLF = /\s+/g;
var sm_reInteger = /^\d+$/;
var sm_reIsRequired = /^(\S+)_required$/i;
var sm_reIsInteger = /^(\S+)_integer$/i;
var sm_reIsFloat = /^(\S+)_float$/i;
var sm_reIsDate = /^(\S+)_date$/i;
var sm_reIsEuroDate = /^(\S+)_eurodate$/i;
var sm_reIsTime = /^(\S+)_time$/i;
var sm_reIsRange = /^(\S+)_range$/i;
var sm_reIsEmail = /^(\S+)_email$/i;
var sm_reIsMultiEmails = /^(\S+)_multiemails$/i;
var sm_reMinRange = /MIN\s*=\s*(\d+\.?\d*|\.?\d+)/i;
var sm_reMaxRange = /MAX\s*=\s*(\d+\.?\d*|\.?\d+)/i;
// var sm_reEmail = /^\s*[-.:\w]+@([a-zA-Z0-9]{1,2}|[a-zA-Z0-9][-a-zA-Z0-9]+[a-zA-Z0-9])(\.([a-zA-Z0-9]{1,2}|[a-zA-Z0-9][-a-zA-Z0-9]+[a-zA-Z0-9]))+\s*$/i;
var sm_reEmail = /^\s*[-.:\w]+@([a-zA-Z0-9][-a-zA-Z0-9]+[a-zA-Z0-9]|[a-zA-Z0-9]{1,2})(\.([a-zA-Z0-9][-a-zA-Z0-9]+[a-zA-Z0-9]|[a-zA-Z0-9]{1,2}))+\s*$/i;
var sm_reMultiEmails = /^\s*([-.:\w]+@([a-zA-Z0-9][-a-zA-Z0-9]+[a-zA-Z0-9]|[a-zA-Z0-9]{1,2})(\.([a-zA-Z0-9][-a-zA-Z0-9]+[a-zA-Z0-9]|[a-zA-Z0-9]{1,2}))+)(\s*[,;]\s*[-.:\w]+@([a-zA-Z0-9][-a-zA-Z0-9]+[a-zA-Z0-9]|[a-zA-Z0-9]{1,2})(\.([a-zA-Z0-9][-a-zA-Z0-9]+[a-zA-Z0-9]|[a-zA-Z0-9]{1,2}))+)*\s*$/i;
var sm_reDate = /^(?=\d)(?:(?:(?:(?:(?:0?[13578]|1[02])(\/|-|\.)31)\1|(?:(?:0?[1,3-9]|1[0-2])(\/|-|\.)(?:29|30)\2))(?:(?:1[6-9]|[2-9]\d)?\d{2})|(?:0?2(\/|-|\.)29\3(?:(?:(?:1[6-9]|[2-9]\d)?(?:0[48]|[2468][048]|[13579][26])|(?:(?:16|[2468][048]|[3579][26])00))))|(?:(?:0?[1-9])|(?:1[0-2]))(\/|-|\.)(?:0?[1-9]|1\d|2[0-8])\4(?:(?:1[6-9]|[2-9]\d)?\d{2}))($|\ (?=\d)))?(((0?[1-9]|1[012])(:[0-5]\d){0,2}(\ [AP]M))|([01]\d|2[0-3])(:[0-5]\d){1,2})?$/;
var sm_reEuroDate = /^((((0?[1-9]|[12]\d|3[01])[\.\-\/](0?[13578]|1[02])[\.\-\/]((1[6-9]|[2-9]\d)?\d{2}))|((0?[1-9]|[12]\d|30)[\.\-\/](0?[13456789]|1[012])[\.\-\/]((1[6-9]|[2-9]\d)?\d{2}))|((0?[1-9]|1\d|2[0-8])[\.\-\/]0?2[\.\-\/]((1[6-9]|[2-9]\d)?\d{2}))|(29[\.\-\/]0?2[\.\-\/]((1[6-9]|[2-9]\d)?(0[48]|[2468][048]|[13579][26])|((16|[2468][048]|[3579][26])00)|00)))|(((0[1-9]|[12]\d|3[01])(0[13578]|1[02])((1[6-9]|[2-9]\d)?\d{2}))|((0[1-9]|[12]\d|30)(0[13456789]|1[012])((1[6-9]|[2-9]\d)?\d{2}))|((0[1-9]|1\d|2[0-8])02((1[6-9]|[2-9]\d)?\d{2}))|(2902((1[6-9]|[2-9]\d)?(0[48]|[2468][048]|[13579][26])|((16|[2468][048]|[3579][26])00)|00))))$/;
function sm_Trim(s) {
	var mystr = s;
	var myArr = sm_reEmpty.exec(mystr);
	if (myArr != null) {
		return "";
	}
	var myArr = sm_reLeading.exec(mystr);
	if (myArr != null) {
		if (RegExp.rightContext) {
			mystr = RegExp.rightContext;
		} else {
			mystr = mystr.substring(RegExp.$1.length, mystr.length);
		}
	}
	myArr = sm_reEnding.exec(mystr);
	if (myArr != null) {
		if (RegExp.leftContext) {
			mystr = RegExp.leftContext;
		} else {
			mystr = mystr.substring(0, (mystr.length - RegExp.$1.length));
		}
	}
	return mystr;
}
function sm_StripCRLF(s) {
	return s.replace(sm_reCRLF, " ");
}
function sm_IsArray(o) {
	return (typeof(o) == "object" && typeof(o.length) == "number");
}
function sm_IsRadio(o) {
	return (o.type == "radio");
}
function sm_IsCheckBox(o) {
	return (o.type == "checkbox");
}
function sm_IsFileUpload(o) {
	return (o.type == 'file');
}
function sm_IsSelectMulti(o) {
	return (o.type == "select-multiple");
}
function sm_IsSelectOne(o) {
	return (o.type == "select-one");
}
function sm_IsSelect(o) {
	return (sm_IsSelectMulti(o) || sm_IsSelectOne(o));
}
function sm_IsHidden(o) {
	return (o.type == "hidden");
}
function sm_IsInputText(o) {
	return (o.type == "text");
}
function sm_IsTextarea(o) {
	return (o.type == "textarea");
}
function sm_IsPassword(o) {
	return (o.type == "password");
}
function sm_IsSubmit(o) {
	return (o.type == "submit");
}
function sm_IsDate(s) {
	if (sm_reDate.test(s))
	{
		var oDate = Date.parse(s);
		if (isNaN(oDate)) {
			return false;
		}
		oDate = new Date(s);
		if (oDate.getFullYear() < 1900) {
			return false;
		}
		return true;
	}
	return false;
}
function sm_IsEuroDate(s) {
	if (sm_reEuroDate.test(s))
	{
		return true;
	}
	return false;
}
function sm_IsTime(s) {
	var dtToday = new Date();
	var strToday = (dtToday.getMonth()+1) + "/" + dtToday.getDate() + "/" + dtToday.getFullYear();

	var lgnTest = Date.parse(strToday+" "+s);
	if (isNaN(lgnTest)) return false;
	var datTest = new Date();
	datTest.setTime(lgnTest);
	if (datTest.getFullYear() < 1900) return false;
	return true;
}
function sm_IsFloat(s) {
	return (!isNaN(parseFloat(s)));
}
function sm_IsInt(s) {
	return (sm_reInteger.test(s));
}
function sm_IsWithinRange(n, lower, upper) {
	var f = parseFloat(n);
	if (isNaN(f)) return true;
	var isOK = true;
	var l = parseFloat(lower);
	if (!isNaN(l) && (l > f)) {
		isOK = false;
	}
	var u = parseFloat(upper);
	if (!isNaN(u) && (f > u)) {
		isOK = false;
	}
	return isOK;
}
function sm_IsEmail(s) {
	return (sm_reEmail.test(s));
}
function sm_IsMultiEmails(s) {
	return (sm_reMultiEmails.test(s));
}
function sm_IsACheckObj(o, re) {
	if (!o.name) return false;
	return re.test(o.name);
}
function sm_IsRequired(o) {
	return sm_IsACheckObj(o, sm_reIsRequired);
}
function sm_IsIntegerObj(o) {
	return sm_IsACheckObj(o, sm_reIsInteger);
}
function sm_IsFloatObj(o) {
	return sm_IsACheckObj(o, sm_reIsFloat);
}
function sm_IsDateObj(o) {
	return sm_IsACheckObj(o, sm_reIsDate);
}
function sm_IsEuroDateObj(o) {
	return sm_IsACheckObj(o, sm_reIsEuroDate);
}
function sm_IsTimeObj(o) {
	return sm_IsACheckObj(o, sm_reIsTime);
}
function sm_IsRangeObj(o) {
	return sm_IsACheckObj(o, sm_reIsRange);
}
function sm_IsEmailObj(o) {
	return sm_IsACheckObj(o, sm_reIsEmail);
}
function sm_IsMultiEmailsObj(o) {
	return sm_IsACheckObj(o, sm_reIsMultiEmails);
}
function sm_GetAnObjToCheck(o, re) {
	if (!sm_IsACheckObj(o, re)) return null;
	var arrName = re.exec(o.name);
	if (arrName == null) return null;
	return (o.form[arrName[1]]);
}
function sm_GetRequiredObj(o) {
	return sm_GetAnObjToCheck(o, sm_reIsRequired);
}
function sm_GetIntegerObj(o) {
	return sm_GetAnObjToCheck(o, sm_reIsInteger);
}
function sm_GetFloatObj(o) {
	return sm_GetAnObjToCheck(o, sm_reIsFloat);
}
function sm_GetDateObj(o) {
	return sm_GetAnObjToCheck(o, sm_reIsDate);
}
function sm_GetEuroDateObj(o) {
	return sm_GetAnObjToCheck(o, sm_reIsEuroDate);
}
function sm_GetTimeObj(o) {
	return sm_GetAnObjToCheck(o, sm_reIsTime);
}
function sm_GetRangeObj(o) {
	return sm_GetAnObjToCheck(o, sm_reIsRange);
}
function sm_GetEmailObj(o) {
	return sm_GetAnObjToCheck(o, sm_reIsEmail);
}
function sm_GetMultiEmailsObj(o) {
	return sm_GetAnObjToCheck(o, sm_reIsMultiEmails);
}
function sm_CheckRequiredElement(o) {
	if (typeof(o) != "object") return false;
	if (sm_IsSelectOne(o)) {
		if (o.selectedIndex < 0) return false;
		var objoption = o.options[o.selectedIndex];
		return (objoption.value.length > 0);
	} else if (sm_IsSelectMulti(o)) {
		if (o.selectedIndex < 0) return false;
		var x;
		var isOK = false;
		for (x = 0; x < o.length && !isOK; x++) {
			isOK = o.options[x].selected && o.options[x].value.length > 0;
		}
		return isOK;
	} else if (sm_IsRadio(o) || sm_IsCheckBox(o)) {
		return o.checked;
	} else if (sm_IsHidden(o) || sm_IsInputText(o) || sm_IsTextarea(o) || sm_IsPassword(o)) {
		var strValue = sm_Trim(o.value);
		return (strValue.length > 0);
	} else if (sm_IsSubmit(o)) {
		return true;
	} else if (sm_IsArray(o)) {
		var x;
		var isOK = false;
		for (x = 0; x < o.length && !isOK; x++) {
			isOK = sm_CheckRequiredElement(o[x]);
		}
		return isOK;
	} else if (sm_IsFileUpload(o)) {
		// we don't know for sure due to client-side security.
		// depend on server side checks.
		return true;
	} else {
		return false;
	}
}
function sm_IsThisRequired(ho, re) {
	var arrName = re.exec(ho.name);
	if (arrName == null) return null;
	var strName = arrName[1];
	if (ho.form[strName+"_required"]) {
		return true;
	} else {
		return false;
	}
}
function sm_CheckValueTypeElement(o, fn, breq) {
	if (typeof(o) != "object") return true;
	if (sm_IsSelectOne(o)) {
		if (o.selectedIndex < 0) return true;
		var objoption = o.options[o.selectedIndex];
		if (fn(objoption.value)) {
			return true;
		} else if (breq) {
			return false;
		} else {
			// Not required but it is not of this type.
			return (objoption.value.length == 0);
		}
	} else if (sm_IsSelectMulti(o)) {
		if (o.selectedIndex < 0) return true;
		var x;
		var isOK = true;
		for (x = 0; x < o.length && isOK; x++) {
			if (o.options[x].selected) {
				isOK = fn(o.options[x].value);
				if (!(isOK || breq)) {
					isOK = (o.options[x].value.length == 0);
				}
			}
		}
		return isOK;
	} else if (sm_IsRadio(o) || sm_IsCheckBox(o)) {
		if (o.checked) {
			if (fn(o.value)) {
				return true;
			} else if (breq) {
				return false;
			} else {
				// Not required but it is not of this type.
				return (o.value.length == 0);
			}
		} else {
			return true;
		}
	} else if (sm_IsHidden(o) || sm_IsInputText(o) || sm_IsTextarea(o) || sm_IsPassword(o)) {
		if (fn(o.value)) {
			return true;
		} else if (breq) {
			return false;
		} else {
			// Not required but it is not of this type.
			return (o.value.length == 0);
		}
	} else if (sm_IsArray(o)) {
		var x;
		var isOK = true;
		for (x = 0; x < o.length && isOK; x++) {
			// Possible Recursion
			isOK = sm_CheckValueTypeElement(o[x], fn, breq);
		}
		return isOK;
	} else {
		return true;
	}
}
function sm_CheckIntegerElement(ho, fn) {
	var o = fn(ho);
	o.value = sm_Trim(o.value);
	var breq = sm_IsThisRequired(ho, sm_reIsInteger);
	return sm_CheckValueTypeElement(o, sm_IsInt, breq);
}
function sm_CheckFloatElement(ho, fn) {
	var o = fn(ho);
	o.value = sm_Trim(o.value);
	var breq = sm_IsThisRequired(ho, sm_reIsFloat);
	return sm_CheckValueTypeElement(o, sm_IsFloat, breq);
}
function sm_CheckDateElement(ho, fn) {
	var o = fn(ho);
	o.value = sm_Trim(o.value);
	var breq = sm_IsThisRequired(ho, sm_reIsDate);
	return sm_CheckValueTypeElement(o, sm_IsDate, breq);
}
function sm_CheckEuroDateElement(ho, fn) {
	var o = fn(ho);
	o.value = sm_Trim(o.value);
	var breq = sm_IsThisRequired(ho, sm_reIsEuroDate);
	return sm_CheckValueTypeElement(o, sm_IsEuroDate, breq);
}
function sm_CheckTimeElement(ho, fn) {
	var o = fn(ho);
	o.value = sm_Trim(o.value);
	var breq = sm_IsThisRequired(ho, sm_reIsTime);
	return sm_CheckValueTypeElement(o, sm_IsTime, breq);
}
function sm_CheckRangeElement(ho, fn) {
	var r = ho.value;
	var o = fn(ho);
	var breq = sm_IsThisRequired(ho, sm_reIsRange);
	var lower = "null";
	var upper = "null";
	var arrRange;
	arrRange = sm_reMinRange.exec(r);
	if (arrRange != null) {
		lower = parseFloat(arrRange[1]);
	}
	arrRange = sm_reMaxRange.exec(r);
	if (arrRange != null) {
		upper = parseFloat(arrRange[1]);
	}

	var fnBody = "return sm_IsWithinRange(n,"+lower+","+upper+");";

	var rfn = new Function("n", fnBody);
	return sm_CheckValueTypeElement(o, rfn, breq);
}
function sm_CheckEmailElement(ho, fn) {
	var o = fn(ho);
	var breq = sm_IsThisRequired(ho, sm_reIsEmail);
	return sm_CheckValueTypeElement(o, sm_IsEmail, breq);
}
function sm_CheckMultiEmailsElement(ho, fn) {
	var o = fn(ho);
	var breq = sm_IsThisRequired(ho, sm_reIsMultiEmails);
	return sm_CheckValueTypeElement(o, sm_IsMultiEmails, breq);
}
// Takes care of checkboxes, radio buttons, and hidden forms
function sm_IsDeleteActionForm(f) {
	var i = 0;
	var o = null;
	for (i = 0; i < f.elements.length; i++) {
		o = f.elements[i];
		if (o.name.toLowerCase() == "action" && (o.value.toLowerCase() == "postdelete")) {
			if (sm_IsRadio(o) || sm_IsCheckBox(o)) {
				return o.checked;
			} else if (sm_IsHidden(o)) {
				return true;
			}
		}
	}
	return false;
}
var sm_DisabledHiddenFieldNameSuffix = "_smdisabled";
function sm_removeALLrequiredhiddenfields(f) {
	var i = 0;
	var o = null;
	for (i = 0; i < f.elements.length; i++) {
		o = f.elements[i];
		if (	sm_IsHidden(o)
			&&	(	sm_IsRequired(o)
				||	sm_IsIntegerObj(o)
				||	sm_IsFloatObj(o)
				||	sm_IsDateObj(o)
				||	sm_IsEuroDateObj(o)
				||	sm_IsTimeObj(o)
				||	sm_IsRangeObj(o)
				||	sm_IsEmailObj(o)
				||	sm_IsMultiEmailsObj(o)
				)
		)
		{
			o.name += sm_DisabledHiddenFieldNameSuffix;
		}
	}
	return true;
}
var sm_DeleteConfirmationPromptText = "Are you sure you want to delete this record?\nClick 'OK' to delete, or click 'Cancel' otherwise.";
function sm_ValidateForm(f, confirmDelete) {
	var obj = f.elements;
	var x, o;
	var errmsg = "";
	var confDel = (confirmDelete == undefined || confirmDelete == null) ? false : confirmDelete;
	var bDeleteConfirmed = false;
	
	if (confDel && sm_IsDeleteActionForm(f)) {
		bDeleteConfirmed = window.confirm(sm_DeleteConfirmationPromptText);
		if (bDeleteConfirmed) {
			sm_removeALLrequiredhiddenfields(f);
		}
		return bDeleteConfirmed;
	}
	
	for (x = 0; x < obj.length; x++) {
		o = obj[x];
		if (sm_IsHidden(o)) {
			if (sm_IsRequired(o)) {
				var oreq = sm_GetRequiredObj(o);
				if (!sm_CheckRequiredElement(oreq)) {
					errmsg += "* " + o.value + "\n";
				}
			} else if (sm_IsIntegerObj(o)) {
				if (!sm_CheckIntegerElement(o, sm_GetIntegerObj)) {
					errmsg += "* " + o.value + "\n";
				}
			} else if (sm_IsFloatObj(o)) {
				if (!sm_CheckFloatElement(o, sm_GetFloatObj)) {
					errmsg += "* " + o.value + "\n";
				}
			} else if (sm_IsDateObj(o)) {
				if (!sm_CheckDateElement(o, sm_GetDateObj)) {
					errmsg += "* " + o.value + "\n";
				}
			} else if (sm_IsEuroDateObj(o)) {
				if (!sm_CheckEuroDateElement(o, sm_GetEuroDateObj)) {
					errmsg += "* " + o.value + "\n";
				}
			} else if (sm_IsTimeObj(o)) {
				if (document.getElementById(o.name.replace(/_time$/,""))){
					document.getElementById(o.name.replace(/_time$/,"")).value = document.getElementById(o.name.replace(/_time$/,"")).value.replace(/\./g,"");
				}
				if (!sm_CheckTimeElement(o, sm_GetTimeObj)) {
					errmsg += "* " + o.value + "\n";
				}
			} else if (sm_IsRangeObj(o)) {
				if (!sm_CheckRangeElement(o, sm_GetRangeObj)) {
					errmsg += "* " + o.name + " is restricted to " + sm_StripCRLF(o.value) + "\n";
				}
			} else if (sm_IsEmailObj(o)) {
				if (!sm_CheckEmailElement(o, sm_GetEmailObj)) {
					errmsg += "* " + o.value + "\n";
				}
			} else if (sm_IsMultiEmailsObj(o)) {
				if (!sm_CheckMultiEmailsElement(o, sm_GetMultiEmailsObj)) {
					errmsg += "* " + o.value + "\n";
				}
			}
		}
	}
	if (errmsg.length > 0) {
		window.alert(errmsg);
		return false;
	}
	return true;
}

function getCookie(Name) {
	var search = Name + "=";
	if (document.cookie.length > 0) { // if there are any cookies
		var offset = document.cookie.indexOf(search);
		if (offset != -1) { // if cookie exists
			offset += search.length; // set index of beginning of value
			var end = document.cookie.indexOf(";", offset); // set index of end of cookie value
			if (end == -1)
				end = document.cookie.length;
				return unescape(document.cookie.substring(offset, end));
		}
	}
	return null;
}
function setCookie(name, value, expire, domain, path) {
	var escval = escape(value);
	if ((escval.length + name.length) > 4096) return false;
	document.cookie = name + "=" 
		+ escval
		+ ((expire == null || expire.length == 0) ? "" : ("; EXPIRES=" + expire.toUTCString()))
		+ ((domain == null || domain.length == 0) ? "" : ("; DOMAIN=" + domain))
		+ ((path == null || path.length == 0) ? "" : ("; PATH=" + path));
	return true;
}
function StoreCookie(f) {
	var expireDate;
	var userName;
	
	expireDate = new Date();
	expireDate.setMonth(expireDate.getMonth() + 6);
	userName = f.strUserName.value;
	setCookie("un", userName, expireDate, window.location.host, "");
}
function ReadCookie() {
	var data = getCookie("un");
	if (data != null && document.frmLogin) {
		if (document.frmLogin.strUserName.value.length > 0) {
			var expireDate= new Date();
			setCookie("un", "", expireDate, window.location.host, "");
		} else {
			document.frmLogin.strUserName.value = data;
		}
	}
}
var jsMyHealthRememberUserNameOnloadBackup = null;
function jsMyHealthRememberUserNameOnload() {
	if (jsMyHealthRememberUserNameOnloadBackup != null) {
		jsMyHealthRememberUserNameOnloadBackup();
	}
	ReadCookie();
	return true;
}
if (window.onload) {
	jsMyHealthRememberUserNameOnloadBackup = window.onload;
}
window.onload = jsMyHealthRememberUserNameOnload;
