function fieldValid(field)
{
	var rtn = true;
	if (!field) rtn = false; // invalid fields
    /*if (rtn) rtn = 
    		(field.type == 'text' || field.type == 'textarea' ||field.type == 'file' ||
	        field.type == 'select-one' ||field.type == 'radio' ||field.type == 'hidden'|| 
    	    field.type == 'password');
 	alert(rtn);  */  	    
   if (rtn) rtn = rtn && field.type != 'hidden';
   if (rtn) rtn = rtn && field.disabled == false ; // not disabled
//   if (rtn) rtn = rtn && field.value.length > 0 ;// not empty
   return rtn;
}

function validateIntGreater(form) 
{
	var isValid = true;
	var focusField = null;
	var i = 0;
	var fields = new Array();
	oFields = new intGreater();
	for (x in oFields) 
	{
		var field = form[oFields[x][0]];
        if (fieldValid(field)) 		
		{
			var iMin = parseInt(oFields[x][2]("lowThreshold"));
			var iValue = parseInt(field.value);
			if (!(iValue >= iMin)) 
			{
				if (i == 0) 
				{
					focusField = field;
				}
				fields[i++] = oFields[x][1];
				isValid = false;
			}
		}
	}
	if (fields.length > 0) 
	{
		focusField.focus();
		alert(fields.join('\n'));
	}
	return isValid;
}


function validateFloat(form) 
{
	var bValid = true;
	var focusField = null;
	var i = 0;
	var fields = new Array();
	oFloat = new FloatValidations();
	for (x in oFloat) 
	{
		var field = form[oFloat[x][0]];
	    if (fieldValid(field)) 	
		{
			var value = '';
			// get field's value
			if (field.type == "select-one") 
			{
				var si = field.selectedIndex;
				if (si >= 0) 
				{
					value = field.options[si].value;
				}
			} else 
			{
				value = field.value;
			}
			if (value.length > 0) 
			{
				// remove '.' before checking digits
			 	var tempArray = value.split('.');
				var joinedString= tempArray.join('');
				if (!isAllDigits(joinedString)) 
				{
					bValid = false;
					if (i == 0) 
					{
						focusField = field;
					}	
					fields[i++] = oFloat[x][1];
				} 
				else 
				{
					var iValue = parseFloat(value);
					if (isNaN(iValue)) 
					{
						if (i == 0) 
						{
							focusField = field;
						}
						fields[i++] = oFloat[x][1];
						bValid = false;
					}
				}
			}
		}
	}
	if (fields.length > 0) 
	{
		focusField.focus();
		alert(fields.join('\n'));
	}
	return bValid;
}
	

function validateRequired(form) {
    var isValid = true;
    var focusField = null;
    var i = 0;
    var fields = new Array();
    oRequired = new required();
    for (x in oRequired) {
        var field = form[oRequired[x][0]];
        if (fieldValid(field))
		{
            var value = '';
            // get field's value
            if (field.type == "select-one") {
                var si = field.selectedIndex;
                if (si >= 0) {
                    value = field.options[si].value;
                }
            } else {
                value = field.value;
            }

            if (trim(value).length == 0) {

                if (i == 0) {
                    focusField = field;
                }
                fields[i++] = oRequired[x][1];
                isValid = false;
            }
        }
    }
    if (fields.length > 0) {
       focusField.focus();
       alert(fields.join('\n'));
    }
    return isValid;
}

// Trim whitespace from left and right sides of s.
function trim(s) {
    return s.replace( /^\s*/, "" ).replace( /\s*$/, "" );
}

function validateMinLength(form) {
    var isValid = true;
    var focusField = null;
    var i = 0;
    var fields = new Array();
    oMinLength = new minlength();
    for (x in oMinLength) {
        var field = form[oMinLength[x][0]];
		if (fieldValid(field)) 
		{

			// -----------------
			// CF - patch so that numbers starting with 0 are treated as decimal not actal.
			// ------------------              			
            // var iMin = parseInt(oMinLength[x][2]("minlength"));
            var iMin = parseInt(oMinLength[x][2]("minlength"),10);
            if ((trim(field.value).length > 0) && (field.value.length < iMin)) {
                if (i == 0) {
                    focusField = field;
                }
                fields[i++] = oMinLength[x][1];
                isValid = false;
            }
        }
    }
    if (fields.length > 0) {
       focusField.focus();
       alert(fields.join('\n'));
    }
    return isValid;
}

function validateMaxLength(form) {
    var isValid = true;
    var focusField = null;
    var i = 0;
    var fields = new Array();
    oMaxLength = new maxlength();
    for (x in oMaxLength) {
        var field = form[oMaxLength[x][0]];
		if (fieldValid(field)) 
		{

			// -----------------
			// CF - patch so that numbers starting with 0 are treated as decimal not actal.
			// ------------------              			
            // var iMax = parseInt(oMaxLength[x][2]("maxlength"));
            var iMax = parseInt(oMaxLength[x][2]("maxlength"),10);
            if (field.value.length > iMax) {
                if (i == 0) {
                    focusField = field;
                }
                fields[i++] = oMaxLength[x][1];
                isValid = false;
            }
        }
    }
    if (fields.length > 0) {
       focusField.focus();
       alert(fields.join('\n'));
    }
    return isValid;
}

function validateMask(form) {
    var isValid = true;
    var focusField = null;
    var i = 0;
    var fields = new Array();
    oMasked = new mask();
    for (x in oMasked) {
        var field = form[oMasked[x][0]];
		if (fieldValid(field)) 
		{

            if (!matchPattern(field.value, oMasked[x][2]("mask"))) {
                if (i == 0) {
                    focusField = field;
                }
                fields[i++] = oMasked[x][1];
                isValid = false;
            }
        }
    }

    if (fields.length > 0) {
       focusField.focus();
       alert(fields.join('\n'));
    }
    return isValid;
}

function matchPattern(value, mask) {
   return mask.exec(value);
}

function validateInteger(form) {
    var bValid = true;
    var focusField = null;
    var i = 0;
    var fields = new Array();
    oInteger = new IntegerValidations();
    for (x in oInteger) {
        var field = form[oInteger[x][0]];
		if (fieldValid(field)) 
		{

            var value = '';
            // get field's value
            if (field.type == "select-one") {
                var si = field.selectedIndex;
                if (si >= 0) {
                    value = field.options[si].value;
                }
            } else {
                value = field.value;
            }

            if (value.length > 0) {

                if (!isAllDigits(value)) {
                    bValid = false;
                    if (i == 0) {
                        focusField = field;
                    }
                    fields[i++] = oInteger[x][1];

                } else {
                	// -----------------
					// CF - patch so that numbers starting with 0 are treated as decimal not actal.
					// ------------------              	
                    // var iValue = parseInt(value,10);
                    var iValue = parseInt(value,10);
                    if (isNaN(iValue) || !(iValue >= -2147483648 && iValue <= 2147483647)) {
                        if (i == 0) {
                            focusField = field;
                        }
                        fields[i++] = oInteger[x][1];
                        bValid = false;
                   }
               }
           }
        }
    }
    if (fields.length > 0) {
       focusField.focus();
       alert(fields.join('\n'));
    }
    return bValid;
}

function isAllDigits(argvalue) {
    argvalue = argvalue.toString();
    var validChars = "0123456789";
    var startFrom = 0;
    if (argvalue.substring(0, 2) == "0x") {
       validChars = "0123456789abcdefABCDEF";
       startFrom = 2;
  // -----------------
  // CF - patch so that numbers starting with 0 are treated as decimal not actal.
  // ------------------
  //  } else if (argvalue.charAt(0) == "0") {
  //     validChars = "01234567";
  //     startFrom = 1;
    } else if (argvalue.charAt(0) == "-") {
        startFrom = 1;
    }

    for (var n = startFrom; n < argvalue.length; n++) {
        if (validChars.indexOf(argvalue.substring(n, n+1)) == -1) return false;
    }
    return true;
}

function validateDate(form) {
   var bValid = true;
   var focusField = null;
   var i = 0;
   var fields = new Array();
   oDate = new DateValidations();
   for (x in oDate) {
   	   var field = form[oDate[x][0]];
	   if (fieldValid(field))    	   
       var value = field.value;
       var datePattern = oDate[x][2]("datePatternStrict");
       if ((form[oDate[x][0]].type == 'text' ||
            form[oDate[x][0]].type == 'textarea') &&
           (value.length > 0) &&
           (datePattern.length > 0)) {
         var MONTH = "MM";
         var DAY = "dd";
         var YEAR = "yyyy";
         var orderMonth = datePattern.indexOf(MONTH);
         var orderDay = datePattern.indexOf(DAY);
         var orderYear = datePattern.indexOf(YEAR);
         if ((orderDay < orderYear && orderDay > orderMonth)) {
             var iDelim1 = orderMonth + MONTH.length;
             var iDelim2 = orderDay + DAY.length;
             var delim1 = datePattern.substring(iDelim1, iDelim1 + 1);
             var delim2 = datePattern.substring(iDelim2, iDelim2 + 1);
             if (iDelim1 == orderDay && iDelim2 == orderYear) {
                dateRegexp = new RegExp("^(\\d{2})(\\d{2})(\\d{4})$");
             } else if (iDelim1 == orderDay) {
                dateRegexp = new RegExp("^(\\d{2})(\\d{2})[" + delim2 + "](\\d{4})$");
             } else if (iDelim2 == orderYear) {
                dateRegexp = new RegExp("^(\\d{2})[" + delim1 + "](\\d{2})(\\d{4})$");
             } else {
                dateRegexp = new RegExp("^(\\d{2})[" + delim1 + "](\\d{2})[" + delim2 + "](\\d{4})$");
             }
             var matched = dateRegexp.exec(value);
             if(matched != null) {
                if (!isValidDate(matched[2], matched[1], matched[3])) {
                   if (i == 0) {
                       focusField = form[oDate[x][0]];
                   }
                   fields[i++] = oDate[x][1];
                   bValid =  false;
                }
             } else {
                if (i == 0) {
                    focusField = form[oDate[x][0]];
                }
                fields[i++] = oDate[x][1];
                bValid =  false;
             }
         } else if ((orderMonth < orderYear && orderMonth > orderDay)) {
             var iDelim1 = orderDay + DAY.length;
             var iDelim2 = orderMonth + MONTH.length;
             var delim1 = datePattern.substring(iDelim1, iDelim1 + 1);
             var delim2 = datePattern.substring(iDelim2, iDelim2 + 1);
             if (iDelim1 == orderMonth && iDelim2 == orderYear) {
                 dateRegexp = new RegExp("^(\\d{2})(\\d{2})(\\d{4})$");
             } else if (iDelim1 == orderMonth) {
                 dateRegexp = new RegExp("^(\\d{2})(\\d{2})[" + delim2 + "](\\d{4})$");
             } else if (iDelim2 == orderYear) {
                 dateRegexp = new RegExp("^(\\d{2})[" + delim1 + "](\\d{2})(\\d{4})$");
             } else {
                 dateRegexp = new RegExp("^(\\d{2})[" + delim1 + "](\\d{2})[" + delim2 + "](\\d{4})$");
             }
             var matched = dateRegexp.exec(value);
             if(matched != null) {
                 if (!isValidDate(matched[1], matched[2], matched[3])) {
                     if (i == 0) {
                         focusField = form[oDate[x][0]];
                     }
                     fields[i++] = oDate[x][1];
                     bValid =  false;
                  }
             } else {
                 if (i == 0) {
                     focusField = form[oDate[x][0]];
                 }
                 fields[i++] = oDate[x][1];
                 bValid =  false;
             }
         } else if ((orderMonth > orderYear && orderMonth < orderDay)) {
             var iDelim1 = orderYear + YEAR.length;
             var iDelim2 = orderMonth + MONTH.length;
             var delim1 = datePattern.substring(iDelim1, iDelim1 + 1);
             var delim2 = datePattern.substring(iDelim2, iDelim2 + 1);
             if (iDelim1 == orderMonth && iDelim2 == orderDay) {
                 dateRegexp = new RegExp("^(\\d{4})(\\d{2})(\\d{2})$");
             } else if (iDelim1 == orderMonth) {
                 dateRegexp = new RegExp("^(\\d{4})(\\d{2})[" + delim2 + "](\\d{2})$");
             } else if (iDelim2 == orderDay) {
                 dateRegexp = new RegExp("^(\\d{4})[" + delim1 + "](\\d{2})(\\d{2})$");
             } else {
                 dateRegexp = new RegExp("^(\\d{4})[" + delim1 + "](\\d{2})[" + delim2 + "](\\d{2})$");
             }
             var matched = dateRegexp.exec(value);
             if(matched != null) {
                 if (!isValidDate(matched[3], matched[2], matched[1])) {
                     if (i == 0) {
                         focusField = form[oDate[x][0]];
                      }
                      fields[i++] = oDate[x][1];
                      bValid =  false;
                  }
              } else {
                  if (i == 0) {
                      focusField = form[oDate[x][0]];
                  }
                  fields[i++] = oDate[x][1];
                  bValid =  false;
              }
         } else {
             if (i == 0) {
                 focusField = form[oDate[x][0]];
             }
             fields[i++] = oDate[x][1];
             bValid =  false;
         }
      }
   }
   if (fields.length > 0) {
      focusField.focus();
      alert(fields.join('\n'));
   }
   return bValid;
}

function isValidDate(day, month, year) {
if (month < 1 || month > 12) {
        return false;
    }
    if (day < 1 || day > 31) {
        return false;
    }
    if ((month == 4 || month == 6 || month == 9 || month == 11) &&
        (day == 31)) {
        return false;
    }
    if (month == 2) {
        var leap = (year % 4 == 0 &&
                   (year % 100 != 0 || year % 400 == 0));
        if (day>29 || (day == 29 && !leap)) {
            return false;
        }
    }
    return true;
}

function validateIntRange(form) {
    var isValid = true;
    var focusField = null;
    var i = 0;
    var fields = new Array();
    oRange = new intRange();
    for (x in oRange) {
        var field = form[oRange[x][0]];
		if (fieldValid(field)) 
		{

        	// -----------------
			// CF - patch so that numbers starting with 0 are treated as decimal not actal.
			// ------------------              	
            // var iMin = parseInt(oRange[x][2]("min"));
            // var iMax = parseInt(oRange[x][2]("max"));
            // var iValue = parseInt(field.value);
            var iMin = parseInt(oRange[x][2]("min"),10);
            var iMax = parseInt(oRange[x][2]("max"),10);
            var iValue = parseInt(field.value,10);
            if (!(iValue >= iMin && iValue <= iMax)) {
                if (i == 0) {
                    focusField = field;
                }
                fields[i++] = oRange[x][1];
                isValid = false;
            }
        }
    }
    if (fields.length > 0) {
        focusField.focus();
        alert(fields.join('\n'));
    }
    return isValid;
}

function validateEmail(form) {
    var bValid = true;
    var focusField = null;
    var i = 0;
    var fields = new Array();
    oEmail = new email();
    for (x in oEmail) {
    	var field = form[oEmail[x][0]];
    	if (fieldValid(field)) 
		{
            if (!checkEmail(field.value)) {
                if (i == 0) {
                    focusField = field;
                }
                fields[i++] = oEmail[x][1];
                bValid = false;
            }
        }
    }
    if (fields.length > 0) {
        focusField.focus();
        alert(fields.join('\n'));
    }
    return bValid;
}

/**
 * Reference: Sandeep V. Tamhankar (stamhankar@hotmail.com),
 * http://javascript.internet.com
 */
function checkEmail(emailStr) {
   if (emailStr.length == 0) {
       return true;
   }
   var emailPat=/^(.+)@(.+)$/;
   var specialChars="\\(\\)<>@,;:\\\\\\\"\\.\\[\\]";
   var validChars="\[^\\s" + specialChars + "\]";
   var quotedUser="(\"[^\"]*\")";
   var ipDomainPat=/^(\d{1,3})[.](\d{1,3})[.](\d{1,3})[.](\d{1,3})$/;
   var atom=validChars + '+';
   var word="(" + atom + "|" + quotedUser + ")";
   var userPat=new RegExp("^" + word + "(\\." + word + ")*$");
   var domainPat=new RegExp("^" + atom + "(\\." + atom + ")*$");
   var matchArray=emailStr.match(emailPat);
   if (matchArray == null) {
       return false;
   }
   var user=matchArray[1];
   var domain=matchArray[2];
   if (user.match(userPat) == null) {
       return false;
   }
   var IPArray = domain.match(ipDomainPat);
   if (IPArray != null) {
       for (var i = 1; i <= 4; i++) {
          if (IPArray[i] > 255) {
             return false;
          }
       }
       return true;
   }
   var domainArray=domain.match(domainPat);
   if (domainArray == null) {
       return false;
   }
   var atomPat=new RegExp(atom,"g");
   var domArr=domain.match(atomPat);
   var len=domArr.length;
   if ((domArr[domArr.length-1].length < 2) ||
       (domArr[domArr.length-1].length > 3)) {
       return false;
   }
   if (len < 2) {
       return false;
   }
   return true;
}

function DateDiff(date1,date2) {

    tempDate1 = new Date(date1.substring(3,6)+date1.substring(0,3)+date1.substring(6,10));
    tempDate2 = new Date(date2.substring(3,6)+date2.substring(0,3)+date2.substring(6,10));

    var difference = 
	Date.UTC(tempDate1.getYear(),tempDate1.getMonth(),tempDate1.getDate(),0,0,0)
      - Date.UTC(tempDate2.getYear(),tempDate2.getMonth(),tempDate2.getDate(),0,0,0);
    return difference/1000/60/60/24;
}	  

function TimeInMinutes(time){
		returnTime = time.substr(0, 2) * 60;
		// -----------------
		// CF - patch so that numbers starting with 0 are treated as decimal not actal.
		// ------------------              			
		// returnTime = parseInt(returnTime) + parseInt(time.substr(3, 4));        		
		returnTime = parseInt(returnTime,10) + parseInt(time.substr(3, 4),10);        		
		return returnTime;
       	    }
