var validationErrorMessage = new Object();

var show_error = '1';

// specific

validationErrorMessage['username'] = 'Username dient minimaal 4 en maximaal 20 letters [a-zA-Z] en of cijfers [0-9] te bevatten';
validationErrorMessage['password'] = 'Password dient minimaal 4 en maximaal 32 letters [a-zA-Z] en of cijfers [0-9] te bevatten';

//validationErrorMessage['date_01'] = '1e keuze datum is een verplicht invulveld';
//validationErrorMessage['time_01'] = '1e keuze tijd is een verplicht invulveld';

validationErrorMessage['required_date'] = '';
validationErrorMessage['required_time'] = '';


// general

validationErrorMessage['required_checkbox'] = 'Bovenstaande checkbox is verplicht';
validationErrorMessage['required_radio'] = 'Bovenstaande radiobutton is verplicht';

validationErrorMessage['required'] = 'Bovenstaande veld is verplicht';
validationErrorMessage['numeric'] = 'Bovenstaande veld mag niet leeg zijn en alleen voorzien zijn van nummers [0-9]';
validationErrorMessage['alpha'] = 'Bovenstaande veld mag niet leeg zijn en alleen voorzien zijn van letters [a-zA-Z]';
validationErrorMessage['alphanumeric'] = 'Bovenstaande veld mag niet leeg zijn alleen voorzien zijn van nummers en letters [0-9a-zA-Z]';
validationErrorMessage['postcode'] = 'Bovenstaande veld dient een nederlands postcode te bevatten';
validationErrorMessage['pattern'] = 'Bovenstaande veld is niet goed ingevuld';
validationErrorMessage['email'] = 'Het E-mailadres wat u ingegeven heeft is niet correct';
validationErrorMessage['minlength10'] = 'Bovenstaande veld moet minimaal 10 karakters lang zijn';

var validationFunctions = new Object();

// specific

validationFunctions["username"] = isPattern;
validationFunctions["password"] = isPattern;

validationFunctions["required_date"] = isRequired;
validationFunctions["required_time"] = isRequired;

// general

validationFunctions["required"] = isRequired;
validationFunctions["required_checkbox"] = isRequired;
validationFunctions["required_radio"] = isRequired;
validationFunctions["pattern"] = isPattern;
validationFunctions["postcode"] = isPostCode;
validationFunctions["numeric"] = isnumeric;
validationFunctions["alpha"] = isalpha;
validationFunctions["alphanumeric"] = isalphanumeric;
validationFunctions["email"] = isEmail;
validationFunctions["minlength10"] = minLength10;

function isRequired(formField) {
    switch (formField.type) {
        case 'text':
        case 'password':    
        case 'textarea':
        case 'select-one':
            if (formField.value)
                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) {
    return isPattern(formField,"\\d{4}\\s*\\D{2}");
}

function isnumeric(formField) {
    return isPattern(formField,"\\d+");
}

function isalpha(formField) {
    return isPattern(formField,"\[a-zA-Z]+");
}

function isalphanumeric(formField) {
    return isPattern(formField,"\[a-zA-Z\d]+");
}

function isEmail(formField) {
    return isPattern(formField,"[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,4}")
}

function emptyFunction() {
    return true;
}

function minLength10(formField) {
    return formField.value.length >= 10;
}

/*********************************/

var W3CDOM = document.createElement && document.getElementsByTagName;

function validateForms() {
    if (!W3CDOM) return;
    var forms = document.forms;
    for (var i=0;i<forms.length;i++) {

        if (document.forms[i].show_error.value == 1) {
            show_error = '1';
        } else {
            show_error = '0';
        }

        forms[i].onsubmit = validate;
    }
}

addEventSimple(window,'load',validateForms);

function validate() {
    var els = this.elements;
    var validForm = true;
    var firstError = null;
    for (var i=0;i<els.length;i++) {
        if (els[i].removeError)
            els[i].removeError();
        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 (!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;
            }
        }
    }

    if (!validForm) {
        //alert("Errors have been found");
		
		if (show_error == 1) {
			location.hash = 'error';
		} else {
			location.hash = 'error_hidden';
		}
		
		

    }
    return validForm;
    
}

function writeError(obj,message) {

    obj.className += ' errorMessage';
    obj.onchange = removeError;
    if (obj.errorMessage || obj.parentNode.errorMessage) return;
    var errorMessage = document.createElement('div'); // label

    errorMessage.className = 'errorMessage';

    //errorMessage.setAttribute('class', 'obj.id');

    if (show_error == 1) {
        errorMessage.setAttribute('class', 'error');
    } else {
        errorMessage.setAttribute('class', 'error_hidden');
    }

    //errorMessage.setAttribute('htmlFor',obj.id);
    errorMessage.appendChild(document.createTextNode(message));
    obj.parentNode.appendChild(errorMessage);
    obj.errorMessage = errorMessage;
    obj.parentNode.errorMessage = errorMessage;
}

function removeError() {
    this.className = this.className.replace(/errorMessage/,'');
    if (this.errorMessage) {
        this.parentNode.removeChild(this.errorMessage);
        this.errorMessage = null;
        this.parentNode.errorMessage = null;
    }
    this.onchange = null;
}

