/**
 * allgemeine Formularfunktionen
 */

var   hidden = '';
var     deps = new Array();
var depcache = new Array();
var    later = new Array();
var fld_save = new Object();


function dyn_form_clear()
{
    hidden = '';
    deps = new Array();
    depcache = new Array();
    later = new Array();
    fld_save = new Object();
}

// Funktion um ein paar JavaScript-Events an Formularfelder zu binden
function bindevents()
{
    // erstes Zeichen groß schreiben
    $('.capitalize').bind('keyup',function(e){
        if ( e.keyCode != 9 ) // TABs zählen nicht
            $(this).val( $(this).val().substr(0,1).toUpperCase() + $(this).val().substr(1,$(this).val().length) ).unbind('keyup');
    });

    // ...
}

// prüft den Wert eines Formularelements

function checkElementValue ( formname, elname, operator, value )
{
    var e = document.getElementsByName ( elname );

    if ( e.length == 0 )
    {
        e = document.getElementsByName ( elname + '[]' );

        if ( e.length == 0 )
            return false;
    }

    f = new Array();

    for ( var i = 0; i < e.length; i++ )
        if ( e[i].form.name == formname )
            f.push(e[i]);

    val = false;

    switch ( f[0].type )
    {
        case 'hidden'          :
        case 'password'        :
        case 'file'            :
        case 'text'            : if ( value == '' && f[0].value.length > 0 )
                                     return eval ( 'true' + operator + 'false' );
                                 if ( f[0].value.length > 0 ) val = f[0].value;
                                 break;
        case 'select-one'      :
        case 'select-multiple' : if ( value == '' )
                                     return ( operator == '==' ) ? false : true;

                                 for ( i = 0; i < f[0].options.length; i++ )
                                     if ( f[0].options[i].value == value )
                                         return eval ( f[0].options[i].selected + operator + 'true' );
                                 break;
        case 'radio'           :
        case 'checkbox'        : if ( value == '' )
                                 {
                                     for ( i = 0; i < f.length; i++ )
                                         if ( f[i].checked )
                                             return ( eval ( 'false' + operator + 'true' ) );

                                     return ( eval ( 'true' + operator + 'true' ) );
                                 }
                                 for ( i = 0; i < f.length; i++ )
                                     if ( f[i].value == value )
                                         return eval ( f[i].checked + operator + 'true' );
                                 break;
    }

    if ( value == '' )
        return ( eval ( val + operator + 'false' ) );
    else
        return eval ( '"' + value + '"' + operator + '"' + val + '"' );
}

function checkDeps ( formid, dep )
{
    for ( stat in deps[formid][dep] )
    {
        for ( field in deps[formid][dep][stat] )
        {
            if ( stat == 'folded' )
            {
                if ( typeof depcache[deps[formid][dep]['folded'][field]] != 'undefined' )
                    truth = depcache[deps[formid][dep]['folded'][field]];
                else
                {
                    truth = eval ( deps[formid][dep]['folded'][field] );
                    depcache[deps[formid][dep]['folded'][field]] = truth;
                }

                if ( truth )
                {
                    hidden += ';' + field;
                    $('#' + field).css('display', 'none');
                }
                else
                {
                    eval("hidden = hidden.replace(/"+field+"/,'');");
                    if ( document.all )
                        $('#' + field).css('display', 'block');
                    else
                        $('#' + field).css('display', 'table-row');
                }
            }
            else if ( stat == 'frontend_required' )
            {
                if ( typeof depcache[deps[formid][dep]['frontend_required'][field]] != 'undefined' )
                    truth = depcache[deps[formid][dep]['frontend_required'][field]];
                else
                {
                    truth = eval ( deps[formid][dep]['frontend_required'][field] );
                    depcache[deps[formid][dep]['frontend_required'][field]] = truth;
                }

                if ( truth )
                {
                    if ( $('#' + field + ' .mandatory' ).size() == 0 )
                    {
                        if ( $('#' + field + ' .th_show_error label' ).size() )
                        {
                            $('#' + field + ' .th_show_error label' ).append('<span class="mandatory">*</span>');
                        }
                        else if ( $('#' + field + ' .th_label label' ).size() )
                            $('#' + field + ' .th_label label' ).append('<span class="mandatory">*</span>');
                    }
                }
                else
                {
                    $('#' + field + ' .th_show_error' ).addClass('th_label');
                    $('#' + field + ' .th_show_error' ).removeClass('th_show_error');
                    $('#' + field + ' span.mandatory' ).remove();
                }
            }
        }
    }
}

function clear_folded()
{
    if ( typeof hidden != 'undefined' )
    {
        rows = hidden.split(';');
        while ( row = rows.pop() )
            if ( $('#'+row).css('display') == 'none' && fld_save [ row ] != 1 )
                $('#'+row).remove();
    }
}

function nl2br ( text )
{
    text = text.replace ( /\n\r/g, '<br/>' );
    text = text.replace ( /\n/g,   '<br/>' );
    text = text.replace ( /\r/g,   '<br/>' );

    return text;
}

function maintainDependency ( formid, fieldid, fieldname, stat )
{
    if ( !deps[formid] )
        deps[formid] = new Array();

    if ( !deps[formid][fieldname] )
    {
        deps[formid][fieldname] = new Array();

        if ( $('#'+formid+' tr.'+fieldname).size() )
        {
            found = false;

            selectors = [ '.type_radio input',
                          '.type_check input',
                          '.type_confirm_check input' ];

            for ( sel in selectors )
            {
                $f = $('#'+formid+' tr.'+fieldname+' .type_radio input');

                if ( $f.size() )
                {
                    $f.click ( function(){ checkDeps(formid,fieldname);depcache=new Array(); } );

                    found = true;
                }
            }

            selectors = [ '.type_label input',
                          '.type_link input',
                          '.type_select select',
                          '.type_file_upload .file_upload_widget' ];

            for ( sel in selectors )
            {
                $f = $('#'+formid+' tr.'+fieldname+' .type_radio input');

                if ( $f.size() )
                {
                    $f.change ( function(){ checkDeps(formid,fieldname);depcache=new Array(); } );

                    found = true;
                }
            }

            if ( !found )
            {
                if ( !later[formid] )
                    later[formid] = new Array();

                later[formid].push(fieldname);
            }
        }
        else
        {
            if ( !later[formid] )
                later[formid] = new Array();

            later[formid].push(fieldname);
        }
    }

    if ( !deps[formid][fieldname][stat])
        deps[formid][fieldname][stat] = new Array();

    deps[formid][fieldname][stat][fieldid] = condition;
}
