
(function($){
    var baseURL = document.location.href;
    var escapes = new RegExp("([#;&,.+*~':\"!^$[\\]()=>|/])", "g");
    var absURL = /^(\w+:\/\/[^\/?#]+)(.*)$/;
    var musik;
    var clickRel = {
        galerie: function(){},
        einkaufskorb: einkaufen,
        modal: modalClick,
        modalschliessen: function(){
            $("#modalkiste").hide();
        },
        musik: musikAnAus
    };

    $.extend(soundManager, {
        url: "/binary/swf/",
        flashVersion: 9,
        useConsole: false,
        useHTML5Audio: true,
        onload: soundManagerLoad
    });

    ie6();
    $.Enhancer.add(modalEnhance);
    $.Enhancer.add(shortenText);
    $(document).bind("gcsNavigate", navigateEmpty);
    $("#modalkiste").live("click", modalkisteClick);
    $("#modalkiste ul.galerie li a[rel=galerie]").live("mouseover", modalGalerieMouseover);
    $("#seite a[href], #modalkiste a[href]").live("click", anchorClick);
    $("#seite form input:submit").live("click", inputSubmitClick);
    $("#seite form.vollstaendig").live("submit", formVollstaendig);
    $("#seite form").live("submit", formSubmit);
    $("#seite form.mitFehlern input, #seite form.mitFehlern textarea").live("change", fehlerInputChange);
    $("select.ajaxForm").live("change", ajaxSelectChange);

    $(function() {
        if (!$("#modalkiste").length) {
            var modalkiste = $("<div/>").attr({id: "modalkiste"}).hide();
            modalkiste.appendTo("body");
        }
    });

    function navigateEmpty(e) {
        if ($(e.target).is("#seite") && !e.relatedTarget) {
            $(e.target).gcsNavigate({url: document.location.href, history: false, navigateIfEmpty: true});
        }
    }

    function soundManagerLoad(){
        musik = soundManager.createSound({
            id: "musik",
            url: "/binary/hauptteil.mp3",
            onfinish: function() {
                this.play();
            }
        });
        musik.play();
        $(document).bind("gcsNavigate", restoreMusikButton);
        restoreMusikButton.call($("body").get(0));
    }

    function ie6(){
        if ($.browser.msie && $.browser.version < 7) {
            document.recalc = function(){};
            $(function(){
                $.getScript("http://ie7-js.googlecode.com/svn/version/2.0(beta3)/IE7.js");
                $.getScript("http://ie7-js.googlecode.com/svn/version/2.0(beta3)/ie7-recalc.js");
            });
            $.Enhancer.add(function(){
                document.recalc();
            });
        }
    }

    function modalEnhance() {
        var modal = $(".modal", this);
        if (modal.length) {
/*
            var last = modal.children().last();
            modal.css({width: "", padding: ""});
            if (last.height() + last.position().top > modal.innerHeight()) {
                var paddingY = modal.innerHeight() - modal.height();
                var roller = $("<div class='roller'/>");
                roller.height(modal.height() - paddingY);
                var div = $("<div/>");
                div.prependTo(modal);
                var scrollWidth = div.width();
                modal.wrapInner(roller);
                scrollWidth -= div.width();
                div.remove();

                modal.css({
                    width: modal.width() + scrollWidth,
                    padding: 0
                });
            }
*/
            var close = $("<a/>").attr({'class': "schliessen", href: "javascript:;", rel: "modalschliessen"});
            close.html(i18n.global.back);
            close.prependTo(modal);
            modal.find("ul.galerie li a").attr("rel", "galerie");
            modal.find("ul.galerie li:not(:first)", this).css('opacity','0.5');
        }
    }

    function shortenText() {
        var me  = $(".shorten + .details", this);
        window.setTimeout(function(){
            me.each(shortenText2);
        }, 1);
    }

    function shortenText2(){
        var details = $(this);
        var shorten = details.prev();
        var maxHeight = details.offset().top - shorten.offset().top - 5;
        while (shorten.height() > maxHeight) {
            var child = shorten.children().last();
            if (!child.length) break;
            var text = child.text();
            var p = text.lastIndexOf(" ");
            while (p > 0 && shorten.height() > maxHeight) {
                child.text(text.substring(0, p + 1) + "\u2026");
                p = text.lastIndexOf(" ", p - 1);
            }
            if (p < 0 && shorten.height() > maxHeight) child.remove();
            maxHeight = details.offset().top - shorten.offset().top - 5;
        }
    }

    function ajaxSelectChange(e){
        return $(this).parents('form').ajaxSubmit(e);
    }

    function modalkisteClick(e) {
        if ($(e.target).parents(".modal").length) {
            return true;
        }
        clickRel.modalschliessen.call(this, e);
        return cancel(e);
    }

    function modalGalerieMouseover(){
        $("#modalkiste img.bild").attr("src", $(this).attr("href"));
        var li = $(this).parents("li:first");
        li.siblings().css("opacity", "0.5");
        li.css("opacity", "");
    }

    function fehlerInputChange(){
        var $$ = $(this);
        if ($$.attr('type') == 'radio' || $$.attr('type') == 'checkbox') {
            $('input[name=' + $$.attr('name') + ']', $$.parents('form:first')).each(function() { // TODO escaping does not work with jQuery 1.4.2
                $(this).parent().children('.fehler').remove();
            });
        } else {
            $$.parent().children('.fehler').remove();
        }
    }

    function anchorClick(e) {
        var $$ = $(this);
        var rel = $$.attr("rel");
        if (clickRel[rel]) {
            clickRel[rel].call(this, e);
        } else {
            var href = $$.attr("href");
            var parts = absURL.exec(href);
            if (parts) {
                if (parts[1] != absURL.exec(baseURL)[1]) return true;
                href = parts[2];
            }
            if (href.substring(0, 1) == "#") return true;
            $$.parents("#seite").gcsNavigate({
                url: href,
                navigateIfEmpty: true
            });
        }
        return cancel(e);
    }

    function inputSubmitClick(e) {
        var $$ = $(e.target);
        var form = $$.parents("form:first");
        if (form.length) {
            var name = $$.attr("name");
            if (!name) name =  $$.attr("id");
            form.trigger("submit", {name: name, value: $$.val()});
            return cancel(e);
        }
    }

    function formSubmit(e, submit) {
        var form = $(e.target);
        var name = form.attr("name");
        if (!name) name = form.attr("id");
        var data = form.serializeArray();
        data.push({name: name, value: name});
        if (submit) {
            data.push(submit);
        }
        var seite = $(this).parents("#seite");
        var options = {
            url: form.attr('action'),
            type: 'POST',
            global: false,
            history: false,
            data: data,
            complete: function() {
                seite.removeClass("transmit").css("opacity", "1");
            }
        };
        seite.addClass("transmit").css("opacity", "0.5").gcsNavigate(options);
        return false;
    }

    function formVollstaendig(e) {
        var form = $(this);
        form.removeClass("mitFehlern");
        $("input:visible, textarea:visible", form).each(function(){
            var $$ = $(this);
            var val = $$.val();
            var fehler = "";
            var fehlerStyle = "fehler";
            if ($$.hasClass("pflicht")) {
                if ($$.attr('type') == 'radio' || $$.attr('type') == 'checkbox') {
                    var gewaehlt = $('input[name=' + $$.attr('name') + ']:checked', form).length; // TODO escaping does not work with jQuery 1.4.2
                    if (!gewaehlt) {
                        fehler = i18n.form.select;
                        fehlerStyle += " check";
                    }
                } else if (val == "") {
                    fehler = i18n.form.fill;
                }
            }

            if (!fehler && $$.hasClass("email")) {
                if (!(/^.+@.+\..{2,20}$/.test(val))) {
                    fehler = i18n.email.valid;
                } else if (/\(\)<>,;:\\"\[\]/.exec(val)) {
                    fehler = i18n.email.illegal;
                }
            }

            if (!fehler && $$.hasClass("ziffern") && !/^\d+$/.test(val)) {
                fehler = i18n.form.ziffern;
            }

            if (!fehler && $$.hasClass("plz") && !/^\d{5}$/.test(val)) {
                fehler = i18n.form.plz;
            }

            if (fehler) {
                form.addClass("mitFehlern");
                e.stopImmediatePropagation();
                e.preventDefault();
                var f = $$.siblings(".fehler");
                if (!f.length) {
                    f = $("<div/>");
                    f.insertAfter($$);
                }
                f.text(fehler);
                f.attr("class", fehlerStyle);
            }

        });
        return !e.isImmediatePropagationStopped();
    }

    function musikAnAus(){
        if (musik.paused) {
            $(this).text(i18n.musik.off);
            musik.resume();
        } else {
            $(this).text(i18n.musik.on);
            musik.pause();
        }
    }

    function restoreMusikButton(e) {
        var fuss = $(".fuss ul", e && e.relatedTarget ? e.relatedTarget : this);
        var old = $("a[rel=musik]", fuss);
        if (fuss.length && !old.length) {
            fuss.append($("<li/>").append($("<a/>").attr({href: "javascript:;", rel: "musik"}).text(musik.paused ? i18n.musik.on : i18n.musik.off)));
        }
    }

    function load($$, href, callback) {
        var s = href.split(" ", 2);
        var options = {
            url: s[0],
            success: function(data){
                var i = data.indexOf("<html");
                if (i > 0) {
                    data = data.substring(i);
                }

                if (s[1]) {
                    var content = $(data).find(s[1]);
                    if (!content.length) {
                        document.location = s[0];
                        return;
                    } else {
                        $$.html("");
                        content.appendTo($$);
                    }
                } else {
                    $$.html(data);
                }
                callback();
            }
        };

//        $.ajax(options);
        $$.load(href, null, callback);
    }

    function einkaufen() {
        var anzahl = parseInt($(this).parent().find('input').val());
        if (anzahl.constructor!=Number || isNaN(anzahl)) anzahl=1;
        $(this).parent().find('input').val(anzahl);
        if ($('div.inhalt .einkaufskorb').length < 1) {
            load($('.seitenstreifen.rechts'), this.href+ "&anzahl=" +anzahl+ " .seitenstreifen.rechts .dynamisch", function() {
                $('.seitenstreifen.rechts').enhance();
                $('#modalkiste').hide();
            });
        } else {
            load($('div.inhalt'), this.href+ "&anzahl=" +anzahl+ " div.inhalt", function() {
                $('div.inhalt').enhance();
                $('#modalkiste').hide();
            });
        }
    }
    
    function modalClick() {
        load($('#modalkiste'), this.href + " .modal", function() {
            $('#modalkiste').enhance();
            $('#modalkiste').show();
        });
    }

    function jEscape(s){
        return s.replace(escapes, "\\$1");
    }

    function cancel(event) {
        event.stopImmediatePropagation();
        event.preventDefault();
        return false;
    }
})(jQuery);
