/*
	Author 	: Bobby Sojitra
	Purpose : OOP front end form handling, reducing need for specific js in presentation layer
*/

/*
	i		: element id
	Usage	: gE('insertIdHere') 
	Returns : html element
*/
function gE(i){
	return document.getElementById(i);
}

/*
	f 	  : form id
	Usage : var frm = new FormValidator('insertIdHere')
*/
var elems = new Array();
function FormValidator(f) {
	var frm = gE(f);
	frm.onsubmit = function() { return validate(); };	
	this.addElement = function(i,t,m,r,l) {
		var e = new Element(i,t,m,r,l);
		elems.push(e);
	}
}

function validate() {
	var errors = new Array();
	var okToSubmit = true;
	for (var x=0;x<elems.length;x++) {
		var e = elems[x];
		var e_value = gE(e.id).value;
		var nb_value = gE(e.id).value.split(" ");
		// check if a value has been entered if required
		if (e.required) {
			if (e_value=='')	{
				errors.push('You must fill in a value for '+e.label);
				okToSubmit = false;
				gE(e.id).focus();
				break;
			}
		} 
		// check that the value length is greater than the minimum length
		if (e_value.length<e.minimumLength) {
			errors.push('You must enter at least '+e.minimumLength+' character(s) for '+e.label);
			okToSubmit = false;	
		}
		// handle special cases i.e. pattern matching
		switch (e.type) {
			case 'string':
				break;					
			case 'number':
				filter = /\d+/;
				if (!filter.test(e_value)) {
					errors.push('You may only enter numbers into '+e.label);	
					okToSubmit = false;	
				}
				break;
			case 'email':
				filter = /^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/;
				if (!filter.test(e_value)) {
					errors.push('Please enter an email address in a valid format into '+e.label);
					okToSubmit = false;
				}
				break;
			case 'nbWords':
			if(nb_value.length > 50) {
			errors.push('Your answer must be limited to 50 words');
			okToSubmit = false;
			}
			break;
		}
	}
	if (!okToSubmit) {
		alert(errors.join('\n'));
	}
	return okToSubmit;
}

/*
	i	: element id, string
	t	: element type, string
	m	: minimum length, integer
	r	: is element required?, boolean 
	l	: label id for this element, string
*/

function Element(i,t,m,r,l) {
	this.id = i;
	this.type = t;
	this.minimumLength = m;	
	this.required = r;
	this.label = gE(l).innerHTML;
}