function validateAnyField(oFld) {
  if(!isFormField(oFld)) return showError('Unknown field \''+oFld.toString() + '\'.  Contact the webmaster.');
  return true;
}

function validateSelectField(oFld, sFieldName, bAllowFirst, bRequired) {
  if(!validateAnyField(oFld)) return false;
	if(!bAllowFirst && oFld.selectedIndex==0) return fieldError(oFld,sFieldName + ' is required.');
  if(bRequired) {
	  if(oFld.selectedIndex == -1) return fieldError(oFld,sFieldName + ' is required.');
		if(oFld.options[oFld.selectedIndex].value=='' && oFld.options[oFld.selectedIndex].text=='') return fieldError(oFld,sFieldName + ' is required.');
	}
  return true;	
}

function validateTextField(oFld, sFieldName, bRequired, nMaxLength) {
  var v, l;
  if(!validateAnyField(oFld)) return false;
  if(sFieldName==undefined) sFieldName = oFld.name;
  if(bRequired==undefined)  bRequired  = false;
  if(nMaxLength==undefined) nMaxLength = oFld.value.length;
  v = oFld.value; l = v.length;
  if(l==0 && bRequired) return fieldError(oFld, sFieldName + ' cannot be blank.');
  if(l>nMaxLength) return fieldError(oFld, sFieldName + ' is too long.  It must be ' + nMaxLength.toString() + ' characters long or less.');
  return true;
}

function validateNumField(oFld, sFieldName, bRequired, nMinValue, nMaxValue) {
  if(!validateAnyField(oFld)) return false;
  if(sFieldName==undefined) sFieldName = oFld.name;
  if(bRequired==undefined)  bRequired  = false;
  if(!validateTextField(oFld,sFieldName,bRequired)) return false;
  if(oFld.value.length>0 && isNaN(oFld.value)) return fieldError(oFld, sFieldName + ' must be a number.');
  if(nMinValue != undefined && oFld.value.length>0 && parseFloat(oFld.value)<nMinValue) return fieldError(oFld, sFieldName + ' must be ' + nMinValue + ' or more.');
  if(nMaxValue != undefined && oFld.value.length>0 && parseFloat(oFld.value)>nMaxValue) return fieldError(oFld, sFieldName + ' must be ' + nMaxValue + ' or less.');
  return true;
}

function validateCurrencyField(oFld, sFieldName, bRequired, nMinValue, nMaxValue) {
  if(!validateAnyField(oFld)) return false;
  if(oFld.value.length>0) {
  	var rgx = /\$|\,/g;
	  oFld.value = oFld.value.replace(rgx,'');
	}
	if(!validateNumField(oFld,sFieldName,bRequired,nMinValue,nMaxValue)) return false;	
	return true;
}

function validateDateField(oFld, sFieldName, bRequired, dMinValue, dMaxValue, bFixFormat) {
  var v, y, dFld, nMin, dMax;

  if(!validateAnyField(oFld)) return false;
  if(sFieldName==undefined) sFieldName = oFld.name;
  if(bRequired==undefined)  bRequired  = false;
  if(bFixFormat==undefined) bFixFormat = true;
  if(!validateTextField(oFld,sFieldName, bRequired)) return false;
  
  v = oFld.value;
  dFld = new Date(v);
  y = dFld.getFullYear();

  if(!isNaN(dFld) && dFld.getYear()<100 && y>1899 && y<2000) dFld.setFullYear(y+=100);
  if(v.length>0 && isNaN(dFld))  return fieldError(oFld, sFieldName + ' is not a valid date.');
  if(bFixFormat && !isNaN(dFld)) oFld.value = (dFld.getMonth()+1) + '/' + dFld.getDate() + '/' + y;
	if(dMinValue!=undefined) {
    dMin = new Date(dMinValue);
    if(!isNaN(dFld) && !isNaN(dMin) && dFld<dMin) return fieldError(oFld, sFieldName + ' must be on or before ' + dMinValue);
	}
	if(dMaxValue!=undefined) {
    dMax = new Date(dMaxValue);
    if(!isNaN(dFld) && !isNaN(dMax) && dFld<dMax) return fieldError(oFld, sFieldName + ' must be on or before ' + dMinValue);
	}

  return true;

}

function validateTimeField(oFld, sFieldName, bRequired, dMinValue, dMaxValue, bFixFormat) {
  var v, h, m, a, nMin, nMax, rgx = /^(1[012]|0?[1-9])(:([0-5][0-9])(:([0-5][0-9]))?)?[ ]?([AaPp][Mm]?)$|^([01]?[0-9]|2[0123])(:([0-5][0-9])(:([0-5][0-9]))?)?$/, res;

  if(!validateAnyField(oFld)) return false;
  if(sFieldName==undefined) sFieldName = oFld.name;
  if(bRequired==undefined) bRequired = false;
  if(bFixFormat==undefined) bFixFormat = true;
  if(!validateTextField(oFld,sFieldName,bRequired)) return false;

  v = oFld.value;
  res = rgx.exec(v);
  
  if(res==null)
  {
    return fieldError(oFld,sFieldName + ' is not a valid time.');
  }
  else
  {
    if(bFixFormat) 
    {
      if(res[1]=='')
      {
        h = parseInt(res[7]);
        m = res[9]; if(m=='') m = 0; m = parseInt(m);
        a = ((h<12)?'a' : 'p')+'m';
        h = ((h<12)?h:(h-12));if(h==0) h=12;
      }
      else
      {
        h = parseInt(res[1]);
        m = res[3]; if(m=='') m=0; m = parseInt(m);
        a = res[6].toLowerCase();if(a.length==1) a=a+'m';
      }
      oFld.value = (h.toString()+':'+((m<10)?'0':'')+m.toString()+' '+a.toUpperCase());
    }
    return true;
  }
}

function validateZIPCodeField(theField,fieldName,isRequired) {
  // Check the basics
  if(!validateTextField(theField,fieldName,isRequired,10)) return false;
  // Check the format
  var v, rgx = /^([0-9]{5})([-][0-9]{4})?$/;
  var v = theField.value;
  if(!rgx.test(v)) return fieldError(theField,fieldName + ' is not a valid ZIP Code');
  return true;
}


function showError(sMessage) {
  window.alert(sMessage);
  return false;
}

function fieldError(oFld, sMessage) {
  oFld.focus();
  if(oFld.type=='text' || oFld.type=='textarea')
    oFld.select();
  return showError(sMessage);
}

function isFormField(oFld) {
  return (oFld!=undefined && typeof(oFld)=='object')

}
