/*
    Helder Internet FormValidation
    31/08/07 v0.1
*/

function formValidation_validationsObject()
{
    this.validations = {
        'required':{
            regexp: /^(.)+$/,
            defaultErrorMessage: 'required field'
        },
        'email':{
            regexp:/^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9])+$/,
            defaultErrorMessage: 'invalid email address'
        },
		'email2':{
            regexp:/^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9])+$/,
            defaultErrorMessage: 'invalid email address'
        }
    }
}

function formValidation_validateOnSubmit( form, configObject )
{
    if ( configObject )
    {
        var rules = configObject.getRules();
        var validationsObject = new formValidation_validationsObject();
        var errors = [];
        
        // remove error messages
        if ( rules && rules.length > 0 )
        {
            for ( var x=0; x < rules.length; x++ )
            {
                var rule = rules[x];
                if ( rule && rule.name && form.elements[ rule.name ] )
                {
                    if ( rule.errorElementId )
                    {
                        if ( document.getElementById && document.getElementById( rule.errorElementId ) )
                        {
                            var elm = document.getElementById( rule.errorElementId );
                            if ( typeof( elm.innerText ) != 'undefined' )
                            {
                                elm.innerText = '';
                            }
                            else if ( typeof( elm.textContent ) != 'undefined' )
                            {
                                elm.textContent = '';
                            }
                        }
                    }
                }
            }
        }

        // check rules
        if ( rules && rules.length > 0 )
        {
            for ( var x=0; x < rules.length; x++ )
            {
                var rule = rules[x];
                if ( rule && rule.check )
                {
                    var check = rule.check;
                    if ( typeof( check ) == 'string' && check.indexOf( "(" ) == -1 ) // standaard check, geen custom functie
                    {
                        var check = validationsObject.validations[ rule.check ];
                        if ( check )
                        {
                            if ( rule.name && form.elements[ rule.name ] )
                            {
                                var value = form.elements[ rule.name ].value || '';
                                if ( !check.regexp.test( value ) )
                                {
                                    // invalid value
                                    if ( !rule.errorMessage )
                                    {
                                        if ( configObject.defaultErrorMessage )
                                        {
                                            rule.errorMessage = configObject.defaultErrorMessage;
                                        }
                                        else if ( check.defaultErrorMessage )
                                        {
                                            rule.errorMessage = check.defaultErrorMessage;
                                        }
                                    }
                                    errors.push( rule );
                                }
                            }
                        }
                        else
                        {
                            systemError( "formValidation config error: unknown check supplied: '" + rule.check + "'" );
                        }
                    }
                    else if ( typeof( check ) == 'string' && check.indexOf( "(" ) > -1 )
                    {
                        try
                        {
                            if ( !eval( rule.check ) )
                            {
                                if ( !rule.errorMessage )
                                {
                                    if ( configObject.defaultErrorMessage )
                                    {
                                        rule.errorMessage = configObject.defaultErrorMessage;
                                    }
                                    else
                                    {
                                        systemError( "formValidation config error: missing error message for: '" + rule.check + "'" );
                                    }
                                }
                                errors.push( rule );
                            }
                        }
                        catch ( e )
                        {
                            if ( String( e.description || '' ).indexOf( 'Object' ) > -1 )
                            {
                                systemError( "formValidation config error: unknown check supplied: '" + rule.check + "'" );
                            }
                            else
                            {
                                systemError( e.description );
                            }
                        }
                    }
                    else if ( typeof( check ) == 'object' )
                    {
                        try
                        {
                            if ( !rule.check() )
                            {
                                if ( !rule.errorMessage )
                                {
                                    if ( configObject.defaultErrorMessage )
                                    {
                                        rule.errorMessage = configObject.defaultErrorMessage;
                                    }
                                    else
                                    {
                                        systemError( "formValidation config error: missing error message for: '" + rule.check + "'" );
                                    }
                                }
                                errors.push( rule );
                            }
                        }
                        catch ( e )
                        {
                            if ( String( e.description || '' ).indexOf( 'Object' ) > -1 )
                            {
                                systemError( "formValidation config error: unknown check supplied: '" + rule.check + "'" );
                            }
                            else
                            {
                                systemError( e.description );
                            }
                        }
                    }
                }
                else
                {
                    systemError( "formValidation config error: no check attribute supplied" );
                }
            }
        }
        
        // shows errors
        if ( errors && errors.length > 0 )
        {
            var focusElm = null;
            var alertMessage = null;
            for ( var x=0; x < errors.length; x++ ) 
            {
                var error = errors[x];
                if ( error )
                {
                    var message = error.errorMessage || '';
                    if ( error.errorElementId && document.getElementById( error.errorElementId ) )
                    {
                        if ( document.getElementById )
                        {
                            var elm = document.getElementById( error.errorElementId );
                            if ( typeof( elm.innerText ) != 'undefined' )
                            {
                                elm.innerText = message;
                            }
                            else if ( typeof( elm.textContent ) != 'undefined' )
                            {
                                elm.textContent = message;
                            }
                        }
                    }
                    else
                    {
                        if ( !focusElm && !alertMessage )
                        {
                            // only show alert message when there's no previous object with focus and errorMessageElement
                            alertMessage = message;
                        }
                    }
                    if ( error.name && form.elements[ error.name ] && !focusElm )
                    {
                        focusElm = form.elements[ error.name ];
                    }                    
                }
            }
            if ( alertMessage )
            {
                alert( alertMessage );
            }
            if ( focusElm )
            {
                focusElm.focus();
            }
            return false;
        }
    }
    return true;
}

function formValidation_validateOnBlur( element, configObject )
{
    if ( configObject )
    {
        var rules = configObject.getRules();
        var validationsObject = new formValidation_validationsObject();
        var errors = [];
        
        // remove error messages
        if ( rules && rules.length > 0 )
        {
            for ( var x=0; x < rules.length; x++ )
            {
                var rule = rules[x];
                if ( rule && rule.name && rule.name == element.name && rule.errorElementId )
                {
                    if ( document.getElementById && document.getElementById( rule.errorElementId ) )
                    {
                        var elm = document.getElementById( rule.errorElementId );
                        if ( typeof( elm.innerText ) != 'undefined' )
                        {
                            elm.innerText = '';
                        }
                        else if ( typeof( elm.textContent ) != 'undefined' )
                        {
                            elm.textContent = '';
                        }
                    }
                }
            }
        }

        // check rules
        if ( rules && rules.length > 0 )
        {
            for ( var x=0; x < rules.length; x++ )
            {
                var rule = rules[x];
                if ( rule && rule.check )
                {
                    if ( rule.name && rule.name == element.name )
                    {
                        var check = rule.check;
                        if ( typeof( check ) == 'string' && check.indexOf( "(" ) == -1 ) // standaard check, geen custom functie
                        {
                            var check = validationsObject.validations[ rule.check ];
                            var value = element.value || '';
                            if ( !check.regexp.test( value ) )
                            {
                                // invalid value
                                if ( !rule.errorMessage )
                                {
                                    if ( configObject.defaultErrorMessage )
                                    {
                                        rule.errorMessage = configObject.defaultErrorMessage;
                                    }
                                    else if ( check.defaultErrorMessage )
                                    {
                                        rule.errorMessage = check.defaultErrorMessage;
                                    }
                                }
                                errors.push( rule );
                            }
                        }
                        else if ( typeof( check ) == 'string' && check.indexOf( "(" ) > -1 )
                        {
                            try
                            {
                                if ( !eval( rule.check ) )
                                {
                                    if ( !rule.errorMessage )
                                    {
                                        if ( configObject.defaultErrorMessage )
                                        {
                                            rule.errorMessage = configObject.defaultErrorMessage;
                                        }
                                        else
                                        {
                                            systemError( "formValidation config error: missing error message for: '" + rule.check + "'" );
                                        }
                                    }
                                    errors.push( rule );
                                }
                            }
                            catch ( e )
                            {
                                if ( String( e.description || '' ).indexOf( 'Object' ) > -1 )
                                {
                                    systemError( "formValidation config error: unknown check supplied: '" + rule.check + "'" );
                                }
                                else
                                {
                                    systemError( e.description );
                                }
                            }
                        }
                        else if ( typeof( check ) == 'object' )
                        {
                            try
                            {
                                if ( !rule.check() )
                                {
                                    if ( !rule.errorMessage )
                                    {
                                        if ( configObject.defaultErrorMessage )
                                        {
                                            rule.errorMessage = configObject.defaultErrorMessage;
                                        }
                                        else
                                        {
                                            systemError( "formValidation config error: missing error message for: '" + rule.check + "'" );
                                        }
                                    }
                                    errors.push( rule );
                                }
                            }
                            catch ( e )
                            {
                                if ( String( e.description || '' ).indexOf( 'Object' ) > -1 )
                                {
                                    systemError( "formValidation config error: unknown check supplied: '" + rule.check + "'" );
                                }
                                else
                                {
                                    systemError( e.description );
                                }
                            }
                        }
                    }
                }
                else
                {
                    systemError( "formValidation config error: no check attribute supplied" );
                }
            }
        }
        
        // shows errors
        if ( errors && errors.length > 0 )
        {
            var focusElm = null;
            var alertMessage = null;
            for ( var x=0; x < errors.length; x++ ) 
            {
                var error = errors[x];
                if ( error )
                {
                    var message = error.errorMessage || '';
                    if ( error.errorElementId )
                    {
                        if ( document.getElementById && document.getElementById( error.errorElementId ) )
                        {
                            var elm = document.getElementById( error.errorElementId );
                            if ( typeof( elm.innerText ) != 'undefined' )
                            {
                                elm.innerText = message;
                            }
                            else if ( typeof( elm.textContent ) != 'undefined' )
                            {
                                elm.textContent = message;
                            }
                        }
                    }
                    else
                    {
                        if ( !alertMessage )
                        {
                            alertMessage = message;
                        }
                    }             
                }
            }
            if ( alertMessage )
            {
                alert( alertMessage );
            }
        }
    }
}

function formValidation_configObject()
{
    var rules = [];
    this.defaultErrorMessage = '';
    
    this.addRule = function( paramObject )
    {
        rules.push( paramObject );
    }
    
    this.getRules = function()
    {
        return rules;
    }
}

function systemError( s )
{
    alert( s );
}
