$.fn.equals = function(compareTo) {
    if (!compareTo || !compareTo.length || this.length != compareTo.length) {
        return false;
    }
    for (var i = 0; i < this.length; i++) {
        if (this[i] !== compareTo[i]) {
            return false;
        }
    }
    return true;

} 


function FindFirstChildOfClass($node, className) {
    var result = null;
    if ($node != null && $node != 'undefined' && $node.length > 0) 
    {
        for (var indexer = 0; indexer < $node.length; indexer++) 
        {
            if ($($node[indexer]).hasClass(className)) {
                result = $($node[indexer]);
                break;
            }
        }
        if (result == null) {
            var $children = $node.children();
            for (var indexer = 0; indexer < $children.length; indexer++) {

                result = FindFirstChildOfClass($($children[indexer]), className);
                if (result != null) {
                    break;
                }                
            }
        }

    }
    return result;
}

function IsNodeParent($node, $parent) {

    if ($node == null || $node == 'undefined' || $node.length==0 || $node == $('body'))
        return false;
    if ($parent.equals($node))
        return true;
    else
        return IsNodeParent($node.parent(), $parent);    
}


function FindFirstParentOfClass($node, className) {

    if ($node == null || $node == 'undefined')
        return null;
        
    var parent = $node.parent();    
    if (parent== null || parent== 'undefined')
        return null;
        
    if(parent.hasClass(className))
    	return parent;    
    else
        return FindFirstParentOfClass($node.parent(), className);    
}



function Expand($button) {        
    CollapseAllExceptTheCurrentPath($button);
    $button.removeClass('collapsed');
    $button.addClass('expanded');
    ToggleMenu($button);   
}

function MakeMenuSelected(menu_id)
{
	var selected_element = $("#"+menu_id);
    if(selected_element!=null && selected_element!='undefined') 
    {
    	ShowRecursively(selected_element,"menu_main",0);		
	}
}



function CollapseAllExceptTheCurrentPath($button) {
    var currentMenuItem = $button.parents('.menu_element')[0];
    var allMenuItems = $('.menu_element');
    for(var indexer=0;indexer<allMenuItems.length;indexer++)
    {
        if (!IsNodeParent($(currentMenuItem), $(allMenuItems[indexer]))) 
        {               
            var subMenuItemsToCollapse = FindFirstChildOfClass($(allMenuItems[indexer]), 'menu_elements_collection');
            if(subMenuItemsToCollapse!=null && subMenuItemsToCollapse!='undefined') {

                if (subMenuItemsToCollapse.is(':visible')) {
                    subMenuItemsToCollapse.toggle('fast');
                } 
            }
            
            var buttonToCollapse = FindFirstChildOfClass($(allMenuItems[indexer]), 'expanded');
            if(buttonToCollapse!=null && buttonToCollapse!='undefined')
            {
                buttonToCollapse.removeClass('expanded');
                buttonToCollapse.addClass('collapsed');
            }
        }
    }
}


function Collapse($button) {
    $button.removeClass('expanded');
    $button.addClass('collapsed');    
    ToggleMenu($button);
}



function ToggleMenu($button) {
    var nodeToCollapse = FindFirstChildOfClass($($button.parents('.menu_element')[0]), 'menu_elements_collection');
    if (nodeToCollapse != null && nodeToCollapse != 'undefined' && nodeToCollapse.length == 1) {
        if (nodeToCollapse.children().length > 0) {
            nodeToCollapse.toggle('fast');             
    		$('.menu_elements_collection',nodeToCollapse).hide();    		
        }
    }
}

function ShowRecursively($element, classOfEndElement,level)
{
	var inner_level = level;
	if($element.hasClass(classOfEndElement))
	{	
		return;
	}
	else
	{
		$element.show();
		
		if($element.hasClass('menu_element'))
		{
			inner_level = level+1;
			
			if(inner_level>1)
			{
				
				var button = FindFirstChildOfClass($element,"collapsed");
				if(button!=null && button!='undefined') 
		    	{
		    		button.removeClass('collapsed');
		    		button.addClass('expanded');
				}
			}
		}
		ShowRecursively($element.parent(),classOfEndElement,inner_level);
	}
}

function ExpandCollabse($button) {
    if ($button != null && $button != 'undefined') { 
        if($button.hasClass('expanded'))
        {
            Collapse($button);
        }
        else
        {
            Expand($button);
        }
    }
}

function InitJqueryMenu()
{
	$(".menu_elements_collection").hide();
}


