//common functions 
/*
v1.0 ygfeng 20/12/2004: file created.
v1.1 ygfeng 03/01/2005: fix date validation bug
v1.2 Anne 22/07/2005: To resolve the date validation problem when submitting form.  [T-WEF-2005-07-00001]
v1.3 Evelyn 20/09/2006: To include new function for validation of structured address
v1.4 Herni 15/11/2006 : To include new function for eservice poll pop-up window. [S/WEF/2006/10/002]
v1.5 Raymond 16/02/2006: To enchance isStructuredAdd function to cater parameterised fields
*/

//window popup function
function winOpen(url){
	popup = window.open(url, "Info", "width=610, height=500, toolbar=1,status=1,menubar=1,scrollbars=1,resizable=1,directories=1,location=1");
	}

//the next 3 lines are added by v1.4
function MM_openBrWindow(theURL,winName,features) { 
  window.open(theURL,winName,features);
} 
//end of v.1.4

//highlight field; used when error occured for that field
function setFocusSelect(szFieldName){
	szFieldName.focus();
	szFieldName.select();
	return true;
	}
	
//check to see if field contains valid data;
//used to validate mandatory field.
function isEmptyWhiteSpace(szFieldName){

	var objRegExp = /^\s*$/;
	return objRegExp.test(szFieldName.value);
	}

//check if field is empty
function isEmpty(szFieldName){
	var i;
	var ch; 
	
	if (parseInt(szFieldName.value.length) == 0)
		return true;
	else
		return false;
	}
	
//check if the two fields contain exactly the same data
function isIdentical(szFieldName1,szFieldName2){
   var i;
   var ch1;
   var ch2;

   if (parseInt(szFieldName1.value.length) != parseInt(szFieldName2.value.length))
       return false;
   for (i=0; i<parseInt(szFieldName1.value.length); i++) {
       ch1 = szFieldName1.value.charCodeAt(i);
       ch2 = szFieldName2.value.charCodeAt(i);
       if (ch1 != ch2)
             return false;
	   }
   return true;
   }

//check if radiobutton/checkbox group is selected
function isChecked(szFieldName)
{
	var j;
	var nValue= null;
	var nLen = parseInt(szFieldName.length);
	
	if (isNaN(nLen)) { // -- if there is only 1 radio button --
		if (szFieldName.checked)
			return true;
		else
			return false;
		}
	for (j = 0; j <nLen; j++) {
		if (szFieldName[j].checked) {
			return true;
			}
		}
	return false;
	}
	
//check if field value in a valid CR No. format
function isCRNo(fldNo)
{	
	var objRegExp = /^\d{11}([a-z]|[A-Z])$/;
	return objRegExp.test(fldNo.value);
}

//check if the field contains valid percentage value (0-100.0)
function isPercent(szFieldName) {
  	var objRegExp = /(^\d{1,2}\.\d*$)|(^\d{1,2}$)|(^100\.?$)|(^100\.0$)/;
  	return objRegExp.test(szFieldName.value);
	}

//check if tel or fax number consists of 8-12 digits
function isTelFax(szFieldName){
  	var objRegExp  = /^\d{8,12}$/;
  	return objRegExp.test(szFieldName.value);
	}

// check if fields is structured address - v1.3 start
function isStructuredAdd(ObjForm)
{
	fldAddType=ObjForm.txtCoAddType;
	fldBlock=ObjForm.txtCoBlock;
	fldLevel=ObjForm.txtCoLevel;
	fldUnit=ObjForm.txtCoUnit;
	fldStreet=ObjForm.txtCoStreet;
	fldBuilding=ObjForm.txtCoBuilding;

	if((fldAddType.value == 'S' || fldAddType.value == 'L' || fldAddType.value == 'G') && isEmptyWhiteSpace(fldBlock))
	{
		alert("Please enter Block/House No");
		setFocusSelect(fldBlock);
		return false;
	}
	else if(fldAddType.value == 'S' && isEmptyWhiteSpace(fldLevel) && (!isEmptyWhiteSpace(fldUnit)))
	{
		alert("Please enter Level No");
		setFocusSelect(fldLevel);
		return false;
	}
	else if(fldAddType.value == 'S' && isEmptyWhiteSpace(fldUnit) && (!isEmptyWhiteSpace(fldLevel)))
	{
		alert("Please enter Unit No");
		setFocusSelect(fldUnit);
		return false;
	}
	else if((fldAddType.value == 'P' || fldAddType.value == 'B' || fldAddType.value == 'L' || fldAddType.value == 'G') && isEmptyWhiteSpace(fldUnit))
	{
		alert("Please enter Unit No");
		setFocusSelect(fldUnit);
		return false;
	}
	else if(fldAddType.value == 'G' && (!isGodownUnit(fldUnit)))
	{
		alert("Unit No must begin with 'U' or 'M'");
		setFocusSelect(fldUnit);
		return false;
	}
	else if((fldAddType.value == 'S' || fldAddType.value == 'B' || fldAddType.value == 'G') && isEmptyWhiteSpace(fldStreet))
	{
		alert("Please enter Street Name");
		setFocusSelect(fldStreet);
		return false;
	}
	else if((fldAddType.value == 'P' || fldAddType.value == 'B') && isEmptyWhiteSpace(fldBuilding))
	{
		alert("Please enter Building Name");
		setFocusSelect(fldBuilding);
		return false;
	}
	else
		return true;
}

// check if fields is structured address - v1.5 start
function isStructuredAddress(prmObjForm,prmAddType,prmBlock,prmStreet,prmLevel,prmUnit,prmBuilding)
{
	objForm=document.getElementById(prmObjForm);
	if (prmAddType==''){
		sType='S';
	}
	else{
		sAddType=document.getElementById(prmAddType);
		sType=sAddType.value;
	}
	//fldAddType=ObjForm.txtCoAddType;
	fldBlock=document.getElementById(prmBlock);
	fldStreet=document.getElementById(prmStreet);
	fldLevel=document.getElementById(prmLevel);
	fldUnit=document.getElementById(prmUnit);
	fldBuilding=document.getElementById(prmBuilding);

	if((sType == 'S' || sType == 'L' || sType == 'G') && isEmptyWhiteSpace(fldBlock))
	{
		alert("Please enter Block/House No");
		setFocusSelect(fldBlock);
		return false;
	}
	else if((sType == 'S' || sType == 'B' || sType == 'G') && isEmptyWhiteSpace(fldStreet))
	{
		alert("Please enter Street Name");
		setFocusSelect(fldStreet);
		return false;
	}
	else if(sType == 'S' && isEmptyWhiteSpace(fldLevel) && (!isEmptyWhiteSpace(fldUnit)))
	{
		alert("Please enter Level No");
		setFocusSelect(fldLevel);
		return false;
	}
	else if(sType == 'S' && isEmptyWhiteSpace(fldUnit) && (!isEmptyWhiteSpace(fldLevel)))
	{
		alert("Please enter Unit No");
		setFocusSelect(fldUnit);
		return false;
	}
	else if((sType == 'P' || sType == 'B' || sType == 'L' || sType == 'G') && isEmptyWhiteSpace(fldUnit))
	{
		alert("Please enter Unit No");
		setFocusSelect(fldUnit);
		return false;
	}
	else if(sType == 'G' && (!isGodownUnit(fldUnit)))
	{
		alert("Unit No must begin with 'U' or 'M'");
		setFocusSelect(fldUnit);
		return false;
	}
	else if((sType == 'P' || sType == 'B') && isEmptyWhiteSpace(fldBuilding))
	{
		alert("Please enter Building Name");
		setFocusSelect(fldBuilding);
		return false;
	}
	else
		return true;
}

function isGodownUnit(fldNo)
{	
	//var objRegExp = /^(m|M|u|U)\d{1,4}$/;
	var objRegExp = /^(m|M|u|U)/;
	return objRegExp.test(fldNo.value);
}
// v1.3 end

//check if field contains 6 digit number
function isPostCode(fldNo)
{	
	var objRegExp = /^\d{6}$/;
	return objRegExp.test(fldNo.value);
}

//check if field value is a valid time in format: hh:mm
function isHHMM(fldTime)
{
	var strTime = fldTime.value;
	var TimeToArr = strTime.split(":")
	arrSize = TimeToArr.length
	if (TrimString(strTime).length >5){
		return false;
		}
	if (arrSize != 2){
		return false;
		}
	else if (!ValidTime(TimeToArr[0],TimeToArr[1])){
		return false;
		}
	else
		return true;
}

function ValidTime(hour,minute)
{
	if (!(hour>=0 && hour<=24)){
		return false;
		}
	if (!(minute>=0 && minute<=59)){
		return false;
		}
	return true;
}

//check if field value is a valid date in format: dd/mm/yyyy
function isDDMMYYYY(fldDate)
{
	var strDate = fldDate.value;
	var DateToArr = strDate.split("/")
	arrSize = DateToArr.length
	if (TrimString(strDate).length >10){
		return false;
		}
	if (arrSize != 3)	{ 
		return false;
		}
	else if (!ValidDate(DateToArr[0],DateToArr[1],DateToArr[2])) {
		return false;
		}
	else
		return true;
}   

// -- check if first date is not later than the second date
function isValidPeriod(formObj,formObj1){

		var strtodate_org=new String(formObj1.value)
		var arrtodate = strtodate_org.split("/")

		var strfromdate_org=new String(formObj.value)
		var arrfromdate = strfromdate_org.split("/")

		strtodate=arrtodate[2]+padin(arrtodate[1])+padin(arrtodate[0])

		strfromdate=arrfromdate[2]+padin(arrfromdate[1])+padin(arrfromdate[0])

		if(strtodate<strfromdate)
			return false;
		else
			return true;

}

// get the value of radio button that is being checked
// if not checked, return null
function valChecked(szFieldName){
	var j;
	var nValue= null;
	var nLen = parseInt(szFieldName.length);

	if (isNaN(nLen)) {  // -- if there is only 1 radio button --
		if (szFieldName.checked)
			nValue = szFieldName.value
		}
	for (j = 0; j <nLen; j++) {
		if (szFieldName[j].checked) {
			nValue = szFieldName[j].value;
			break;
			}
		}
	return nValue;
	}

// get the total length of input
function lenTotal(szFieldName){
	return parseInt(szFieldName.value.length);
	}

//Check if dropdown list is selected --
function isSelected(szFieldName){
	if (isEmpty(szFieldName.options[szFieldName.selectedIndex]))
		return false;
	else 
		return true;
	}

//check if the field contains only alphanumeric value including the underscore
function isAlphaNum(szFieldName){
  	var objRegExp  = /^\w+$/;
  	return objRegExp.test(szFieldName.value);
	}

//check if the field contains only numeric value
function isDouble(szFieldName) {
  	var objRegExp = /(^\d+\.\d*$)|(^\d+$)/;
  	return objRegExp.test(szFieldName.value);
	}

//check if the field contains only positive integer value (including 0)
function isInteger(szFieldName){
  	var objRegExp  = /^\d+$/;
  	return objRegExp.test(szFieldName.value);
	}

//check if the field is empty or contains only positive integer value (including 0)
function isIntegerEmpty(szFieldName){
  	var objRegExp  = /^\d*$/;
  	//check for integer characters or empty
  	return objRegExp.test(szFieldName.value);	
	}

//check if a valid email address has been entered
function isEmail(szFieldName) {
    // Create the regular expression
    var reg_exp = /^([\w-]+\.)*[\w-]+@([\w-]+\.)+[a-zA-Z]{2,6}$/
    
	if (isEmpty(szFieldName)) {
		//alert("Please enter a valid email address.");
		//setFocusSelect(szFieldName);
		return false;
		}
		
    if (!(reg_exp.test(szFieldName.value))) {
		//alert("Sorry, your email address format is not acceptable or you may have entered invalid characters.");
        //setFocusSelect(szFieldName);
		return false;
		}
    return true;
	}


//Removes leading and trailing spaces
//field value as parameter
function TrimString( strValue ) {
   //check for leading & trailing spaces
   objRegExp = /^(\s*)([\W\w]*)(\b\s*$)/;
   if(objRegExp.test(strValue)) {
       //remove leading and trailing whitespace characters
       strValue = strValue.replace(objRegExp, '$2');
    }
  return strValue;
}

//set the shortened value as the input field new value
//field name as parameter
function TrimField(szFieldName){
	var szNewStr="";
	if (szFieldName.value == "")
		return;
	if (szFieldName.value.length > 0) {
		szNewStr = TrimString(szFieldName.value);
		szFieldName.value = szNewStr;
		}
	}

/****************** internal functions *****************/
function padin(strval){
	var objRegExp  = /^\d{2}$/;
	return (objRegExp.test(strval)) ? strval: ("0" + strval);
	}

function LeapYear(year) {
    if ((year/4)   != Math.floor(year/4))   return false;
    if ((year/100) != Math.floor(year/100)) return true;
    if ((year/400) != Math.floor(year/400)) return false;
    return true;
	}
	
function IsDD(dd){
	var objRegExp  = /^\d{2}$/;
  	var bolval=objRegExp.test(dd);
	if (bolval){
		if (dd>31||dd<1){
			return false;
		}
	}
	return bolval;
}

function IsMM(mm){
	var objRegExp  = /^\d{2}$/;
  	var bolval=objRegExp.test(mm);
	if (bolval){
		if (mm>12||mm<1){
			return false;
		}
	}
	return bolval;
}

function IsYYYY(year){
	var objRegExp  = /^\d{4}$/;
  	var bolval=objRegExp.test(year);
	if (bolval){
		if (year>2100 || year<1900){
			return false;
		}
	}
	return bolval;
}
/*v1.1 fix date validation bug*/
function ValidDate(day,month,year) {
	
	var daysofmonth    = new Array(0, 31, 28, 31, 30, 31, 30,
										31, 31, 30, 31, 30, 31);
	var daysofmonthLY  = new Array(0, 31, 29, 31, 30, 31, 30,
										31, 31, 30, 31, 30, 31);

	if ((!IsYYYY(year))||(!IsMM(month))||(!IsDD(day))){
		return false;
	}
//	var month=parseInt(month); //dd/mm/yyyy v1.2
	var month=parseInt(month, 10); //dd/mm/yyyy  v1.2
    if (LeapYear(year))
    {  if (day > daysofmonthLY[month])
        return false;
	}
    else
	{  if (day > daysofmonth[month])
		return false;
	}
    return true;
}
