/*
-----------------------------------------------
sitename
Script: vdwVal.js
Author: Ben Glassman
Organization: Vermont Design Works
Created: 
----------------------------------------------- */

vdwVal = {
	error_header: 'The following errors occurred',
	warningClass: 'error',
	validation:function(e) {
		var form = vdwDOM.getTarget(e);
		required = vdwDOM.getElementsByClassName(form, '*', 'required');
		var errors = new Array();
		for (var i = 0; i < required.length; i++) {
			var input;
			var label;
			if (required[i].getElementsByTagName("input")[0]) {
				input = required[i].getElementsByTagName("input")[0];
				switch (input.getAttribute("type")) {
					case "text":
					if (required[i].getElementsByTagName("label")[0].firstChild.nodeType == 3) {
						label = vdwUtil.trimString(required[i].getElementsByTagName("label")[0].firstChild.nodeValue);
					} else if (required[i].getElementsByTagName("label")[0].firstChild.firstChild.nodeType == 3) {
						label = vdwUtil.trimString(required[i].getElementsByTagName("label")[0].firstChild.firstChild.nodeValue);
					}
					if (vdwVal.missingContent(input, label) != "") {
						errors.push(vdwVal.missingContent(input, label) + " is required");
						vdwVal.setErrorClass(input, true);
					} else {
						vdwVal.setErrorClass(input, false);
					}
					if (required[i].className.indexOf('number') != '-1' && input.value != '') {
						if (!vdwVal.valNumber(input.value)) {
							errors.push(label + ' must be a positive number');
							vdwVal.setErrorClass(input, true);
						} else {
							vdwVal.setErrorClass(input, false);
						}
					}
					if (required[i].className.indexOf('currency') != '-1' && input.value != '') {
						if (!vdwVal.valCurrency(input.value)) {
							errors.push(label + ' must be a positive number');
							vdwVal.setErrorClass(input, true);
						} else {
							vdwVal.setErrorClass(input, false);
						}
					}
					if (required[i].className.indexOf("email") != "-1") {
						if (input.value != "") {
							var email = vdwVal.checkEmail(input.value);
							if (email == false) {
								errors.push("Invalid Email Address\n");
								vdwVal.setErrorClass(input, true);
							} else {
								vdwVal.setErrorClass(input, false);
							}
						}
					}
					if (input.id == "cc_number" && input.value != "") {
						var cc_number = document.getElementById('cc_number');
						var cc_type = document.getElementById('cc_type');
						var cc_month = document.getElementById('cc_month');
						var cc_year = document.getElementById('cc_year');
						cc_valid = validateCard(cc_number.value,cc_type.value,cc_month.value,cc_year.value);
						if (cc_valid != "") {
							errors.push(cc_valid);
							vdwVal.setErrorClass(input, true);
						} else {
							vdwVal.setErrorClass(input, false);
						}		
					}
					break;
					case "radio":
					label = vdwUtil.trimString(vdwVal.getRadioLabel(required[i]).nodeValue);
					if (vdwVal.valRadio(required[i].getElementsByTagName("input"), label) != "") {
						errors.push(vdwVal.valRadio(required[i].getElementsByTagName("input"), label) + " is required");
					}
					break;
					case "checkbox":
					label = vdwUtil.trimString(required[i].getElementsByTagName("p")[0].firstChild.nodeValue);
					if (vdwVal.valCheckbox(required[i].getElementsByTagName("input"), label) != "") {
						errors.push(vdwVal.valCheckbox(required[i].getElementsByTagName("input"), label) + " is required");
					}
					break;
					case "password":
					if (required[i].getElementsByTagName("label")[0].firstChild.nodeType == 3) {
						label = vdwUtil.trimString(required[i].getElementsByTagName("label")[0].firstChild.nodeValue);
					} else if (required[i].getElementsByTagName("label")[0].firstChild.firstChild.nodeType == 3) {
						label = vdwUtil.trimString(required[i].getElementsByTagName("label")[0].firstChild.firstChild.nodeValue);
					}
					if (vdwVal.missingContent(input, label) != "") {
						errors.push(vdwVal.missingContent(input, label) + " is required");
					}
					break;
				}
			} else if (required[i].getElementsByTagName("textarea")[0]) {
				input = required[i].getElementsByTagName("textarea")[0];
				label = vdwUtil.trimString(required[i].getElementsByTagName("label")[0].firstChild.nodeValue);
				if (vdwVal.missingContent(input, label) != "") {
					errors.push(vdwVal.missingContent(input, label) + " is required");
					if (input.className.indexOf(vdwVal.warningClass) == -1) {
						vdwDOM.addClass(input, vdwVal.warningClass);
					}
				}
			} else if (required[i].getElementsByTagName("select")[0]) {
				input = required[i].getElementsByTagName("select")[0];
				label = vdwUtil.trimString(required[i].getElementsByTagName("label")[0].firstChild.nodeValue);
				if (vdwVal.missingContent(input, label) != "") {
					errors.push(vdwVal.missingContent(input, label) + " is required");
					vdwVal.setErrorClass(input, true);
				} else {
					vdwVal.setErrorClass(input, false);
				}
			}
		}
		return errors;
	},
	missingContent:function(field, label) {
		var missing_empty = '';
		if (field.value == '') {
			missing_empty += label;
			if (field.className.indexOf(vdwVal.warningClass) == -1) {
				vdwDOM.addClass(field, vdwVal.warningClass);
			}
		} else {
			vdwDOM.removeClass(field, vdwVal.warningClass);
		}
		return missing_empty;
	},
	valRadio:function(fields, label) {
		var missing_empty = '';
		var checked = 0;
		for (var j = 0; j < fields.length; j++) {
			if (fields[j].checked) {
				checked = 1;
			}
		}
		if (!checked) {
			missing_empty += label;
		}
		return missing_empty;
	},
	valCheckbox:function(fields, label) {
		var missing_empty = '';
		var checked = 0;
		for (var j = 0; j < fields.length; j++) {
			if (fields[j].checked) {
				checked = 1;
			}
		}
		if (!checked) {
			missing_empty+= label;
		}
		return missing_empty;
	},
	valNumber:function(str) {
		if (isNaN(str) || str <= 0) {
			return false;
		} else {
			return true;
		}
	},
	valCurrency:function(value) {
		// Remove commas and dollar signs
		var tmp = value.replace(/\$/g, '');
		tmp = tmp.replace(/,/g, '');
		if (tmp == '' || !vdwVal.valNumber(tmp)) {
			return false;
		} else {
			return true;
		}
	},
	checkEmail:function(myForm) {
		if (/^\w+([\.-]?\w+)*@\w+([\.-]?\w+)*(\.\w{2,3})+$/.test(myForm)){
			return (true)
		}
		return (false)
	},
	displayErrors:function(errors, e) {
		var form = vdwDOM.getTarget(e);
		if (errors.length != 0) {
			if (document.getElementById('error_container')) {
				form.removeChild(document.getElementById('error_container'));
			}
			var error_container = document.createElement('div');
			error_container.className = 'errors';
			error_container.id = 'error_container';
			var error_head = document.createElement('h3');
			var error_head_txt = document.createTextNode(vdwVal.error_header);
			error_head.appendChild(error_head_txt);
			error_container.appendChild(error_head);
			var error_list = document.createElement('ul');
			var error_list_items = new Array();
			for (var k = 0; k < errors.length; k++) {
				error_list_items[k] = document.createElement('li');
				error_list_items[k].appendChild(document.createTextNode(errors[k]));
				error_list.appendChild(error_list_items[k]);
			}
			error_container.appendChild(error_list);
			form.insertBefore(error_container, form.firstChild);
			vdwUtil.fadeUp(error_container, 255, 0, 0);
			var anchor = '#' + form.id;
			if (window.location.href.indexOf(anchor) == -1) {
				window.location = window.location + anchor;
			} else {
				var url = window.location.href;
				url = url.slice(0,url.indexOf(anchor));
				window.location = url + anchor;
			}
			vdwDOM.cancelClick(e);
			return false;
		} else {
			return true;
		}	
	},
	errorsToString:function(errors, e) {
		var errorMsg = vdwVal.error_header + '\n';
		for (var i = 0; i < errors.length; i++) {
			errorMsg += errors[i] + '\n';
		}
		vdwDOM.cancelClick(e);
		return errorMsg;		
	},
	setErrorClass:function(input, error) {
		var hasErrorClass = (input.className.indexOf(vdwVal.warningClass) == -1) ? false : true;
		if (error) {
			if (!hasErrorClass) {
				vdwDOM.addClass(input, vdwVal.warningClass);
			}
		} else {
			vdwDOM.removeClass(input, vdwVal.warningClass);
		}
	},
	getRadioLabel:function(parent) {
		if (parent.getElementsByTagName('p')[0]) {
			return vdwDOM.firstChild(parent.getElementsByTagName('p')[0], 3);
		} else if (parent.parentNode.getElementsByTagName('legend')[0]) {
			return vdwDOM.firstChild(parent.parentNode.getElementsByTagName('legend')[0], 3);
		} else if (parent.parentNode.parentNode.getElementsByTagName('legend')[0]) {
			return vdwDOM.firstChild(parent.parentNode.parentNode.getElementsByTagName('legend')[0], 3);
		}
	}
}

vdwDOM.addEvent(window, 'load', function() {

	// Attach the validation to the submit event of all forms with a class of 'validate'
	var forms = document.getElementsByTagName('form');
	for (var i = 0; i < forms.length; i++) {
		if (forms[i].className.indexOf('validate') != '-1') {
			vdwDOM.addEvent(forms[i], 'submit', function(e) {
				var errors = vdwVal.validation(e);
				vdwVal.displayErrors(errors, e);
			}, false);
		}
	}
	
	/* Any additional validation */
	if (document.getElementById('contact_form')) {
		vdwUtil.swapLabel('message', 'If signing up for a program please include age and disability of the participant.');
		vdwDOM.addEvent(document.getElementById('contact_form'), 'submit', function(e) {
			var errors = vdwVal.validation(e);
			// Make sure they have entered an email OR phone number, and if they have entered an email address that it is valid
			var email = document.getElementById('email').value;
			var validEmail = vdwVal.checkEmail(email);
			if (email != '' && !validEmail) {
				errors.push('Please enter a valid e-mail addres');
			}
			if (email == '' && document.getElementById('phone').value == '') {
				errors.push('Please enter either an e-mail address or a telephone number');
			}
			vdwVal.displayErrors(errors, e);
		}, false);
	}
	
	if (document.getElementById('donation_form')) {
		vdwUtil.swapLabel('comments', 'Please provide details about matching gifts, tribute gifts or other comments.  For tribute gifts, indicate who we should notify about your gift and how to contact them. For tickets to our annual dinner, indicate the number of tickets and names of dinner guests.');
		vdwDOM.addEvent(document.getElementById('donation_form'), 'submit', function(e) {
			var errors = vdwVal.validation(e);
			// If the user has chosen a recurring donation, make sure they have selected a frequency
			var recurring_donation = document.getElementById('recurring').checked;
			var frequency_dropdown = document.getElementById('donation_frequency');
			var donation_frequency = frequency_dropdown.options[frequency_dropdown.selectedIndex].value;
			if (recurring_donation && donation_frequency == '') {
				errors.push('You have chosen to make a recurring donation. Please indicate the frequency with which you would like to donate');
			}
			vdwVal.displayErrors(errors, e);
		}, false);
	}
	
}, false);

