var nbsp = 160;		// non-breaking space char
var node_text = 3;	// DOM text node-type
var emptyString = /^\s*$/ ;
var global_valfield;	// retain valfield for timer thread

// --------------------------------------------
//                  trim
// Trim leading/trailing whitespace off string
// --------------------------------------------

function trim(str)
{
	if(str)
	  return str.replace(/^\s+|\s+$/g, '');
}


// --------------------------------------------
//                  setfocus
// Delayed focus setting to get around IE bug
// --------------------------------------------

function setFocusDelayed()
{
  global_valfield.focus();
  if(window.scrollBy)
  	window.scrollBy(0,-1);
}

function setfocus(valfield)
{
  // save valfield in global variable so value retained when routine exits
  global_valfield = valfield;
  setTimeout( 'setFocusDelayed()', 100 );
}


// --------------------------------------------
//                  msg
// Display warn/error message in HTML element.
// commonCheck routine must have previously been called
// --------------------------------------------

function msg(fld,     // id of element to display message in
             msgtype, // class to give element ("warn" or "error")
             message) // string to display
{
  // setting an empty string can give problems if later set to a 
  // non-empty string, so ensure a space present. (For Mozilla and Opera one could 
  // simply use a space, but IE demands something more, like a non-breaking space.)
  var dispmessage;
  if (emptyString.test(message)) 
    dispmessage = String.fromCharCode(nbsp);    
  else  
    dispmessage = message;

  var elem = document.getElementById(fld);
//  elem.firstChild.nodeValue = dispmessage;  
  
  elem.className = msgtype;   // set the CSS class to adjust appearance of message
}

// --------------------------------------------
//            commonCheck
// Common code for all validation routines to:
// (a) check for older / less-equipped browsers
// (b) check if empty fields are required
// Returns true (validation passed), 
//         false (validation failed) or 
//         proceed (don't know yet)
// --------------------------------------------

var proceed = 2;  

function commonCheck    (valfield,   // element to be validated
                         infofield,  // id of element to receive info/error msg
                         required)   // true if required
{
  if (!document.getElementById) 
    return true;  // not available on this browser - leave validation to the server
  //alert(infofield);
  var elem = document.getElementById(infofield);
  if (!elem.firstChild) return true;  // not available on this browser 
  //if (elem.firstChild.nodeType != node_text) return true;  // infofield is wrong type of node  

  if (emptyString.test(valfield.value)) {
    if (required) {
      msg (infofield, "error", "  ERROR: Required"); 
      setfocus(valfield);
      return false;
    }
    else {
      msg (infofield, "warn", "");   // OK
      return true;  
    }
  }
  return proceed;
}

// --------------------------------------------
//            validatePresent
// Validate if something has been entered
// Returns true if so 
// --------------------------------------------

function validatePresent(valfield,   // element to be validated
                         infofield ) // id of element to receive info/error msg
{
  var stat = commonCheck (valfield, infofield, true);
  if (stat != proceed) return stat;

  msg (infofield, "warn", "");  
  
  return true;
}

// --------------------------------------------
//               validateEmail
// Validate if e-mail address
// Returns true if so (and also if could not be executed because of old browser)
// --------------------------------------------

function validateEmail(valfield,   // element to be validated
                         infofield,  // id of element to receive info/error msg
                         required)   // true if required
{
  var stat = commonCheck (valfield, infofield, required);
  if (stat != proceed) return stat;

  var tfld = trim(valfield.value);  // value of field with whitespace trimmed off
  var email = /^[^@]+@[^@.]+\.[^@]*\w\w$/  ;
  if (!email.test(tfld)) {
    msg (infofield, "error", "  ERROR: not a valid e-mail address");
    setfocus(valfield);
    return false;
  }

  var email2 = /^[A-Za-z][\w.-]+@\w[\w.-]+\.[\w.-]*[A-Za-z][A-Za-z]$/  ;
  if (!email2.test(tfld)) 
    msg (infofield, "warn", "Unusual e-mail address - check if correct");
  else
    msg (infofield, "warn", "");
  return true;
}

/*function validateVerifyEmail(valfield,   // element to be validated
                         infofield,  // id of element to receive info/error msg
                         required)   // true if required
{
  var tempreturn = false;
  if(validateEmail(valfield, infofield, required))
	tempreturn = true;

  if(tempreturn && (document.getElementsByName('email')[0].value == document.getElementsByName('verifyemail')[0].value))
	tempreturn = true;
  else if(document.getElementsByName('email')[0].value != document.getElementsByName('verifyemail')[0].value && document.getElementsByName('verifyemail')[0].value != null)
  {
	tempreturn = false;
	msg (infofield, "error", "  ERROR: Email address does not match");
  }
	
	return tempreturn;
  
}*/

function validateEmail1(first)//They tab out of the second box
{
	if (validateEmail(document.getElementsByName('email')[0], 	'lbEmail', 	true))//If the first email box is valid
	{
		msg ("lbEmail", "warn", ""); //Take off the error message
		if(!(document.getElementsByName('verifyemail')[0].value == null || document.getElementsByName('verifyemail')[0].value == ""))//If the second email address is not empty
		{
			if(document.getElementsByName('email')[0].value.toLowerCase() != document.getElementsByName('verifyemail')[0].value.toLowerCase())//If the first and second email addresses are not the same
			{
				msg ("lbVerifyEmail", "error", "  ERROR: Email address does not match");
				setfocus(document.getElementsByName('verifyemail')[0]);
				return false;
			}
			else //if everything is good, remove the error messages
			{
				msg ("lbEmail", "warn", ""); //Take off the error message
				msg ("lbVerifyEmail", "warn", "");
			}
		}
		else if(!first)//If the second box is empty and they tabbed out of the second box, it should be required.
		{
			validateEmail(document.getElementsByName('verifyemail')[0], 	'lbVerifyEmail', 	true); //sets the "required" status
			setfocus(document.getElementsByName('verifyemail')[0]);
			return false;
		}
	}
	else
		return false;
		
	return true;
}

// --------------------------------------------
//            validateTelnr
// Validate telephone number
// Returns true if so (and also if could not be executed because of old browser)
// Permits spaces, hyphens, brackets and leading +
// --------------------------------------------

function validateTelnr  (valfield,   // element to be validated
                         infofield,  // id of element to receive info/error msg
                         required)   // true if required
{
  var stat = commonCheck (valfield, infofield, required);
  if (stat != proceed) return stat;

  var tfld = trim(valfield.value);  // value of field with whitespace trimmed off
  var telnr = /^\+?[0-9 ()-]+[0-9]$/  ;
  if (!telnr.test(tfld)) {
    msg (infofield, "error", "  ERROR: not a valid telephone number. Characters permitted are digits, space ()- and leading +");
    setfocus(valfield);
    return false;
  }

  var numdigits = 0;
  for (var j=0; j<tfld.length; j++)
    if (tfld.charAt(j)>='0' && tfld.charAt(j)<='9') numdigits++;

  if (numdigits<7) {
    msg (infofield, "error", "  ERROR: " + numdigits + " digits - too short");
    setfocus(valfield);
    return false;
  }
   else
   {
	   if (numdigits>7) {
			msg (infofield, "error", "  ERROR: " + numdigits + " digits - too many");
			setfocus(valfield);
			return false;
	   }
	   else
		   msg (infofield, "warn", "");
   }
 /* if (numdigits>14)
    msg (infofield, "warn", numdigits + " digits - check if correct");
  else { 
    if (numdigits<10)
      msg (infofield, "warn", "Only " + numdigits + " digits - check if correct");
    else
      msg (infofield, "warn", "");
  }*/
  return true;
}

// --------------------------------------------
//             validateZip
// Validate the Zip code
// Returns true if OK 
// --------------------------------------------

function validateZip    (valfield,   // element to be validated
                         infofield,  // id of element to receive info/error msg
                         required)   // true if required
{
  var stat = commonCheck (valfield, infofield, required);
  if (stat != proceed) return stat;

  var tfld = trim(valfield.value);
  var ageRE = /^[0-9]{5,5}$/
  if (!ageRE.test(tfld)) {
    msg (infofield, "error", "  ERROR: not a valid Zip");
    setfocus(valfield);
    return false;
  }
  else
  	msg (infofield, "warn", "");

  return true;
}

function validateYear    (valfield,   // element to be validated
                         infofield,  // id of element to receive info/error msg
                         required)   // true if required
{
  var stat = commonCheck (valfield, infofield, required);
  if (stat != proceed) return stat;

  var tfld = trim(valfield.value);
  var ageRE = /^[0-9]{4,4}$/
  if (!ageRE.test(tfld) || tfld < 1900 || tfld > ((new Date()).getFullYear() + 2)) {
    msg (infofield, "error", "  ERROR: invalid year");
    setfocus(valfield);
    return false;
  }
  else
  	msg (infofield, "warn", "");

  return true;
}

// --------------------------------------------
//             validateVin
// Validate the Vin Number
// Returns true if OK 
// --------------------------------------------

function validateVin    (valfield,   // element to be validated
                         infofield,  // id of element to receive info/error msg
                         required)   // true if required
{
  var stat = commonCheck (valfield, infofield, required);
  if (stat != proceed) return stat;

  var tfld = trim(valfield.value);

  if(document.donateForm.year.value == null || document.donateForm.year.value == "")
  	{
		alert("Please first enter the Year of your car above.");
		setfocus(document.donateForm.year);
	}

  if(document.donateForm.year.value > 1981)
  		var ageRE = /^[A-Za-z0-9]{17,17}$/
	else
	  	var ageRE = /^[A-Za-z0-9]{4,17}$/
  
  if (!ageRE.test(tfld)) {
	  if(document.donateForm.year.value > 1981)
	    msg (infofield, "error", "  ERROR: Vin must be 17 characters");
	else
		msg (infofield, "error", "  ERROR: invalid Vin");
    setfocus(valfield);
    return false;
  }
  else
  	msg (infofield, "warn", "");

  return true;
}

function validateMotorhomeVin    (valfield,   // element to be validated
                         infofield,  // id of element to receive info/error msg
                         required)   // true if required
{
  var stat = commonCheck (valfield, infofield, required);
  if (stat != proceed) return stat;

  var tfld = trim(valfield.value);

  if(document.donateForm.year.value == null || document.donateForm.year.value == "")
  	{
		alert("Please first enter the Year of your car above.");
		setfocus(document.donateForm.year);
	}

  if(document.donateForm.year.value > 1985)
  		var ageRE = /^[A-Za-z0-9]{17,17}$/
	else
	  	var ageRE = /^[A-Za-z0-9]{4,17}$/
  
  if (!ageRE.test(tfld)) {
	  if(document.donateForm.year.value > 1985)
	    msg (infofield, "error", "  ERROR: Vin must be 17 characters");
	else
		msg (infofield, "error", "  ERROR: invalid Vin");
    setfocus(valfield);
    return false;
  }
  else
  	msg (infofield, "warn", "");

  return true;
}

function validateMileage    (valfield,   // element to be validated
                         infofield,  // id of element to receive info/error msg
                         required)   // true if required
{
  var stat = commonCheck (valfield, infofield, required);
  if (stat != proceed) return stat;

  var tfld = trim(valfield.value);
  var ageRE = /^[1-9]{1}[0-9,]{0,6}[\.]?[0-9]?$/
  if (!ageRE.test(tfld)) {
    msg (infofield, "error", "  ERROR: Only numbers allowed in mileage.");
    setfocus(valfield);
    return false;
  }
    else if (tfld == 0) {
    msg (infofield, "error", "  ERROR: Zero is not an acceptable mileage.");
    setfocus(valfield);
    return false;
  }
  else
  	msg (infofield, "warn", "");

  return true;
}

function validateTitle    (valfield,   // element to be validated
                         infofield,  // id of element to receive info/error msg
                         required)   // true if required
{
  var stat = commonCheck (valfield, infofield, required);
  if (stat != proceed) return stat;

  var tfld = trim(valfield.value);
  var ageRE = /^[\-A-Za-z0-9]{4,20}$/
  if (!ageRE.test(tfld)) {
	  ageRE = /^[\-A-Za-z0-9]{4,20}$/
	  if (ageRE.test(tfld)) {
		msg (infofield, "error", "  ERROR: Title Number invalid, numbers and letters only");
		setfocus(valfield);
	  }
	  else
  		msg (infofield, "error", "  ERROR: Title Number invalid");
		setfocus(valfield);
    return false;
  }
  else
  	msg (infofield, "warn", "");

  return true;
}

function validateDropDown    (valfield,   // element to be validated
                         infofield,  // id of element to receive info/error msg
                         required)   // true if required
{
	  var stat = commonCheck (valfield, infofield, required);
	  if (stat != proceed) return stat;
	if(tfld != "" && tfld != null)
	{
	
	  var tfld = trim(valfield.value);
	}
	
  if (tfld == "-- Please Select --" || tfld == "--Please Select--")// || tfld == "" || tfld == null) 
  {
    msg (infofield, "error", "  ERROR: Required");
    setfocus(valfield);
    return false;
  }
  else
  {
  	msg (infofield, "warn", "");
	return true;
  }
}

function validateAgree    (valfield,   // element to be validated
                         infofield,  // id of element to receive info/error msg
                         required)   // true if required
{
  if (!document.donateForm.title_assignment.checked) 
  {
    msg (infofield, "error", "  ERROR: Required");
    setfocus(valfield);
    return false;
  }
  else
  	msg (infofield, "warn", "");

  return true;
}

function validateRadio(btn, infofield, required) {
    //alert("checking " + infofield);
var cnt = -1;
    for (var i=btn.length-1; i > -1; i--) {
        if (btn[i].checked) {cnt = i; i = -1;}
    }
    if (cnt > -1)
	{
		msg (infofield, "warn", "");
		return true;
	}
    else
	{
	    msg (infofield, "error", "  ERROR: Required");
		setfocus(btn[0]);
		return false;
	}
}

function validateCond(btn, infofield, required, checkVal, fieldToVal) {
    var cnt = -1;
    for (var i=btn.length-1; i > -1; i--) {
        if (btn[i].checked) 
		{
			if(btn[i].value == checkVal)
			{
				return validatePresent(fieldToVal, infofield, true);
			}
		}
    }
	return true;
}

function validateMissingParts(){
   if(!document.getElementById) return true;
   var elem = document.getElementById('missing_parts_describe');
   if(elem.value == ''){
    // needs value 
	document.getElementById('lbMissPartsDesc').className = 'error';	
	return false;
    }else{
    // check if yes/no is checked
	document.getElementById('lbMissPartsDesc').className = 'warn';	
	return false;
    }
}

function validateMissPartRadio(){	
	if(document.getElementById('missing_parts_describe').value != ''){
	return validateRadio(document.getElementsByName('missing_parts'),'lbMissParts','required');
}else {return true;}
}

function errorOff(infofield)
{
	msg (infofield, "warn", "");
}

// --------------------------------------------
//             sameAs
// Copies the information from the location fields to the car location fields
// Returns true if OK 
// --------------------------------------------
function sameAs()
{
	if (document.donateForm.same.checked)	
	{
		if((document.donateForm.address.value != "") && (document.donateForm.city.value != ""))
		{
			document.donateForm.location_address.value = document.donateForm.address.value;	
			document.donateForm.location_city.value = document.donateForm.city.value;	
			errorOff('lbLocAddress');	
			errorOff('lbLocCity');	
	}
		else 
		{
			alert ("Please enter an address and city above.");
			document.donateForm.same.checked = false;
		}
	}
	else
	{
		document.donateForm.location_address.value = "";
		document.donateForm.location_city.value = "";
	}
}
