// JavaScript Document

// Form Validation
function isEmailAddr(email)
{
  var result = false;
  var theStr = new String(email);
  var index = theStr.indexOf("@");
  if (index > 0)
  {
    var pindex = theStr.indexOf(".",index);
    if ((pindex > index+1) && (theStr.length > pindex+1))
	result = true;
  }
  return result;
}

function validRequired(formField,fieldLabel,placefocus)
{
	var result = true;
	if (formField.value == "")
	{
		alert('Please enter a value for ' + fieldLabel + '.');
		if (placefocus == 1)
			{
				formField.focus();		
			}
		result = false;
	}
	
	return result;
}

function validRequiredfile(formField,placefocus)
{
	var result = true;
	if (formField.value == "")
	{
		alert('Please select a file to upload');
		if (placefocus == 1)
			{
				formField.focus();		
			}
		result = false;
	}
	
	return result;
}

function validRequiredselect(formField,fieldLabel,placefocus)
{
	var result = true;
	if (formField[formField.selectedIndex].value == "")
	{
		alert('Please select a value for ' + fieldLabel + '.');
		if (placefocus == 1)
			{
				formField.focus();		
			}
		result = false;
	}
	
	return result;
}

function allDigits(str)
{
	return inValidCharSet(str,"0123456789");
}

function inValidCharSet(str,charset)
{
	var result = true;

	// Note: doesn't use regular expressions to avoid early Mac browser bugs	
	for (var i=0;i<str.length;i++)
		if (charset.indexOf(str.substr(i,1))<0)
		{
			result = false;
			break;
		}
	
	return result;
}

function validEmail(formField,fieldLabel,required)
{
	var result = true;
	
	if (required && !validRequired(formField,fieldLabel))
		result = false;

	if (result && ((formField.value.length < 3) || !isEmailAddr(formField.value)) )
	{
		alert("Please enter a complete email address in the form: yourname@yourdomain.com");
		formField.focus();
		result = false;
	}
   
  return result;

}

function validNum(formField,fieldLabel,required)
{
	var result = true;

	if (required && !validRequired(formField,fieldLabel))
		result = false;
  
 	if (result)
 	{
 		var ValidChars = "0123456789.";
   		var Char;
		
		for (i = 0; i < formField.value.length && result == true; i++) 
		  { 
		  Char = formField.value.charAt(i); 
		  if (ValidChars.indexOf(Char) == -1) 
			 {
				 alert('Please enter a NUMBER for the "' + fieldLabel +'" field.\n Do not include comma seperators.');
				formField.focus();
			 	result = false;
			 }
		  }
	} 
	
	return result;
}


function validInt(formField,fieldLabel,required)
{
	var result = true;

	if (required && !validRequired(formField,fieldLabel))
		result = false;
  
 	if (result)
 	{
 		var ValidChars = "0123456789";
   		var Char;
		
		for (i = 0; i < formField.value.length && result == true; i++) 
		  { 
		  Char = formField.value.charAt(i); 
		  if (ValidChars.indexOf(Char) == -1) 
			 {
				 alert('Please enter a INTEGER for the "' + fieldLabel +'" field.\n Do not include comma seperators or any other characters.');
				formField.focus();
			 	result = false;
			 }
		  }
	} 
	
	return result;
}





function validDate(formField,fieldLabel,required,placefocus)
{
	var result = true;

	if (required && !validRequired(formField,fieldLabel,placefocus))
		result = false;
  
 	if (result)
 	{
 		var elems = formField.value.split("/");
 		
 		result = (elems.length == 3); // should be three components
 		
 		if (result)
 		{
 			var month = parseInt(elems[0],10);
  			var day = parseInt(elems[1],10);
 			var year = parseInt(elems[2],10);
			result = allDigits(elems[0]) && (month > 0) && (month < 13) &&
					 allDigits(elems[1]) && (day > 0) && (day < 32) &&
					 allDigits(elems[2]) && ((elems[2].length == 2) || (elems[2].length == 4));
 		}
 		
  		if (!result)
 		{
 			alert('Please enter a date in the format MM/DD/YYYY for the "' + fieldLabel +'" field.');
			if (placefocus == 1)
			{
				formField.focus();		
			}
		}
	} 
	
	return result;
}


function validRequiredCheckbox(formField,message)
{
	var result = true;
	if (!formField.checked)
	{
		alert(message);
		result = false;
	}
	
	return result;
}


function validPassword(formField,fieldLabel,placefocus)
{
	var result = true;
	
	var result = validatePassword(formField.value, {
		length:   [6, Infinity],
		lower:    0,
		upper:    0,
		numeric:  1,
		special:  0,
		badWords: ["password"],
		badSequenceLength: 4
	});
	
	if (result == false)
	{
		alert('Password must be at least 6 characters long and must include at least one number. ' + fieldLabel + '.');
		if (placefocus == 1)
			{
				formField.focus();		
			}
	}
	
	if (formField.value == "" && result == true)
	{
		alert('Please enter a value for ' + fieldLabel + '.');
		if (placefocus == 1)
			{
				formField.focus();		
			}
		result = false;
	}
	
	return result;
}



function validatePassword (pw, options) {
	// default options (allows any password)
	var o = {
		lower:    0,
		upper:    0,
		alpha:    0, /* lower + upper */
		numeric:  0,
		special:  0,
		length:   [0, Infinity],
		custom:   [ /* regexes and/or functions */ ],
		badWords: [],
		badSequenceLength: 0,
		noQwertySequences: false,
		noSequential:      false
	};

	for (var property in options)
		o[property] = options[property];

	var	re = {
			lower:   /[a-z]/g,
			upper:   /[A-Z]/g,
			alpha:   /[A-Z]/gi,
			numeric: /[0-9]/g,
			special: /[\W_]/g
		},
		rule, i;

	// enforce min/max length
	if (pw.length < o.length[0] || pw.length > o.length[1])
		return false;

	// enforce lower/upper/alpha/numeric/special rules
	for (rule in re) {
		if ((pw.match(re[rule]) || []).length < o[rule])
			return false;
	}

	// enforce word ban (case insensitive)
	for (i = 0; i < o.badWords.length; i++) {
		if (pw.toLowerCase().indexOf(o.badWords[i].toLowerCase()) > -1)
			return false;
	}

	// enforce the no sequential, identical characters rule
	if (o.noSequential && /([\S\s])\1/.test(pw))
		return false;

	// enforce alphanumeric/qwerty sequence ban rules
	if (o.badSequenceLength) {
		var	lower   = "abcdefghijklmnopqrstuvwxyz",
			upper   = lower.toUpperCase(),
			numbers = "0123456789",
			qwerty  = "qwertyuiopasdfghjklzxcvbnm",
			start   = o.badSequenceLength - 1,
			seq     = "_" + pw.slice(0, start);
		for (i = start; i < pw.length; i++) {
			seq = seq.slice(1) + pw.charAt(i);
			if (
				lower.indexOf(seq)   > -1 ||
				upper.indexOf(seq)   > -1 ||
				numbers.indexOf(seq) > -1 ||
				(o.noQwertySequences && qwerty.indexOf(seq) > -1)
			) {
				return false;
			}
		}
	}

	// enforce custom regex/function rules
	for (i = 0; i < o.custom.length; i++) {
		rule = o.custom[i];
		if (rule instanceof RegExp) {
			if (!rule.test(pw))
				return false;
		} else if (rule instanceof Function) {
			if (!rule(pw))
				return false;
		}
	}

	// great success!
	return true;
}





/*
var password = "password";
var passed = validatePassword(password, {
	length:   [8, Infinity],
	lower:    1,
	upper:    1,
	numeric:  1,
	special:  1,
	badWords: ["password", "steven", "levithan"],
	badSequenceLength: 4
});
// passed: false

*/










function validateForm_example(theForm)
{
	// Customize these calls for your form

	// Start ------->
	if (!validRequired(theForm.fullname,"Name"))
		return false;

	if (!validEmail(theForm.email,"Email Address",true))
		return false;

	if (!validDate(theForm.available,"Date Available",true))
		return false;

	if (!validNum(theForm.yearsexperience,"Years Experience",true))
		return false;
	// <--------- End
	
	return true;
}


// end form validation
