﻿/*
----------------------------------------------------------------------------
Name: AKordion
Version: 0.1
Description: Simple nested accordion menu (jQuery plugin)
License: http://dev.jquery.com/browser/trunk/jquery/GPL-LICENSE.txt
Author: AK (Alexander Khotyanov)
----------------------------------------------------------------------------
*/

// IE fix
if (!Array.indexOf) {
    Array.prototype.indexOf = function(obj) {
        for (var i = 0; i < this.length; i++) {
            if (this[i] == obj) {
                return i;
            }
        }
        return -1;
    }
}
// $.AKordion class
jQuery.AKordion = {
    MenuDivId: null,
    MenuClassName: 'Menu',
    MenuItemClassName: 'MenuItem',
    SelectedClassName: 'Selected',
    arrOpenNodes: new Array(),
    CollapseSubMenus: function(id) {
        $('#' + id + ' ul').css({ 'display': 'none' });
        $('#' + id + '>ul').css({ 'display': 'block' });
    },
    Expand: function(id) {
        $('#' + id).parent("li").find(">ul").slideDown("normal").css({ 'display': 'block' });
    },
    Collapse: function(id) {
        $('#' + id).parent("li").find(">ul").slideUp("normal").css({ 'display': 'none' });
    },
    RemoveFromOpenNodesArray: function(nodeId) {
        this.arrOpenNodes.splice(this.arrOpenNodes.indexOf(nodeId), 1);
    },
    CollapseNonParentNodes: function(nodeId) {
        var ArrayNodeIsParentOfNode = false;
        var arrToRemove = new Array();
        for (var x = 0; x < this.arrOpenNodes.length; x++) {
            ArrayNodeIsParentOfNode = $('#' + nodeId).parents().index($('#' + this.arrOpenNodes[x]).parent("li")) >= 0;
            if (!ArrayNodeIsParentOfNode) {
                this.Collapse(this.arrOpenNodes[x]);
                arrToRemove.push(this.arrOpenNodes[x]);
            }
        }
        for (var i = 0; i < arrToRemove.length; i++) {
            this.RemoveFromOpenNodesArray(arrToRemove[i]);
        }
    },
    ExpandMenuItem: function(MenuItemId) {
        $("#" + MenuItemId).parent("li").parent("ul").slideDown("normal").css({ 'display': 'block' });
    },
    ExpandSelectedNode: function() {
        var selectedNode = $('.' + this.SelectedClassName);
        if (selectedNode.length > 0) {
            var selectedMenuItemId = selectedNode.attr("id");
            this.ExpandMenuItem(selectedMenuItemId);
            selectedNode.parents('ul').slideDown("normal").css({ 'display': 'block' });
            var t = this;
            jQuery.each(selectedNode.parents('li'), function() {
                var id = $(this).find('span:first').not('.' + t.MenuItemClassName).attr('id');
                if (typeof id != "undefined") {
                    t.arrOpenNodes.push(id);
                }
            });
        }
    },
    SetSelectedNode: function(id) {
        $('.' + this.SelectedClassName).removeClass(this.SelectedClassName);
        $('#' + id).addClass(this.SelectedClassName);
        this.CollapseSubMenus(this.MenuDivId);
        this.arrOpenNodes = new Array();
        this.ExpandSelectedNode();
    },
    MenuClick: function(clickedNode) {
        var thisNode = clickedNode;
        var thisNodeId = thisNode.attr("id");
        if (this.arrOpenNodes.length == 0) {
            this.Expand(thisNodeId);
            this.arrOpenNodes.push(thisNodeId);
        }
        else if (this.arrOpenNodes.indexOf(thisNodeId) > -1) {
            this.Collapse(thisNodeId);
            this.RemoveFromOpenNodesArray(thisNodeId);
        }
        else if (this.arrOpenNodes.indexOf(thisNodeId) == -1) {
            this.CollapseNonParentNodes(thisNodeId);
            this.Expand(thisNodeId);
            this.arrOpenNodes.push(thisNodeId);
        }
    },
    Init: function(id, selectedId) {
        this.MenuDivId = id;
        var t = this;
        $('#' + id + ' .' + this.MenuClassName).click(function() {
            t.MenuClick($(this));
        });
        this.CollapseSubMenus(id);
        if (selectedId != null) {
            this.SetSelectedNode(selectedId);
        }
        else {
            this.ExpandSelectedNode();
        }
    }
};
// .AKordion() function
jQuery.fn.AKordion = function(selectedId, menuClassName, menuItemClassName, selectedClassName) {
    var objAKordion = $.AKordion;
    if (menuClassName != null) {
        objAKordion.MenuClassName = menuClassName;
    }
    if (menuItemClassName != null) {
        objAKordion.MenuItemClassName = menuItemClassName;
    }
    if (selectedClassName != null) {
        objAKordion.SelectedClassName = selectedClassName;
    }
    var id = $(this).attr('id');
    objAKordion.Init(id, selectedId);
}

