// JavaScript Document

function validate(form) {
	var index;			// for position of error flags in form element name
	var fieldName;		// name of form element without error flags
	var err = 0;		// 1 if form has errors, otherwise 0
	
	var el;				// element throwing error
	var elParent;		// parent node of element throwing error
	var errS;			// span to append to elParent, to contain error text
	var count = 1;		// count through errors
	var hasParent = 0;
	var sList;
	var b;
	
	
	// Remove any errors from previous form attempts
	if (window.errs) {
		for (var i = 0; i < window.errs.length; i++) {
			el = document.getElementById(window.errs[i]);
			elParent = el.parentNode;
			elParent.removeChild(el);
			for (var j = 0; j < window.parents.length; j++) {
				if (window.parents[j] == elParent) {
					elParent.style.backgroundColor = window.bgs[j];
					break;
				}
			}
			elParent.style.borderBottom = "none";
		}
		window.errs = new Array();
		window.parents = new Array();
		window.bgs = new Array();
	} else {
		window.errs = new Array();
		window.parents = new Array();
		window.bgs = new Array();
	}
	
	
	// Loop through form elements
	for (var i = 0; i < form.elements.length; i++) {
		// CHECK FOR EMPTY REQUIRED FIELDS
		index = form.elements[i].name.indexOf('_R');
		
		// If required flag
		if (index >= 0) {
			// Get corresponding field to check value
			fieldName = form.elements[i].name.substring(0, form.elements[i].name.indexOf('_'));
			
			if ((form.elements[fieldName].value == '') || (form.elements[fieldName].value == ' ')) {
				hasParent = 0;
				
				el = document.getElementById(form.elements[i].name);
				elParent = el.parentNode;
				
				for (var j = 0; j < window.parents.length; j++) {
					if (window.parents[j] == elParent) {
						hasParent = 1;
						break;
					}
				}
				
				if (hasParent) {
					sList = elParent.getElementsByTagName('span');
					for (var j = 0; j < sList.length; j++) {
						if (sList[j].id.indexOf('_ERR') >= 0) {
							errS = sList[j];
							b = document.createElement('br');
							errS.appendChild(b);
							break;
						}
					}
				} else {
					// Save parent node info to array
					window.parents[window.parents.length] = elParent;
					window.bgs[window.bgs.length] = elParent.style.backgroundColor;
					// Apply error styles to parent node
					elParent.style.backgroundColor = "#E6C4D2";
					elParent.style.borderBottom = "1px solid #95003C";
					// Create span for error text
					errS = document.createElement("span");
					errS.id = fieldName + "_ERR" + count;
					errS.className = "errInline";
					errS.style.backgroundColor = "#E6C4D2";
					// Append error span to parent node
					elParent.appendChild(errS);
					b = document.createElement('br');
					errS.appendChild(b);
					window.errs[window.errs.length] = fieldName + "_ERR" + count;
					
					count += 1;
				}
				
				errS.appendChild(document.createTextNode(form.elements[i].value + " is required"));
				err = 1;
				
			}
		}
		
		// CHECK FOR NUMERIC VALUES
		index = form.elements[i].name.indexOf('_N');
		if (index >= 0) {
			// Get corresponding field to check value
			fieldName = form.elements[i].name.substring(0, form.elements[i].name.indexOf('_'));
			if (form.elements[fieldName].value != 0) {
				if (isNaN(form.elements[fieldName].value)) {
					el = document.getElementById(form.elements[i].name);
					elParent = el.parentNode;
					
					for (var j = 0; j < window.parents.length; j++) {
						if (window.parents[j] == elParent) {
							hasParent = 1;
							break;
						}
					}
					
					if (hasParent) {
						sList = elParent.getElementsByTagName('span');
						for (var j = 0; j < sList.length; j++) {
							if (sList[j].id.indexOf('_ERR') >= 0) {
								errS = sList[j];
								b = document.createElement('br');
								errS.appendChild(b);
								break;
							}
						}
					} else {
						// Save parent node info to array
						window.parents[window.parents.length] = elParent;
						window.bgs[window.bgs.length] = elParent.style.backgroundColor;
						// Apply error styles to parent node
						elParent.style.backgroundColor = "#E6C4D2";
						elParent.style.borderBottom = "1px solid #95003C";
						// Create span for error text
						errS = document.createElement("span");
						errS.id = fieldName + "_ERR" + count;
						errS.className = "errInline";
						errS.style.backgroundColor = "#E6C4D2";
						// Append error span to parent node
						elParent.appendChild(errS);
						b = document.createElement('br');
						errS.appendChild(b);
						window.errs[window.errs.length] = fieldName + "_ERR" + count;
						
						count += 1;
					}
					
					errS.appendChild(document.createTextNode(form.elements[i].value + " must be a number"));
					
					err = 1;
				}
			}
		}
		
		// CHECK FOR EMAIL ADDRESSES
		index = form.elements[i].name.indexOf('_E');
		if (index >= 0) {
			// Get corresponding field to check value
			fieldName = form.elements[i].name.substring(0, form.elements[i].name.indexOf('_'));
			if (form.elements[fieldName].value != 0) {
				if (! validateEmail(form.elements[fieldName].value)) {
					el = document.getElementById(form.elements[i].name);
					elParent = el.parentNode;
					
					for (var j = 0; j < window.parents.length; j++) {
						if (window.parents[j] == elParent) {
							hasParent = 1;
							break;
						}
					}
					
					if (hasParent) {
						sList = elParent.getElementsByTagName('span');
						for (var j = 0; j < sList.length; j++) {
							if (sList[j].id.indexOf('_ERR') >= 0) {
								errS = sList[j];
								b = document.createElement('br');
								errS.appendChild(b);
								break;
							}
						}
					} else {
						// Save parent node info to array
						window.parents[window.parents.length] = elParent;
						window.bgs[window.bgs.length] = elParent.style.backgroundColor;
						// Apply error styles to parent node
						elParent.style.backgroundColor = "#E6C4D2";
						elParent.style.borderBottom = "1px solid #95003C";
						// Create span for error text
						errS = document.createElement("span");
						errS.id = fieldName + "_ERR" + count;
						errS.className = "errInline";
						errS.style.backgroundColor = "#E6C4D2";
						// Append error span to parent node
						elParent.appendChild(errS);
						b = document.createElement('br');
						errS.appendChild(b);
						window.errs[window.errs.length] = fieldName + "_ERR" + count;
						
						count += 1;
					}
					
					errS.appendChild(document.createTextNode(form.elements[i].value + " must be a valid email address"));
					
					err = 1;
				}
			}
		}
	}
	
	// If errors with form
	if (err) {
		return false;
	// If no errors, submit form
	} else {
		return checkChars(form);
	}
}


function validatePop(form) {
	var index;			// for position of error flags in form element name
	var fieldName;		// name of form element without error flags
	var err = 0;		// 1 if form has errors, otherwise 0
	var rErr = 0;
	var oErr = 0;
	var msg = 'One or more errors were found with the email you supplied. Please see below.';
	var rMsg = '\n\nThe following fields are required:\n';
	var oMsg = '\n\nThe following errors were found:\n';
	
	// Required fields
	for (var i = 0; i < form.elements.length; i++) {
		index = form.elements[i].name.indexOf('_R');
		
		if (index >= 0) {
			fieldName = form.elements[i].name.substring(0, form.elements[i].name.indexOf('_'));
			if (form.elements[fieldName].value == 0) {
				rMsg += ('\n* ' + form.elements[i].value + ' is required.');
				err = 1;
				rErr = 1;
			}
		}
	}
	
	// Numeric fields
	for (var i = 0; i < form.elements.length; i++) {
		index = form.elements[i].name.indexOf('_N');
		
		if (index >= 0) {
			fieldName = form.elements[i].name.substring(0, form.elements[i].name.indexOf('_'));
			if (form.elements[fieldName].value != 0) {
				if (isNaN(form.elements[fieldName].value)) {
					oMsg += ('\n* ' + form.elements[i].value + ' must be a number.');
					err = 1;
					oErr = 1;
				}
			}
		}
	}
	
	// Email addresses
	for (var i = 0; i < form.elements.length; i++) {
		index = form.elements[i].name.indexOf('_E');
		
		if (index >= 0) {
			fieldName = form.elements[i].name.substring(0, form.elements[i].name.indexOf('_'));
			if (form.elements[fieldName].value != 0) {
				if (! validateEmail(form.elements[fieldName].value)) {
					oMsg += ('\n* ' + form.elements[i].value + ' must be a valid email address.');
					err = 1;
					oErr = 1;
				}
			}
		}
	}
	
	if (err) {
		if (rErr) {
			msg += rMsg;
		}
		if (oErr) {
			msg += oMsg;
		}
		alert(msg);
		return false;
	} else {
		return checkChars(form);
	}
}



function validateEmail(email) {
	var regExPattern = /^['_a-z0-9-]+(\.['_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*\.(([a-z]{2,3})|(aero|coop|info|museum|name))$/;
	return email.match(regExPattern);
}


function checkChars(form) {
	var x = 0;
	var formOk  = true;
	while ((x < form.elements.length) && (formOk)){
		if (form.elements[x].name.indexOf('_') < 0) {
			var str = form.elements[x].value;
			var re = /(<+)|(>+)/;
			if(re.test(str)){
				formOk = false; 
				alert("Sorry, the characters '<' and '>' are not allowed on this site\rPlease adjust your form values.");
				form.elements[x].focus();
			}
		}
		x ++;
	}
	return formOk;
}
