/**
 * 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').addClass('closed1');
                }
                else
                {
                    eval("hidden = hidden.replace(/"+field+"/,'');");

                    $('#' + field).removeClass('closed1');

                    $('#' + field).each(function(){
                        if ( !$(this).hasClass('closed2') )
                            _unfold ( $(this) );
                    });
                }
            }
            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).hasClass('closed1') )
                 if ( !( fld_save [ row ] && eval ( fld_save [ row ] ) ) )
                      $('#'+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+' '+selectors[sel]);

                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+' '+selectors[sel]);

                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 ( typeof deps[formid][fieldname][stat] == 'undefined' )
        deps[formid][fieldname][stat] = new Array();

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

var first_block = true;
var firstcssclass;

function fold_blocks ( jqel )
{
    if ( jqel.hasClass ( 'tblock' ) )
    {
        if ( first_block )
        {
            first_block = false;
            jqel.addClass('tblock_active');

            firstcssclass = jqel.attr('class').match ( /\bblock_[0-9]+\b/g );
        }

        jqel
            .mouseover(function(){
                $(this).css('cursor','pointer');
                $(this).addClass('tblock_hover');
            })

            .mouseout(function(){
                $(this).removeClass('tblock_hover');
            })

            .click(function(){
                if($(this).hasClass('tblock_active'))
                    $(this).removeClass('tblock_active');
                else
                    $(this).addClass('tblock_active');

                var cssclass = $(this).attr('class').match ( /\bblock_[0-9]+\b/g );

                if ( !$('.cblock.'+cssclass).hasClass('closed2') )
                {
                    $('.cblock.'+cssclass).addClass('closed2').css('display','none');
                }
                else
                {
                    $('.cblock.'+cssclass).removeClass('closed2');

                    $('.cblock.'+cssclass).each(function(){
                        if ( !$(this).hasClass('closed1') )
                            _unfold ( $(this) );
                    });
                }
            });
    }
    else if ( !jqel.hasClass(firstcssclass) && jqel.hasClass('cblock') )
    {
        jqel.css('display','none').addClass('closed2');
    }
}

function _unfold ( jqel )
{
    if ( document.all )
        jqel.css('display', 'block');
    else
        jqel.css('display', 'table-row');

    // IE macht das leider nicht und stellt dann nicht
    // mal die Schrift weichgezeichnet dar
    if ( !document.all )
        jqel.css('opacity','0').animate({'opacity': '1'}, 500);
}