// This validation used in Portal application.
//Modification history
// Author                   Date                Desc.
//Hasnul                    20/01/04            Initial Version
//Borhan                    20/01/04            Added the function

var digits = "0123456789";
var alphaNumeric = "abcdefghijklmnopqrstyvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
var nameChrAllowed = "ABCDEFGHIJKLMNOPQRSTUVWXYZ'@./ -";
var lowercaseLetters = "abcdefghijklmnopqrstuvwxyz";
var uppercaseLetters = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
var monthDesc = "JANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDEC";
var monthInt = "01x02x03x04x05x06x07x08x09x10x11x12x";
var defaultEmptyOK = false;
var whitespace = " ";
var mPrefix1 = "Tiada data dimasukkan pada medan ";
var mPrefix2 = "Data pada medan ";
var mPrefix3 = "Titik perpuluhan pada medan ";
var mPrefix4 = " tidak boleh kurang dari ";
var mSuffix1 = ". Medan ini adalah kemasukan wajib. Sila masukkan data sewajarnya.";
var mSuffix2 = " adalah tidak betul. Sila masukkan data yang betul.";
var mSuffix3 = " aksara.";
var mSuffix4 = " adalah tidak betul. Sila masukkan Integer.";


function notChecked( field_name ){
    if( !field_name.checked ){
        return true;
    }
    else{
        return false;
    }
} 

function validatePassword(field_name){
  var re=/^[A-Za-z]\w{6,}[A-Za-z]$/;
  if(!re.test(field_name))

  {alert ("Sila masukkan kata laluan dengan betul. Sila pastikan kata laluan mengandungi sekurang-kurangnya 1 aksara nombor.")}

  return false;}

function notValidEmail( str ){
    mailRE = new RegExp( );
    mailRE.compile( '^[\._a-z0-9-]+@[\.a-z0-9-]+[\.]{1}[a-z]{2,4}$', 'gi' );
    return !(mailRE.test( str.value ));
} 

// validate the email field.
function validate_email(field_name,str) {
		var at="@"
		var dot="."
		var lat=str.indexOf(at)
		var lstr=str.length
		var ldot=str.indexOf(dot)
    
		if (str.indexOf(at)==-1){
		   alert("E-mail ID tidak betul")
		   field_name.focus();
		   return false;
		}

		if (str.indexOf(at)==-1 || str.indexOf(at)==0 || str.indexOf(at)==lstr){
		   alert("E-mail ID tidak betul")
		   field_name.focus();
		   return false;
		}

		if (str.indexOf(dot)==-1 || str.indexOf(dot)==0 || str.indexOf(dot)==lstr){
		    alert("E-mail ID tidak betul")
		    field_name.focus();
		    return false;
		}

		 if (str.indexOf(at,(lat+1))!=-1){
		    alert("E-mail ID tidak betul")
		    field_name.focus();
		    return false;;
		 }

		 if (str.substring(lat-1,lat)==dot || str.substring(lat+1,lat+2)==dot){
		    alert("E-mail ID tidak betul")
		    field_name.focus();
		    return false;
		 }

		 if (str.indexOf(dot,(lat+2))==-1){
		    alert("E-mail ID tidak betul")
		    field_name.focus();
		    return false;
		 }

		 if (str.indexOf(" ")!=-1){
		    alert("E-mail ID tidak betul")
		    field_name.focus();
		    return false;
		 }

 		 return true
	}

// compare 2 string if equal
function validate_string(fieldName_1,fieldName_2,fieldValue_1,fieldValue_2,desc_1,desc_2){
    if(fieldValue_1 != fieldValue_2){
        alert(desc_1 + " tidak sama dengan " +desc_2);
        fieldName_2.focus();
        return false;
    } else{
     return true;
    }
}

// checking the ic format.
function validate_icNumber(fieldName,fieldValue,length) {
  if (fieldValue.length!=length) {
		alert("Sila masukkan no KP sepanjang "+length+" digit.");
		fieldName.focus();
		return false;
	}else{
        switch (isInteger_2(fieldValue)){
             case true:
             return true;
                break;
             case false:
                alert("No KP tidak sah.");
                fieldName.focus();
                return false;
                break;
        }
    }
}


// checking the ic format.
function validate_icNumber_lama(fieldName,fieldValue,length) {
  if (fieldValue.length!=length) {
		alert("Sila masukkan no KP sepanjang "+length+" digit.");
		fieldName.focus();
		return false;
	}
  return true;
}

// checking the ic format.
function validate_icNumber_lama_new(fieldName,fieldValue) {
  var letter = fieldValue.substring(0,1).toUpperCase();
  var letter2 = fieldValue.substring(1,2).toUpperCase();
  var digit = fieldValue.substring(1,fieldValue.length);
  var digit2 = fieldValue.substring(2,fieldValue.length);
  //alert("letter1 : "+letter+ " letter2 :"+letter2);
  //alert("digit : "+digit);
  
  // added by lee (1/2/2007)
  if (letter=='R' && letter2 =='F') { 
    //alert('RF');
    if (fieldValue.length != 8) {
        alert("Sila masukkan no KP sepanjang 8 digit.");
        fieldName.focus();
        return false;
    }
    //comment by nfk - 5/1/2008 - cater RFT
    /*else{
      switch (isInteger_2(digit2)){
           case true:
           return true;
              break;
           case false:
              alert("No KP tidak sah.");
              fieldName.focus();
              return false;
              break;
              
      }
    }*/
    
    return true;
  }
  // end
  
  if(letter == 'A' || letter == 'H' || letter == 'K'){
      if (fieldValue.length != 8) {
        alert("Sila masukkan no KP sepanjang 8 digit.");
        fieldName.focus();
        return false;
      }else{
        switch (isInteger_2(digit)){
             case true:
             return true;
                break;
             case false:
                alert("No KP tidak sah.");
                fieldName.focus();
                return false;
                break;
        }
      }
  }else if(letter == 'T' || letter == 'R' || letter == 'I' || letter == 'G')  {
    switch (isInteger_2(digit)){
             case true:
             return true;
                break;
             case false:
                alert("No KP tidak sah.");
                fieldName.focus();
                return false;
                break;
    }
  }else if(isInteger_2(fieldValue)){
      if (digit.length != 7) {
        alert("Sila masukkan no KP sepanjang 7 digit.");
        fieldName.focus();
        return false;      
      }else{
        switch (isInteger_2(digit)){
             case true:
             return true;
                break;
             case false:
                alert("No KP tidak sah.");
                fieldName.focus();
                return false;
                break;
        }
      }
  
  }else{
    alert("No KP tidak sah.");
    fieldName.focus();
    return false;
  }
  
  return true;
}




//checking length of the value
function validate_length(fieldName,fieldValue,length,desc){
    if (fieldValue.length < length) {
		alert(desc + mPrefix4 + length + mSuffix2);
		fieldName.focus();
		return false;
	}else{
	    return true;
	}
}


// checking value of the data
// naulli add on 29/05/2006
function validate_value(fieldName, fieldValue, desc) {
  var valid = "0123456789."
  var ok = "yes";
  var temp;
  for (var i=0; i<fieldName.value.length; i++) {
    temp = "" + fieldName.value.substring(i, i+1);
    if (valid.indexOf(temp) == "-1") ok = "no";
  }
  if (ok == "no") {
    alert("Sila masukkan nilai yang sah.");
    fieldName.focus();
    fieldName.select();
    return false;
  } else {
    return true;
  }
}

//checking value of the data
// naulli add on 29/05/2006
function validate_value1(fieldName, fieldValue, desc) {
  var valid = "0123456789"
  var ok = "yes";
  var temp;
  for (var i=0; i<fieldName.value.length; i++) {
    temp = "" + fieldName.value.substring(i, i+1);
    if (valid.indexOf(temp) == "-1") ok = "no";
  }
  if (ok == "no") {
    alert("Sila masukkan nilai yang sah.");
    fieldName.focus();
    fieldName.select();
    return false;
  } else {
    return true;
  }
}

// naulli add on 29/05/2006
function validate_MaxLength(fieldName, fieldValue, length){
    if (fieldValue=='') {
      fieldValue = '0';
    }    
    if (fieldValue > length) {
		alert('Sila masukkan nilai yang kurang atau sama dengan ' + length);
		fieldName.focus();
    fieldName.select();
		return false;
	} else {
    return true;
  }
}


//checking the integer type
function validate_integer(fieldName,fieldValue,desc) {
	switch (isInteger_2(fieldValue)){
           case true:
           return true;
           break;
           case false:
           alert(mPrefix2 + desc +".");
           fieldName.focus();
           return false;
           break;
    }
}

//checking for the integer type value
 function isInteger_2 (s)
   {
      var i;

      if (isEmpty(s))
      if (isInteger_2.arguments.length == 1) return 0;
      else return (isInteger_2.arguments[1] == true);

      for (i = 0; i < s.length; i++)
      {
         var c = s.charAt(i);

         if (!isDigit(c)) return false;
      }

      return true;
   }

//Convert all alphbet in s to uppercase and return the new value. s not necessary all alphabet.
function reformatUpperCase (s)
{
    var resultString = "";
    var c = "";
    for (var i = 0; i < s.length; i++) {
       c = s.charAt(i);
       indexUpper = lowercaseLetters.indexOf(c);
       if (indexUpper > -1) {
           resultString += uppercaseLetters.charAt(indexUpper);
       } else {
    	    resultString += c;
       }
    }
    return resultString;
}

//Check whether s is alphanumeric. Space between value is not allowed. Will return false if test fails.
//If s is empty, will return true.
function isAlphaNumeric (s)
{
   for (var i=0; i < s.length; i++) {
  	var c = s.charAt(i);
    if (alphaNumeric.indexOf(c) == -1) return false;
   }
   return true;
}

function isValidName (s)
{
   for (var i=0; i < s.length; i++) {
  	var c = s.charAt(i);
    if (nameChrAllowed.indexOf(c) == -1) return false;
   }
   return true;
}

function isnotValidName(field_name,str) {
		var at="@"
		var dot="."
		var lat=str.indexOf(at)
		var lstr=str.length
		var ldot=str.indexOf(dot)
    
		if (str.indexOf(at)==-1){
		   return true;
		}

		if (str.indexOf(at)==-1 || str.indexOf(at)==0 || str.indexOf(at)==lstr){
		  
		   return true;
		}

		if (str.indexOf(dot)==-1 || str.indexOf(dot)==0 || str.indexOf(dot)==lstr){
		  
		    return true;
		}

		 if (str.indexOf(at,(lat+1))!=-1){
		   
		    return true;
		 }

		 if (str.substring(lat-1,lat)==dot || str.substring(lat+1,lat+2)==dot){
		 
		    return true;
		 }

		 if (str.indexOf(dot,(lat+2))==-1){

		    return true;
		 }

		 if (str.indexOf(" ")!=-1){
		    return true;
		 }

 		 return false;
	}
 
//Check if the field contain only numbers with no decimal. Empty field is not allowed if third argument not provided.
function isInteger (theField, fieldDesc, emptyOK)
{   var i;
	if (isInteger.arguments.length==1 || isEmpty(fieldDesc)) fieldDesc = theField.name;
    var s = theField.value;
    if (isEmpty(s)) 
       if (isInteger.arguments.length < 3) return warnEmpty(theField, fieldDesc);
       else if (isInteger.arguments[2] == false) return warnEmpty(theField, fieldDesc);

//     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 warnInvalidInt(theField, fieldDesc, emptyOK);
    }

//     All characters are numbers.
    return true;
}

//Trim value
function trim(str) {
    str = this != window? this: str;
    return str.replace(/^\s+/g, '').replace(/\s+$/g, '');
}

//Check if value is empty or null.
function isEmpty(s)
{   
    return ((s == null) || (trim(s).length == 0));
}

//Check if argument is a digit.
function isDigit (c)
{   return ((c >= "0") && (c <= "9"))
}

//Warning message for EMPTY FIELD not allowed requirement.
function warnEmpty(theField, fieldDesc)
{
    alert(mPrefix1 + fieldDesc + mSuffix1);
    theField.focus();
    return false;
}

//Warning message for invalid value for a integer required field. 
function warnInvalidInt (theField, fieldDesc, emptyOK)
{   alert(mPrefix2 + fieldDesc + (!emptyOK ? mSuffix1 : mSuffix4) );
    if (!theField.readonly) {
	theField.focus()
	theField.select()
    }
    return false;
}

//Warning message for invalid value for a field. 
function warnInvalid (theField, fieldDesc, emptyOK)
{   alert(mPrefix2 + fieldDesc + (!emptyOK ? mSuffix1 : mSuffix2) );
    if (!theField.readonly) {
	theField.focus()
	theField.select()
    }
    return false;
}

//Warning message for invalid decimal point for numeric value requirement.
function warnInvalidDec (theField, fieldDesc, emptyOK)
{   alert(mPrefix3 + fieldDesc + (!emptyOK ? mSuffix1 : mSuffix2));
    theField.focus()
    theField.select()
    return false
}

//Check whether s has whitespaces in between value. Will return true if argument is empty.
function hasWhitespace (s)
{
    var i;

//  Is s empty?
    if (isEmpty(s)) return true;

//  Search through string's characters one by one
//  until we find a whitespace character.
//  When we do, return true; if we don't, return false.
    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 true;
    }

//  All characters are whitespace.
    return false;
}

//Validation function to disallow a field to contain space between the input value.
function checkString (theField, fieldDesc, emptyOK)
{//    Next line is needed on NN3 to avoid "undefined is not a number" error
//     in equality comparison below.
	if (checkString.arguments.length == 1) {
		emptyOK = defaultEmptyOK;
		fieldDesc = theField.name;
	} else {
	   if (isEmpty(fieldDesc)) fieldDesc = theField.name;
       if (checkString.arguments.length == 2) emptyOK = defaultEmptyOK;
	}
    if ((emptyOK == true) && (isEmpty(theField.value))) return true;
    if (isEmpty(theField.value)) return warnEmpty(theField, fieldDesc);
    if (hasWhitespace(theField.value)) 
       return warnInvalid (theField, fieldDesc, emptyOK);
    else return true;
}

//Validation function to disallow empty field.
function checkEmptyField (theField, fieldDesc) {
    if (checkEmptyField.arguments.length == 1) fieldDesc = theField.name;
    if (isEmpty(theField.value)) {
      theField.value = trim(theField.value);
      return warnEmpty(theField, fieldDesc);
    }
    else return true;
}

//Validation function to check required number format with required decimal point.
function checkNumeric (theField, fieldDesc, emptyOK, deciPoint) {
    var s = theField.value;
    if (checkNumeric.arguments.length < 3) {
      emptyOK = defaultEmptyOK;
    }

    if (checkString(theField, fieldDesc, emptyOK)) {
    	var decimalOccured = false;
    	var decimalIndex = 0;
    	for (var i=0; i < s.length; i++) {
    	   var c = s.charAt(i);
    	   if (c==".") {
  	     if (decimalOccured==false) {
      		decimalOccured = true;
      		decimalIndex = i;
      		continue;
  	     } else return warnInvalid(theField, fieldDesc, emptyOK);
  	   }

       if (!isDigit(c)) return warnInvalid(theField, fieldDesc, emptyOK);
      }

    	if (decimalIndex == 0) return true;
      if (s.length-1 == decimalIndex) return warnInvalid(theField, fieldDesc, emptyOK);
      if (s.length-1-decimalIndex > deciPoint) return warnInvalidDec(theField, fieldDesc, emptyOK);
      return true;
    }
    //return warnInvalid(theField, s);
    return false;
}

//Validation function for field with required number with no decimal and 0 is not allowed
function isIntNoZero(theField, fieldDesc) {
   if (isIntNoZero.arguments.length == 1 || isEmpty(fieldDesc)) fieldDesc = theField.name;
   if (isInteger(theField)) {
  	if (theField.value == 0) return warnInvalid(theField, fieldDesc, false);
   } else return false;
   return true;
}

//Validation function for no space allowed and must be upper case field.
function validateNConvertUpper(theField, fieldDesc, emptyOK) {
  if (validateNConvertUpper.length == 1 || isEmpty(fieldDesc)) fieldDesc = theField.name;
  if (validateNConvertUpper.arguments.length < 3) emptyOK = defaultEmptyOK;
  if (!checkString(theField, fieldDesc, emptyOK)) return false;
  theField.value = reformatUpperCase(theField.value);
  return true;
}

//Set an option list field to the element whose text match the argument.
function setOptionText(theField, s) {
   for(var i=0; i < theField.length; i++) {
  	if (theField.options[i].text == s) {
	   theField.selectedIndex = i;
  	}
   }
   return;
}

//Set an option list field to the element whose value match the argument.
function setOptionValue(theField, s) {
   for(var i=0; i < theField.length; i++) {
  	if (theField.options[i].value == s) {
	   theField.selectedIndex = i;
  	}
   }
   return;
}

//Password warning text.
function warnConfirmPass ()
{   alert("Sila pastikan kata laluan dimasukkan dengan betul");
    return false
}

//Check a check box if it match the argument value, else will unset the check box.
function setOptionCheck(theField, s) {
   if (setOptionCheck.arguments.length==1) s = theField.value;
   if (theField.value==s) {
  	theField.checked = true;
   } else {
  	theField.checked = false;
   }
   return;
}

//Check a radio button element for which the value match with the argument.
function setOptionRadio(theField, s) {
   for(var i=0; i < theField.length; i++) {
  	if (theField[i].value == s) {
	   theField[i].checked = true;
    }
   }
   return;
}
// non-digit characters which are allowed in phone numbers
var phoneNumberDelimiters = "- ";
// characters which are allowed in international phone numbers
// (a leading + is OK)
var validWorldPhoneChars = phoneNumberDelimiters + "+";
// Minimum no of digits in an international phone no.
var minDigitsInIPhoneNumber = 10;
function isTelChar(s)
{   var i;
    for (i = 0; i < s.length; i++)
    {   
        // Check that current character is number.
        var c = s.charAt(i);
        if (((c < "0") || (c > "9")))
          if (validWorldPhoneChars.indexOf(c) == -1)
            return false;
    }
    // All characters are numbers.
    return true;
}


function checkPhone(strPhone){
  return (isTelChar(strPhone));
}

 
//Check whether the argument field (radio button) has been checked.
function isRadioButtonChecked(theField, s) {
	
	
	if (theField == null) 
		return false;

	if (isRadioButtonChecked.arguments.length==1)
		s = "rekod";
	if (theField.length == 'undefined' || theField.length == null) {
		return (theField.checked)
	} else {
		for(var i=0; i < theField.length; i++) {
			if (theField[i].checked == true) 
				return true;
		}
	}
	alert("Sila pilih "+ s);
	return false;
}

function getRadioButtonValue(theField) {

	if (theField == null) 
		return false;

	if (theField.length ==  'undefined ?' || theField.length == null) {
		if (theField.checked == true)
			return theField.value;
	} else {
		for(var i=0; i < theField.length; i++) {
			if (theField[i].checked == true) 
				return theField[i].value;
		}
	}
	return "";
}

//Rounding function
function round(number, X) {
    X = (!X ? 2 : X);
    return Math.round(number * Math.pow(10, X)) / Math.pow(10, X);
}

//convert argument to an integer. Any decimal places will be truncated.
//If number format could not be formed, will return the original value.
function intValue(number) {
    number = new Number(number);
    if (!number) return number;
    number = number + "";
    var i = number.indexOf(".".charAt(0));
    if (i < 0) return new Number(number);
    number = number.substring(0, i);
    return new Number(number);
}

//Validation function for date only format. Format argument is either "dmy" or "mdy"
function checkDate(theField, format, fieldDesc, emptyOK) {
	if (checkDate.arguments.length < 3 || isEmpty(fieldDesc)) fieldDesc = theField.name;
    var s = theField.value;

    if (checkDate.arguments.length < 4) {
    	emptyOK = defaultEmptyOK;
    }
    if ((emptyOK == true) && (isEmpty(theField.value))) return true;
    if (checkString(theField, fieldDesc, emptyOK)) {
    	if (parseDateEx(s, format)==null) return warnInvalid(theField, fieldDesc, emptyOK);
    	return true;
    }
    return false;
}

//Validation function for date & time. Example of format argument is "dmy", "mdy" or "ymd"
function checkDateTime(theField, format, fieldDesc, emptyOK) {
  	if (checkDateTime.arguments.length < 3 || isEmpty(fieldDesc)) fieldDesc = theField.name;
    var s = theField.value;

    if (checkDateTime.arguments.length < 4) {
    	emptyOK = defaultEmptyOK;
    }
    if ((emptyOK == true) && (isEmpty(theField.value))) return true;
    var date = parseTime(s, format);
    if (date==null) return warnInvalid(theField, fieldDesc, emptyOK);

    return true;
}

//compare between start and end date, fourth argument onwards is optional
function compareDateBefore(startDateField, endDateField, format, startFieldDesc, endFieldDesc, msg, emptyOK) {
	if (compareDateBefore.arguments.length < 4 || startFieldDesc=="") {
		startFieldDesc = startDateField.name;
	}
	if (compareDateBefore.arguments.length < 5 || endFieldDesc=="") {
		endFieldDesc = endDateField.name;
	}
	if (compareDateBefore.arguments.length < 7) {
		emptyOK = defaultEmptyOK;
	}
	if (!checkDate(startDateField, format, startFieldDesc, emptyOK)) return false;
	if (!checkDate(endDateField, format, endFieldDesc, emptyOK)) return false;
	if ((isEmpty(startDateField.value) && !isEmpty(endDateField.value)) ||
			(!isEmpty(startDateField.value) && isEmpty(endDateField.value)) )
		return true;

	var startDate = parseDateEx(startDateField.value, format);
	var endDate = parseDateEx(endDateField.value, format);

	var s1 = startDate.getFullYear();
	var mthStr1 = "" + startDate.getMonth();
  if (mthStr1.length==1) mthStr1 = "0" + mthStr1;
	s1 += "" + mthStr1;
  var dayStr1 = "" + startDate.getDate();
  if (dayStr1.length==1) dayStr1 = "0" + dayStr1;
  s1 += "" + dayStr1;
	var int1 = intValue(s1);

	var s2 = endDate.getFullYear();
  var mthStr2 = "" + endDate.getMonth();
  if (mthStr2.length==1) mthStr2 = "0" + mthStr2;
	s2 += "" + mthStr2;
  var dayStr2 = "" + endDate.getDate();
  if (dayStr2.length==1) dayStr2 = "0" + dayStr2;
  s2 += "" + dayStr2;
	var int2 = intValue(s2);
  
  if (int2 <= int1)
	{
		if (compareDateBefore.arguments.length>=6 && msg!="" && msg!=null)
		{
			alert(msg);
			return false;
		}
		alert(startFieldDesc + " mestilah sebelum " + endFieldDesc);
		return false;
	}

	return true;

}

function compareDate(startDateField, endDateField, format, startFieldDesc, endFieldDesc, msg, emptyOK) {

	if (compareDate.arguments.length < 4 || startFieldDesc=="") {
		startFieldDesc = startDateField.name;
	}
	if (compareDate.arguments.length < 5 || endFieldDesc=="") {
		endFieldDesc = endDateField.name;
	}
	if (compareDate.arguments.length < 7) {
		emptyOK = defaultEmptyOK;
	}
	if (!checkDate(startDateField, format, startFieldDesc, emptyOK)) return false;
	if (!checkDate(endDateField, format, endFieldDesc, emptyOK)) return false;
	if ((isEmpty(startDateField.value) && !isEmpty(endDateField.value)) ||
			(!isEmpty(startDateField.value) && isEmpty(endDateField.value)) )
		return true;

	var startDate = parseDateEx(startDateField.value, format);
	var endDate = parseDateEx(endDateField.value, format);

	var s1 = startDate.getFullYear();
	var mthStr1 = "" + startDate.getMonth();
  if (mthStr1.length==1) mthStr1 = "0" + mthStr1;
	s1 += "" + mthStr1;
  var dayStr1 = "" + startDate.getDate();
  if (dayStr1.length==1) dayStr1 = "0" + dayStr1;
  s1 += "" + dayStr1;
	var int1 = intValue(s1);

	var s2 = endDate.getFullYear();
  var mthStr2 = "" + endDate.getMonth();
  if (mthStr2.length==1) mthStr2 = "0" + mthStr2;
	s2 += "" + mthStr2;
  var dayStr2 = "" + endDate.getDate();
  if (dayStr2.length==1) dayStr2 = "0" + dayStr2;
  s2 += "" + dayStr2;
	var int2 = intValue(s2);
  
  if (int2 < int1)
	{
		if (compareDate.arguments.length>=6 && msg!="" && msg!=null)
		{
			alert(msg);
			return false;
		}
		alert(startFieldDesc + " mestilah sebelum atau sama dengan " + endFieldDesc);
		return false;
	}

	return true;
}

// naulli add 03/07/2006 : CR-TD022
//compare between start and end date, fourth argument onwards is optional
//if date must be greater than other date
function compareDateGrt(startDateField, endDateField, format, startFieldDesc, endFieldDesc, msg, emptyOK) {

	if (compareDateGrt.arguments.length < 4 || startFieldDesc=="") {
		startFieldDesc = startDateField.name;
	}
	if (compareDateGrt.arguments.length < 5 || endFieldDesc=="") {
		endFieldDesc = endDateField.name;
	}
	if (compareDateGrt.arguments.length < 7) {
		emptyOK = defaultEmptyOK;
	}
	if (!checkDate(startDateField, format, startFieldDesc, emptyOK)) return false;
	if (!checkDate(endDateField, format, endFieldDesc, emptyOK)) return false;
	if ((isEmpty(startDateField.value) && !isEmpty(endDateField.value)) ||
			(!isEmpty(startDateField.value) && isEmpty(endDateField.value)) )
		return true;

	var startDate = parseDateEx(startDateField.value, format);
	var endDate = parseDateEx(endDateField.value, format);

	var s1 = startDate.getFullYear();
	var mthStr1 = "" + startDate.getMonth();
  if (mthStr1.length==1) mthStr1 = "0" + mthStr1;
	s1 += "" + mthStr1;
  var dayStr1 = "" + startDate.getDate();
  if (dayStr1.length==1) dayStr1 = "0" + dayStr1;
  s1 += "" + dayStr1;
	var int1 = intValue(s1);

	var s2 = endDate.getFullYear();
  var mthStr2 = "" + endDate.getMonth();
  if (mthStr2.length==1) mthStr2 = "0" + mthStr2;
	s2 += "" + mthStr2;
  var dayStr2 = "" + endDate.getDate();
  if (dayStr2.length==1) dayStr2 = "0" + dayStr2;
  s2 += "" + dayStr2;
	var int2 = intValue(s2);
  
  if (int2 < int1)
	{
		if (compareDateGrt.arguments.length>=6 && msg!="" && msg!=null)
		{
			alert(msg);
			return false;
		}
		alert(endFieldDesc + " mestilah lebih besar dari " + startFieldDesc);
		return false;
	}

	return true;
}

//compare between start and end date, fourth argument onwards is optional
function compareDateTime(startDateField, endDateField, format, startFieldDesc, endFieldDesc, msg) {
	if (compareDate.arguments.length < 4 || startFieldDesc=="") {
		startFieldDesc = startDateField.name;
	}
	if (compareDate.arguments.length < 5 || endFieldDesc=="") {
		endFieldDesc = endDateField.name;
	}
	if (!checkDate(startDateField, format, startFieldDesc, false)) return false;
	if (!checkDate(endDateField, format, endFieldDesc, false)) return false;

	var startDate = parseDateEx(startDateField.value, format);
	var endDate = parseDateEx(endDateField.value, format);

	var s1 = startDate.getFullYear();
	s1 += "" + startDate.getMonth();
  s1 += "" + startDate.getDate();
  s1 += "" + startDate.getHours();
  s1 += "" + startDate.getMinutes();
  s1 += "" + startDate.getSeconds();

	var int1 = intValue(s1);
	var s2 = endDate.getFullYear();
	s2 += "" + endDate.getMonth();
  s2 += "" + endDate.getDate();
  s2 += "" + endDate.getHours();
  s2 += "" + endDate.getMinutes();
  s2 += "" + endDate.getSeconds();

	var int2 = intValue(s2);

	if (int2 < int1)
	{
		if (compareDate.arguments.length==6 && msg!="")
		{
			alert(msg);
			return false;
		}
		alert(startFieldDesc + " mestilah sebelum " + endFieldDesc);
		return false;
	}
	return true;
}

//
function SHDateFromYMD(nYear, nMonth, nDate)
{	/* Validates the given fields and returns a date based on them */
	var dDate = new Date();

	dDate.setFullYear(nYear, nMonth, nDate);
	if(dDate.getFullYear() != nYear)
		return null;
	if(dDate.getMonth() != nMonth)
		return null;
	if(dDate.getDate() != nDate)
		return null;
	return dDate;
}

function parseDateEx(cString, cOrder)
{	/* Attempts to parse a string containing some form of date; returns null
	** on failure or a Date object on success. cOrder should be the order in
	** which the date is entered (e.g. ymd, mdy, etc.). Use parseDateOrder to
	** generate this string from an arbitrary format string. */

	var nYear;
	var nMonth;
	var nDate;
	var nYCount;
	var dDate = new Date();

	dDate.setHours(12, 0, 0);

	/* Empty string returns current date/time. */
	if (!cString) { 
		return null;
		//return dDate;
	}

	nYCount = parseDateYCount(cOrder); /* count the number of digits for year in the selected format */
	cOrder = parseDateOrder(cOrder); /* make sure its in the "ymd" format */

	/* Break down the date into an array of numbers. */
	var aNums = validateDateFormat(cString, cOrder);

	if(!aNums) 
		return null;	/* No numbers? */

	/* User supplied three numbers. */
	if (aNums.length == 3) {
		nYear = 1.0 * aNums[cOrder.indexOf("y")];
		if (nYCount > 2 && nYear < 100)
			return null; /* must enter 4 digits for the year to match with the format of the field */
		nYear = DateHorizon(nYear);

		dDate = SHDateFromYMD(nYear, aNums[cOrder.indexOf("m")] - 1, aNums[cOrder.indexOf("d")]);
		return dDate;
	}

	/* No idea how to deal with the other combinations. */
	return null;
}

function parseDateYCount(cFormat)
{
	/* Determine the order of the date. */
	var yCount = 0;
	for (var i = 0; i < cFormat.length; i++) {
		switch (cFormat.charAt(i)) {
			case "\\":	/* Escape character. */
				i++;
			break;
			case "y":
				yCount += 1;
			break;
		}
	}
	return yCount;
}

function parseDateOrder(cFormat)
{
	/* Determine the order of the date. */
	var cOrder = "";
	for (var i = 0; i < cFormat.length; i++) {
		switch (cFormat.charAt(i)) {
			case "\\":	/* Escape character. */
				i++;
			break;
			case "m":
				if (cOrder.indexOf("m") == -1)
					cOrder += "m";
			break;
			case "d":
				if (cOrder.indexOf("d") == -1)
					cOrder += "d";
			break;
			case "y":
				if (cOrder.indexOf("y") == -1)
					cOrder += "y";
			break;
		}
	}

	/* Make sure we have a full complement of 3 chars. */
	if (cOrder.indexOf("m") == -1)
		cOrder += "m";
	if (cOrder.indexOf("d") == -1)
		cOrder += "d";
	if (cOrder.indexOf("y") == -1)
		cOrder += "y";

	return cOrder;
}

function validateDateFormat(s, format)
{	/* returns an array of numbers that it managed to extract from the given 
	 * string or null on failure */
	var nums = new Array();
	var separator = "/";
	if (s.indexOf("-") > 0) separator = "-";

	var s = s + separator;
	var cString = "";
	var delim=0;
	var monthIsInt = false;

	for (var i=0; i < s.length; i++) {
	    if (delim > format.length-1) break;
	    var c = s.charAt(i);

	    switch (format.charAt(delim)) {
  		case "d":
		    if (c==separator) {
    			delim++;
    			nums.length++;
    			nums[nums.length-1] = cString;
    			cString = "";
    			break;
		    }
		    if (isDigit(c)) cString += c;
  			else return null;
		    if (cString.length > 2) return null;
    		break;

  		case "m":
		    if (c==separator) {
    			delim++;
    			nums.length++;
      		if (!monthIsInt) cString = toMonthInt(cString);
        	nums[nums.length-1] = cString;
          cString = "";
    			break;
		    }
  			cString += c;
  	    if (isDigit(c)) monthIsInt = true;
		    if (monthIsInt && cString.length > 2) return null;
  			if (!monthIsInt && cString.length > 3) return null;
    		break;

		case "y":
		    if (c==separator) {
    			delim++;
    			nums.length++;
    			nums[nums.length-1] = cString;
    			cString = "";
    			break;
		    }
		    if (isDigit(c)) cString += c;
  			else return null;
		    if (cString.length > 4) return null;
    		break;

	    }
	}

	if(nums.length >= 1) return nums;
	return null;
}

function DateHorizon(nYear)
{	/* Takes the year supplied and applies the date horizon heuristic.
	** All years between 50 and 100 we add 1900. All years less than 50 we add 2000. */
	if (nYear < 100 && nYear >= 50) {
		nYear += 1900;
	} else if (nYear >= 0 && nYear < 50) {
		nYear += 2000;
	}

	return nYear;
}

function parseTime(string, cOrder)
{	/* attempts to parse a string containing a time; returns null on failure
	 * or a Date object on success. Time can be in ugly format. */
	var pm = false;
	var am = false;
	var hour, minutes, seconds;

	if(!string) return null;
	var sepIndex = string.indexOf(whitespace);
	var sDate = string.substr(0, sepIndex);
	var date = parseDateEx(sDate, cOrder);
	if (date==null) return null;

	var cString = string.substr(sepIndex, string.length);
	cOrder = parseTimeOrder(cOrder); /* make sure its in the "hms" format */
	/* Break down the date into an array of numbers. */
	var nums = validateTimeFormat(cString, cOrder);

	if(!nums) return null;
	if(nums.length < 2 || nums.length > 4) return null;
	//hour & min must be digit.
	if (!isDigit(nums[0])) return null;
	if (!isDigit(nums[1])) return null;

	if(cOrder.indexOf("a") > -1 ) {
	   if (nums[nums.length-1]=="pm" || nums[nums.length-1]=="p") pm = true;
	   else if(nums[nums.length-1]=="am" || nums[nums.length-1]=="p") am = true;
	}

	hour = new Number(nums[0]); /* force it to number */

	if(pm)
	{
		if(hour < 12) hour += 12;
	}
	else if (am)
	{
		if(hour >= 12) hour -= 12;
	}
	minutes = new Number(nums[1]);
	if(nums.length == 3) seconds = nums[2];
	else seconds = 0;
	date.setHours(hour);
	date.setMinutes(minutes);
	date.setSeconds(seconds);
	if(date.getHours() != hour)
		return null;
	if(date.getMinutes() != minutes)
		return null;
	if(date.getSeconds() != seconds)
		return null;
	return date;
}

function validateTimeFormat(s, format)
{	/* returns an array of numbers that it managed to extract from the given 
	 * string or null on failure */
	var nums = new Array();

	var s = s + ":";
	var cString = "";
	var delim=0;

	for (var i=0; i < s.length; i++) {
	    if (delim > format.length-1) break;
	    var c = s.charAt(i);

	    switch (format.charAt(delim)) {
    		case "H":
  		    if (c==":") {
      			delim++;
      			nums.length++;
      			nums[nums.length-1] = cString;
        		cString = "";
          }
  		    if (isDigit(c)) cString += c;
    	    if (cString.length > 2) return null;
      		break;

      case "M":
          if (": apAP".indexOf(c) > -1) {
      			delim++;
      			nums.length++;
      			nums[nums.length-1] = cString;
      			cString = "";
      			//if seconds don't exist, create blank element to array.
      			if (" apAP".indexOf(c) > -1) {
    			   delim++;
    			   nums.length++;
    			   nums[nums.length-1] = "";
    			   if ("AMPamp".indexOf(c) > -1) cString += c;
      			}
  		    }
  		    if (isDigit(c)) cString += c;
  		    if (cString.length > 2) return null;
      		break;

		case "S":
		    if (": apAP".indexOf(c) > -1) {
    			delim++;
    			nums.length++;
    			nums[nums.length-1] = cString;
    			cString = "";
    			if ("APap".indexOf(c) > -1) cString += c;
 		    }
		    if (isDigit(c)) cString += c;
		    if (cString.length > 2) return null;
      	break;

		case "a":
		    if (c==":") {
    			delim++;
    			nums.length++;
    			nums[nums.length-1] = cString;
    			cString = "";
		    }
		    if ("AMPamp".indexOf(c) > -1) cString += c;
		    if (cString.length > 2) return null;
    		break;
    }
	}

	if(nums.length >= 1) return nums;
	return null;
}

function parseTimeOrder(cFormat)
{
	/* Determine the order of the time. */
	var cOrder = "";
	for (var i = 0; i < cFormat.length; i++) {
		switch (cFormat.charAt(i)) {
			case "\\":	/* Escape character. */
				i++;
			break;

			case "H":
				if (cOrder.indexOf("H") == -1)
					cOrder += "H";
			break;

			case "M":
				if (cOrder.indexOf("M") == -1)
					cOrder += "M";
			break;

			case "S":
				if (cOrder.indexOf("S") == -1)
					cOrder += "S";
			break;

			case "a":
				if (cOrder.indexOf("S") == -1)
					cOrder += "S";
				if (cOrder.indexOf("a") == -1)
					cOrder += "a";
			break;

		}
	}

	return cOrder;
}

function getHrMinfromMillSec(millsec) {
    var num = new Number(millsec);

    var hr = num/3600000;
    hr = hr + "";
    if (hr.indexOf(".") > -1) hr = hr.substr(0, hr.indexOf("."));
    hr = new Number(hr);
    num = num - hr * 3600000;

    var min = num/60000;
    min = min + "";
    if (min.indexOf(".") > -1) min = min.substr(0, min.indexOf("."));
    min = new Number(min);
    num = num - min * 60000;

    var sec = num/1000;

    return hr + ":" + min + ":" + sec;
}

//Convert month JAN, FEB etc. to number (JAN will return 1, FEB will return 2). Description must be 3 digit
function toMonthInt (s)
{	
	s = reformatUpperCase(s);
	if (isEmpty(s) || monthDesc.indexOf(s) < 0) return s;
    var resultString = "";

	var index = monthDesc.indexOf(s);
    for (var i = 0; i < 2; i++) {
       resultString += monthInt.charAt(i + index);
    }
    return resultString;
}

//Convert month logical number to desc. E.g. 1 to JAN, 2 to FEB etc.
function toMonthDesc (s)
{
	if (isEmpty(s)) return s;
    for (var i = 0; i < s.length; i++) {
		if (!isDigit(s.charAt(i))) return s;
	}
	if (s.length==1) s += "0" + s;
    var resultString = "";

	var index = monthInt.indexOf(s);
    for (var i = 0; i < 3; i++) {
       resultString += monthDesc.charAt(i + index);
    }
    return resultString;
}

//Validation function to check required cgpa format with required decimal point.
function checkNumeric_cgpa (theField, fieldDesc, emptyOK, deciPoint) {
    var s = theField.value;
    if (checkNumeric.arguments.length < 3) {
      emptyOK = defaultEmptyOK;
    }

    if (checkString(theField, fieldDesc, emptyOK)) {
    	var decimalOccured = false;
    	var decimalIndex = 0;
    	for (var i=0; i < s.length; i++) {
    	   var c = s.charAt(i);
    	   if (c==".") {
  	     if (decimalOccured==false) {
      		decimalOccured = true;
      		decimalIndex = i;
      		continue;
  	     } else return warnInvalid(theField, fieldDesc, emptyOK);
  	   }

       if (!isDigit(c)) return warnInvalid(theField, fieldDesc, emptyOK);
      }

    	if (decimalIndex == 0) return true;
      if (s.length-1 == decimalIndex) return warnInvalid(theField, fieldDesc, emptyOK);
      if (s.length-1-decimalIndex > deciPoint) return warnInvalidDec(theField, fieldDesc, emptyOK);
      
      if(s >= 1.00 && s <= 4.00){
        return true;
      }else{
        return warnInvalid(theField, fieldDesc, emptyOK);
      }
      
      return true;
    }
    //return warnInvalid(theField, s);
    return false;
}


function autoComplete(textFieldId, selectedListId, nameOrValue)
{
    if (nameOrValue = 'undefined')
       nameOrValue = 'value';
    textFieldValue = document.getElementById(textFieldId).value.toLowerCase();
    selectedList = document.getElementById(selectedListId);
    for (i=0;i<selectedList.length;i++)
    {
        if (nameOrValue == 'value')
        {
           matchValue = selectedList.options[i].value.toLowerCase();
        } else
        {
           matchValue = selectedList.options[i].text.toLowerCase(); 
        }
        if (matchValue.substring(0, textFieldValue.length) == textFieldValue)
        {   
          selectedList.options[i].selected = true;
          break;
        }
    }
}
