function SDMenu(id)
{
	if (!document.getElementById || !document.getElementsByTagName)
	{
		return false;
	}
	
	this.menu           = document.getElementById(id);
	this.submenus       = this.menu.getElementsByTagName("div");
	this.remember       = true;
	this.speed          = 3;
	this.markCurrent    = true;
	this.oneSmOnly      = false;
}

SDMenu.prototype.init = function()
{
	var mainInstance    = this;
	
	for (var i = 0; i < this.submenus.length; i++)
	{
		this.submenus[i].getElementsByTagName("span")[0].onclick =  function()
		                                                            {
								mainInstance.toggleMenu(this.parentNode);
		                                                            };
	}
	
	if (this.markCurrent)
	{
		var links       = this.menu.getElementsByTagName("a");
		
		for (var i = 0; i < links.length; i++)
		{
			if (links[i].href == document.location.href)
			{
				links[i].className = "current";
				break;
			}
		}
	}
	
	if (this.remember)
	{
		var regex       = new RegExp("sdmenu_" + encodeURIComponent(this.menu.id) + "=([01]+)");
		var match       = regex.exec(document.cookie);
		
		if (match)
		{
			var states  = match[1].split("");
			
			for (var i = 0; i < states.length; i++)
			{
				this.submenus[i].className = (states[i] == 0 ? "collapsed" : "");
			}
		}
	}
};

SDMenu.prototype.toggleMenu =   function(submenu)
                                {
	                                if (submenu.className == "collapsed")
	                                {
		                                this.expandMenu(submenu);
		                            }
	                                else
	                                {
		                                this.collapseMenu(submenu);
		                            }
                                };

SDMenu.prototype.expandMenu =   function(submenu)
                                {
	                                var fullHeight      = submenu.getElementsByTagName("span")[0].offsetHeight;
	                                var links           = submenu.getElementsByTagName("a");

	                                for (var i = 0; i < links.length; i++)
	                                {
		                                fullHeight += links[i].offsetHeight;
		                            }
		                            
	                                var moveBy          = Math.round(this.speed * links.length);
	                                var mainInstance    = this;
	                                var intId = setInterval(function()
	                                                        {
		                                                        var curHeight   = submenu.offsetHeight;
		                                                        var newHeight   = curHeight + moveBy;
		                                                        
		                                                        if (newHeight < fullHeight)
		                                                        {
			                                                        submenu.style.height = newHeight + "px";
			                                                    }
		                                                        else
		                                                        {
			                                                        clearInterval(intId);
			                                                        submenu.style.height    = "";
			                                                        submenu.className       = "";
			                                                        mainInstance.memorize();
		                                                        }
	                                                        }, 30);
	                                this.collapseOthers(submenu);
                                };

SDMenu.prototype.collapseMenu = function(submenu)
                                {
	                                var minHeight       = submenu.getElementsByTagName("span")[0].offsetHeight;
	                                var moveBy          = Math.round(this.speed * submenu.getElementsByTagName("a").length);
	                                var mainInstance    = this;
	                                var intId           = setInterval(  function()
	                                                                    {
		                                                                    var curHeight   = submenu.offsetHeight;
		                                                                    var newHeight   = curHeight - moveBy;
		                                                                    
		                                                                    if (newHeight > minHeight)
		                                                                    {
			                                                                    submenu.style.height = newHeight + "px";
			                                                                }
		                                                                    else
		                                                                    {
			                                                                    clearInterval(intId);
			                                                                    submenu.style.height    = "";
			                                                                    submenu.className       = "collapsed";
			                                                                    mainInstance.memorize();
		                                                                    }
	                                                                    }, 30);
                                };

SDMenu.prototype.collapseOthers =   function(submenu)
                                    {
	                                    if (this.oneSmOnly)
	                                    {
		                                    for (var i = 0; i < this.submenus.length; i++)
		                                    {
			                                    if (this.submenus[i] != submenu && this.submenus[i].className != "collapsed")
			                                    {
				                                    this.collapseMenu(this.submenus[i]);
				                                }
				                            }
	                                    }
                                    };

SDMenu.prototype.expandAll =    function()
                                {
	                                var oldOneSmOnly    = this.oneSmOnly;
	                                this.oneSmOnly      = false;
	                                
	                                for (var i = 0; i < this.submenus.length; i++)
	                                {
		                                if (this.submenus[i].className == "collapsed")
		                                {
			                                this.expandMenu(this.submenus[i]);
			                            }
			                        }
			                                
	                                this.oneSmOnly = oldOneSmOnly;
                                };
                                
SDMenu.prototype.collapseAll =  function()
                                {
	                                for (var i = 0; i < this.submenus.length; i++)
	                                {
		                                if (this.submenus[i].className != "collapsed")
		                                {
			                                this.collapseMenu(this.submenus[i]);
			                            }
			                        }
                                };
                                
SDMenu.prototype.memorize = function()
                            {
	                            if (this.remember)
	                            {
		                            var states = new Array();
		                            
		                            for (var i = 0; i < this.submenus.length; i++)
		                            {
			                            states.push(this.submenus[i].className == "collapsed" ? 0 : 1);
			                        }
			                        
		                            var d = new Date();
		                            d.setTime(d.getTime() + (30 * 24 * 60 * 60 * 1000));
		                            document.cookie = "sdmenu_" + encodeURIComponent(this.menu.id) + "=" + states.join("") + "; expires=" + d.toGMTString() + "; path=/";
	                            }
                            };
