var MAXLEN = 255;

var fields = {
 name:    ['X', true,  'Name'],
 email:   ['E', true,  'Email address'],
 seats:   ['N', true,  'Number of tickets'],
 needs:   ['X', false, 'Special needs']
};

var form;

function validate(f) {
	var msg = '';
	form    = f;

	for (var name in fields) {
		var type = fields[name][0];

		if (isRequired(name) && noData(name)) {
			msg += "REQUIRED: " + description(name) + "\n";
		}
		else if (!isValid(name,type)) {
			msg += "INVALID TYPE: " + description(name) + "\n";
		}
		else if (isTooLong(name)) {
			msg += "TEXT TOO LONG: " + description(name) + "\n";
		}
	}

	if (msg) { 
		alert("Trouble with the following fields:\n\n" + msg);
		return false;
	}

	return true;
}

function description(name) {
	return (fields[name][2] != '' ?  fields[name][2] : name);
}

function isRequired(name) {
	return fields[name][1];
}

function noData(name) {
	var elem = form[name];
	var type = fields[name][0];

	switch (type) {
	case 'R':
		if (!elem[0].checked && !elem[1].checked) return true;
		break;
	default:
		if (elem.value == '') return true;
	}
	return false;
}

function isTooLong(name) {
	var elem = form[name];

	if (elem && (elem.type == 'textarea' || elem.type == 'text')) {
		return elem.value.length > MAXLEN;
	} 
	return false;
}
	
function isValid(name, type) {
	var elem = form[name];
	switch (type) {
	case 'N':
		return isNumber(elem);
	case 'E':
		return isEmail(elem);
	}
	return true;
}

function isEmail(elem) {
	var re = /^[a-z0-9]+([_.-][a-z0-9]+)*@[a-z0-9]+([_.-][a-z0-9]+)*\.[a-z]{2,4}$/i;
	return re.test(elem.value) || elem.value == '';
}

function isNumber(elem) {
	var re = /^[\d]*$/;
	return re.test(elem.value);
}
