(function($){
    if ($.browser.msie && $.browser.version < 7) {
        $(function(){ $(window).resize(ie6resize); });
    }

    $.Enhancer.add(function(){
        var form = $(this).filter("form.select");
        if (!form.length) form = $('form.select', this);

        form.addClass('ajax');
        $('input.increment:input', form).val('');
        $('input.increment:image', form).click(function(e){
            var input = $(this).prev('input.increment:input');
            if (input.val() == '') input.val('1');
            return input.closest("form").ajaxSubmit(e);
        });
        form.makeAjaxSubmit();
        registerScroll(this);
        registerPopup(this);
        registerCycle(this);
        registerSlider(this);
        registerModal(this);
        $('a[rel=extern]', this).attr('target', '_blank');
        $('ul.fachhandel', this).makeacolumnlists({cols:3});
        $('#leftnav .background', this).css('opacity', '0.5');

        var needed = $('#contentcontainer').position().top;
        needed += $('#leftnav').outerHeight();
        $('#vertical').css('min-height', needed + "px");
        if ($.browser.msie && $.browser.version < 7) {
            window.setTimeout(ie6resize, 50);
        }

        var required = $("label.required", this);
        required.removeClass("required");
        required.each(function(){$(this).append("*")});
        required.parents("form").find("li.ajax").removeClass("ajax");
    });

    function registerSlider(context) {
        var slider = $('.slider', context);
        if (!slider.length) return;
        var images = slider.metadata({type: "attr", name: "title"});
        if (!images) return;
        slider.attr("title",  "");
        var delay = 2000;
        var count = 0;
        $.each(images, function (){
            count++;
        });

        var index = count;
        $.each(images, function (key,src){
            var element = $('#' + key);
            var wrap = element.parents('*:first');
            for (var i = 0; i < src.length; i++) {
                wrap.append('<img src="' + src[i] + '"/>');
            }
            index--;
            wrap.cycle({speed: 'slow', timeout: delay * count, delay: -delay * index, type: 'sequence', containerheight: '148px' });
        });
    }

    function registerPopup(context) {
        var options = {
            counterText: "Bild {x} von {y}"
        };
        var galerien = [];
        $('img[src*="_small."]', context).each(function() {
            var img = $(this);
            var src = img.attr('src');
            var i = src.indexOf("_small.");
            var hires = src.substring(0, i) + src.substring(i + 6);
            return popup1(img, hires);
        });
        $('img[src$="?right"], img[src$="?li"]', context).each(function() {
            var img = $(this);
            var src = img.attr('src');
            var i = src.indexOf('?');
            var hires = src.substring(0, i);
            return popup1(img, hires);
        });
        $('a img[src*="/photos/"]', context).each(function() {
            return popup($(this));
        });

        for (var i = 0; i < galerien.length; i++) {
            var galerie = galerien[i];
            var images = $(galerie.data("images"));
            galerie.removeData("images");
            images.slimbox(options);
        }

        $('.auszeichnungen li', context).each(function(){
            var box = $(this).find('a[href$=".jpg"], a[href$=".png"]');
            if (box.length) {
                box.slimbox(options);
                box.slice(1).remove();
            }
        });

        $('a[rel=auszeichnung]').each(function(){
            $(this).slimbox(options);
        });

        function popup1(img, hires) {
            var a = img.parents("a");
            if (!a.length) {
                img.wrap("<a/>");
                a = img.parents("a");
                a.attr("href", hires);
            } else if (a.attr("href") != hires) {
                return;
            }
            return popup(img);
        }

        function popup(img) {
            var src = img.attr('src');
            var title = img.attr('title');
            if (!title) title = img.attr('alt');
            var a = img.parents("a");
            if (!a.attr('title')) {
                if (!title) {
                    var head = a.parents('*:has(h1):first').find("h1:first");
                    title = head.text();
                }
                a.attr('title', title);
            }
            var galerie = a.parents('.galerie');
            if (galerie.length) {
                if (galerie.hasClass('index')) return;
                var images = galerie.data("images");
                if (!(images && images.length)) {
                    galerie.data("images", images = []);
                    galerien.push(galerie);
                }
                images.push(a[0]);
            } else {
                a.slimbox(options);
            }
        }
    }

    function registerCycle(context) {
        var wrap = $('#cycle', context);
        var height = 0;
        wrap.find('p').each(function(p){
            height = Math.max(height, $(this).outerHeight());
        });
        if (height == 0) return;
        wrap.css('width', '222px');
        wrap.css('height', height + 'px');
        wrap.cycle({speed: 'slow', timeout: 6000, delay: 0, type: 'sequence'});
    }

    function registerScroll(context) {
        var scroll = $('#scroll', context);
        if (scroll.length && !scroll.find('#scrollwrapper')) {
            var padding = window.parseInt(scroll.css('padding-right'));
            scroll.wrapInner('<div id="scrollwrapper"/>');
            var wrapper = scroll.find('#scrollwrapper');
            wrapper.css('width', (scroll.outerWidth() - padding) + "px");
            wrapper.css('right', "auto");
        }
    }

    function registerModal(context) {
        $.modal({
            curtainProperties: {style: "opacity: 0.5; background-color: #888"},
            contentProperties: {'class': "newmodal"}
        });
        $("a[rel=modal]", context).click(function(){
            var url = $(this).attr("href");
            var i = url.indexOf('#');
            var options = {};
            if (i >= 0) {
                options.anchor = url.substring(i + 1);
                url = url.substring(0, i);
            }
            i = url.lastIndexOf('?');
            if (i < 0) {
                url += '?';
            } else if (i < url.length - 1) {
                url += '&';
            }
            var w = $("<div/>");
            w.load(url + "modal=true .modal", function(){
                var x = $(this).children().enhance().modal(options);
                if (options.anchor) {
                    var anchor = x.find("a[name=" + options.anchor + "]");
                    if (anchor.length) {
                        anchor.closest(":scrollable").scrollTop(10000);
                        anchor.scrollintoview();
                    }
                }
            });
            return false;
        });
    }

    function ie6resize() {
        $('#vertical, #bottom, #contentcontainer, #rightcol, #scroll, div#leftnav .background, .orderbox, .right.order, #footer').each(function(){
            fix($(this), 'top', 'bottom', 'height');
            fix($(this), 'left', 'right', 'width');
        });
    }

    function fix(e, a, b, c) {
        var op = e.offsetParent();
        var top = parseInt(e.css(a));
        var bottom = parseInt(e.css(b));
        if (isNaN(bottom) || isNaN(top)) return;
        var height = op['inner' + c.substring(0,1).toUpperCase() + c.substring(1)]() || op[c]();
        height -= bottom + top + dim(e, 'padding-' + a) + dim(e, 'padding-' + b) + dim(e, 'border-' + a + '-width') + dim(e, 'border-' + b + '-width');
        var minHeight = dim(e, 'min-' + c);
        if (minHeight && minHeight > height) height = minHeight;
        e.css(c, height + "px");
    }

    function dim(e, key) {
        var r = parseInt(e.css(key));
        return isNaN(r) ? 0 : r;
    }

    // TODO better fix for NO_MODIFICATION_ALLOWED_ERR: DOM Exception 7: An attempt was made to modify an object where modifications are not allowed.
    // TODO in safari 3/4/5 (maybe chrome) (happens when page was served with application/xhtml+html instead of text/html)
    // TODO result must be VALID XML Fragment, i.e. no entities (com.sun.faces.disableUnicodeEscaping), no doctype declaration (dataFilter)
    $.ajaxSetup({
        dataFilter: function(data, type){
            if (type == "html") {
                var h = data.indexOf("<html");
                if (h > 0) {
                    data = data.substring(h);
                    var oldComplete = this.complete;
                    if (oldComplete) this.complete = function(res, status){
                        try { // TODO exception in firefox
                            arguments[0] = $.extend({}, res, {responseText: data});
                        } catch (e){}
                        oldComplete.apply(this, arguments);
                    };
                }
            }
            return data;
        }
    });
})(jQuery);

