/* This file should be re-writen as an object.*/

function Validation(formObj) {
	this.form = formObj;
	this.rules = new Array();
	this.badFields = new Array();
	
	// CSS Class names
	this.error = '';
	this.success = '';
}

Validation.prototype.setClasses = function(error, success) {
	this.error = error;
	this.success = success;
}

// email

Validation.prototype.checkEmail = function(strng) {
	var error="";
	if (strng == "") {
	   error = "You didn't enter an email address.\n";
	}

	var emailFilter=/^.+@.+\..{2,3}$/;
	if (!(emailFilter.test(strng))) { 
	   error = "Please enter a valid email address.\n";
	}
	else {
//test email for illegal characters
	   var illegalChars= /[\(\)\<\>\,\;\:\\\"\[\]]/
		 if (strng.match(illegalChars)) {
		  error = "The email address contains illegal characters.\n";
	   }
	}
	return error;    
}


// phone number - strip out delimiters and check for 10 digits

Validation.prototype.checkPhone = function(strng) {
	var error = "";
	if (strng == "") {
	   error = "You didn't enter a phone number.\n";
	}

	var stripped = strng.replace(/[\(\)\.\-\ ]/g, ''); //strip out acceptable non-numeric characters
	if (isNaN(parseInt(stripped))) {
	   error = "The phone number contains illegal characters.";
  
	}
	if (!(stripped.length == 10)) {
		error = "The phone number is the wrong length. Make sure you included an area code.\n";
	} 
	return error;
}


// password - between 6-8 chars, uppercase, lowercase, and numeral

Validation.prototype.checkPassword = function(strng) {
	var error = "";
	if (strng == "") {
	   error = "You didn't enter a password.\n";
	}

	var illegalChars = /[\W_]/; // allow only letters and numbers
	
	if ((strng.length < 6) || (strng.length > 8)) {
	   error = "The password is the wrong length.\n";
	}
	else if (illegalChars.test(strng)) {
	  error = "The password contains illegal characters.\n";
	} 
	else if (!((strng.search(/(a-z)+/)) && (strng.search(/(A-Z)+/)) && (strng.search(/(0-9)+/)))) {
	   error = "The password must contain at least one uppercase letter, one lowercase letter, and one numeral.\n";
	}  
	return error;
}    


// username - 4-10 chars, uc, lc, and underscore only.

Validation.prototype.checkUsername = function(strng) {
	var error = "";
	if (strng == "") {
	   error = "You didn't enter a username.\n";
	}

	var illegalChars = /\W/; // allow letters, numbers, and underscores
	if ((strng.length < 4) || (strng.length > 10)) {
		error = "The username is the wrong length.\n";
	}
	else if (illegalChars.test(strng)) {
		error = "The username contains illegal characters.\n";
	} 
	return error;
}       


// non-empty textbox

Validation.prototype.isEmpty = function(strng) {
	var error = "";
	if (strng.length == 0) {
		error = "The mandatory text area has not been filled in.\n"
	}
	return error;	  
}

// was textbox altered

Validation.prototype.isDifferent = function(strng) {
	var error = ""; 
	if (strng != "Can\'t touch this!") {
		error = "You altered the inviolate text area.\n";
	}
	return error;
}

// exactly one radio button is chosen

Validation.prototype.checkRadio = function(checkvalue) {
	var error = "";
	if (!(checkvalue)) {
		error = "Please check a radio button.\n";
	}
	return error;
}

// valid selector from dropdown list

Validation.prototype.checkDropdown = function(choice) {
	var error = "";
	if (choice == 0) {
		error = "You didn't choose an option from the drop-down list.\n";
	}    
	return error;
}

Validation.prototype.addRule = function(id, rule) {
	this.rules.push(Array(document.getElementById(id), rule));
}

Validation.prototype.displayErrors = function() {
	// Clear previously highlighted fields
	for(var i = 0; i < this.form.length; i++) {
		if(this.form.elements[i].className == this.error) {
			this.form.elements[i].className = this.success;
		}
	}

	// Highlight fields with errors
	for(x in this.badFields) {
		this.badFields[x].className = this.error;
	}
	
	// Set focus to first field with error
	this.badFields[0].focus();
	
	// Display error message to user
	alert('Errors were found in the information you supplied');
}

Validation.prototype.checkFields = function() {
	for(x in this.rules) {
		error = '';
		
		switch(this.rules[x][1]) {
			case 'required':
				error = this.isEmpty(this.rules[x][0].value);
				break;
			case 'phone':
				error = this.checkPhone(this.rules[x][0].value);
				break;
		}
		
		if(error != '') {
			this.badFields.push(this.rules[x][0]);
		}
	}

	if(this.badFields.length > 0) {
		this.displayErrors();
		return(false);
	} else {
		return(true);
	}
}