
var reWhitespace = /^\s+$/;

// @param n - size of array in (int)
// @return array object
function makeArray(n) {
   for (var i = 1; i <= n; i++) {
      this[i] = 0
   } 
   return this;
}

// @param str_year - year in (string)
// @param str_month - month from 0 - 11 in (string)
// @param str_day - day in (string)
// @return Date object
//function toDate ( str_year , str_month , str_day ) {
//	return new Date(str_year , str_month , str_day );
//}

function getTodayStr ( ) {
	var today = new Date();
	month = today.getMonth() + 1;
	return today.getYear() + "/" + month + "/" + today.getDate();
}
function getTodayStr2 ( ) {
	var today = new Date();
	month = today.getMonth();
	return today.getYear() + "/" + month + "/" + today.getDate();
}

// @param str - yyyy/mm/dd in (string)
// @return Date object
function toDate ( str ) {
	var date = str.split ( "/" );
	return new Date(date[0] , date[1] , date[2] );
}

function showDate ( showdate  ) {
	var strDate = showdate.getYear();
	strDate += "/" + ((showdate.getMonth()+1)<10?"0":"") + (showdate.getMonth()+1)
	strDate += "/" + ((showdate.getDate())<10?"0":"") + (showdate.getDate())
	return strDate;
}

// @param date1 - date (Date) expect to be before
// @param date2 - date (Date) expect to be after
// @return true/false
function isDateBefore ( date1 , date2 ) {
	return ( date1 < date2 );
}

function isDateBeforeOrEqual ( date1 , date2 ) {
	return ( date1 <= date2 );
}


// @param s - s (string)
// @return true/false
function isEmpty(s)
{   
	return ((s == null) || (trim(s).length == 0))
}

// @param str - s (string)
// @return true/false
function isInteger (str)
{   
	var reInteger = /^[+-]?\d+$/	;
	if ( reInteger.test(str) == true )
		return true;
   	return false;
}

// @param str - str (string)
// @return string
function trim ( str ) {
	var whitespace = " \t\n\r";
	var res = str;
	while ( res.length > 0  && whitespace.indexOf(res.charAt (0))!=-1 ) {
		res = res.substring ( 1 );
	}
	while ( res.length > 0  && whitespace.indexOf(res.charAt (res.length-1))!=-1 ) {
		res = res.substring ( 0,res.length-2 );
	}
	return res;
}

// @param str - str (string)
// @return true
function isEmail ( str ) {
	var reEmail = /^.+\@.+\..+$/;
	return reEmail.test(str)
}

// @param c - character
// @return true/false	
function isLetter (c) {
	var reLetter = /^[a-zA-Z]$/;
	return reLetter.test(c)
}

// @param str - test value (string)
// @return true/false
function isAllAlphabetic ( str ) {
	var reNumeric = /^\s*[a-zA-Z]+\s*$/;
	return reNumeric.test(str)
}


// @param c - character
// @return true/false	
function isDigit (c) {
	var reDigit = /^\d/;
   return reDigit.test(c)
}

// @param str - checked string (string)
// @param pattern - checked pattern A for alphabet, 0 for numeric and Z for alphanumeric
// @return true/false	
function isPattern ( str , pattern ) {
	if ( str.length != pattern.length )
		return false;
	for (var i=0;i<pattern.length;i++ ) {
		if ( pattern.charAt ( i ) == 'Z' ) {
			if ( !isLetter ( str.charAt ( i ) ) && !isDigit ( str.charAt ( i ) ) )
				return false;
		} else if ( pattern.charAt ( i ) == 'A' ) {
			if ( !isLetter ( str.charAt ( i ) ) )
				return false;
		} else if ( pattern.charAt ( i ) == '0' ) {
			if ( !isDigit ( str.charAt ( i ) ) )
				return false;
		} else {
			var c1 = str.charAt (i);
			var c2 = pattern.charAt (i);
			if ( c2 != c1 ) {
				return false;
			}
		}
	}
	return true;
}

// @param str - test value (string)
// @return true/false
function isAllNumeric ( str ) {
	var reNumeric = /^\s*\d+\s*$/;
	return reNumeric.test(str)
}

// @param field1 - checkbox field to check available of field2
// @param field2 - field to be enabled
// @return "" if disable and value if enable
function getCheckboxEnabledField ( field1 , field2 ) {
	if ( field1.checked ) {
		return field2.value;
	} else {
		return "";
	}
}

function isCheckboxDisabledField ( field1 , field2 ) {
	if ( !field1.checked && isEmpty ( field2.value ) )
		return false;
	return true;
}


// @param field1 - value = value1 then field2
// @param value1 - 
// @param field2 - field to be enabled
// @return null if disable and value if enable
function getSelectEnabledField ( field1, value1 , field2 ) {
	if ( field1.value == value1 ) {
		return field2.value;
	} else {
		return "";
	}
}

function isSelectEnabledField ( field1, value1 , field2 ) {
	if ( field1.value == value1 &&  isEmpty (field2.value) )
		return false;
	return true;
}


// @param field1 - field object of field 1
// @param value1 - value of field1 in order to enable field2
// @param field2 - field to be enabled
// @return ""l if disable and value if enable
function getRadioEnabledField ( field1, value1 , field2 ) {
	for ( var i=0;i<field1.length;i++ ) {
		if ( field1[i].checked && field1[i].value == value1 ) {
			return field2.value;
		}
	}
	return "";
}

// @param field1 - field object of field 1
// @return
function getRadioEnabledValue ( field1 ) {
  if ( field1.checked ) {
    return field1.value;
  } 
  
	for ( var i=0;i<field1.length;i++ ) {
		if ( field1[i].checked ) {
			return field1[i].value;
		}
	}

	return "";
}

// @param field1 - field object of field 1
// @param value1 - value selected to be checked
// @return
function checkRadioEnabledValue ( field1  , checkValue ) {
	for ( var i=0;i<field1.length;i++ ) {
		if ( field1[i].value == checkValue ) {
			field1[i].checked = true;
		}
	}
}

function isRadioEnabledField ( field1, value1 , field2 ) {
	for ( var i=0;i<field1.length;i++ ) {
		if ( field1[i].checked && field1[i].value == value1 ) {
			if ( isEmpty ( field2.value ) )
				return false;
		}
	}
	return true;
}


function isRadioDisabledField ( field1, value1 , field2 ) {
	for ( var i=0;i<field1.length;i++ ) {
		if ( field1[i].checked && field1[i].value == value1 ) {
			if ( !isEmpty ( field2.value ) )
				return false;
		}
	}
	return true;
}


function uncheckAllRadioField ( field1 ) {
	for ( var i=0;i<field1.length;i++ ) {
		field1[i].checked = false;
	}
}



// @param str - value to be checked
// @param fix (optional) - fix decimal place (preset to 2)
// @return true/false
function isNumber ( str , fix ) {
	var reNumber;
	if (( isNumber.arguments.length > 1 ) && (fix == true))
		reNumber = /^\s*[+-]?\d+(.\d{2}){1}\s*$/;
	else
		reNumber = /^\s*[+-]?\d+(.\d+){1}\s*$/;
	return reNumber.test ( str );
}

// @param str - value of text area field
// @param rows - max # of rows in Integer
// @param cols - max # of columns in Integer
// @return true/false
function isTextAreaValid ( str , rows , cols  ) {
	var charNewLine = "\n" ;
	var lines = str.split ( charNewLine );
	if ( lines.length > rows ) {
		return false;
	}
	for ( var i=0;i<lines.length;i++ ) {
		if ( lines[i].length > cols )
			return false;
	}
	return true;
}

// @param c - first character a-z, A-Z
// @param n - 6 digits number 0-9
// @param d - 0-9,A
// @return true/false
function isHKID ( str ) {
	if (!isPattern ( str , "A000000(Z)" ) ){
		return false;
	}
	var c = str.substring ( 0 , 1 );
	var n = str.substring ( 1 , 7 );
	var d = str.substring ( 8 , 9 );
	var sum = 0;
	var uppercaseLetters = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"	
	sum += (uppercaseLetters.indexOf ( c.toUpperCase ( ) ) + 1) * 8;	
	sum += parseInt ( n.charAt(0) ) * 7;
	sum += parseInt ( n.charAt(1) ) * 6;
	sum += parseInt ( n.charAt(2) ) * 5;
	sum += parseInt ( n.charAt(3) ) * 4;
	sum += parseInt ( n.charAt(4) ) * 3;
	sum += parseInt ( n.charAt(5) ) * 2;
	var differ = 11 - (sum % 11);
	if ( differ == 10 && d.toUpperCase() == "A" )
		return true;
	else if ( differ == 11 && d == "0" )
		return true;
	else if ( parseInt ( d ) == differ )
		return true;
	return false;
}

function isBRID ( str ) {
	if (!isPattern ( str , "ZZZZZZZZ-ZZZ" ) ){
		return false;
	}
	return true;
}



// @param - str string value with signed , commas and decimal checking
// @return true/false
function checkCommasNumber ( str ) {
	var reCommasNumber = /^\s*[+-]?\d*(^,)*(,\d{3})*.?\d*$/;
	return reCommasNumber.test ( str );
}

// @param - str string value with signed , commas and decimal checking
// @return number without commas (for further parseInt)
function getNoCommasNumber ( str ) {
	if (checkCommasNumber ( str )) {
		var reCommas = ",";
		return str.replace ( reCommas , "" );
	}
	return "";
}

var daysInMonth = makeArray(12);
daysInMonth[1] = 31;
daysInMonth[2] = 28;   // must programmatically check this
daysInMonth[3] = 31;
daysInMonth[4] = 30;
daysInMonth[5] = 31;
daysInMonth[6] = 30;
daysInMonth[7] = 31;
daysInMonth[8] = 31;
daysInMonth[9] = 30;
daysInMonth[10] = 31;
daysInMonth[11] = 30;
daysInMonth[12] = 31;

// @param month - integer in 0 - 11
// @param year (optional) - number in year
// @return # of days
function getDaysInMonth ( month ,year ) {
	var tempYear;
	if ( month == 1 && getDaysInMonth.arguments.length > 1 ) {
		return (  ((year % 4 == 0) && ( (!(year % 100 == 0)) || (year % 400 == 0) ) ) ? 29 : 28 );
	}
	return daysInMonth[month + 1];
}

// @param year - string year
// @param month - string month
// @param day - string day
// @return true/false
function isDate ( syear , smonth , sday ) {
	var year = parseInt ( syear );
	var month = parseInt ( smonth );
	var maxDays = getDaysInMonth ( month , year );
	if ( parseInt ( sday ) > maxDays )
		return false;
	return true;		
}

function checkDate ( syear , smonth , sday ) {
	var year = parseInt ( syear );
	var month = parseInt ( smonth );
	var maxDays = getDaysInMonth ( month , year );
	if ( parseInt ( sday ) > maxDays ) {
		return false;
	}
	
	if ( syear != '' || smonth != '' || sday != '') {
	  if ( syear == '' || smonth == '' || sday == '') {
	    return false;
	  }
	}
	return true;		
}
	

// @param form - form object
// @param f_prefix - prefix of item field name in string
// @param idxfrom - integer index start from
// @param idxto - integer index stop at
// @param maxselected (optional) - integer max # of selection (1 for not enter)
// @param minselected (optional) - integer min # of selection (1 for not enter)
// @return true/false
function isItemSelected ( form , f_prefix , idxfrom , idxto , maxselected , minselected ) {
	var maxcnt = 1;
	var mincnt = 1;
	if ( isItemSelected.arguments.length > 4 ) {
		maxcnt = maxselected;
	}
	if ( isItemSelected.arguments.length > 5 ) {
		mincnt = minselected;
	}
	var cnt = 0;
	for ( var i=idxfrom;i<=idxto;i++ ) {
		var idx = String(i);
		if ( form.elements[f_prefix + "_" + String(i)].checked )
			cnt++;
	}
	if ( cnt > maxcnt || cnt < mincnt ) {
		return false;
	}
	return true;
}


// String literal of data type
var PARAM_DATATYPE_STRING = 1;
var PARAM_DATATYPE_INTEGER = 2;
var PARAM_DATATYPE_FLOAT = 3;
var PARAM_DATATYPE_EMAIL = 4;
var PARAM_DATATYPE_DATE = 5;
var PARAM_DATATYPE_PATTERN = 6;
var PARAM_DATATYPE_TEXTAREA = 7;
var PARAM_DATATYPE_PROC = 8;
var PARAM_DATATYPE_PHONE = 9;

// String literal of custom field label type
var FIELD_LABEL_CUSTOM_MANDATORY = 1;

// String literal of input type
var PARAM_INPUTTYPE_TEXT = "text";
var PARAM_INPUTTYPE_CHECKBOX = "checkbox";
var PARAM_INPUTTYPE_SELECT = "select-one";
var PARAM_INPUTTYPE_RADIO = "radio";
var PARAM_INPUTTYPE_TEXTAREA = "textarea";

// integer : fieldname , PARAM_DATATYPE_INTEGER , mandatory , fieldlabel , min , max ,  reserve
// float : fieldname , PARAM_DATATYPE_FLOAT , mandatory , fieldlabel , min , max ,  reserve
// string : fieldname , PARAM_DATATYPE_PATTERN , mandatory , fieldlabel , pattern , reserve ,  reserve
// textarea : fieldname , PARAM_DATATYPE_TEXTAREA , mandatory , fieldlabel , row , col ,  reserve
// email : fieldname , PARAM_DATATYPE_STRING , mandatory , fieldlabel , reserve , reserve ,  reserve
// date : fieldname , PARAM_DATATYPE_DATE , mandatory , fieldlabel , fromdate , todate (YYYY/MM/DD) ,  reserve
// phone : fieldname , PARAM_DATATYPE_PHONE , mandatory , field label , reserve , reserve , reserve
// @param form - form object
// @param tableitem - table item of parameters 
// @return true/false
function isFieldValid ( form , tableitem ) {
	var field_name = tableitem[0];
	var field_mand = tableitem[2];
	var field_label = tableitem[3];
	var arg1  = tableitem[4];
	var arg2  = tableitem[5];
	var arg3  = tableitem[6];
	var field_label_custom = tableitem[7];
	var field_label_custom_type = tableitem[8];
	
	var field_value;
	var field_type = tableitem[1];
	if ( field_type == PARAM_DATATYPE_DATE ) {
		// field not exist	
		if ( form.elements[field_name + ".year"] == null ) {
			return true;
		}
		// date object
		if ( !checkDate ( form.elements[field_name + ".year"].value , form.elements[field_name + ".month"].value , form.elements[field_name + ".date"].value ) ) {
      alert ( "You have entered an Invalid Date for " + field_label + " , please re-enter." );
			return false;
		}
		if ( form.elements[field_name + ".year"].value == "" || form.elements[field_name + ".month"].value == "" || form.elements[field_name + ".date"].value == "" ) {
			field_value = "";		
		} else {
			field_value = new Date ( form.elements[field_name + ".year"].value , form.elements[field_name + ".month"].value , form.elements[field_name + ".date"].value );	
  	}	
	} else if ( field_type == PARAM_DATATYPE_PHONE ) {
		// field not exist	
		if ( form.elements[field_name + ".phoneNum"] == null )
			return true;
		if ( trim(form.elements[field_name + ".phoneNum"].value) != "" &&  trim(form.elements[field_name + ".countryCode"].value) == "" ) {
alert ( "Please enter Country Code of " + field_label + "." );
			return false;
		}
		if ( form.elements[field_name + ".phoneNum"].value != "" && !isAllNumeric ( form.elements[field_name + ".phoneNum"].value ) ) {
alert ( "Please re-enter " + field_label + " in numbers." );
			return false;
		}

		if ( form.elements[field_name + ".areaCode"].value != "" && !isAllNumeric ( form.elements[field_name + ".areaCode"].value ) ) {
alert ( "Please re-enter Area Code of " + field_label + " in numbers." );
			return false;
		}

		if ( form.elements[field_name + ".countryCode"].value != "" && !isAllNumeric ( form.elements[field_name + ".countryCode"].value ) ) {
alert ( "Please re-enter Country Code of " + field_label + " in numbers." );
			return false;
		}
		field_value = trim(form.elements[field_name + ".phoneNum"].value);
	} else {
		// field not exist	
		if ( form.elements[field_name ] == null )
			return true;
		var field = form.elements[field_name];
		if ( field.type == PARAM_INPUTTYPE_CHECKBOX ) {
			field_value = getCheckboxEnabledField ( field , field );
		} else if ( field.type == PARAM_INPUTTYPE_TEXTAREA ) {
			if ( !isTextAreaValid ( field.value , parseInt ( arg1 ) , parseInt ( arg2 )  ) ) {
alert ( "Overflow in " + field_label + " , make sure the information is less then " + arg1 + "row(s) and " + arg2 + "column(s)." );
				return false;
			}				
			field_value = field.value;
		} else if ( field[0] != null && field[0].type == PARAM_INPUTTYPE_RADIO ) {
			for ( var i=0;i<field.length;i++ ) {
				if ( field[i].checked ) {
					field_value = field[i].value;
				}
			}
		} else {
			field_value = field.value
		}
	}
	
	// field_type , field_value
	// test mandatory
	// if not mandatory but field is empty, skip validation and return true

	if ( field_mand == true && (field_value == null || trim(field_value) == "" ) ) {
	  if (field_label_custom_type == FIELD_LABEL_CUSTOM_MANDATORY) {
      alert ( field_label_custom );      
    } else {
      alert ( "Please enter " + field_label + "." );
    }
		return false;
	}		
		
	if (  (parseInt ( field_type ) != PARAM_DATATYPE_PROC) && (field_value == null || trim(field_value) == "")  ) {
		return true;
	}

	// test data type
	switch  ( parseInt ( field_type ) ) {
//		case PARAM_DATATYPE_STRING:
		case PARAM_DATATYPE_INTEGER:
			if ( !isInteger ( field_value ) ) {
alert ( "Please re-enter an integer for " + field_label + "." );
				return false;
			}
			break;
		case PARAM_DATATYPE_FLOAT:
			if ( !isNumber ( field_value ) && !isInteger ( field_value ) ) {
alert ( "Please re-enter " + field_label + " in numbers." );
				return false;
			}				
			break;
		case PARAM_DATATYPE_EMAIL:
			if ( !isEmail ( field_value ) ) {
alert ( "Format of " + field_label + " is invalid!  Please re-enter." );
				return false;
			}
			break;
//		case PARAM_DATATYPE_DATE:
//		case PARAM_DATATYPE_PATTERN:
//		case PARAM_DATATYPE_TEXTAREA:
//		case PARAM_DATATYPE_PROC:
	}

	// test range/pattern
	switch  ( parseInt ( field_type ) ) {
//		case PARAM_DATATYPE_STRING:
		case PARAM_DATATYPE_INTEGER:
			if ( trim(arg1) != "" && parseInt ( field_value) < parseInt (arg1)  ) {
alert ( "Information in " + field_label + " should be bigger then " + arg1 + ", please reenter." );
				return false;
			}				
			if ( trim(arg2) != "" && parseInt ( field_value) > parseInt (arg2)  ) {
alert ( "Information in " + field_label + " should be smaller than " + arg2 + ", please reenter." );
				return false;
			}
			break;
		case PARAM_DATATYPE_FLOAT:
			if ( trim(arg1) != "" && parseFloat ( field_value) < parseFloat (arg1)  ) {
			  if ( trim(arg3) == "" ) {
			    alert ( "Information in " + field_label + " should be bigger then " + arg1 + ", please reenter." );
			  } else {
			    alert ( arg3 ); 
			  }
				return false;
			}
			if ( trim(arg2) != "" && parseFloat ( field_value) > parseFloat (arg2)  ) {
			  if ( trim(arg3) == "" ) {
			    alert ( "Information in " + field_label + " should be smaller than " + arg2 + ", please reenter." );
			  } else {
			    alert ( arg3 ); 
			  }
				return false;
			}
			break;
//		case PARAM_DATATYPE_EMAIL:
		case PARAM_DATATYPE_DATE:
		///// NOTE: arg2's usage changed!  now arg2 is the message to be shown (instead of default)
			if ( arg3 == "true" ) {
  			if ( trim(arg1) != "" &&  !isDateBeforeOrEqual ( toDate (arg1) , field_value )  ) {
  			  if ( arg2 != "" ) {
            alert ( arg2 );
            return true;
          } else {
            alert ( "Date in " + field_label + " should be later than or equal to " + showDate(toDate(arg1)) + "(CCYY/MM/DD), please reenter." );  
            return false; 
          } 
  			}				  			
  			/*
  			if ( trim(arg2) != "" && !isDateBeforeOrEqual ( field_value , toDate (arg2) )  ) {
  alert ( "Date in " + field_label + " should be earlier than or equal to " + showDate(toDate(arg2)) + "(CCYY/MM/DD), please reenter." );
  				return false;
  			}
  			*/
			} else {
			  // FIX ME: isDateBefore logic inverted for EL use only for now
  			if ( trim(arg1) != "" &&  isDateBefore ( field_value, toDate (arg1) )  ) {
          if ( arg2 != "" ) {
            alert ( arg2 );
            return true;
          } else {
            alert ( "Date in " + field_label + " should be later than or equal to " + showDate(toDate(arg1)) + "(CCYY/MM/DD), please reenter." );   
            return false;
          } 
  				
  			}			
  			/*	
  			if ( trim(arg2) != "" && !isDateBefore ( field_value , toDate (arg2) )  ) {
  alert ( "Date in " + field_label + " should be earlier than " + showDate(toDate(arg2)) + "(CCYY/MM/DD), please reenter." );
  				return false;
  			}
  			*/
			}
			break;
		case PARAM_DATATYPE_PATTERN:
			if ( trim(arg1) != "" && !isPattern ( field_value , arg1 )  ) {
alert ( "Date in " + field_label + " is in wrong format, please reenter." );
				return false;
			}				
//		case PARAM_DATATYPE_TEXTAREA:
		case PARAM_DATATYPE_PROC:
			switch ( parseInt ( arg1 ) ) {
				case PARAM_PROCTYPE_HKID:
					if ( (arg2 == "H" ) && !isHKID ( field_value ) ) {
alert ( "Please enter HKID No. of " + field_label + " in the format of A123456(A)." );
						return false;
					}
					if ( (arg2 == "B" ) && !isBRID ( field_value ) ) {
alert ( "Please enter BR No. of " + field_label + " in 12 digits, e.g. AA123456-000." );
						return false;
					}
					if ( (arg2 == "P" ) && field_value == "" ) {
alert ( "Please specify Passport No. of " + field_label + "." );
						return false;
					}
					break;
				case PARAM_PROCTYPE_CBOXENABLE:
					if ( !isCheckboxEnabledField ( form.elements[field_name] , form.elements[arg2] ) ) {
alert ( "Please enter " + arg3 + "." );
						return false;
					}
					break;
				case PARAM_PROCTYPE_SELENABLE:
					if ( !isSelectEnabledField( form.elements[field_name] , arg2 , form.elements[arg3] ) ) {
alert ( "Please enter " + arg3 + "." );
						return false;
					}
					break;
				case PARAM_PROCTYPE_RADENABLE:
					if ( !isRadioEnabledField ( form.elements[field_name] , arg2 , form.elements[arg3] ) ) {
alert ( "Please enter " + field_label + "." );
						return false;
					}
					break;
				case PARAM_PROCTYPE_RADDISABLE:
					if ( !isRadioDisabledField ( form.elements[field_name] , arg2 , form.elements[arg3] ) ) {
alert ( field_label + " must be empty." );
						return false;
					}
					break;
				case PARAM_PROCTYPE_CBOXDISABLE:
					if ( !isCheckboxDisabledField ( form.elements[field_name] , form.elements[arg2] ) ) {
alert ( "Please enter " + field_label +"." );
						return false;
					}
					break;
				case PARAM_PROCTYPE_CBOXNOTNULL:
					if ( form.elements[field_name].checked == true && form.elements[arg2].value != "" ) {
alert ( field_label + " should be empty." );
						return false;
					}
					break;
				case PARAM_PROCTYPE_COUNTRYSPEC:
  					var i;
  					for ( i=0;i<specReqCntyTable.length;i++ )
			  			if ( specReqCntyTable[i] == form.elements[arg2].value )
			  				if ( field_value == "" ) {
alert ( "Please specify the Name of Country (Place)." );
				    				return false;
				    			}
				case PARAM_PROCTYPE_CBOXTEXTBOXEXCLUDE:
				if ( form.elements[field_name].checked == false) {
					if ( form.elements[arg2].value == "" || form.elements[arg3].value == "" ) {
alert ( field_label + " should not be empty." );
						return false;
					}
				}
					break;
					break;
			}
	}
	return true;
}

// @param form - form object
// @param table - table object
// @return true/false
function isAllFieldsValid ( form , table ) {
	for ( var i=0;i<table.length;i++ ) {
		if ( !isFieldValid ( form , table[i] ) ) {
			if ( table[i][1] == PARAM_DATATYPE_DATE )
				form.elements[table[i][0] + ".year"].focus();
			else if ( table[i][1] == PARAM_DATATYPE_PHONE )
				form.elements[table[i][0] + ".countryCode"].focus();
			else if ( form.elements[table[i][0]].type != undefined )
				form.elements[table[i][0]].focus();
			return false;
		}
	}
	return true;
}

function isEntered ( form , table ) {
	for ( var i=0;i<table.length;i++ ) {
		if ( form.elements[table[i]] !=  null ) {
			if ( form.elements[table[i]].type == "checkbox" && form.elements[table[i]].checked == true ) {
				form.elements[table[i]].focus();
				return true;
			} else if ( form.elements[table[i]].type == "select-one" && form.elements[table[i]].value != "" ) {
				form.elements[table[i]].focus();
				return true;
			} else if ( form.elements[table[i]].type == "text" && form.elements[table[i]].value != "" ) {
				form.elements[table[i]].focus();
				return true;
			} else if ( form.elements[table[i]][0] != null && form.elements[table[i]][0].type == "radio" && getRadioEnabledValue(form.elements[table[i]]) != "" ) {
				form.elements[table[i]][0].focus();
				return true;
			}
		}
	}
	return false;
}

function flushFields ( form , table ) {
	for ( var i=0;i<table.length;i++ ) {
		if ( form.elements[table[i]] !=  null ) {
			if ( form.elements[table[i]].type == "checkbox") {
			  form.elements[table[i]].checked == false;
			} else if ( form.elements[table[i]].type == "select-one" && form.elements[table[i]].value != "" ) {

			} else if ( form.elements[table[i]].type == "text" ) {
				form.elements[table[i]].value = "";
			}
		}
	}
}

//by Carmen
function isEnglishChar(szString) {
   if(trim(szString)=="") return true;
   var szReplace = /[a-zA-Z0-9!@#$%^&*()-_+=|\:;"',.<>?]/g;
   szString = szString.replace(szReplace, "");
   szString = trim(szString);
   if(szString=="")
     return true;
   else // Chinese entered
     return false;
}

function isChineseChar(szString) {
   if(trim(szString)=="") return true;
   if(!isEnglishChar(szString))  return true;
   return false;
}

function lTrim(str) {
  return str;
  //return str.replace(/^\s+/g, "");
}

function rTrim(str) {
  return str;
  //return str.replace(/\s+$/g, "");
}

function trim(str) {
  return rTrim(lTrim(str));
}
//end by Carmen

// Procedure list for validation
var PARAM_PROCTYPE_HKID = 1;
var PARAM_PROCTYPE_CBOXENABLE = 2;
var PARAM_PROCTYPE_SELENABLE = 3;
var PARAM_PROCTYPE_RADENABLE = 4;
var PARAM_PROCTYPE_CBOXDISABLE = 5;
var PARAM_PROCTYPE_CBOXNOTNULL = 6;
var PARAM_PROCTYPE_COUNTRYSPEC = 7;
var PARAM_PROCTYPE_RADDISABLE = 8;
var PARAM_PROCTYPE_CBOXTEXTBOXEXCLUDE = 9;
