// validate.js v 1.98
// a generic form validator 
// (cc) Brian Lalonde http://webcoder.info/downloads/validate.html
// License: http://creativecommons.org/licenses/by-sa/2.0/

function formFocus(frm)
{ // convenient way to start the form onLoad
  if(!document.forms.length) return;
  var els= ( frm || document.forms[0] ).elements;
  for(var i= 0; i < els.length; i++)
    if(els[i].type != 'hidden') { els[i].focus(); return; }
}

function formChanged(frm)
{ // determine whether any form fields have changed
  if(!document.forms.length) return;
  var els= ( frm || document.forms[0] ).elements;
  for(var i= 0; i < els.length; i++)
    switch(els[i].type)
    {
      case 'text': 
      case 'textarea': 
      case 'password': 
      case 'hidden':
      case 'file':
        if(els[i].defaultValue!=els[i].value)
        { status= 'The '+fieldname(els[i])+' field has changed.'; return true; } 
        break;
      case 'checkbox':
        if(els[i].defaultChecked!=els[i].checked)
        { status= 'The '+fieldname(els[i])+' checkbox has changed.'; return true; }
        break;
      case 'select-one':
        for(var j= 1; j < els[i].options.length; j++)
          if(els[i].options[j].defaultSelected!=els[i].options[j].selected)
          { status= 'The '+fieldname(els[i])+' selection has changed.'; return true; }
        break;
      case 'select-multiple':
        for(var j= 0; j < els[i].options.length; j++)
          if(els[i].options[j].defaultSelected!=els[i].options[j].selected)
          { status= 'The '+fieldname(els[i])+' selections have changed.'; return true; }
        break;
      case 'radio':
        if(els[i].length)
          for(var j= 0; j < els[i].length; j++)
            if(els[i][j].defaultChecked!=els[i][j].checked)
            { status= 'The '+fieldname(els[i])+' choice has changed.'; return true; }
        break;
    }
  return false;
}

function fieldname(fld)
{ // get the field label text or name
  if(fld.id && document.getElementsByTagName)
  {
    for(var i= 0, lbl= document.getElementsByTagName('LABEL'); i < lbl.length; i++)
      if(lbl[i].htmlFor==fld.id) return lbl[i].nodeValue||lbl[i].textContent||lbl[i].innerText;
    for(var i= 0, lbl= document.getElementsByTagName('label'); i < lbl.length; i++)
      if(lbl[i].htmlFor==fld.id) return lbl[i].nodeValue||lbl[i].textContent||lbl[i].innerText;
  }
  return fld.name||fld.type;
}

function requireValue(fld)
{ // disallow a blank field
  if(fld.disabled) return true;
  if(!fld.value.length)
  { status= 'The '+fieldname(fld)+' field cannot be left blank.'; return false; }
  return true;
}

function requireFields(fld){
   if(fld.disabled) return true;
   if(CustomerForm.statusCode.value == 'A') {
     if(!fld.value.length){ 
        status= 'The '+fieldname(fld)+' field cannot be left blank.'; return false; 
      }
   }
   return true;   
}

function requireChecked(fld)
{ // require a checkbox to be checked
  if(fld.disabled) return true;
  if(!fld.checked)
  { status= 'The '+fieldname(fld)+' checkbox must be checked.'; return false; }
  return true;
}

function requireConfirmation(fld,confirmfld)
{ // require fields to match
  if(fld.disabled) return true;
  if(fld.value != confirmfld.value)
  { status= 'The '+fieldname(fld)+' field does not match the '+fieldname(confirmfld)+' field.'; return false; }
  return true;
}

function requireRadio(radios)
{ // require at least one radio in this group to be checked
  if(!radios.length) return true; // invalid parameter
  var visible= false, enabled= false;
  for(var i= 0; i < radios.length; i++)
  {
    if(!enabled) enabled= !radios[i].disabled;
    if(radios[i].checked) return true;
    else if(radios[i].offsetWidth == undefined || radios[i].offsetWidth > 0) visible= true;
  }
  if(!visible||!enabled) return true; // no visible/enabled options in this group
  status= 'You must select one of the '+radios[0].name+' options.';
  return false;
}

function requireLength(fld,min,max)
{ // set minimum and/or maximum field lengths
  //Hugo Commented		
  //if(!fld.value.length||fld.disabled) return true; // blank fields are the domain of requireValue
  var len= fld.value.length;
  if(min > -1 && len < min)
  { status= 'The '+fieldname(fld)+' field must be at least '+min+
    ' characters long; it is currently '+len+' characters long.'; return false; }
  if(max > -1 && len > max)
  { status= 'The '+fieldname(fld)+' field must be no more than '+max+
    ' characters long; it is currently '+len+' characters long.'; return false; }
  return true;
}

function dependants(enabled,elements)
{ // convenience function to enable/disable dependant fields, passed in as an array 
  if(!elements.length) return true;
  for(var i= 0; i < elements.length; i++)
    elements[i].disabled= !enabled;
}

function allowChars(fld,chars)
{ // provide a string of acceptable chars for a field
  if(fld.disabled) return true;
  for(var i= 0; i < fld.value.length; i++)
  {
    if(chars.indexOf(fld.value.charAt(i)) == -1)
    { status= 'The '+fieldname(fld)+' field may not contain "'+fld.value.charAt(i)+'" characters.'; return false; }
  }
  return true;
}

function disallowChars(fld,chars)
{ // provide a string of unacceptable chars for a field
  if(fld.disabled) return true;
  for(var i= 0; i < fld.value.length; i++)
  {
    if(chars.indexOf(fld.value.charAt(i)) != -1)
    { status= 'The '+fieldname(fld)+' field may not contain "'+fld.value.charAt(i)+'" characters.'; return false; }
  }
  return true;
}

function checkEmail(fld)
{ // simple email check
  //if(!fld.value.length||fld.disabled) return true; // blank fields are the domain of requireValue 
  var phony= /@(\w+\.)*example\.(com|net|org)$/i;
  if(phony.test(fld.value))
  { status= 'Please enter your email address in the '+fieldname(fld)+' field.'; return false; }
  var emailfmt= /^\w+([.-]\w+)*@\w+([.-]\w+)*\.\w{2,8}$/;
  if(!emailfmt.test(fld.value))
  { status= 'The '+fieldname(fld)+' field must contain a valid email address.'; return false; }
  return true;
}

function checkIntRange(fld,minVal,maxVal,sep)
{
  if(!fixInt(fld)) return false;
  var val= parseInt(fld.value);
  if(val < minVal) { status= 'The '+fieldname(fld)+' field must be no less than '+minVal+'.'; return false; }
  if(val > maxVal) { status= 'The '+fieldname(fld)+' field must be no greater than than '+maxVal+'.'; return false; }
  return true;
}

function checkFloatRange(fld,minVal,maxVal,sep)
{
  if(!fixFloat(fld)) return false;
  var val= parseFloat(fld.value);
  if(val < minVal) { status= 'The '+fieldname(fld)+' field must be no less than '+minVal+'.'; return false; }
  if(val > maxVal) { status= 'The '+fieldname(fld)+' field must be no greater than than '+maxVal+'.'; return false; }
  return true;
}

function fixInt(fld,sep)
{ // integer check/complainer 
  if(!fld.value.length||fld.disabled) return true; // blank fields are the domain of requireValue 
  var val= fld.value;
  if(typeof(sep)!='undefined') val= val.replace(new RegExp(sep,'g'),'');
  val= parseInt(val);
  if(isNaN(val))
  { // parse error 
    status= 'The '+fieldname(fld)+' field must contain a whole number.';
    return false;
  }
  fld.value= val;
  return true;
}

function fixFloat(fld,sep)
{ // decimal number check/complainer 
  if(!fld.value.length||fld.disabled) return true; // blank fields are the domain of requireValue 
  var val= fld.value;
  if(typeof(sep)!='undefined') val= val.replace(new RegExp(sep,'g'),'');
  val= parseFloat(fld.value);
  if(isNaN(val))
  { // parse error 
    status= 'The '+fieldname(fld)+' field must contain a number.';
    return false;
  }
  fld.value= val;
  return true;
}

function fixMoney(fld,sep)
{ // monetary field check
  if(!fld.value.length||fld.disabled) return true; // blank fields are the domain of requireValue 
  var val= fld.value;
  if(typeof(sep)!='undefined') val= val.replace(new RegExp(sep,'g'),'');
  if(val.indexOf('$') == 0)
    val= parseFloat(val.substring(1,40));
  else
    val= parseFloat(val);
  if(isNaN(val))
  { // parse error 
    status= 'The '+fieldname(fld)+' field must contain a dollar amount.';
    return false;
  }
  var sign= ( val < 0 ? '-': '' );
  val= Number(Math.round(Math.abs(val)*100)).toString();
  while(val.length < 2) val= '0'+val;
  var len= val.length;
  val= sign + ( len == 2 ? '0' : val.substring(0,len-2) ) + '.' + val.substring(len-2,len+1);
  fld.value= val;
  return true;
}

function fixFixed(fld,dec,sep)
{ // fixed decimal fields 
  if(!fld.value.length||fld.disabled) return true; // blank fields are the domain of requireValue 
  var val= fld.value;
  if(typeof(sep)!='undefined') val= val.replace(new RegExp(sep,'g'),'');
  val= parseFloat(fld.value);
  if(isNaN(val))
  { // parse error 
    status= 'The '+fieldname(fld)+' field must contain a number.';
    return false;
  }
  var sign= ( val < 0 ? '-': '' );
  val= Number(Math.round(Math.abs(val)*Math.pow(10,dec))).toString();
  while(val.length < dec) val= '0'+val;
  var len= val.length;
  val= sign + ( len == dec ? '0' : val.substring(0,len-dec) ) + '.' + val.substring(len-dec,len+1);
  fld.value= val;
  return true;
}


function fixFixedWithDecimal(fld,dec,len)
{ // fixed decimal fields 
  if(!fld.value.length||fld.disabled) return true; // blank fields are the domain of requireValue 
  var val= fld.value;
  val= parseFloat(fld.value);
  if(isNaN(val))
  { // parse error 
    status= 'The '+fieldname(fld)+' field must contain a number.';
    return false;
  }
  var sign= ( val < 0 ? '-': '' );
  if(fld.value.length <= len-dec){
  	val = Number(Math.round(Math.abs(val)*Math.pow(10,dec))).toString();
  	while(val.length < dec) val= '0'+val;
  	
  }else{
  	val = Number(Math.round(Math.abs(val))).toString();
  }
  
  var len= val.length;
  val= sign + ( len == dec ? '0' : val.substring(0,len-dec) ) + '.' + val.substring(len-dec,len+1);
  fld.value= val;
  return true;
}

function fixDate(fld)
{ // tenacious date correction 
  if(!fld.value.length||fld.disabled) return true; // blank fields are the domain of requireValue 
  var val= fld.value;
  if(!isValDate(fld.value)) {     
     fld.focus();
     return false;
  }
  var yearPrefix = new Date().getFullYear().toString().substring(0, 2);

  var str1 = val.split("/");
  if(str1[2].length == 2)
  	 str1[2] = yearPrefix+str1[2];  //  Only for one Century...06 ==> 2006 and 99 ==> 2099, what if it is 100???

  var dt = new Date(val.replace(/\D/g,'/'));
  if(!dt.valueOf())
  { // the date was unparseable 
    status= 'The '+fieldname(fld)+' field has the wrong date.';
    return false;
  }
  fld.value= (dt.getMonth()+1)+'/'+dt.getDate()+'/'+str1[2];  //dt.getFullYear();
  
  return true;
}
function fixRecentDate(fld,minyear)
{ // tenacious date correction 
  if(!fld.value.length||fld.disabled) return true; // blank fields are the domain of requireValue 
  var val= fld.value;
  var dt= new Date(val.replace(/\D/g,'/'));
  if(!dt.valueOf())
  { // the date was unparseable 
    status= 'The '+fieldname(fld)+' field has the wrong date.';
    return false;
  }
  while(dt.getFullYear() < minyear) { dt.setFullYear(dt.getFullYear()+100); }
  fld.value= (dt.getMonth()+1)+'/'+dt.getDate()+'/'+dt.getFullYear();
  return true;
}

function fixTime(fld,starthour) 
{ // tenacious time correction 
  if(!fld.value.length||fld.disabled) return true; // blank fields are the domain of requireValue 
  var hour= 0; 
  var mins= 0;
  var ampm= 'am';
  val= fld.value;
  var dt= new Date('1/1/2000 ' + val);
  if(('9'+val) == parseInt('9'+val))
  { hour= val; }
  else if(dt.valueOf())
  { hour= dt.getHours(); mins= dt.getMinutes(); }
  else
  {
    val= val.replace(/\D+/g,':');
    hour= parseInt(val);
    mins= parseInt(val.substring(val.indexOf(':')+1,20));
    if(val.indexOf('pm') > -1) ampm= 'pm';
    if(isNaN(hour)) hour= 0;
    if(isNaN(mins)) mins= 0;
  }
  if(hour < starthour) { ampm= 'pm'; }
  while(hour > 12) { hour-= 12; ampm= 'pm'; }
  while(mins > 60) { mins-= 60; hour++; }
  if(mins < 10) mins= '0' + mins;
  if(!hour)
  { // the date was unparseable 
    status= 'The '+fieldname(fld)+' field has the wrong time.';
    return false;
  }
  fld.value= hour + ':' + mins + ampm;
  return true;
}

function fixTime24(fld) 
{ // tenacious time correction 
  if(!fld.value.length||fld.disabled) return true; // blank fields are the domain of requireValue 
  var hour= 0; 
  var mins= 0;
  val= fld.value;
  var dt= new Date('1/1/2000 ' + val);
  if(('9'+val) == parseInt('9'+val))
  { hour= val; }
  else if(dt.valueOf())
  { hour= dt.getHours(); mins= dt.getMinutes(); }
  else
  {
    val= val.replace(/\D+/g,':');
    hour= parseInt(val);
    mins= parseInt(val.substring(val.indexOf(':')+1,20));
    if(isNaN(hour)) hour= 0;
    if(isNaN(mins)) mins= 0;
    if(val.indexOf('pm') > -1) hour+= 12;
  }
  hour%= 24;
  mins%= 60;
  if(mins < 10) mins= '0' + mins;
  fld.value= hour + ':' + mins;
  return true;
}

function fixPhone(fld,defaultAreaCode,sep,noext)
{ // tenacious phone # correction 
  //if(!fld.value.length||fld.disabled) return true; // blank fields are the domain of requireValue 
  if(typeof(sep)=='undefined') sep= '-';
  if(typeof(defaultAreaCode)!='undefined') defaultAreaCode= defaultAreaCode + sep;
  var ext= '', val= fld.value.toLowerCase();
  if(val.indexOf('x') > 0)
  {
    if(!noext) ext= ' x'+val.substr(val.indexOf('x')).replace(/\D/g,'');
    val= val.substr(0,val.indexOf('x'));
  }
  val= val.replace(/\D/g,'');
  if(val.length == 7)
  {
    fld.value= defaultAreaCode + val.substring(0,3) + sep + val.substring(3,20) + ext;
    return true;
  }
  if(val.length == 10)
  {
    fld.value= val.substring(0,3) + sep + val.substring(3,6) + sep + val.substring(6,20) + ext;
    return true;
  }
  if(val.length < 7)
  {
    status= 'The phone number you supplied for the '+fieldname(fld)+' field was too short.';
    return false;
  }
  if(val.length > 10)
  {
    status= 'The phone number you supplied for the '+fieldname(fld)+' field was too long.';
    return false;
  }
  status= 'The phone number you supplied for the '+fieldname(fld)+' field was wrong.';
  return false;
}

function fixSSN(fld)
{ // tenacious SSN correction; fieldname isn't a big consideration, probably only one SSN per form 
  if(!fld.value.length||fld.disabled) return true; // blank fields are the domain of requireValue 
  var val= fld.value;
  val= val.replace(/\D/g,'');
  if( val.length < 9 )
  {
    status= 'The Social Security Number you provided is not long enough.';
    return false;
  }
  if( val.length > 9 )
  {
    status= 'The Social Security Number you provided is too long.';
    return false;
  }
  fld.value= val.substring(0,3)+'-'+val.substring(3,5)+'-'+val.substring(5,12);
  return true;
}

function fixCreditCard(fld)
{ // tenacious credit card correction; fieldname isn't a big consideration, probably only one card per form 
  if(!fld.value.length||fld.disabled) return true; // blank fields are the domain of requireValue 
  var val= fld.value, ctype= 'credit card';
  val= val.replace(/\D/g,'');
  var prefix2= parseInt(val.substr(0,2));
  if( val.substr(0,1) == '4' )
  { // Visa
    ctype= 'Visa\xae';
    if( val.length == 16 );
    else if( val.length == 13 ); // very old #, should be reassigned
    else if( val.length < 13 )
    { status= 'The Visa\xae number you provided is not long enough.'; return false; }
    else if( val.length > 16 )
    { status= 'The Visa\xae number you provided is too long.'; return false; }
    else
    { status= 'The Visa\xae number you provided is either not long enough, or too long.'; return false; }
  }
  else if( prefix2 >= 51 && prefix2 <= 55 )
  { // MC
    ctype= 'MasterCard\xae';
    if( val.length < 16 )
    { status= 'The MasterCard\xae number you provided is not long enough.'; return false; }
    else if( val.length > 16 )
    { status= 'The MasterCard\xae number you provided is too long.'; return false; }
  }
  else if( (prefix2 == 34) || (prefix2 == 37) )
  { // AmEx
    ctype= 'American Express\xae card';
    if( val.length < 15 )
    { status= 'The American Express\xae card number you provided is not long enough.'; return false; }
    else if( val.length > 15 )
    { status= 'The American Express\xae card number you provided is too long.'; return false; }
  }
  else if( val.substr(0,4) == '6011' )
  { // Novus/Discover
    ctype= 'Discover\xae card';
    if( val.length < 16 )
    { status= 'The Discover\xae card number you provided is not long enough.'; return false; }
    else if( val.length > 16 )
    { status= 'The Discover\xae card number you provided is too long.'; return false; }
  }
  else
  { // other
    if( val.length < 13 )
    { status= 'The credit card number you provided is not long enough.'; return false; }
    if( val.length > 19 )
    { status= 'The credit card number you provided is too long.'; return false; }
  }
  var sum= 0, dbl= false;
  for(var i= val.length-1; i >= 0; i--)
  {
    var digit= parseInt(val.charAt(i))*((dbl=!dbl)?1:2);
    sum+= ( digit > 9 ? (digit%10)+1 : digit );
  }
  if(sum%10)
  {
    status= 'The '+ctype+' number you provided is not valid.\nPlease double-check it and try again.';
    return false;
  }
  fld.value= val;
  return true;
}

function nameContains(name,str)
{ // Check for nontrivial inclusion 
  // OK, *some* trivial cases must be handled...
  if(name == str || name.toLowerCase() == str.toLowerCase()) return true;
  var nlen= name.length;
  var slen= str.length;
  var endat= nlen - slen;
  // too small to fit?
  if(nlen > str) return false;
  if(name.toLowerCase() == name || name.toUpperCase() == name)
  { // all lower/upper case name? underscores separate
    if(name.indexOf('_') == -1) return false;
    str= str.toLowerCase();
    if( name.indexOf(str+'_') == 0 ||
      name.indexOf('_'+str+'_') > -1 ||
      name.substring(endat-1,nlen+1) == ('_'+str) )
      return true;
  }
  else
  { // proper case name? uppercase starts new words 
    var sep= name.substring(slen,slen+1);
    if( name.indexOf(str) == 0 && sep == sep.toUpperCase() ) return true;
    if( name.indexOf(str.toLowerCase()) == 0 && sep == sep.toUpperCase() ) return true;
    var sep= name.substring(endat-1,endat);
    if( name.substring(endat,nlen+1) == str ) return true;
    for(var index= name.indexOf(str); index > -1; index= name.indexOf(str,index+1))
    { // for each occurence of the word, is it followed by a non-lowercase char? 
      endat= index+slen;
      sep= name.substring(endat,endat+1);
      if(sep == sep.toUpperCase()) return true;
    }
  }
  return false;
}

function autocheckByName(frm) 
{ // uses names of form elements to determine type 
  for(var index= 0; index < frm.elements.length; index++)
  {
    var el= frm.elements[index];
    if(!el.type) continue;
    if(el.type == 'text' || el.type == 'password')
    { // text fields 
      if(( el.name.substring(0,1) == el.name.substring(0,1).toUpperCase() || 
        nameContains(el.name,'Required')) && el.value.length == 0)
      { alert('The '+fieldname(el)+' field cannot be left blank.'); el.focus(); return false; }
      if(nameContains(el.name,'Date') && !fixDate(el))
      { alert(status); el.focus(); return false; }
      if(nameContains(el.name,'Time24') && !fixTime24(el))
      { alert(status); el.focus(); return false; }
      if(nameContains(el.name,'Time') && !fixTime(el))
      { alert(status); el.focus(); return false; }
      if(nameContains(el.name,'SSN') && !fixSSN(el))
      { alert(status); el.focus(); return false; }
      if(nameContains(el.name,'CC') && !fixCreditCard(el))
      { alert(status); el.focus(); return false; }
      if(nameContains(el.name,'Email') && !checkEmail(el))
      { alert(status); el.focus(); return false; }
      if( ( nameContains(el.name,'Phone') ||
        nameContains(el.name,'Fax') || 
        nameContains(el.name,'Pager') ) &&
        !fixPhone(el))
      { alert(status); el.focus(); return false; }
    }
    // handle required select and select-multiple 
    else if(el.type.substring(0,3) == 'sel' && 
      (el.name.substring(0,1) == el.name.substring(0,1).toUpperCase() || 
      nameContains(el.name,'Required')) && el.selectedIndex == -1)
    { alert(status); el.focus(); return false; }
    // handle required checkbox
    else if(el.type == 'checkbox' && 
      (el.name.substring(0,1) == el.name.substring(0,1).toUpperCase() || 
      nameContains(el.name,'Required')) && !requireChecked(el))
    { alert(status); el.focus(); return false; }
    else if(el.type == 'radio' && !requireRadio(frm[el.name]))
    { alert(status); frm.elements[index].focus(); return false; }
  }
  for(var index= 0; index < frm.elements.length; index++)
    if(frm.elements[index].type == 'submit') frm.elements[index].disabled= true;
  return true;
}

function isMemberOf(elem,classname)
{ // checks to see if elem is a member of the (style) class 
  // trivial cases first: no membership or simple equality
  if(!elem.className)
    return false
  else if(elem.className == classname)
    return true;
  else if(elem.className.indexOf(' ') > -1)
  { // multiple class names; use split, if avail 
    if(parseInt(navigator.appVersion) >= 4)
    {
      var names= elem.className.split(' ');
      for(var index= 0; index < names.length; index++)
        if(names[index] == classname)
          return true;
    }
    // older browsers can fake it 
    // WARNING: "fine" can be found in "oldRefined"
    else if(elem.className.indexOf(classname) > -1)
      return true;
  }
  return false;
}

function checkClass(el)
{ // validate the field, based on class membership
  if(el.type == 'text' || el.type == 'password')
  { // text fields 
    if(isMemberOf(el,'required') && !requireValue(el)) return false;
    if(isMemberOf(el,'date') && !fixDate(el)) return false;
    if(isMemberOf(el,'time') && !fixTime(el)) return false;
    if(isMemberOf(el,'time24') && !fixTime24(el)) return false;
    if(isMemberOf(el,'ssn') && !fixSSN(el)) return false;
    if(isMemberOf(el,'cc') && !fixCreditCard(el)) return false;
    if(isMemberOf(el,'phone') && !fixPhone(el)) return false;
    if(isMemberOf(el,'money') && !fixMoney(el)) return false;
    if(isMemberOf(el,'int') && !fixInt(el)) return false;
    if(isMemberOf(el,'float') && !fixFloat(el)) return false;
    if(isMemberOf(el,'email') && !checkEmail(el)) return false;
  } // handle required select and select-multiple 
  else if(el.type == 'checkbox' && 
    isMemberOf(el,'required') && !requireChecked(el)) return false;
  else if(el.type.substring(0,3) == 'sel' && 
    isMemberOf(el,'required') && el.selectedIndex == -1) return false;
  return true;
}

function autocheckByClass(frm) 
{ // uses the CSS class of form elements to determine type 
  for(var index= 0; index < frm.elements.length; index++)
  {
    var el= frm.elements[index];
    if(!el.type) continue;
    if(el.type == 'radio' && !requireRadio(frm[el.name]))
    { alert(status); frm.elements[index].focus(); return false; }
    else if(!checkClass(frm.elements[index])) 
    { alert(status); frm.elements[index].focus(); return false; }
  }
  for(var index= 0; index < frm.elements.length; index++)
    if(frm.elements[index].type == 'submit') frm.elements[index].disabled= true;
  return true;
}

function autocheckByBlur(frm)
{ // uses the onBlur handler of form elements to check value 
  status= '';
  for(var index= 0; index < frm.elements.length; index++)
    {
    var el= frm.elements[index];
    if(!el.type) continue;
    if(el.type == 'radio' && !requireRadio(frm[el.name]))
    {   
    alert(status); 
    frm.elements[index].focus(); 
    return false; 
    } else if(el.type != 'hidden' && el.name && el.onblur)
    { el.onblur();
      if(status) {        
      alert(status); el.focus(); 
      return false; }
    }
     
  }
  for(var index= 0; index < frm.elements.length; index++){
    if(frm.elements[index].type == 'submit') frm.elements[index].disabled= true;
    }
  return true;
}

function canCheckByBlur(frm)
{ // determines whether programmatic invocation of form element onblur is available
  for(var index= 0; index < frm.elements.length; index++)
  {
    var el= frm.elements[index];
    if(!el.type) continue;
    if(el.type != 'hidden' && el.name && typeof(el.onblur)=='function') return true;
  }
  return false;
}
function isInvalidateCustomerReserveWaybillForm(frm){
	var startLength = parseInt(frm.waybillStart.value.length);
	var endLength = parseInt(frm.waybillEnd.value.length);
	var preFixLength = parseInt(frm.waybillPreFix.value.length);
	var effectiveDate =  new Date(frm.effective.value);
	var expirationDate =  new Date(frm.expiration.value);
	var greater ;
	var totalLength;
	
	if( startLength > endLength){
	 	greater = startLength ;
	 } else {
	 	greater = endLength ;
	 } 
	 total=greater + preFixLength;
	if( total > 20 ){
		alert("Total length of waybill and prefix should not be greater than 20.");
		return true;
	}
	if(expirationDate < effectiveDate ){
		alert("Expiration date should be greater than effective date.");
		return true;
	}
	//parseInt(value,radix) 10 for decimal
	if(parseInt(frm.waybillStart.value,10) >= parseInt(frm.waybillEnd.value,10) ){
		alert("Waybill end must be greater than waybill start.");
		return true;
	}
	//var current = new Date();
	//var currDate = (current.getMonth()+1)+"/"+current.getDate()+"/"+current.getYear();
	
	//if (effectiveDate < new Date(currDate)){
	//	alert("Effective date should be greater or equal than current date. ");
	//	return true;
	//}
	
	return false;		
}

function autocheck(frm)
{ // uses the best available method to check form values 
  if (trim(frm.name) == 'CustomerReservedWaybillsForm' && isInvalidateCustomerReserveWaybillForm(frm)){
  		return false;
  }
  var bchar= navigator.appName.substring(0,1);
  if(isMemberOf(frm,'autocheck'))
  {  return autocheckByClass(frm); }
  else if(canCheckByBlur(frm))
  {  return autocheckByBlur(frm); }
  else
  {  return autocheckByName(frm); }
}


function returnDate(dtStr) {
	if(dtStr == '') return dtStr
	var pos1=dtStr.indexOf('/')
	var pos2=dtStr.indexOf('/',pos1+1)
	var strMonth=dtStr.substring(0,pos1)
	var strDay=dtStr.substring(pos1+1,pos2)
	var strYr=dtStr.substring(pos2+1)
	// subtracted month by 1 because as per  java calender
	//months start from 0-11 for Jan to Dec
	
//	alert("strMonth : "+ strMonth+" strDay: "+strDay+" strYr: "+strYr)
	var mon=parseInt(strMonth-1)
	var dt=parseInt(strDay-0)
	var yr=parseInt(strYr-0)
//	alert("mon : "+mon+"dt : "+dt+"yr :" +yr)
	var date = new Date(yr, mon, dt);
	//alert("date : "+date)
	return date;
}

/**
	 This method is used to compare two dates.<b> 
	 It will return false if strDate1 is greater than strDate2 
	 
  */

	function CompareDates(strDate1,strDate2)
	{
		//alert("strDate1: "+strDate1+"  strDate2: "+strDate2 )
		var str1  = document.getElementById(strDate1);
   		var str2  = document.getElementById(strDate2);
 		//alert("str1: "+str1.value+"  str2: "+str2.value )
 		if(str1.value !='' && str2.value != '') {
 			
   			var date1=returnDate(str1.value)
   			var date2=returnDate(str2.value)
   			if(date2 < date1) {
   				str2.focus();
   				return false;
   			}
   		}
   		return true
	} 
	
	/**
	 This method is used to compare two dates, where method arguments are two Date strings.<b> 
	 It will return false if strDate1 is greater than strDate2 
    */

	function CompareDates2(strDate1,strDate2)
	{
		//alert("strDate1: "+strDate1+"  strDate2: "+strDate2 )
		var str1  = strDate1;
   		var str2  = strDate2;
 		if(str1 !='' && str2 != '') {
   			var date1=returnDate(str1)
   			var date2=returnDate(str2)
   			if(date1 > date2) {
   				return false;
   			}
   		}
   		return true;
	} 
	/**
	*This function returns false if strDate is not betwen startdate and end date
	*/
	function checkDateRange(startDate,EndDate,strDate) {
	//	alert("startDate :"+startDate+" EndDate: "+ EndDate+" strDate :"+strDate)
		var date1=returnDate(startDate)
   		var date2=returnDate(EndDate)
   		var date3=returnDate(strDate)
   		
   	//	alert("date1 :"+date1+" date2 : "+date2+" date3 : "+date3)
   		if(date2 == '') {
   			if(date3 < date1) {
   				return false;
   			}
   		} else {
   			if(date3 < date1 || date3 > date2) {
   				return false;
   			}
   		}
		return true;
	}
	
/**
This method is used to compare date with today's date.<b> 
It will return false if the given date is less than Today's date 
*/

function isEarlierThanToday(theField)
{
	if(!theField.value.length||theField.disabled) return true; // blank fields are the domain of requireValue
	 
	var dt1 = new Date;
	var strDt1 = theField.value;
	var str1 = strDt1.split("/");
	
	dt1.setDate(str1[1]);  
	dt1.setMonth(str1[0]-1); 
	dt1.setFullYear(str1[2]);
	
	var dt_today = new Date;
	
	var daysDiff = dt1- dt_today;						
	
	if (daysDiff < 0)
	{	
		return false;
	}
							
	return true;
}	

// Check whether string s is empty.
function isEmpty(s)
{   
	return ((s == null) || (s.length == 0))
}

// Returns true if character c is an English letter 
// (A .. Z, a..z, " ").
function isLetter (c)
{   return ( ((c >= "a") && (c <= "z")) || ((c >= "A") && (c <= "Z")) || ((c == " ")))
}

// Returns true if character c is a digit 
// (0 .. 9).
function isDigit (c)
{   return ((c >= "0") && (c <= "9"))
}

// isAlphanumeric (STRING s [, BOOLEAN emptyOK])
// Returns true if string s is English letters 
// (A .. Z, a..z) and numbers only.
// NOTE: Need i18n version to support European characters.
// This could be tricky due to different character
// sets and orderings for various languages and platforms.
function isAlphanumeric (str)
{   var i;
    if (isEmpty(str))
    {
		return false;
    }
    // Search through string's characters one by one
    // until we find a non-alphanumeric character.
    // When we do, return false; if we don't, return true.
    for (i = 0; i < str.length; i++)
    {   
        // Check that current character is number or letter.
        var c = str.charAt(i);

        if (! (isLetter(c) || isDigit(c) ) )
        return false;
    }
    // All characters are numbers or letters.
    return true;
}

function isDateMoreThanToday(theField)
	{
	var strDt1 = theField.value;
	var str1 = strDt1.split("/");
	var dt1 = new Date(str1[2],str1[0]-1,str1[1]);
	var dt_today = new Date();
	var daysDiff = dt1 - dt_today;						

		if (daysDiff > 0)
		{
			alert("Date cannot be after today.");
			HighLight(theField);
			theField.focus();
			return false;
		}
								
	return true;
	}

function HighLight(obj)
{
	obj.className = "regErrorControlText";	
}

//sachin added for date validation

var dtCh= "/";
var minYear=1900;
var maxYear=2100;

function isInteger(s){
	var i;
    for (i = 0; i < s.length; i++){   
        // Check that current character is number.
        var c = s.charAt(i);
        if (((c < "0") || (c > "9"))) return false;
    }
    // All characters are numbers.
    return true;
}

function stripCharsInBag(s, bag){
	var i;
    var returnString = "";
    // Search through string's characters one by one.
    // If character is not in bag, append to returnString.
    for (i = 0; i < s.length; i++){   
        var c = s.charAt(i);
        if (bag.indexOf(c) == -1) returnString += c;
    }
    return returnString;
}

function daysInFebruary (year){
	// February has 29 days in any year evenly divisible by four,
    // EXCEPT for centurial years which are not also divisible by 400.
    return (((year % 4 == 0) && ( (!(year % 100 == 0)) || (year % 400 == 0))) ? 29 : 28 );
}
function DaysArray(n) {
	for (var i = 1; i <= n; i++) {
		this[i] = 31
		if (i==4 || i==6 || i==9 || i==11) {this[i] = 30}
		if (i==2) {this[i] = 29}
   } 
   return this
}

function isValDate(dtStr){
    dtStr = dtStr.replace(/^\s+|\s+$/g, '') ;
    if(dtStr.length==0){
    return true; //if nothing entered then return true..means dont validate...
    }
	var daysInMonth = DaysArray(12)
	var pos1=dtStr.indexOf(dtCh)
	var pos2=dtStr.indexOf(dtCh,pos1+1)
	var strMonth=dtStr.substring(0,pos1)
	var strDay=dtStr.substring(pos1+1,pos2)
	var strYear=dtStr.substring(pos2+1)
	strYr=strYear
	if (strDay.charAt(0)=="0" && strDay.length>1) strDay=strDay.substring(1)
	if (strMonth.charAt(0)=="0" && strMonth.length>1) strMonth=strMonth.substring(1)
	for (var i = 1; i <= 3; i++) {
		if (strYr.charAt(0)=="0" && strYr.length>1) strYr=strYr.substring(1)
	}
	month=parseInt(strMonth)
	day=parseInt(strDay)
	year=parseInt(strYr)
	if (pos1==-1 || pos2==-1){
		alert("The date format should be : mm/dd/yyyy")
		return false
	}
	if (strMonth.length<1 || month<1 || month>12){
		alert("Please enter a valid month")
		return false
	}
	if (strDay.length<1 || day<1 || day>31 || (month==2 && day>daysInFebruary(year)) || day > daysInMonth[month]){
		alert("Please enter a valid day")
		return false
	}
	if (strYear.length != 4 || year==0 || year<minYear || year>maxYear){
		alert("Please enter a valid 4 digit year between "+minYear+" and "+maxYear)
		return false
	}
	if (dtStr.indexOf(dtCh,pos2+1)!=-1 || isInteger(stripCharsInBag(dtStr, dtCh))==false){
		alert("Please enter a valid date")
		return false
	}
return true
}



      // -------------------------------------------------------------------------
      //  Name: SelectOptionInList
      //  Abstract: Given a select list and an ID search the list for the option with
      //                  the matching ID and select it.
      // -------------------------------------------------------------------------
      function SelectOptionInList( lstSelectList, intID )
      {
		  if(lstSelectList.options.length)
		  {
            try
            {
                  var intIndex = 0;
                  // Loop through all the options
                  for( intIndex = 0; intIndex < lstSelectList.options.length; intIndex++ )
                  {
                        // Is this the ID we are looking for?
                        if( lstSelectList.options[intIndex].value == intID )
                        {
                              // Select it
                              lstSelectList.selectedIndex = intIndex;
                              // Yes, so stop searching
                              break;
                        }
                  }
            }
            catch( expError )
            {
                  alert( "ClientUtilities1.js::SelectOptionInList( ).\n" +
                              "Error:" + expError.number + ", " + expError.description );
            }
		  }
      } // SelectOptionInList

	function toUpper(obj){
		//document.getElementsByName(csd).value=document.getElementsByName(csd).value.toUpperCase();
		obj.value = obj.value.toUpperCase();
	}

function CheckRegistrationAgentCode(reg_agent)
					{
						var form1 = document.forms[0];
						var regAgentCode = form1.reg_agent;
						if(regAgentCode.readOnly) return;
						
						if(regAgentCode.value == '' || regAgentCode.value.length == 0)
						{
						    OffLight(regAgentCode);
						    form1.reg_name.value = '';
						    return true;	    
						}
						
						else if ((regAgentCode.value != '' && regAgentCode.value.length < 2))
						{
						 	alert("Please enter at least 2 digits for the Registration Agent Code.");
						 	tp1.setSelectedIndex(0);
						    HighLight(regAgentCode);
						    regAgentCode.focus();
						    return false;	
						}
												
						return true;
						
					}
					

//added for 3416 - 5 Jan 09 - Lionel
function alltrim(str) 
{
	return str.replace(/^\s+|\s+$/g, '');
}

//ensure that a given percentage field lies within 0 and 100 (both inclusive) and can go upto 3 decimals
function validatePercentageRange(obj) {
	str = obj.value;
	str = alltrim(str);
	wholeNumber = str.split('.')
	
	if (str == '') //ignore when there is no value 
	{
		return true;
	}
	
	if(obj.value != str) //reset values to trim all spaces from the text field
	{
		obj.value = str;
	}
	
	len = wholeNumber[0].length;

	if (len > 3) // the only value allowed for 3 characters is 100
	{
		flag =  parseInt(wholeNumber) == 100;
		alert('The percentage value cannot be greater than 100%');
		obj.select();
		obj.focus();
		return flag;
	}
	else if (parseFloat(str) == 100)
	{
		flag =  true;
	}
	else //allow only +ve floating numbers between 0 and 99.999
	{
		flag = /^[+]?\d{0,2}(\.\d{1,3})?$/.test(str);
	}

	if(!flag) //when its invalid select the value and focus back on the text field to make the change
	{
		obj.select();
		obj.focus();
		alert('The percentage value must lie within the range of 0 and 100% (max 3 decimals allowed)');
	}

	return flag;
}
//end of addition

function validateFloatRange(obj, wholeNumLength, precisionLength, negativeAllowed, maxValue) 
{
	str = obj.value;
	str = alltrim(str);
	var errMsg = ''
	var maxWholeNumLength = '9'
	
	try
	{
		flag = parseFloat(str)
	}
	catch (e)
	{
		alert('Not a valid number!')
	}

	if (str == '') //ignore when there is no value 
	{
		return true;
	}
	
	if (maxValue != '' && maxValue != undefined && maxValue != null && (parseFloat(str) > maxValue))
	{
		alert('Must be lesser or equal to ' + maxValue);
		return false;
	}

	if(obj.value != str) //reset values to trim all spaces from the text field
	{
		obj.value = str;
	}
	
	for (i = 0; i < wholeNumLength; i++)
	{
		maxWholeNumLength = maxWholeNumLength + maxWholeNumLength;
	}

	if(negativeAllowed)
	{
		

		flag = eval('/^[+]?\\d{0,' + wholeNumLength + '}(\\.\\d{1,' + precisionLength + '})?$/.test(' + str + ')')
		errMsg = 'Cannot be lesser than 0 or greater than ' + maxWholeNumLength + ' and it cannot have more than ' + precisionLength + ' digits after the decimal.';
	}
	else
	{
		flag = eval('/^[+]?\\d{0,' + wholeNumLength + '}(\\.\\d{1,' + precisionLength + '})?$/.test(' + str + ')')
		errMsg = 'Cannot be lesser than 0 or greater than ' + maxWholeNumLength + ' and it cannot have more than ' + precisionLength + ' digits after the decimal..\nor\nNegative numbers are not acceptable.';
	}

	if(!flag) //when its invalid select the value and focus back on the text field to make the change
	{
		obj.select();
		obj.focus();
		alert(errMsg);

	}

	return flag;
}

function validateIntRange(obj, wholeNumLength, negativeAllowed, maxValue) 
{
	str = obj.value;
	str = alltrim(str);
	var errMsg = '';
	var maxWholeNumLength = '9'

	try
	{
		flag = parseInt(str)
	}
	catch (e)
	{
		alert('Not a valid whole number!')
	}

	if (str == '') //ignore when there is no value 
	{
		return true;
	}
	
	if (maxValue != '' && maxValue != undefined && maxValue != null && (parseInt(str) > maxValue))
	{
		alert('Must be lesser or equal to ' + maxValue);
		return false;
	}

	if(obj.value != str) //reset values to trim all spaces from the text field
	{
		obj.value = str;
	}
	
	//allow only numbers between 0 and the length of the whole number. 
	//the precision cannot exceed the value specified
	
	for (i = 0; i < wholeNumLength; i++)
	{
		maxWholeNumLength = maxWholeNumLength + maxWholeNumLength;
	}

	if (negativeAllowed)
	{
		flag = eval('/^[+-]?\\d{0,' + wholeNumLength + '}?$/.test(' + str + ')')
		errMsg = 'Cannot be lesser than 0 or greater than ' + maxWholeNumLength + '.';
	}
	else
	{
		flag = eval('/^[+]?\\d{0,' + wholeNumLength + '}?$/.test(' + str + ')')
		errMsg = 'Cannot be lesser than 0 or greater than ' + maxWholeNumLength + '.\nor\nNegative numbers are not acceptable.';
	}
	
	

	if(!flag) //when its invalid select the value and focus back on the text field to make the change
	{
		obj.select();
		obj.focus();
		alert(errMsg);
	}
	
	return flag;
}

//only changes from american format to american format. makes correction to become correctly mm/dd/yyyy (exact 10 characters)
function fixDateInAmericanFormat(obj)
{
	if(obj && obj.value != '')
	{
		strValue = obj.value

		datePortion = strValue.split('/')

		if (datePortion[0].length == 1)
		{
			datePortion[0] = '0' + datePortion[0];
		}

		if (datePortion[1].length == 1)
		{
			datePortion[1] = '0' + datePortion[1];
		}

		if (datePortion[2].length == 2)
		{
			datePortion[2] = new Date().getFullYear().toString().substring(0, 2) + datePortion[2];
		}

		strValue = datePortion[0] + '/' + datePortion[1] + '/' + datePortion[2]
		obj.value = strValue
	}
}

function trimTextAreaToMaxLength(obj, maxLength) 
{
	if (obj.value.length > maxLength) 
		obj.value = obj.value.substring(0, maxLength);
}

//end of addition


function validateEmail(inputField){	
	flag = false;

	if (inputField.value != '' && inputField.value != undefined && inputField.value != null)
	{
	    var pattern=/^([a-zA-Z0-9_.-])+@([a-zA-Z0-9_.-])+\.([a-zA-Z])+([a-zA-Z])+/;

	    if(pattern.test(inputField.value))
	    {         
			flag = true;
			
	    }else{   
	    	inputField.select();
	    	inputField.focus();
	    	alert('Invalid email address.')
			flag = false;
	    }
 	}
 	
 	return flag;
}

function unique(a)
{
   for(var i = 0; i < a.length; i++)
   {
      for(var x = i+1; x < a.length; x++)
      {
         //alert("The a[i] = " + a[i].value + " and a[x] = " + a[x].value);
         if(a[i].value == a[x].value) 
         {
         	return false;
         }
      }
   }
   return true;
}
