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 = [];
  $('label,div',fRef).removeClass('fixme');

  for (var field in req) {

    if ((fRef.elements[field].value == '') || (fRef.elements[field].value == 'error')) {
      reqFields.push(field);
    }
    else if (((field == 'email') && (!checkemail(fRef.elements[field]))) ||
             ((field == 'phone') && (fieldRef.value.replace(/\D/g,'').length < 10))) {
      reqFields2.push(field);
    }
  }
  var $fmsg = $('.fmsg',fRef);
  if ((reqFields.length) || (reqFields2.length)) {
    var rmsg = "Please complete/fix these form fields: \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 > 0) { rmsg += schar; }
      rmsg += req[reqFields[i]];
    }
    var flag = (reqFields.length > 0)?true:false;
    if ((flag) && (reqFields2.length > 0)) { rmsg += echar+rchar+rchar; }
    for (var i = 0; i < reqFields2.length; i++) {
      fixme(reqFields2[i]);
      if (i > 0) { rmsg += '. '; }
      if (reqFields2[i] == 'email') { rmsg += secondly(flag,"Your email address appears to have a mistake.\nPlease make sure it's correct"); }
      else if (reqFields2[i] == 'phone') { rmsg += secondly(flag,"Please provide your full phone number with area code"); }
      if (!i) { flag = false; }
    }
    rmsg += echar+rchar+'Thank you.';
    if ($fmsg.length > 0) {
      $fmsg.slideUp(300,function() {
        $(this).html('<p>'+rmsg+'</p>').addClass('required').slideDown(300);
      });
    }
    else { alert(rmsg); }
    return(false);
  }
  else {
    if ($fmsg.length > 0) { $fmsg.slideUp(300); }
    return(true);
  }
}

function checkemail(emailRef) {
//  if (emailRef.value.match(/(\s|\#|,|\.{2})/)) {
//    emailRef.value = emailRef.value.replace(/\s/g,'').replace(/\#/g,'@').replace(/,/g,'.').replace(/\.{2}/g,'.');
//  }
  var reg1 = /(@.*@)|(\.\.)|(@\.)|(\.@)|(^\.)|(\s)/;                         // not valid
  var reg2 = /^.+\@(\[?)[a-zA-Z0-9\-\.]+\.([a-zA-Z]{2,3}|[0-9]{1,3})(\]?)$/; // valid

  var validemail = true;
  if (reg1.test(emailRef.value) || !reg2.test(emailRef.value)) {
    validemail = false;
  }
  return(validemail);
}

function commadelineate(cdata) {
  var cdataln = parseInt((cdata.length - 1) / 3); // needed so it doesn't update dynamically
  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 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() {
//      window.scrollTo(0,0);
      $('fieldset:eq('+(fIndex+offset)+')',fRef).fadeIn('slow');
    });
  }
  return(true);
}

function fixme(field) {
  $('input[name='+field+'],select[name='+field+'],textarea[name='+field+']').parent().addClass('fixme');
}
