// <!--

/********************************************************
 * ValidateDate()
 *********************************************************/
function ValidateDate(field, msg) {
  var val = "";

  if (!field.value.length==0) {
    if (!ParseDate(field.value)) {
      alert(msg);
      //field.focus();
      //field.select();
      //return (field.value);
    } else {
      val = FormatDate(field.value);
    }
  }
  return (val);
}

/********************************************************
 * ParseDate()
 * Returns true if date is in one of the following formats:
 *	dd/mm/yy	dd/mm/yyyy
 *	dd-mm-yy	dd-mm-yyyy
 *	dd.mm.yy	dd.mm.yyyy
 *********************************************************/
function ParseDate(str) {
  
  var reg1 = /^\d{1,2}(\-|\/|\.)\d{1,2}\1\d{2}$/;
  var reg2 = /^\d{1,2}(\-|\/|\.)\d{1,2}\1\d{4}$/;

   // If it doesn't conform to the right format (with either a 2 digit year or 4 digit year), fail
   if ( (reg1.test(str) == false) && (reg2.test(str) == false) ) {
     return false; 
   }

   var parts = str.split(RegExp.$1); // Split into 3 parts based on what the divider was

   // check to see if the 3 parts end up making a valid date
   var dd = parts[1]; // day second
   var mm = parts[0]; // month first
   var yy = parts[2]; // year last

   if (parseFloat(yy) <= 50) {
     yy = (parseFloat(yy) + 2000).toString();
   }
   if (parseFloat(yy) <= 99) {
     yy = (parseFloat(yy) + 1900).toString();
   }

   var dt = new Date(parseFloat(yy), parseFloat(mm)-1, parseFloat(dd), 0, 0, 0, 0);

   if (parseFloat(dd) != dt.getDate()) {
     return false;
   }

   if (parseFloat(mm)-1 != dt.getMonth()) {
     return false;
   }

   return true;
}

/********************************************************
 * FormatDate()
 * If date is valid (see ParseDate), converts to format dd/mm/yyyy
 *********************************************************/
function FormatDate(str) {

  var reg1 = /^\d{1,2}(\-|\/|\.)\d{1,2}\1\d{2}$/;
  var reg2 = /^\d{1,2}(\-|\/|\.)\d{1,2}\1\d{4}$/;

   // If it doesn't conform to the right format (with either a 2 digit year or 4 digit year), return empty string
   if ( (reg1.test(str) == false) && (reg2.test(str) == false) ) {
     return ("");
   }

   var parts = str.split(RegExp.$1); // Split into 3 parts based on what the divider was

   // check to see if the 3 parts end up making a valid date
   var dd = parts[1]; // day second
   var mm = parts[0]; // month first
   var yy = parts[2]; // year last

   if (parseFloat(yy) <= 50) {
     yy = (parseFloat(yy) + 2000).toString();
   }
   if (parseFloat(yy) <= 99) {
     yy = (parseFloat(yy) + 1900).toString();
   }

   return (mm + '/' + dd + '/' + yy);

}

/********************************************************
 * ValidateTime()
 *********************************************************/
function ValidateTime(field, msg) {
  var val = "";

  if (!field.value.length==0) {
    if (!ParseTime(field.value)) {
      alert(msg);
      //field.focus();
      //field.select();
      //return (field.value);
    } else {
      val = FormatTime(field.value);
    }
  }
  return (val);
}

/********************************************************
 * ParseTime()
 *********************************************************/
function ParseTime(str) {
  var re = /^(1[0-2]|[1-9]):([0-5][0-9])(am|pm)$/;

  return (re.test(str));
} 

/********************************************************
 * FormatTime()
 *********************************************************/
function FormatTime(str) {
  return(str);
}

/********************************************************
 * ValidateZip()
 *********************************************************/
function ValidateZip(field, msg) {
  var val = "";

  if (!field.value.length==0) {
    if (!ParseZip(field.value)) {
      alert(msg);
      //field.focus();
      //field.select();
      //return (field.value);
    } else {
      val = FormatZip(field.value);
    }
  }
  return (val);
}

/********************************************************
 * ParseZip()
 * Returns true if zip has 5 digits, optionally followed
 * by a hyphen and 4 digits.
 *********************************************************/
function ParseZip(str) {
  var re = /^\d{5}(-?\d{4})?$/;

  return (re.test(str));
} 

/********************************************************
 * FormatZip()
 *********************************************************/
function FormatZip(str) {
  return(str);
}

/********************************************************
 * ValidateEmail()
 *********************************************************/
function ValidateEmail(field, msg) {
  var val = "";

  if (!field.value.length==0) {
    if (!ParseEmail(field.value)) {
      alert(msg);
      //field.focus();
      //field.select();
      //return (field.value);
    } else {
      val = FormatEmail(field.value);
    }
  }
  return (val);
}

/********************************************************
 * ParseEmail()
 *********************************************************/
function ParseEmail(str) {
  // var re = /^[\w\.-]+@[\w\.-]+\.[a-zA-Z]+$/;
  var re = /^(([^<>()[\]\\.,;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|(\".+\"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/;

  return (re.test(str));
}

/********************************************************
 * FormatEmail()
 *********************************************************/
function FormatEmail(str) {
  return(str);
}

/********************************************************
 * ValidatePhone()
 *********************************************************/
function ValidatePhone(field, msg) {
  var val = "";

  if (!field.value.length==0) {
    if (!ParsePhone(field.value)) {
      alert(msg + ' Example: 555-555-5555x555');
      //field.focus();
      //field.select();
      //return (field.value);
    } else {
      val = FormatPhone(field.value);
    }
  }
  return (val);
}

/********************************************************
 * ParsePhone()
 * Returns true if phone number has 7 digits with or
 * without separation by parentheses (for area code),
 * hyphens, periods, or spaces, e.g.
 *	(xxx) xxx-xxxx
 *	xxx xxx xxxx
 *	xxx.xxx.xxxx
 *	xxx-xxx-xxxx
 * etc.
 *********************************************************/
function ParsePhone(str) {
  //  var re = /^\(?\d{3}\)?\s|-\d{3}-\d{4}$/;

  //  var re = /^\(?(\d{3})\)?[\.\-\/ ]?(\d{3})[\.\-\/ ]?(\d{4})$/;

  // allow phone extension
  var re = /^\(?(\d{3})\)?[\.\-\/ ]?(\d{3})[\.\-\/ ]?(\d{4})(\ )*(x[0-9]{1,4})?$/;

  return (re.test(str));
}

/********************************************************
 * FormatPhone()
 * If phone number is valid (see ParsePhone), converts to format (xxx) xxx-xxxx
 *********************************************************/
function FormatPhone(str) {

  // retrieve each digit
  var nums = str.match(/\d/g);

  outstr = "(" + nums[0]+nums[1]+nums[2] + ") " + nums[3]+nums[4]+nums[5] + "-" + nums[6]+nums[7]+nums[8]+nums[9];

  var parts = str.split('x'); 

  // if there is an extension, format it
  if (parts.length>1) {
    outstr = outstr + "x" + parts[1];
  }

  return(outstr);
			
}

/********************************************************
 * ValidateInternationalPhone()
 *********************************************************/
function ValidateInternationalPhone(field, msg) {
  var val = "";

  if (!field.value.length==0) {
    if (!ParseInternationalPhone(field.value)) {
      alert(msg);
      //field.focus();
      //field.select();
      //return (field.value);
    } else {
      val = FormatInternationalPhone(field.value);
    }
  }
  return (val);
}

/********************************************************
 * ParseInternationalPhone()
 *********************************************************/
function ParseInternationalPhone(str) {

  var re = /^(\(?\+?[0-9]*\)?)?[0-9_\- \(\)]*$/;

  return (re.test(str));
}

/********************************************************
 * FormatInternationalPhone()
 * If phone satisfies US format, then add parentheses and
 * hyphens. Otherwise, return as is.
 *********************************************************/
function FormatInternationalPhone(str) {

  if (ParsePhone(str)) {
    str = FormatPhone(str);
  }

  return(str);
}

/********************************************************
 * ValidateURL()
 *********************************************************/
function ValidateURL(field, msg) {
  var val = "";

  if (!field.value.length==0) {
    if (!ParseURL(field.value)) {
      alert(msg);
      //field.focus();
      //field.select();
      //return (field.value);
    } else {
      val = FormatURL(field.value);
    }
  }
  return (val);
}

/********************************************************
 * ParseURL()
 *********************************************************/
function ParseURL(str) {

  var re = /^(http?:\/\/)?(([0-9a-z_!~*'().&=+$%-]+:)?[0-9a-z_!~*'().&=+$%-]+@)?(([0-9]{1,3}\.){3}[0-9]{1,3}|([0-9a-z_!~*'()-]+\.)*([0-9a-z][0-9a-z-]{0,61})?[0-9a-z]\.[a-z]{2,6})(:[0-9]{1,4})?((\/?)|(\/[0-9a-z_!~*'().;?:@&=+$,%#-]+)+\/?)$/;
  /*re.test(str)*/
  return (true);
}

/********************************************************
 * FormatURL()
 *********************************************************/
function FormatURL(str) {

   var re = /^(https?:\/\/)?(([0-9a-z_!~*'().&=+$%-]+:)?[0-9a-z_!~*'().&=+$%-]+@)?(([0-9]{1,3}\.){3}[0-9]{1,3}|([0-9a-z_!~*'()-]+\.)*([0-9a-z][0-9a-z-]{0,61})?[0-9a-z]\.[a-z]{2,6})(:[0-9]{1,4})?((\/?)|(\/[0-9a-z_!~*'().;?:@&=+$,%#-]+)+\/?)$/;

   var parts = str.split('//'); 

   // if there is nothing before the double slash, add default "http:"
   if (parts.length==1) {
     str = 'http://' + parts[0];
   }
   
  return(str);
}

/********************************************************
 * ValidateCurrency()
 *********************************************************/
function ValidateCurrency(field, msg) {
  var val = "";

  if (!field.value.length==0) {
    if (!ParseCurrency(field.value)) {
      alert(msg);
      //field.focus();
      //field.select();
      //return (field.value);
    } else {
      val = FormatCurrency(field.value);
    }
  }
  return (val);
}

/********************************************************
 * ParseCurrency()
 *********************************************************/
function ParseCurrency(str) {
  //  var re = /^$?[-+]?\d+(\.\d+)?$/;

  var re = /^\$?([1-9]{1}[0-9]{0,2}(\,[0-9]{3})*(\.[0-9]{0,2})?|[1-9]{1}[0-9]{0,}(\.[0-9]{0,2})?|0(\.[0-9]{0,2})?|(\.[0-9]{1,2})?)$/;

  return (re.test(str));
}

/********************************************************
 * FormatCurrency()
 *********************************************************/
function FormatCurrency(str) {

  var dec = 0;
  var i;

  str = str.replace(/\$|\,/g,'');

  if(isNaN(str))
    str = "0";

  // look for decimal point
  for (i=0; i < str.length; i++){
    if (str.charAt(i)==".") {
      // decimal point found
      dec = 1;
      break;
    }
  }

  if (!dec) {
    // no decimal point found, so add decimal point and 2 zeros
    str = str + ".00";
  } else if (str.charAt(str.length-1)==".") {
    // decimal point found with no digits to right, so add 2 zeros
    str = str + "00";
  } else if (str.charAt(str.length-2)==".") {
    // decimal point found with 1 digit to right, so add zero
    str = str + "0";
  }
  //   else {
  //   decimal point found with more than 2 digits to left, so round to nearest hundredth
  //      str = Math.round(str*100)/100;
  //    }

  return (str);
}

/********************************************************
 * ValidateInteger()
 *********************************************************/
function ValidateInteger(field, msg) {
  var val = "";

  if (!field.value.length==0) {
    if (!ParseInteger(field.value)) {
      alert(msg);
      //field.focus();
      //field.select();
      //return (field.value);
    } else {
      val = FormatInteger(field.value);
    }
  }
  return (val);
}

/********************************************************
 * ParseInteger()
 *********************************************************/
function ParseInteger(str) {

  var chr;
  var i;

  str = str.replace(/\,/g,'');

  if (str.length==0)
    str = 0;

  str = str.toLowerCase( );

  for(i = 0; i < str.length; i++ ) {
    chr = str.charAt( i );
    if( !((chr >= '0') && (chr <= '9')) ) {
      return( false );
    }
  }
  return( true );

  //  return (!isNaN(parseInt(str)));
}

/********************************************************
 * FormatInteger()
 *********************************************************/
function FormatInteger(str) {

  if (str.length==0 || str=="")
    str = "0";

  str = str.replace(/\,/g,'');
  
  return(str);
}


/********************************************************
 * ValidateDecimal()
 *********************************************************/
function ValidateDecimal(field, msg) {
  var val = "";

  if (!field.value.length==0) {
    if (!ParseDecimal(field.value)) {
      alert(msg);
      //field.focus();
      // field.select();
      //return (field.value);
    } else {
      val = FormatDecimal(field.value);
    }
  }
  return (val);
}

/********************************************************
 * ParseDecimal()
 *********************************************************/
function ParseDecimal(str) {

  var re = /^\$?([1-9]{1}[0-9]{0,2}(\,[0-9]{3})*(\.[0-9]{0,2})?|[1-9]{1}[0-9]{0,}(\.[0-9]{0,2})?|0(\.[0-9]{0,2})?|(\.[0-9]{1,2})?)$/;

  return (re.test(str));
}

/********************************************************
 * FormatDecimal()
 *********************************************************/
function FormatDecimal(str) {

  var dec = 0;
  var i;

  str = str.replace(/\,/g,'');

  if(isNaN(str))
    str = "0.0";
  
  return(str);
}


/********************************************************
 * ValidateRange()
 *********************************************************/
function ValidateRange(field, minvalue, maxvalue, msg) {
  var val = "";

  if (!field.value.length==0) {
    if (!ParseInteger(field.value) || field.value<minvalue || field.value>maxvalue) {
	  if (field.value<minvalue)  msg = msg + " Must be greater than or equal to " + minvalue + ".";
	  if (field.value>maxvalue)  msg = msg + " Must be less than or equal to " + maxvalue + ".";	  
      alert(msg);
    } else {
      val = FormatInteger(field.value);
    }
  }
  return (val);
}

/********************************************************
 * ValidateSSN()
 *********************************************************/
function ValidateSSN(field, msg) {
  var val = "";

  if (!field.value.length==0) {
    if (!ParseSSN(field.value)) {
      alert(msg);
      //field.focus();
      //field.select();
      //return (field.value);
    } else {
      val = FormatSSN(field.value);
    }
  }
  return (val);
}

/********************************************************
 * ParseSSN()
 *********************************************************/
function ParseSSN(str) {
  var re1 = /^\d{3}\-\d{2}\-\d{4}$/;
  var re2 = /^\d{9}$/;

  return (re.test(str) || re.test(str));
} 

/********************************************************
 * FormatSSN()
 *********************************************************/
function FormatSSN(str) {

  // retrieve each digit
  var nums = str.match(/\d/g);

  return nums[0]+nums[1]+nums[2] + "-" + nums[3]+nums[4] + "-" + nums[5]+nums[6]+nums[7]+nums[8];

  return(str);
}


/********************************************************
 * ValidateNonempty()
 *********************************************************/
function ValidateNonempty(field, msg) {
  var val = "";

  if (field.value.length==0) {
    alert(msg);
    //field.focus();
    // field.select();
  }
  val = field.value;
  return (val);
}



/********************************************************
 * ValidateYearDate()
 *
 * Allow either year or date
 *********************************************************/
function ValidateYearDate(field, msg) {
  var val = "";

  if (!field.value.length==0) {
    if (!ParseDate(field.value) && !ParseInteger(field.value)) {
	alert(msg);
	//field.focus();
	//field.select();
	//return (field.value);
    } else if (ParseInteger(field.value)) {
      if ((field.value<1900) || (field.value>9999)) {
	alert(msg);
	//field.focus();
	//field.select();
	//return (field.value);
      } else {
	return (field.value);
      }
    } else {
      val = FormatDate(field.value);
    }
  }
  return (val);
}

/********************************************************
 * ValidateForm()
 *
 * Loop through all fields in the form and check whether 
 * id is set to "req" (field is required). If a required field
 * has an empty string value, append the field name to the list
 * of problems. Return list of problems, or "Valid" if none exist.
 *********************************************************/
function ValidateForm(formNumber)
{
  var numFields;
  numFields = document.forms[formNumber].elements.length;
  //alert(numFields);
  var problems = "";
  var valid = true;	
  
  if (numFields	>=1) {
    for (i = 0; i <= numFields-1; i++) {

      //check input boxes and text areas
      if ((document.forms[formNumber].elements[i].id == "req") &&
	  (document.forms[formNumber].elements[i].value == "")) {
	problems=problems + document.forms[formNumber].elements[i].title + "\n";
	valid = false;
      }
	  
      //check drop down boxes
      else if ((document.forms[formNumber].elements[i].type=="select-one") &&
	  (document.forms[formNumber].elements[i].value == 0) &&
	  (document.forms[formNumber].elements[i].id=="req")) {	
	problems = problems + document.forms[formNumber].elements[i].title + "\n";
	valid = false;	
      }
      
      //check multiple select boxes
      else if ((document.forms[formNumber].elements[i].type=="select-multiple") && 
	  (document.forms[formNumber].elements[i].id=="req") &&  
	  ((document.forms[formNumber].elements[i].value == 0) ||
	   (document.forms[formNumber].elements[i].value==""))) {
	problems = problems + document.forms[formNumber].elements[i].title + "\n";
	valid = false;	
      }
    }
  }
  
  if (!valid) {
    return(problems);
  } else {
    return("Valid");
  }
  
}


function ValidateFormMultp(formNumber, strReqID)
{
  var numFields;
  numFields = document.forms[formNumber].elements.length;
  //alert(numFields);
  var problems = "";
  var valid = true;	
  
  if (numFields	>=1) {
    for (i = 0; i <= numFields-1; i++) {

      //check input boxes and text areas
      if ((document.forms[formNumber].elements[i].id == strReqID) &&
	  (document.forms[formNumber].elements[i].value == "")) {
	problems=problems + document.forms[formNumber].elements[i].title + "\n";
	valid = false;
      }
      //check drop down boxes
      else if ((document.forms[formNumber].elements[i].type=="select-one") &&
	  (document.forms[formNumber].elements[i].value == 0) &&
	  (document.forms[formNumber].elements[i].id==strReqID)) {
	
	problems = problems + document.forms[formNumber].elements[i].title + "\n";
	valid = false;
      }
      
      //check multiple select boxes
      else if ((document.forms[formNumber].elements[i].type=="select-multiple") && 
	  (document.forms[formNumber].elements[i].id==strReqID) &&  
	  ((document.forms[formNumber].elements[i].value == 0) ||
	   (document.forms[formNumber].elements[i].value==""))) {
	problems = problems + document.forms[formNumber].elements[i].title + "\n";
	valid = false;
      }
    }
  }
  
  if (!valid) {
    return(problems);
  } else {
    return("Valid");
  }
  
}

/********************************************************
 * doSubmit(intForm)
 *
 * DELETE THIS AND CALL SubmitForm(intForm) INSTEAD!!!
 *
 * Calls ValidateForm() to check for required fields and
 * submits if ok; otherwise, provides alert box with list
 * of missing fields.
 *********************************************************/
function doSubmit(intForm) {
  var checkValidity;
    
  //document.forms[0].command.value = func;
  //	 alert("c=" + document.forms[0].command.value);

  checkValidity = ValidateForm(intForm);

  if (checkValidity == "Valid") {
    //alert("Form being submitted.");
    document.forms[intForm].submit();
  } else {
    alert("The following fields are required and must be entered: \n" + checkValidity);
  }
  return false;
}


/********************************************************
 * SubmitForm(intForm)
 *
 * Calls ValidateForm() to check for required fields and
 * submits if ok; otherwise, provides alert box with list
 * of missing fields.
 *********************************************************/
function SubmitForm(intForm) {
  var checkValidity;
    
  //document.forms[0].command.value = func;
  //	 alert("c=" + document.forms[0].command.value);

  checkValidity = ValidateForm(intForm);

  if (checkValidity == "Valid") {
    //alert("Form being submitted.");
    document.forms[intForm].submit();
  } else {
    alert("The following fields are required and must be entered: \n" + checkValidity);
  }
  return false;
}

function SubmitFormMultp(intForm, strReqID) {
  var checkValidity;
    
  //document.forms[0].command.value = func;
  //	 alert("c=" + document.forms[0].command.value);

  checkValidity = ValidateFormMultp(intForm, strReqID);

  if (checkValidity == "Valid") {
    //alert("Form being submitted.");
    document.forms[intForm].submit();
  } else {
    alert("The following fields are required and must be entered: \n" + checkValidity);
  }
  return false;
}

/********************************************************
 * doDelete()
 *********************************************************/
function doDelete(intForm, strMessage) {
  if (confirm(strMessage)) {
    document.forms[intForm].command.value = "delete";
    document.forms[intForm].submit();
  }
}

/********************************************************
 * TextCounter()
 * Checks whether text in a field is longer than some
 * threshold, and truncates it to that threshold, e.g. add tags
 *	 onkeydown="TextCounter(field, maxsize)"
 *	 onkeyup="TextCounter(field, maxsize)"
 * to a textarea. 
 *********************************************************/
function TextCounter(field, maxsize) {
  // if text is too long, trim it
  if (field.value.length > maxsize) {
    field.value = field.value.substring(0, maxsize);
  }
}

/********************************************************
 * enterkey()
 *  Control form submission on enter key 
*********************************************************/
function enterkey() {
  if (window.event && window.event.keyCode == 13)
    return SubmitForm(0);
  else
    return true;
}

/*************************************************
checks for value
**********************************************/

function submitSelect(required, strMessage) {
	
	if (required.value.length == 0) {
	
		alert(strMessage);
		return false;
	} else {
		document.forms[0].submit();
		return true;
	}
}


// -->



/********************************************************
 * checkNoneOrAll3(fieldName1, fieldName2, fieldName3, fieldTitle1, fieldTitle2, fieldTitle)
 *
 * Calls ValidateForm() to check for required fields and
 * submits if ok; otherwise, provides alert box with list
 * of missing fields.
 *********************************************************/
function checkNoneOrAll3(fieldValue1, fieldValue2, fieldValue3, fieldTitle1, fieldTitle2, fieldTitle3) {

 //document.forms[0].elements[i].value ==
// document.all("fieldName1").value DOESNT WPRK

  if ( (fieldValue1!="" || fieldValue2!="" || fieldValue3!="") && (fieldValue1=="" || fieldValue2=="" || fieldValue3=="") ) {
    alert("You must enter all or none of the following fields: \n" + fieldTitle1 + "\n" + fieldTitle2 + "\n" + fieldTitle3 );
	return "NOT OK";
  } 
  else return "OK";
}
