
function is_emailaddress(value) {
    var pattern = /^[A-Za-z0-9\!\#\$\%\&\'\*\+\-\/\=\?\^\_\`\{\|\}\~\.]+@[A-Za-z0-9_\-\.]+\.[A-Za-z]+$/;

    return pattern.test(value);
}

function is_telefoonnummer(value) {
    var pattern = /^\s*[+]?\s*([0-9][\s-]*){10,}$/;
    return pattern.test(value);
}

function is_postcode(value) {
    var pattern = /^[1-9]\d{3} *[A-Za-z]{2}$/;
    return pattern.test(value);
}

function is_postcode_cijfers(value) {
    var pattern = /^[1-9]\d{3} *$/;
    return pattern.test(value);
}

function is_anything(value) {
    var pattern = /^.+$/;
    return pattern.test(value);
}

function is_http_url(value) {
    var pattern = /^https?:\/\/.*$/;
    return pattern.test(value);
}

function is_sloppy_url(value) {
    var pattern = /\./;
    return pattern.test(value);
}

function getCheckedByName(form, name) {
    return $(form.id).getElements().findAll(
                function(element) {
                    return( element.name == name
                            && element.checked );
                } );
}

var labelRegisters     = new Hash();
var requiredRegisters  = new Hash();
var validationRegister = new Hash();

function registerLabel(formId, inputName, label) {
    registerValue(labelRegisters, formId, inputName, label);
}

function registerRequiredInput(formId, inputName, errorMsg) {
    registerValue(requiredRegisters, formId, inputName, errorMsg);
}


function combine_checks(check_a, check_b)  {
    if ( ! check_b) { return check_a; };
    if ( ! check_a) { return check_b; };

    return function() {
        var result = check_a(arguments);
        if (result) { return result; };
        return check_b(arguments);
    };
}

function registerValidationFunction(formId, inputName, nextFunction) {
    if (validationRegister.get(formId)) {
        var previousFunction = validationRegister.get(formId).get(inputName);
        nextFunction = combine_checks(previousFunction, nextFunction);
    }
    registerValue(validationRegister, formId, inputName, nextFunction);
}

function registerValue(register, formId, inputName, value) {
    if (!register.get(formId)) {
        register.set(formId, new Hash());
    }

    register.get(formId).set(inputName, value);

    return;
}

function validateForm(form) {
    form = $(form.id);
    var requiredErrors   = checkRequired(form);

    var validationErrors = checkValues(form);

    requiredErrors.keys().each(
        function(key) { validationErrors.unset(key); }
    );

    var labels = labelRegisters.get(form.id);

    var requiredMsg = "";

    if (requiredErrors.keys().length > 0) {
        if (requiredErrors.keys().length == 1) {
            requiredMsg = "    Het veld \"" + labels.get(requiredErrors.keys().first())  + "\" is niet ingevuld.\n";
        }
        else {
            requiredMsg = "    De volgende velden zijn niet ingevuld:\n";
            requiredErrors.keys().each(
                function(key) {
                    requiredMsg += "    - \"" + labels.get(key) + "\"\n";
                }
            );
        }
    }

    var validationMsg = "";

    validationErrors.keys().each(
        function(key) {
            validationMsg += "    - " + validationErrors.get(key) + "\n";
        }
    );

    if (requiredMsg != "" || validationMsg != "") {
        var msg = "Het formulier kan niet verzonden worden:\n";

        if ( requiredMsg.length > 0  ) {
            msg += "----------------------------------------------------------\n";
            msg += requiredMsg;
        }
        if ( validationMsg.length > 0  ) {
            msg += "----------------------------------------------------------\n";
            msg += validationMsg;
        }

        msg = msg.replace(/\n\n\n/, "\n\n");
        alert(msg);
        return false;
    }

    return true;
}

function checkValues(form) {
    var errors = new Hash();

    if( !validationRegister.get(form.id) ) {
        return errors;
    }

    validationRegister.get(form.id).each(
        function(pair) {
            var error = pair.value( form );
            if( error ) {
                errors.set( pair.key, error );
            }
        }
    );

    return errors;
}


function checkRequired(form) {
    var errors = new Hash();

    if( !requiredRegisters.get(form.id) ) {
        return errors;
    }

    requiredRegisters.get(form.id).each(
        function(pair) {
            if (! form
                    .getElements()
                    .findAll( function(element) { return element.name == pair.key })
                    .any( function(element) { return element.getValue() } )
               )
            {
                errors.set(pair.key, pair.value);
            }
        }
    );

    return errors;
}


function getValueOfRadioButton( form, name ) {
    var checked = getCheckedByName(form, name);

    if( checked.length > 0 ) {
        return checked.first().value;
    } else {
        return null;
    }
}

