﻿function WMenu76(Prefix)
{
    this.Prefix = Prefix;
    this.xslMenu = null;
    this.divMain = $(this.Prefix + 'divMain');
    this.xmlData = null;
    this.container = null;
    this.uniqueId = null;
    this.urlToImages = null;
    
    this.tmrShowMenu = null;
    this.delayShowMenu = 150; 
    this.tmrHideMenu = null;
    this.delayHideMenu = 700;
    
    this.isRootItem = false;
    this.curMenuName = null;
    this.curParentMenuName = null;
    
    this.init = function()
    {
        if (!window.w76_xmlWMenu76_xsl)
        {
            var divWMenu76_xsl = $('xmlWMenu76_xsl');
            if (divWMenu76_xsl)
                window.w76_xmlWMenu76_xsl = xml.DOMDocument.create(divWMenu76_xsl.getAttribute('value'));
        }
        this.xslMenu = window.w76_xmlWMenu76_xsl;
        
        var divData = this.$(this.Prefix + 'xmlData');
        if (divData)
            this.xmlData = xml.DOMDocument.create(divData.getAttribute('value'));
        
        this.outMainItems(); 
    }
    
    this.outMainItems = function()
    {
        try
		{
			this.divMain.innerHTML = this.xmlData.transformNode(this.xslMenu);
		}
		catch(ex)
		{
			this.divMain.innerHTML = '<span class="ErrorText">Transforming error</span>';
			return;
		}
    }
    
    this.getItemNodeByName = function(name)
    {
        return this.xmlData != null ? this.xmlData.selectSingleNode('//Item[@Name="'+ name +'"]') : null;
    }
    
    this.$ = function(id)
    {
        return this.divMain.all ? this.divMain.all.item(id) : $(id);
    }
    
    this.setClassName_RootItem = function(rootItem_TD, isHover, isDisabled)
    {
          var rootItem_SubMenuTD = this.$(this.Prefix + 'TD_SubMenu_' + rootItem_TD.getAttribute('NodeName'));
          if (isDisabled)
          {
             rootItem_TD.className='WMenu76_TD_RootItems_Disabled';
             rootItem_SubMenuTD.className='WMenu76_TD_RootItems_SubMenu_Disabled';
          }
          else 
          {
            if (isHover)
            {
                rootItem_TD.className='WMenu76_TD_RootItems_Hover';
                rootItem_SubMenuTD.className='WMenu76_TD_RootItems_SubMenu_Hover';
            }
            else 
            {
                rootItem_TD.className='WMenu76_TD_RootItems';
                rootItem_SubMenuTD.className='WMenu76_TD_RootItems_SubMenu';
            }
          }
    }
    
    this.onMouseEnter_RootItem = function(curTD, event)
    {
        var tdRootItem = this.$(this.Prefix + 'TD_RootItem_' + curTD.getAttribute('NodeName'));
        if(tdRootItem)
            this.setClassName_RootItem(tdRootItem, true, tdRootItem.getAttribute('_Disabled'));
    }
 
    this.onMouseLeave_RootItem = function(curTD)
    {
        var tdRootItem = this.$(this.Prefix + 'TD_RootItem_' + curTD.getAttribute('NodeName'));
        if(tdRootItem)
            this.setClassName_RootItem(tdRootItem, false, tdRootItem.getAttribute('_Disabled'));
    }
    
    
    this._onMouseOver_RootItem = function(curTD, event)
    {
        if (typeof(curTD.onmouseenter) == 'undefined' &&  this.checkMouseEnter(curTD, event))
            this.onMouseEnter_RootItem(curTD, event);
    }
    
    this._onMouseOut_RootItem = function(curTD, event)
    {
         if (typeof(curTD.onmouseleave) == 'undefined' &&  this.checkMouseLeave(curTD, event))
            this.onMouseLeave_RootItem(curTD, event);
    }
    
    this.containsDOM = function(container, node)
    {
        var parentNode = node;
        while (parentNode && parentNode.id != this.divMain.id)
        {
            if (parentNode == container)
                return true;
            parentNode = parentNode.parentNode;
        }
        return false;
    }
    
    this.checkMouseEnter = function(element, event) 
    {
        if (element.contains && event.fromElement) 
            return !element.contains(event.fromElement);
        else if (event.relatedTarget) 
            return !this.containsDOM(element, event.relatedTarget);
        return true;    
    }

    this.checkMouseLeave = function(element, event) 
    {
        if (element.contains && event.toElement) 
            return !element.contains(event.toElement);
        else if (event.relatedTarget)
            return !this.containsDOM(element, event.relatedTarget);
        return true;
    }
    
    this.onMouseOut_RootItem = function(curTD, event)
    {
        this.curMenuName = null;
        this.curParentMenuName  = null;

        if (this.checkMouseLeave(curTD, event))
           this.onMouseLeave_RootItem(curTD, event);
         
        
        window.clearTimeout(this.tmrShowMenu);
        window.clearTimeout(this.tmrHideMenu);
        this.tmrHideMenu = window.setTimeout
            (   Function.createDelegate(this, function () 
                {
                    if (this.curParentMenuName == null)           
                        this.hideAllMenus();
                }
            ), this.delayHideMenu);
    }
    
    this.onMouseOver_RootItem = function(curTD, event)
    {
        if (this.checkMouseEnter(curTD, event))
            this.onMouseEnter_RootItem(curTD, event);
    
        this.isRootItem = true;
        this.curMenuName  = curTD.getAttribute('NodeName');
        this.curParentMenuName = curTD.parentNode.parentNode.parentNode.getAttribute('NodeName');
        
        if (!curTD.getAttribute('_Disabled'))
        {
            window.clearTimeout(this.tmrShowMenu);
            window.clearTimeout(this.tmrHideMenu);
            this.tmrShowMenu = window.setTimeout(
                Function.createDelegate(this,
                                            function () 
                                            {
                                                this.showCurrentMenu();
                                            }
                                            ),  this.delayShowMenu);
        }
    }
    
    this.onClick_RootItem = function(curTD)
    {
        this.onClickItem_CallBack(curTD);
    }
    
    this.onMouseOver_TR_MenuItem = function(event, curTR)
    {
        if (typeof(curTR.onmouseenter) == 'undefined' &&  this.checkMouseEnter(curTR, event))
        {
            this.onMouseEnter_TR_MenuItem(curTR, event);
            
            var parentNode = curTR.parentNode;
            while (parentNode && parentNode.id != this.divMain.id)
            {
                if (parentNode.nodeName == 'TR' && parentNode.getAttribute('NodeName'))
                    this.setClassName_MenuItem(parentNode, true, curTR.getAttribute('_Disabled'));
                else if (parentNode.nodeName == 'TD' && parentNode.getAttribute('NodeName'))
                    this.onMouseEnter_RootItem(parentNode, event);
                
                parentNode = parentNode.parentNode;
            }
        }
    
        this.isRootItem = false;
        this.curMenuName  = curTR.getAttribute('NodeName');
        this.curParentMenuName = curTR.parentNode.parentNode.getAttribute('NodeName');
        
        if (!curTR.getAttribute('_Disabled'))
        {    
            window.clearTimeout(this.tmrShowMenu);
            window.clearTimeout(this.tmrHideMenu);
            this.tmrShowMenu = window.setTimeout(
                Function.createDelegate(this,
                                            function () 
                                            {
                                                this.showCurrentMenu();
                                            }
                                            ),  this.delayShowMenu);
        }
        event.cancelBubble = true;
    }
    
    this.onMouseOut_TR_MenuItem = function(curTR, event)
    {
        if (typeof(curTR.onmouseleave) == 'undefined' &&  this.checkMouseLeave(curTR, event))
            this.onMouseLeave_TR_MenuItem(curTR, event);
        
        this.curMenuName = null;
        this.curParentMenuName = null;
        
        window.clearTimeout(this.tmrShowMenu);
        window.clearTimeout(this.tmrHideMenu);
        this.tmrHideMenu = window.setTimeout(
            Function.createDelegate(this,
                                        function () 
                                        {
                                            if (this.curParentMenuName == null)
                                                this.hideAllMenus();
                                        }
                                   ), this.delayHideMenu);
    }
    
    this.setClassName_MenuItem = function(MenuItem_TR, isHover, isDisabled)
    {
          if (isDisabled)
             MenuItem_TR.className='WMenu76_TR_MenuItem_Disabled';
          else 
          {
            if (isHover)
                MenuItem_TR.className='WMenu76_TR_MenuItem_Hover';
            else 
                MenuItem_TR.className='WMenu76_TR_MenuItem';
          }
    }
    
    this.onMouseEnter_TR_MenuItem = function(curTR)
    {
        this.setClassName_MenuItem(curTR, true, curTR.getAttribute('_Disabled'));
    }
 
    this.onMouseLeave_TR_MenuItem = function(curTR)
    {
        this.setClassName_MenuItem(curTR, false, curTR.getAttribute('_Disabled'));
    }

    this.onClick_TR_MenuItem = function(curTR)
    {
        this.onClickItem_CallBack(curTR);
    }
    
    this.onClickItem_CallBack = function(sender)
    {
        if (!sender.getAttribute('_Disabled'))
        {
            var nodeName = sender.getAttribute('NodeName')
            var itemNode = this.getItemNodeByName(nodeName);
            if (itemNode.selectSingleNode('Items'))
            {
                window.clearTimeout(this.tmrShowMenu);
                window.clearTimeout(this.tmrHideMenu);
                this.showCurrentMenu();
            }
            else
            {
                var itemMode = itemNode.getAttribute('Mode');
                if (itemMode != null && itemMode.toUpperCase() == 'ASHYPERLINK')
                {
                    var itemHyperLinks = sender.getElementsByTagName('A');
                    if (itemHyperLinks != null && itemHyperLinks.length > 0 && itemHyperLinks[0].href != '')
                        window.location = itemHyperLinks[0].href;
                }
                else            
                    this.doPostBack("ItemClick:" + nodeName);
            }
        }
    }

    this.doPostBack = function(eventArgument) 
	{
		if (!this.container)
			{
			    var theform = document.forms[0];
			    theform.__EVENTTARGET.value = this.uniqueId;
			    theform.__EVENTARGUMENT.value = eventArgument;
			    theform.submit();
			}
			else
			{
			    this.hideAllMenus();
			    __doWCPostBack(this.container, this.uniqueId, eventArgument)
            }			    
	}
    
    this.getSubMenuHTML = function(nodeName)
    {
        var itemNode = this.getItemNodeByName(nodeName)
        var resultHTML = '';
        
        if (itemNode) 
        {
            var itemsNode = itemNode.selectSingleNode('Items');
            if (itemsNode)
            {
                var subTD = this.$(this.Prefix +'TD_SubMenu_' + this.curMenuName);
                 try
		         {
			        resultHTML =  itemsNode.transformNode(this.xslMenu);
		         }
		         catch(ex)
		         {
			        resultHTML = '<span class="ErrorText">Transforming error</span>';
		         }
		     }
        }
        return resultHTML;
   }
    
    
    this.hideAllMenus = function()
    {
        var tblRootItems = this.$(this.Prefix + 'Table_RootItems');
        
        if (tblRootItems && tblRootItems.rows.length > 0)
        {
            for (var i = 0; i < tblRootItems.rows[0].cells.length; i++) 
            {
                var tdItem = tblRootItems.rows[0].cells[i]
                if (tdItem)
                    this.hideMenu(tdItem.getAttribute('NodeName'));
            }
        }
    }
    
    
    this.hideSubMenus = function(parentMenuName)
    {
        var tblMenu = this.$(this.Prefix + 'TblMenu_' +  parentMenuName);
        if (tblMenu)
        {
            for (var i = 0; i < tblMenu.rows.length; i++) 
            {
                var tdItem = tblMenu.rows[i].cells[0];
                if (tdItem) 
                    this.hideMenu(tdItem.getAttribute('NodeName'));
             }
        }
    }
    
    this.hideMenu = function(menuName)
    {
        var divMenu = this.$(this.Prefix + 'DivMenu_' + menuName)
        if (divMenu)
            divMenu.style.display = 'none';
    }
    
    this.showMenu = function (parentMenuName, menuName)
    {
        if (this.isRootItem)
            this.hideAllMenus();
        else
            this.hideSubMenus(parentMenuName);

        var divMenu = this.$(this.Prefix +'DivMenu_' + menuName);
        if (divMenu)
		    divMenu.style.display = 'none';
		    
        var td_SumMenu = this.$(this.Prefix + 'TD_SubMenu_' + menuName);
        if (td_SumMenu)
            td_SumMenu.innerHTML = '<img  src=\'' + this.urlToImages + '1x1.gif\'>' + this.getSubMenuHTML(menuName);

        this.hideSubMenus(menuName);
    }
    
    this.showCurrentMenu = function()
    {
        window.clearTimeout(this.tmrShowMenu);
        window.clearTimeout(this.tmrHideMenu);
        this.showMenu(this.curParentMenuName, this.curMenuName);
    }
 
    this.RestoreState = function(changesNode)
    {
        var deleteNode = changesNode.selectSingleNode('Changes/Delete');
        if (deleteNode)
        {
           for (var i = 0; i < deleteNode.childNodes.length; i++)
           {
                var deletedItem = deleteNode.childNodes[i];
                var origDeleteItem = this.getItemNodeByName(deletedItem.getAttribute('Name'));
                if (origDeleteItem)
                {
                    var origParentNode = origDeleteItem.parentNode;
                    origParentNode.removeChild(origDeleteItem);
                    if (origParentNode.childNodes.length == 0)
                    origParentNode.parentNode.removeChild(origParentNode);
                }
           }
        }
        
        var addedNode = changesNode.selectSingleNode('Changes/Add');
        if (addedNode)
        {
           for (var i = 0; i < addedNode.childNodes.length; i++)
           {
                var addedItem = addedNode.childNodes[i];
                var parentItem = null;
                
                var parentName = addedItem.getAttribute('ParentItemName');
                if (parentName == 'Menu$$Menu')
                    parentItem = this.xmlData.selectSingleNode('Menu');
                else
                   parentItem = this.getItemNodeByName(addedItem.getAttribute('ParentItemName'));
                
                if (parentItem)
                {
                    var parentItems = parentItem.selectSingleNode('Items');
                    
                    if (!parentItems)
                        parentItem.appendChild(parentItem.ownerDocument.createElement("Items"));

                    parentItems = parentItem.selectSingleNode('Items');
                    
                    if (addedItem)
                    {
                        var beforeItem = this.getItemNodeByName(addedItem.getAttribute('BeforeItem'));
                        parentItems.insertBefore(addedItem.cloneNode(true), beforeItem);
                        
                        if (parentName == 'Menu$$Menu')
                            parentItems.setAttribute('Horizontal', '');
                    }
                }
           }
        }
        
        var updateNode = changesNode.selectSingleNode('Changes/Update');
        if (updateNode)
        {
            for (var i = 0; i < updateNode.childNodes.length; i++)
            {
                var updateItem = updateNode.childNodes[i];
                var origItem = this.xmlData.selectSingleNode('//Item[@Name="'+ updateItem.getAttribute('Name') +'"]');
                if (origItem)
                {
                    var origItemItems = null;
                    if (origItem.childNodes.length > 0)
                        origItemItems = origItem.selectSingleNode('Items');
                    if (origItemItems)
                        updateItem.appendChild(origItemItems);
                        
                    origItem.parentNode.replaceChild(updateItem.cloneNode(true), origItem); 
                }
            }
        }
        this.outMainItems();
    }   
}