/*
Form Validation Version 1.0.2
Last updated: 01/18/06 by Juan Ulloa
Script by Juan Ulloa at Bellevue Community College. Code based from Joseph Myers code, website:Ask fengall, and others.
This script allows you to choose how you want the validation error messages displayed: either through an alert message or in the body of the HTML page using an unordered <ul> list. 
Notes: Radio buttons need to be next to each other; some browsers will not allow you to highlight some form elements
*/


//only to highlight/de-highlight background color of invalid form fields
var highlightFormItems = true;		//if form items should be highligthed if not filled
var formObjHighlight = "#FFFF99";	//color that the form items should be highlighted
var formObjBg = 'white';			//background color of form items when they are de-highlighted

//default error message, bullets and way error messages are displayed. 
var errDisplay = "alert";   	//options: alert (a popup) or HTML (displays on HTML page)
var errIntroMessage = "The following information is required:";   //message displayed before script lists error messages
var errDiv = "errorMessage";   //ID of Div used to display error messages (only if errDisplay == HTML)
var	errAlertBullet = " - ";  	//bullet used next to each error message on alert display only.

var errMessageStart = errIntroMessage
var errMessageEnd = "";
var errPrefix = "";
var	errPost = ""; 

// gets rid of white space
function nwts(s) { 
return s.replace(/\s+/g, '');
}

//checks if e-mail address has correct formating
function email(s) 
{
	a = s.match(/\S+@([-\w]+\.)+\w+/g);
	return a;
}

//checks for correct URL formating
function url(s) {
a = s.match(/\w{2,}:\/{2}([-\w]+\.)+\w+\S*/g);
return a;
}

// any number
function number(s) { 

if (nwts(s) == "") return true;
a = isNaN(s);
return a;	 
}

function highlight(obj) {
	if (highlightFormItems == true)	obj.style.backgroundColor = formObjHighlight;
	return;
}
function clearHighlight(obj) {
	if (highlightFormItems == true) obj.style.backgroundColor = formObjBg;
	return;
}


function validate(form, list) {
	valid = true;
	
	if (errDisplay == "alert") {
		errMessageStart = errIntroMessage;
		var errPrefix = "\n" + errAlertBullet; 		// \n creates new line in alert box
	}
	if (errDisplay == "HTML") {
		errMessageStart = "<p><strong>"+  errIntroMessage  +"</strong></p><ul>";
		errPrefix = "<li>";
		errPost = "</li>"; 
		errMessageEnd = "</ul>"
	}
	
	errorStr = errMessageStart;
	
	for (i=0; i<form.elements.length; i++) {
		var element = form.elements[i];
		var n = element.name;

		if (list[n] && list[n].verify) {
			clearHighlight(element);
			
			switch (list[n].verify){
				case "required":
					
					//Text field or Text area
					if (element.type == "text" || element.type == "textarea"){
						var trim = nwts(element.value);
						if (trim == ""){
							errorStr+= errPrefix+list[n].message+errPost;
							highlight(element);
							valid = false;
						}
					}
					
					//checkbox
					else if (element.type == "checkbox" & element.checked == false){
						errorStr+= errPrefix+list[n].message+errPost;
                		highlight(element);
						valid = false;
					}
					
										
					//select-one
					else if (element.type == "select-one"){
						if (element.value == "") {  //for IE
							errorStr+= errPrefix+list[n].message+errPost;
							highlight(element);
							valid = false;
						} else if (element.selectedIndex == 0) { //for other browsers
							errorStr+= errPrefix+list[n].message+errPost;
							highlight(element);
							valid = false;
						}
					}
					
					//select-multiple
					else if (element.type == "select-multiple" && element.value == ""){
						errorStr+= errPrefix+list[n].message+errPost;
						highlight(element);
						valid = false;
					}
					
					//radio
					else if (element.type == "radio"){
						
							radName = form.elements[i].name;
							radChecked = false;
							radCount = 0;
							
							do {
							if (form.elements[i].checked)
							radChecked = true;
							clearHighlight(form.elements[i]); 
							radCount++;
							i++;
							} while (form.elements[i].name == radName);
							--i;
							
							if(radChecked == false){
								errorStr+= errPrefix+list[n].message+errPost;
								//go through all radio buttons and highlight them, then bring 'i' back to normal
								for (j=0;j<radCount;j++){
									highlight(form.elements[i]); 
									i--;
								}
								i = i+radCount;  ;
								valid = false;
							}
					}
					break;
				case "email":
					if ( element.value == "" || email(element.value) == null){
                		errorStr+= errPrefix+list[n].message+errPost;
                		highlight(element);
						valid = false;
					};
					break;
				case "url":
					if ( element.value == "" || url(element.value) == null){
                		errorStr+= errPrefix+list[n].message+errPost;
                		highlight(element);
						valid = false;
					};
					break;
				case "number":
					if ( number(element.value) == true){
                		errorStr+= errPrefix+list[n].message+errPost;
                		highlight(element);
						valid = false;
					};
					break;
				default:
					//if this happens, script does not support some form field.
					alert ("CODE ERROR: the verify option not found");
			}
		}
	}
	if (valid == false){
		if (errDisplay == "alert") {
			alert (errorStr);
		}
		if (errDisplay == "HTML") {
			errorStr+=errMessageEnd;
			document.getElementById(errDiv).innerHTML=errorStr;
			document.getElementById(errDiv).style.display = 'block';
		}
	} 
	return valid;
}