/**
 * Applies an accordion/tree behavior to the specified element.
 *
 */
var AccordionTree = new Class({
    initialize: function(element) {
        this.element = element;
        this.fixOutlines();
        this.buildNodes();
    },
    fixOutlines: function() {
        this.element.getElements('a').each(function(node){
            node.addEvent('mousedown', this.disableOutline.bindWithEvent(this, node));
            node.addEvent('mouseleave', this.disableOutline.bindWithEvent(this, node));
            node.addEvent('mouseup', this.disableOutline.bindWithEvent(this, node)); 
        }.bind(this));
    },
    buildNodes: function() {
        for(var l=1; l<=3; l++) {
            this.element.getElements('.level' + l).each(function(node){
                var handler = node.getFirst();
                var status = handler.getFirst();
                var child = handler.getNext();

                node.store('handler', handler);
                node.store('status', status);
                node.store('child', child);

                var hide = false;
                if(child.hasClass('hidden')) {
                    child.removeClass('hidden');
                    hide = true;
                }

                child.set('slide', {
                    onComplete: function(){
                        if(window.ie6) var heightValue='100%';
                        else var heightValue='';
                        if(this.open) {
                            this.wrapper.setStyle('height', heightValue);
                        }
                        var status = this.wrapper.getParent().retrieve('status');
                        status.toggleClass('opened');
                        status.toggleClass('closed');
                    }
                });
                if(hide) {
                    child.slide('hide');
                }
                handler.addEvent('click', this.nodeClick.bindWithEvent(this, node));
            }.bind(this));    
        }
    },
    nodeClick: function(event, node) {
        if(node.retrieve('status').hasClass('leaf')) {
            return true;
        }
        node.retrieve('child').slide('toggle');
        return false;
    },
    disableOutline: function(event, node) {
        handler = node.retrieve('handler');
        try {
            handler.blur();
            handler.hideFocus = true;
            handler.setStyle('outline', 'none');
        } catch(e) {
            
        }
    },
    enableOutline: function(event, node){
        handler = node.retrieve('handler');
        try {
            handler.blur();
            handler.hideFocus = false;
            handler.setStyle('outline', 'none');
        } catch(e) {

        }
    }
});

window.addEvent('domready', function() {
    var accordionTree = new AccordionTree($('library-navigation'));
});
