var l10n = false;

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

function l10n_gettext( msgid ) {
    if( l10n && l10n[msgid] ) {
        return l10n[msgid];
    }
    return msgid;
}

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

function checkField( field, checks ) {
    // Remove previous errors
    $( field ).up( '.question' ).removeClassName( "error" );
    $( field ).up( '.question' ).getElementsBySelector( '.message' ).each( function ( message ) {
        message.remove();
    } );

    var question = $( field ).up( '.question' );
    var errorMessage = null;
    if( $( question ).down( 'legend' ) ) {
        var label = $( question ).down( 'legend' ).innerHTML;
    }
    else if( $( question ).down( 'label' ) ) {
        var label = $( question ).down( 'label' ).innerHTML;
    }

    //*************************************************************
    // Checks
    //*************************************************************

    // Required field ( text input, select, checkboxes )
    if( ( errorMessage == null ) && in_array( 'required', checks ) ) {
        if( ( $( question ).hasClassName( 'checkboxes' ) && $( question ).down( "input:checked") == null )
            || ( !$( question ).hasClassName( 'checkboxes' ) && ( $F( field ).match( new RegExp( '^\\s*$', 'gi' ) ) != null ) ) ) {
            errorMessage = new Element( 'div', { 'class': 'message' } ).update( '&nbsp;' + l10n_gettext( 'est un champ obligatoire' ) );
        }
    }


    // Other checks for text inputs only
    if( !$( question ).hasClassName( 'checkboxes' ) ) {
        // Not mail field
        if( ( errorMessage == null ) && ( in_array( 'nomail', checks ) ) && ( $F( field ).match( new RegExp( '^([^@]+@[^@]+\.(aero|arpa|biz|com|coop|edu|gov|info|int|museum|mil|name|net|org|pro|travel|[a-z]{2}))$', 'gi', 'gi' ) ) != null ) ) {
            var errorMessage = new Element( 'div', { 'class': 'message' } ).update( '&nbsp;' + l10n_gettext( 'ne peut pas contenir une adresse de courrier électronique (par exemple: vous@domaine.com)' ) );
        }

        // Mail field
        if( ( errorMessage == null ) && ( in_array( 'mail', checks ) ) ) {
            if( $F( field ).match( new RegExp( '^([^@]+@[^@]+\.(aero|arpa|biz|com|coop|edu|gov|info|int|museum|mil|name|net|org|pro|travel|[a-z]{2}))$', 'gi' ) ) == null )
                var errorMessage = new Element( 'div', { 'class': 'message' } ).update( '&nbsp;' + l10n_gettext( 'est un champ de type adresse de courrier électronique (par exemple: vous@domaine.com), et n\'accepte qu\'une seule adresse' ) );
            else if( $F( field ).match( new RegExp( '[àâäçéèêëîïôöûüÀÂÄÇÉÈÊËÎÏÔÖÛÜ]', 'gi' ) ) != null )
                var errorMessage = new Element( 'div', { 'class': 'message' } ).update( '&nbsp;' + l10n_gettext( 'ne peut pas contenir de caractère accentué' ) );
        }

        // site (URL) field
        if( ( errorMessage == null ) && in_array( 'site', checks ) ) {
            var reStr = '^(https{0,1}:\/\/){0,1}([a-z0-9]+(\\.|\-|[a-z0-9])+[a-z0-9]+)\.(aero|arpa|biz|com|coop|edu|gov|info|int|museum|mil|name|net|org|pro|travel|[a-z]{2})\/{0,1}$';
            var res = $F( field ).match( new RegExp( reStr, 'gi' ) );
            if( res == null ) {
                var errorMessage = new Element( 'div', { 'class': 'message' } ).update( '&nbsp;' + l10n_gettext( "est un champ de type adresse de site Internet (par exemple: www.mon-site.com)" ) );
            }
        }

        // Téléphone
        if( ( errorMessage == null ) && in_array( 'telephone', checks ) ) {
            var reStr = '^([0-9]{4,20}){0,1}$';
            var value = $F( field );
            var res = ( value.replace( new RegExp( '(\.| |\\+|\(|\)|\-)', 'gi' ), '' ) ).match( new RegExp( reStr, 'gi' ) );
            if( res == null ) {
                var errorMessage = new Element( 'div', { 'class': 'message' } ).update( '&nbsp;' + l10n_gettext( "est un champ de type numéro de téléphone (par exemple: 33 (0)6.08.08.08.08)" ) );
            }
        }

        // integer
        if( ( errorMessage == null ) && in_array( 'integer', checks ) ) {
            if( $F( field ).match( new RegExp( '^([0-9]+)$', 'gi' ) ) == null ) {
                var errorMessage = new Element( 'div', { 'class': 'message' } ).update( '&nbsp;' + l10n_gettext( "doit contenir un nombre entier (par exemple: 1546)" ) );
            }
        }

        // date
        if( ( errorMessage == null ) && in_array( 'date', checks ) ) {
            if( $F( field ).match( new RegExp( '^([0-9]{2}\/[0-9]{2}\/[0-9]{4})$', 'gi' ) ) == null ) {
                var errorMessage = new Element( 'div', { 'class': 'message' } ).update( '&nbsp;' + l10n_gettext( "doit contenir une date au format jj/mm/aaaa (par exemple: 25/12/2008)" ) );
            }
        }
    }

    //*************************************************************
    // Error message
    //*************************************************************
    if( errorMessage != null ) {
        var text = new Element( 'strong', {} ).update( "" + label + "" );
        errorMessage.insert( { top: text } );
        $( question ).insert( { top: errorMessage } );
        $( question ).addClassName( "error" );
    }
}

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

function markForm( form ) {
    $( form ).getElementsBySelector( '.formMessage.error' ).each( function ( message ) {
        message.remove();
    } );

    var nErrors = $( form ).getElementsBySelector( '.question.error' ).length;
    if( nErrors > 0 ) {
        var tmp = new Element( 'strong', {} ).update( nErrors );
        var errorMessage = new Element( 'div', { 'class': 'formMessage error'} ).update( sprintf( l10n_gettext( 'Votre formulaire comporte %s erreur' + ( nErrors > 1 ? 's' : '' ) ) + '.', Element.wrap( tmp, 'div' ).innerHTML ) );
        $( form ).insert( { 'top': errorMessage } );
    }
}

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

function checkForm( form, checks ) {
    for( var field in checks ) {
        checkField( $( field ), checks[field] );
    }

    markForm( form );
    var nErrors = 0;
    if( $( form ).down( '.question.error' ) )
        nErrors = $( form ).down( '.question.error' ).length;

    return ( nErrors == 0 );
}
