
var bDebug = false;
/* popup the error window, and use form submit method to pass errors */
function errorWindow(){
	var error_win = window.open("about:blank","Error_Window","toolbar=no,location=no,status=no,scrollbars=yes, width=315,height=400,left=705");
	document.ErrorForm.ErrorArray.value = errorArray.join(",");
	document.ErrorForm.target = 'Error_Window';
	document.ErrorForm.submit();
	error_win.focus();
}


/* function used to disable alteration of form fields*/
function disableWrite(oInputObj){
	oInputObj.contentEditable = false;
}

/* close current window */
function closeWindow(){
	self.close();
}
//Define errorArray which is used to contain Error Messages
var errorArray = [];

// Form Validation , popup window if Error array is not empty
function validateForm(sURL){
	bNoError = true;

	if (errorArray.length > 0 ){
			bNoError = false;
	}
	if (bNoError){
		if (sURL !=null){
			document.forms[0].action = sURL;
		}
	}
	else
	{
		errorWindow();
	}
	errorArray = [];
	return bNoError;
}

function throwServerSideMessage(iServerMessageType){
	var error_win = window.open("about:blank","Error_Window","toolbar=no,location=no,status=no,scrollbars=yes, width=315,height=400,left=705");
	document.ErrorForm.target = 'Error_Window';
	document.ErrorForm.action += '&server='+iServerMessageType;
	document.ErrorForm.submit();
	document.ErrorForm.ServerMessage.value = "";
	document.ErrorForm.action = '../../common/errorPopup.jsp?u=1';
	error_win.focus();
}



/*
 *	To check input string if it is of Numeric values
 * parameters:
 *	sInput - Input Field
 *	sCaption - Field to be displayed in Error Popup
 *	iMinLength - Minimum Length required, insert null or 0 if no minimum,
 *				override by bAllowEmpty if it is set to true
 * 	bAllowDecimal - if string allow 1/2 decimal to be used
 * 	bAllowEmpty - if it is set to true, empty/null string will not throw an error
 */
function checkNumericField(oInputObj, sCaption, iMinValue, iMaxValue, bAllowDecimal, bAllowEmpty, iNumberOfDecimalPlace){
	var sInput = oInputObj.value ;
	var iMin = iMinValue;
	if (!bAllowEmpty){
		if ((!validateEmptyField(sInput, sCaption))){
			return false;
		}
	}
	if (isNotEmpty(sInput)){
		if (bAllowDecimal){
			if (!validateNumber(sInput, sCaption)){
				return false;
			}

			if (!validateDecimalPlace(sInput, sCaption, iNumberOfDecimalPlace)){
				return false;
			}

		} else {
			if (!(validateInteger(sInput, sCaption))){
				return false;
			}
		}

		if (!(validateNumberSize(sInput, sCaption, iMin, iMaxValue) )){
			return false;
		}
	}
	return true;
}



/*
 *	To check input string if met Telephone Number Ctiteria
 * parameters:
 *	oInputObj - Input Object
 *	sCaption - Field to be displayed in Error Popup
 * 	bAllowEmpty - if it is set to true, empty/null string will not throw an error
 */

function checkTelephoneField(oInputObj, sCaption, bAllowEmpty){
	var sInput = oInputObj.value ;
	if (!bAllowEmpty){
		if ((!validateEmptyField(sInput, sCaption))){
			return false;
		}
	}
	if (isNotEmpty(sInput)){
		if (!(validateInteger(sInput, sCaption))){
			return false;
		}
	}
	return true;
}


/*
 *	This is used for throwing custom error code
 *  Param: 	sCaption - Field to be displayed in Error Popup
 * 			sErrorCode -- Error Code String
 */
function throwError(sCaption, sErrorCode, oInputObj){
	if (sErrorCode ==null){
		sErrorCode = '10000';
	}
	errorArray = errorArray.concat((sCaption+'='+sErrorCode)) ;
}



/*
 *	This is used for mandatory select field, if Submitted value is equals to this value, throw error
 *	Param:	sInput -- Submitted value
 *			sValue -- if Submitted value is equals to this value, throw error
 *  	 	sCaption - Field to be displayed in Error Popup
 */
function checkSelect(oInputObj, sValue, sCaption){
	var sInput = oInputObj.value ;
	if (sInput.toString() == sValue){
		throwError(sCaption, '10022');
		return false;
	}
	return true;
}

function checkRadio(oInputObj){
    
    var bChecked = false; 
	if(oInputObj==null) return false;
	if(oInputObj.length!=null) {
		for(var i=0;i<oInputObj.length;i++) {
			if (oInputObj[i].checked) {
				bChecked = true;
				break;
			}
		}
    }else if(oInputObj.checked)
        bChecked = true;
    
    return bChecked;
}
    
/*
 *	This is used for mandatory checkbox fields, if no of checkbox checked is not in the range [sMinValue, sMaxValue], throw error
 *	Param:	oInputObj -- CheckBox or its name if iIndex1 and iIndex2 is not null
 *			sMinValue -- when null, no lower bound
 *			sMaxValue -- when null, no upper bound
 *  	 	sCaption -- Field to be displayed in Error Popup
 *			iIndex1, iIndex2 -- Optional, set when the checkboxes' name are not the exactly same
 */
function checkCheckboxes(oInputObj, sMinValue, sMaxValue, sCaption, iIndex1, iIndex2, sCheckValue){
	var sNumChecked=0;

	if(iIndex1!=null && iIndex2!=null) {
	    if(iIndex1<0 || iIndex2<iIndex1) return false;
		for(var i=iIndex1;i<=iIndex2;i++) {
			var obj = eval(oInputObj.replace('#',i));
			if (obj!=null && obj.checked) {
				if(sCheckValue==null || sCheckValue==obj.value)
					sNumChecked++;
			}
		}
	}
	else {
		if(oInputObj==null) return false;
		if(oInputObj.length!=null) {
			for(var i=0;i<oInputObj.length;i++) {
				if (oInputObj[i].checked) {
					if(sCheckValue==null || sCheckValue==oInputObj[i].value)
						sNumChecked++;
				}
			}
		} else if(oInputObj!=null) {
			if (oInputObj.checked)
				if(sCheckValue==null || sCheckValue==oInputObj.value)
					sNumChecked = 1;
		}
	}

	if(sNumChecked!=sMaxValue && sMaxValue==sMinValue && sMaxValue!=null) {
		throwError(sCaption, '10050|'+sMaxValue);
		return false;
	}
	else if(sNumChecked>sMaxValue && sMaxValue!=null) {
		throwError(sCaption, '10046|'+sMaxValue);
		return false;
	}
	else if(sNumChecked<sMinValue && sMinValue!=null) {
		throwError(sCaption, '10047|'+sMinValue);
		return false;
	}
	return true;
}


/*
 *	To check input string if it is a String
 *  parameters:
 *	sInput - Input Field
 *	sCaption - Field to be displayed in Error Popup
 *	iMinLength - Minimum Length required, insert null or 0 if no minimum,
 *				override by bAllowEmpty if it is set to true
 *  iMaxLength - Maximum Length of String field
 * 	bAllowEmpty - if it is set to true, empty/null string will not throw an error
 */
function checkStringField(oInputObj, sCaption, iMinLength, iMaxLength, bAllowEmpty){
	var sInput = trim(oInputObj.value) ;
	var iMin = iMinLength;
	if (!(bAllowEmpty)){
		if (!(validateEmptyField(sInput, sCaption))){
			return false;
		}
	} else {
		iMin = 0;
	}
	if (!(validateFieldLength(sInput, sCaption, iMin, iMaxLength))){
		return false;
	}
	return true;
}

/*
 *	To check input string if it is a Date Field
 *  parameters:
 *	sInput_dd - Input date
 *	sInput_mm - Input Month
 *	sInput_yyyy - input Year
 *	sCaption - Field to be displayed in Error Popup
 * 	bAllowEmpty - if it is set to true, empty/null string will not throw an error
 */
function checkDateField(sInput_ddObj, sInput_mmObj, sInput_yyyyObj, sCaption, bAllowEmpty){

	var sInput_dd = sInput_ddObj.value ;
	var sInput_mm = sInput_mmObj.value ;
	var sInput_yyyy = sInput_yyyyObj.value ;
	var bDateError = false;
	if (((!bAllowEmpty)|isNotEmpty(sInput_dd)|isNotEmpty(sInput_mm)|isNotEmpty(sInput_yyyy))){
		if (!(validateEmptyField(sInput_dd, sCaption+' day'))){
			bDateError = true;
		}
		if (!(validateEmptyField(sInput_mm, sCaption+' month' ))){
			bDateError = true;
		}
		if (!(validateEmptyField(sInput_yyyy, sCaption+' year'))){
			bDateError = true;
		}
		if (bDateError) {
			return false;
		}

		if (!(validateDateFormat((sInput_dd+'/'+sInput_mm+'/'+sInput_yyyy), sInput_ddObj, sInput_mmObj, sInput_yyyyObj, sCaption))){
			//Highlight Error Logic is inside validateDateFormat
			bDateError = true;
		}
		if (bDateError) {
			return false;
		}
	}
	return true;
}
/*
 *	To check for input string if two Values are larger/smaller than the other,
 *  parameters:
 *
 *	oInputNum_Obj1 - First Value to Compare
 *	oInputNum_Obj2 - Second Value to Compare
 *	bFirstValueIsLarger - use 'true' if `st value is larger than 2nd value
 *	bAllowEmpty_1 - Allow 1st value to be Empty
 *	bAllowEmpty_2 - Allow 2nd value to be Empty
 *	NB: if either bAllowEmpty_1 / bAllowEmpty_1 is used,
 *  no comparison is used if either value is empty
 */

function checkCompareInteger(oInputNum_Obj1, oInputNum_Obj2, bFirstValueIsLarger, sCaption1, sCaption2, bAllowEqual){
	var iNum1 = oInputNum_Obj1.value;
	var iNum2 = oInputNum_Obj2.value;
	var bCompareError = false;
	if (isNotEmpty(iNum1)){
		if (!(validateEmptyField(iNum2, sCaption2))){
				bCompareError = true;
		}
	}
	if (isNotEmpty(iNum2)){
		if (!(validateEmptyField(iNum1, sCaption1))){
				bCompareError = true;
		}
	}
	if (bCompareError){
		return false;
	}
	if (isNotEmpty(iNum1)&isNotEmpty(iNum2)){
		if (!validateCompareInteger(iNum1, iNum2, bFirstValueIsLarger, sCaption1, sCaption2, bAllowEqual)){
			return false;
		}
	}
	return true;
}



/*
 *	To check for input string if two date fields are correct,
 *  and end date is earlier than to date
 *  parameters:
 *	sInputStart_dd - Input Start date
 *	sInputStart_mm - Input Start Month
 *	sInputStart_yyyy - input Start Year
 *	sInputEnd_dd - input End Year
 * 	sInputEnd_mm - input End Year
 *  sInputEnd_yyyy - input End Year
 *	sCaption - Field to be displayed in Error Popup
 * 	bAllowEmpty_Start - if it is set to true, empty/null Start Date string will not throw an error
 *	bAllowEmpty_End - if it is set to true, empty/null End Date string will not throw an error
 */
function checkCompareDate(sInputStart_ddObj, sInputStart_mmObj, sInputStart_yyyyObj,  sInputEnd_ddObj, sInputEnd_mmObj, sInputEnd_yyyyObj, sCaption_Start, sCaption_End, bAllowEmpty_Start, bAllowEmpty_End){
	bError = false;
	var sInputStart_dd = sInputStart_ddObj.value ;
	var sInputStart_mm = sInputStart_mmObj.value ;
	var sInputStart_yyyy = sInputStart_yyyyObj.value ;

	var sInputEnd_dd = sInputEnd_ddObj.value ;
	var sInputEnd_mm = sInputEnd_mmObj.value ;
	var sInputEnd_yyyy = sInputEnd_yyyyObj.value ;

	if (((!bAllowEmpty_Start)|isNotEmpty(sInputStart_dd)|isNotEmpty(sInputStart_mm)|isNotEmpty(sInputStart_yyyy))){
		if (!(checkDateField(sInputStart_ddObj, sInputStart_mmObj, sInputStart_yyyyObj, sCaption_Start, false))){
			bError = true;
		}
	}
	if (((!bAllowEmpty_End)|isNotEmpty(sInputEnd_dd)|isNotEmpty(sInputEnd_mm)|isNotEmpty(sInputEnd_yyyy))){
		if (!(checkDateField(sInputEnd_ddObj, sInputEnd_mmObj, sInputEnd_yyyyObj, sCaption_End, false))){
			bError = true;
		}
	}
	if (bError){
		return false;
	}

	if (!(validateCompareDate((sInputStart_dd+'/'+sInputStart_mm+'/'+sInputStart_yyyy), (sInputEnd_dd+'/'+sInputEnd_mm+'/'+sInputEnd_yyyy), sCaption_End))){
		return false;
	}
	return true;
}

/* Replace a certain String in the form field*/
function replaceChars(sEntryStr, sReplaceStr) {
	sInput = sEntryStr; // replace this
	sOutput = sReplaceStr; // with this
	tmpStr = ""  ; // temporary holder
	while (tmpStr.indexOf(sInput)>-1) {
		pos= tmpStr.indexOf(sInput);
		tmpStr = "" + (tmpStr.substring(0, pos) + sOutput +
		tmpStr.substring((pos + sInput.length), tmpStr.length));
	}
	return tmpStr;
}

function leftTrim(str) {
  	if (isNotEmpty(str)){
    	i = 0;
    	while (str.charAt(i) == ' ') i++;
     		str = str.substring(i);
    		return str;
	}
	return str;
}

function rightTrim(str) {
	if (isNotEmpty(str)){
	    for (var i = str.length; i > 0; i--){
			if (str.charAt(i) == ' ') {
				str = str.substring(0,i-1);
			} else {
				return str;
			}
		}
	}
	return str;
}

function trim(str) {
        return leftTrim(rightTrim(str));
}



function checkEmailField(oInputObj, sCaption, bAllowEmpty){
	var sInput = oInputObj.value ;
	var bEmailError = false;

	if (!bAllowEmpty|isNotEmpty(sInput)){

		if (!(validateEmptyField(sInput, sCaption))){
			bEmailError = true;
		}

		if (bEmailError){
			return false;
		}
		if (!(validateEmailField(sInput, sCaption))){
			bEmailError = true;
		}
		if (bEmailError){
			return false;
		}
	}
	return true;
}

function checkMultipleEmailField(oInputObj, sCaption, bAllowEmpty){
	var sInput = oInputObj.value ;
	var bEmailError = false;
	if (!bAllowEmpty|isNotEmpty(sInput)){
		if (!(validateEmptyField(sInput, sCaption))){
			bEmailError = true;
		}
		if (bEmailError){
			return false;
		}
		if (!(validateMultipleEmailField(sInput, sCaption))){
			bEmailError = true;
		}
		if (bEmailError){
			return false;
		}
	}
	return true;
}



function checkAlphaNumericField(oInputObj, sCaption, iMinLength, iMaxLength, bAllowEmpty){
	var sInput = oInputObj.value ;
	if (!bAllowEmpty){
		if (!(validateEmptyField(sInput, sCaption))){
			return false;
		}
	}
	if (!(validateFieldLength(sInput, sCaption, iMinLength, iMaxLength))){
		return false;
	} else {
		iMin = 0;
	}
	if ((!bAllowEmpty)|isNotEmpty(sInput)){
		if (!(validateAlphaNumericField(sInput, sCaption))){
			return false;
		}
	}
	return true;
}


/***************** Core Functions ***************************************/

function validateAlphaNumericField(sInput, sCaption){
	var alphaNum = /^[a-z_0-9]+$/i ;
	if (alphaNum.test(sInput)){
		return true;
	}
	throwError(sCaption, '10035'); // Alpha-Numeric Error
	return false;
}


/* Check if text box is empty, return Code 10001 if not*/
function validateEmptyField(sInput, sCaption){
	if (sInput != null){
		var sInputStr = trim(sInput.toString());
		if (sInputStr.length > 0){
			return true;
		}
	}
	throwError(sCaption, '10001'); // Empty Error
	return false;
}

/* Check if input value fits into simple Email pattern, return Code 10004 if not*/
function validateEmailField(sInput, sCaption){
	if (isNotEmpty(sInput)){
		//var emailexp = /^\w+([\.\-_]?\w+)*@\w+([\.\-_]?\w+)*(\.\w{2,3})+$/i;
		var emailexp = /^([a-zA-Z0-9_\-\.]+)@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([a-zA-Z0-9\-]+\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)$/;
		if (!emailexp.test(sInput)){
			throwError(sCaption, '10004'); // Email Error
			return false;
		}
	}
	return true;
}

function validateMultipleEmailField(sInput, sCaption){
	var emailexp = /^\w+([\.\-_]?\w+)*@\w+([\.\-_]?\w+)*(\.\w{2,3})+$/i;
	if (isNotEmpty(sInput)){
		a = sInput.split(";");
		for(j=0;j<a.length;j++) {
			if (trim(a[j]).length > 0) {
				if (!emailexp.test(trim(a[j]))){
					throwError(sCaption, '10023'); // Email Error
					return false;
				}
			}
		}
	}
	return true;
}


/* Check and return true if input value is not null or empty String */
function isNotEmpty(sInput){
	if (sInput != null){
		var sInputStr = sInput.toString();
		if (sInputStr.length > 0){
			return true;
		}
	}
	return false;
}



// validate against the format "DD/MM/YYYY", throws error code 10011 if its not correct
function validateDateFormat(sInputStr, sInput_ddObj, sInput_mmObj, sInput_yyyyObj, sCaption) {
	var bDateError = false;
	var str = trim(sInputStr);
	var str1 = 0;
	var str2 = 1;
	var str3 = 2;
	var limit = 3;
	var separator = "/";
	var strFormat = "(DD/MM/YYYY)";
	var arr = str.split(separator, limit)
	var error = false;

	// not use parseInt which has bugs in Netscape 3.0
	var int1 = parseFloat(arr[str1]);
	var int2 = parseFloat(arr[str2]);
	var int3 = parseFloat(arr[str3]);

	if (isNotEmpty(int1)|isNotEmpty(int2)|isNotEmpty(int3)){
		if (isNaN(int1)) {
			throwError(sCaption, '10005');
			bDateError = true;
		} else if (isNaN(int2)) {
			throwError(sCaption, '10005');
			bDateError = true;
		} else if (isNaN(int3)) {
			throwError(sCaption, '10005');
			bDateError = true;
		}
		if (bDateError) {
			return false;
		}

		if (int1 < 1 || int1 > 31) {
			throwError(sCaption, '10011');
			bDateError = true;
		} else if (int2 < 1 || int2 > 12) {
			throwError(sCaption, '10011');
			bDateError = true;
		}
		if (arr[str3].length != 4 ) {
			throwError(sCaption, '10013');
			bDateError = true;
		}
		if (int3 < 1800) {
			throwError(sCaption, '10016');
			bDateError = true;
		}
		if (bDateError) {
			return false;
		}

		var date = new Date(int3, int2-1, int1)
		if (int1 != date.getDate()) {
			throwError(sCaption, '10011');
			return false;
		}
	}
	return true;
}

function checkTimeField(sInput_hhObj, sInput_minObj, sCaption, bAllowEmpty){

	var sInput_hh = sInput_hhObj.value ;
	var sInput_min = sInput_minObj.value ;
	var bTimeError = false;
	if (((!bAllowEmpty)|isNotEmpty(sInput_hh)|isNotEmpty(sInput_min))){
		if (!(validateEmptyField(sInput_hh, sCaption+' hour'))){
			bTimeError = true;
		}
		if (!(validateEmptyField(sInput_min, sCaption+' minutes' ))){
			bTimeError = true;
		}
		if (bTimeError) {
			return false;
		}
		if (isNaN(sInput_hh)) {
			throwError(sCaption+' hour', '10005');
			bTimeError = true;
		}
		if (sInput_hh>23 || sInput_hh<0){
		    throwError(sCaption+' hour', '10017');
			bTimeError = true;
		}

		if (isNaN(sInput_min)) {
			throwError(sCaption+' minutes', '10005');
			bTimeError = true;
		}
		if (sInput_min>59 || sInput_min<0){
		    throwError(sCaption+' minutes', '10018');
			bTimeError = true;
		}
		if (bTimeError) {
			return false;
		}
	}
	return true;
}

/*	Returns true if value is a number defined as having an optional leading + or -,
	and having at most 1 decimal point.
   	otherwise containing only the characters 0-9.
	return 10008 if it does not meet requirement
*/
function validateNumber(sInputStr, sCaption)	{

	if (isNotEmpty(sInputStr)) {
		/*var start_format = " .+-0123456789";
		var number_format = " .0123456789";
		var check_char;
		var decimal = false;
		var trailing_blank = false;
		var digits = false;

	    //The first character can be + - .  blank or a digit.
		check_char = start_format.indexOf(sInputStr.charAt(0))
		//Was it a decimal?
		if (check_char == 1) {
		    decimal = true;
		} else if (check_char < 1){
			return false;
		}

		//Remaining characters can be only . or a digit, but only one decimal.
		for (var i = 1; i < sInputStr.length; i++) {
			check_char = number_format.indexOf(sInputStr.charAt(i))
			if (check_char < 0){
				return false;
			}
			else if (check_char == 1) {
				if (decimal){		// Second decimal.
					return false;
				}	else {
					decimal = true;
				}
			}
			else if (check_char == 0) 	{
				if (decimal || digits)	{
					trailing_blank = true;
				}
			}
	        // ignore leading blanks
			else if (trailing_blank) {
				return false;
			}
			else {
				digits = true;
			}
		}
	}
	//All tests passed, so...
    return true ;*/

	//	if(!sInputStr.match(/\d\.?/g) ){
	if(!sInputStr.match(/^[+-]?\d+(\.\d+)?$/)){
			throwError(sCaption, '10005'); // Not valid integer values, 10005
			return false;
		}
		return true;
	}
}


/*
 * Validates integer strings, use validateNumber for
 * decimals/positive/negative values
 * Parameter: sInteger - a string to validate as an integer
 * Returns:   true (is integer) or false (is not) boolean
 * throws Error Code 10005 if it does not fit requirement
 */
function  validateInteger(sInput, sCaption) {
	if (isNotEmpty(sInput)){
		inputStr = sInput.toString(); // in case not a string already
	    for (var i = 0; i < inputStr.length; i++) {
	        var oneChar = inputStr.charAt(i);
	        if (oneChar < "0" || oneChar > "9") {
	            throwError(sCaption, '10005'); // Not valid integer values, 10005
				return false;
	        }
	    }
	}
	return true;
}

/*
 * Validates 2 date strings, and see if endDate is later than start date
 * Parameter: 	startDate - start date string to be tested, must be in the form of (dd/mm/yyyy)
 * 				endDate - end Date Strign to be tested, must be in the form of (dd/mm/yyyy)
 * Returns:   	true (if date is correct) or false (is not correct)
 * 				throws Error Code 10012 if it does not fit requirement
 * NB: if startDate / endDate is empty (contains '//'), both strings will not be tested
 */
function validateCompareDate(startDate, endDate, sCaption)	{
	var start = trim(startDate);
	var end = trim(endDate);
	var str1 = 0;
	var str2 = 1;
	var str3 = 2;
	var limit = 3;
	var separator = "/";
	var arrStart = start.split(separator, limit)
	var arrEnd = end.split(separator, limit)

	// not use parseInt which has bugs in Netscape 3.0
	var startDay = parseFloat(arrStart[str1]);
	var startMonth = parseFloat(arrStart[str2]);
	var startYear = parseFloat(arrStart[str3]);
	var endDay = parseFloat(arrEnd[str1]);
	var endMonth = parseFloat(arrEnd[str2]);
	var endYear = parseFloat(arrEnd[str3]);
	if (isNotEmpty(startMonth)&isNotEmpty(startDay)&isNotEmpty(startYear)&isNotEmpty(endMonth)&isNotEmpty(endDay)&isNotEmpty(endYear)){
		// create date object
		var sDate = new Date(startYear, startMonth-1, startDay);
		var eDate = new Date(endYear, endMonth-1, endDay);
		if (eDate < sDate) {
			throwError(sCaption, '10012'); //Throw 10012 Error Code if End date !> Start Date
			return false;
		}
	}
	return true;
}

/*
 * Validates field legth, and test  if it exceed maximum length, or below minium length
 * Parameter: 	sInput - String to be tested
 * 				sCaption - Caption of the Error message
 *				iMinLen - minimum length of string
 *				iMaxLen - maximum length of string
 * Returns:   	true (if field is correct) or false (is not correct)
 *
 * NB: throws 10002 or 10003 Error Code
 */
function validateFieldLength(sInput, sCaption, iMinLen, iMaxLen){
	if (iMinLen !=null){
		if (trim(sInput).length < iMinLen){
			throwError(sCaption, ('10020|'+iMinLen.toString()) ); // too short, 10018
			return false;
		}
	}
	if (iMaxLen != null){
		if (trim(sInput).length > iMaxLen){
			throwError(sCaption, ('10021|'+iMaxLen.toString()) ) ; // too long, 10019
			return false;
		}
	}
	return true;
}


function StatcompareDate(startDate, startHour, endDate, endHour)	{
	var start = trim(startDate);
	var end = trim(endDate);
	var str1 = 0;
	var str2 = 1;
	var str3 = 2;
	var limit = 3;
	var separator = "/";
	var arrStart = start.split(separator, limit)
	var arrEnd = end.split(separator, limit)

	// not use parseInt which has bugs in Netscape 3.0
	var startDay = parseFloat(arrStart[str1]);
	var startMonth = parseFloat(arrStart[str2]);
	var startYear = parseFloat(arrStart[str3]);


	var endDay = parseFloat(arrEnd[str1]);
	var endMonth = parseFloat(arrEnd[str2]);
	var endYear = parseFloat(arrEnd[str3]);

	// create date object
	var sDate = new Date(startYear, startMonth-1, startDay, startHour);
	var eDate = new Date(endYear, endMonth-1, endDay, endHour);
	if (eDate < sDate) {
		return false;
	}
	return true;
}

/*
 * Validates Number Size, and test  if it exceed maximum length, or below minium length
 * Parameter: 	sInput - String to be tested
 * 				sCaption - Caption of the Error message
 *				iMinValue - minimum value of string of the integer
 *				iMaxValue - maximum length of string of the integer
 * Returns:   	true (if field is correct) or false (is not correct)
 *
 * NB: throws 10018 or 10019 Error Code
 */
function validateNumberSize(sInput, sCaption, iMinValue, iMaxValue ){
	var bError = false;
	if (iMinValue !=null){
		if (parseFloat(sInput) < parseFloat(iMinValue)){
			throwError(sCaption, ('10018|'+iMinValue.toString()) ); // too small, 10018
			bError = true;
		}
	}
	if (iMaxValue != null){
		if (parseFloat(sInput) > parseFloat(iMaxValue)){
			throwError(sCaption, ('10019|'+iMaxValue.toString()) ) ; // too large, 10019
			bError = true;
		}
	}
	if (bError){
		return false;
	}
	// Cannot be less than -2147485647 | More then 2147485647
	if (sInput != null){
		if (parseFloat(sInput) > parseFloat(2147485646)){
			throwError(sCaption, ('10019|2147485647') ) ; // too large, 10019
			bError = true;
		}
		if (parseFloat(sInput) < parseFloat(-2147485646)){
			throwError(sCaption, ('10018|-2147485647') ); // too small, 10018
			bError = true;
		}
	}
	if (bError){
		return false;
	}
	return true;
}

function validateCompareInteger(sInput_Num1, sInput_Num2, bFirstValueIsLarger, sCaption1, sCaption2, bAllowEqual){
	var bCompareError = false;

	var Value1 = parseInt(sInput_Num1);
	var Value2 = parseInt(sInput_Num2);

	if (bFirstValueIsLarger){

		if (Value1 < Value2){
			throwError(sCaption2, '10026|'+sCaption1); // 1st value is smaller than second value
			bCompareError = true;
		}
	}	else	{
		if (Value1 > Value2){
			throwError(sCaption1, '10026|'+sCaption2); // 1st value is larger than second value
			bCompareError = true;
		}
	}

	if (bAllowEqual){
		if (Value1 == Value2){
			bCompareError = false;
		}
	}

	if (bCompareError){
		return false;
	}
	return true;
}

/*
 * Prohibit the user to check more than one checkbox if other boxes within the same group is checked
 * Parameter: 	sObjArr - array of checkbox object's names
 * 				sObjTarget - checkbox object name for the checking item
 */
function validateCheckbox(sObjArr, sObjTarget) {
    for (i = 0; i < sObjArr.length; i++) {
        checkobj=eval(sObjArr[i]);
        checkobj2=eval(sObjTarget);
        if(sObjArr[i]!=sObjTarget) {
        	checkobj.checked=false;
		}
    }
}

/*
 * Check input Object (String) has maximum n number of decimal places
 * Parameter: 	sObjArr - array of checkbox object's names
 * 				iMaxDecimalNum - 1 or 2 Decimal places
 * 				sCaption - Field Name
 */

function validateDecimalPlace(sInputStr, sCaption, iDecmalPlaces) {
	var bNoError = true;
	if (iDecmalPlaces == 1){
		if(!sInputStr.match(/(^[+-]?\d+\.{0,1}\d{0,1}?$)/) ) {
			bNoError = false;
			throwError(sCaption, '10036');
		}
	}

	if (iDecmalPlaces == 2){
		 if( !sInputStr.match(/(^[+-]?\d+\.{0,1}\d{0,2}?$)/) ) {
			bNoError = false;
			throwError(sCaption, '10037');
		}
	}

	if (iDecmalPlaces == 3){
		 if( !sInputStr.match(/(^[+-]?\d+\.{0,1}\d{0,3}?$)/) ) {
			bNoError = false;
			throwError(sCaption, '10038');
		}
	}

	return bNoError;
}

function checkSubmit(){
	var bVerify = false;
    var f = document.form1;
	if(!checkStringField(f.company_name,'Company Name',0,100,false)){
        alert('Please input Company Name');
		return false;
	}else if(!checkStringField(f.contact_person,'Contact Person',0,100,false)){
        alert('Please input Company Name');
		return false;
	}else if(!checkStringField(f.tel_no,'Tel No.',0,20,false)){
        alert('Please input Tel No.');
		return false;
	}else if(!checkStringField(f.fax_no,'Fax No.',0,20,false)){
        alert('Please input Fax No.');
		return false;
	}else if(!checkStringField(f.email,'Email',0,40,false)){
        alert('Please input Email');
		return false;
	}else if(!checkRadio(f.job_title)){
		alert('Please Select Job Title');
		return false;
	}else if(f.job_title[4].checked && !checkStringField(f.job_title_other,'Job Title',0,100,false)){
        alert('Please specific your Job Title');
		return false;
	}else if(!checkRadio(f.nature_business)){
		alert('Please Select Nature of Business');
		return false;
	}else if(f.nature_business[6].checked && !checkStringField(f.nature_business_other,'Nature of Business',0,100,false)){
        alert('Please specific your Nature of Business');
		return false;
	}else if(!checkRadio(f.product_to_quote)){
		alert('Please Select Product need to quote');
		return false;
	}else if(f.product_to_quote[7].checked && !checkStringField(f.product_to_quote_other,'Product need to quote',0,100,false)){
        alert('Please specific the Product need to quote');
		return false;
	}else{
		return true;
	}
}
function MM_findObj(n, d) { //v4.01
  var p,i,x;  if(!d) d=document; if((p=n.indexOf("?"))>0&&parent.frames.length) {
    d=parent.frames[n.substring(p+1)].document; n=n.substring(0,p);}
  if(!(x=d[n])&&d.all) x=d.all[n]; for (i=0;!x&&i<d.forms.length;i++) x=d.forms[i][n];
  for(i=0;!x&&d.layers&&i<d.layers.length;i++) x=MM_findObj(n,d.layers[i].document);
  if(!x && d.getElementById) x=d.getElementById(n); return x;
}

function MM_showHideLayers() { //v6.0
  var i,p,v,obj,args=MM_showHideLayers.arguments;
  for (i=0; i<(args.length-2); i+=3) if ((obj=MM_findObj(args[i]))!=null) { v=args[i+2];
    if (obj.style) { obj=obj.style; v=(v=='show')?'block':(v=='hide')?'none':v; }
    obj.display =v; }
}

function selectProduct(id){
	var f = document.form1;
	//alert(f.product_to_quote[id].checked);
	MM_showHideLayers('rack_details','','hide');
	MM_showHideLayers('rack_access_details','','hide');
	MM_showHideLayers('console_details','','hide');
	MM_showHideLayers('monitor_wall_details','','hide');
	MM_showHideLayers('details_head','','show');
	if (id == 0){
		MM_showHideLayers('rack_details','','show');
	}else if(id == 1){
		MM_showHideLayers('rack_access_details','','show');
	}else if(id == 2){
		MM_showHideLayers('console_details','','show');
	}else if(id == 3){
		MM_showHideLayers('monitor_wall_details','','show');
	}else if (id ==4){
		MM_showHideLayers('details_head','','hide');
	}
}

function selectRackDepth(id){
	var x;
	for (x = 0 ; x < 3 ; x++){
		document.form1.rack_height[x].disabled = false;
		document.form1.rack_height[x].checked = false;
	}
	for (x = 0 ; x < 3 ; x++){
		document.form1.rack_width[x].disabled = true;
		document.form1.rack_width[x].checked = false;
	}
	for (x = 0 ; x < 3 ; x++){
		document.form1.rack_inner_width[x].disabled = true;
		document.form1.rack_inner_width[x].checked = false;
	}
}

function selectRackHeight(id){
	if (document.form1.rack_depth[0].checked == true){
		//document.form1.rack_height[0].disabled = false;
		//document.form1.rack_height[1].disabled = false;
		//document.form1.rack_height[2].disabled = false;
		document.form1.rack_width[0].disabled = false;
		document.form1.rack_width[1].disabled = true;
		document.form1.rack_width[1].checked = false;
		document.form1.rack_width[2].disabled = false;
		//document.form1.rack_inner_width[1].disabled = true;
	}else{
		document.form1.rack_width[0].disabled = false;
		document.form1.rack_width[1].disabled = false;
		document.form1.rack_width[2].disabled = false;
	}
}

function selectRackWidth(id){
	if (id == 0){
		if (document.form1.rack_depth[0].checked || document.form1.rack_depth[1].checked){
			document.form1.rack_inner_width[0].disabled = false;
			document.form1.rack_inner_width[1].disabled = true;
			document.form1.rack_inner_width[1].checked = false;
			document.form1.rack_inner_width[2].disabled = false;
		}else{
			document.form1.rack_inner_width[0].disabled = false;
			document.form1.rack_inner_width[1].disabled = false;
			document.form1.rack_inner_width[2].disabled = false;
		}
	}else{
		document.form1.rack_inner_width[0].disabled = false;
		document.form1.rack_inner_width[1].disabled = false;
		document.form1.rack_inner_width[2].disabled = false;
	}
}