/*
******************************************************************************
       File: BuildNavigationMenuHeader.js
Description: Contains the common JavaScript code used for creating the 
             Navigation Menu.
  Copyright: Copyright (c) 2007, GMTI. All rights reserved.
  Date:		 01/22/2008
******************************************************************************
*/
var ID = new Array();
ID[0] = null;
ID[1] = 'NavigationMenuLevel1Div';
ID[2] = 'NavigationMenuLevel2Div';
ID[3] = 'NavigationMenuLevel3Div';
ID[4] = 'NavigationMenuLevel4Div';

var MenuOpen = new Array();

/*******************************************************************************
 This function changes the menu node style.
*******************************************************************************/
function ChangeNode(Level, subNode ) {
    ResetNode(Level);
  	document.getElementById('node'+subNode).className = "level"+Level+"-collapse";
};

/*******************************************************************************
 This function changes the menu node style back to its default value.
*******************************************************************************/
function ResetNode(Level) {
    MenuOpen[Level] = "";
    ResetColor(Level);
};

/*******************************************************************************
 This function changes the menu color style back to its default value.
*******************************************************************************/
function ResetColor(Level) {
    var offArray = document.getNavMenuElementsByClassName("level"+Level+"-collapse");
  	for (var x=0;x<offArray.length;x++) {
  	      offArray[x].className = "level"+Level+"-expand";
  	}
};

/*******************************************************************************
 This function captures the unload page event.
*******************************************************************************/
window.onbeforeunload = function () {
    var MenuMarkIDs = getMenuCookie();
    //MenuMarkIDs.URL = encodeURIComponent(window.location);
    MenuMarkIDs.URL = window.location.toString();
    setMenuCookie(MenuMarkIDs);
};

/*******************************************************************************
 This function creates a DOM method to retrieve an array of tags by class name.
*******************************************************************************/ 
document.getNavMenuElementsByClassName = function (className, tag, elm){
	var testClass = new RegExp("(^|\\s)" + className + "(\\s|$)");
	var tag = tag || "*";
	var elm = elm || document;
	var elements = (tag == "*" && elm.all)? elm.all : elm.getElementsByTagName(tag);
	var returnElements = [];
	var current;
	var length = elements.length;
	for(var i=0; i<length; i++){
		current = elements[i];
		if(testClass.test(current.className)){
			returnElements.push(current);
		}
	}
	return returnElements;
};

function enCodeURL(urlInput){
    urlString = urlInput.toString();
    var outValue="";
    for (i=0; i<urlString.length; i++)
	    outValue += '%' + urlString.charCodeAt(i).toString(16);
	return outValue;
};

/*******************************************************************************
 These functions get and set menu data in the cookie.
*******************************************************************************/
GetNavData = function(user)
{
  try
  {
  	if (gdn_version == 2)
      user = GDN.Cookies.Session.Get(user);
    else
  	{
      user.NodeLevel1 = unescape(GDN.Cookies.Session.GetValue("nd1"));
      user.NodeLevel2 = unescape(GDN.Cookies.Session.GetValue("nd2"));
  	}
  }
  catch (e)
  {
    user.NodeLevel1 = unescape(GDN.Cookies.Session.GetValue("nd1"));
    user.NodeLevel2 = unescape(GDN.Cookies.Session.GetValue("nd2"));
  }

  return user;
};

SetNavData = function(user)
{
  try
  {
  	if (gdn_version == 2)
      GDN.Cookies.Session.Set(user);
    else
    {
      user.NodeLevel1 = (GDN.IsNullOrEmpty(user.NodeLevel1)) ? GDN.Cookies.Session.GetValue("nd1") : user.NodeLevel1;
      user.NodeLevel2 = (GDN.IsNullOrEmpty(user.NodeLevel2)) ? GDN.Cookies.Session.GetValue("nd2") : user.NodeLevel2;
      GDN.Cookies.Session.SetValue("nd1", escape(user.NodeLevel1));
      GDN.Cookies.Session.SetValue("nd2", escape(user.NodeLevel2));
    }
  }
  catch (e)
  {
    user.NodeLevel1 = (GDN.IsNullOrEmpty(user.NodeLevel1)) ? GDN.Cookies.Session.GetValue("nd1") : user.NodeLevel1;
    user.NodeLevel2 = (GDN.IsNullOrEmpty(user.NodeLevel2)) ? GDN.Cookies.Session.GetValue("nd2") : user.NodeLevel2;
    GDN.Cookies.Session.SetValue("nd1", escape(user.NodeLevel1));
    GDN.Cookies.Session.SetValue("nd2", escape(user.NodeLevel2));
  }
};

/*******************************************************************************
 This function sets get the object from the session cookie, otherwise returns
 the default object.
*******************************************************************************/
function getMenuCookie() {
    var MenuMarkIDs = {"Level1Node":"","Level2Node":"","NewClick":false,"URL":""};
    var userEmpty = new Object;
    var user = GetNavData(userEmpty);
    if(typeof(user) == "object" && user.NodeLevel1!="null" && user.NodeLevel1!=null && user.NodeLevel1!=""){
        var tempVar = user.NodeLevel1;
        MenuMarkIDs = JSON.parse(tempVar);
    }
    return MenuMarkIDs;
};

/*******************************************************************************
 This function sets the session cookie with the input object.
*******************************************************************************/
function setMenuCookie(userObject){
    var userEmpty = new Object;
    var user = GetNavData(userEmpty);
    if(typeof(user) != "undefined"){
        user.NodeLevel1 = JSON.stringify(userObject);
        SetNavData(user);
    }
    else {
        userEmpty.NodeLevel1 = JSON.stringify(userObject);
        SetNavData(userEmpty);
    }
};

/*******************************************************************************
 This function sets the Level 1 and 2 node IDs to the session cookie which is 
 used to display default menu and style on page load.
*******************************************************************************/
function setNodeIDs(Level, Node1, Node2, Child){
    var setnode = false;
    if(Level==1 && Child=="True") setnode = true;
    else if(Level > 1) setnode = true;
    var MenuMarkIDs = getMenuCookie();
    if(setnode){
        MenuMarkIDs.Level1Node = Node1;
        MenuMarkIDs.Level2Node = Node2;
        MenuMarkIDs.NewClick = true;
    } else {
        MenuMarkIDs.Level1Node = "";
        MenuMarkIDs.Level2Node = "";
        MenuMarkIDs.NewClick = false;
    }
    setMenuCookie(MenuMarkIDs);
};

/*******************************************************************************
 This function set the menu coloring according to the value Level1Node and 
 Level2Node being set.
*******************************************************************************/
function CheckforNavigationIndicator() {
    var MenuMarkIDs = getMenuCookie();
    if((MenuMarkIDs.NewClick) || (MenuMarkIDs.URL == window.location)) {        
        MenuMarkIDs.NewClick = false;
        DisplayNormal(MenuMarkIDs.Level1Node,MenuMarkIDs.Level2Node);
    }else if(typeof(Level1NodeDefault)!= "undefined") {
        MenuMarkIDs.Level1Node = "";
        MenuMarkIDs.Level2Node = "";
        NavigationIndicatorLevel2(Level1NodeDefault,"");
    }else {
        MenuMarkIDs.Level1Node = "";
        MenuMarkIDs.Level2Node = "";
    }
    setMenuCookie(MenuMarkIDs);
};

/*******************************************************************************
 This function highlights the Level 1 node and displays the correct level 2 
 menu with a highlighted node if it exists.
*******************************************************************************/
function DisplayNormal(level1,level2){
    if(typeof(level1) != "undefined" && level1 != "" && level1!=null && level1!="null"){
        if(document.getElementById('node'+level1)){ 
            document.getElementById('node'+level1).className = "level1-collapse"; 
            MenuOpen[1]=level1;
        }
        NavigationIndicatorLevel2(level1,level2);
    }
    else if(typeof(Level1NodeDefault)!= "undefined") 
        NavigationIndicatorLevel2(Level1NodeDefault,"");
};

/*******************************************************************************
 This function requests and set the level 2 menu coloring according to the value 
 Level1Node and Level2Node being set.
*******************************************************************************/
function NavigationIndicatorLevel2(node1, node2){
    notNull = function(count){
        if(objNavigationMenu.getMenuNode(node1) != null){
            menuLayers.show(ID[2], null, null, null);
            objNavigationMenu.displayMenu(node1,ID[2], renderMainItem);
            if(document.getElementById(ID[2]).innerHTML == "")
                document.getElementById(ID[2]).style.display = 'none';
            if(document.getElementById('node'+node2))
                document.getElementById('node'+node2).className = "level2-collapse";
        } else{
            count += 1;
            if(count < 40) setTimeout("notNull("+count+")",50);
        }
    };
    notNull(1);
};


/*******************************************************************************
 This function is the init function to build the navigation menu.
*******************************************************************************/
function initNavigation() {
 
	    
    for(var x = 0; x < 200; x++){
        if(typeof(JSON) != "undefined"){
              
            document.getElementById(ID[1]).style.display = '';

			objNavigationMenu.displayMenu(0,ID[1],renderMainItem);

            CheckforNavigationIndicator();
            x=200;
        } else setTimeout(function(){}, 10);
    };
};


