// MODIFIED by jonathan.gerard@rgsinc.com to remove DLL alert after this patch was applied

//------------------------------------------------------//
// 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', this, true, ' ') + '</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', this, true, ' ') + '</td>\n<td colspan="2" class="' + spm_fixCSSForMac(this.getIntCSSName('spmbrk') + this.cssMenuBreak) + '">' + spm_getMenuImage('spacer.gif', this, true, ' ') + '</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, false, this.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, true, this.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, true, this.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]), false, this.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, false, this.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, true, this.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, true, true, false, true);

        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, true, false, false, true);
            spm_applyBorders(oRow.cells[2], sStyle, iSize, sColor2, true, false, true, true);
        //}
    }
    
    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";
    }