passwordChanged = 0;
var daysInMonth = new Array(31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);
var defaultEmptyOK = false
var submitform = 1;  // scripts may change this value to prevent actual submission

var re_ws = /\s/;
var re_num = /^(\+|-)?(\d*\.\d*|\d+|\.\d*|\d*\.)$/;
var re_int = /^\d*$/;
var re_phone = /^(\+|-|\(|\)|\d| )*$/;
var re_abc = /^[A-Za-z \t]*$/;
var re_usr = /^[A-Za-z0-9_]*$/;
var re_an = /^[A-Za-z \t0-9]*$/;
var re_email = /^[A-Za-z0-9_\-\.\&\']+@[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+.*$/;
var re_url = /^(https:\/\/|http:\/\/|ftp:\/\/)?[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+.*$/;
var re_urlinternal = /^#/;
var re_striphtml = /<[^>]+>/g;
var hasValidateFormPreHandler = 0;
var hasValidateFormPostHandler = 0;

function validateForm(frm) {
  var errorstr = "";
  var tempArray = new Array;
  var data;

  password = password2 = "";
  emailaddr = emailaddr2 =  "";
  warn = false;
  warnmesg = '';
  warntask = '';

  if (hasValidateFormPreHandler == 1) {
    errorstr = validateFormPreHandler(frm);
    if (errorstr != "") {
      alert("You must enter the following fields correctly before proceeding:\n\n" + errorstr + "\n");
      return false;
    }
  }


  for (var i = 0; i < frm.elements.length; i++) {
    if (frm.elements[i].name && frm.elements[i].name.indexOf("VALIDATOR") != -1) {
      fieldName = frm.elements[i].name.substring(9);  // Get name of field to validate
      infoString = frm.elements[i].value;
	var caption = "";
      if (frm.elements["CAPTION" + fieldName]) {
        caption = frm.elements["CAPTION" + fieldName].value;
      } else {
        caption = fieldName;
      }
      tempArray = infoString.split("_");
      fieldType = tempArray[0];    // Get type of field to validate
      flags = tempArray[1];        // Get flags determining valid values

      mandatory = (flags.indexOf("YES") == -1) ? 0 : 1;   // Field mandatory?
      alphanumeric = (flags.indexOf("ALPHANUMERIC") == -1) ? 0 : 1;   // Can contain alphanumeric characters?
      nowhitespace = (flags.indexOf("NOWHITESPACE") == -1) ? 0 : 1;   // Allow whitespace?
      numbersOnly = (flags.indexOf("NUMBERS") == -1) ? 0 : 1;   // Allow numbers and +-. only?
      integerOnly = (flags.indexOf("INTEGER") == -1) ? 0 : 1;   // Allow numbers only?
      nonzero = (flags.indexOf("NONZERO") == -1) ? 0 : 1;   // Must be Non-zero?
      phonenumber = (flags.indexOf("PHONENUMBER") == -1) ? 0 : 1;   // Allow numbers and + - ( ) space only?
      alphaOnly = (flags.indexOf("ALPHABETIC") == -1) ? 0 : 1;   // Allow a-z, A-Z only?
      username = (flags.indexOf("USERNAME") == -1) ? 0 : 1;   // Allow a-z, A-Z, 0-9 only?
      URL = (flags.indexOf("URL") == -1) ? 0 : 1;   // Allow valid URL only?
      email = (flags.indexOf("EMAIL") == -1) ? 0 : 1;   // Allow valid email address only?
      striphtml = (flags.indexOf("STRIPHTML") == -1) ? 0 : 1;   // Strip anything between <>
      if (!warn) {
        warn = (flags.indexOf("WARN") == -1) ? 0 : 1;   // Warn when changing?
      }
      if (warn && warnmesg == '') {
        warnmesg = frm.elements["WARN" + fieldName].value;
        warntask = frm.elements["WARNTASK"].value;
        if (frm.elements["ORIGINAL" + fieldName]) {
          origvalue = frm.elements["ORIGINAL" + fieldName].value;
          currvalue = frm.elements[fieldName].value
        } else {
          warn = false;
        }
      }

      data = "";
      errorField = fieldName;   // Field to focus on when an error flagged
      if (fieldType == "TEXTAREA")
        RegExp.multiline = true;

      if (fieldType == 'TIME' || fieldType == 'DATETIME') {
        errorField = '';
        hour = frm.elements[fieldName + "_hour"].value;
        minute = frm.elements[fieldName + "_minute"].value;
        second = frm.elements[fieldName + "_second"].value;
        minute = (minute == '') ? '0' : minute;
        second = (second == '') ? '0' : second;
        if (hour == '' && !mandatory)
          continue;
        //  continue;
       // if (hour == '' && minute == '' && second == '' && !mandatory)
        if (hour.search(re_num) != -1) {
          if (minute.search(re_num) != -1) {
            if (second.search(re_num) != -1) {
              if (hour >= 0 && hour < 24) {
                if (minute >= 0 && minute < 60) {
                  if (second >= 0 && second < 24) {

                  } else
                    errorField = fieldName + "_second";
                } else
                  errorField = fieldName + "_minute";
              } else
                errorField = fieldName + "_hour";
            } else
              errorField = fieldName + "_second";
          } else
            errorField = fieldName + "_minute";
        } else
          errorField = fieldName + "_hour";

        if (errorField != '') {
          errorstr += caption + " (time not filled in correctly)\n";
          break;
        }
      }

      if (fieldType == 'TIME') {
        continue;
      }

      if (fieldType == 'DATE' || fieldType == 'DATETIME') {
        if (!mandatory && frm.elements[fieldName + "_day"].value == '' && frm.elements[fieldName + "_month"].value == '' && frm.elements[fieldName + "_year"].value == '')
          continue;
        ok = 1;

        if ( !isYear(frm.elements[fieldName + "_year"].value, false) ) {
          ok = 0;
          errorField = fieldName + "_year"
        }

        if (ok && !isMonth(frm.elements[fieldName + "_month"].value, false) ) {
          ok = 0;
          errorField = fieldName + "_month"
        }

        if (ok) {
          if ( !isDay(frm.elements[fieldName + "_day"].value) ) {  // Basic check
            ok = 0;
          } else {
            var intYear = parseInt(frm.elements[fieldName + "_year"].value, 10);
            var intMonth = parseInt(frm.elements[fieldName + "_month"].value, 10);
            var intDay = parseInt(frm.elements[fieldName + "_day"].value, 10);
            // catch invalid days, except for February
            if (intDay > daysInMonth[intMonth - 1] || ((intMonth == 2) && (intDay > daysInFebruary(intYear))) )
              ok = 0;
          }
          if (!ok)
            errorField = fieldName + "_day";
        }

        if (!ok) {
          errorstr += caption + " (date not filled in correctly)\n";
          break;
        }
        continue;
      } else if (fieldType != 'CHECKBOX') {
        data = frm.elements[fieldName].value;
      }

      if (!data)
        data = "";

      if (!mandatory && data == "") {
        continue;
      }

      if (fieldType == 'SELECT') {
        if (frm.elements[fieldName].selectedIndex != -1) {
          for (var i2 = 0; i2 < frm.elements[fieldName].options.length; i2++) {
            if (frm.elements[fieldName].options[i2].selected && frm.elements[fieldName].options[i2].value != '') {
              data = frm.elements[fieldName].options[i2].value;
              break;
            }
          }
        }
      }

      if (fieldType == 'RADIO') {
        errorField = '';
        for (var i2 = 0; i2 < frm.elements[fieldName].length; i2++) {
          if (frm.elements[fieldName][i2].checked)
            data = "avalue";
        }
      }

      if (fieldType == 'CHECKBOX') {
        errorField = '';
        for (var i2 = 0; i2 < frm.elements.length; i2++) {
          if (frm.elements[i2].name && frm.elements[i2].name.lastIndexOf(fieldName+'|') != -1) {
            if (frm.elements[i2].checked) {
              data = "avalue";
            }
          }
        }
      }

      if (fieldType == 'PASSWORD') {
        password = data;
        password2 = frm.elements[fieldName+'2'].value;
      }

      if (fieldType == 'EMAIL') {
        emailaddr = data;
        emailaddr2 = frm.elements[fieldName+'2'].value;
      }

      if (mandatory && data == "") {
        errorstr += caption + " (must contain a value)\n";
        break;
      }
      if (nowhitespace && data.search(re_ws) != -1) {
        errorstr += caption + " (may not contain spaces)\n";
        break;
      }
      if (integerOnly && data.search(re_int) == -1) {
        errorstr += caption + " (may only contain a whole number)\n";
        break;
      }
      if (numbersOnly && data.search(re_num) == -1) {
        errorstr += caption + " (may only contain numbers)\n";
        break;
      }
    if (nonzero && data == 0) {
        errorstr += caption + " (must be non-zero)\n";
        break;
      }
      if (alphaOnly && data.search(re_abc) == -1) {
        errorstr += caption + " (may only contain alphabetic characters)\n";
        break;
      }
      if (username && data.search(re_usr) == -1) {
        errorstr += caption + " (may only contain alphabetic characters, numbers and no spaces)\n";
        break;
      }
      if (alphanumeric && data.search(re_an) == -1) {
        errorstr += caption + " (may only contain alphanumeric characters)\n";
        break;
      }
      if (phonenumber && data.search(re_phone) == -1) {
        errorstr += caption + " (may only contain numbers, '+', '-', '(', ')' and space characters)\n";
        break;
      }
      if (email && ((data.search(re_email) == -1) || (data.search(re_ws) != -1))) { // Check for whitespace by default
        errorstr += caption + " (must be a valid email address)\n";
        break;
      }
      if (URL && ( (data.search(re_urlinternal) == -1) && ((data.search(re_url) == -1) || (data.search(re_ws) != -1)) )) { // Check for whitespace by default
        errorstr += caption + " (must be a valid URL)\n";
        break;
      }

      if (URL && (data.substr(0,7) != 'http://') && (data.substr(0,8) != 'https://') && (data.substr(0,6) != 'ftp://') && data.search(re_urlinternal) == -1) {
        frm.elements[fieldName].value = 'http://' + data;
      }
      if (striphtml && errorstr == '') {
        if (frm.elements[fieldName].value) {
          frm.elements[fieldName].value = frm.elements[fieldName].value.replace(re_striphtml, '');
        }
      }
      if (fieldType == "TEXTAREA")
        RegExp.multiline = false;
    }
  }


  if (errorstr == "") {
    if (hasValidateFormPostHandler == 1) {
      errorstr = validateFormPostHandler(frm);
      if (errorstr != "") {
        alert("You must enter the following fields correctly before proceeding:\n\n" + errorstr + "\n");
        return false;
      }
    }
    if (password != password2) {
      alert("The passwords you have supplied do not match.\nPlease try again.");
      return false;
    }
    if (emailaddr != emailaddr2) {
      alert("The Email Addresses you have supplied do not match.\nPlease try again.");
      return false;
    }
    if (warn && currvalue != origvalue && warntask == frm.elements['task'].value) {
      if (!confirm(warnmesg)) return false;
    }
    if (submitform) {
      frm.submit();
      return false;
    }
    return true;
  }
  alert("You must enter the following fields correctly before proceeding:\n\n" + errorstr + "\n");
  if (errorField != '') {
    if (frm.elements[errorField].type == 'TEXT' || frm.elements[errorField].type == 'TEXTAREA')
      frm.elements[errorField].focus();
  }
  return false;
}

function checkTextfieldLength(src, dst, maxLength) {
  var temp;
  var re_stripcr = /\r/g;

  temp = src.value.replace(re_stripcr, "");
  fieldLength = temp.length;
  if (maxLength == -1) { // Just show total entered
    dst.value = fieldLength;
  return;
  }
  if (fieldLength >= maxLength) {
    if (document.all)
      src.value = src.value.substring(0, maxLength);
    charsRemaining = ' NO';
  } else
    charsRemaining = maxLength - fieldLength;
  dst.value = charsRemaining;
}

function validateFileUploadType(frm, fieldName) {
  if (arguments.length == 1) {
    fieldName = 'uploadedFile';
  }
  filename = (frm.elements[fieldName]) ? frm.elements[fieldName].value : '';
  filename = filename.toLowerCase();
  if (filename == '') return false;

  contentTypes = (frm.elements['contentTypes']) ? frm.elements['contentTypes'].value : '';
  contentTypes = contentTypes.toLowerCase();
  contentTypesDesc = (frm.elements['contentTypesDesc']) ? frm.elements['contentTypesDesc'].value : '';
  if (contentTypes == '') return true;

  extensionArray = contentTypes.split('|');
  typeArray = contentTypesDesc.split('|');
  found = 0;
  infoString = 'The file you are trying to upload must be one of the following types:\n';
  for (var i = 0; i < extensionArray.length; i++) {
    infoString += ' - ' + typeArray[i] + ' (' + extensionArray[i] + ')\n';
    eval("re = /" + extensionArray[i] + "$/;");
    if (filename.search(re) != -1) {
      found = 1;
    }
  }
  if (!found) {
    infoString += '\nPlease try a different file.';
    alert(infoString);
    return false;
  }
  return true;
}

// -----------------------------------------------------
function isYear(s) {
  if (isEmpty(s)) {
    if (isYear.arguments.length == 1)
      return defaultEmptyOK;
    else
      return (isYear.arguments[1] == true);
  }
  if (!isNonnegativeInteger(s)) return false;
  return ((s.length == 2) || (s.length == 4));
}

function isIntegerInRange(s, a, b) {
  if (isEmpty(s)) {
    if (isIntegerInRange.arguments.length == 1)
      return defaultEmptyOK;
    else
      return (isIntegerInRange.arguments[1] == true);
  }

  // Catch non-integer strings to avoid creating a NaN below,
  // which isn't available on JavaScript 1.0 for Windows.
  if (!isInteger(s, false)) return false;

  // Now, explicitly change the type to integer via parseInt
  // so that the comparison code below will work both on
  // JavaScript 1.2 (which typechecks in equality comparisons)
  // and JavaScript 1.1 and before (which doesn't).
  var num = parseInt(s, 10);
  return ((num >= a) && (num <= b));
}

function isMonth(s) {
  if (isEmpty(s)) {
    if (isMonth.arguments.length == 1)
      return defaultEmptyOK;
    else
      return (isMonth.arguments[1] == true);
  }
  return isIntegerInRange(s, 1, 12);
}

function isDay(s) {
  if (isEmpty(s)) {
    if (isDay.arguments.length == 1)
      return defaultEmptyOK;
    else
      return (isDay.arguments[1] == true);
  }
  return isIntegerInRange(s, 1, 31);
}

function daysInFebruary(year) {
  // February has 29 days in any year evenly divisible by four,
  // EXCEPT for centurial years which are not also divisible by 400.
  return (  ((year % 4 == 0) && ( (!(year % 100 == 0)) || (year % 400 == 0) ) ) ? 29 : 28 );
}

function isEmpty(s) {
  return ((s == null) || (s.length == 0))
}

function isInteger(s) {
  var i;

  if (isEmpty(s)) {
    if (isInteger.arguments.length == 1)
      return defaultEmptyOK;
    else
      return (isInteger.arguments[1] == true);
  }

  // Search through string's characters one by one
  // until we find a non-numeric character.
  // When we do, return false; if we don't, return true.
  for (i = 0; i < s.length; i++) {
    // Check that current character is number.
    var c = s.charAt(i);
    if (!isDigit(c)) return false;
  }

  return true;
}

function isNonnegativeInteger(s) {
  var secondArg = defaultEmptyOK;

  if (isNonnegativeInteger.arguments.length > 1)
    secondArg = isNonnegativeInteger.arguments[1];

  return (isSignedInteger(s, secondArg) && ( (isEmpty(s) && secondArg) || (parseInt(s, 10) >= 0) ) );
}

function isSignedInteger(s) {
  if (isEmpty(s)) {
    if (isSignedInteger.arguments.length == 1)
      return defaultEmptyOK;
    else
      return (isSignedInteger.arguments[1] == true);
  } else {
    var startPos = 0;
    var secondArg = defaultEmptyOK;

    if (isSignedInteger.arguments.length > 1)
      secondArg = isSignedInteger.arguments[1];

    // skip leading + or -
    if ( (s.charAt(0) == "-") || (s.charAt(0) == "+") )
      startPos = 1;

    return (isInteger(s.substring(startPos, s.length), secondArg))
  }
}

function isDigit (c) {
  return ((c >= "0") && (c <= "9"))
}
