function trim(string) {
	return string.replace(/^\s*|\s*$/g,"");
}

function checkNames(errors) {
	var student_name = document.getElementById("student_name");
	
	var val_name = /^[\w\-]{2,}( +[\w\-]{1,})+$/;
	
	if(!trim(student_name.value).match(val_name)){
		errors.push("student_name");
	}
	
	
	
	return errors;
}

function checkContact(errors) {
	var street = document.getElementById("street");
	var city = document.getElementById("city");
	var zip = document.getElementById("zip");
	
	var phone_day = document.getElementById("phone_day");
	var phone_eve = document.getElementById("phone_eve");
	var email = document.getElementById("email");
	
	var val_zip = /^\d{5}$/;
	var val_phone = /^[^\d\w]?\d{3}[^\d\w]{0,2}\d{3}[^\d\w]?\d{4}$/;
	var val_email = /^[\w\-\.\+]+\@[\w\-\+]+(\.[\w\-\+]+)+$/
	
	if(trim(street.value) == ""){
		errors.push("street");
	}
	
	if(trim(city.value) == ""){
		errors.push("city");
	}
	
	if(!zip.value.match(val_zip)){
		errors.push("zip");
	}
	
	if((phone_day.value != "") && (!trim(phone_day.value).match(val_phone))){
		errors.push("phone_day");
	}
	
	if((phone_eve.value != "") && (!trim(phone_eve.value).match(val_phone))){
		errors.push("phone_eve");
	}
	
	if((email.value != "") && (!trim(email.value).match(val_email))){
		errors.push("email");
	}
	
	if((phone_day.value == "") && (phone_eve.value == "") && (email.value == "")){
		errors.push("phone_or_email");
	}
	
	return errors;
}

function checkSchool(errors) {
	var school_name = document.getElementById("school_name");
	
	
	if(trim(school_name.value) == ""){
		errors.push("school_name");
	}
	
	
	
	return errors;
}

function setErrorsBlock() {
	/* first, check to see if we already have an error block
			if not, create it, if so, clear it
	*/

	if(document.getElementById("errors_block")) {
		var errors_block = document.getElementById("errors_block");
		while(errors_block.firstChild){
			errors_block.removeChild(errors_block.firstChild);
		}
	}
	else{
		var mcopy = document.getElementById("mcopy"); // this is the wrapper div for the mail copy section
		var form_header = document.getElementById("form_title");
		
		var errors_block = document.createElement("div");
		errors_block.setAttribute("id","errors_block");
		
		mcopy.insertBefore(errors_block,form_header.nextSibling); //referenceElement.nextSibling is a hack for insertAfter (doesn't exist)
	}
	
	return errors_block;
}

function addTitle(errors_block) {
	var title = document.createElement("h3");
	var title_link = document.createElement("a"); //the link is so we can set focus to it for screen readers

	var title_string = "Please correct the following fields:";
	var title_text = document.createTextNode(title_string);
	
	title_link.setAttribute("id","errors_title");
	
	title_link.setAttribute("href","#error_list");
	title_link.setAttribute("title",title_string);
	
	title_link.appendChild(title_text);
	title.appendChild(title_link);
	errors_block.appendChild(title);
}

function getErrorDescription(error_key){
	switch(error_key){
		case "student_name":
			return "Please enter a first and last name for the student.";
		break;
		
		case "street":
			return "Please enter a street address.";
		break;
		case "city":
			return "Please enter a city.";
		break;
		case "zip":
			return "Please enter a valid 5-digit ZIP code.";
		break;
		case "phone_day":
			return "Please enter a valid daytime phone number.";
		break;
		case "phone_eve":
			return "Please enter a valid evening phone number.";
		break;
		case "email":
			return "Please enter a valid email address.";
		break;
		case "phone_or_email":
			return "Please provide at least one phone number or email address.";
		break;
		case "school_name":
			return "Please enter the test location.";
		break;
		
	}	
}

function insertErrorLinks(errors,errors_block){
	var i = 0;
	
	var title = document.getElementById("errors_title");
	var errors_list = document.createElement("ul");
	
	var list_item = null;
	var list_item_link = null;
	var list_item_link_text = null;
	
	//for class, switch by browser
	if(window.ActiveXObject){
		var CLASS = "className";
	}
	else {
		var CLASS = "class";
	}
	
	errors_list.setAttribute(CLASS,"bullet");
	
	for(i=0;i<errors.length;i++){
		list_item = document.createElement("li")
		list_item_link = document.createElement("a");
		list_item_link_text = document.createTextNode(getErrorDescription(errors[i]));
		
		list_item_link.setAttribute("href","#err_"+errors[i]);
		list_item_link.setAttribute("title",getErrorDescription(errors[i]));
		
		list_item_link.appendChild(list_item_link_text);
		list_item.appendChild(list_item_link);
		errors_list.appendChild(list_item);
	}
	
	//make the named anchor for the list; i'm going to reuse some variables for this
	// ie drives me nuts
	if(window.ActiveXObject){
		list_item_link = document.createElement('<a name="error_list"></a>');
	}
	else {
		list_item_link = document.createElement("a");
		list_item_link.setAttribute("name","error_list");
	}
	
	errors_block.appendChild(errors_list);
	errors_block.insertBefore(list_item_link,errors_list);
	
}

function insertErrorNotes(errors) {
	var i = 0;
	
	var err_node = null;
	
	var note = null;
	var note_text = null;
	var note_anchor = null;
	
	var parent_node = null;
	
	if(window.ActiveXObject){
		var CLASS = "className";
	}
	else {
		var CLASS = "class";
	}

	for(i=0;i<errors.length;i++){
		err_node = document.getElementById(errors[i]);
		parent_node = err_node.parentNode;
		
		// ie drives me nuts
		if(window.ActiveXObject){
			note_anchor = document.createElement('<a name="err_'+errors[i]+'"></a>');
		}
		else {
			note_anchor = document.createElement("a");
			note_anchor.setAttribute("name","err_"+errors[i]);
		}
		
		note_text = document.createTextNode(getErrorDescription(errors[i]));
		
		note = document.createElement("div");
		note.setAttribute(CLASS,"err_note");
		
		note.appendChild(note_anchor);
		note.appendChild(note_text);
		
		parent_node.insertBefore(note,err_node.previousSibling.previousSibling);
	}
}

function clearOldNotes(){
	var divs = document.getElementsByTagName("div");
	var tagged_for_deletion = new Array;
	var i = 0;
	
	if(window.ActiveXObject){
		var CLASS = "className";
	}
	else {
		var CLASS = "class";
	}

	for(i = 0;i<divs.length;i++){
		if(divs[i].getAttribute(CLASS) == "err_note"){
			tagged_for_deletion.push(divs[i]);
		}
	}
	
	//i'm tagging them then deleting them because otherwise the indices in the divs array get out of whack
	for(i=0;i<tagged_for_deletion.length;i++){
		tagged_for_deletion[i].parentNode.removeChild(tagged_for_deletion[i]);
	}
	
}

function displayErrors(errors) {
	
	var errors_block = setErrorsBlock();
	addTitle(errors_block);
	clearOldNotes();
	insertErrorLinks(errors,errors_block);
	insertErrorNotes(errors);
	document.getElementById("errors_title").focus();
}

function validate() {
	var errors = new Array;
	errors = checkNames(errors);
	errors = checkContact(errors);
	errors = checkSchool(errors);

	if(errors.length == 0){
		return true;
	}
	
	displayErrors(errors);
	return false;	
}

function clearErrorsBlock(){
	if(document.getElementById("errors_block")){
		var errors_block = document.getElementById("errors_block");
		errors_block.parentNode.removeChild(errors_block);
	}	
}

window.onload = function() {
	try{
		var the_form = document.getElementById("lsat_sat_form");
		the_form.onsubmit = function() {
			return validate();
		}
		
		var clear_button = document.getElementById("clear");
		clear_button.onclick = function() {
			clearErrorsBlock();
			clearOldNotes();
			document.location="#top";
		}
	}
	catch(e) {
		alert(e); //for debugging only, comment out when live
	}
}
