// ====================================================================
// Module : form_valid.js
// Description : Common JavaScript Validation
// Amendment History:
// 2001/08/14  Ivy Ng        Creation
// ====================================================================

/*===========================================================================

  Error Handling Function
  
  Parameter(s) obj      : String -> object name
               err_msg  : String -> Error Message which will be display on Alert

  return false;               
  ===========================================================================
*/
function onErrorAlert(obj, err_msg) {
    var obj_type ="";
    if (obj.options)
        obj_type ="select";
    else if (obj.length)
        obj_type = obj[0].type;
    else obj_type = obj.type;

    alert(err_msg);

    if (obj_type != "radio") {
        obj.focus();
        if (obj_type != "select")
            obj.select();
    } return false;
}

/*=========================================================================== 

   Checking object has value or not
 
   Parameter(s) obj      :  String -> object name
                obj_type :  String -> object type 
                
   return true or false             
  ===========================================================================
*/
function isEmpty(obj, obj_type) {
    //Text Box
    if (obj_type == "TEXT" || obj_type == "PASSWORD") {
        if (obj.value.length == 0) 
            return true;
        else return false;
    }

    //Radio button or checkbox
    if (obj_type == "RADIO" || obj_type == "CHECKBOX") {
        if (obj.length) {
	    for (i=0; i < obj.length; i++) {
	        if (obj[i].checked)
                    return false;
            }
        } else {
            if (obj.checked) return false;
	}
        return true;	
    }   
    
    //Select List
    if (obj_type == "SELECT") {
        if (obj.options[obj.selectedIndex].value=="")
            return false;
/*
        if (obj.length) {
	    for (i=0; i < obj.length; i++) {
                if (obj.options[i].selected)
                    return false;
            }
        } else {
            if (obj.selected)
                return false;
        }
*/        
        return true;	
    }
}	

// this function returns TRUE if a string contains only alphabets in upper/lower cases
function isalpha(s) {
    var tmp;
    for (var i=0; i<s.length; i++) {
        tmp = s.charAt(i);
        if ((tmp < "a" || tmp > "z") && (tmp < "A" || tmp > "Z"))
            return false;
    } return true;
}

// this function returns TRUE if a string contains only alphabets in upper/lower cases or numeric
function isAlphaOrDigit(s) {
    var tmp;
    for (var i=0; i<s.length; i++) {
        tmp = s.charAt(i);
        if ((tmp < "a" || tmp > "z") && (tmp < "A" || tmp > "Z") && (tmp < "0" || tmp > "9"))
            return false;
    } return true;
}

/* ===========================================================================
   Email Checking

   Parameter(s) inputVal  :  String -> email string
                
   return true or false             
   ===========================================================================
*/
// this function return TRUE if represents a valid inputVal format
function isEmail(inputVal) {
    // valid format "a@b.cd"
    invalidChars = " /;,:{}[]|*%$#!()`<>?";
    if (inputVal == "")
        return false;

    for (i=0; i< invalidChars.length; i++){
        if (inputVal.indexOf(invalidChars.charAt(i),0) > -1)
            return false;
    }
    // there must be one "@" symbol
    atPos = inputVal.indexOf("@",1)
    if (atPos == -1)
        return false;
    // and only one "@" symbol
    if (inputVal.indexOf("@", atPos+1) != -1){
        return false;
    }
	
    // and at least one "." after the "@"
    periodPos = inputVal.indexOf(".",atPos)
    if(periodPos == -1)
        return false;

    // and at least one character between "@" and "."
    if ( atPos +2 > periodPos)
        return false;
        
    if ( periodPos +3 > inputVal.length)
        return false;
        
    return true;
}

/*
  ===========================================================================
  Integer Checking

  Parameter(s) inputVal  :  Integer 
                
  return true or false             
  ===========================================================================
*/ 
function isInteger(inputVal) {
    var checkVal;
    checkVal = new String(inputVal);
    if (isNaN(inputVal) || checkVal.indexOf('.') > -1)
        return false;
    else return true;
}	

function isPosInteger(inputVal) {
    var checkVal;
    checkVal = new String(inputVal);
    if ((isInteger(inputVal)) && parseFloat(inputVal) >= 0)
        return true;
    else return false;
}	

function isDigitOnly(inputVal) {
    if (!isInteger(inputVal) || inputVal.length==0)
        return false;
    else {
        for (i=0; i<inputVal.length; i++) {
            if (inputVal.charAt(i) == "+" || inputVal.charAt(i) == "-")
                return false;
        }
        return true;
    }     
}

/* 
   ===========================================================================
   Number Checking

   Parameter(s) inputVal : Numeric 
                
   return true or false             
   ===========================================================================
*/
function isNumber(inputVal) {
    if (isNaN(inputVal))
        return false;
    else return true;
}	

/* ===========================================================================
   Integer Range Checking

   Parameter(s) inputVal  : Integer
                min_value : Integer -> if value == null value will set to 0
                max_value : Integer -> if value == null will not check
                
   return true or false             
   ===========================================================================
*/
function isIntegerInRange(inputVal, min_value, max_value) {  
    if (min_value == null)
        min_value = 0;

    if (isInteger(inputVal) && isInteger(min_value) && inputVal >= min_value) {
        if (max_value != null) { 
            if (isInteger(max_value) && inputVal <= max_value)
                return true;
            else return false;
        } else return true;
    } else return false;    
}


function isNumberInRange(inputVal, min_value, max_value) {  
    if (min_value == null)
        min_value = 0;

    if (isNumber(inputVal) && isNumber(min_value) && inputVal > min_value) {
        if (max_value != null) { 
            if (isNumber(max_value) && inputVal <= max_value)
                return true;
            else return false;
        } else return true;
    } else return false;    
}

/*=========================================================================== 
  String Length Checking

  Parameter(s) inputVal  : String
               min_value : Integer -> if value == null value will set to 0
               max_value : Integer -> if value == null will not check
               
  return true or false             
  ===========================================================================
*/
function isValidStringLength(inputVal, min_value, max_value) {
    if (min_value == null)
        min_value = 1;
    if (!isInteger(min_value) || inputVal.length < min_value)
        return false;
    else {  
        if (max_value != null) {
            if (inputVal.length > max_value || !isInteger(max_value))
                return false;
            else return true;    
        } else return true;
    }    
}

/* ===========================================================================
   Date Checking

   Parameter(s) inyyyy : String
   		inmm   : String
   		indd   : String
                
   return true or false             
   ===========================================================================
*/
function isDate(inyyyy, inmm, indd) {
    var InputDate;

    InputDate = new Date(inyyyy,inmm-1,indd);

    if (parseFloat(InputDate.getDate()) >= parseFloat(indd)) { 
        if ((parseFloat(indd) <= 0) || (parseFloat(inmm) <= 0) || (parseFloat(inmm) > 12) || (parseFloat(inyyyy) <= 0))
       	    return false;
        else return true;
    } else return false;
}



/* ===========================================================================
   Date Validation

   Parameter(s) inputVal     : DateTime
   		split_code   : Char    -> Split Code "-" or "/" is value == null then value will set to "/"
   		date_format  : Integer -> Range 1 to 5 if value == null then value will set to 1
                
   return true or false             
   ===========================================================================
*/
function isValidDate(inputVal, split_code, date_format) {
    if (split_code == null || split_code.length == 0)      
        split_code = "/";
    if (date_format != 5) {
        if (inputVal.length != 10)    
            return false;
        a_date = inputVal.split(split_code);    
        if (a_date.length != 3)
            return false;
        if (date_format == null || date_format.length == 0)
            date_format = 1;
        if (date_format == 1) {   //Format : YYYY-MM-DD or YYYY/MM/DD (Default)
            if (isDate(a_date[0],a_date[1],a_date[2])) 	
                return true;
            else return false;    
        }
        if (date_format == 2) {  //Format : DD-MM-YYYY or DD/MM/YYYY
            if (isDate(a_date[2],a_date[1],a_date[0])) 	
                return true;
            else return false;    
        } return false;
    } else {       
        //if (date_format == 5)    //Time -> HH:MM      
        return isValidTime(inputVal)
    }     
}

/* ===========================================================================
   get Current Date Time

   Parameter(s) date_format : Integer -> Range 1 to 5 if value == null then value will set to 1
   		split_code  : Char    -> Split Code "-" or "/" is value == null then value will set to "/"
   		
                
   return date
   ===========================================================================
*/
function getCurrentDate(date_format, split_code) {
    var CurrentDate;
  
    if (split_code == null)
        split_code = "/";
    if (date_format == null)
        date_format = 1;   
    var d = new Date();
    var year = d.getFullYear();

    var month = String(parseFloat(d.getMonth()+1));
    if (month.length == 1)
        month = "0"+month;
    var day = String(d.getDate());
    if (day.length == 1) 
        day = "0"+day;
    var hr =  String(d.getHours());
    if (hr.length == 1)    
        hr = "0"+hr;
    var min = String(d.getMinutes());
    if (min.length == 1)    
        min = "0"+min;
    if (date_format == 1) //YYYY-MM-DD or YYYY/MM/DD
        return year+split_code+month+split_code+day;
    if (date_format == 2) //DD-MM-YYYY or DD/MM/YYYY
        return day+split_code+month+split_code+year;
    if (date_format == 3) //YYYY-MM-DD HH:MM or YYYY/MM/DD HH:MM 
        return year+split_code+month+split_code+day+' '+hr+':'+min;
    if (date_format == 4) //DD-MM-YYYY HH:MM or DD/MM/YYYY HH:MM
        return day+split_code+month+split_code+year+' '+hr+':'+min;
    if (date_format == 5) //HH:MM
        return hr+':'+min;
}

/*
  ===========================================================================
  Function to Date Compare 
  
  Parameter(s) : inputVal1    : DateTime -> Compare Date 1
  	         inputVal2    : DateTime -> Compare Date 2 if value == null then get NOW to compare
  	         compare_code : Char     -> Compare Symbol e.g >, >= ,==, <, <=
  	         date_format  : int      -> Range 1 to 5 if value == null then value will set to 1
  	         split_code   : Char     -> Split Code "-" or "/" is value == null then value will set to "/"
  
  Return value : true or false  	         
  ===========================================================================  	      
*/
function isValidDateCompare (inputVal1, inputVal2, compare_code, date_format, split_code)
{
 if (!isValidDate(inputVal1, split_code, date_format))
      return false;
 else
    {
     if (inputVal2 == null || inputVal2.length==0)	     
         inputVal2 = getCurrentDate(date_format, split_code) //set date to now
     if (!isValidDate(inputVal2, split_code, date_format))
         return false;
     else
        {
         condition = eval("'"+inputVal1+"'"+compare_code+"'"+inputVal2+"'")
         if (condition) 
             return true;
         else
             return false;    
         }
    }     
}

/* 
  ===========================================================================
  Time Checking 
  
  Parameter(s) : inputVal    : DateTime 
  
  Return value : true or false  	         
  ===========================================================================
*/
function isValidTime(inputVal) { 
    if (inputVal.length != 5 || inputVal.indexOf(":") == -1)
        return false;
    a_time = inputVal.split(":")
    if (!isInteger(a_time[0]) || !isInteger(a_time[1]) || 
         a_time[0] < 0 || a_time[0] > 24 || a_time[1] < 0 || a_time[1] > 59 ||
        (a_time[0] == 24 && a_time[1] > 0 ))   
          return false;
    else return true;
}

/*
  ===========================================================================
  Card Checking

  Parameter(s) : cardno1 : Integer
   		 cardno2 : Integer
    		 cardno3 : Integer
                 cardno4 : Integer
                 
  Return value : true or false  	         
  ===========================================================================
*/
function isValidCard(cardno1, cardno2, cardno3, cardno4) {
      if (!isDigitOnly(cardno1) || !isDigitOnly(cardno2) || !isDigitOnly(cardno3) || !isDigitOnly(cardno4))
          return false;
      else {
         if (!isValidStringLength(cardno1,4) || !isValidStringLength(cardno2,4) || !isValidStringLength(cardno3,4) || !isValidStringLength(cardno4,4))
             return false;
         else return true;    
      }    
}

/*
  ===========================================================================
  setAllCheckBox

  Parameter(s) : obj : Checkbox control
		   		 value : boolean
                 
  ===========================================================================
*/
function setAllCheckBox(obj, value) {
	if (obj.length) {
		for (i=0; i < obj.length; i++)
{
			obj[i].checked = value;
		}
	} else {
		obj.checked = value;
	}
}


 function check(form)
  {
   for (var i=0;i<form.elements.length;i++){
     var e = form.elements[i];
    if (e.type.toLowerCase() =='button'||e.type.toLowerCase()=='submit'||e.type.toLowerCase()=='reset')
        e.disabled=true;
    }

   return true;
  }
  