var validationErrorMessage = new Object();
validationErrorMessage['required'] = 'This field is required';
validationErrorMessage['numeric'] = 'This field requires a number';
validationErrorMessage['postcode'] = 'This field must hold a US or Canadian postal code';
validationErrorMessage['pattern'] = 'Pattern incorrect';
validationErrorMessage['password'] = 'Password must be at least four letters long.';

var validationFunctions = new Object();
validationFunctions["required"] = isRequired;
validationFunctions["pattern"] = isPattern;
validationFunctions["postcode"] = isPostCode;
validationFunctions["numeric"] = isnumeric;
validationFunctions["email"] = isEmail;
validationFunctions["password"] = isPassword;

function isRequired(formField) {
	switch (formField.type) {
		case 'text':
		case 'password':
		case 'textarea':
		case 'select-one':
			if (formField.value && formField.value != '-1')
				return true;
			return false;
		case 'radio':
			var radios = formField.form[formField.name];
			for (var i=0;i<radios.length;i++) {
				if (radios[i].checked) return true;
			}
			return false;
		case 'checkbox':
			return formField.checked;
	}	
}

function isPattern(formField,pattern) {
	var pattern = pattern || formField.getAttribute('pattern');
	var regExp = new RegExp("^"+pattern+"$","");
	var correct = regExp.test(formField.value);
	if (!correct && formField.getAttribute('patternDesc'))
		correct = formField.getAttribute('patternDesc');
	return correct;
}

function isPostCode(formField)
{
    var str = formField.value;
    var str = trimAll(str);
    if (str.match(/^\d{5}$/)) {
        return true;
    }
    str = str.toUpperCase();
    if (str.match(/^[A-Z][0-9][A-Z][0-9][A-Z][0-9]$/)) {
        return true;
    }
    if (str.match(/^[A-Z][0-9][A-Z].[0-9][A-Z][0-9]$/)) {
        return true;
    }
    return false;
}

function isnumeric(formField) {
	return isPattern(formField,"\\d+");
}

function isPassword(formField) {
	return (formField.value.length >= 4);
}

function isEmail(formField) {
	return emailCheck(formField.value.toLowerCase());
}

function emptyFunction() {
	return true;
}

function validate() {
	var els = getFormFieldsForNode(getStepDiv(step));
	var validForm = true;
	var firstError = null;
	for (var i=0;i<els.length;i++) {
	    try
	    {
	        removeEvent(els[i], 'change', removeError);
	    }
	    catch(e)
	    {
	    }
	    
		var req = els[i].getAttribute('validation');
		if (!req) continue;
		var reqs = req.split(' ');
		if (els[i].getAttribute('pattern'))
			reqs[reqs.length] = 'pattern';
		for (var j=0;j<reqs.length;j++) {
		    if (els[i].disabled) continue;
			if (!validationFunctions[reqs[j]])
				validationFunctions[reqs[j]] = emptyFunction;
			var OK = validationFunctions[reqs[j]](els[i]);
			if (OK != true) {
				var errorMessage = OK || validationErrorMessage[reqs[j]];
				writeError(els[i],errorMessage)
				validForm = false;
				if (!firstError)
					firstError = els[i];
				break;
			}
		}
	}
	return validForm;
}

function writeError(obj,message) {
	obj.className += ' errorMessage';
	if (message)
		alert(message);
	addEvent(obj, 'change', removeError);
}

function removeError(e) {
	if (!e) var e = window.event;
	var tg = e.target || e.srcElement;

	tg.className = tg.className.replace(/errorMessage/,'');
	removeEvent(tg, 'change', removeError);
}