function setkey() {
  var d = new Date().getTime();
  $('form input[name=key]').val(d);
}

$(setkey);

function setreqfields(fRef) {
  for (var fIndex = 0; fIndex < required[fRef.name].length; fIndex++) {
    var req = required[fRef.name][fIndex];
    for (var field in req) {
      $(fRef.elements[field]).parent().addClass('required').find('span').append('*');
    }
  }
}

function getfIndex(fRef,aRef) {
  var fieldsets = $('fieldset',fRef).get();
  for (var i = 0; i < fieldsets.length; i++) {
    if (fieldsets[i] == aRef.parentNode) {
      return(i);
      break;
    }
  }
  return(0);
}

function validate(fRef,aRef) {
  var fIndex = (validate.arguments.length > 1)?getfIndex(fRef,aRef):(required[fRef.name].length - 1);
  var req = required[fRef.name][fIndex];
  var reqFields = [];
  var reqFields2 = [];
  $('fieldset:eq('+fIndex+')',fRef).find('label,div,h4').removeClass('fixme');

  for (var field in req) {
//    alert(field+': '+fRef.elements[field].disabled);
// addreport
    if ((fRef.id.match(/^(np|up|vr)Form$/)) && (field.match(/^(make|model|problem|solution)$/))) {
      if ((fRef.elements[field].value == '') && ($('#new'+field+':visible').length == 0)) {
        reqFields.push(field);
      }
    }
    else if (field.match(/^new(make|model|problem|solution)$/)) {
      if ((fRef.elements[field].value == '') && ($('#'+field+':visible').length > 0)) {
        reqFields.push(field);
      }
    }

// moohelpers
    else if ((field == 'good_pgid') && (typeof(fRef.good_pgname) != 'undefined')) {
      if ((fRef.good_pgid.value == '') && (fRef.good_pgname.value == '')) {
        reqFields.push(field);
      }
    }

// general
    else if ((fRef.elements[field].length > 0) && (fRef.elements[field][0].type == 'checkbox')) {
      var onechecked = false;
      for (var i = 0; i < fRef.elements[field].length; i++) {
        if (fRef.elements[field][i].checked) {
          onechecked = true;
          break;
        }
      }
      if (!onechecked) { reqFields.push(field); }
    }
    else if ((fRef.elements[field].disabled != true) && ($('#'+field+':visible').length > 0) && ((fRef.elements[field].value == '') || (fRef.elements[field].value == 'error') || (fRef.elements[field].value.toLowerCase() == req[field].toLowerCase()))) {
      reqFields.push(field);
    }

// addreport
    else if ((field == 'description') && (fRef.description.value.length < 50)) {
      reqFields2.push([field,"Describe the problem in more detail so it's more helpful."]);
    }
    else if ((field == 'dateoccurred') && (!fRef.dateoccurred.value.match(/\d{2}\/\d{2}\/\d{2}/))) {
      reqFields2.push([field,"The date when the problem occurred needs to be in the format MM/DD/YY."]);
    }
    else if (field == 'mileagevalue') {
      if (!checkmileage(fRef.mileagevalue)) {
        var munits = (field == 'mileagevalue')?fRef.mileageunits.value:'mi';
        reqFields2.push([field,"Something is wrong with the mileage of "+fRef.mileagevalue.value+munits+" that you entered."]);
      }
    }
    else if ((field == 'costtofix') && (!checkcosttofix(fRef.costtofix))) {
      reqFields2.push([field,"Something is wrong with the cost to fix you entered - only numbers please, in whole dollars (no decimals)."]);
    }

// newreg & myaccount
    else if ((fRef.elements[field].disabled != true) && (field == 'pw2') && (fRef.pw1.value != fRef.pw2.value)) {
      fRef.pw1.value = '';
      fRef.pw2.value = '';
      fixme('pw1');
      reqFields2.push([field,"Your passwords don\'t match. Please re-enter them."]);
    }

    else if (field == 'email') {
      if (fRef.email.value == 'your@email.address') {
        fRef.email.focus();
        return(false);
      }
      else {
        var bademail = false;
        if (window.RegExp) {
          var reg1 = /(@.*@)|(\.\.)|(@\.)|(\.@)|(^\.)|(\s)/;                         // not valid
          var reg2 = /^.+\@(\[?)[a-zA-Z0-9\-\.]+\.([a-zA-Z]{2,3}|[0-9]{1,3})(\]?)$/; // valid
          if ((reg1.test(fRef.email.value)) || (!reg2.test(fRef.email.value))) { bademail = true; }
        }
        else if ((fRef.email.value.indexOf('@') + '' == '-1') || (fRef.email.value.indexOf('.') + '' == '-1')) { bademail = true; }
        if (bademail) { reqFields2.push([field,"Your email address seems to have something wrong. Please make sure it's correct."]); }
      }
    }

// newreg2
    else if ((field == 'genlogins') && (fRef.genlogins.value == 'newlogin') && (fRef.login.value == '')) {
      reqFields.push(field);
    }
    else if ((field == 'age') && (fRef.age.selectedIndex == 1)) {
      alert("Although we'd love to hear about your complaints, U.S. Federal Law (COPPA) prevents us from obtaining personal information about you. Please ask your parents to register for you.");
      document.location.href = '/';
      return(false);
    }
    else if ((field == 'vehiclesowned') && (fRef.vehiclesowned.options[fRef.vehiclesowned.selectedIndex].value > 0)) {
      var badcar = false;
      for (var k = 1; k <= fRef.vehiclesowned.options[fRef.vehiclesowned.selectedIndex].value; k++) {
        if ((fRef.elements['car'+k+'year'].value == '') || (fRef.elements['car'+k+'make'].value == '') || (fRef.elements['car'+k+'model'].value == '')) {
          badcar = true;
          break;
        }
      }
      if (badcar) {
        $('div.vehicle:visible label:not([id$=trim]) input[value=]',fRef).parent().each(function() { fixme(this.id); });
        reqFields2.push([field,"Complete information for the vehicles you own."]);
      }
    }

  }
  var $fmsg = $('fieldset:eq('+fIndex+') div.fmsg',fRef);
  if ((reqFields.length) || (reqFields2.length)) {
    var rmsg = "Please complete or fix this information: \n\n";
    var schar = ($fmsg.length > 0)?', ':'\n';
    var echar = ($fmsg.length > 0)?'. ':'\n';
    var rchar = ($fmsg.length > 0)?' ':'\n';
    for (var i = 0; i < reqFields.length; i++) {
      fixme(reqFields[i]);
      reqFields[i] = reqFields[i].replace(/^new(make|model|problem|solution)$/,'$1');
      if (i < 5) {
        if (i > 0) { rmsg += schar; }
        rmsg += req[reqFields[i]];
      }
      else if (i == 5) {
        rmsg += schar;
        rmsg += "& other fields outlined in red";
      }
    }
    if (reqFields.length > 0) { rmsg += echar; }
    var flag = (reqFields.length > 0)?true:false;
    if ((flag) && (reqFields2.length > 0)) { rmsg += rchar; }
    for (var i = 0; i < reqFields2.length; i++) {
      if (i > 0) { rmsg += ' '; }
      if (reqFields2[i] != 'vehiclesowned') {
        fixme(reqFields2[i]);
      }
      rmsg += secondly(flag,reqFields2[i][1]);
      if (!i) { flag = false; }
    }
    rmsg += rchar+'Thanks!';
    if ($fmsg.length > 0) {
      $fmsg.slideUp(300,function() {
        if ($.scrollTo) { $.scrollTo(fRef,{duration:300,onAfter:function() {
          $fmsg.html('<p>'+rmsg+'</p>').addClass('required').slideDown(300);
        }}); }
        else {
          $fmsg.html('<p>'+rmsg+'</p>').addClass('required').slideDown(300);
        }
      });
    }
    else { alert(rmsg); }
    return(false);
  }
  else {
    if ($fmsg.length > 0) { $fmsg.slideUp(300); }
    if ((fRef.name == 'lpForm') || (fRef.name == 'llForm')) {
      refreshlostbox('hidden');
    }
    return(true);
  }
}

function secondly(flag,msg) {
  return((flag === false)?msg:'Also, '+msg.charAt(0).toLowerCase()+msg.substring(1,msg.length));
}

function fixme(field) {
  if (!$('#'+field).length) {
    $('input[name='+field+'],select[name='+field+'],textarea[name='+field+']').parent().addClass('fixme');
  }
  else {
    var h4s = $('#'+field).addClass('fixme').parent().find('h4');
    if (h4s.length == 0) { h4s = $('#'+field).parent().parent().find('h4'); }
    h4s.addClass('fixme');
  }
}

function switchfieldset(fRef,aRef,offset) {
  var fIndex = getfIndex(fRef,aRef);
  if (jQuery.browser.msie) {
    $('fieldset:eq('+fIndex+')',fRef).hide();
    $('fieldset:eq('+(fIndex+offset)+')',fRef).show();
  }
  else {
    $('fieldset:eq('+fIndex+')',fRef).fadeOut('slow',function() {
      $('fieldset:eq('+(fIndex+offset)+')',fRef).fadeIn('slow');
    });
  }
  return(true);
}

function checkimage(iRef) {
  if (!iRef.value.match(/\.(gif|png|jpe?g)/i)) {
    iRef.value = '';
    return(false);
  }
  else { return(true); }
}

function checkmileage(mileageRef,munits) {
  mileageRef.value = mileageRef.value.replace(/\.\d{2}$/,'');
  if (mileageRef.value.match(/[^\d,]/i)) {
    return(false);
  }
  else {
    mileageRef.value = commadelineate(mileageRef.value.replace(/k$/i,'000').replace(/\D/g,''));
    return(true);
  }
}

function checkmileagerange(miles,age) {
  var mileagemin = ((((age <= 0)?1:age) - 1) * 4000);
  var mileagemax = ((((age <= 0)?1:age) + 1) * 50000);
  var mok = false;
  var msg = '';
  if (miles > mileagemax) { msg = 'high'; }
  else if (miles < mileagemin) { msg = 'low'; }
  else { mok = true; }
  return([mok,msg]);
}

function checkcosttofix(costRef) {
  costRef.value = costRef.value.replace(/,/g,'').replace(/\.\d{2}$/,'');
  if ((costRef.value == '[warranty]') || (costRef.value == '[exwarranty]') || (costRef.value == '[not fixed]') || (costRef.value == '[not sure]')) {
    return(true);
  }
  else if (costRef.value.match(/\D/)) {
    return(false);
  }
  else if (costRef.value != '') {
    costRef.value = commadelineate(Math.round(costRef.value));
    return(true);
  }
  else { return(true); }
}

function formatspaces(messystr) {
  return(messystr.replace(/^[ \r\n]+/,'').replace(/[ \r\n]+$/,'').replace(/ {2,}/g,' '));
}

// short mode for make,model,trim & state - capitalize short items
function formattext(strRef,loose) {
  strRef.value = formatspaces(strRef.value);
  if ((loose) && (!strRef.value.match(/[a-z]{4}\b/i)) &&
      (!strRef.value.match(/4x4|Fox|Geo|Kia|Ram|Rio|Ion|Vue/i)) &&    // exceptions
      (!strRef.value.match(/\d{3}[sc]*i/))                        // special case for BMW models
    ) {
    strRef.value = strRef.value.toUpperCase().replace(/\.$/,'');
  }
  else {
    if (strRef.value.toUpperCase() == strRef.value) { strRef.value = strRef.value.toLowerCase(); }
      for (i = 0; i < strRef.value.length; i++) {
        if ((((i-1) < 0) || (strRef.value.charAt(i-1) == ' ') || (strRef.value.charAt(i-1) == '.')) &&
            ((!strRef.value.substring(i,(i+3)).match(/(de )|(la )/gi)) &&
             (!strRef.value.substring(i,(i+4)).match(/(van )/gi)))) {
          strRef.value = strRef.value.substring(0,i) + strRef.value.charAt(i).toUpperCase() + strRef.value.substr((i + 1),strRef.value.length);
        }
    }
  }
}

function formatemail(emailRef) {
  emailRef.value = emailRef.value.replace(/\s/g,'').replace(/\,/g,'.').replace(/\#/g,'@').replace(/\.+/g,'.');
}

function commadelineate(cdata) {
  cdata = cdata.toString().replace(/\D/g,'');
  var cdataln = parseInt((cdata.length - 1) / 3);
  for (i = 0; i < cdataln; i++) {
    cdata = cdata.substr(0,(cdata.length - ((i + 1) * 3) - i)) + ',' + cdata.substr((cdata.length - ((i + 1) * 3) - i),cdata.length);
  }
  return(cdata);
}

function centuryfix(syear) {
  var cyear = new Date().getFullYear();
  var century = parseFloat(cyear.toString().substr(0,2));
  var prefix = (parseFloat(syear) > parseFloat(cyear.toString().substr(2,2)))?(century - 1):century;
  return(prefix.toString() + syear);
}
