/*
 * jimTree: highly configurable tree component
 * 
 * author: Burkhard.Mayer [at] Justinmind.com 
 */


(function($) {
    $.fn.jimTree = function(options) {
        
        // private functions
        function addClasses($tree) {
            $tree.find("li:last-child").addClass("last").end().find("li:has(ul)").not(".open").addClass("closed");
            $tree.find("li").not(".open").not(".closed").addClass("leaf");
            
            if(opts.useCookie) {
                
                if($.fn.jimTree.NodeState[page] === undefined) {
                    if ($.cookie(opts.cookieName)) {
                        $.fn.jimTree.NodeState = $.parseJSON($.cookie(opts.cookieName));
                    }
                }   
                
                if($.fn.jimTree.NodeState[page]) {
                    if($.fn.jimTree.NodeState[page].closedNodes) {
                        for (var i = 0; i < $.fn.jimTree.NodeState[page].closedNodes.length; i++) {
                            $("#" + $.fn.jimTree.NodeState[page].closedNodes[i]).removeClass("open").addClass("closed");
                        }                   
                    }
                    
                    if($.fn.jimTree.NodeState[page].openNodes) {
                        for (i = 0; i < $.fn.jimTree.NodeState[page].openNodes.length; i++) {
                            $("#" + $.fn.jimTree.NodeState[page].openNodes[i]).removeClass("closed").addClass("open");
                        }
                    }
                }
            }
        }
        
        function addEvents($tree) {
            $tree.find("li").bind("click", function(event) {
                event.stopImmediatePropagation();
                if ($(this).hasClass("open")) {
                    $(this).removeClass("open").addClass("closed");
                } else {
                    $(this).removeClass("closed").addClass("open");
                }
            });
        }
        
        function addUnloadEvent() {
            $(".content").bind("jim.unload", function() {
                if($.fn.jimTree.NodeState[page] === undefined) {
                    $.fn.jimTree.NodeState[page] = {closedNodes: [], openNodes: []};
                }
                $.fn.jimTree.NodeState[page].closedNodes = [];
                $treeList.find("li.closed").each(function(i) { 
                    if(this.id !== "" || this.id !== undefined) {
                        $.fn.jimTree.NodeState[page].closedNodes[i] = this.id;
                    } 
                });
                $.fn.jimTree.NodeState[page].openNodes = [];               
                $treeList.find("li.open").each(function(i) {
                    if(this.id !== "" || this.id !== undefined) {
                        $.fn.jimTree.NodeState[page].openNodes[i] = this.id;
                    }
                });
            });
            
            $(window).unload( function() {
                // only save when the project has at least a tree component, not counting the project screens tree
                if ($treeList.length > 1) {
                    $(".content").trigger("jim.unload");
                    $.cookie(opts.cookieName, $.toJSON($.fn.jimTree.NodeState));
                }
            });
        }
        
        var $treeList = $(this); 
        var opts = $.extend({}, $.fn.jimTree.defaults, options);
        
        var page = jQuery("div#currentscreen").attr("projectpage");
        
        if (opts.useCookie) {
            addUnloadEvent();
        }
        
        return $treeList.each(function() {
            addClasses($treeList);
            addEvents($treeList);
        });
        
    };
        
    // plugin defaults
    $.fn.jimTree.defaults = {
        useCookie: true,
        cookieName: "jimTreeNodes"
    };
    
    $.fn.jimTree.NodeState = {};

})(jQuery);