[fix] DotNetNuke SolPart menu positioning fix for Firefox

The admin dropdown menus in our DNN 3.1.1 sites haven't been working in FireFox - they show up in the upper left hand corner of the screen (absolutely positioned at 0,0). A javascript change (in spmenu.js) fixed it for us.

I'm not sure if this somehow works for everyone else, or if DNN people don't use FireFox, or what. I checked the latest release (3.2 / 4.2) and they don't appear to have this fix, so here it is. I'm going to submit it as a bug and suggested fix to the DNN forums, too.

The problem is setting positions via javascript DOM manipulation without specifying the units:

oMenu.style.top = 100; //bad - no units specified
oMenu.style.top = 100 + 'px'//good - units specified

The best I can tell, the units should be required, so FireFox is being correct in ignoring the improper settings. Anyhow, here's my altered spmenu.js. Of course, the original copyright applies, this is just a patch fix.

//------------------------------------------------------//
// Solution Partner's ASP.NET Hierarchical Menu Control //
// Copyright (c) 2002-2005                              //
// Jon Henning - Solution Partner's Inc                 //  
// jhenning@solpart.com   -   http://www.solpart.com    //
// Compatible Menu Version:  <Min: 1400>             //
//                           <Max: 1.6.1.0>             //
// <Script Version: 1610>                               //
//------------------------------------------------------//
var m_oSolpartMenu;
if (m_oSolpartMenu == null)
    m_oSolpartMenu = 
new Array(); //stores all menu objects (SolpartMenu) in array 
var m_spm_sBrowser;
var m_spm_sVersion;
function spm_initMyMenu(oXML, oCtl)   
//Creates SolpartMenu object and calls generate method
{

  m_oSolpartMenu[oCtl.id] = 
new SolpartMenu(oCtl);
  m_oSolpartMenu[oCtl.id].GenerateMenuHTML(oXML);
 
}
  
//------- Constructor -------//
function SolpartMenu(o)
{
__db(o.id + 
' - constructor');
//  var me = this;  //allow attached events to reference this
  //--- Data Properties ---//
  
this.systemImagesPath=spm_getAttr(o, 'SysImgPath''');  
  
this.iconImagesPath=spm_getAttr(o, 'IconImgPath'this.systemImagesPath);
  
  
this.xml = spm_getAttr(o, 'XML''');
  
this.xmlFileName = spm_getAttr(o, 'XMLFileName''');

  
//--- Appearance Properties ---//
  
this.fontStyle=spm_getAttr(o, 'FontStyle''font-family: arial;');
  
this.backColor=spm_getAttr(o, 'BackColor');  
  
this.foreColor=spm_getAttr(o, 'ForeColor');
  
this.iconBackColor=spm_getAttr(o, 'IconBackColor');
  
this.hlColor=spm_getAttr(o, 'HlColor''');
  
this.shColor=spm_getAttr(o, 'ShColor'''); 
  
this.selColor=spm_getAttr(o, 'SelColor');
  
this.selForeColor=spm_getAttr(o, 'SelForeColor');
  
this.selBorderColor=spm_getAttr(o, 'SelBorderColor');
  
this.menuAlignment = spm_getAttr(o, 'MenuAlignment''Left');
  
this.display=spm_getAttr(o, 'Display''horizontal');
  
this.MBLeftHTML=spm_getAttr(o, 'MBLHTML''');
  
this.MBRightHTML=spm_getAttr(o, 'MBRHTML''');

  
this.rootArrow = spm_getAttr(o, 'RootArrow''0');
  
this.rootArrowImage = spm_getAttr(o, 'RootArrowImage''');
  
this.arrowImage = spm_getAttr(o, 'ArrowImage''');
  
this.backImage=spm_getAttr(o, 'BackImage''');

    
this.supportsTransitions = spm_getAttr(o, 'SupportsTrans''0');

  
//--- Transition Properteis ---//
  //this.menuEffectsStyle=spm_getAttr(o, 'MenuEffectsStyle', '');
  
this.menuTransitionLength=spm_getAttr(o, 'MenuTransitionLength', .3);
  
this.menuTransition=spm_getAttr(o, 'MenuTransition''None');
  
this.menuTransitionStyle=spm_getAttr(o, 'MenuTransitionStyle''');
  
this.SolpartMenuTransitionObject = new SolpartMenuTransitionObject();
  
  
//--- Behavior Properteis ---//
  
this.moveable = spm_getAttr(o, 'Moveable''0');
  
this.moDisplay=spm_getAttr(o, 'MODisplay''HighLight');
  
this.moExpand=spm_getAttr(o, 'MOExpand', "-1");
  
this.moutDelay=spm_getAttr(o, 'MOutDelay', "0");
  
this.minDelay=spm_getAttr(o, 'MInDelay', "0");
  
this.minDelayType=null;
    
this.minDelayTimer=null;
    
this.minDelayObj=null;
      
  
if (spm_browserType() == 'safari')    //safari has issues with mouseoutdelay...
        
this.moutDelay = 5000;
        
  
this.target=spm_getAttr(o, 'target', "");
  
this.moScroll=spm_getAttr(o, 'MOScroll', "-1");

  
//--- Sizing Properties ---//
  
this.menuBarHeight=spm_fixUnit(spm_getAttr(o, 'MenuBarHeight''0'));
  
this.menuItemHeight=spm_fixUnit(spm_getAttr(o, 'MenuItemHeight''0'));
  
this.iconWidth=spm_fixUnit(spm_getAttr(o, 'IconWidth''0'));
  
this.borderWidth=spm_getAttr(o, 'BorderWidth''1');

  
//--- CSS Properties ---//
  
this.cssMenuContainer=spm_getAttr(o, 'CSSMenuContainer''');
  
this.cssMenuBar=spm_getAttr(o, 'CSSMenuBar''');
  
this.cssMenuItem=spm_getAttr(o, 'CSSMenuItem''');
  
this.cssMenuIcon=spm_getAttr(o, 'CSSMenuIcon''');
  
this.cssSubMenu=spm_getAttr(o, 'CSSSubMenu''');
  
this.cssMenuBreak=spm_getAttr(o, 'CSSMenuBreak''');
  
this.cssMenuItemSel=spm_getAttr(o, 'CSSMenuItemSel''');
  
this.cssMenuArrow=spm_getAttr(o, 'CSSMenuArrow''');
  
this.cssMenuRootArrow=spm_getAttr(o, 'CSSRootMenuArw''');
  
this.cssMenuScrollItem=spm_getAttr(o, 'CSSScrollItem''');

    
//for right to left (rtl) menus
    
this.direction = spm_getCurrentStyle(document.body, 'direction');

    
this.useIFrames=(spm_getAttr(o, 'useIFrames''1') != '0' && spm_supportsIFrameTrick());    
    
    
this.delaySubmenuLoad=(spm_getAttr(o, 'delaySubmenuLoad''0') != '0' && spm_needsSubMenuDelay());    
    
  
  
//---- methods ---//
  //this.GenerateMenuHTML=__GenerateMenuHTML;

  //----- private ----//
  
this._m_sNSpace = o.id;               //stores namespace for menu
  
this._m_sOuterTables = '';            //stores HTML for sub menus
  
this._m_oDOM;                         //stores XML DOM object
    
this._m_oMenu = o;                    //stores container
  
this._m_oMenuMove;                    //stores control that is used for moving menu
  
  
this._m_oTblMenuBar;                  //stores menu container
    
this._m_aOpenMenuID = new Array();      //stores list of menus that are currently displayed
    
this._m_bMoving=false;                //flag to determine menu is being dragged
  
this._m_dHideTimer = null;            //used to time when mouse out occured to auto hide menu based on mouseoutdelay
  
this._m_oScrollingMenu = null;                //used in scrolling menu on mouse over

    //--- Exposed Events ---//
/*
    this.onMenuComplete=spm_getAttr(o, 'OnMenuComplete', null);                        //fires once menu is done loading
    this.onMenuBarClick=spm_getAttr(o, 'OnMenuBarClick', null);                        //fires once menu bar is clicked
    this.onMenuItemClick=spm_getAttr(o, 'OnMenuItemClick', null);         //fires once menu item is clicked
    this.onMenuBarMouseOver=spm_getAttr(o, 'OnMenuBarMouseOver', null);        //fires once mouse moves over menu bar
    this.onMenuBarMouseOut=spm_getAttr(o, 'OnMenuBarMouseOut', null);            //fires once mouse moves out of menu bar
    this.onMenuItemMouseOver=spm_getAttr(o, 'OnMenuItemMouseOver', null);    //fires once mouse moves over menu item
    this.onMenuItemMouseOut=spm_getAttr(o, 'OnMenuItemMouseOut', null);        //fires once mouse moves out of menu bar
*/

//--- Menu Moving currently disabled ---//
/*
  this._menuhook_MouseMove=__menuhook_MouseMove;
  this._menuhook_MouseDown=__menuhook_MouseDown;
  this._menuhook_MouseUp=__menuhook_MouseUp;
  this._document_MouseMove=__document_MouseMove;
  this._document_MouseDown=__document_MouseDown;
  this._document_MouseUp=__document_MouseUp;
  this._bodyclick=__bodyclick;

  this.menuhook_MouseMove=function(e) {me._menuhook_MouseMove(e);};
  this.menuhook_MouseDown=function(e) {me._menuhook_MouseDown(e);};
  this.menuhook_MouseUp=function(e) {me._menuhook_MouseUp(e);};
  this.document_MouseMove=function(e) {me._document_MouseMove(e);};
  this.document_MouseDown=function(e) {me._document_MouseDown(e);};
  this.menuhook_MouseUp=function(e) {me._menuhook_MouseUp(e);};
  this.bodyclick=function() {me._bodyclick();};
*/ 
__db(this._m_oMenu.id + ' - constructor end');

}

//--- Destroys interrnal object references ---//
SolpartMenu.prototype.destroy = function ()
{
  
this.systemImagesPath = null;  
  
this.iconImagesPath = null;
  
this.xml = null;
  
this.xmlFileName = null;

  
//--- Appearance Properties ---//
  
this.fontStyle = null;
  
this.backColor = null;  
  
this.foreColor = null;
  
this.iconBackColor = null;
  
this.hlColor = null;
  
this.shColor = null
  
this.selColor = null;
  
this.selForeColor = null;
  
this.selBorderColor = null;
  
this.menuAlignment = null;
  
this.display = null;

  
this.rootArrow = null;
  
this.rootArrowImage = null;
  
this.arrowImage = null;
  
this.backImage = null;

  
//--- Transition Properteis ---//
  //this.menuEffectsStyle = null;
  
this.menuTransitionLength = null;
  
this.menuTransition = null;
  
this.SolpartMenuTransitionObject = null;
  
  
//--- Behavior Properteis ---//
  
this.moveable = null;
  
this.moDisplay = null;
  
this.moExpand = null;
  
this.moutDelay = null;

  
//--- Sizing Properties ---//
  
this.menuBarHeight = null;
  
this.menuItemHeight = null;
  
this.iconWidth = null;
  
this.borderWidth = null;

  
//--- CSS Properties ---//
  
this.cssMenuContainer = null;
  
this.cssMenuBar = null;
  
this.cssMenuItem = null;
  
this.cssMenuIcon = null;
  
this.cssSubMenu = null;
  
this.cssMenuBreak = null;
  
this.cssMenuItemSel = null;
  
this.cssMenuArrow = null;
  
this.cssMenuRootArrow = null;
  
  
//---- methods ---//
  //this.GenerateMenuHTML=__GenerateMenuHTML = null;

  //----- private ----//
  
m_oSolpartMenu[this._m_sNSpace] = null;

  
this._m_sNSpace = null;                 //stores namespace for menu
  
this._m_sOuterTables = null;            //stores HTML for sub menus
  
this._m_oDOM = null;                    //stores XML DOM object
    
this._m_oMenu = null;                   //stores container
  
this._m_oMenuMove = null;               //stores control that is used for moving menu
  
  
this._m_oTblMenuBar = null;             //stores menu container
    
this._m_aOpenMenuID = null;                //stores list of menus that are currently displayed
    
this._m_bMoving = null;                 //flag to determine menu is being dragged
  
this._m_dHideTimer = null;              //used to time when mouse out occured to auto hide menu based on mouseoutdelay
  
this._m_oScrollingMenu = null;                    //used in scrolling menu on mouse over
  
}

//--- static/shared members ---//
/*
SolpartMenu.prototype.menuhook_MouseMove=__menuhook_MouseMove;
SolpartMenu.prototype.menuhook_MouseDown=__menuhook_MouseDown;
SolpartMenu.prototype.menuhook_MouseUp=__menuhook_MouseUp;

SolpartMenu.prototype.document_MouseMove=__document_MouseMove;
SolpartMenu.prototype.document_MouseDown=__document_MouseDown;
SolpartMenu.prototype.document_MouseUp=__document_MouseUp;
*/

//--- xml document loaded (non-dataisland) ---//
SolpartMenu.prototype.onXMLLoad = function ()
{
  
this.GenerateMenuHTML(this._m_oDOM);
}

//--- Generates menu HTML through passed in XML DOM ---//
SolpartMenu.prototype.GenerateMenuHTML = function (oXML) 
{
__db(
this._m_oMenu.id + ' - GenerateMenuHTML');
    
//'Generates the main menu bar
  
var sHTML = '';
  
this._m_sOuterTables = '';
  
//this._m_oMenu.insertAdjacentElement('beforeBegin', );

  
    //if (oXML.readyState != 'complete')
    //    return;

    
if (oXML == null)
    {
      
if (this._m_oDOM == null)
      {
        oXML = spm_createDOMDoc();
//document.implementation.createDocument("", "", null);
        
this._m_oDOM = oXML;
              
        
if (this.xml.length)
          oXML.loadXML(
this.xml);
        
        
if (this.xmlFileName.length)
        {
          oXML.onload = eval(
'onxmlload' this._m_sNSpace); //'m_oSolpartMenu["' + this._m_sNSpace + '"].onXMLLoad'; this.onXMLLoad;
          
oXML.load(this.xmlFileName);
          
return//async load
        
}
    }
    }
    
else
      this
._m_oDOM = oXML;

  
if (this.display == "vertical")
  {
      sHTML += 
'<table ID="tbl' this._m_sNSpace + 'MenuBar" CELLPADDING=\'0\' CELLSPACING=\'0\' BORDER="0" CLASS="' + spm_fixCSSForMac(this.getIntCSSName('spmbctr') + this.cssMenuContainer) + '" HEIGHT="100%" STYLE="vertical-align: center;">\n';    //removed position: relative;  for IE and display: block; for Opera
      
sHTML += MyIIf(this.MBLeftHTML.length, '<tr>\n       <td>' this.MBLeftHTML + '</td>\n</tr>\n''');
      sHTML += MyIIf(Number(
this.moveable), '<tr>\n       <td ID="td' this._m_sNSpace + 'MenuMove" height=\'3px\' style=\'cursor: move; ' + spm_getMenuBorderStyle(this) + '\'>' + spm_getSpacer(this) + '</td>\n</tr>\n''');
      sHTML +=         
this.GetMenuItems(this._m_oDOM.documentElement);
      sHTML += 
'       <tr><td HEIGHT="100%">' + spm_getSpacer(this) + '</td>\n' ;
      sHTML += 
'   </tr>\n';
      sHTML += MyIIf(
this.MBRightHTML.length, '<tr>\n       <td>' this.MBRightHTML + '</td>\n</tr>\n''');
      sHTML += 
'</table>\n';
  }
  
else
  
{
      sHTML += 
'<table ID="tbl' this._m_sNSpace + 'MenuBar" CELLPADDING=\'0\' CELLSPACING=\'0\' BORDER="0" CLASS="' + spm_fixCSSForMac(this.getIntCSSName('spmbctr') + this.cssMenuContainer) + '" WIDTH="100%" STYLE="vertical-align: center; ">\n';    //removed position: relative;  for IE and display: block; for Opera
      
sHTML += '    <tr>\n';
      sHTML += MyIIf(
this.MBLeftHTML.length, '<td>' this.MBLeftHTML + '</td>\n''');
      sHTML += MyIIf(Number(
this.moveable), '       <td ID="td' this._m_sNSpace + 'MenuMove" width=\'3px\' style=\'cursor: move; ' + spm_getMenuBorderStyle(this) + '\'>' + spm_getSpacer(this) + '</td>\n''');
      sHTML += spm_getMenuSpacingImage(
'left'this);
      sHTML +=         
this.GetMenuItems(this._m_oDOM.documentElement);
      sHTML += spm_getMenuSpacingImage(
'right'this);
      sHTML += MyIIf(
this.MBRightHTML.length, '<td>' this.MBRightHTML + '</td>\n''');
      sHTML += 
'   </tr>\n';
      sHTML += 
'</table>\n';
  }

/*    
    if (spm_browserType() == 'op')
    {
        this._m_oMenu.innerHTML = sHTML;
        var oDiv = document.createElement('div');
        oDiv.innerHTML = this._m_sOuterTables;
        document.body.appendChild(oDiv);
    }
    else  
*/
        //sHTML = '<SPAN>' + this._m_sOuterTables + '</SPAN>' + sHTML;
        //this._m_sOuterTables = '';
    
    
    
this._m_oMenu.innerHTML = sHTML;

    
this.GenerateSubMenus();

    
//this._m_oMenu.style.height = '100%';

    
  
this._m_oMenuMove = spm_getById('td' this._m_sNSpace + 'MenuMove');

/*
  //--- attach events for menu moving ---//
  if (Number(this.moveable))
  {
    var oCtl = this._m_oMenuMove;  //this._m_oMenu
    oCtl.onmousedown = this.menuhook_MouseDown;
    oCtl.onmouseup = this.menuhook_MouseUp;
    oCtl.onmousemove = this.menuhook_MouseMove;

    if (spm_browserType() == 'ie')
    {
      document.onmousemove = this.document_MouseMove;
      document.onmousedown = this.document_MouseDown;
      //spm_getTags("BODY")[0].onclick = this.bodyclick;
      spm_getTags("BODY")[0].attachEvent('onclick', this.bodyclick);
    }
    else
    {
        window.addEventListener("click", this.bodyclick, true);
        window.addEventListener("mousemove", this.document_MouseMove, true);
        window.addEventListener("mousedown", this.document_MouseDown, true);
        window.addEventListener("mouseup", this.document_MouseUp, true);
    }

  }
*/
  //if (spm_browserType() == 'ie')
        
spm_getTags("BODY")[0].onclick = spm_appendFunction(spm_getTags("BODY")[0].onclick, 'm_oSolpartMenu["' this._m_sNSpace + '"].bodyclick();'); //document.body.onclick = this.bodyclick;
    //else
    //    window.addEventListener("click", this.bodyclick, true);

  
this._m_oTblMenuBar = spm_getById('tbl' this._m_sNSpace + 'MenuBar'); //this._m_oMenu
  
  
this.fireEvent('onMenuComplete');

__db(
this._m_oMenu.id + ' - GenerateMenuHTML end');    
}

SolpartMenu.prototype.GenerateSubMenus = function (oXML) 
{
    
if (this._m_sOuterTables.length > 0)
    {
            var oDiv = spm_getById(
this._m_sNSpace + '_divOuterTables');
            
if (oDiv == null)
            {
                alert(
'It appears that your menu dll is out of sync with your script file.');
                
return;
            }
            
            
if (this.delaySubmenuLoad != '0' && document.readyState != 'complete')
                
return;
                            
            oDiv.innerHTML = 
this._m_sOuterTables;
            
    }
    
this._m_sOuterTables = '';
}

function spm_getMenuBarEvents(sCtl)
{
  
return 'onmouseover="m_oSolpartMenu[\'' + sCtl + '\'].onMBMO(this);" onmouseout="m_oSolpartMenu[\'' + sCtl + '\'].onMBMOUT(this);" onclick="m_oSolpartMenu[\'' + sCtl + '\'].onMBC(this, event);" onmousedown="m_oSolpartMenu[\'' + sCtl + '\'].onMBMD(this);" onmouseup="m_oSolpartMenu[\'' + sCtl + '\'].onMBMU(this);"';
}

function spm_getMenuItemEvents(sCtl)
{
  
return 'onmouseover="m_oSolpartMenu[\'' + sCtl + '\'].onMBIMO(this);" onmouseout="m_oSolpartMenu[\'' + sCtl + '\'].onMBIMOUT(this);" onclick="m_oSolpartMenu[\'' + sCtl + '\'].onMBIC(this, event);"';
}

//--- Returns HTML for menu items (recursive function) ---//
SolpartMenu.prototype.GetMenuItems = function (oParent)
{
  var oNode;
  var sHTML = 
'';
  var sID;
  var sParentID;
  var sClickAction;
  
    
for (var i = 0; i < oParent.childNodes.length; i++)
    {
        oNode = oParent.childNodes[i];

        
if (oNode.nodeType != 3 && oNode.nodeType != 8)  //exclude nodeType of Text (Netscape/Mozilla) issue!
        
{
          
//'determine if root level item and set parent id accordingly
          
if (oNode.parentNode.nodeName != "menuitem")
              sParentID = "-1";
          
else
              
sParentID = oNode.parentNode.getAttribute("id");

          
if (oNode.nodeName == "menuitem")
              sID = oNode.getAttribute("id");
          
else
              
sID = "";


  __db(sID + 
' getmenuitems');
            sClickAction = spm_getMenuClickAction(oNode, 
this);


          
if (sParentID == "-1")    //'if top level menu item
          
{
        
              
if (this.display == "vertical")
                  sHTML += "<tr>\n"; 
//'if vertical display then add rows for each top menuitem
              
              
if (oNode.nodeName == 'menubreak')
              {
                    
if (this.display == "vertical")
                        sHTML += "<tr>\n"; 
//'if vertical display then add rows for each top menuitem

                     
var sBreakHTML = spm_getAttr(oNode, 'lefthtml''') + spm_getAttr(oNode, 'righthtml''');
                     
if (sBreakHTML.length > 0)
                         sHTML += 
'   <td class="' + spm_fixCSSForMac(this.getIntCSSName('spmbrk') + this.cssMenuBreak) + '">' + sBreakHTML + '</td>\n';
                     
else
                         
sHTML += '   <td class="' + spm_fixCSSForMac(this.getIntCSSName('spmbrk') + this.cssMenuBreak) + '">' + spm_getMenuImage('spacer.gif'thistrue' ') + '</td>\n';
//                         sHTML += '   <td style="height: 1px" class="' + spm_fixCSSForMac(this.getIntCSSName('spmicn') + this.cssMenuIcon) + '">' + spm_getMenuImage('spacer.gif', this, true, ' ') + '</td>\n<td colspan="2" class="' + spm_fixCSSForMac(this.getIntCSSName('spmbrk') + this.cssMenuBreak) + '">' + spm_getMenuImage('spacer.gif', this, true, ' ') + '</td>\n';

                    
if (this.display == "vertical")
                        sHTML += "</tr>\n";
              }
              
else
              
{
                    sHTML += 
'<td>\n<table width="100%" CELLPADDING="0" CELLSPACING="0" border="0">\n<tr id="td' this._m_sNSpace + sID + '" ' + spm_getMenuBarEvents(this._m_sNSpace) + '  class="' + spm_fixCSSForMac(this.getIntCSSName('spmbar spmitm') + this.cssMenuBar + ' ' this.cssMenuItem + ' ' + spm_getMenuItemCSS(oNode)) + '" savecss="' + spm_getMenuItemCSS(oNode) + '" saveselcss="' + spm_getMenuItemSelCSS(oNode) + '" menuclick="' + sClickAction + '" style="' + spm_getMenuItemStyle('item', oNode) + '">\n';
                    var sAlign = 
this.display=='vertical' 'align="' this.menuAlignment + '"' '';
                    sHTML += 
'<td unselectable="on" NOWRAP="NOWRAP" ' + sAlign + ' TITLE="' + spm_getAttr(oNode, 'tooltip''') + '">' + spm_getImage(oNode, this) + spm_getItemHTML(oNode, 'left''&nbsp;') + spm_getAttr(oNode, 'title''') + spm_getItemHTML(oNode, 'right') + MyIIf(Number(this.rootArrow) && spm_nodeHasChildren(oNode), '</td>\n<td align="right" class="' + spm_fixCSSForMac(this.getIntCSSName('spmrarw') + this.cssMenuRootArrow) + '">' + spm_getArrow(this.rootArrowImage, this) + "", '&nbsp;') + '\n</td>\n</tr>\n</table>\n</td>\n';
                }
                          
              
if (this.display == "vertical")
                  sHTML += "</tr>\n";
          
         
          }
          
else                        //'submenu - not top level menu item
          
{
              
switch(oNode.nodeName)
              {
                  
case "menuitem":
                  {
                      sHTML +=        
'   <tr ID="tr' this._m_sNSpace + sID + '" ' + spm_getMenuItemEvents(this._m_sNSpace) + ' parentID="' + sParentID + '" class="' + spm_fixCSSForMac(this.getIntCSSName('spmitm') + this.cssMenuItem + ' ' + spm_getMenuItemCSS(oNode)) + '" savecss="' + spm_getMenuItemCSS(oNode) + '" saveselcss="' + spm_getMenuItemSelCSS(oNode) + '" menuclick="' + sClickAction + '" style="' + spm_getMenuItemStyle('item', oNode) + '">\n';
                      sHTML +=        
'       <td unselectable="on" id="icon' this._m_sNSpace + sID + '" class="' + spm_fixCSSForMac(this.getIntCSSName('spmicn') + this.cssMenuIcon) + '" style="' + spm_getMenuItemStyle('image', oNode) + '; ' + spm_getMenuItemStyle('item', oNode) + '">' + spm_getImage(oNode, this) + '</td>\n';
                      sHTML +=        
'       <td unselectable="on" id="td' this._m_sNSpace + sID + '" class="' + spm_fixCSSForMac(this.getIntCSSName('spmitm') + this.cssMenuItem + ' ' + spm_getMenuItemCSS(oNode)) + '" savecss="' + spm_getMenuItemCSS(oNode) + '" NOWRAP="NOWRAP" TITLE="' + spm_getAttr(oNode, 'tooltip''') + '" style="' + spm_getMenuItemStyle('item', oNode) + '">' + spm_getItemHTML(oNode, 'left''') + spm_getAttr(oNode, 'title''') + spm_getItemHTML(oNode, 'right''') + '</td>\n';
                      sHTML +=        
'       <td unselectable="on" id="arrow' this._m_sNSpace + sID + '" width="15px" CLASS="' + spm_fixCSSForMac(this.getIntCSSName('spmarw') + this.cssMenuArrow) + '" style="' + spm_getMenuItemStyle('item', oNode) + '">' + MyIIf(spm_nodeHasChildren(oNode), spm_getArrow(this.arrowImage, this), spm_getSpacer(this)) + '</td>\n';
                      sHTML +=        
'   </tr>\n';

                      
break;
                  }
                  
case "menubreak":
                  {
                         var sBreakHTML = spm_getAttr(oNode, 
'lefthtml''') + spm_getAttr(oNode, 'righthtml''');
                         
if (sBreakHTML.length > 0)
                            sHTML += 
'   <tr><td colspan="3" class="' + spm_fixCSSForMac(this.getIntCSSName('spmbrk') + this.cssMenuBreak) + '">' + sBreakHTML + '</td>\n</tr>\n';
                         
else
                            
sHTML += '   <tr>\n<td style="height: 1px" class="' + spm_fixCSSForMac(this.getIntCSSName('spmicn') + this.cssMenuIcon) + '">' + spm_getMenuImage('spacer.gif'thistrue' ') + '</td>\n<td colspan="2" class="' + spm_fixCSSForMac(this.getIntCSSName('spmbrk') + this.cssMenuBreak) + '">' + spm_getMenuImage('spacer.gif'thistrue' ') + '</td>\n</tr>\n';

                      
break;
                  }
              }
          }

          
//'Generate sub menu - note: we are recursively calling ourself
          //'netscape renders tables with display: block as having cellpadding!!! therefore using div outside table - LAME!
          
if (oNode.childNodes.length > 0)
          {
                var sTag = 
'DIV';
                var sStyle = 
'';

                
if (spm_isMac('ie'))
                {
                    sTag = 
'P';
                    sStyle = 
'margin-top:0px; margin-left:0px;'
                
}
              
this._m_sOuterTables = '\n<' + sTag + ' ID="tbl' this._m_sNSpace + sID + '" CLASS="' + spm_fixCSSForMac(this.getIntCSSName('spmsub') + this.cssSubMenu) + '" STYLE="display:none; position: absolute;' + sStyle + this.menuTransitionStyle + '">\n<table CELLPADDING="0" CELLSPACING="0" BORDER="0">\n' this.GetMenuItems(oNode) + '\n</table>\n</' + sTag + '>\n' this._m_sOuterTables;
            }

    }
    }
    
return sHTML;
}

    
//--------------- Event Functions ---------------//
  //--- menubar click event ---//
    
SolpartMenu.prototype.onMBC = function (e, evt)
    {
        
this.GenerateSubMenus();

        var oCell = e; 
//event.srcElement;
        
var sID = oCell.id.substr(2);

        var oMenu = spm_getById("tbl" + sID);
    
//var oMenu = spm_getById("td" + sID);
        
        
if (oMenu != null)
        {
            
this.hideAllMenus();        //mindelay mod
            
if (oMenu.style.display == '')
            {
                
this.hideAllMenus();        
                
if (this.useIFrames)
                    spm_iFrameIndex(oMenu, 
falsethis.systemImagesPath);
                
else
                    
spm_showElement("SELECT|OBJECT");
            }
            
else
            
{
                spm_positionMenu(
this, oMenu, oCell);
                
                
this.doTransition(oMenu);
                oMenu.style.display = "";
                
this._m_aOpenMenuID[0] = sID;
                
if (this.useIFrames)
                    spm_iFrameIndex(oMenu, 
truethis.systemImagesPath);
                
else
                    
spm_hideElement("SELECT|OBJECT",oMenu);
            }
        }
        
    
this.fireEvent('onMenuBarClick', oCell);
    
    oMenu = spm_getById("td" + sID);
    
if (spm_getAttr(oMenu, "menuclick", '').length)
    {
      eval(spm_getAttr(oMenu, "menuclick", 
''));
      
this.hideAllMenus();
    }
        spm_stopEventBubbling(evt);
    }
    
  
//--- menubar mousedown event ---//
    
SolpartMenu.prototype.onMBMD = function (e)
    {
        var oCell = e; 
//event.srcElement;
        
this.applyBorder(oCell, 1, this.shColor, this.hlColor);
    }
  
  
//--- menubar mouseup event ---//
    
SolpartMenu.prototype.onMBMU = function (e)
    {
        var oCell = e; 
//event.srcElement;
        
this.applyBorder(oCell, 1, this.hlColor, this.shColor);
    }
  
  
//--- menubar mouseover event ---//
    
SolpartMenu.prototype.onMBMO = function (e, bBypassDelay)
    {
        
this.GenerateSubMenus();
        var oCell = e; 
//event.srcElement;
        
        
if (oCell.id.length == 0) //cancelBubble
          
return;
        var sID = oCell.id.substr(2);
        var oMenu = spm_getById("tbl" + sID);

        
if (this._m_aOpenMenuID.length || this.moExpand != '0')
        {
            
if (this.minDelay != 0 && bBypassDelay != true)
            {
                
if (this.minDelayTimer != null)
                    window.clearTimeout(
this.minDelayTimer);
                
this.minDelayType = 'root';
                
this.minDelayObj = e;
                
this.minDelayTimer = setTimeout('m_oSolpartMenu["' this._m_sNSpace + '"].mouseInDelayHandler()'this.minDelay);
            }
            
else
            
{
                
//--- if menu is shown then mouseover triggers the showing of all menus ---//
                
this.hideAllMenus();

                
if (oMenu != null)
                {
                    spm_positionMenu(
this, oMenu, oCell);
                    
this.doTransition(oMenu);
                    oMenu.style.display = "";
                    
this._m_aOpenMenuID[0] = sID;
                    
if (this.useIFrames)
                        spm_iFrameIndex(oMenu, 
truethis.systemImagesPath);
                    
else
                        
spm_hideElement("SELECT|OBJECT",oMenu);
                }
            }
            
this.applyBorder(oCell, 1, this.shColor, this.hlColor);
        }
        
else
        
{
            
this.applyBorder(oCell, 1, this.hlColor, this.shColor);
        }

        oCell.className =  spm_fixCSSForMac(
this.getIntCSSName('spmitmsel spmbar') + this.cssMenuBar + ' ' this.cssMenuItemSel + ' ' + spm_getAttr(oCell, 'saveselcss''') + ' ' + spm_getAttr(oCell, 'savecss'''));
        
        
this._m_dHideTimer = null;
        
        
this.fireEvent('onMenuBarMouseOver', oCell);
        
    }
  
//--- menubar mouseout event ---//
    
SolpartMenu.prototype.onMBMOUT = function (e)
    {
        var oCell = e; 
//event.srcElement;
        
var sID = oCell.id.substr(2);
        
this.applyBorder(oCell, 1, spm_getCellBackColor(oCell), spm_getCellBackColor(oCell), "none");    
        
this._m_dHideTimer = new Date();

        
if (this.moutDelay != 0)
          setTimeout(
'm_oSolpartMenu["' this._m_sNSpace + '"].hideMenuTime()'this.moutDelay);
          
    oCell.className = spm_fixCSSForMac(
this.getIntCSSName('spmbar spmitm') + this.cssMenuBar + ' ' this.cssMenuItem + ' ' + spm_getAttr(e, 'savecss'''));
    
this.stopTransition();
    
this.minDelayType = null;
    
this.fireEvent('onMenuBarMouseOut', oCell);
    }
    
  
//--- menuitem click ---//
    
SolpartMenu.prototype.onMBIC = function (e, evt)
    {
        var oRow = spm_getSourceTR(e, 
this._m_sNSpace);  //event.srcElement
        
var sID = oRow.id.substr(2);
        
if (spm_itemHasChildren(sID, this._m_sNSpace) == false)
            
this.hideAllMenus();

        
this.fireEvent('onMenuItemClick', oRow);

    
if (spm_getAttr(oRow, "menuclick", '').length)
    {
      eval(spm_getAttr(oRow, "menuclick", 
''));
      
this.hideAllMenus();
        }
        
//window.event.cancelBubble = true;
        
spm_stopEventBubbling(evt);
        
        
this.handlembi_mo(oRow, true);
    }

  
//--- menuitem mouseover event ---//
    
SolpartMenu.prototype.onMBIMO = function (e)
    {        
        
this.handlembi_mo(spm_getSourceTR(e, this._m_sNSpace)); //event.srcElement

        
this._m_dHideTimer = null;
    }
  
//--- menuitem mouseout event ---//
    
SolpartMenu.prototype.onMBIMOUT = function (e)
    {    
        
this.handlembi_mout(spm_getSourceTR(e, this._m_sNSpace));  //event.srcElement
        
this._m_dHideTimer = new Date;
        
//setTimeout(this.hideMenuTime, this.moutDelay);
        
if (this.moutDelay != 0)
          setTimeout(
'm_oSolpartMenu["' this._m_sNSpace + '"].hideMenuTime()'this.moutDelay);
         
        
this.minDelayType = null;
    }
    
/*
    function menuhook_KeyPress()
    {
    //not yet
    }
    function menuhook_KeyDown()
    {
    //not yet
    }
    
    function menuhook_MenuFocus()
    {
        var tbl = event.srcElement;
        mb_c(tbl.rows[0].cells[0]);
    }
*/
/*    
    function __menuhook_MouseMove(e) 
    {
        var iNewLeft=0, iNewTop = 0

if (this._m_bMoving)
{
            if (spm_browserType() == 'ie')
            {
//        if ((event.button==1)) 
//        {
              this.hideAllMenus();
              if (this._m_oTblMenuBar.startLeft == null)
                  this._m_oTblMenuBar.startLeft = this._m_oTblMenuBar.offsetLeft;
              iNewLeft=event.clientX - this._m_oTblMenuBar.startLeft - 3;
              this._m_oTblMenuBar.style.pixelLeft= iNewLeft;
              if (this._m_oTblMenuBar.startTop == null)
                  this._m_oTblMenuBar.startTop = this._m_oTblMenuBar.offsetTop;
              iNewTop=event.clientY - this._m_oTblMenuBar.startTop;
              this._m_oTblMenuBar.style.pixelTop = iNewTop - 10;
              event.returnValue = false
              event.cancelBubble = true
//      }
        }
    else
    {
            this.hideAllMenus();
          
            if (this._m_oTblMenuBar.startLeft == null)
                this._m_oTblMenuBar.startLeft = this._m_oTblMenuBar.offsetLeft;

            iNewLeft=e.clientX - this._m_oTblMenuBar.startLeft - 3;
              
            //if (iNewLeft&lt;0) 
            //    iNewLeft=0;
          
            this._m_oTblMenuBar.style.left = iNewLeft;
                          
            if (this._m_oTblMenuBar.startTop == null)
                this._m_oTblMenuBar.startTop = this._m_oTblMenuBar.offsetTop;

            iNewTop=e.clientY - this._m_oTblMenuBar.startTop;
            //if (iNewTop&lt;0) 
            //    iNewTop=0;
              
            this._m_oTblMenuBar.style.top = iNewTop - 10;    
    }
}

    }
    function __menuhook_MouseDown()
    {
        this._m_bMoving = true;
    }
    function __menuhook_MouseUp()
    {
      this._m_bMoving = false;
    }
    function __document_MouseMove(e)
    {
        if (this._m_bMoving)
        {
            this.menuhook_MouseMove(e);
      }
    }
    function __document_MouseDown()
    {
        //this._m_bMoving = null;
    }
    function __document_MouseUp()
    {
        this._m_bMoving=false;
    }
*/

    
SolpartMenu.prototype.bodyclick = function()
    {
        
this.hideAllMenus();
    }

  
//--- handles display of newly opened menu ---//
    
SolpartMenu.prototype.handleNewItemSelect = function (sID)
    {
        var i;
        var iNewLength=-1;
        var bDeleteRest=
false
        
for (i=0; i<this._m_aOpenMenuID.length; i++)
        {        
            
if (bDeleteRest)
            {
                spm_getById("tbl" + 
this._m_aOpenMenuID[i]).style.display = "none";
                
if (this.useIFrames)
                    spm_iFrameIndex(spm_getById("tbl" + 
this._m_aOpenMenuID[i]), falsethis.systemImagesPath);
            }
            
if (this._m_aOpenMenuID[i] == this._m_sNSpace + sID)
            {
                bDeleteRest=
true;
                iNewLength = i;
            }                
        }
        
if (iNewLength != -1)
            
this._m_aOpenMenuID.length = iNewLength+1;
    }
    
  
//--- hides all menus that are currently displayed ---//
    
SolpartMenu.prototype.hideAllMenus = function ()
    {
        var i;
        var oMenu;
        
for (i=0; i<this._m_aOpenMenuID.length; i++)
        {        
            oMenu = spm_getById("tbl" + 
this._m_aOpenMenuID[i]);
            oMenu.style.display = "none";

            
if (this.useIFrames)
                spm_iFrameIndex(oMenu, 
falsethis.systemImagesPath);
        }
        
if (this.useIFrames != true)
            spm_showElement("SELECT|OBJECT");

        
this._m_aOpenMenuID.length = 0;
    }        
  
  
  function SolpartMenuTransitionObject()
  {
    
this.id=null;
    
this.stop = false;
  } 

  
//--- stops menu transition effect ---//
  
SolpartMenu.prototype.stopTransition = function ()
  {
    
this.SolpartMenuTransitionObject.stop = true;
    
this.doFilter();
    
this.SolpartMenuTransitionObject = new SolpartMenuTransitionObject();
  }
  
  
//--- starts menu transition effect ---//
  
SolpartMenu.prototype.doTransition = function (oMenu)
  {
    
if (this.menuTransition == 'None' || this.supportsTransitions == '0')
      
return;

    var sID = 
this.SolpartMenuTransitionObject.id;
    
    
switch (this.menuTransition)
    {
      
case 'AlphaFade':
      {
        
if (this.SolpartMenuTransitionObject.id != oMenu.id) 
        {
          
this.SolpartMenuTransitionObject.id = oMenu.id;
          
this.SolpartMenuTransitionObject.opacity = 0;
          
this.doFilter();
        }
        
break;
      }
      
case 'Wave':
      {
        
if (this.SolpartMenuTransitionObject.id != oMenu.id) 
        {        
          
this.SolpartMenuTransitionObject.id = oMenu.id;
          
this.SolpartMenuTransitionObject.phase = 0;
          
this.doFilter();
        }
        
break;
      }
      
case 'ConstantWave':
      {
        
if (sID != oMenu.id) 
        {        
          
this.SolpartMenuTransitionObject.id = oMenu.id;
          
this.SolpartMenuTransitionObject.phase = 0;
          
this.SolpartMenuTransitionObject.constant=true;
          
this.doFilter();
        }
        
break;
      }
      
case 'Inset'case 'RadialWipe'case 'Slide'case 'Spiral'case 'Stretch'case 'Strips'case 'Wheel'case 'GradientWipe'case 'Zigzag'case 'Barn'case 'Blinds'case 'Checkerboard'case 'Fade'case 'Iris'case 'RandomBars':
      {
        oMenu.filters(
'DXImageTransform.Microsoft.' this.menuTransition).apply();
        oMenu.filters(
'DXImageTransform.Microsoft.' this.menuTransition).duration = this.menuTransitionLength;
        oMenu.filters(
'DXImageTransform.Microsoft.' this.menuTransition).play();
        
break;
      }
    }
  }

  
//--- applys transition filter ---//
  
SolpartMenu.prototype.doFilter = function (bStop) 
  {      
    
if (this.SolpartMenuTransitionObject.id == null)
      
return;
      
    var o = spm_getById(
this.SolpartMenuTransitionObject.id);
    window.status = 
new Date();
    
switch (this.menuTransition)
    {
      
case 'AlphaFade':
      {
        
if (this.SolpartMenuTransitionObject.stop)
        {
          o.filters(
'DXImageTransform.Microsoft.Alpha').opacity = 100;
        }
        
else
        
{
          o.filters(
'DXImageTransform.Microsoft.Alpha').opacity = this.SolpartMenuTransitionObject.opacity;
          
if (this.SolpartMenuTransitionObject.opacity < 100)
          {
            setTimeout(
'm_oSolpartMenu["' this._m_sNSpace + '"].doFilter()', 50);
            
this.SolpartMenuTransitionObject.opacity += (100/20* this.menuTransitionLength);
          }
        }
        
break;
      }
      
case 'Wave'case 'ConstantWave':
      {
        
if (this.SolpartMenuTransitionObject.stop)
        {
            o.filters("DXImageTransform.Microsoft.Wave").freq = 0;
            o.filters("DXImageTransform.Microsoft.Wave").lightstrength = 0;
            o.filters("DXImageTransform.Microsoft.Wave").strength = 0;
            o.filters("DXImageTransform.Microsoft.Wave").phase = 0;
        }
        
else
        
{
          o.filters("DXImageTransform.Microsoft.Wave").freq = 1;
          o.filters("DXImageTransform.Microsoft.Wave").lightstrength = 20;
          o.filters("DXImageTransform.Microsoft.Wave").strength = 5;
          o.filters("DXImageTransform.Microsoft.Wave").phase = 
this.SolpartMenuTransitionObject.phase;

          
if (this.SolpartMenuTransitionObject.phase < 100 * this.menuTransitionLength || this.SolpartMenuTransitionObject.constant == true)
          {
            setTimeout(
'm_oSolpartMenu["' this._m_sNSpace + '"].doFilter()', 50);
            
this.SolpartMenuTransitionObject.phase += 5;
          }
          
else
          
{
            o.filters("DXImageTransform.Microsoft.Wave").freq = 0;
            o.filters("DXImageTransform.Microsoft.Wave").lightstrength = 0;
            o.filters("DXImageTransform.Microsoft.Wave").strength = 0;
            o.filters("DXImageTransform.Microsoft.Wave").phase = 0;
          }
        }
        
break;
      }
    }
  }          
  



  
//--- handles mouseover for menu item ---//
    
SolpartMenu.prototype.handlembi_mo = function (oRow, bBypassDelay)
    {
        var sID = oRow.id.substr(2);

        spm_getById("icon" + sID).className = spm_fixCSSForMac(
this.getIntCSSName('spmitmsel spmicn') + this.cssMenuIcon + ' ' this.cssMenuItemSel + ' ' + spm_getAttr(oRow, 'saveselcss'''));
        spm_getById("td" + sID).className = spm_fixCSSForMac(
this.getIntCSSName('spmitmsel') + this.cssMenuItemSel + ' ' + spm_getAttr(oRow, 'saveselcss'''));
        spm_getById("arrow" + sID).className = spm_fixCSSForMac(
this.getIntCSSName('spmitmsel spmarw') + this.cssMenuItemSel + ' ' this.cssMenuArrow + ' ' + spm_getAttr(oRow, 'saveselcss'''));
        
        spm_applyRowBorder(oRow, 1, 
this.selBorderColor, true);


        
if (this.minDelay != 0 && bBypassDelay != true)
        {
            
if (this.minDelayTimer != null)
                window.clearTimeout(
this.minDelayTimer);
            
this.minDelayType = 'sub';
            
this.minDelayObj = oRow;
            
this.minDelayTimer = setTimeout('m_oSolpartMenu["' this._m_sNSpace + '"].mouseInDelayHandler()'this.minDelay);
            
return;
        }
    
        
if (this._m_aOpenMenuID[this._m_aOpenMenuID.length - 1] != oRow.id.replace('tr'''))
        {
            
this.handleNewItemSelect(spm_getAttr(oRow, "parentID", ""));
        
            
if (spm_getById("tbl" + sID) != null)
            {
                var iWidth;
                oMenu = spm_getById("tbl" + sID);

                var oPDims = 
new spm_elementDims(oRow);
                var oMDims = 
new spm_elementDims(oMenu);
                                    
                oMenu.style.top = oPDims.t + 
'px';
                
                spm_resetScroll(oMenu);

                
this.doTransition(oMenu);

                oMDims = 
new spm_elementDims(oMenu);    //now that we moved need to reget dims
                
oMenu.style.display = "";

              
if (oMDims.t - spm_getBodyScrollTop() + oMDims.h > spm_getViewPortHeight())
              {
                  
if (oMDims.h < spm_getViewPortHeight())
                        oMenu.style.top = (spm_getViewPortHeight() + spm_getBodyScrollTop() - oMDims.h) + 
'px';
                    
else
                    
{
                        spm_handleScrollMenu(
this, oMenu);
                        
                        oMDims = 
new spm_elementDims(oMenu);    //now that we moved need to reget dims
                    
}
              }

                
if (this.direction == 'rtl')
                    oMenu.style.left = (oPDims.l - oMDims.w - spm_getBodyScrollLeft()) + 
'px';
                
else
                    
oMenu.style.left = (oPDims.l + oPDims.w - spm_getBodyScrollLeft()) + 'px';

                
if (this.direction == 'rtl')
                {
                    
if (oMDims.l - spm_getBodyScrollLeft() < 0)
                        oMenu.style.left = (oPDims.l + oPDims.w - spm_getBodyScrollLeft()) + 
'px';
                }
                
else  
                
{
                    
if (oPDims.l - spm_getBodyScrollLeft() + oPDims.w + oMDims.w > spm_getViewPortWidth())
                        oMenu.style.left = (oPDims.l - oMDims.w - spm_getBodyScrollLeft()) + 
'px';
                }
                    
                
this._m_aOpenMenuID[this._m_aOpenMenuID.length] = sID;
                
if (this.useIFrames)
                    spm_iFrameIndex(oMenu, 
truethis.systemImagesPath);
                
else
                    
spm_hideElement("SELECT|OBJECT",oMenu);

            }
        }
        
this.fireEvent('onMenuItemMouseOver', oRow);
        
    }
    
  
//--- handles mouseout for menu item ---//
    
SolpartMenu.prototype.handlembi_mout = function (oRow)
    {
            var sID = oRow.id.substr(2);

            oRow.className = spm_fixCSSForMac(
this.getIntCSSName('spmitm') + ' ' this.cssMenuItem + ' ' + spm_getAttr(oRow, 'savecss'''));
          spm_getById("icon" + sID).className = spm_fixCSSForMac(
this.getIntCSSName('spmicn') + this.cssMenuIcon);
          spm_getById("td" + sID).className = spm_fixCSSForMac(
this.getIntCSSName('spmitm') + ' ' this.cssMenuItem + ' ' + spm_getAttr(oRow, 'savecss'''));
          spm_getById("arrow" + sID).className = spm_fixCSSForMac(
this.getIntCSSName('spmarw') + this.cssMenuArrow);
            
            spm_applyRowBorder(oRow, 1, "", 
false);

      
this.stopTransition();
    }

  
//used for raising events to client javascript
  
SolpartMenu.prototype.fireEvent = function (sEvent, src) 
  {
        
return//disabled for now
    
if (eval('this.' + sEvent + ' != null'))
        {
            var e = 
new Object();
            
if (src != null)
                e.srcElement = src;
            
else
                
e.srcElement = this._m_oMenu;
                
                eval(
'this.' + sEvent + '(e)');
        }
  }

    
//--- called by setTimeOut to check mouseout hide delay ---//
    
SolpartMenu.prototype.hideMenuTime = function ()
  {
    
if (this._m_dHideTimer != null && this.moutDelay > 0)
    {
      
if (new Date() - this._m_dHideTimer >= this.moutDelay)
      {
        
this.hideAllMenus();
        
this._m_dHideTimer = null;
      }
      
else
        
setTimeout(this.hideMenuTime, this.moutDelay);
    }
  }

    SolpartMenu.prototype.mouseInDelayHandler = function ()
    {
        
if (this.minDelayType == 'root')
            
this.onMBMO(this.minDelayObj, true);
        
else if (this.minDelayType == 'sub')
            
this.handlembi_mo(this.minDelayObj, true);
        
this.minDelayTimer = null;
        
this.minDelayObj = null;
    }

    
//--- called by setTimeOut to check mouseout hide delay ---//
    
SolpartMenu.prototype.scrollMenu = function ()
  {
        
if (this._m_oScrollingMenu != null)
        {
            
if (spm_ScrollMenuClick(this._m_oScrollingMenu) == false)
                setTimeout(
'm_oSolpartMenu["' this._m_sNSpace + '"].scrollMenu()', 500);
            
else
                this
._m_oScrollingMenu = null;
        }
  }

//global
    
function spm_iFrameIndex(eMenu, bShow, sysImgPath)
    {
        
if (spm_browserType() == 'op')
            
return;    //not needed
        
        
if (document.readyState != 'complete')
            
return;    //avoid operation aborted
        
        
if (bShow)
        {
            var oIFR=spm_getById(
'ifr' + eMenu.id);
            
if (oIFR == null)
            {
                var oIFR = document.createElement(
'iframe');
                oIFR.id = 
'ifr' + eMenu.id;
                
//oIFR.src = 'javascript: void(0);';
                
oIFR.src = sysImgPath + 'spacer.gif';
                oIFR.style.top = 0;
                oIFR.style.left = 0;
                oIFR.style.filter = "progid:DXImageTransform.Microsoft.Alpha(opacity=0)";
                oIFR.scrolling = 
'no';
                oIFR.frameBorder = 
'no';
                oIFR.style.display = 
'none';
                oIFR.style.position = 
'absolute';
                document.body.appendChild(oIFR);
            }
            var oMDims = 
new spm_elementDims(eMenu);
            
            oIFR.style.width=oMDims.w;
            oIFR.style.height=oMDims.h;
            oIFR.style.top=oMDims.t;
            oIFR.style.left=oMDims.l;
            
            var iIndex = spm_getCurrentStyle(eMenu, 
'zIndex');    //eMenu.style.zIndex;
            
if (iIndex == null || iIndex == 0)
                eMenu.style.zIndex = 1;
            oIFR.style.zIndex=iIndex-1;
            oIFR.style.display="block";
        }
        
else if (spm_getById('ifr' + eMenu.id) != null)
        {
            spm_getById(
'ifr' + eMenu.id).style.display='none';
        }
    }

    function spm_showElement(elmID)
    {
        
if (spm_browserType() == 'op')
            
return;    //not needed

        // Display any element that was hidden
        
var sTags = elmID.split('|');
        
for (var x=0; x<sTags.length; x++)
        {
            elmID = sTags[x];
            
for (var i = 0; i < spm_getTags(elmID).length; i++)
            {
                obj = spm_getTags(elmID)[i];
                
if (! obj || ! obj.offsetParent)
                    
continue;
                obj.style.visibility = "";
            }
        }
    }

    function spm_hideElement(elmID, eMenu)
    {
        
if (spm_browserType() == 'op')
            
return;    //not needed

        
var obj;
        
// Hide any element that overlaps with the dropdown menu
        
var sTags = elmID.split('|');
        
        var oMDims = 
new spm_elementDims(eMenu);
        
        
for (var x=0; x<sTags.length; x++)
        {
            elmID = sTags[x];
            
for (var i = 0; i < spm_getTags(elmID).length; i++)
            {
                obj = spm_getTags(elmID)[i];
                var oODims = 
new spm_elementDims(obj);
                
                
if (oODims.t > oMDims.t + oMDims.h)
                {
                    
//if element is below bottom of menu then do nothing
                
}
                
else if (oODims.l > oMDims.l + oMDims.w)
                {
                    
//if element is to the right of menu then do nothing
                
}
                
else if (oODims.l + oODims.w < oMDims.l)
                {
                    
//if element is to the left of menu then do nothing
                
}
                
else if (oODims.t + oODims.h < oMDims.t)
                {
                    
//if element is to the top of menu then do nothing
                
}
                
else
                
{
                    obj.style.visibility = "hidden";
                }
            }
        }
    }

    function spm_positionMenu(me, oMenu, oCell)
    {

        spm_resetScroll(oMenu);

        var oPDims = 
new spm_elementDims(oCell, false, me);

        
if (me.display == 'vertical')
        {
            oMenu.style.top = oPDims.t + 
'px';
            var oMDims = 
new spm_elementDims(oMenu);

            
if (oMDims.t - spm_getBodyScrollTop() + oMDims.h >= spm_getViewPortHeight())
            {
                
if (oMDims.h < spm_getViewPortHeight())
                    oMenu.style.top = (spm_getViewPortHeight() - oMDims.h + spm_getBodyScrollTop())  + 
'px';    
                    
                
else
                    
spm_handleScrollMenu(me, oMenu);
            }
            
            var oOrigMDims;
            
            
if (spm_browserType() != 'ie'//since mozilla doesn't set width greater than window size we need to store it here
                 
oOrigMDims = new spm_elementDims(oMenu);
            
            oMenu.style.left = (oPDims.l + oPDims.w - spm_getBodyScrollLeft()) + 
'px';
            oMDims = 
new spm_elementDims(oMenu);
            
if (oOrigMDims == null)
                oOrigMDims = oMDims;
            
            
if (oMDims.l - spm_getBodyScrollLeft(true) + oOrigMDims.w > spm_getViewPortWidth())
            {
              
if (spm_getViewPortWidth() - oOrigMDims.w > 0)  //only do this if it fits
                  
oMenu.style.left = (oPDims.l - oOrigMDims.w - spm_getBodyScrollLeft(true)) + 'px';
            }

            
//oMenu.style.display = "";
        
}
        
else
        
{
            
if (me.direction == 'rtl')            
            {
                var oMDims2 = 
new spm_elementDims(oMenu);
                oMenu.style.left = ((oPDims.l + oPDims.w) - oMDims2.w - spm_getBodyScrollLeft()) + 
'px';
            }
            
else            
                
oMenu.style.left = (oPDims.l - spm_getBodyScrollLeft()) + 'px';

            
//oMenu.style.top = oPDims.t + oPDims.h;
            
oMenu.style.top = (oPDims.t + oPDims.h) + 'px';
                
            var oMDims = 
new spm_elementDims(oMenu);
            
            
if (oMDims.l - spm_getBodyScrollLeft(true) + oMDims.w > spm_getViewPortWidth())
            {
              
if (spm_getViewPortWidth() - oMDims.w > 0)  //only do this if it fits
                  
oMenu.style.left = spm_getViewPortWidth() - oMDims.w + spm_getBodyScrollLeft(true);
            }
            
            
if (oMDims.t - spm_getBodyScrollTop() + oMDims.h > spm_getViewPortHeight())
            {
              
if (oPDims.t - oMDims.h - spm_getBodyScrollTop() > 0) //only do this if it fits
                  
oMenu.style.top = (oPDims.t - oMDims.h) + 'px';    //place above menu bar
                
else
                    
spm_handleScrollMenu(me, oMenu);
            }
            
//oMenu.style.display = "none";
        
}
    }

    
//--------- Internal (private) Functions --------//
    //--- Applies border to cell ---//
    
SolpartMenu.prototype.applyBorder = function (oCell, iSize, sTopLeftColor, sBottomRightColor, sStyle)
    {
        
if (this.moDisplay == 'Outset')
        {
            
if (sStyle == null)
                sStyle = "solid";

            
if (sTopLeftColor.length > 0 && sBottomRightColor.length > 0)
            {
                
if (oCell.tagName == 'TR')
                    oCell = oCell.childNodes(0);
                
                oCell.style.borderTop = sStyle + " " + iSize + "px " + sTopLeftColor;
                oCell.style.borderLeft = sStyle + " " + iSize + "px " + sTopLeftColor;
                oCell.style.borderRight = sStyle + " " + iSize + "px " + sBottomRightColor;
                oCell.style.borderBottom = sStyle + " " + iSize + "px " + sBottomRightColor;    
                
            }
        }
        
if (this.moDisplay == 'HighLight')
        {
            
if (sTopLeftColor == this.backColor)
            {
                
//oCell.style.backgroundColor = '';
        //setClassColor(oCell, 'spmitm', '');
        
oCell.className = spm_fixCSSForMac(this.getIntCSSName('spmbar spmitm') + ' ' this.cssMenuItem + ' ' + spm_getAttr(oCell, 'savecss'''));
            }
            
else
            
{
                
//oCell.style.backgroundColor = this.selColor;
        //setClassColor(oCell, 'spmitm', this.selForeColor);
        
oCell.className = spm_fixCSSForMac(this.getIntCSSName('spmbar spmitmsel') + ' ' this.cssMenuItemSel + ' ' + spm_getAttr(oCell, 'saveselcss'''));
            }
        }        
    }

    function spm_applyRowBorder(oRow, iSize, sColor, bSelected, sStyle)
    {
        
if (oRow.cells.length == 0) //(spm_browserType() == 'safari')
            
return;    //safari has issues with accessing cell
        
        
var sColor2=sColor;
        
if (sStyle == null)
            sStyle = "solid";

        
if (sColor == "")
        {
            
//if (bSelected)
            //    sColor2 = this.selColor;
            //else
                
sColor2 = spm_getCurrentStyle(oRow.cells[0], 'background-Color');
                
if ((sColor2 == null || sColor2 == '') && spm_browserType() != 'ie')
                    sColor2 = 
'transparent';
        }

        
//if (sColor2 != 'transparent')
            
spm_applyBorders(oRow.cells[0], sStyle, iSize, sColor2, truetruefalsetrue);

        
if (sColor == "" && bSelected == false)
    {
      sColor2 = spm_getCellBackColor(oRow.cells[1]);
      
if (sColor2 == null || sColor2 == '')
                sColor2 = 
'transparent';
    }
   
    
//if (sColor2 != 'transparent')
    //{
            
spm_applyBorders(oRow.cells[1], sStyle, iSize, sColor2, truefalsefalsetrue);
            spm_applyBorders(oRow.cells[2], sStyle, iSize, sColor2, 
truefalsetruetrue);
        
//}
    
}
    
    function spm_getCellBackColor(o)
    {
        var sColor = spm_getCurrentStyle(o, 
'background-Color');  
    
if (spm_browserType() == 'ie')
    {
      
//--- fix IE transparent border issue ---//
      
while (sColor == 'transparent')
      {
        sColor = spm_getCurrentStyle(o, 
'background-Color');  
        o = o.parentElement;
        
if (o.id.indexOf('divOuterTables') != -1)    //if we are outside the realm of the menu then use transparency
                    
break;
      }
    }
    
return sColor;
    }
    
    function spm_applyBorders(o, sStyle, iSize, sColor, t, l, r, b)
    {

/*
        if (t && sColor=='') o.style.paddingTop = iSize + "px ";
        if (b && sColor=='') o.style.paddingBottom = iSize + "px ";
        if (r && sColor=='') o.style.paddingRight = iSize + "px ";
        if (l && sColor=='') o.style.paddingLeft = iSize + "px ";
    if (sColor=='')
      iSize = 0;
 */     
        
if (t) o.style.borderTop = sStyle + " " + iSize + "px " + sColor;
        
if (b) o.style.borderBottom = sStyle + " " + iSize + "px " + sColor;
        
if (r) o.style.borderRight = sStyle + " " + iSize + "px " + sColor;
        
if (l) o.style.borderLeft = sStyle + " " + iSize + "px " + sColor;

    }

    function spm_resetScroll(oMenu)
    {
    
        
if (oMenu.scrollItems != null)
        {
            oMenu.scrollPos = 1;
            oMenu.scrollItems = 9999;
            spm_showScrolledItems(oMenu);
        }    
    }
    
    
    function spm_handleScrollMenu(me, oMenu)
    {
        var oTbl = spm_getTags(
'table', oMenu)[0]; //oMenu.childNodes[1];    
        
oMenu.style.display = '';
        
if (oMenu.scrollPos == null)
        {
            oMenu.scrollPos = 1;            
                        
            var oRow = spm_insertTableRow(oTbl);
            var oCell = document.createElement(
'TD');        
            oCell.id = 
'dn' + oMenu.id.substring(3);
            oCell.colSpan = 3;
            oCell.align = 
'center';
            oCell.style.backgroundColor = 
'gray';    //can be overridden by MenuScroll style
            
oCell.innerHTML='<div id="dn' + oMenu.id.substr(3) + '" onclick="return spm_ScrollMenuClick(this, event);" onmouseover="spm_ScrollMenuMO(this, m_oSolpartMenu[\'' + me._m_sNSpace + '\']);" onmouseout="spm_ScrollMenuMOUT(m_oSolpartMenu[\'' + me._m_sNSpace + '\']);" class="' + spm_fixCSSForMac(me.getIntCSSName('spmitmscr')) + ' ' + me.cssMenuScrollItem + '" style="width: 100%; font-size: 6pt;">...</div>';
            oRow.appendChild(oCell);

            oRow = spm_insertTableRow(oTbl, 0);
            oCell = document.createElement(
'TD');        
            oCell.id = 
'up' + oMenu.id.substring(3);
            oCell.colSpan = 3;
            oCell.align = 
'center';
            oCell.style.backgroundColor = 
'gray';    //can be overridden by MenuScroll style
            
oCell.innerHTML='<div id="up' + oMenu.id.substr(3) + '" onclick="return spm_ScrollMenuClick(this, event);" onmouseover="spm_ScrollMenuMO(this, m_oSolpartMenu[\'' + me._m_sNSpace + '\']);" onmouseout="spm_ScrollMenuMOUT(m_oSolpartMenu[\'' + me._m_sNSpace + '\']);" class="' + spm_fixCSSForMac(me.getIntCSSName('spmitmscr')) + ' ' + me.cssMenuScrollItem + '" style="width: 100%; font-size: 6pt;">...</div>';
            oRow.style.display = 
'none';
            oRow.appendChild(oCell);
        }    

        
if (oMenu.ScrollRowHeight == null)
        {
            spm_getTags(
'tr', oTbl)[0].style.display = '';
            oMenu.ScrollItemHeight = (spm_getElementHeight(spm_getTags(
'tr', oTbl)[0]) * 2);
            spm_getTags(
'tr', oTbl)[0].style.display = 'none';

            oMenu.ScrollRowHeight = spm_getElementHeight(spm_getTags(
'tr', oTbl)[1]);
        }

        oMenu.scrollItems = parseInt((spm_getViewPortHeight() - spm_elementTop(oMenu) + spm_getBodyScrollTop() - oMenu.ScrollItemHeight) / (oMenu.ScrollRowHeight + 1));
        
//alert(oMenu.ScrollRowHeight);
        //alert(oMenu.ScrollItemHeight);
        
spm_showScrolledItems(oMenu);

    }
        
    function spm_ScrollMenuMO(e, me)
    {
        me._m_dHideTimer = 
null;
        me._m_oScrollingMenu = e;
        
if (Number(me.moScroll))
            setTimeout(
'm_oSolpartMenu["' + me._m_sNSpace + '"].scrollMenu()', 500);

    }
    
    function spm_ScrollMenuMOUT(me)
    {
        me._m_oScrollingMenu = 
null;

        me._m_dHideTimer = 
new Date();
        
if (me.moutDelay != 0)
          setTimeout(
'm_oSolpartMenu["' + me._m_sNSpace + '"].hideMenuTime()', me.moutDelay);
        

    }
    
    function spm_ScrollMenuClick(e, evt)
    {        
        
if (e != null)
        {    
            var oCell = e.parentNode;
            var oTbl = oCell.parentNode.parentNode.parentNode;
            var oMenu = oTbl.parentNode;

            
if (oCell.id == 'up' + oMenu.id.substring(3))
            {
                
if (oMenu.scrollPos > 1)
                    oMenu.scrollPos--;                    
                
else
                    return true
;
            }
            
else 
            
{
                
if (oMenu.scrollPos + oMenu.scrollItems < oTbl.rows.length - 1)
                    oMenu.scrollPos++;
                
else
                    return true
;
            }
                
            spm_showScrolledItems(oMenu);
            
if (evt != null)
                spm_stopEventBubbling(evt);
        }
        
return false;
    }

    function spm_showScrolledItems(oMenu)
    {
        var oTbl = spm_getTags(
'table', oMenu)[0];
        var oRows = spm_getTags(
'tr', oTbl);    //oTbl.rows.length
        
        
for (var i=1; i < oRows.length; i++)    
        {
            
//if row is not within display "window" then don't display it
            
if (i < oMenu.scrollPos || i >= oMenu.scrollPos + oMenu.scrollItems)
                oRows[i].style.display = 
'none';
            
else
                
oRows[i].style.display = '';            
        }
        
        
// if we are scrolled down at least one then display up scroll item
        
if (oMenu.scrollPos > 1)
            oRows[0].style.display = 
'';
        
else
            
oRows[0].style.display = 'none';
        
        
        
// if there is at least one item not displayed then show down item
        
if (oMenu.scrollPos + oMenu.scrollItems < oTbl.rows.length - 1)
            oRows[oRows.length-1].style.display = 
'';
        
else
            
oRows[oRows.length-1].style.display = 'none';
            
    }

    function spm_insertTableRow(tbl, iPos)
    {
        var oRow;
        var oTB;
        oRow = document.createElement(
'TR');
        
if (tbl.getElementsByTagName('TBODY').length == 0)
        {
            oTB = document.createElement(
'TBODY');
            tbl.appendChild(oTB);
        }
        
else
            
oTB = tbl.getElementsByTagName('TBODY')[0];

        
if (iPos == null)
            oTB.appendChild(oRow);
        
else
            
oTB.insertBefore(oRow, tbl.rows[iPos]);
        
return oRow;
    
    }

    function spm_getElementHeight(o)
    {    
        
if (o.offsetHeight == null || o.offsetHeight == 0)
        {
            
if (o.offsetParent.offsetHeight == null || o.offsetParent.offsetHeight == 0)
            {
                
if (o.offsetParent.offsetParent != null)
                    
return o.offsetParent.offsetParent.offsetHeight; //needed for Konqueror
                
else
                    return 
0;
            }
            
else
                return 
o.offsetParent.offsetHeight;
        }
        
else
            return 
o.offsetHeight;
    }

    function spm_getElementWidth(o)
    {
        
if (o.offsetWidth == null || o.offsetWidth == 0)
        {
            
if (o.offsetParent.offsetWidth == null || o.offsetParent.offsetWidth == 0)
            {
                
if (o.offsetParent.offsetParent != null)
                    
return o.offsetParent.offsetParent.offsetWidth; //needed for Konqueror
                
else
                    return 
0;
            }
            
else
                return 
o.offsetParent.offsetWidth

        }
        
else
            return 
o.offsetWidth;
    }
    
    
//viewport logic taken from http://dhtmlkitchen.com/js/measurements/index.jsp
    
function spm_getViewPortWidth()
    {
        
// supported in Mozilla, Opera, and Safari
    
if(window.innerWidth)
            
return window.innerWidth;
    
// supported in standards mode of IE, but not in any other mode
    
if(window.document.documentElement.clientWidth)
            
return document.documentElement.clientWidth;
    
    
// supported in quirks mode, older versions of IE, and mac IE (anything else).
    
return window.document.body.clientWidth;
    }
    
    function spm_getBodyScrollTop()
    {
        
if ('|ie|op|mo|ns|'.indexOf('|' + spm_browserType() + '|') != -1)
        {
            
if (document.body.scrollTop != null)
                
return document.body.scrollTop;
        }
        
return 0;
    }

    function spm_getBodyScrollLeft(bOverride)
    {
        
if ('|op|'.indexOf('|' + spm_browserType() + '|') != -1 || bOverride == true)
        {
            
if (document.body.scrollLeft != null)
            {
                
return document.body.scrollLeft;
            }
        }
        
return 0;
    }
    
    function spm_getViewPortHeight()
    {
        
// supported in Mozilla, Opera, and Safari
    
if(window.innerHeight)
            
return window.innerHeight;
    
// supported in standards mode of IE, but not in any other mode
    
if(window.document.documentElement.clientHeight)
            
return document.documentElement.clientHeight;
    
    
// supported in quirks mode, older versions of IE, and mac IE (anything else).
    
return window.document.body.clientHeight;
    }
        
    function spm_elementTop(eSrc, includeBody)
    {
        
        var iTop = 0;
        var eParent;
        eParent = eSrc;

        
while (eParent.tagName.toUpperCase() != "BODY")
        {

            
//Safari incorrectly calculates the TR tag to be at the top of the table, so try and get child TD tag to use for measurement
            //if (spm_browserType() == 'safari' && eParent.tagName.toUpperCase() == 'TR' && spm_getTags('TD', eParent).length)
            //    eParent = spm_getTags('TD', eParent)[0];

            
iTop += eParent.offsetTop;
            
            eParent = eParent.offsetParent;
            
if (eParent == null)
                
break;
        }
        
if (includeBody != null && eParent != null && (spm_browserType() == 'safari' || spm_browserType() == 'kq')) 
            iTop += eParent.offsetTop;
        
        
return iTop;
    }


    function spm_elementLeft(eSrc, includeBody)
    {    
        var iLeft = 0;
        var eParent;
        eParent = eSrc;
        
while (eParent.tagName.toUpperCase() != "BODY")
        {

            iLeft += eParent.offsetLeft;
                
            eParent = eParent.offsetParent;
            
if (eParent == null)
                
break;
        }
        
if (includeBody != null && eParent != null && (spm_browserType() == 'safari' || spm_browserType() == 'kq'))
            iLeft += eParent.offsetLeft;

        
        
return iLeft;
    }
    
    function spm_getElement(e, sID) 
    {
        var o=e;
        var i=0;
        
while (o.id != sID)
        {
            o=o.parentNode;
            i++;
        }
        
return o;
    }

    function spm_getSourceTR(e, ns)
    {
        
while (e.id == "")
        {
            e= e.parentElement;
        }
        
if (e.id.indexOf("arrow") != -1)
        {
            var sID = e.id.substr(5);
            
return spm_getById("tr" + sID);
        }
        
else if (e.id.indexOf("td") != -1)
        {
            var sID = e.id.substr(2);
            
return spm_getById("tr" + sID);
        }    
        
else if (e.id.indexOf("icon") != -1)
        {
            var sID = e.id.substr(4);
            
return spm_getById("tr" + sID);
        }    
        
else if (e.id.indexOf("img") != -1)
        {
            var sID = e.id.substr(3);
            
return spm_getById("tr" + sID);
        }    
        
else
        
{
            
return e;
        }
    }

    function spm_itemHasChildren(sID, ns)
    {
        objTable = spm_getById(ns + "tbl" + sID);
        
if (objTable != null)
        {
            
if (objTable.rows != null)
            {
                
if (objTable.rows.length > 0)
                    
return true;
                
else
                    return false
;
            }        
        }
    }

function spm_getMenuItemStyle(sType, oNode)
{
  
return spm_getAttr(oNode, sType + "style", '');
}

function spm_getMenuItemCSS(oNode)
{
  
return spm_getAttr(oNode, "css", '');
}

function spm_getMenuItemSelCSS(oNode)
{
  
return spm_getAttr(oNode, "selcss", '');
}

SolpartMenu.prototype.getIntCSSName =  function(sClass)
{
  var ary = sClass.split(
' ');
  var s=
'';
  
for (var i=0; i<ary.length; i++)
    s += 
this._m_sNSpace.toLowerCase() + '_' + ary[i] + ' ';
  
  
return s;
}

function spm_fixCSSForMac(s)
{
    var ary = s.split(
' ');
    var sRet=
'';
    
for (var i=0; i<ary.length; i++)
    {
        
if (ary[i].rtrim().length > 0)
        {
            
if (sRet.length)
                sRet += 
' ' + ary[i];
            
else
                
sRet = ary[i];
        }
    }
    
return sRet;
}

function spm_getMenuClickAction(oNode, me)
{
  
//'function to determine if menu item has action associated (URL)
  
var sName = spm_getAttr(me._m_oMenu, 'name', me._m_oMenu.name);

  
if (sName == null || sName.length == 0)    //opera fix for getting name
        
sName = spm_getAttr(me._m_oMenu, 'pbname', me._m_oMenu.pbname);
    
  
if (spm_getAttr(oNode, "runat", '').length)
    
return "__doPostBack('" + sName + "', '" + spm_getAttr(oNode, "id", "") + "');";
  
if (spm_getAttr(oNode, "server", '').length)
    
return "__doPostBack('" + sName + "', '" + spm_getAttr(oNode, "id", "") + "');";
  var sURL = spm_getAttr(oNode, "url", "");
  
if (sURL.length)
    {
        
if (sURL.toLowerCase().substr(0, "javascript:".length) == "javascript:")
            
return sURL.substr("javascript:".length) + ";";
        
else
        
{
            
if (me.target.length > 0 && document.frames[me.target] != null)
                
return "document.frames['" + me.target + "'].location.href='" + sURL + "';";
            
else
                return 
"document.location.href='" + sURL + "';";
        }
    }
    
return '';
    
}

function spm_getMenuSpacingImage(sPos, me)
{
  var sAlign = me.menuAlignment.toLowerCase();

  
if ((sPos == 'left' && sAlign == 'right') || (sPos == 'right' && sAlign == 'left'))
        
return "       <td width=\"100%\">" + spm_getSpacer(me) + "</td>";

  
if ((sPos == 'right' && sAlign == 'left') || (sPos == 'left' && sAlign == 'right'))
        
return "       <td width=\"3px\">" + spm_getSpacer(me) + "</td>";

    
if (sAlign == 'Center')
        
return "       <td width=\"33%\">" + spm_getSpacer(me) + "</td>";
    
    
return '';   
}

function spm_getSpacer(me) 
{
  
return spm_getMenuImage('spacer.gif', me, false' ');
    
//return '&nbsp;'; //"<IMG SRC=\"" + me.systemImagesPath + "spacer.gif\">";
}

function spm_getImage(oAttr, me)
{
  
//'retrieves an image for a passed in XMLAttribute
  
var sImage = spm_getAttr(oAttr, 'image''');

  
if (sImage.length)
  {
    
return spm_getHTMLImage(sImage, spm_getAttr(oAttr, 'imagepath', me.iconImagesPath), null, spm_getAttr(oAttr, 'title'''));
  }
  
else
    return 
spm_getMenuImage('spacer.gif', me, null' ');
}

function spm_getItemHTML(oNode, sSide, sDef)
{
  
if (sDef == null) sDef = '';
  
return spm_getAttr(oNode, sSide + "html", sDef);
}

function spm_getMenuImage(sImage, me, bForce, sAlt)
{
    
//'generates html for image using the SystemImagesPath property
    
return spm_getHTMLImage(sImage, me.systemImagesPath, bForce, sAlt);
}

function spm_getHTMLImage(sImage, sPath, bForce, sAlt)
{
    
//'generates html for image using the SystemImagesPath property
    
if (spm_browserNeedsSpacer() == false && sImage == 'spacer.gif' && bForce != true)
        
return '&nbsp;'
    
else
        return 
"<IMG SRC=\"" + sPath + sImage + "\" " + spm_getAlt(sAlt) + ">";
}

function spm_getAlt(sAlt)
{
    
if (sAlt != null && sAlt.rtrim().length > 0)
        
return ' ALT="' + sAlt + '" ';
    
else
        return 
'';
}

function spm_browserNeedsSpacer()
{
    
if (spm_browserType() == 'ie')
        
return false;
    
else
        return true
;
}

function MyIIf(bFlag, sTrue, sFalse) 
{
    
if (bFlag)
        
return sTrue;
    
else
        return 
sFalse;
}

function spm_getArrow(sImg, me) 
{
  
//FIX
    
if (sImg.length)
        
return spm_getMenuImage(sImg, me, null'>');
    
else
    
{
      
if (me.direction == 'rtl')
                
return "3"; 
      
else
                return 
"4"; //'defaults to using wingdings font (4 = arrow)
    
}
}

function spm_getMenuBorderStyle(me, shColor, hlColor, width)
{
  
if (shColor == null) shColor = me.shColor;
  
if (hlColor == null) hlColor = me.hlColor;
  
if (width == null) width = me.borderWidth;
  
  
//border-bottom: Gray 1px solid; border-left: White 1px solid; border-top: White 1px solid; border-right: Gray 1px solid;
  //return 'border-bottom: ' + shColor + ' ' + width + 'px solid; border-left: ' + hlColor + ' ' + width + 'px solid;  border-top: ' + hlColor + ' ' + width + 'px solid; border-right: ' + shColor + ' ' + width + 'px solid;';
  
return getBorderStyle('border-bottom', shColor, width) + getBorderStyle('border-left', hlColor, width) + getBorderStyle('border-top', hlColor, width) + getBorderStyle('border-right', shColor, width);
}

function getBorderStyle(type, color, width)
{  
  
return type + ': ' + color + ' ' + width + 'px solid; ';
}



//------------------------//
String.prototype.ltrim = function () { return this.replace(/^\s*/, "");}
String.prototype.rtrim = function () { 
return this.replace(/\s*$/, "");}
String.prototype.trim  = function () { 
return this.ltrim().rtrim(); }

if (spm_browserType() == 'safari')    //Safari Hack
    
var Document = null;
    
if (spm_browserType() != 'ie' && spm_browserType() != 'op' && Document != null)
{
  Document.prototype.loadXML = function (s) 
    {
    
      
// parse the string to a new doc
      
var doc2 = (new DOMParser()).parseFromString(s, "text/xml");

      
// remove all initial children
      
while (this.hasChildNodes())
      
this.removeChild(this.lastChild);

      
// insert and import nodes
      
for (var i = 0; i < doc2.childNodes.length; i++) 
      {
      
this.appendChild(this.importNode(doc2.childNodes[i], true));
      }
    }

    function _Node_getXML() 
    {
      
//create a new XMLSerializer
      
var objXMLSerializer = new XMLSerializer;
      
      
//get the XML string
      
var strXML = objXMLSerializer.serializeToString(this);
      
      
//return the XML string
      
return strXML;
    }
    Node.prototype.__defineGetter__("xml", _Node_getXML);
}

function spm_createDOMDoc()
{
    
if (spm_browserType() == 'ie')
    {
        var o = 
new ActiveXObject('MSXML.DOMDocument');
        o.async = 
false;
        
return o;
    }
    
else
        return 
document.implementation.createDocument("", "", null);
}

function spm_getById(sID)
{
  
if (document.all == null)
    
return document.getElementById(sID);
  
else
    return 
document.all(sID);
}

function spm_getTags(sTag, oCtl)
{
    
if (oCtl == null)
        oCtl = document;
    
    
if (spm_browserType() == 'ie')
    
return oCtl.all.tags(sTag);
  
else
    return 
oCtl.getElementsByTagName(sTag);
}

function spm_browserType()
{
    
if (m_spm_sBrowser == null)
    {
        var agt=navigator.userAgent.toLowerCase();

        
if (agt.toLowerCase().indexOf('konqueror') != -1) 
            m_spm_sBrowser = 
'kq';
        
else if (agt.toLowerCase().indexOf('opera') != -1) 
            m_spm_sBrowser = 
'op';
        
else if (agt.toLowerCase().indexOf('netscape') != -1) 
            m_spm_sBrowser = 
'ns';
        
else if (agt.toLowerCase().indexOf('msie') != -1)
            m_spm_sBrowser = 
'ie';
        
else if (agt.toLowerCase().indexOf('safari') != -1)
            m_spm_sBrowser = 
'safari';
      
        
if (m_spm_sBrowser == null)
            m_spm_sBrowser = 
'mo';  
    }
    
//window.status = m_spm_sBrowser;
    
return m_spm_sBrowser;
}

function spm_browserVersion()
{
    
//Please offer a better solution if you have one!
    
var sType = spm_browserType();
    var iVersion = parseFloat(navigator.appVersion);
    var sAgent = navigator.userAgent.toLowerCase();
    
if (sType == 'ie')
    {
        var temp=navigator.appVersion.split("MSIE");
        iVersion=parseFloat(temp[1]);
    }
    
if (sType == 'ns')
    {
        var temp=sAgent.split("netscape");
        iVersion=parseFloat(temp[1].split("/")[1]);    
    }
    
return iVersion;
}

function spm_needsSubMenuDelay()
{
    
if (spm_browserType() == 'ie')
        
return true;
    
else
        return false
;

}

function spm_supportsIFrameTrick()
{
    var sType = spm_browserType();
    var sVersion = spm_browserVersion();
    
    
if ((sType == 'ie' && sVersion < 5.5) || (sType == 'ns' && sVersion < 7) || (spm_browserType() == 'safari') || spm_isMac('ie'))
    {
        
return false;
    }
    
return true;
}

function spm_isMac(sType)
{
//return true;
  
var agt=navigator.userAgent.toLowerCase();
  
if (agt.indexOf('mac') != -1) 
  {
        
if (sType == null || spm_browserType() == sType)
            
return true;
  }
  
else
    return false
;
  
}


/*
function isOpera()
{
//return true;
  var agt=navigator.userAgent.toLowerCase();
  if (agt.indexOf('opera') != -1) 
    return true;
  else
    return false;
  
}
*/

//taken from http://groups.google.com/groups?hl=en&lr=&ie=UTF-8&oe=UTF-8&safe=off&threadm=b42qj3%24r8s1%40ripley.netscape.com&rnum=1&prev=/groups%3Fq%3Dmozilla%2B%2522currentstyle%2522%26hl%3Den%26lr%3D%26ie%3DUTF-8%26oe%3DUTF-8%26safe%3Doff%26scoring%3Dd 
function spm_getCurrentStyle(el, property) {
  
if (document.defaultView) 
  {
   
// Get computed style information:

    
if (el.nodeType != el.ELEMENT_NODE) return null;
    
return document.defaultView.getComputedStyle(el,'').getPropertyValue(property.split('-').join(''));
  }
  
if (el.currentStyle) 
  {
    
// Get el.currentStyle property value:
    
return el.currentStyle[property.split('-').join('')];
    
//return el.currentStyle.getAttribute(property.split('-').join(''));  //We need to get rid of slashes
  
}
  
if (el.style) 
  {
    
// Get el.style property value:
    
return el.style.getAttribute(property.split('-').join(''));  // We need to get rid of slashes
  
return  null;
}

function spm_getAttr(o, sAttr, sDef)
{
  
if (sDef == null)
    sDef = 
'';
  var s = o.getAttribute(sAttr);
  
if (s != null && s.length > 0)
    
return o.getAttribute(sAttr);
  
else
    return 
sDef;
}

function spm_setAttr(o, sAttr, sVal)
{
    
if (sVal.length > 0)
        o.setAttribute(sAttr, sVal);
    
else
        
o.removeAttribute(sAttr);
}


function spm_fixUnit(s)
{
  
if (s.length && isNaN(s) == false)
    
return s + 'px';

}

function spm_nodeHasChildren(node)
{
  
if (typeof(node.selectSingleNode) != 'undefined'//(node.selectSingleNode != null) //(spm_browserType() == 'ie')
    
return node.selectSingleNode('./menuitem') != null;
  
else
  
{
    
if (node.childNodes.length > 0)
    {
      
//Netscape/Mozilla counts an empty <menuitem id></menuitem> as having a child...
      
for (var i=0; i< node.childNodes.length; i++)
      {
        
if (node.childNodes[i].nodeName == 'menuitem')
            
return true;
      }
    }
  }
  
return false;  
}

function spm_findNode(oParent, sID)
{
    
for (var i = 0; i < oParent.childNodes.length; i++)
    {
        oNode = oParent.childNodes[i];

        
if (oNode.nodeType != 3)  //exclude nodeType of Text (Netscape/Mozilla) issue!
        
{

            
if ((oNode.nodeName == "menuitem" || oNode.nodeName == "menubreak") && oNode.getAttribute("id") == sID)
                
return oNode;

            
if (oNode.childNodes.length > 0)
            {
                var o = spm_findNode(oNode, sID);
                
if (o != null)
                    
return o;
            }
        }
    }
}

function spm_getSibling(oNode, iOffset)
{
    var sID = spm_getAttr(oNode, 
'id');
    var o;
    
for (var i=0; i<oNode.parentNode.childNodes.length; i++)
    {
        o = oNode.parentNode.childNodes[i];
        
if (o.nodeType != 3)
        {
            
if (spm_getAttr(o, 'id') == sID)
                
return getOffsetNode(o.parentNode, i, iOffset);
        }
    }
}

function spm_stopEventBubbling(e)
{
    
if (spm_browserType() == 'ie')
            window.
event.cancelBubble = true;
        
else
            
e.stopPropagation();
}

//--- if you have a better solution send me an email - jhenning@solpart.com ---//
function spm_appendFunction(from_func, to_func)
{
  
if (from_func == null)
    
return new Function ( to_func ); 
  
return new Function ( spm_parseFunctionContents(from_func) + '\n' + spm_parseFunctionContents(to_func) );
}
function spm_parseFunctionContents(fnc)
{
  var s =String(fnc).trim();
  
if (s.indexOf('{') > -1)
        s = s.substring(s.indexOf(
'{') + 1, s.length - 1);
  
return s;
}




//--- For JS DOM ---//
function SPJSXMLNode(sNodeName, sID, oParent, sTitle, sURL, sImage, sImagePath, sRightHTML, sLeftHTML, sRunAtServer, sItemStyle, sImageStyle, sToolTip, sItemCSS, sItemSelCSS) 

  
this.nodeName = sNodeName;
  
this.id=sID;
  
this.childNodes = new Array();
  
//this.nodeType = 3;
  
  
  
this.parentNode = oParent;            
  
if (oParent != null)
  {
    oParent.childNodes[oParent.childNodes.length] = 
this;
    
    
if (oParent.documentElement == null)
      
this.documentElement = oParent;
    
else
      this
.documentElement = oParent.documentElement;
  }
  
else
    this
.documentElement = this;
    
  
this.title = sTitle;
  
this.url = sURL;
  
this.image = sImage;
  
this.imagepath = sImagePath;
  
this.righthtml = sRightHTML;
  
this.lefthtml = sLeftHTML;
  
this.server = sRunAtServer;
  
this.itemstyle = sItemStyle;
  
this.imagestyle = sImageStyle;
  
this.tooltip = sToolTip;
  
this.css = sItemCSS;
  
this.selcss = sItemSelCSS;
}      

SPJSXMLNode.prototype.getAttribute = function(s)
{
  
return this[s];
}


  var m_iSPTimer;
  var m_iSPTotalTimer=0;
  var m_sSPDebugText;
  var m_oSPDebugCtl;
  var m_bSPDebug = 
false;
  
  function __db(s)
  {
    
if (spm_browserType() != 'ie' || m_bSPDebug == false)
      
return;
     
    var sT = 
new Date() - m_iSPTimer;
    
if (sT > 120000)
    {
      sT = 
'';
      m_oSPDebugCtl.
value '---reset---';
      m_iSPTotalTimer=0;
    }
    
else if (sT > 100)
    {
      m_iSPTotalTimer+= sT;
      sT = 
' *** [' + sT + '] *** ';
    }
    
else if (sT > 0)
    {
      m_iSPTotalTimer+= sT;
      sT = 
' [' + sT + ']';
    }
    
else
      
sT = '';
      
    
if (document.forms.length > 0 && m_oSPDebugCtl == null)
    {      
      document.forms(0).insertAdjacentHTML(
'afterEnd''<br><TEXTAREA ID="my__Debug" STYLE="WIDTH: 100%; HEIGHT: 100px"></TEXTAREA>');
      m_oSPDebugCtl = document.all(
'my__Debug');
    }

    
if (m_oSPDebugCtl != null)
      m_oSPDebugCtl.
value += '[' + m_iSPTotalTimer + '] ' + s + sT + '\n';
    
else
      
m_sSPDebugText += '[' + m_iSPTotalTimer + '] ' + s + sT + '\n'
      
    m_iSPTimer = 
new Date();
  }

    
if (window.__smartNav != null)
        window.setTimeout(spm_fixSmartNav, 1000);
    function spm_fixSmartNav()
    {
        
if (window.__smartNav != null)
        {
            
if (document.readyState == 'complete')
            {
                var o = spm_getById(
'SolpartMenuDI');
                
if (o != null)
                {
                    
if (o.length == null)
                    {
                            
if (o.xml != null)
                                spm_initMyMenu(o, o.parentElement);
                    }
                    
else
                    
{
                        
for (var i=0; i<o.length; i++)
                        {
                            
if (o[i].xml != null)
                                spm_initMyMenu(o[i], o.parentElement);
                        }
                    }
                }
            }
            
else
                
window.setTimeout(spm_fixSmartNav, 1000);
        }
    }

    function spm_elementDims(o, bIncludeBody, me)
    {
        var bHidden = (o.style.display == 
'none');
        
        
if (bHidden)
            o.style.display = "";
        
this.t = spm_elementTop(o, bIncludeBody);
        
this.l = spm_elementLeft(o, bIncludeBody);
        
if (!spm_isMac('ie'))
        {
            o.style.top = 0;
            o.style.left = 0;
        }
        
this.w = spm_getElementWidth(o);
        
this.h = spm_getElementHeight(o);
        
if (!spm_isMac('ie'))
        {
            
//fixed - added + 'px'; for firefox support
            
o.style.top = this.t + 'px';
            o.style.left = 
this.l + 'px';
        }
        
if (bHidden)
            o.style.display = "none";
    }

No Comments