var ignoreClass = true; // this is used only in the pop-up windows

function getFieldDescription(obj)
{
    if (obj.aval == null || obj.aval == "undefined")
    {
        if (obj.parentElement.parentElement.cells(obj.parentElement.cellIndex-1))
            return obj.parentElement.parentElement.cells(obj.parentElement.cellIndex-1).innerText
    }
    else
    {
        return obj.aval
    }
    return ""
}

function getFieldRangeValue(obj)
{
    if (obj.valRange == null || obj.valRange== "undefined")
    {
        if (obj.parentElement.parentElement.cells(obj.parentElement.cellIndex-1))
            return obj.parentElement.parentElement.cells(obj.parentElement.cellIndex-1).valRange
    }
    else
    {
        return obj.aval
    }
    return ""
}

function formFocus()
{ // convenient way to start the form onLoad
  if(!document.forms.length) return;
  var els= document.forms[0].elements;
  for(var i= 0; i < els.length; i++)
    if(els[i].type != 'hidden') { els[i].focus(); return; }
}

function requireValue(fld)
{ // disallow a blank field
  if(!(Trim(fld.value).length))
  { licenseFormStatus= "'" + getFieldDescription(fld) + "' cannot be left blank."; fld.value = ""; return false; }
  return true;
}

function isRequired(fld, sts)
{ // disallow a blank field
    if(fld == null || !(Trim(fld.value).length))
    {
      licenseFormStatus= "'" + sts + "' cannot be left blank.";
      alert(licenseFormStatus);
      fld.value="";
      fld.focus();
      return false;
    }
  return true;
}

function requireDependentValue(fld)
{
    if(!document.forms.length) return;
    if (requireValue(fld))
    {
        var els= document.forms[0].elements;
        for(var i= 0; i < els.length; i++)
        {
            //alert(els[i].name.length + " and " + els[i].name.substring(els[i].name.length-10, els[i].name.length-3))
            //if(els[i].name.length > 9 && els[i].name.substring(els[i].name.length-10, els[i].name.length-4) == 'dependent')
            if(els[i].name.length > 9 && mid(els[i].name.length-14, 3) == 'dependent')
            {
                if (els[i].name.substring(0,fld.name.length-1) == fld.name)
                {
                    if (!checkFld(els[i],right(els[i].name,3))) return false;
                }
            }
        }
    }
}

function requireSelectValue(fld,ind)
{ // disallow a blank field
  if(fld.options[ind].selected == true)
  { licenseFormStatus= "'" + getFieldDescription(fld) + "' has to be selected."; return false; }
  return true;
}

function requireChecked(fld)
{ // require a checkbox to be checked
  if(!fld.checked)
  { licenseFormStatus= "'" + getFieldDescription(fld) + "' checkbox must be checked."; 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;
  for(var i= 0; i < radios.length; i++)
    if(radios[i].checked) return true;
    else if(radios[i].offsetWidth == 'undefined' || radios[i].offsetWidth > 0) visible= true;
  if(!visible) return true; // no visible options in this group
  licenseFormStatus= "You must select one of the '"+getFieldDescription(radios[0])+"' options.";
  return false;
}

function requireLength(fld,min,max)
{ // set minimum and/or maximum field lengths
  var len= fld.value.length;
  if(min > -1 && len < min)
  { licenseFormStatus= "'"+getFieldDescription(fld)+"' must be at least "+min+
    " characters long; it is currently "+len+" characters long."; return false; }
  if(max > -1 && len > max)
  { licenseFormStatus= "'"+getFieldDescription(fld)+"' must be no more than "+max+
    " characters long; it is currently "+len+" characters long."; return false; }
  return true;
}

function allowChars(fld,chars)
{ // provide a string of acceptable chars for a field
  for(var i= 0; i < fld.value.length; i++)
  {
    if(chars.indexOf(fld.value.charAt(i)) == -1)
    { licenseFormStatus= "'"+getFieldDescription(fld)+"' 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
  for(var i= 0; i < fld.value.length; i++)
  {
    if(chars.indexOf(fld.value.charAt(i)) != -1)
    { licenseFormStatus= "'"+getFieldDescription(fld)+"' may not contain "+fld.value.charAt(i)+" characters."; return false; }
  }
  return true;
}

function checkEmail(fld, val)
{ // simple email check
  if(!fld.value.length && val != 1) return true; // blank fields are the domain of requireValue
  var emailfmt= /^\w+([.-]\w+)*@\w+([.-]\w+)*\.\w{2,8}$/;
  if(!emailfmt.test(fld.value))
  { licenseFormStatus= "'"+getFieldDescription(fld)+"' must contain a valid email address."; return false; }
  return true;
}

function fixInt(fld,val,sep)
{ // integer check/complainer
  //alert(!fld.value.length)
  //alert(val)

  if(!fld.value.length && val != 1) return true; // blank fields are the domain of requireValue

  var val= fld.value;
  if(typeof(sep)!='undefined') val= val.replace(sep,'');
  val= parseInt(val);
  if(isNaN(val))
  { // parse error
    licenseFormStatus= "'" + getFieldDescription(fld) + "' must contain a whole number.";
    return false;
  }
  fld.value= val;
  return true;
}

function fixIntValue(fld,val,sep)
{ // integer check/complainer
  //alert(!fld.value.length)
  //alert(val)

  if(!fld.value.length && val != 1) return true; // blank fields are the domain of requireValue

  var val= fld.value;
  if(typeof(sep)!='undefined') val= val.replace(sep,'');
  val= parseInt(val);
  if(isNaN(val))
  { // parse error
    licenseFormStatus= "'" + getFieldDescription(fld) + "' must contain a whole number.";
    return false;
  }

  var fldRange = (getFieldRangeValue(fld) != 'undefined') ? parseInt(getFieldRangeValue(fld)) : null
  //alert(fldRange)
  if (fldRange != null && !isNaN(fldRange))
  {
    if (parseInt(fld.value) > fldRange)
    {
        licenseFormStatus= "'" + getFieldDescription(fld) + "' cannot be greater than " + fldRange;
        return false;
    }
  }

  fld.value= val;
  return true;
}

function fixIntNoDecimal(fld,val,sep)
{
  if(!fld.value.length && val != 1) return true; // blank fields are the domain of requireValue

  var val= fld.value;
  if(typeof(sep)!='undefined') val= val.replace(sep,'');

  if(isNaN(val) || val.length == 0)
  { // parse error
    licenseFormStatus= "'" + getFieldDescription(fld) + "' must contain a whole number.";
    return false;
  }
  if (val.match(/^[0-9]{1,}$/) == null)
  { // parse error
    licenseFormStatus= "'" + getFieldDescription(fld) + "' must not contain decimal values.";
    return false;
  }
  fld.value= val;
  return true;
}

function fixFloat(fld,val,sep)
{ // decimal number check/complainer
  if(!fld.value.length && val != 1) return true; // blank fields are the domain of requireValue

  var val= fld.value;
  if(typeof(sep)!='undefined') val= val.replace(sep,'');
  val= parseFloat(fld.value);
  if(isNaN(val))
  { // parse error
    licenseFormStatus= "'" + getFieldDescription(fld) + "' must contain a number.";
    return false;
  }
  fld.value= val;
  return true;
}

function fixMoney(fld,sep)
{ // monetary field check
  if(!fld.value.length) return true; // blank fields are the domain of requireValue
  var val= fld.value;
  if(typeof(sep)!='undefined') val= val.replace(sep,'');
  if(val.indexOf('$') == 0)
    val= parseFloat(val.substring(1,40));
  else
    val= parseFloat(val);
  if(isNaN(val))
  { // parse error
    licenseFormStatus= "'" + getFieldDescription(fld) + "' 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) return true; // blank fields are the domain of requireValue
  var val= fld.value;
  if(typeof(sep)!='undefined') val= val.replace(sep,'');
  val= parseFloat(fld.value);
  if(isNaN(val))
  { // parse error
    licenseFormStatus= "'" + getFieldDescription(fld) + "' 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 fixDate(fld)
{ // tenacious date correction
  if(!fld.value.length) 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
    licenseFormStatus= "'" + getFieldDescription(fld) + "' has the wrong date.";
    return false;
  }

  fld.value= (dt.getMonth() < 9 ? "0" + (dt.getMonth()+1) : dt.getMonth()) + '/' +
             (dt.getDate() < 9 ? "0" + dt.getDate() : dt.getDate()) + '/' + dt.getFullYear();
  if(dt.getFullYear() < 1900)
  {
    licenseFormStatus = "'" + getFieldDescription(fld) + "' cannnot be earlier than 1900.";
    return false;
  }
  return true;
}

function fixRecentDate(fld,minyear)
{ // tenacious date correction
  if(!fld.value.length) 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
    licenseFormStatus= "'" + getFieldDescription(fld) + "' 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) 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
    licenseFormStatus= "'" + getFieldDescription(fld) + "' has the wrong time.";
    return false;
  }
  fld.value= hour + ':' + mins + ampm;
  return true;
}

function fixTime24(fld)
{ // tenacious time correction
  if(!fld.value.length) 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)
{ // tenacious phone # correction
  if(!fld.value.length) return true; // blank fields are the domain of requireValue
  if(typeof(sep)=='undefined') sep= '-';
  if(typeof(defaultAreaCode)!='undefined') defaultAreaCode= defaultAreaCode + sep;

  var val= fld.value.replace(/\D/g,'');
  if(val.length == 7)
  {
    fld.value= defaultAreaCode + val.substring(0,3) + sep + val.substring(3,20);
    return true;
  }
  if(val.length == 10)
  {
    fld.value= val.substring(0,3) + sep + val.substring(3,6) + sep + val.substring(6,20);
    return true;
  }
  if(val.length < 7)
  {
    licenseFormStatus= "The phone number you supplied for the '" + getFieldDescription(fld) + "' was too short.";
    return false;
  }
  if(val.length > 10)
  {
    licenseFormStatus= "The phone number you supplied for the '" + getFieldDescription(fld) + "' was too long.";
    return false;
  }
  licenseFormStatus= "The phone number you supplied for the '" + getFieldDescription(fld) + "' 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) return true; // blank fields are the domain of requireValue
  var val= fld.value;
  val= val.replace(/\D/g,'');
  if( val.length < 9 )
  {
    licenseFormStatus= 'The Social Security Number you provided is not long enough.';
    return false;
  }
  if( val.length > 9 )
  {
    licenseFormStatus= '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) return true; // blank fields are the domain of requireValue
  var val= fld.value;
  val= val.replace(/\D/g,'');
  if( val.length < 13 )
  {
    licenseFormStatus= 'The credit card number you provided is not long enough.';
    return false;
  }
  if( val.length > 19 )
  {
    licenseFormStatus= 'The credit card number you provided is too long.';
    return false;
  }
  var sum= 0;
  for(var i= 0; i < val.length; i++)
  {
    var digit= parseInt(val.charAt(i))*(i%2?1:2);
    sum+= ( digit > 9 ? (digit%10)+1 : digit );
  }
  if(sum%10)
  {
    licenseFormStatus= 'The credit card number you provided is invalid.\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 ' + el.name + ' cannot be left blank.'); el.focus(); return false; }
      if(nameContains(el.name,'Date') && !fixDate(el))
      { alert(licenseFormStatus); el.focus(); return false; }
      if(nameContains(el.name,'Time24') && !fixTime24(el))
      { alert(licenseFormStatus); el.focus(); return false; }
      if(nameContains(el.name,'Time') && !fixTime(el))
      { alert(licenseFormStatus); el.focus(); return false; }
      if(nameContains(el.name,'SSN') && !fixSSN(el))
      { alert(licenseFormStatus); el.focus(); return false; }
      if(nameContains(el.name,'CC') && !fixCreditCard(el))
      { alert(licenseFormStatus); el.focus(); return false; }
      if(nameContains(el.name,'Email') && !checkEmail(el))
      { alert(licenseFormStatus); el.focus(); return false; }
      if( ( nameContains(el.name,'Phone') ||
        nameContains(el.name,'Fax') ||
        nameContains(el.name,'Pager') ) &&
        !fixPhone(el))
      { alert(licenseFormStatus); 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(licenseFormStatus); 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(licenseFormStatus); el.focus(); return false; }
    else if(el.type == 'radio' && !requireRadio(frm[el.name]))
    { alert(licenseFormStatus); 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
  //alert(" elem = " + elem.name + ", clas = " + elem.className)
  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.name == "_3_4")
//alert(el.name + " = " + el.className + " = " + el.type + " = " + (isMemberOf(el,'daterequired') && !fixDate(el)))
  if(isMemberOf(el,'dependent') && !requireDependentValue(el)) return false;
  if(el.type == 'text' || el.type == 'password' || el.type == "file" || el.type == "textarea")
  { // text fields
    if(isMemberOf(el,'required') && !requireValue(el)) return false;
    //if(isMemberOf(el,'date') && !fixDate(el)) return false;
    //if(isMemberOf(el,'daterequired') && !fixDate(el)) return false;
    if(isMemberOf(el,'date') && !isDate(el)) return false;
    if(isMemberOf(el,'daterequired') && !isReqDate(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,'intRequired') && !fixInt(el,1)) return false;
    if(isMemberOf(el,'intRequiredValue') && !fixIntValue(el)) return false;
    if(isMemberOf(el,'intRequiredNoDecimal') && !fixIntNoDecimal(el,1)) return false;
    if(isMemberOf(el,'float') && !fixFloat(el)) return false;
    if(isMemberOf(el,'floatRequired') && !fixFloat(el,1)) return false;
    if(isMemberOf(el,'email') && !checkEmail(el)) return false;
    if(isMemberOf(el,'emailRequired') && !checkEmail(el,1)) return false;
    if(isMemberOf(el,'zip') && !isZipCode(el)) return false;
    //alert(el.name)
    //alert(isMemberOf(el,'groupElement'))
    //alert(isMemberOf(!fnGroupCheck(el.form, 1)))
    if(isMemberOf(el,'groupElement') && !fnGroupCheck(el.form, 1)) return false;

    if(!ignoreClass)
    {
        if (isMemberOf(el,'requiredDialog') && !requireValue(el)) return false;
        if (isMemberOf(el,'intRequiredDialog') && !fixInt(el,1)) return false;
        if (isMemberOf(el,'intRequiredValueDialog') && !fixIntValue(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') && !isMemberOf(el,'required') && el.selectedIndex == 0) return false;
  else if(el.type.substring(0,3) == 'sel' &&
    isMemberOf(el,'selrequired') && el.selectedIndex == 0) return false;
  else if(!ignoreClass && el.type.substring(0,3) == 'sel' &&
    isMemberOf(el,'selrequiredDialog') && el.selectedIndex == 0) return false;
    //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;
    //alert(el.name)
    if(el.type == 'radio' && isMemberOf(el,'required') && !requireRadio(frm[el.name]))
    { alert(licenseFormStatus); frm.elements[index].focus(); return false; }
    if(el.type.substring(0,3) == 'sel' && !checkClass(el) && !requireSelectValue(el,0))
    { alert(licenseFormStatus); frm.elements[index].focus(); return false; }
    else if(!checkClass(frm.elements[index]) && (isMemberOf(el,'daterequired') || isMemberOf(el,'date') ))
    { if (frm.elements[index].style.display != "none") frm.elements[index].focus(); return false; }
    else if(!checkClass(frm.elements[index]) )
    { alert(licenseFormStatus); if (frm.elements[index].style.display != "none") 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 checkFld(el, classNme)
{
  if(el.type == 'text' || el.type == 'password' || el.type == "file")
  {
    if(classNme == 'req'    && !requireValue(el)) return false;
    if(classNme == 'dat'    && !fixDate(el)) return false;
    if(classNme == 'tim'    && !fixTime(el)) return false;
    if(classNme == 't24'    && !fixTime24(el)) return false;
    if(classNme == 'ssn'    && !fixSSN(el)) return false;
    if(classNme == 'ccc'    && !fixCreditCard(el)) return false;
    if(classNme == 'phn'    && !fixPhone(el)) return false;
    if(classNme == 'mon'    && !fixMoney(el)) return false;
    if(classNme == 'int'    && !fixInt(el)) return false;
    if(classNme == 'flt'    && !fixFloat(el)) return false;
    if(classNme == 'eml'    && !checkEmail(el)) return false;
  }
  else if(el.type == 'checkbox' && classNme == 'required' && !requireChecked(el)) return false;
  else if(el.type.substring(0,3) == 'sel' && classNme == 'required' && el.selectedIndex == 0) return false;
  return true;
}

function fnGroupCheck(frm, val)
{
    var arr = new Array()
    var iCtr = 0
    for(var index= 0; index < frm.elements.length; index++)
    {
        if(frm.elements[index].gId != null && frm.elements[index].gId != '' && frm.elements[index].gId != 'undefined')
        {
            //alert(frm.elements[index].name)
            arr[iCtr] = frm.elements[index]
            if (arr[iCtr].type == 'text')
                arr[iCtr].className = "InputText groupElement"
            else if (arr[iCtr].type.substring(0,3) == 'sel')
                arr[iCtr].className = "selectbox groupElement"
            iCtr++
        }
    }
    //alert(iCtr)
    if (val == 1)
    {
        for(j = 0; j < iCtr; j++)
        {
            if(arr[j].gId != null && arr[j].gId != '' && arr[j].gId != 'undefined')
            {
                for (k = (j+1); k < iCtr; k++)
                {
                    //alert("k = " + arr[k].name + " and j = " + arr[j].name + " and k = " + k + " and j = " + j + " and jObj = " + arr[j].name)
                    if (arr[k].gId == arr[j].gId)
                    {
                        if (!arr[k].value.length && !arr[j].value.length)
                        {
                            //alert("inside")
                            licenseFormStatus = 'Both ' + getFieldDescription(arr[j]) + " and " + getFieldDescription(arr[k]) + " cannnot be left blank. Give value for either of them"
                            return false
                        }
                    }
                }
            }
        }
    }
    return true
}

function autocheckByBlur(frm)
{ // uses the onBlur handler of form elements to check value
  licenseFormStatus= '';
  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(licenseFormStatus); frm.elements[index].focus(); return false; }
    else if(el.type != 'hidden' && el.name && el.onblur)
    {
      el.onblur();
      if(licenseFormStatus) { alert(licenseFormStatus); 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 autocheck(frm)
{ // uses the best available method to check form values
  var bchar= navigator.appName.substring(0,1);
  if(isMemberOf(frm,'autocheck'))
  { alert("1"); return autocheckByClass(frm); }
  else if(canCheckByBlur(frm))
  { alert("2"); return autocheckByBlur(frm); }
  else
  { alert("3"); return autocheckByName(frm); }
}

function isArray(obj){return(typeof(obj.length)=="undefined")?false:true;}

function removeSpaces() {
  // remove all spaces from aText text field
  // and place the result into the right text field
  //document.aForm.aTextWithNoSpaces.value =
  //      document.aForm.aText.value.replace(/ /g, "");
} // removeSpaces


/////////////////////////////////////////////////////////////////////////////////////////
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 isReqDate(dtObj, obj)
{
    var dtStr = dtObj.value
    if (!eval(obj)) obj = dtObj

    var bReturnVal = true;
    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 for '" + getFieldDescription(dtObj) + "'")
        if (dtObj.style.display == "none") document.all.item("date_" + dtObj.name + "_day").focus();
        bReturnVal = false
    }
    else if (strMonth.length<1 || month<1 || month>12){
        alert("Please enter a valid month for '" + getFieldDescription(dtObj) + "'")
        if (dtObj.style.display == "none") document.all.item("date_" + dtObj.name + "_month").focus();
        bReturnVal = false
    }
    else if (strDay.length<1 || day<1 || day>31 || (month==2 && day>daysInFebruary(year)) || day > daysInMonth[month]){
        alert("Please enter a valid day for '" + getFieldDescription(dtObj) + "'")
        if (dtObj.style.display == "none") document.all.item("date_" + dtObj.name + "_day").focus();
        bReturnVal = false
    }
    else if (strYear.length != 4 || year==0 || year<minYear || year>maxYear){
        alert("Please enter a valid 4 digit year between "+minYear+" and "+maxYear + " for '" + getFieldDescription(dtObj) + "'")
        if (dtObj.style.display == "none") document.all.item("date_" + dtObj.name + "_year").focus();
        bReturnVal = false
    }
    else if (dtStr.indexOf(dtCh,pos2+1)!=-1 || isInteger(stripCharsInBag(dtStr, dtCh))==false){
        alert("Please enter a valid date for '" + getFieldDescription(dtObj) + "'")
        if (dtObj.style.display == "none") document.all.item("date_" + dtObj.name + "_day").focus();
        bReturnVal = false
    }
    if (!bReturnVal)
    {
        if (dtObj.style.display == "none")
        {
            dtObj.value = "";
            document.all.item("date_" + dtObj.name + "_day").focus();
        }
        else
        {
            bReturnVal = true
        }
    }
    return bReturnVal
}

function isDate(dtObj, obj)
{
    var dtStr = dtObj.value
    if (!eval(obj)) obj = dtObj

    if (dtObj.style.display == "none" && document.all.item("date_" + dtObj.name + "_year").value == "")
    {
        dtObj.value = ""
        return true
    }
    return isReqDate(dtObj, obj)

}

function ValidateForm(obj, btnObj)
{
    fnGroupCheck(obj, 0)
    if (autocheckByClass(obj) == false) return false;
        obj.submit();

    if (btnObj != null && typeof(btnObj) == "object")
        btnObj.disabled = true
    /*
    for (j = 0; j < frmAdditionalAttributes.elements.length; j++)
    {
        if (frmAdditionalAttributes.elements[j].aType == 5)
        {
            if (isDate(frmAdditionalAttributes.elements[j].value)==false)
            {
                frmAdditionalAttributes.elements[j].focus()
                return false
            }
        }
    }
    //return false
    frmAdditionalAttributes.submit()
    */

 }

function fnCheckBox(obj)
{
    nam = obj.name
    //hidObj = document.all.item("chktxt_" + nam.substring(nam.length - ("chkbox_").length-1))
    //hidObj = document.all.item(nam.replace("chkbox", "chktxt"))
    hidObj = document.all.item(nam.replace("chkbox_", ""))
    if (obj.checked) hidObj.value = obj.value
    else hidObj.value = ""
}

function Left(str, n)
/***
        IN: str - the string we are LEFTing
            n - the number of characters we want to return

        RETVAL: n characters from the left side of the string
***/
{
        if (n <= 0)     // Invalid bound, return blank string
                return "";
        else if (n > String(str).length)   // Invalid bound, return
                return str;                // entire string
        else // Valid bound, return appropriate substring
                return String(str).substring(0,n);
}

function Right(str, n)
/***
        IN: str - the string we are RIGHTing
            n - the number of characters we want to return

        RETVAL: n characters from the right side of the string
***/
{
        if (n <= 0)     // Invalid bound, return blank string
           return "";
        else if (n > String(str).length)   // Invalid bound, return
           return str;                     // entire string
        else { // Valid bound, return appropriate substring
           var iLen = String(str).length;
           return String(str).substring(iLen, iLen - n);
        }
}

function Mid(str, start, len)
/***
        IN: str - the string we are LEFTing
            start - our string's starting position (0 based!!)
            len - how many characters from start we want to get

        RETVAL: The substring from start to start+len
***/
{
        // Make sure start and len are within proper bounds
        if (start < 0 || len < 0) return "";

        var iEnd, iLen = String(str).length;
        if (start + len > iLen)
                iEnd = iLen;
        else
                iEnd = start + len;

        return String(str).substring(start,iEnd);
}

function LTrim(str)
{
if (str==null){return null;}
for(var ctr=0;str.charAt(ctr)==" ";ctr++);
return str.substring(ctr,str.length);
}

function RTrim(str){
if (str==null){return null;}
for(var ctr=str.length-1;str.charAt(ctr)==" ";ctr--);
return str.substring(0,ctr+1);
}

function Trim(str){return LTrim(RTrim(str));}

function returnSelectedValue(obj, val)
{
    if(isArray(obj))
    {
        for (i = 0; i < obj.length; i++)
        {
            if (obj[i].checked)
            {
                return obj[i].value;
            }
        }
    }
    else return val;
}

function setSelectedValue(obj, val, valClause)
{
    var selval = "";

    //alert(obj.type.substring(0,3) + " and " + obj.name)
    if (obj.type.substring(0,3) == 'sel')
    {
        for (j = 0; j < obj.options.length; j++)
        {
            if (valClause == 1) selval = obj.options[j].text.toUpperCase()
            else selval = obj.options[j].value.toUpperCase()
            //alert(selval + "=="+ val)
            if (selval == val.toUpperCase())
            {
                obj.options[j].selected = true
                return true;
            }
        }
    }
}

function startsWith(str, prefix)
{
    len = prefix.length;
    foo = str.substring(0,len);
    return (foo.toUpperCase() == prefix.toUpperCase());
}

function fnRadio(obj)
{
    nam = obj.name
    //hidObj = document.all.item("radtxt_" + nam.substring(nam.length - ("radbtn_").length-1))
    //hidObj = document.all.item(nam.replace("radbtn", "radtxt"))
    hidObj = document.all.item(nam.replace("radbtn_", ""))
    if (obj.checked) hidObj.value = obj.value
    else hidObj.value = ""
}


// NOTE: This function is used in other flows like schedule request jsp page also
function validateLicensePaymentFields(inForm)
{
    if(bCreditCardChoosen)
    {
        return validateCreditCard();
    }
    else if(bOtherPaymentModeChoosen)
    {
        if (inForm.payment_mode)
        {
            if (trim(inForm.payment_mode.value) == '')
            {
                alert('Select a Payment mode');
                return false;
            }
            return true;
        }
    }
    // We never fall into this else block. If this block is executed means
    // there is some problem in rendering of page
    alert('Select a Payment mode');
    return false;
}

function validateLicensePaymentDuringUpdate(inForm, bPaymentCompleted)
{
    bSubmit = false;
    var bNoValidationErrors = true;
    var bWaiveFee;
    if(bPaymentCompleted == false && inForm.payment_received)
    {
        // We have to check only if payment received check box is cliced and also only if payment done is false
        if(bPaymentCompleted == false && inForm.payment_received.checked == true)
        {
            // Now check for waive fee First check what is the amount received
            if(inForm.amount_received && bNoValidationErrors)
            {
                if(trim(inForm.amount_received.value) == '')
                {
                    alert('You must enter how much amount is received');
                    return false;
                }
                // START CHECK WHETHER NUMBERS ENTERED OR NOT
                if(isNotNumeric(trim(inForm.amount_received.value)))
                {
                    alert('You can enter only numbers in Amount Received field');
                    return false;
                }
                if (parseFloat(trim(inForm.amount_received.value)) > parseFloat(trim(inForm.total_amount.value)))
                {
                    alert('You cannot enter Amount more than '+formatToDecimal(trim(inForm.total_amount.value), 2));
                    return false;
                }
                // END CHECK WHETHER NUMBERS ENTERED OR NOT

                /*This is to check whehter amount received is less than the total amount*/
                if(parseFloat(trim(inForm.amount_received.value)) < parseFloat(trim(inForm.total_amount.value)))
                {
                    bWaiveFee = confirm('Amount received is less than the total amount that needs to be paid.' +
                    ' Due is $' + (inForm.total_amount.value - inForm.amount_received.value)
                    + '. Do you want to waive the fee?');
                    if(bWaiveFee == false)
                    {
                        if(inForm.is_fee_amount_waived)
                        {
                            inForm.is_fee_amount_waived.value = "false";
                        }
                        amount_waived_id.innerText = "0.00";
                        if(inForm.amount_waived)
                        {
                            inForm.amount_waived.value = 0.00;
                        }
                        return false;
                    }
                }
                else
                {
                    if(inForm.is_fee_amount_waived)
                    {
                        inForm.is_fee_amount_waived.value = "false";
                    }
                    amount_waived_id.innerText = "0.00";
                    if(inForm.amount_waived)
                    {
                        inForm.amount_waived.value = 0.00;
                    }
                }
            }
            if(bWaiveFee)
            {
                dCalculatedWaivedFeeAmount  =
                    parseFloat(trim(inForm.total_amount.value)) - parseFloat(trim(inForm.amount_received.value));

                c = dCalculatedWaivedFeeAmount;
                amount_waived_id.innerText = dCalculatedWaivedFeeAmount;

                if(inForm.is_fee_amount_waived)
                {
                    inForm.is_fee_amount_waived.value = "true";
                }
                if(inForm.amount_waived)
                {
                    inForm.amount_waived.value = dCalculatedWaivedFeeAmount;
                }

                bNoValidationErrors = true;
            }
            //******************
            // assign this to submit form. This is straight forward and we can eliminate  if-else blocks
            bSubmit= bNoValidationErrors;
            bPaymentCompleted = bSubmit;
        }
        else
        {
            bSubmit = true;
        }
    }
    else
    {
        bSubmit= true;
        bPaymentCompleted = true;
    }
    return bSubmit;
}

function isZipCode(obj)
{
    var objChar = /^[0-9\-]{1,9}$/;
    if (obj.value.match(objChar) == null)
    {
        licenseFormStatus= 'Please provide a valid zip code';
        return false;
    }
    return (true)
}

function isEmpty(s)
{
    return ((s == null) || (s.length == 0))
}

function isValidDate(m, d, y, bStartWithZero)
{
    var retStat = ""
    month=parseInt(m.value) + (bStartWithZero ? 1 : 0)
    day=parseInt(d.value)
    year=parseInt(y.value)

    var daysInMonth = DaysArray(12)

    if (m.value.length<1 || month<1 || month>12)
        retStat = "Please enter a valid month"
    else if (d.value.length<1 || day<1 || day>31 || (month==2 && day>daysInFebruary(year)) || day > daysInMonth[month])
        retStat = "Please enter a valid day"
    else if (y.value.length != 4 || year==0 || year<minYear || year>maxYear)
        retStat = "Please enter a valid 4 digit year between "+minYear+" and "+maxYear

    return retStat
}

function compareDates(arr)
{
    var retStat = ""
    if (arr.length == 0) return true;
    else if (arr.length != 6)
    {
        return false
    }

    retStat = isValidDate(arr[0], arr[1], arr[2], (parseInt(arr[0].options[0].value) == 0 || parseInt(arr[0].options[1].value) == 0))
    if (retStat != "")
    {
        alert(retStat)
        retStat.indexOf("month") != -1 ? arr[0].focus() : (retStat.indexOf("year") != -1 ? arr[2].focus() : arr[1].focus())
        return false
    }
    retStat = isValidDate(arr[3], arr[4], arr[5], (parseInt(arr[3].options[0].value) == 0 || parseInt(arr[3].options[1].value) == 0))
    if (retStat != "")
    {
        alert(retStat)
        retStat.indexOf("month") != -1 ? arr[3].focus() : (retStat.indexOf("year") != -1 ? arr[5].focus() : arr[4].focus())
        return false
    }
    startVal = "" + arr[2].value + "" + (arr[0].value.length == 1 ? "0" + arr[0].value : arr[0].value) + "" +
                                        (arr[1].value.length == 1 ? "0" + arr[1].value : arr[1].value)
    endVal   = "" + arr[5].value + "" + (arr[3].value.length == 1 ? "0" + arr[3].value : arr[3].value) + "" +
                                        (arr[4].value.length == 1 ? "0" + arr[4].value : arr[4].value)

    //alert("startVal = " + startVal + " and emdVal = " + endVal )
    if (startVal > endVal)
    {
        alert("Start date cannot be greater than End date")
        return false;
    }
    return true;
}

function isObjEmpty(s, alertMessage)
{
    if (s.value == null || Trim(s.value).length == 0)
    {
        if (alertMessage != null && alertMessage != "")
            alert(alertMessage);
        s.value = "";
        s.focus();
        return true;
    }
    return false;
}

function formatToDecimal(number,X)
{
    // rounds number to X decimal places, defaults to 2
    X = (!X ? 2 : X);
    //return (Math.round(number*Math.pow(10,X))/Math.pow(10,X)).toFixed(X);

    //if (parseFloat(navigator.userAgent.substr(navigator.userAgent.indexOf("MSIE ")+("MSIE ").length, 4)) >= 5.5)
    //    return (Math.round(number*Math.pow(10,X))/Math.pow(10,X)).toFixed(X);
    //else
        return toFixedDecimal(Math.round(number*Math.pow(10,X))/Math.pow(10,X), X)
}

function pad(s)
{
    s=s||'.';
    return (s.length>n) ? s: pad(s + '0');
}

function toFixedDecimal(num, digits)
{
    if (digits == null) digits = 2;
    var T, S=new String(Math.round(num * Math.pow(10, digits)))
    while (S.length<digits) S='0'+S
    return S.substr(0, T=(S.length-digits)) + '.' + S.substr(T, digits)
}

function getSelectedObject(obj)
{
    var tmpObj = null;
    if (obj && obj.length)
    {
        for (iObjCtr = 0; iObjCtr < obj.length; iObjCtr++)
        {
            if (obj[iObjCtr].checked)
            {
                tmpObj = obj[iObjCtr]
                break;
            }
        }
    }
    else if (obj)
        tmpObj = obj.checked ? obj : tmpObj

    return tmpObj
}

function selectArrayElement(obj)
{
    if (obj.length) obj = obj[0];
    return obj;
}

function fnOnMouseOver(obj)
{
}

function fnOnMouseOut(obj)
{
}

function checkDates(value1,value2)
{
	var date1 = new Date(value1);
	var date2 = new Date(value2);

	return date1 - date2;
}

// this is to validate for the length of textarea
function checkLength(obj, mLength)
{
	if (obj.value.length > mLength) obj.value = obj.value.substring(0, mLength);
    return true;
}

function validateDateWithCurrentDate(dateValue)
{

    // Parse Input and Current Dates

	var year =0;
	var month=0;
	var day=0;
	var inputDateVar = dateValue.split("/");

	month = inputDateVar[0];
	day = inputDateVar[1];
	year = inputDateVar[2];

	var inputDate =new Date(year, (month-1),day);

    var one_day=1000*60*60*24;

	var today = new Date();
	var iDiffExpirationNToday = Math.ceil((inputDate.getTime()-today.getTime())/(one_day));

	if(iDiffExpirationNToday >= 0)
    {
        return false;
    }
	return true;
}