$(function () {
    var pngs = $("img[src$=png]");
    if (pngs.length) {
        pngs.pngfix();
    }

    // aktualisieren-buttons ausblenden
    $(".btn_refresh").hide();

    // radio-optionen zentrieren
    $(".input:has(.radio)").each(function () {
        // breite aller radios insgesamt errechnen
        var totalWidth = 0;
        var parentWidth = $(this).width();
        var childCount = $(this).find(".radio").length;
        $(this).find(".radio").each(function () {
            totalWidth += $(this).width();
        });
        
        if (totalWidth < parentWidth) {
            $(this).find(".radio").each(function () {
                $(this).width((parentWidth / childCount) - 1 - 4);
            });
        }
    });

    
        // höhe der radios anpassen
    var adjustHeight = function () {
        if ($.browser.msie && $.browser.version.match(/^6/)) {
            return;
        }
        $(".input:has(.radio)").each(function () {
            var maxHeight = 0;
            var radios;
            var radioTitles = $(this).find(".radio div.optionText").each(function () {
                var thisHeight = $(this).height();
                if (thisHeight > maxHeight) {
                    maxHeight = thisHeight;
                }
            });
            if (maxHeight > 0) {
                radioTitles.css({height: maxHeight});
            } else {
                radioTitles.css({height: "auto"});
            }

            maxHeight = 0;
            radios = $(this).find(".radio").each(function () {
                var thisHeight = $(this).height();
                if (thisHeight > maxHeight) {
                    maxHeight = thisHeight;
                }
            });
            if (maxHeight > 0) {
                radios.css({height: maxHeight});
            } else {
                radios.css({height: "auto"});
            }
        });
    };
    
    // funktionen, wenn alles geladen ist
    $(window).load(function () {
        var tmp;

        adjustHeight();
        
        // zum ersten fehler scrollen
        tmp = $(".fieldError:first");
        if (tmp.length) {
            var targetOffset = $(".fieldError:first").parent().offset().top;
            $('html,body').animate({scrollTop: targetOffset}, 1000);
        }
    });
    
    //fehlerbehebungen optisch nachvollziehen
    var clearFieldError = function () {
        var fieldError = $(this).parents("div.fieldError:first");
        fieldError.find("div.error-message").fadeOut(function () {
            fieldError.removeClass("fieldError");
        });
        $(this).unbind("focus", clearFieldError);
    }
    $(".fieldError :input").focus(clearFieldError);
    
    // navi
    $("#navi a").find("img").each(function () {
        var tmp = this.src;
        bg = tmp.replace(/(\.\w+)$/, "-over$1");
        $(this).parent("a").css({'background': 'url(' + bg + ') no-repeat -1000px'});
    }).end().filter(":not(.active)").hover(function () {
        $(this).css({'background-position': '0 0'}).children("img").css({'visibility': 'hidden'});
    }, function () {
        $(this).css({'background-position': '-1000px 0'}).children("img").css({'visibility': 'visible'});
    }).end().filter(".active").css({'background-position': '0 0'}).find("img").css({'visibility': 'hidden'});
    
    /* navigation
    $("#navi a img").parent().hover(function () {
        var tmp = $(this).children("img").attr('src');
        tmp = tmp.replace(/(\.\w+)$/, "-over$1");
        $(this).prepend('<img src="' + tmp + '" class="aktiv" alt=""/>');
    }, function () {
        $(this).children(".aktiv").remove();
    });*/
    
    // info-bereiche
    $(".info").hide().parent("fieldset").children(".legend").children(".clearer").before(' <a href="javascript:void(0)" class="infolink"><img src="/img/_layout/icon_hilfe.gif" alt=""/></a>').prev("a").toggle(function () {
        $(this).parent().parent().children(".info").show();
    }, function () {
        $(this).parent().parent().children(".info").hide();
    });
    
/*
    // container-test
    var container = $("#Container5");
    container.children(":not(legend)").wrapAll('<div class="unit"></div>')
    .parent().prepend('<h2 class="counter">1</h2>').parent().append('<div class="manipulators"><a href="javascript:void(0);">+</a> <a href="javascript:void(0);">-</a></div>').find(".manipulators a:first").click(function () {
        var tmp = $(this).parent().siblings(".unit:last").clone(true);
        var counter = parseInt(tmp.addClass('copy').children(".counter").html());
        tmp.children(".counter").html(++counter).end().insertBefore("#Container5 .manipulators");
    }).siblings("a").click(function () {
        currentCount = $(this).parent().siblings(".unit").length;
        if (currentCount > 1) {
            $(this).parent().siblings(".unit:last").remove();
        }
    });
*/
    
    $(":input").change(function () {
        var ename = this.name;
        var evalue = this.value;
        var tmp;
        var regex;
        var currentCount;
 /* umformatierung sollte im controller stattfinden, da dieser auch das format bestimmt
        var s_regex = /(\d+)]$/;
        var regex = new RegExp(s_regex);
        var tmp;
        
        // re-format ename (is data[CustomQuery][formElement2])
        tmp = regex.exec(ename);
        if (typeof(tmp[1]) !== "undefined") {
            ename = tmp[1];
        }
*/
        eBaseName = ename.replace(/(\w*)(x\d+)*]$/, '$1]');
        if (wq_multipliers[eBaseName]) {
            regex = new RegExp(/\[([^\]]+)\]$/);
            tmp = regex.exec(ename)[1];
            currentCount = $("." + tmp).length;
            eValueReal = evalue;
            if (typeof(wq_multipliers[eBaseName]) === "object"
            && typeof(wq_multipliers[eBaseName][evalue]) !== "undefined") {
                eValueReal = wq_multipliers[eBaseName][evalue];
            }
            if (typeof(eValueReal) !== "number") {
                eValueReal = parseInt(eValueReal);
                if (isNaN(eValueReal)) {
                    eValueReal = 0;
                }
            }
            if (eValueReal !== 0) {
                $("." + tmp + ":first").show();
            }
            if (currentCount < eValueReal) {
                for (var i = currentCount; i < eValueReal; i++) {
                    $("." + tmp + ":first").clone(true).find(":input").each(function () {
                        this.name = this.name.replace(/(x\d+)?]$/, 'x' + (i) + ']');
                        var tmpid = $(this).attr('id');
                        $(this).attr('id', tmpid.replace(/0$/, i));
                        return true;
                    }).end().find("label").each(function () {
                        var tmp = $(this).attr('for');
                        $(this).attr('for', tmp.replace(/0$/, i));
                    }).end()
                    .find(".counter").html(i + 1).end()
                    .find(":text").val('').end()
                    .find("input:checked").each(function () {
                        this.checked = false;
                    }).end()
                    .find("select").val('').end()
                    .insertAfter("." + tmp + ":last");
                }
            } else if (currentCount > eValueReal) {
                for (var i = currentCount; i > Math.max(eValueReal, 1); i--) {
                    $("." + tmp + ":last").remove();
                }
            }
            if (eValueReal === 0) {
                $("." + tmp + ":first").hide();
            }
            
            adjustHeight();
            /*
            $("." + tmp + ":last").bind("wq_lastloaded", function () { adjustHeight(); });
            $("." + tmp + ":last").trigger("wq_lastloaded");
            */

        }
/*
        if (wq_multipliers[ename]) {
            $.each(wq_multipliers[ename], function (multiplicand) {
                var firstLetter = multiplicand[0].toUpperCase();
                var rest = multiplicand.substring(1, multiplicand.length);
                var multiplicandId = 'CustomQuery' + firstLetter + rest;
                var tmp;
                var clone;
                var currentCount;
                tmp = $("#" + multiplicandId);
                currentCount = $(":input[name='" + multiplicand + "[]']").length;
                if (!currentCount) {
                    tmp.attr('name', multiplicant + '[]');
                }
                if (currentCount < evalue) {
                    for (var i = currentCount; i < evalue; i++) {
                        tmp.clone().removeAttr('id').appendTo(tmp.parent());
                    }
                } else {
                    for (var i = currentCount; i > evalue; i--) {
                        $(":input[name='" + multiplicand + "[]']:last").remove();
                    }
                }
            });
        }
*/

        /* format: mower[trigger_element_id][element_id] = array(operator, triger_value) */
        if (wq_mowers[ename]) {
            $.each(wq_mowers[ename], function (dependent, tValues) {
                var remove = false;
                var firstLetter = dependent.substring(0, 1).toUpperCase();
                var rest = dependent.substring(1, dependent.length);
                var dependentId = 'CustomQuery' + firstLetter + rest;
                /*
                var tmp;
                */
                var ucFirst = function (word) {
                    var firstLetter = word.substring(0, 1).toUpperCase();
                    var rest = word.substring(1, word.length);
                    return firstLetter + rest;
                };
                var getContainer = function (dependentId) {
                    var containers = $(dependentId).parents().map(function () {
                        var replacement = $(this);
                        if (!(replacement.hasClass("radio") || this.tagName === "FIELDSET")) {
                            replacement = null;
                        }
                        return replacement;
                    });
                    var container = containers.length ? containers[0] : $(dependentId);
                    //var container = containers.length ? containers.eq(1) : $(dependentId);
                    return container;
                    //return containers.length ? containers.eq(1) : $(dependentId);
                }
                /*
                var mapParents = function (index, domElement) {
                    var replacement = $(domElement);
                    if (!(replacement.hasClass("radio") || domElement.tagName === "FIELDSET")) {
                        replacement = null;
                    }
                    return replacement;
                };
                */
                var hideDependents = function (hiddenDependent) {
                    hiddenDependentName = 'data[CustomQuery][' + hiddenDependent + ']';
                    if (wq_mowers[hiddenDependentName]) {
                        $.each(wq_mowers[hiddenDependentName], function (dependent, tValues) {
                            //$("#CustomQuery" + ucFirst(dependent)).parents("fieldset, div.radio").filter(":first").addClass("hiddenDependent");
                            getContainer("#CustomQuery" + ucFirst(dependent)).addClass("hiddenDependent");
                            hideDependents(dependent);
                        });
                    }
                };
                var showDependents = function (hiddenDependent) {
                    hiddenDependentName = 'data[CustomQuery][' + hiddenDependent + ']';
                    if (wq_mowers[hiddenDependentName]) {
                        $.each(wq_mowers[hiddenDependentName], function (dependent, tValues) {
                            //$("#CustomQuery" + ucFirst(dependent)).parents("fieldset, div.radio").filter(":first").removeClass("hiddenDependent");
                            getContainer("#CustomQuery" + ucFirst(dependent)).removeClass("hiddenDependent");
                            showDependents(dependent);
                        });
                    }
                };
                for (var i = 0; i < tValues.length; i++) {
                    //alert(evalue + tValues[i].operator + tValues[i].trigger_value);
                    switch (tValues[i].operator) {
                        case '!=':
                            if (evalue != tValues[i].trigger_value) {
                                remove = true;
                            }
                            break;
                        case '==':
                        default:
                            if (evalue == tValues[i].trigger_value) {
                                remove = true;
                            }
                    }
                    if (remove) {
                        break;
                    }
                }
                if (remove) {
                    //alert('remove ' + '#' + dependentId);
                    //$("#" + dependentId).parents("fieldset:first").hide();
                    /*
                    var testa = $("#" + dependentId).parents().map(function () {
                        return this.tagName;
                    }).get().join(", ");
                    alert(testa);
                    */
                    /*
                    var testa = $("#" + dependentId).parents().map(mapParents)[0].html();
                    alert(testa);
                    */
                    //alert($("#" + dependentId).parents("div.radio, fieldset").filter(":first")[0].tagName);
                    getContainer("#" + dependentId).addClass("hidden")
                    .find("div.error-message").fadeOut(function () {
                        $(this).parents("div.fieldError:first").removeClass("fieldError");
                    }).end()
                    //.find(":text").each(function () { this.value = this.defaultValue; }).end()
                    //.find(":checked").each(function () { alert('val: ' + this.value);/* this.checked = false; */}).end()
                    //.find(":selected").each(function () { this.selected = false; }).end()
                    .find(":input").each(function () {
                        this.disabled = true;
                        if ($(this).is(":checked")) {
                            this.checked = false;
                        } else if ($(this).is(":text")) {
                            this.value = "";
                        } else if ($(this).is("select")) {
                            $(this).find("option:selected").each(function () { this.selected = false; });
                        }
                        /*
                        if (this.tagName === "INPUT" && this.checked) {
                            this.checked = false;
                        }
                        else if (this.tagName === "INPUT" && this.value) {
                            this.value = "";
                        }
                        */
                    })
                    ;
                    hideDependents(dependent);
                    /*
                    tmp = $("#" + dependentId);
                    if (tmp.length) {
                        tmp.parent().hide();
                    } else {
                        $(".holder_" + dependent).parents(".input:first").hide();
                    }
                    */
                    //$("#" + dependent).hide();
                    //$(":input[name='data[CustomQuery][" + dependent + "]']:first").parents(".input:first").hide();
                    //$("#" + dependentId).next().andSelf().hide();
                } else {
                    //$("#" + dependentId).parents("fieldset:first").show();
                    //$("#" + dependentId).parents("fieldset, div.radio").filter(":first").removeClass("hidden");
                    getContainer("#" + dependentId).removeClass("hidden").find(":input").each(function () { this.disabled = false; });
                    showDependents(dependent);
                    /*
                    tmp = $("#" + dependentId);
                    if (tmp.length) {
                        tmp.parent().show();
                    } else {
                        $(".holder_" + dependent).parents(".input:first").show();
                    }
                    */
                    $("#" + dependent).show();
                    //$(":input[name='data[CustomQuery][" + dependent + "]']:first").parents(".input:first").show();
                    //$("#" + dependentId).next().andSelf().show();
                }
/*
                $("#" + dependentId).parent().find(".radio:visible").each(function () {
                    var count = $(this).parent().children(".radio:visible").length;
                    $(this).css({'width': (100 / count - 0.01) + '%'});
                });
*/
            });
            /*
            $(".radio:visible").each(function () {
                count = $(this).parent().children(".radio:visible").length;
                $(this).css({'width': (100 / count - 0.01) + '%'});
            });
            */
            /*
            $(".hidden :input").each(function () {
                this.disabled = true;
            });
            */
        }
        
/*
        // von ausgeblendeten elementen abhängige elemente ebenfalls ausblenden
        $(":input:hidden").each(function () {
            var tmp = $(this).attr('name');
            if (wq_mowers[tmp]) {
                $.each(wq_mowers[tmp], function (dependent, tValues) {
                    var firstLetter = dependent.substring(0, 1).toUpperCase();
                    var rest = dependent.substring(1, dependent.length);
                    var dependentId = 'CustomQuery' + firstLetter + rest;
                    tmp = $("#" + dependentId);
                    if (tmp.length) {
                        tmp.parent().hide();
                    } else {
                        $(".holder_" + dependent).parents(".input:first").hide();
                    }
                });
            }
        });
*/

        // bei übrigen radio-buttons breite neu berechnen
        //$(".radio:visible").parent().each(function () {
/*
        $(".input:has(.radio:visible)").each(function () {
            var count = $(this).children(".radio:visible").length;
            $(this).children(".radio:visible").css({'min-width': (100 / count - 0.01) + '%'});
        });
*/

/*
        if (wq_dependencies[ename]) {
            $.each(wq_dependencies[ename], function (dependent, tValues) {
                var triggered = false;
                for (var i = 0; i < tValues.length; i++) {
                    if (tValues[i] == evalue) {
                        triggered = true;
                        break;
                    }
                }
                if (triggered) {
                    $(":input[name='" + dependent + "']").parents('fieldset').show();
                } else {
                    $(":input[name='" + dependent + "']").parents('fieldset').hide();
                }
            });
        }
*/
        
/* ajax dauert zu lange; array steht nun in wq_dependencies
        $.getJSON("/dependencies/handleChoice/" + ename + "/" + evalue + ".json", function (data) {
            var show = new Array();
            var hide = new Array();
            $.each(data, function (fieldname, show) {
                if (show) {
                    //show.push(fieldname);
                    $(":input[name=" + fieldname + "]").show();
                } else {
                    //hide.push(fieldname);
                    $(":input[name='" + fieldname + "']").parents('fieldset').hide();
                }
            });
            //alert('show: '+show+', hide:'+hide);
        });
*/



    }).filter("select, :text, :checked").change().end().filter("input[type='radio']").click(function () {
        // internet explorer vergurkt das onchange-event bei radios
        $(this).change();
    }).end().filter(":text").keyup(function () {
        // bei multipliern passiert sonst nichts
        $(this).change();
    });
});
