/**
*
* Form validatie class
* Aron 15/08/06
*
* Versie:        1.1
* Laatste update:   01-09-2006
*
* Deze class maakt het client-side valideren van formulieren makkelijk :)
*
* Hoe te gebruiken:
* ------------------------
* Voeg aan het te valideren formulier de class 'validate' toe.
* Voeg aan de te valideren velden de class 'required' toe.
*
* De class voegt automatisch meldingen toe bij de desbetreffende velden. Deze zijn d.m.v CSS te stylen, bv:
*       .errFld - het input veld
*    .errMsg - het error bericht
*
* form .errFld {
*    border: 1px solid #F00;
* }
* form .errMsg {
*    color: #CC3333;
*    display: block;
* }
*
* UPDATES
* ------------------------
* 17-08-2006  Aron  ADDED:      Integer test toegevoegd
*                FIXED:      geen dubbele foutmeldingen weergeven
*                FIXED:      textareas werken nu.
* 30-08-2006  Aron  ADDED:      MAJOR FEATURE: vanaf nu is toevoegen van classname 'validate' aan formulier genoeg.
*                ADDED:      CLASS: validate-email
* 01-09-2006  Aron  FIXED:      Integer & email veld was standaard verplicht
* 05-09-2006  Aron  ADDED:      select-box validatie! woohoo!
* 12-09-2006  Aron  ADDED:      postcode validatie en stripspaces functie
*                FIXED:      wanneer een veld op 2 condities wordt gevalideert, wordt de foutmelding nu correct
*                            geupdated wanneer 1 van de 2 condities voldoet.
*                FIXED:      major bug in addValidationHandlers() gefixed waardoor het script niet werkte in IE.
*
*/


// STRING MATCH FUNCTIES

String.prototype.isInteger = function() {
    var regexp = /^\d+$/;
    return regexp.test(this);
}

String.prototype.isEmail = function() {
    var regexp = /^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/;
    return regexp.test(this);
}

String.prototype.isDate = function() {
    var regexp = /^\d{2}-\d{2}-\d{4}$/
    return regexp.test(this);
}

String.prototype.isPostcode = function() {
    var regexp = /^\d{4}\s{0,1}\w{2}$/;
    return regexp.test(this);
}
String.prototype.stripSpaces = function() {
    return this.replace(/\s+/g, '');
}


// ONLOAD HANDLER

function addValidationHandlers() {
    var allForms = document.getElementsByTagName('form');
    var numForms = allForms.length;
    if (numForms < 1) return false;
    for (var i = 0; i < numForms; i++) {
        if (Element.hasClassName(allForms[i], 'validate')) {
            Event.observe(allForms[i], 'submit', (function(e) {
                validateForm(this, true, e);
            }).bind(allForms[i]));
        }
    }
}

// BEGIN CLASS

function validateForm(form, showalert, e) {

    var self = this;

    this.showAlert = showalert;
    this.errorCount = 0;
    this.errors = new Array();

    //--------------------------------
    // BEGIN INTERNE FUNCTIES
    //--------------------------------

    this.attachError = function(element, message) {
        if (!message) message = 'required';
        Element.addClassName(element, 'errFld');

        // foutmelding verwijderen wanneer er al een bestaat
        if ($('error_'+element.getAttribute('name'))) Element.remove('error_'+element.getAttribute('name'));

        // foutmelding aanmaken
        var node = document.createElement('span');
        node.setAttribute('id', 'error_'+element.getAttribute('name'));
        node.className = 'errMsg';
        var text = document.createTextNode(message);
        node.appendChild(text);
        element.parentNode.appendChild(node);
        return true;
    }

    this.detachError = function(element) {
        if (Element.hasClassName(element, 'errFld')) {
            Element.removeClassName(element, 'errFld');
            var el = $('error_'+element.getAttribute('name'));
            if (el) {
                Element.remove('error_'+element.getAttribute('name'));
            }
        }
    }
    


    this.isVisible = function isVisible(e) {

        e = $(e);
        
        while (e.nodeName.toLowerCase() != 'body' && e.style.display.toLowerCase() != 'none' && e.style.visibility.toLowerCase() != 'hidden') {
            e = e.parentNode;
        }
        if (e.nodeName.toLowerCase() == 'body') {
            return true;
        } else{
            return false;
        }
    }

    

    this.validate = function(element) {
        // integer check
        if (Element.hasClassName(element, 'integer')) {
            if (!element.value.isInteger() && element.value != '') {
                this.attachError(element, 'This field requires an integer value!');
                this.errors[this.errorCount++] = element;
                return false;
            }
        }

        // email check
        if (Element.hasClassName(element, 'validate-email')) {
            if (!element.value.isEmail() && element.value != '') {
                this.attachError(element, 'Invalid e-mailaddress');
                this.errors[this.errorCount++] = element;
                return false;
            }
        }

        // postcode check
        if (Element.hasClassName(element, 'validate-postcode')) {
            if (!element.value.isPostcode() && element.value != '') {
                this.attachError(element, 'This is not a valid postal code!');
                this.errors[this.errorCount++] = element;
                return false;
            }
        }

        // datum check
        if (Element.hasClassName(element, 'validate-date')) {
            if (!element.value.isDate() && element.value != '') {
                this.attachError(element, 'This is not a valid date! Please use the format <b>30-12-2006</b>');
                this.errors[this.errorCount++] = element;
                return false;
            }
        }


        // lege value check
        if (Element.hasClassName(element, 'required')) {

            // uitzondering: aparte check voor selects
            if (element.tagName.toLowerCase() == 'select') {

                var si = element.options[element.selectedIndex].value;

                if (si == '' || parseInt(si) == 0) {
                    this.attachError(element);
                    this.errors[this.errorCount++] = element;
                    return false;
                }
                
            } else {

                if (element.value == '') {
                    this.attachError(element);
                    this.errors[this.errorCount++] = element;
                    return false;
                }

            }
        }

        return true;

    }

    //--------------------------------
    // EINDE INTERNE FUNCTIES
    //--------------------------------

    var elements = Form.getElements(form);
    var elementCount = elements.length;

    for (var i=0; i<elementCount;i++) {

        switch (elements[i].tagName.toLowerCase()) {

            case 'input':
            case 'textarea':
            case 'select':

            // velden die op dit moment een foutmelding bevatten controleren
            if (Element.hasClassName(elements[i], 'errFld')) {
                if (this.validate(elements[i])) {
                    this.detachError(elements[i]);
                    continue;
                }
            }

            if (this.isVisible(elements[i])) this.validate(elements[i]);

            break;

            default:

            continue;

        }
    }

    if (this.errorCount > 0) {
        if (this.showAlert) alert('ERROR: '+this.errorCount+' '+((this.errorCount>1)?'errors':'error')+' occured while trying to submit the form');
        if (e) Event.stop(e);
        return false;
    } else {
        return true;
    }
}

// ONLOAD HANDLER
Event.observe(window, 'load', addValidationHandlers);
