$j = jQuery;

self.CategoryManager = {
    leafClass: "no-children",
    openedClass: "children-opened",
    closedClass: "children-closed",
    init: function() {
        if (self.CollapsableNavigationBlocks) {
            self.CollapsableNavigationBlocks.init();
        }
        var oF = self.CategoryManager;
        var oLi = $j("div.categories li");
        var aChecks = oLi.children(":checkbox").each(function(){
            var oCheck = $j(this);
            if (oCheck.attr("id").match(/^id_[A-Z]{2}_\d+$/)) {
                var oUl = oCheck.nextAll("ul");
                var oA = oCheck.prevAll("a");
                if (oUl.length) {
                    oCheck.click(oF.toggle);
                    oCheck.siblings("label").click(oF.toggle);
                    oA.click(oF.toggle);
                    oA.removeClass(
                        oF.leafClass
                    ).removeClass(
                        oF.openedClass
                    ).addClass(
                        oF.closedClass
                    ).children("span").html("&rarr;");
                } else {
                    oA.click(function() {return false});
                    oCheck.click(function() {
                        $j(this).parent().parents("li").children(":checkbox").attr("checked", true);
                    });
                }
                if (oCheck.attr("checked")) {
                    oF.expand(oUl);
                }
            }
        });
    },
    toggle: function() {
        var oF = self.CategoryManager;
        var aFields = $j(this).parent().children(":checkbox, ul");
        var oCheck = $j(aFields[0]);
        var oUl = $j(aFields[1]);
        var bBubble = true;
        if ($j(this).is(":checkbox")) {
            oCheck.parent().parents("li").children(":checkbox").attr("checked", true);
        }
        if ($j(this).is("a")) {
            if (oUl.is(":hidden")) {
                oF.expand(oUl);
            } else {
                oF.collapse(oUl);
            }
            bBubble = false;
        } else {
            if (oCheck.attr("checked")) {
                oF.expandAndCheck(oUl);
            } else {
                oF.collapseAndUncheck(oUl);
            }
        }
        return bBubble;
    },
    collapseAndUncheck: function(oUl) {
        var oF = self.CategoryManager;
        oUl.slideUp("normal");
        oUl.find(":checkbox").attr("checked", false);
        oA = oUl.siblings("a");
        if (!oA.is("." + oF.leafClass)) {
            oA.removeClass(
                oF.openedClass
            ).addClass(
                oF.closedClass
            ).children("span").html("&rarr;");
        }
    },
    expandAndCheck: function(oUl) {
        var oF = self.CategoryManager;
        oUl.slideDown("normal");
        oA = oUl.siblings("a");
        if (!oA.is("." + oF.leafClass)) {
            oA.removeClass(
                oF.closedClass
            ).addClass(
                oF.openedClass
            ).children("span").html("&darr;");
        }
    },
    collapse: function(oUl) {
        var oF = self.CategoryManager;
        oUl.slideUp("normal");
        oA = oUl.siblings("a");
        if (!oA.is("." + oF.leafClass)) {
            oA.removeClass(
                oF.openedClass
            ).addClass(
                oF.closedClass
            ).children("span").html("&rarr;");
        }
    },
    expand: function(oUl) {
        var oF = self.CategoryManager;
        oUl.slideDown("normal");
        oA = oUl.siblings("a");
        if (!oA.is("." + oF.leafClass)) {
            oA.removeClass(
                oF.closedClass
            ).addClass(
                oF.openedClass
            ).children("span").html("&darr;");
        }
    },
    destruct: function() {
        self.CategoryManager = null;
    }
};

$j(document).ready(function() {
    self.CategoryManager.init();
});
    
$j(window).unload(self.CategoryManager.destruct);
