/*********************************************************
  File: validate.js
  Author: Eric B. Wright
  Description: JavaScript utility functions for validating
    form objects and data types
  Date Last Updated: October 11, 2004
**********************************************************/

function hasValue(obj, obj_type) {
    if (!obj_type && obj.type)
      obj_type = obj.type.toUpperCase();
    else if (obj_type)
      obj_type = obj_type.toUpperCase();
    else {
      alert("Could not determine input field type to perform validation!");
      return false;
    }

    if (obj_type == "TEXT" || obj_type == "PASSWORD" || obj_type == "HIDDEN") {
    	if (obj.value.trim().length == 0)
      		return false;
    	else
      		return true;
   	} else if (obj_type == "SELECT") {
        for (i=0; i < obj.length; i++) {
			if (obj.options[i].selected)
				return true;
		}
       	return false;
    } else if (obj_type == "SELECT-ONE") {
        if (obj.selectedIndex < 1)
            return false;
        else
            return true;
	} else if (obj_type == "SINGLE_VALUE_RADIO" || obj_type == "SINGLE_VALUE_CHECKBOX") {
		return obj.checked;
	} else if (obj_type == "RADIO" || obj_type == "CHECKBOX") {
    if (obj.length) {
      for (i=0; i < obj.length; i++)
  			if (obj[i].checked)
	  			return true;
      return false;
		} else
      return obj.checked;
	}
}

/* return boolean for select obj with single select value (drop-downs)
   different from generic hasValue as it accepts prompt param (i.e. an
   option value that prompts the user but is not a valid selection) */
function dropDownHasValue(obj, hasPrompt) {
  return (hasPrompt) ? obj.selectedIndex >= 1 : obj.selectedIndex != -1;
}

function checkDate(object_value) {
    //Returns true if value is a date format or is NULL
    //otherwise returns false
    if (object_value.length == 0)
        return true;

    //Returns true if value is a date in the mm/dd/yyyy format
	isplit = object_value.indexOf('/');

	if (isplit == -1 || isplit == object_value.length) return false;

    sMonth = object_value.substring(0, isplit);

	if (sMonth.length == 0) return false;

	isplit = object_value.indexOf('/', isplit + 1);

	if (isplit == -1 || (isplit + 1 ) == object_value.length)
		return false;

    sDay = object_value.substring((sMonth.length + 1), isplit);

	if (sDay.length == 0) return false;

	sYear = object_value.substring(isplit + 1);

	if (!checkInteger(sMonth)) //check month
		return false;
	else if (!checkRange(sMonth, 1, 12)) //check month
		return false;
	else if (!checkInteger(sYear)) //check year
		return false;
	else if (!checkRange(sYear, 0, 9999)) //check year
		return false;
	else if (!checkInteger(sDay)) //check day
		return false;
	else if (!checkDay(sYear, sMonth, sDay)) // check day
		return false;
	else
		return true;
}

function checkDay(checkYear, checkMonth, checkDay) {
	maxDay = 31;

	if (checkMonth == 4 || checkMonth == 6 || checkMonth == 9 || checkMonth == 11)
		maxDay = 30;
	else if (checkMonth == 2) {
		if (checkYear % 4 > 0)
			maxDay =28;
		else if (checkYear % 100 == 0 && checkYear % 400 > 0)
			maxDay = 28;
		else
			maxDay = 29;
	}

	return checkRange(checkDay, 1, maxDay); //check day
}

function checkInteger(object_value) {
    //Returns true if value is a number or is NULL
    //otherwise returns false
    if (object_value.length == 0)
        return true;

    //Returns true if value is an integer defined as
    //   having an optional leading + or -.
    //   otherwise containing only the characters 0-9.
	var decimal_format = ".";
	var check_char;

    //The first character can be + -  blank or a digit.
	check_char = object_value.indexOf(decimal_format)
	//Was it a decimal?
    if (check_char < 1)
		return isValidNumber(object_value);
    else
		return false;
}

function isValidNumber(object_value) {
    //Returns true if value is a number or is NULL
    //otherwise returns false
    if (object_value.length == 0)
        return true;

    var i;
    for(i=0;i<object_value.length;i++) {
        var c=object_value.charAt(i);
        if (! (isValidDigit(c) ) ) return false;
    }
    return true;
}

function isValidDigit(c)
{
    return((c>="0") && (c<="9"))
}

function numberRange(object_value, min_value, max_value) {
    // check minimum
    if (min_value != null) {
        if (object_value < min_value)
			return false;
	}

    // check maximum
    if (max_value != null) {
		if (object_value > max_value)
			return false;
	}

    //All tests passed, so...
    return true;
}

function checkNumber(object_value) {
    //Returns true if value is a number or is NULL
    //otherwise returns false
    if (object_value.length == 0)
        return true;

    //Returns true if value is a number defined as
    //   having an optional leading + or -.
    //   having at most 1 decimal point.
    //   otherwise containing only the characters 0-9.
	var start_format = " .+-0123456789";
	var number_format = " .0123456789";
	var check_char;
	var decimal = false;
	var trailing_blank = false;
	var digits = false;

    //The first character can be + - .  blank or a digit.
	check_char = start_format.indexOf(object_value.charAt(0))
	//Was it a decimal?
	if (check_char == 1)
	    decimal = true;
	else if (check_char < 1)
		return false;

	//Remaining characters can be only . or a digit, but only one decimal.
	for (var i = 1; i < object_value.length; i++) {
		check_char = number_format.indexOf(object_value.charAt(i))
		if (check_char < 0)
			return false;
		else if (check_char == 1) {
			if (decimal)		// Second decimal.
				return false;
			else
				decimal = true;
		} else if (check_char == 0) {
			if (decimal || digits)
				trailing_blank = true;
        // ignore leading blanks
		} else if (trailing_blank)
			return false;
		else
			digits = true;
	}
    //All tests passed, so...
    return true
}

function checkRange(object_value, min_value, max_value) {
    //if value is in range then return true else return false
    if (object_value.length == 0)
        return true;

    if (!checkNumber(object_value))	{
		return false;
	} else {
		return (numberRange((eval(object_value)), min_value, max_value));
	}

    //All tests passed, so...
    return true;
}

// This method trims white space off both ends of this string and returns the result.
String.prototype.trim = function() {
  return( this.replace(/^\s*([\s\S]*\S+)\s*$|^\s*$/,'$1') );
}

function checktelno(telNo){

  str = telNo.value;
  if(str.length<12)
	return false;
  else {
    if(isNumeric(str.charAt(0))&&isNumeric(str.charAt(1))&&isNumeric(str.charAt(2))&&
     isNumeric(str.charAt(4))&&isNumeric(str.charAt(5))&&isNumeric(str.charAt(6))&&
     isNumeric(str.charAt(8))&&isNumeric(str.charAt(9))&&isNumeric(str.charAt(10))&&isNumeric(str.charAt(11))){
       if((str.charAt(3)!="-") || (str.charAt(7)!="-"))
	       return false;
	  } else {
   	   return false;
    }
    return true;
  }
  return true;
}

function checkTelephoneFieldsWithoutExtension(telNo1, telNo2, telNo3)  {
   var msg = null;
   var fld = null;
   if (!hasExactLength(telNo1, 3)) {
     msg = "Please enter exactly 3 numerals for area code.";
     fld = telNo1;
   } else if (!isNumeric(telNo1.value)) {
     msg = "Please enter numeric value for area code.";
     fld = telNo1;
   } else if (!hasExactLength(telNo2, 3)) {
     msg = "Please enter exactly 3 numerals for exchange.";
     fld = telNo2;
   } else if (!isNumeric(telNo2.value)) {
     msg = "Please enter numeric value for exchange.";
     fld = telNo2;
   } else if (!hasExactLength(telNo3, 4)) {
     msg = "Please enter exactly 4 numerals for third telephone field.";
     fld = telNo3;
   } else if (!isNumeric(telNo3.value)) {
     msg = "Please enter numeric value for third telephone field.";
     fld = telNo3;
   }

   if (msg) {
      alert("Invalid telephone number. " + msg);
      fld.focus();
      fld.select();
      return false;
   }
   else return true;
}

function checkTelephoneFields(telNo1, telNo2, telNo3, extension) {
   if(checkTelephoneFieldsWithoutExtension(telNo1, telNo2, telNo3) &&
      hasValue(extension) && !isNumeric(extension.value)) {
       alert("Invalid telephone number. Please enter numeric value for extension.");
       extension.focus();
	     extension.select();
       return false;
   }
   else return true;
 }

function isNumeric(s){
    if (s.length == 0)
      return false;
    var i;
    for(i=0;i<s.length;i++) {
        var c=s.charAt(i);
        if (! (isDigit(c) ) ) return false;
    }
    return true;
}

function isDigit(c)
{
    return((c>="0") && (c<="9"))
}


/* requires util.js */
function hasExactLength(object, len) {
  var strObj = object.value.trim();
  return (strObj.length == len);
}


//////////////

function checkTime(hours, minutes) {
  if (!isNumeric(hours) || !isNumeric(minutes))
    return false;
  //check hours
  if (hours < 1 || hours > 12)
    return false;
  //check minutes
  if (minutes < 0 || minutes > 59)
    return false;
  //all tests passed so...
  return true;
}

function isAlpha(str) {
  var regex = /[^a-zA-Z]+/; // test for at least one non-alphabetical character
  var regex_result = str.match(regex); // if the match operation DID NOT find
                                       // non-alphabetical characters, regex_result
                                       // will be 'null'
  return (regex_result == null);
}


function checkEmailSimple(email) {
  //check to see if email contains a '@' sign or a '.'
  return ((email.indexOf("@") != -1) && (email.indexOf(".") != -1));
}

//regex check - much more thorough check than checkEmailSimple (however browser must support regex)
function checkEmail(email) {
  var regex = /^[0-9a-z~!#$%&_-]([.]?[0-9a-z~!#$%&_-])*@[0-9a-z~!#$%&_-]([.]?[0-9a-z~!#$%&_-])*$/;
  return (email.match(regex) != null);
}

function compareDates(date1, date2) {
  return parseDateInMilliseconds(date1) - parseDateInMilliseconds(date2);
}

//parses a date in mm/dd/yy format
function parseDateInMilliseconds(dateStr) {
  var m, d, y;
  var arr = dateStr.split("/");
  m = arr[0];
  d = arr[1];
  y = arr[2];
  if (y.length == 1)
    y = "0" + y;
  else if (y.length == 2)
    y = "20" + y; //adjust century to avoid pre-1970
  //alert(m + "/" + d + "/" + y + " as obj:" + (new Date(y, m, d)).getTime());
  //alert(m + "/" + d + "/" + y + " parsed:" + Date.parse(m + "/" + d + "/" + y));
  return Date.parse(m + "/" + d + "/" + y);
}