// ----------------------------------------------------------------------
// Javascript form validation routines.
// Author: Stephen Poley
// Minor(!) modifications: Criss Ittermann, Eclectic Tech, LLC.
//
// Simple routines to quickly pick up obvious typos.
// All validation routines return true if executed by an older browser:
// in this case validation must be left to the server.
//
// Update Jun 2005: discovered that reason IE wasn't setting focus was
// due to an IE timing bug. Added 0.1 sec delay to fix.
//
// Update Oct 2005: minor tidy-up: unused parameter removed
//
// Update Jun 2006: minor improvements to variable names and layout
//
// ----------------------------------------------------------------------

/*
How to use:

in header:

<link rel="stylesheet" type="text/css" href="formval.css" media="screen"/>
<script type="text/javascript" src=formval.js></script> 


in body:



<noscript>
<p> Javascript is not currently enabled on your browser. If you can enable it, your input will be checked as you enter it (on most browsers, at least). You may find this helpful. </p>
</noscript>


<script type="text/javascript">

<!--

// Only script specific to this form goes here.
// General-purpose routines are in a separate file.
  function validateOnSubmit() {
    var elem;
    var errs=0;
    // execute all element validations in reverse order, so focus gets
    // set to the first one in error.
    if (!validateEmail  (document.forms.webform.email, 'inf_email', true)) errs += 1; 
    if (!validateTelnr  (document.forms.webform.phone1, 'inf_phone1', true)) errs += 1; 
    if (!validatePresent(document.forms.webform.zip,  'inf_zip'))        errs += 1; 
    if (!validatePresent(document.forms.webform.state,  'inf_state'))        errs += 1; 
    if (!validatePresent(document.forms.webform.city,  'inf_city'))        errs += 1; 
    if (!validatePresent(document.forms.webform.address,  'inf_address'))  errs += 1; 
    if (!validatePresent(document.forms.webform.company,  'inf_company'))  errs += 1; 
    if (!validatePresent(document.forms.webform.name,  'inf_name'))        errs += 1; 

    if (errs>1)  alert('There are fields which need correction before sending');
    if (errs==1) alert('There is a field which needs correction before sending');

    return (errs==0);
  };
-->

    </script>

And add to form: 

<form name="webform" onsubmit="return validateOnSubmit()" action="bearregistration.php" method="post">


<span id="inf_name">&nbsp</span>




*/
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)
{
  return str.replace(/^\s+|\s+$/g, '');
}


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

function setFocusDelayed()
{
  global_valfield.focus();
}

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
  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", "<<");  
      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;
}

function validateEmpty(valfield)   // element to be validated
{
  if (emptyString.test(valfield.value)) {
      return true;  
    } else {
    
    	return false;
    }

}

// --------------------------------------------
//               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", "<<");
    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", "<<");
  else
    msg (infofield, "warn", "");
  return true;
}

// --------------------------------------------
//           Validates length of field
// --------------------------------------------

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

  var checklength = trim(valfield.value);  // value of field with whitespace trimmed off
  var varsize = checklength.length;
  if (varsize > max || varsize < min) {
  	msg(infofield, "warn", "Requires " + min + "-" + max + " characters.");
    setfocus(valfield);
    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", "<<");
    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<6) {
    msg (infofield, "error", numdigits + " digits - too short");
    setfocus(valfield);
    return false;
  }

  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;
}

// --------------------------------------------
//             validateAge
// Validate person's age
// Returns true if OK 
// --------------------------------------------

function validateAge    (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]{1,3}$/
  if (!ageRE.test(tfld)) {
    msg (infofield, "error", "Please enter a valid age");
    setfocus(valfield);
    return false;
  }

  if (tfld>=200) {
    msg (infofield, "error", "Please enter a valid age");
    setfocus(valfield);
    return false;
  }

  if (tfld>110) msg (infofield, "warn", "Older than 110: check correct");
  else {
    if (tfld<7) msg (infofield, "warn", "Bit young for this, aren't you?");
    else        msg (infofield, "warn", "");
  }
  return true;
}

function doRegister(form) {
	// encrypt pass using salt
	
	if(form['password'].value.length == 0) {
		return false;
	}
	if(form['password'].value.length > 0) {
		form['pass1'].value = hex_hmac_sha1(form['salt'].value, form['password'].value);
	}
	
	// pass_field_curr does not allways exist
	// must be encrypted with key AND salt
	if(form['pass_field_curr'] && form['pass_field_curr'].value.length > 0) {
		form['passcurr'].value = hex_hmac_sha1(form['key'].value, hex_hmac_sha1(form['salt'].value, form['pass_field_curr'].value));
	}
	
	// clear field
	
	fake = '';
	for (i = 0; i < form['password'].value.length; i++) {
		fake = fake + '-';
	}
	form['password'].value = fake;
	
	fake = '';
	// pass_field_curr does not allways exist
	if (form['pass_field_curr']) {
		for (i = 0; i < form['pass_field_curr'].value.length; i++) {
			fake = fake + '-';
		}
	}
	form['pass_field_curr'].value = fake;
	
	return true;
}
