window.onload = function(){
	matchedSet('#maillist_email').onfocus = clearField;
	matchedSet('#maillist_fname').onfocus = clearField;
	matchedSet('#maillist_lname').onfocus = clearField;
	matchedSet('#contact_name').onfocus = clearField;
	matchedSet('#contact_email').onfocus = clearField;
	matchedSet('#contact_msg').onfocus = clearField;
	matchedSet('#maillist_form').onsubmit = validateMaillistForm;
	matchedSet('#contact_form').onsubmit = validateContactForm;
}

function validateContactForm(){
	// check for existing errors and remove them
	var oPrevErrors = matchedSet('p.error');
	var nPrevErrorsLength = oPrevErrors.length;
	if(nPrevErrorsLength > 0){
		for(i=0; i<nPrevErrorsLength; i++){
			oPrevErrors[i].nextSibling.className = oPrevErrors[i].nextSibling.className.replace(' error','');
			oPrevErrors[i].parentNode.removeChild(oPrevErrors[i]);
		}
	}
	
	// target the form elements
	var form = matchedSet('#contact_form');
	var name = matchedSet('#contact_name');
	var email = matchedSet('#contact_email');
	var msg = matchedSet('#contact_msg');

	// setup error messages
	var errorMsg = new Array();
	errorMsg['global'] = 'There were errors with the form submission!';
	errorMsg['name'] = new Array(
		'Name was not entered.',
		'Invalid name format. Please use alphanumeric characters only.'
	);
	errorMsg['email'] = new Array(
		'No email address was entered.',
		'Invalid email format. Please try again.'
	);
	errorMsg['msg'] = new Array(
		'No message was entered.',
		'Invalid characters were found. Please use alphanumeric characters only.'
	);
	
	// regular expressions
	var nameRegEx = /^[A-Za-z][\w \._-]+$/;
	var emailRegEx = /^([\w._-]+)@([\w.-]+)\.([a-z]{2,4})$/;
	var msgRegEx = /^[A-Z][\w \.,-_\!\?\&'"\$]+$/;
	
	// do field by field validation
	if(name.value == name.defaultValue || name.value == ''){
		createErrMsg(name, errorMsg['name'][0]);
	}else if(!nameRegEx.test(name.value)){
		createErrMsg(name, errorMsg['name'][1]);
	}
	if(email.value == email.defaultValue || email.value == ''){
		createErrMsg(email, errorMsg['email'][0]);
	}else if(!emailRegEx.test(email.value)){
		createErrMsg(email, errorMsg['email'][1]);
	}
	if(msg.value == msg.defaultValue || msg.value == ''){
		createErrMsg(msg, errorMsg['msg'][0]);
	}else if(!msgRegEx.test(msg.value)){
		createErrMsg(msg, errorMsg['msg'][1]);
	}
	
	// check if errors were output
	if(matchedSet('p.error')){
		createErrMsg(form, errorMsg['global']); // create global error message
		return false;
	}
}


function validateMaillistForm(){
	// check for existing errors and remove them
	var oPrevErrors = matchedSet('p.error');
	var nPrevErrorsLength = oPrevErrors.length;
	if(nPrevErrorsLength > 0){
		for(i=0; i<nPrevErrorsLength; i++){
			oPrevErrors[i].nextSibling.className = oPrevErrors[i].nextSibling.className.replace(' error','');
			oPrevErrors[i].parentNode.removeChild(oPrevErrors[i]);
		}
	}
	
	// target the form elements
	var form = matchedSet('#maillist_form');
	var email = matchedSet('#maillist_email');
	var fname = matchedSet('#maillist_fname');
	var lname = matchedSet('#maillist_lname');

	// setup error messages
	var errorMsg = new Array();
	errorMsg['global'] = 'There were errors with the form submission!';
	errorMsg['email'] = new Array(
		'No email address was entered.',
		'Invalid email format. Please try again.'
	);
	errorMsg['fname'] = new Array(
		'First name was not entered.',
		'Invalid first name format. First letter must be a capital, followed by alphanumeric characters.'
	);
	errorMsg['lname'] = new Array(
		'Last name was not entered.',
		'Invalid last name format. First letter must be a capital, followed by alphanumeric characters.'
	);
	
	// regular expressions
	var emailRegEx = /^([\w._-]+)@([\w.-]+)\.([a-z]{2,4})$/;
	var nameRegEx = /^[A-Z][\w-_!.,']+$/;
	
	// do field by field validation
	if(email.value == email.defaultValue || email.value == ''){
		createErrMsg(email, errorMsg['email'][0]);
	}else if(!emailRegEx.test(email.value)){
		createErrMsg(email, errorMsg['email'][1]);
	}
	if(fname.value == fname.defaultValue || fname.value == ''){
		createErrMsg(fname, errorMsg['fname'][0]);
	}else if(!nameRegEx.test(fname.value)){
		createErrMsg(fname, errorMsg['fname'][1]);
	}
	if(lname.value == lname.defaultValue || fname.value == ''){
		createErrMsg(lname, errorMsg['lname'][0]);
	}else if(!nameRegEx.test(lname.value)){
		createErrMsg(lname, errorMsg['lname'][1]);
	}
	
	// check if errors were output
	if(matchedSet('p.error')){
		createErrMsg(form, errorMsg['global']); // create global error message
		return false;
	}
}

function createErrMsg(oTxtField, sErrorMsg){
	var newErrorTxt = document.createTextNode(sErrorMsg);
	var newError = document.createElement('p');
	newError.appendChild(newErrorTxt);
	newError.className = 'error';
	oTxtField.parentNode.insertBefore(newError, oTxtField);
	oTxtField.className += " error";
}

function clearField(){
	if(this.value == this.defaultValue){
		this.value = "";
		this.onblur = function(){
			if(this.value == ""){
				this.value = this.defaultValue;
			}
		}
	}else{
		this.select();
	}
}

// custom selector function
function matchedSet(sPassedElements){
	if(sPassedElements.indexOf('.') > -1){
		var aSlicedElems = sPassedElements.split('.');
		aSlicedElems[0] = aSlicedElems[0].toUpperCase();
		var aAllElements = document.getElementsByTagName(aSlicedElems[0]);
		var nAllElementsLgth = aAllElements.length;
		var aMatchedSet = new Array();
		
		if(nAllElementsLgth == 0){
			return false;
		}
		
		for(var i=0; i<nAllElementsLgth; i++){
			if(aAllElements[i].className == aSlicedElems[1]){
				aMatchedSet.push(aAllElements[i]);
			}
		}
		
		if(aMatchedSet == ''){
			return false;
		}else if(aMatchedSet.length == 1){
			var oMatchedSet = aMatchedSet[0];
			return oMatchedSet;
		}else{
			return aMatchedSet;
		}
	}else if(sPassedElements.indexOf('#') > -1){
		var aThisID = sPassedElements.split('#');
		if(document.getElementById(aThisID[1])){
			var oMatchedSet = document.getElementById(aThisID[1]);
			return oMatchedSet;
		}else{
			return false;
		}
	}else{
		return false;
	}
}
