function validateString(sFieldName, txtField, iOptionalMaxWidth) {
	//alert("validateString "+sFieldName+" value=["+txtField.value+"]");
	if (isValidString(txtField.value, iOptionalMaxWidth))
		return true;
   var msg = sFieldName + " is a required field"
   if (iOptionalMaxWidth!=null)
      msg+=" and must be less than or equal to " + iOptionalMaxWidth +
           " characters (currently it is " + txtField.value + ")"
	alert(msg);
	txtField.focus();
	return false;
}
function validatePassword(txtPassword, txtPasswordConfirm) {
	if (!validateString("Password", txtPassword))
		return false;
	if (!validateString("Password confirm", txtPasswordConfirm))
		return false;
	if (txtPassword.value==txtPasswordConfirm.value)
		return true;
	alert("Password and password confirm must match.");
	txtPassword.focus();
	return false;
}
function validateEmail(sFieldName, txtField) {
	if (!validateString(sFieldName, txtField))
		return false;
	var re = new RegExp("^\\S+@\\S+\\.\\S+$", "i");
	if (re.test(txtField.value))
		return true;
	alert(sFieldName + " must be a valid e-mail address.");
	txtField.focus();
	return false;
}
function checkTextLength(txtField, iMaxWidth) {
   if (txtField.value.length>iMaxWidth) {
      alert("Field cannot contain more than " + iMaxWidth + " characters.");
      txtField.value=txtField.value.substring(0,iMaxWidth);
   }
   window.status = "Field size: " + txtField.value.length + " chars of " + iMaxWidth + " [" + Math.round(100*txtField.value.length/iMaxWidth) + "%]";
}

// helper function
function isValidString(sString, iOptionalMaxWidth) {
   var sNewStr = trim(sString)
   if (sNewStr=="")
      return false;
   if (iOptionalMaxWidth!=null)
      return (sNewStr.length<=iOptionalMaxWidth);
   return true;
}
function trim(sStr) {
// todo: implement this
   return sStr;
}
