var ISNSC_TEMP_DIV_WRITTEN = false;
var ISNSC_MENU_CLASS_NAME = "ISnSCMenu";
var ISNSC_MENU_ITEM_CLASS_NAME = "ISnSCMenuItem";

/*
 * Orientation
 */
var ISNSC_MENU_ORIENTATION_HORIZONTAL = 0;
var ISNSC_MENU_ORIENTATION_VERTICAL = 1;

/*
 * Direction
 */
var ISNSC_MENU_DIRECTION_LEFT_TO_RIGHT = 0;
var ISNSC_MENU_DIRECTION_RIGHT_TO_LEFT = 1;

var ISNSC_REDIRECTION_URL = null;

// Global variables
var ISNSC_MENU_ITEM_NEXT_ID = 0;

function isnscGenerateMenuID()
{
  ISNSC_MENU_ITEM_NEXT_ID++;
  return "isnscMenuItem" + ISNSC_MENU_ITEM_NEXT_ID;
}

function isnscRedirect( redircetLocation )
{
  if( redircetLocation.indexOf( "http://" ) == 0 )
  {
    window.open( redircetLocation );
  }
  else if( ISNSC_REDIRECTION_URL == null )
  {
    ISNSC_REDIRECTION_URL = redircetLocation;
    window.location = redircetLocation;
  }
}

function isnscAddClass( htmlElement , className )
{
  var elementClassName = htmlElement.className;
  
  // Insure that class name not found
  if( elementClassName.indexOf( className ) == -1 )
  {
    elementClassName = htmlElement.className + " " + className;
    htmlElement.className = elementClassName;
  }
}

function isnscRemoveClass( htmlElement , className )
{
  var elementClassName = htmlElement.className;
  
  // Insure that class name not found
  if( elementClassName.indexOf( className ) != -1 )
  {
    var classNameRegularExpression = "\\s*" +className + "\\s*";
    elementClassName = elementClassName.replace( new RegExp( classNameRegularExpression ) , " " );
    htmlElement.className = elementClassName;
  }
}

function isnscWriteMenuBodyStart()
{
  isnscWriteTempDiv();
}

function isnscWriteTempDiv()
{
  if( !ISNSC_TEMP_DIV_WRITTEN )
  {
    document.write( "<table border='0' cellspacing='0' cellpadding='0'><tr><td id='isnscTempDiv' style='display:none;visibility:hidden'></td></tr></table>" );
    ISNSC_TEMP_DIV_WRITTEN = true;
  }
}

function getComputerStyle(oElm, strCssRule){
  var strValue = "";
  if(document.defaultView && document.defaultView.getComputedStyle){
    strValue = document.defaultView.getComputedStyle(oElm, "").getPropertyValue(strCssRule);
  }
  else if(oElm.currentStyle){
    strCssRule = strCssRule.replace(/\-(\w)/g, function (strMatch, p1){
      return p1.toUpperCase();
    });
    strValue = oElm.currentStyle[strCssRule];
  }
  return strValue;
}

function isnscCalculateHTMLElementDimension( elementHTMLText )
{
  var isnscTempDivElement = document.getElementById( "isnscTempDiv" );
  if( isnscTempDivElement != null )
  {
    showElement( isnscTempDivElement );
    isnscTempDivElement.innerHTML = elementHTMLText;
    
    var firstChild = isnscTempDivElement.firstChild;
    var htmlElementDimensions = null;

    var padding = 0;
    
    var pixelWidth = parseInt( firstChild.scrollWidth ) - padding;
    var pixelHeight = parseInt( firstChild.scrollHeight ) - padding;
    
    htmlElementDimensions = [ pixelWidth , pixelHeight ];

    hideElement( isnscTempDivElement );
    isnscTempDivElement.innerHTML = "";
    return htmlElementDimensions;
  }
  return null;
}

function isnscHideSubMenus( menuElementsIDs )
{
  // Validate it's an array
  if( typeof( menuElementsIDs ) == "object" && menuElementsIDs.length )
  {
    for( var i=0 ; i<menuElementsIDs.length ; i++ )
    {
      var menuElement = document.getElementById( menuElementsIDs[i][0] );
      hideElement( menuElement );
      setElementOpacity( menuElement , 0 )
      setElementPosition( menuElement , "absolute" );
      setElementWidth( menuElement , menuElementsIDs[i][1][0])
      
      var scrollingDiv = menuElement.getElementsByTagName( "div" )[0];
      if( scrollingDiv != null )
      {
        setElementPosition( scrollingDiv , "absolute" );
        setElementLeft( scrollingDiv , 0 );
        setElementTop( scrollingDiv , -menuElementsIDs[i][1][1] );
      }
    }
  }
}

/**
 * Generated the given menu with given parameters
 * 
 * @param isnscMenuItems
 * @param customRootMenu
 * @param orientation
 * @param direction ltr or rtl
 * @return
 */
function isnscGenerateMenu( isnscMenuItems , customRootMenu , orientation , direction )
{
  // Get menu DIV element
  if( typeof( customRootMenu ) != "boolean" )
    customRootMenu = false;

  if( typeof( orientation ) == "undefined" || orientation == null )
    orientation = ISNSC_MENU_ORIENTATION_HORIZONTAL;

  if( typeof( direction ) == "undefined" || direction == null )
    direction = ISNSC_MENU_DIRECTION_LEFT_TO_RIGHT;

  var submenuAdjustmenet = null;
  if( orientation == ISNSC_MENU_ORIENTATION_HORIZONTAL )
  {
    if( direction == ISNSC_MENU_DIRECTION_LEFT_TO_RIGHT )
      submenuAdjustmenet = ISNSC_ALIGNMENT_BOTTOM_LEFT;
    else if( direction == ISNSC_MENU_DIRECTION_RIGHT_TO_LEFT )
      submenuAdjustmenet = ISNSC_ALIGNMENT_BOTTOM_RIGHT;
  }
  else if( orientation == ISNSC_MENU_ORIENTATION_VERTICAL )
  {
    if( direction == ISNSC_MENU_DIRECTION_LEFT_TO_RIGHT )
      submenuAdjustmenet = ISNSC_ALIGNMENT_TOP_RIGHT;
    else if( direction == ISNSC_MENU_DIRECTION_RIGHT_TO_LEFT )
      submenuAdjustmenet = ISNSC_ALIGNMENT_TOP_LEFT;
  }

  if( typeof( isnscMenuItems ) == "object" && isnscMenuItems.length && isnscMenuItems.length != 0 )
  // Validate that isnscMenuItems is an array and not empty
  {
    var submenuItems = new Array();

    if( !customRootMenu )
    {
      var rootMenuItemsHTML = "";
      var subMenuID = "";
      var subMenuHTMLString = "";
      var subMenuDimentions = null;
      var onMouseOver = "";
      var onMouseOut = "";
      var onMouseClick = "";

      for( var i=0 ; i<isnscMenuItems.length ; i++ )
      {
        subMenuID = "";
        subMenuHTMLString = "";
        subMenuDimentions = null;
        onMouseOver = " onmouseover=\"isnscAddClass( this , 'ISnSCMenuItemHover' );\"";
        onMouseOut = " onmouseout=\"isnscRemoveClass( this , 'ISnSCMenuItemHover' );\"";
        onMouseClick = "";

        if( isnscMenuItems[i].length > 1 )
        {
          // Check for Hyperlink
          if( isnscMenuItems[i][1] != null )
          {
            // Add hyperlink
            onMouseClick = " onclick=\"isnscRedirect( '" + isnscMenuItems[i][1] + "' )\" style=\"cursor:pointer\"";
          }
        }
        
        // Check for sub menus
        if( isnscMenuItems[i].length > 2 && isnscMenuItems[i][2] != null )
        {
          subMenuID = isnscGenerateMenuID();
          subMenuHTMLString = getISnSCSubMenusHTML( subMenuID , isnscMenuItems[i][2] , orientation );
          subMenuDimentions = isnscCalculateHTMLElementDimension( subMenuHTMLString );
          
          // Add menu id to sub menu ids array
          submenuItems[submenuItems.length] = [subMenuID,subMenuDimentions];
        }
  
        if( subMenuHTMLString != "" )
        {
          var htmlElementDimensions = isnscCalculateHTMLElementDimension( subMenuHTMLString );
          onMouseOver = " onmouseover=\"isnscAddClass( this , 'ISnSCMenuItemHover' );" +
                            "isnscShowElement( '" + subMenuID + "' , this , " + submenuAdjustmenet + " );" +
                            "isnscRollOutElement( '" + subMenuID + "' , null , " + subMenuDimentions[0] + " , "  + subMenuDimentions[1] + " );\"";
          onMouseOut = " onmouseout=\"isnscRemoveClass( this , 'ISnSCMenuItemHover' );" +
                          "isnscHideElement( '" + subMenuID + "' , this );" +
                          "isnscRollInElement( '" + subMenuID + "' , " + subMenuDimentions[0] + " )\"";
        }

        if( orientation == ISNSC_MENU_ORIENTATION_HORIZONTAL )
          rootMenuItemsHTML = rootMenuItemsHTML + "<td class='" + ISNSC_MENU_ITEM_CLASS_NAME + "'" + onMouseOver + onMouseOut +
              onMouseClick + " width='60px'>" + isnscMenuItems[i][0] + "\n" + subMenuHTMLString + "</td>";
        else if( orientation == ISNSC_MENU_ORIENTATION_VERTICAL )
          rootMenuItemsHTML = rootMenuItemsHTML + "<tr><td class='" + ISNSC_MENU_ITEM_CLASS_NAME + "'" + onMouseOver + onMouseOut +
              onMouseClick + " width='60px'>" + isnscMenuItems[i][0] + "\n" + subMenuHTMLString + "</td></tr>";
      }

      if( rootMenuItemsHTML != "" )
      {
      
        if( orientation == ISNSC_MENU_ORIENTATION_HORIZONTAL )
        {
          document.write( "<table class='" + ISNSC_MENU_CLASS_NAME + "'><tr>" );
          document.write( rootMenuItemsHTML )
          document.write( "</tr></table>" );
        }
        else if( orientation == ISNSC_MENU_ORIENTATION_VERTICAL )
        {
          document.write( "<table class='" + ISNSC_MENU_CLASS_NAME + "'>" );
          document.write( rootMenuItemsHTML )
          document.write( "</table>" );
        }
      }
    }
    // Custom menu if start
    else
    {
      var subMenuID = "";
      var subMenuHTMLString = "";
      var onMouseOver = "";
      var onMouseOut = "";
      var onMouseClick = "";
      var subMenuDimentions = null;

      // Write menu items
      for( var i=0 ; i<isnscMenuItems.length ; i++ )
      {
        subMenuID = "";
        subMenuHTMLString = "";
        onMouseOver = "";
        onMouseOut = "";
        onMouseClick = "";

        if( isnscMenuItems[i].length > 3 && isnscMenuItems[i][3] != null )
        {
          var customMenuElement = document.getElementById( isnscMenuItems[i][3] );

          // Check for sub menus
          if( isnscMenuItems[i][2] != null )
          {
            subMenuID = isnscGenerateMenuID();
            subMenuHTMLString = getISnSCSubMenusHTML( subMenuID , isnscMenuItems[i][2] , orientation );
            subMenuDimentions = isnscCalculateHTMLElementDimension( subMenuHTMLString );
            
            // Add menu id to sub menu ids array
            submenuItems[submenuItems.length] = [subMenuID,subMenuDimentions];
          }

          // Check if the menu will be generated on a custom component

          // Create on click action
          if( isnscMenuItems[i][1] != null )
          {
            onMouseClick = "isnscRedirect( '" + isnscMenuItems[i][1] + "' )";
            setElementCursor( customMenuElement , "pointer" );
          }

          customMenuElement.onclick = new Function( onMouseClick );

          if( subMenuHTMLString != "" )
          {
            onMouseOver = "isnscShowElement( '" + subMenuID + "' , " + "document.getElementById( '" + isnscMenuItems[i][3] + "' ) , " + submenuAdjustmenet + " );" +
                  "isnscRollOutElement( '" + subMenuID + "' , null , " + subMenuDimentions[0] + " , "  + subMenuDimentions[1] + " );";
            onMouseOut = "isnscHideElement( '" + subMenuID + "' , this );" +
            		"isnscRollInElement( '" + subMenuID + "' , " + subMenuDimentions[0] + " );";

            customMenuElement.onmouseover = new Function( onMouseOver );
            customMenuElement.onmouseout = new Function( onMouseOut );
            customMenuElement.innerHTML = customMenuElement.innerHTML + subMenuHTMLString;
          }
        }
      }
    }
    // Custom menu if end
    
    // Hide all submenus
    isnscHideSubMenus( submenuItems );
  }
}

function getISnSCSubMenusHTML( subMenuID , isnscSubMenuItems , orientation )
{
  var htmlString = "<div id='" + subMenuID + "' class='" + ISNSC_MENU_CLASS_NAME + "'" +
  		                " style='" + //position:absolute;display:none;filter:alpha(opacity=0);opacity:0;" +
  		                "background-color:white;overflow:hidden;'><div>";
  if( typeof( isnscSubMenuItems ) == "object" && isnscSubMenuItems.length && isnscSubMenuItems.length != 0 )
  {
    for( var i=0 ; i<isnscSubMenuItems.length ; i++ )
    {
      var subMenuHTMLString = "";
      var onMouseOver = "";
      var onMouseOut = "";
      var onMouseClick = " style='cursor:default'";

      onMouseOver = " onmouseover=\"isnscAddClass( this , 'ISnSCMenuItemHover' )\"";
      onMouseOut = " onmouseout=\"isnscRemoveClass( this , 'ISnSCMenuItemHover' )\"";

      if( isnscSubMenuItems[i].length > 1 )
      {
        // Check for Hyperlink
        if( isnscSubMenuItems[i][1] != null )
        {
          // Add hyperlink
          onMouseClick = " onclick=\"isnscRedirect( '" + isnscSubMenuItems[i][1] + "' );\" style=\"cursor:pointer\"";
        }
      }

      htmlString = htmlString + "<div class='" + ISNSC_MENU_ITEM_CLASS_NAME + "'" + 
            onMouseOver + onMouseOut + onMouseClick + ">" + isnscSubMenuItems[i][0] + "</div>";
    }
  }
  htmlString = htmlString + "</div></div>";
  return htmlString;
}