function isEmail(str) {
// are regular expressions supported?
  var supported = 0;

  if ((str.value == null) || (str.value.length == 0)) {
    return true;
  }

  if (window.RegExp) {
      var tempStr = "a";
      var tempReg = new RegExp(tempStr);
      if (tempReg.test(tempStr)) supported = 1;
  }

  if (!supported)
  return (str.indexOf(".") > 2) && (str.indexOf("@") > 0);

  var r1 = new RegExp("(@.*@)|(\\.\\.)|(@\\.)|(^\\.)");
  var r2 = new RegExp("^.+\\@(\\[?)[a-zA-Z0-9\\-\\.]+\\.([a-zA-Z]{2,3}|[0-9]{1,3})(\\]?)$");

  return (!r1.test(str.value) && r2.test(str.value));
}

// R9013329 Fixed
// (str.value == null) changed to (str == null)
function isCharacters(str) {
  var validCharacters;
  var charStr = "abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890()&";

//  if (str.value == null) {
  if (str.length == 0) {
    validCharacters = true;
  }
  else {
    for (var i=0; i < str.length; i++){
      validCharacters = false;

      for (var j=0; j < charStr.length; j++){
        if (charStr.charAt(j) == str.charAt(i)) {
          validCharacters = true;
          break;
        }
      }

      if (!validCharacters) {
        break;
      }
    }
  }

  return validCharacters;
}


function isValidName(str) {
  if(str.match(/^[ |'|-]/)||!(/^[a-zA-Z][a-zA-Z- ']*[a-zA-Z]$/.test(str))) {
    return false;
  }

  return true;
}


function isAnyCharacter(str) {
  var validCharacter;
  var charStr = "abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890!@£$%^&*()-_=+{}[]:;\'#~\\|,<>./?\"";

  if (str.length == 0) {
    validCharacter = true;
  }
  else {

    for (var i=0; i < str.length; i++){
      validCharacter = false;

      for (var j=0; j < charStr.length; j++){
        if (charStr.charAt(j) == str.charAt(i)) {

          validCharacter = true;
          break;
        }
      }

      if (!validCharacter) {
        break;
      }
    }
  }

  return validCharacter;
}


// R18221 Added
function isAlphaCharacters(str) {
  var validCharacters;
  var charStr = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";

  if (str.length == 0) {
    validCharacters = true;
  }
  else {
    for (var i=0; i < str.length; i++){
      validCharacters = false;

      for (var j=0; j < charStr.length; j++){
        if (charStr.charAt(j) == str.charAt(i)) {
          validCharacters = true;
          break;
        }
      }

      if (!validCharacters) {
        break;
      }
    }
  }

  return validCharacters;
}

// R18221 Added
function isDecimalDigits(str) {
  var validDigits;
  var charStr = "1234567890";

  if (str.length == 0) {
    validDigits = true;
  }
  else {
    for (var i=0; i < str.length; i++){
      validDigits = false;

      for (var j=0; j < charStr.length; j++){
        if (charStr.charAt(j) == str.charAt(i)) {
          validDigits = true;
          break;
        }
      }

      if (!validDigits) {
        break;
      }
    }
  }

  return validDigits;
}


// R9013329 Added
function isAlphaNumeric(str) {
  var validAlphaNumeric;
  var charStr = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890";

  if (str == null) {
    validAlphaNumeric = true;
  }
  else {
    for (var i=0; i < str.length; i++){
      validAlphaNumeric = false;

      for (var j=0; j < charStr.length; j++){
        if (charStr.charAt(j) == str.charAt(i)) {
          validAlphaNumeric = true;
          break;
        }
      }

      if (!validAlphaNumeric) {
        break;
      }
    }
  }

  return validAlphaNumeric;
}

function isNull(field,label){
  var result = false;
  var index = 0;
  var nonSpaceFound = false;


  if (field.value == "") {
    result = true;

  }

  // Go through string and check that it is only spaces
  while ((index < field.value.length) && (!nonSpaceFound)) {

    if (field.value.charCodeAt(index) != 32)
      nonSpaceFound = true;

    index++;
  }

  // if only spaces were found then its the same as being null
  if (!nonSpaceFound){
    result = true;}

  // Clear the field of spaces and put cursor back into it
  if (result) {
    field.value = "";
   // mtl.setFocus(field.id);   
    alert(label + '\nThis Must be Entered.');
    mtl.setFocus(field.id);
  }

  return result;
}

function lengthShorterThan(field, min, label){
  var result = false;

  if (field.value.length < min) {
    result = true;
    alert(label + '\nMust be longer than (or equal to) '+ min +' characters');
    mtl.setFocus(field.id);
  }

  return result;
}

function lengthNotEqualTo(field, len, label){
  var result = false;

  if (field.value.length != len) {
    result = true;
    alert(label + '\nMust be equal to '+ len +' characters');
    mtl.setFocus(field.id);
  }

  return result;
}

function lengthLongerThan(field, max, label){
  var result = false;

  if (field.value.length > max) {
    result = true;
    alert(label + '\nMust be shorter than (or equal to) '+ max +' characters');
    mtl.setFocus(field.id);
  }

  return result;
}

function valueLessThan(field, min, label){
  var result = false;

  if (field.value < min) {
    result = true;
    alert(label + '\nCannot be less than '+ min);
    mtl.setFocus(field.id);
  }

  return result;
}

function valueGreaterThan(field, max, label){
  var result = false;

  if (field.value > max) {
    result = true;
    alert(label + '\nCannot be greater than '+ max);
    mtl.setFocus(field.id);
  }

  return result;
}

function isNotANumber(field, label){
  var result = false;

  if (isNaN(field.value)) {
    result = true;
    alert(label + '\nMust be a number');
    mtl.setFocus(field.id);
  }

  return result;
}

function isNotCharacter(field, label){
  var result = false;

  if (!isCharacters(field.value)) {
    result = true;
    alert(label + '\nMust contain characters only');
    mtl.setFocus(field.id);
  }

  return result;
}


// R18221
function isNotAlphaCharacter(field, label){
  var result = false;

  if (!isAlphaCharacters(field.value)) {
    result = true;
    alert(label + '\nMust contain characters only');
    mtl.setFocus(field.id);
  }

  return result;
}


// R18221
function isNotDecimalDigit(field, label){
  var result = false;

  if (!isDecimalDigits(field.value)) {
    result = true;
    alert(label + '\nMust contain numbers only');
    mtl.setFocus(field.id);
  }

  return result;
}


function isNotAnyCharacter(field, label){
  var result = false;

  if (!isAnyCharacter(field.value)) {
    result = true;
    alert(label + '\nContains invalid character(s)');
    mtl.setFocus(field.id);
  }

  return result;
}

function isNotEmail(field, label){
  var result = false;

//  if (!isEmail(field.value)) {
  if (!isEmail(field)) {
    result = true;
    alert(label + '\nInvalid Email Address');
    mtl.setFocus(field.id);
  }

  return result;
}

function isNotDate(field, label) {
  var result = false;

  if (!chkdate(field)) {
    result = true;
    alert(label + '\nIs an Invalid Date');
    mtl.setFocus(field.id);
  }

  return result;
}

// R12794 Fixed
function isNotAPhoneNumber(field, label){
  var result = false;
  var index = 0;
  var invalidPhoneCharacter = false;

  // Go through string and check that it is only spaces
  while ((index < field.value.length) && (!invalidPhoneCharacter)) {

    if (field.value.charCodeAt(index) != 32) {
      if (isNaN(field.value.charAt(index))) {
        result = true;
        alert(label + '\nOnly Spaces and Numbers Allowed.');
        invalidPhoneCharacter = true;
        mtl.setFocus(field.id);
      }
    }

    index++;
  }

//  if (isNaN(field.value)) {
//    result = true;
//    mtl.setFocus(field.id);
//    alert(label + '\nNot a valid phone number');
//  }

  return result;
}

// R12794 Added
function valueLessThan(field, min, label){
  var result = false;

  if (field.value < min) {
    result = true;
    alert(label + '\nCannot be less than '+ min);
    mtl.setFocus(field.id);
  }

  return result;
}


// R12794 Added
function monthsGreaterThan(field, months, label, dateType){
  var yearsDiff = 0;
  var monthsDiff = 0;
  var result = false;

  var day   = getOracleDayInteger(field.value);
  var month = getOracleMonthInteger(field.value);
  var year  = getOracleYearInteger(field.value);

  if (monthsBetween(day,month,year) > months) {
    result = true;
    yearsDiff = Math.abs(months)/12;
    monthsDiff = Math.abs(months)%12;

    switch(dateType) {
      case 'dob':
        alert(label +
          ' is invalid.\nYou must be at least ' +
          ((yearsDiff != 0) ? yearsDiff + ((yearsDiff == 1) ? ' year' : ' years') : '') +
          ((yearsDiff != 0 && monthsDiff != 0) ? ' and ' : '') +
          ((monthsDiff != 0) ? monthsDiff + ((monthsDiff == 1) ? ' month' : ' months') : '') +
          ' old.\n\nPlease re-enter ' + label + '.'
        );
        break;

      default:
        alert(label +
          ' is invalid.\nThe date must be less than ' +
          ((yearsDiff != 0) ? yearsDiff + ((yearsDiff == 1) ? ' year' : ' years') : '') +
          ((yearsDiff != 0 && monthsDiff != 0) ? ' and ' : '') +
          ((monthsDiff != 0) ? monthsDiff + ((monthsDiff == 1) ? ' month' : ' months') : '') +
          ((months < 0) ? ' prior to' : ' after' ) +
          ' today\'s date.\n\nPlease enter another date.'
        );
    }
    mtl.setFocus(field.id);


  }

  return result;
}

// R12794 Added
function monthsLessThan(field, months, label, dateType){
  var yearsDiff = 0;
  var monthsDiff = 0;
  var result = false;

  var day   = getOracleDayInteger(field.value);
  var month = getOracleMonthInteger(field.value);
  var year  = getOracleYearInteger(field.value);
  var doFocus = false;

  if (monthsBetween(day,month,year) < months) {
    result = true;
//    field.focus();
    yearsDiff = Math.abs(months)/12;
    monthsDiff = Math.abs(months)%12;

    switch(dateType) {
      case 'dob':
        alert(label +
          ' is invalid.\nYou must be less than ' +
          ((yearsDiff != 0) ? yearsDiff + ((yearsDiff == 1) ? ' year' : ' years') : '') +
          ((yearsDiff != 0 && monthsDiff != 0) ? ' and ' : '') +
          ((monthsDiff != 0) ? monthsDiff + ((monthsDiff == 1) ? ' month' : ' months') : '') +
          ' old.\n\nPlease re-enter ' + label + '.'
        );
    doFocus = true;
        break;

      case 'tqual':
        alert(label +
          ' Please check you have entered your Qualification Date and Teaching Service correctly.'
        );
    doFocus = true;
        break;

      default:
        alert(label +
          ' is invalid.\nThe date must be at least ' +
          ((yearsDiff != 0) ? yearsDiff + ((yearsDiff == 1) ? ' year' : ' years') : '') +
          ((yearsDiff != 0 && monthsDiff != 0) ? ' and ' : '') +
          ((monthsDiff != 0) ? monthsDiff + ((monthsDiff == 1) ? ' month' : ' months') : '') +
          ((months < 0) ? ' prior to' : ' after' ) +
          ' today\'s date.\n\nPlease enter another date.'
        );
    doFocus = true;
    }

  if (yearsDiff > 100) {
    alert(label +
          ' is invalid.\nThe date must not be greater then 100 years from' +
      ' today\'s date.\n\nPlease enter another date.'
      )
      doFocus = true;
    }

  }
    if (doFocus) mtl.setFocus(field.id);

  return result;
}

// R9013329 Added
function isNotValidPassword(field, label) {
  var result = false;

  if (!isAlphaNumeric(field.value)) {
    result = true;
    alert(label + ' is invalid.\nOnly Letters and Numbers are allowed.');
    mtl.setFocus(field.id);
  }

  return result;
}

//
// Compares if date1 is greater than, less than, or equal to date2.
// Results: -1 -date1 is less than date2
//           0 -date1 is equal to date2
//           1 -date1 is greater than date2
//
function compareDates(date1, date2) {
  if (typeof date2 == "undefined") date2 = new Date();
  var result;

  if (date1.getFullYear() > date2.getFullYear()) return 1;
  else if (date1.getFullYear() < date2.getFullYear()) return -1;
  else if (date1.getMonth() > date2.getMonth()) return 1;
  else if (date1.getMonth() < date2.getMonth()) return -1;
  else if (date1.getDate() > date2.getDate()) return 1;
  else if (date1.getDate() < date2.getDate()) return -1;
  else return 0;

  return result;
}

//
// Compares if the comparison date falls within a period of x months
// either side of the datum date.
//
function inMonthsPeriod(comparisonDate, numMonths, datumDate) {
  if (typeof datumDate == 'undefined') datumDate = new Date();
  if (typeof numMonths == 'undefined') numMonths = 12;
  var result = false;
  var dateDiff = new Date();
  var datumTime = 0;
  var comparisonTime = 0;
  var diffTime = 0;
  var yearDiff = 0;
  var monthDiff = 0;

  datumTime = datumDate.getTime();
  comparisonTime = comparisonDate.getTime();

  if (datumTime >= 0 && comparisonTime >= 0) {
    diffTime = comparisonTime - datumTime;
  }
  else if (datumTime < 0 && comparisonTime < 0) {
    diffTime = comparisonTime + Math.abs(datumTime);
  }
  else {
    diffTime = Math.abs(comparisonTime) + Math.abs(datumTime);
  }

  dateDiff.setTime(Math.abs(diffTime));

  yearDiff = dateDiff.getFullYear() - 1970;
  monthDiff = dateDiff.getMonth() + (yearDiff * 12);

  if (monthDiff < numMonths) result = true;
  return result;
}


