/**
 * Modification History
 * Version 1.02 - 22 Oct 2004 (Sock Hoon)- To disable double clicking.
 * Version 1.09.2 - 21 Feb 2005 (Sock Hoon) - To check that the previous submission date of tenant area list and SLD are existence and valid when the user selects the previously submitted option for 'Update Particulars', 'Renewal Licence' and 'New Application' functions.
 * Version 1.13.3 - 17 Jun 2005 (Sock Hoon)- To add Refresher Course attachment.
 */

var digits = "0123456789";

var lowercaseLetters = "abcdefghijklmnopqrstuvwxyz"

var uppercaseLetters = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"

var invalidchars = "@~!#$%^&*-=+()`{}[]|\:;'<,>?/."

var mostchars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ@~!#$%^&*-=+()`{}[]|\:;'<,>?/"

// whitespace characters
var whitespace = " \t\n\r";

var firstCharTelno = "6";
var firstCharContactNo = "6,9,8"
var firstCharFaxno = "6";
var firstCharHpno  = "98";
var firstCharPagerNo = "9";
var firstCharEL = "7";
var firstCharTE = "8";
var firstCharEN = "9"
var fieldValidate = false;

function MM_openBrWindow(theURL,winName,features) { //v2.0
  window.open(theURL,winName,features);
}

// Check browser version
var isNav4 = false, isNav5 = false, isIE4 = false
var strSeperator = "/";
// If you are using any Java validation on the back side you will want to use the / because
// Java date validations do not recognize the dash as a valid date separator.
var vDateType = 3; // Global value for type of date format
//                1 = mm/dd/yyyy
//                2 = yyyy/dd/mm  (Unable to do date check at this time)
//                3 = dd/mm/yyyy
var vYearType = 4; //Set to 2 or 4 for number of digits in the year for Netscape
var vYearLength = 4; // Set to 4 if you want to force the user to enter 4 digits for the year before validating.
var err = 0; // Set the error code to a default of zero

if(navigator.appName == "Netscape") {
   if (navigator.appVersion < "5") {
      isNav4 = true;
      isNav5 = false;
   }
   else
      if (navigator.appVersion > "4") {
         isNav4 = false;
         isNav5 = true;
      }
}
else {
   isIE4 = true;
}



function DateFormat(vDateName, vDateValue, e, dateCheck, dateType ) {
   vDateType = dateType;
   // vDateName = object name
   // vDateValue = value in the field being checked
   //    e = event
   // dateCheck
   //    True  = Verify that the vDateValue is a valid date
   //    False = Format values being entered into vDateValue only
   // vDateType
   //    1 = mm/dd/yyyy
   //    2 = yyyy/mm/dd
   //    3 = dd/mm/yyyy
   // displayError
   //    true = display error message
   //Enter a tilde sign for the first number and you can check the variable information.
   if (vDateValue == "~") {
      alert("AppVersion = "+navigator.appVersion+" \nNav. 4 Version = "+isNav4+" \nNav. 5 Version = "+isNav5+" \nIE Version = "+isIE4+" \nYear Type = "+vYearType+" \nDate Type = "+vDateType+" \nSeparator = "+strSeperator);
      //vDateName.value = "";
      vDateName.focus();
      return true;
   }
   var whichCode = 0;
   whichCode = (window.Event) ? e.which : e.keyCode;
   if ( e == 0 ) whichCode = 0;
   // Check to see if a seperator is already present.
   // bypass the date if a seperator is present and the length greater than 8
   if (vDateValue.length > 8 && isNav4) {
      if ((vDateValue.indexOf("-") >= 1) || (vDateValue.indexOf("/") >= 1))
         return true;
   }
   //Eliminate all the ASCII codes that are not valid
   var alphaCheck = " abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ/-";
   if (alphaCheck.indexOf(vDateValue) >= 1) {
      if (isNav4) {
         //vDateName.value = "";
         vDateName.focus();
         vDateName.select();
         return false;
      }
      else {
         vDateName.value = vDateName.value.substr(0, (vDateValue.length-1));
         return false;
      }
   }
   if (whichCode == 8) //Ignore the Netscape value for backspace. IE has no value
      return true;
   else {
      //Create numeric string values for 0123456789/
      //The codes provided include both keyboard and keypad values
      var strCheck = '47,48,49,50,51,52,53,54,55,56,57,58,59,95,96,97,98,99,100,101,102,103,104,105';
      if (strCheck.indexOf(whichCode) != -1) {
         if (isNav4) {
            if (((vDateValue.length < 6 && dateCheck) || (vDateValue.length == 7 && dateCheck)) && (vDateValue.length >=1)) {
               warnInvalid( vDateName, "Invalid Date\nPlease Re-Enter", dateCheck );
               return false;
            }
            if (vDateValue.length == 6 && dateCheck) {
               var mDay = vDateName.value.substr(2,2);
               var mMonth = vDateName.value.substr(0,2);
               var mYear = vDateName.value.substr(4,4)
               //Turn a two digit year into a 4 digit year
               if (mYear.length == 2 && vYearType == 4) {
                  var mToday = new Date();
                  //If the year is greater than 30 years from now use 19, otherwise use 20
                  var checkYear = mToday.getFullYear() + 30;
                  var mCheckYear = '20' + mYear;
                  if (mCheckYear >= checkYear)
                     mYear = '19' + mYear;
                  else
                     mYear = '20' + mYear;
                  }
                  var vDateValueCheck = mMonth+strSeperator+mDay+strSeperator+mYear;
                  if (!dateValid(vDateValueCheck)) {
                     warnInvalid( vDateName, "Invalid Date\nPlease Re-Enter", dateCheck );
                     return false;
                  }
                  return true;
               }
               else {
                  // Reformat the date for validation and set date type to a 1
                  if (vDateValue.length >= 8  && dateCheck) {
                     if (vDateType == 1) // mmddyyyy
                     {
                        var mDay = vDateName.value.substr(2,2);
                        var mMonth = vDateName.value.substr(0,2);
                        var mYear = vDateName.value.substr(4,4)
                        vDateName.value = mMonth+strSeperator+mDay+strSeperator+mYear;
                     }
                     if (vDateType == 2) // yyyymmdd
                     {
                        var mYear = vDateName.value.substr(0,4)
                        var mMonth = vDateName.value.substr(4,2);
                        var mDay = vDateName.value.substr(6,2);
                        vDateName.value = mYear+strSeperator+mMonth+strSeperator+mDay;
                     }
                     if (vDateType == 3) // ddmmyyyy
                     {
                        var mMonth = vDateName.value.substr(2,2);
                        var mDay = vDateName.value.substr(0,2);
                        var mYear = vDateName.value.substr(4,4)
                        vDateName.value = mDay+strSeperator+mMonth+strSeperator+mYear;
                     }
                     //Create a temporary variable for storing the DateType and change
                     //the DateType to a 1 for validation.
                     var vDateTypeTemp = vDateType;
                     vDateType = 1;
                     var vDateValueCheck = mMonth+strSeperator+mDay+strSeperator+mYear;
                     if (!dateValid(vDateValueCheck)) {
                        warnInvalid( vDateName, "Invalid Date\nPlease Re-Enter", dateCheck );
                        vDateType = vDateTypeTemp;
                        return false;
                     }
                     vDateType = vDateTypeTemp;
                     return true;
                  }
                  else {
                     if (((vDateValue.length < 8 && dateCheck) || (vDateValue.length == 9 && dateCheck)) && (vDateValue.length >=1)) {
                        warnInvalid( vDateName, "Invalid Date\nPlease Re-Enter", dateCheck );
                        return false;
                     }
                  }
               }
            }
            else {
               // Non isNav Check
               if (((vDateValue.length < 8 && dateCheck) || (vDateValue.length == 9 && dateCheck)) && (vDateValue.length >=1)) {
                  warnInvalid( vDateName, "Invalid Date\nPlease Re-Enter", dateCheck );
                  return false;
               }
               // Reformat date to format that can be validated. mm/dd/yyyy
               if (vDateValue.length >= 8 && dateCheck) {
                  // Additional date formats can be entered here and parsed out to
                  // a valid date format that the validation routine will recognize.
                  if (vDateType == 1) // mm/dd/yyyy
                  {
                     var mMonth = vDateName.value.substr(0,2);
                     var mDay = vDateName.value.substr(3,2);
                     var mYear = vDateName.value.substr(6,4)
                  }
                  if (vDateType == 2) // yyyy/mm/dd
                  {
                     var mYear = vDateName.value.substr(0,4)
                     var mMonth = vDateName.value.substr(5,2);
                     var mDay = vDateName.value.substr(8,2);
                  }
                  if (vDateType == 3) // dd/mm/yyyy
                  {
                     var mDay = vDateName.value.substr(0,2);
                     var mMonth = vDateName.value.substr(3,2);
                     var mYear = vDateName.value.substr(6,4);
                  }
                  if (vYearLength == 4) {
                     if (mYear.length < 4) {
                        warnInvalid( vDateName, "Invalid Date\nPlease Re-Enter", dateCheck );
                        // Version 1.09.2 Starts
                        //return true;
                        return false;
                        // Version 1.09.2 Ends
                     }
                  }
                  // Create temp. variable for storing the current vDateType
                  var vDateTypeTemp = vDateType;
                  // Change vDateType to a 1 for standard date format for validation
                  // Type will be changed back when validation is completed.
                  vDateType = 1;
                  // Store reformatted date to new variable for validation.
                  var vDateValueCheck = mMonth+strSeperator+mDay+strSeperator+mYear;
                  if (mYear.length == 2 && vYearType == 4 && dateCheck) {
                     //Turn a two digit year into a 4 digit year
                     var mToday = new Date();
                     //If the year is greater than 30 years from now use 19, otherwise use 20
                     var checkYear = mToday.getFullYear() + 30;
                     var mCheckYear = '20' + mYear;
                     if (mCheckYear >= checkYear)
                        mYear = '19' + mYear;
                     else
                        mYear = '20' + mYear;
                     vDateValueCheck = mMonth+strSeperator+mDay+strSeperator+mYear;
                     // Store the new value back to the field.  This function will
                     // not work with date type of 2 since the year is entered first.
                     if (vDateTypeTemp == 1) // mm/dd/yyyy
                        vDateName.value = mMonth+strSeperator+mDay+strSeperator+mYear;
                     if (vDateTypeTemp == 3) // dd/mm/yyyy
                        vDateName.value = mDay+strSeperator+mMonth+strSeperator+mYear;
                  }
                  if (!dateValid(vDateValueCheck)) {
                     warnInvalid( vDateName, "Invalid Date\nPlease Re-Enter", dateCheck );
                     // Version 1.09.2 Starts
                     //return true;
                     return false;
                     // Version 1.09.2 Ends
                  }
                  //check separator
                  var dateSeparator = "";
                  if (vDateType == 1) { // mm/dd/yyyy
                     dateSeparator = vDateName.value.substr(2,1) + vDateName.value.substr(5,1);
                  }
                  if (vDateType == 2) { // yyyy/mm/dd
                     dateSeparator = vDateName.value.substr(4,1) + vDateName.value.substr(7,1);
                  }
                  if (vDateType == 3) { // dd/mm/yyyy
                     dateSeparator = vDateName.value.substr(2,1) + vDateName.value.substr(5,1);
                  }
                  //alert( " dateSeparator :: " + dateSeparator );
                  if ( strSeperator != dateSeparator.substr( 0,1 ) ||
                       strSeperator != dateSeparator.substr( 1,1 )
                     ) {
                     warnInvalid( vDateName, "Invalid Date Separator. Acceptable separator is / only. \n Please Re-Enter", dateCheck );
                     // Version 1.09.2 Starts
                     //return true;
                     return false;
                     // Version 1.09.2 Ends
                  }

                  vDateType = vDateTypeTemp;
                  return true;
               }
            else {
               if (vDateType == 1) {
                  if (vDateValue.length == 2) {
                     vDateName.value = vDateValue+strSeperator;
                  }
                  if (vDateValue.length == 5) {
                     vDateName.value = vDateValue+strSeperator;
                  }
               }
               if (vDateType == 2) {
                  if (vDateValue.length == 4) {
                     vDateName.value = vDateValue+strSeperator;
                  }
                  if (vDateValue.length == 7) {
                     vDateName.value = vDateValue+strSeperator;
                  }
               }
                  if (vDateType == 3) {
                     if (vDateValue.length == 2) {
                        vDateName.value = vDateValue+strSeperator;
                     }
                     if (vDateValue.length == 5) {
                        vDateName.value = vDateValue+strSeperator;
                     }
                  }
                  return true;
               }
            }
            if (vDateValue.length == 10&& dateCheck) {
               if (!dateValid(vDateName)) {
                  // Un-comment the next line of code for debugging the dateValid() function error messages
                  //alert(err);
                  warnInvalid( vDateName, "Invalid Date\nPlease Re-Enter", dateCheck );
                  // Version 1.09.2 Starts
                  return false;
                  // Version 1.09.2 Ends
               }
            }
         return false;
      }
      else {
         // If the value is not in the string return the string minus the last
         // key entered.
         if (isNav4) {
            //vDateName.value = "";
            vDateName.focus();
            vDateName.select();
            return false;
         }
         else
         {
            vDateName.value = vDateName.value.substr(0, (vDateValue.length));
            return false;
         }
      }
   }
   return false
}

function dateValid(objName) {
   var strDate;
   var strDateArray;
   var strDay;
   var strMonth;
   var strYear;
   var intday;
   var intMonth;
   var intYear;
   var booFound = false;
   var datefield = objName;
   //var strSeparatorArray = new Array("-"," ","/",".");
   var strSeparatorArray = new Array("/");
   var intElementNr;
   // var err = 0;
   var strMonthArray = new Array(12);
   strMonthArray[0] = "Jan";
   strMonthArray[1] = "Feb";
   strMonthArray[2] = "Mar";
   strMonthArray[3] = "Apr";
   strMonthArray[4] = "May";
   strMonthArray[5] = "Jun";
   strMonthArray[6] = "Jul";
   strMonthArray[7] = "Aug";
   strMonthArray[8] = "Sep";
   strMonthArray[9] = "Oct";
   strMonthArray[10] = "Nov";
   strMonthArray[11] = "Dec";
   //strDate = datefield.value;
   strDate = objName;
   if (strDate.length < 1) {
      return true;
   }
   for (intElementNr = 0; intElementNr < strSeparatorArray.length; intElementNr++) {
      if (strDate.indexOf(strSeparatorArray[intElementNr]) != -1) {
         strDateArray = strDate.split(strSeparatorArray[intElementNr]);
         if (strDateArray.length != 3) {
            err = 1;
            return false;
         }
         else {
            strDay = strDateArray[0];
            strMonth = strDateArray[1];
            strYear = strDateArray[2];
         }
         booFound = true;
      }
   }
   if (booFound == false) {
      if (strDate.length>5) {
         strDay = strDate.substr(0, 2);
         strMonth = strDate.substr(2, 2);
         strYear = strDate.substr(4);
      }
   }
   //Adjustment for short years entered
   if (strYear.length == 2) {
      strYear = '20' + strYear;
   }
   strTemp = strDay;
   strDay = strMonth;
   strMonth = strTemp;
   intday = parseInt(strDay, 10);
   if (isNaN(intday)) {
      err = 2;
      return false;
   }
   intMonth = parseInt(strMonth, 10);
   if (isNaN(intMonth)) {
      for (i = 0;i<12;i++) {
         if (strMonth.toUpperCase() == strMonthArray[i].toUpperCase()) {
            intMonth = i+1;
            strMonth = strMonthArray[i];
            i = 12;
         }
      }
      if (isNaN(intMonth)) {
         err = 3;
         return false;
      }
   }
   intYear = parseInt(strYear, 10);
   if (isNaN(intYear)) {
      err = 4;
      return false;
   }
   if (intMonth>12 || intMonth<1) {
      err = 5;
      return false;
   }
   if ((intMonth == 1 || intMonth == 3 || intMonth == 5 || intMonth == 7 || intMonth == 8 || intMonth == 10 || intMonth == 12) && (intday > 31 || intday < 1)) {
      err = 6;
      return false;
   }
   if ((intMonth == 4 || intMonth == 6 || intMonth == 9 || intMonth == 11) && (intday > 30 || intday < 1)) {
      err = 7;
      return false;
   }
   if (intMonth == 2) {
         if (intday < 1) {
            err = 8;
            return false;
         }
         if (LeapYear(intYear) == true) {
            if (intday > 29) {
               err = 9;
               return false;
            }
         }
      else {
         if (intday > 28) {
            err = 10;
            return false;
         }
      }
   }
   return true;
}

function LeapYear(intYear) {
   if (intYear % 100 == 0) {
      if (intYear % 400 == 0) {
         return true;
      }
   }
   else {
      if ((intYear % 4) == 0) {
         return true;
      }
   }
   return false;
}





// Check whether string s is empty.

function isEmpty(s)
{   return ((s == null) || (s.length == 0))
}



// Returns true if string s is empty or
// whitespace characters only.

function isWhitespace (s)

{   var i;

    // Is s empty?
    if (isEmpty(s)) return true;

    // Search through string's characters one by one
    // until we find a non-whitespace character.
    // When we do, return false; if we don't, return true.

    for (i = 0; i < s.length; i++)
    {
        // Check that current character isn't whitespace.
        var c = s.charAt(i);

        if (whitespace.indexOf(c) == -1) return false;
    }

    // All characters are whitespace.
    return true;
}


function isLetter (c)
{   return ( ((c >= "a") && (c <= "z")) || ((c >= "A") && (c <= "Z")) );
}



// Returns true if character c is a digit
// (0 .. 9).

function isDigit (c)
{   return ((c >= "0") && (c <= "9"));
}



// Returns true if character c is a letter or digit.

function isLetterOrDigit (c)
{   return (isLetter(c) || isDigit(c));
}



// Notify user that contents of field theField are invalid.
// String s describes expected contents of theField.value.
// Put select theField, pu focus in it, and return false.

function warnInvalid (theField, s, display_error) {
   if ( fieldValidate == true ) return false;
   fieldValidate = true;
   if ( display_error ) {
      theField.focus();
      theField.select();
      alert(s);
   }
   fieldValidate = false;
   return false;
}




//
// validate email
//
function isEmail( email, display_error ) {
  var str = email.value; // email string
  var reg1 = /(@.*@)|(\.\.)|(@\.)|(\.@)|(^\.)/; // not valid
  var reg2 = /^.+\@(\[?)[a-zA-Z0-9\-\.]+\.([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)$/; // valid
  if ( isWhitespace( email.value ) ) return true;
  if (!reg1.test(str) && reg2.test(str)) { // if syntax is valid
    return true;
  }
  warnInvalid( email, "\"" + str + "\" is an invalid e-mail!", display_error );
  return false;
}



//
// check valid NRIC
//
function isNric( nric, errMsg, display_error ) {
   var firstChar ;
   nric.value = nric.value.toUpperCase();

   if ( nric.value=='WORKERADMIN' ) {
      return true;
   }

   if ( isWhitespace( nric.value ) == true ) return false;

   if ( nric.value.length < 9 ) {
      warnInvalid( nric, errMsg, display_error );
      return false;
   }

   firstChar = nric.value.substr( 0, 1 );
   if ( firstChar == 'S' || firstChar == 'T' || firstChar == 'F' || firstChar == 'G' ) {
      firstChar = firstChar ;
   } else {
      warnInvalid( nric, errMsg, display_error );
      return false;
   }
   for ( var i = 1; i < 8; i++ ) {
      if ( digits.indexOf( nric.value.charAt( i )) == -1 ) {
         warnInvalid( nric, errMsg, display_error );
         return false;
      }
   }

   var sum=0;

   sum = parseInt( nric.value.charAt( 1 ) ) * 2 +
         parseInt( nric.value.charAt( 2 ) ) * 7 +
         parseInt( nric.value.charAt( 3 ) ) * 6 +
         parseInt( nric.value.charAt( 4 ) ) * 5 +
         parseInt( nric.value.charAt( 5 ) ) * 4 +
         parseInt( nric.value.charAt( 6 ) ) * 3 +
         parseInt( nric.value.charAt( 7 ) ) * 2;

   if ( firstChar == 'T' || firstChar == 'G' ) {
      sum = sum + 4;
   }

   refNo = ( sum % 11 ) + 1;

   var nric_array = 'JZIHGFEDCBA';
   var fin_array  = 'XWUTRQPNMLK';

   //string on javascript starts on 0
   refNo = refNo -1;

   if ( firstChar == 'S' || firstChar == 'T' ) {
      if ( nric_array.charAt( refNo ) == nric.value.charAt( 8 ) ) {
         return true;
      }
   } else {
      if ( firstChar == 'F' || firstChar == 'G' ) {
         if ( fin_array.charAt( refNo ) == nric.value.charAt( 8 ) ) {
            return true;
         }
      }
   }
   warnInvalid( nric, errMsg, display_error );

   return false;
}


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;
    }

    // All characters are numbers.
    return true;
}

// check valid phone/hp/fax/pager numbers
function isValidNumber( field, len, firstChars, errMsg, display_error ) {
   // field
   // len - required length
   // firstChars - required first character, can have mulitiple
   // errMsg - error message
   // display_error
   //    true - will dipslay error msg
   if ( isWhitespace( field.value ) ) return true;
   //check length
   if ( field.value.length != len ) {
      warnInvalid( field, errMsg, display_error );
      return false;
   }
   //check if all numbers
   for ( var i = 0; i < field.value.length ; i++ ) {
      if ( digits.indexOf( field.value.charAt( i )) == -1 ) {
         warnInvalid( field, errMsg, display_error );
         return false;
      }
   }
   //check first number
   if ( firstChars.indexOf( field.value.charAt( 0 ) ) == -1 ) {
         warnInvalid( field, errMsg, display_error );
         return false;
   }
   return true;
}



function checkLicenceNo( field, type, errMsg, display_error ) {
   field.value = field.value.toUpperCase();

   if ( isWhitespace( field.value ) ) return true;

   // check length, must be 10
   if ( field.value.length != 10 ) {
      warnInvalid( field, errMsg, display_error );
      return false;
   }

   if ( "EL,TE,EN,GS,CD".indexOf( field.value.substr( 0, 2 ) ) == -1 ) {
      warnInvalid( field, errMsg, display_error );
      return false;
   }


   // check first 2 chars, must be equal to type
   if ( type != "" && field.value.substr( 0, 2 ) != type ) {
      warnInvalid( field, errMsg, display_error );
      return false;
   }

   // 2 to 10 must be numbers
   for( var i = 2; i < 10 ; i++ ) {
      if ( digits.indexOf( field.value.charAt( i )) == -1 ) {
         warnInvalid( field, errMsg, display_error );
         return false;
      }
   }
   return true;
}



//check combination of NRIC/FIN and nationality
// - singaporean and singaporeanPR can have 'S','T' as the first letter
// - other nationalities, 'F','G'
function fvNRICnationality( nric, nationality, display_error ) {
   var firstChar = nric.value.charAt(0);
   var valid=true;

   if ( nric.value=='WORKERADMIN' ) {
      return true;
   }

   if ( nationality.value == 'SINGAPOREAN' ||
        nationality.value == 'SINGAPORE PR' ) {
      if ( 'ST'.indexOf( firstChar ) == -1 ) valid = false;
   } else {
      if ( 'FG'.indexOf( firstChar ) == -1 ) valid = false;
   }
   if (valid == false && display_error )
      alert( "Invalid combination of first character of NRIC and nationality." );
   return valid ;
}



// fv - form validate
function fvNRIC( nric ) {
   var errMsg = '';
   if ( isWhitespace( nric.value  ) ) {
      errMsg = '\nNRIC/FIN must not be empty';
   } else {
      if ( isNric( nric, '', false ) == false ) errMsg = '\nInvalid NRIC/FIN.';
   }
   return errMsg;
}

function fvNotEmpty( field, desc ) {
   var errMsg = '';
   if ( isWhitespace( field.value ) ) errMsg = '\n' + desc ;
   return errMsg;
}

function fvEmpty( field, desc ) {
   var errMsg = '';
   if ( !isWhitespace( field.value ) ) errMsg = '\n' + desc ;
   return errMsg;
}

function fvDate( field, req, desc ) {
   // req - required (true/false )
   var errMsg = '';
   if ( isWhitespace( field.value ) ) {
      if ( req ) errMsg = errMsg + '\n' + desc + ' must not be empty';
   } else {
      if ( DateFormat( field, field.value, 0, false, 3 ) == false )
         errMsg = errMsg + '\nInvalid ' + desc + '.';
   }
   return errMsg;
}

function fvValidNumber( field, req, desc, len, firstChar ) {
   // req - required (true/false )
   var errMsg = '';
   if ( isWhitespace( field.value  ) ) {
      if ( req ) errMsg = '\n' + desc + ' must not be empty';
   } else {
      if ( isValidNumber( field, len, firstChar, '', false ) == false )
         errMsg = '\nInvalid ' + desc + '.';
   }
   return errMsg;
}

function fvEmail ( field ) {
   var errMsg = '';
   if ( isWhitespace( field.value    ) ) {
      errMsg ='\nEmail address must not be empty';
   } else {
      if ( isEmail( field, false ) == false )
         errMsg = errMsg + '\nEmail address is invalid.';
   }
   return errMsg;
}



function fvLicenceNo( field, type, req ) {
   var errMsg = '';
   if ( isWhitespace( field.value ) ) {
      if ( req ) errMsg =  "\nLicence number must not be empty.";
   } else {
      if ( checkLicenceNo( field, type, '', false ) == false ) {
         errMsg = "\nInvalid licence number."
      }
   }
   return errMsg;
}




function trimspace(field) {
  // This function split the entire string and then concate them together by adding
  // the space among each array element
    var myArray = new Array();
   field = eval(field);
   if (field.value != "") {
      myArray = field.value.split(" ");
      var ConcateValue = "";
      var Val = "";
      for (var counter = 0; counter < myArray.length; counter++) {
         Val = myArray[counter];
         if (Val != "") {
            ConcateValue = ConcateValue + Val + " ";
         }
      }
      field.value=  ConcateValue.substring(0,ConcateValue.length - 1) ;
   }
}


function isNumber( field, errMsg, display_error) {
   // field
   // firstChars - required first character, can have mulitiple
   // errMsg - error message
   // display_error
   //    true - will dipslay error msg
   if ( isWhitespace( field.value ) ) return true;

   //check if all numbers
   for ( var i = 0; i < field.value.length ; i++ ) {
      if ( digits.indexOf( field.value.charAt( i )) == -1 ) {
         warnInvalid( field, errMsg, display_error );
         return false;
      }
   }
   return true;
}

function onCheckBox( field ) {
   if ( field.checked == true )
      field.value = 'Y';
   else
      field.value = 'N';
}


function fvIsNumber( field, req, desc ) {
   var errMsg = "";
   if ( isWhitespace( field.value ) ) {
      if ( req ) errMsg =  "\n" + desc + " must not be empty.";
   } else {
      if ( !isNumber( field, "", false ) )errMsg = "\n" + desc + " is invalid.";
   }
   return errMsg;
}


// calculate age as current year - birthYear
// and set to field 'age'
function setAge( vDate, age ) {
   age.value = '';
   if ( isWhitespace( vDate.value ) ) return '';
   var today = new Date();
   var tdYear = today.getYear();
   var sYear  = getSYear( vDate, vDateType );
   var bYear  = parseInt( sYear );
   age.value = String( tdYear - bYear ) ;
   return age.value;
}


//var vDateType = 3; // Global value for type of date format
//                1 = mm/dd/yyyy
//                2 = yyyy/dd/mm  (Unable to do date check at this time)
//                3 = dd/mm/yyyy

//  Convert from string to Date
function getSDate( field, vDateType ) {
   var dDate = new Date(   parseInt( getSYear ( field, vDateType)),
                           parseInt( getSMonth( field, vDateType)) - 1 ,
                           parseInt( getSDay  ( field, vDateType)) );
   return dDate;
}

// get year from String
function getSYear ( field, vDateType ) {
   var retVal = "";
   if ( vDateType == 1 || vDateType == 3 ) retVal = field.value.substr( 6,4 );
   if ( vDateType == 2 ) retVal = field.value.substr( 6,4 );
   return retVal;
}

// get month from string
function getSMonth ( field, vDateType ) {
   var retVal = "";
   if ( vDateType == 1 ) retVal = field.value.substr( 0,2 );
   if ( vDateType == 2 ) retVal = field.value.substr( 8,2 );
   if ( vDateType == 3 ) retVal = field.value.substr( 3,2 );
   return removeLeadingZero( retVal );
}

// get day from string
function getSDay ( field, vDateType ) {
   var retVal = "";
   if ( vDateType == 1 ) retVal = field.value.substr( 3,2 );
   if ( vDateType == 2 ) retVal = field.value.substr( 5,2 );
   if ( vDateType == 3 ) retVal = field.value.substr( 0,2 );
   //alert( " day :: " + retVal );
   return removeLeadingZero( retVal );
}

function removeLeadingZero( p ) {
   if ( p == "" ) return p;
   if ( p.substr( 0,1 ) == "0" ) return  p.substr( 1,1 );
   return p;
}

//return selected value of radio button
//function getRBselection(group) {
//   for ( var i=0; i<group.length; i++ ) {
//      if ( group[i].checked == true ) {
//         return( group[i].value );
//      }
//   }
//   return("");
//}
function getRBselection(group) {
   if ( typeof( group ) == "undefined" ) {
      return "";
   }
   //check if number of radio button(s) is one
   if ( typeof( group.length ) == "undefined" ) {
      if ( group.checked == true ) {
         return( group.value );
      }
      return "";
   }
   for ( var i=0; i<group.length; i++ ) {
      if ( group[i].checked == true ) {
         return( group[i].value );
      }
   }
   return("");
}


// check required radio button selection
function fvReqRB( field, desc ) {
   var errMsg = '';
   var retVal = getRBselection( field );
   if ( retVal == '' ) errMsg = '\n' + desc;
   return errMsg;
}



function isValidEISILicence( field, minLength, maxLength, errMsg, display_error) {
   // field
   // len - required length
   // errMsg - error message
   // display_error
   //    true - will dipslay error msg

   if ( isWhitespace( field.value ) ) return true;
   //check length
   if ( field.value.length<minLength || field.value.length>maxLength ) {
      warnInvalid( field, errMsg, display_error );
      return false;
   }

   //check if first character is E or S
   if ((field.value.charAt(0)== "E") || (field.value.charAt(0)== "e") || (field.value.charAt(0)== "S") || (field.value.charAt(0)== "s")) {
  }else {
         warnInvalid( field, errMsg, display_error );
         return false;
   }

   return true;
}

function isValidEILicence( field, minLength, maxLength, errMsg, display_error) {
   // field
   // len - required length
   // errMsg - error message
   // display_error
   //    true - will dipslay error msg

   if ( isWhitespace( field.value ) ) return true;
   //check length
   if ( field.value.length<minLength || field.value.length>maxLength ) {
      warnInvalid( field, errMsg, display_error );
      return false;
   }

   //check if first character is E or S
   if ((field.value.charAt(0)== "E") || (field.value.charAt(0)== "e")) {
  }else {
         warnInvalid( field, errMsg, display_error );
         return false;
   }

   return true;
}



function checkFileType(fileObj, fileType, errMsg, displayError){
   var f =fileObj.value;
   if ( isWhitespace( f ) == true ) return true;
   //alert(f);
   var y = f.lastIndexOf(".");
   //alert(y);
   if (y<0){
      warnInvalid (fileObj, errMsg, displayError);
      return false;
   }
   var y_sub=f.substring(y+1,f.length);
   y_sub=y_sub.toUpperCase();
   //alert(y_sub);
   fileType=fileType.toUpperCase();
   if (fileType.indexOf(y_sub)<0){
      warnInvalid (fileObj, errMsg, displayError);
      return false;
   }
   return true;
}

///////////////////////////////////////////////
//  compare first date with the second date
//  op - operation  <, <=, =, >=, >
function compareDate( first, sec, op ) {
   var d1 = getSDate( first, 3 );
   var d2 = getSDate( sec, 3 );
   var comp = " if ( d1 " + op + " d2 ) { retVal = true; } else { retVal = false; } "
   eval( comp );
   return retVal;
}

///////////////////////////////////////////////
//  compare first date with the current date
//  op - operation  <, <=, =, >=, >
function compareToday( first, op ) {
   var d1 = getSDate( first, 3 );
   var d2 = new Date();
   d2 = setTimeZero( d2 );
   var retVal = false;
   var comp = " if ( d1 " + op + " d2 ) { retVal = true; } else { retVal = false; } "
   eval( comp );
   return retVal;
}

// Version 1.13.3 Starts
//////////////////////////////////////////////////////
//  compare first date with current date minus 5years
function dateMoreThan5yearsAgo( first) {
   var d1 = getSDate( first, 3 );
   var d2 = new Date();
   d2 = setTimeZero( d2 );
   d2.setFullYear(d2.getFullYear()-5);
   var retVal = false;
   var comp = " if ( d1 < d2 ) { retVal = true; } else { retVal = false; } "
   eval( comp );
   return retVal;
}
// Version 1.13.3 Ends

function moreThan3Months(date)
{
	var dd = getSDay(date, 3);
	var mm = getSMonth(date, 3);
	var yyyy = getSYear(date, 3);
	
	var now = new Date();
	var ddnow = now.getDate();
	var mmnow = now.getMonth() + 1;
	var yyyynow = now.getFullYear();
	
	if(yyyynow-yyyy >= 1)
	{
		return true;
	}
	else if (yyyynow-yyyy == 0 && mmnow-mm > 3)
	{
		return true;
	}
	else if (yyyynow-yyyy == 0 && mmnow-mm == 3 && ddnow-dd > 0)
	{
		return true;
	}
	return false;
}

function setTimeZero( dt ) {
   dt.setHours(0);
   dt.setMinutes(0);
   dt.setSeconds(0);
   dt.setMilliseconds(0);
   return dt;
}


function fvValidFile( field, req, type, desc ) {
   var errMsg = '';
   if ( isWhitespace( field.value  ) ) {
      if ( req ) errMsg = '\n' + desc + ' must not be empty';
   } else {
      if ( checkFileType( field, type, '', false ) == false )
         errMsg = '\nInvalid file type ' + desc + '.';
   }
   return errMsg;
}



function format_addr (db_addr, addr_block, addr_level, addr_unit) {

  var split1 = db_addr.value.indexOf("#");
  var split2 = db_addr.value.lastIndexOf("-");
  var addrlen = db_addr.value.length;

  if ((split1<0) && (split2<0)) {
    addr_block.value = db_addr.value;
  }else if ((split1>=0) && (split2<0)) {
    addr_block.value = db_addr.value.substring(0,split1);
    addr_level.value = db_addr.value.substring((split1+1),addrlen);
  }else if ((split1<0) && (split2>=0)) {
    addr_level.value = db_addr.value.substring(0,split2);
    addr_unit.value = db_addr.value.substring((split2+1),addrlen);
  }else {
    addr_block.value = db_addr.value.substring(0,split1);
    addr_level.value = db_addr.value.substring((split1+1),split2);
    addr_unit.value = db_addr.value.substring((split2+1),addrlen);
  }

}

function concat_addr (db_addr, addr_block, addr_level, addr_unit) {
   addr_block.value = addr_block.value.toUpperCase();
   addr_level.value = addr_level.value.toUpperCase();
   addr_unit.value  = addr_unit.value.toUpperCase();
   db_addr.value = addr_block.value
   if ( !isWhitespace( addr_level.value ) ) {
      db_addr.value = db_addr.value + " #" + addr_level.value
   }
   if ( !isWhitespace( addr_unit.value ) ) {
       db_addr.value = db_addr.value + "-" + addr_unit.value;
   }
}


function compareStartEndDate( s, e ) {
   if ( isWhitespace( s.value ) ) return true;
   if ( isWhitespace( e.value ) ) return true;
   if ( DateFormat( s, s.value, 0, false, 3 ) == false ) return true;
   if ( DateFormat( e, e.value, 0, false, 3 ) == false ) return true;
   if ( compareDate( s, e, "<" ) == false ) {
      alert( "Start date should be less than end date." );
      return false;
   }
   return true;
}

function isAllZero ( field, errMsg, display_error) {

  var nonzero = false;

 if ( isWhitespace( field.value ) ) return true;
 for (i = 0; i < field.value.length; i++)
  {
      if (field.value.charAt(i) == "0") {
      }else {
          nonzero = true;
      }
  }

  if (nonzero == false) {
      warnInvalid( field, errMsg, display_error );
      return false;
  }else {
     return true;
  }
}

function isInvalidPowerfactor ( field, errMsg, display_error) {

   if ( isWhitespace( field.value ) ) return true;
   for (i = 0; i < field.value.length; i++)
   {
      if ( mostchars.indexOf( field.value.charAt( i )) >= 0 ) {
           warnInvalid( field, errMsg, display_error );
           return false;
      }
      if ( ".".indexOf( field.value.charAt( 0 )) >= 0 ) {
           warnInvalid( field, errMsg, display_error );
           return false;
      }
   }
   return true;
}

function openGuide ( p ) {
   MM_openBrWindow( p, 'Guide', 'menubar=no,toolbar=yes,locationbar=no,personalbar=no,directories=no,statusbar=no,scrollbars=yes,resizable=yes,width=640,height=480');
}

function ValidateConsentDate(field, field2) {

        if ( compareToday(field, "<=")== false ) {
           alert("Consent Date Must not later than today's date.");
           field.focus();
           return false;
        }

        if ( compareDate(field, field2, ">=")== false ) {
           alert("Consent Date Must be within 2 months from the application date.");
           field.focus();
           return false;
        }
   }

function ValidatePEExpDate(field) {

      if ( field.value ==null || field.value=="" ) {
      }else {
        if ( compareToday(field, ">")== false ) {
           alert("PE Practising Certificate Expiry Date must be later than today's date.");
           field.focus();
           return false;
        }
      }
   }

function VerifyPEExpDate(field) {

      var errMsg = '';
      if ( field.value ==null || field.value=="" ) {
      }else {
        if ( compareToday(field, ">")== false ) {
           errMsg = '\nPE Practising Certificate Expiry Date must be later than today.';
        }
      }
      return errMsg;
   }

function isValidLEWLicence ( field, errMsg, display_error) {

   if ( isWhitespace( field.value ) ) return true;
   for ( var i = 0; i < field.value.length ; i++ ) {
      if ( digits.indexOf( field.value.charAt( i )) == -1 ) {
         warnInvalid( field, errMsg, display_error );
         field.focus();
         return false;
      }
   }
   return true;
}


/*  [02/12/2003 andre] get type of form object
 */
function getFormObjectType( obj ) {
   if ( obj == null ) {
      return 'null';
   }
   var t1 = obj.type;
   if ( typeof( obj.type ) == "undefined"   ) {
      if ( typeof( obj[0] ) != "undefined" ) {
         /* radio */
         t1 = obj[0].type;
      }
   }
   return t1;
}


/* [02/12/2003 andre] focus on the form object
 */
function formObjFocus( obj ) {
   var type = getFormObjectType( obj );
   if ( type == "hidden" || type == "null" ) return;
   if ( type == "radio" ) {
      for ( var i=0; i<obj.length; i++ ) {
         if ( obj[i].disabled == false ) {
            obj[i].focus();
            break;
         }
      }
      return;
   }
   if ( obj.disabled == false ) obj.focus();
   return;
}

/* [02/12/2003 andre] highlight input area
 * only for ff types: file, password, text, textarea
 */
function formObjSelect( obj ) {
   var type = getFormObjectType( obj );
   if ( type == "hidden"     || type == "null"     ||
        type == "radio"      || type == "checkbox" ||
        type == "button"     || type == "reset"    ||
        type == "select-one" || type == "submit"   ||
        type == "select-multiple"
      ) {
      return;
   }
   if ( obj.disabled == false ) obj.select();
   return;
}



// remove all whitespace characters from string s.
function stripWhiteSpace(s)
{
   var i;
   var returnString = "";

   //Search through string's characters one by one.
   for (i=0;i < s.length; i++)
   {
      // Check that current character isn't whitespace.
      var c = s.charAt(i);
      if (whitespace.indexOf(c) == -1) returnString += c;
   }

   return returnString;
}



function checkAlphaNumberic( field, fname ) {
   //valid characters a-z A-Z _ . - (space)
   var reg = /^([a-zA-Z0-9])*$/;
   if ( !reg.test( field.value ) ) {
      fname = "Please enter a valid "+fname+".";
      warnInvalid( field, fname, true );
      //alert( fname );
      //field.focus();
      //field.select();
      return false;
   }
   return true;
}

  // Version 1.02 Starts
function checkSubmitCount(submitcount)
{
      submitcount++;
      return submitcount;
}

function proceedSubmit(submitcount)
{
     if (submitcount == 1)
      {
          return true;
      }else
      {
        alert("Request is processing, please wait. ");
        return false;
      }
}
  // Version 1.02 Ends
  
//Begin of add by Yaxin s=curr   e=pre
function compareCurrentFromDateAndPreFromDate( curr, pre ) {
   if ( isWhitespace( curr.value ) ) return true;
   if ( isWhitespace( pre.value ) ) return true;
   if ( DateFormat( curr, curr.value, 0, false, 3 ) == false ) return true;
   if ( DateFormat( pre, pre.value, 0, false, 3 ) == false ) return true;
   if ( compareDate( curr, pre, "<=" ) == true ) {
      alert( "Previous employment start date must be earlier than current employment start date!" );
      return false;
   }
   return true;
}
function compareCurrentFromDateAndPreToDate( curr, pre ) {
   if ( isWhitespace( curr.value ) ) return true;
   if ( isWhitespace( pre.value ) ) return true;
   if ( DateFormat( curr, curr.value, 0, false, 3 ) == false ) return true;
   if ( DateFormat( pre, pre.value, 0, false, 3 ) == false ) return true;
   if ( compareDate( curr, pre, "<=" ) == true ) {
      alert( "Previous employment end date must be earlier than current employment start date!" );
      return false;
   }
   return true;
}

//End of add by Yaxin


//Begin of Yaxin
function Encrypt(theText) {
output = new String;
output = '';
Temp = new Array();
Temp2 = new Array();
TextSize = theText.length;
for (i = 0; i < TextSize; i++) {
 rnd = Math.round(Math.random()*5) ;
 Temp[i] = (theText.charCodeAt(i) + rnd)*4;
 Temp2[i] = rnd;
}
for (i = 0; i < TextSize; i++) {
  output = output + Temp[i] +Temp2[i] ;
}
return output;
}
//End of Yaxin

