// JSON Menu
// $Id: jsonmenu.js,v 1.16 2008/06/03 11:10:22 aro Exp $

var JSONMenu = {
  getJson: function() {
    // sJsonMenu is defined in common/menu/json.jsp
    JSONMenu.renderMenubar('mainMenubar', sJsonMenu);
  },

  renderMenubar: function(sMenubarId, sJson) {
    var oMenubarElement = document.getElementById(sMenubarId);
    oMenubarElement.className = 'menubar';
    
    JSONMenu.AbsoluteUri = oMenubarElement.innerHTML;
    oMenubarElement.innerHTML = '';
    
    JSONMenu.addEvent(oMenubarElement, "mouseout", submenuMouseOut, false);    
    JSONMenu.addEvent(oMenubarElement, "keydown", onKeyDown, false);
    //if(document.getElementById('tabpageQuery'))
    //JSONMenu.addEvent(document.getElementById('tabpageQuery'), "mousemove", onKeyDown, false);
    //if(document.getElementById('queryTabHeaders'))
    //JSONMenu.addEvent(document.getElementById('mainMenubar'), "blur", onBlur, false);
    Event.observe(document.getElementById('mainMenubar'), 'blur', onBlur.bindAsEventListener(this));
    Event.observe(document.getElementById('mainMenubar'), 'focusout', onBlur.bindAsEventListener(this));
    
    var oJson = sJson.evalJSON(true);     
    var bLastElement = false;         
    
    for (var i = 0; i < oJson.menu.items.length; i++)
    {
      bLastElement = (i == oJson.menu.items.length-1);
      JSONMenu.renderMenuItem(oMenubarElement, oJson.menu.items[i], bLastElement);
      
      var oMenuElementSeparator = document.createElement("span");
      oMenuElementSeparator.innerHTML = '&nbsp;';
      if (i+1 < oJson.menu.items.length)
      {
        oMenuElementSeparator.innerHTML += '|&nbsp;';
      }
      oMenubarElement.appendChild(oMenuElementSeparator);
      JSONMenu.renderSubmenu(oMenubarElement, oJson.menu.items[i], oJson.menu.items[i].items);
    }
  },

  renderSubmenu: function(oMenubarElement, oParentMenu, oJsonItems) {
    if (oJsonItems)
    {
      var oSubmenuElement = document.createElement("div");
      with (oSubmenuElement)
      {
        id = "sub" + oParentMenu.id;
        className = "menu";
      }
      
      for (var i = 0; i < oJsonItems.length; i++)
      {
        JSONMenu.renderMenuItem(oSubmenuElement, oJsonItems[i]);
      }
      
      oMenubarElement.appendChild(oSubmenuElement);
    }
    else
    {
      //There was no submenu for this item. Move on.
    }
  },

  renderMenuItem: function(oParentElement, oJsonItem, bLastElement) {
    var oMenuItemElement = document.createElement("a");
    
    
    with (oMenuItemElement)
    {
      className = 'menuItem';
      id = oJsonItem.id;
      innerHTML = oJsonItem.label;  
      
 
      if (oJsonItem.href)
      {
        href = JSONMenu.buildHref(oJsonItem.href);
 
 
 
        if(oJsonItem.access=='false')
        {
          className = "deniedMenuItem";  
          style.disabled = true;    
          if (href == "http://www.vejman.dk/noaccess") 
          {
            href = "#"; // "" reloads the current page
 
            target="_self";
          }
        }
        if(href!='' && (href.indexOf('#')<0))
        { 
         if(oJsonItem.target)
          {
            oMenuItemElement.target = oJsonItem.target;
          }
        }
      
       
      }
      else
      {
        if(oParentElement==null){
        href = 'somefancydefaultpage.do';
        }
      }
            
      
      if (oJsonItem.help)
      {
        title = oJsonItem.help;
      }
    }
    
    //Can't set undefined attribute from within "with"
    oMenuItemElement.lastElement = bLastElement;
    
    if (oJsonItem.items)
    {
      JSONMenu.addEvent(oMenuItemElement, "mouseover", menuMouseOverEvent, false);
    }
    
    oParentElement.appendChild(oMenuItemElement);
  },
  
  buildHref: function(sHref)
  {
    var bAbsoluteUri = JSONMenu.isAbsolute(sHref);
    if (bAbsoluteUri || JSONMenu.AbsoluteUri == '')
    {
      if (sHref.substr(0, 1) == '/' && JSONMenu.AbsoluteUri != '')
      {
        var sAbsolute = this.getDomain(JSONMenu.AbsoluteUri);
        sHref = sAbsolute + sHref;
      }
      //All is well - do nothing
    }
    else
    {
      if(JSONMenu.AbsoluteUri != '' && sHref != '')
      {
        sHref = JSONMenu.AbsoluteUri + sHref;
      }
      else
      {
        //Nothing to prefix
        sHref = JSONMenu.AbsoluteUri;
      }
    }
    return sHref;
  },
  
  isAbsolute: function(sUri)
  {
    var bAbsolute = false;
    if(sUri != '')
    {
      if(sUri.substr(0, 7).toLowerCase() == 'http://') bAbsolute = true;
      if(sUri.substr(0, 1) == '/') bAbsolute = true;
    }
    return bAbsolute;
  },

  //Facade - crossbrowser event handling
  
  addEvent: function(obj, eventType, afunction, isCapture) {
    // W3C DOM
    if (obj.addEventListener) {
      obj.addEventListener(eventType, afunction, isCapture);
      return true;
    }
    // Internet Explorer

    else if (obj.attachEvent) {
      return obj.attachEvent("on"+eventType, afunction);
    }
    else return false;
  },
  
  removeEvent: function(obj, eventType, afunction, isCapture) {
    if (obj.removeEventListener) {
      obj.removeEventListener(eventType, afunction, isCapture);
      return true;
    }
    else if (obj.detachEvent) {
      return obj.detachEvent("on"+eventType, afunction);
    }
    else return false;
  },

  getDomain: function(sUrl) {
    var oUrl = this.parseUrl(sUrl);
    var sDomain = oUrl.protocol + '://' + oUrl.host;
    if (oUrl.port != '') sDomain += ':' + oUrl.port;
    return sDomain;
  },
  
  parseUrl: function(buffer) {
    var result = { };
    result.protocol = "";
    result.user = "";
    result.password = "";
    result.host = "";
    result.port = "";
    result.path = "";
    result.query = "";
  
    var section = "PROTOCOL";
    var start = 0;
    var wasSlash = false;
  
    while(start < buffer.length) {
      if(section == "PROTOCOL") {
        if(buffer.charAt(start) == ':') {
          section = "AFTER_PROTOCOL";
          start++;
        } else if(buffer.charAt(start) == '/' && result.protocol.length == 0) { 
          section = "PATH";
        } else {
          result.protocol += buffer.charAt(start++);
        }
      } else if(section == "AFTER_PROTOCOL") {
        if(buffer.charAt(start) == '/') {
      if(!wasSlash) {
            wasSlash = true;
      } else {
            wasSlash = false;
            section = "USER";
      }
          start ++;
        } else {
          throw new ParseException("Protocol shell be separated with 2 slashes");
        }       
      } else if(section == "USER") {
        if(buffer.charAt(start) == '/') {
          result.host = result.user;
          result.user = "";
          section = "PATH";
        } else if(buffer.charAt(start) == '?') {
          result.host = result.user;
          result.user = "";
          section = "QUERY";
          start++;
        } else if(buffer.charAt(start) == ':') {
          section = "PASSWORD";
          start++;
        } else if(buffer.charAt(start) == '@') {
          section = "HOST";
          start++;
        } else {
          result.user += buffer.charAt(start++);
        }
      } else if(section == "PASSWORD") {
        if(buffer.charAt(start) == '/') {
          result.host = result.user;
          result.port = result.password;
          result.user = "";
          result.password = "";
          section = "PATH";
        } else if(buffer.charAt(start) == '?') {
          result.host = result.user;
          result.port = result.password;
          result.user = "";
          result.password = "";
          section = "QUERY";
          start ++;
        } else if(buffer.charAt(start) == '@') {
          section = "HOST";
          start++;
        } else {
          result.password += buffer.charAt(start++);
        }
      } else if(section == "HOST") {
        if(buffer.charAt(start) == '/') {
          section = "PATH";
        } else if(buffer.charAt(start) == ':') {
          section = "PORT";
          start++;
        } else if(buffer.charAt(start) == '?') {
          section = "QUERY";
          start++;
        } else {
          result.host += buffer.charAt(start++);
        }
      } else if(section == "PORT") {
        if(buffer.charAt(start) = '/') {
          section = "PATH";
        } else if(buffer.charAt(start) == '?') {
          section = "QUERY";
          start++;
        } else {
          result.port += buffer.charAt(start++);
        }
      } else if(section == "PATH") {
        if(buffer.charAt(start) == '?') {
      section = "QUERY";
      start ++;
        } else {
      result.path += buffer.charAt(start++);
        }
      } else if(section == "QUERY") {
        result.query += buffer.charAt(start++);
      }
    }
  
    if(section == "PROTOCOL") {
      result.host = result.protocol;
      result.protocol = "http";
    } else if(section == "AFTER_PROTOCOL") {
      throw new ParseException("Invalid url");
    } else if(section == "USER") {
      result.host = result.user;
      result.user = "";
    } else if(section == "PASSWORD") {
      result.host = result.user;
      result.port = result.password;
      result.user = "";
      result.password = "";
    }
  
    return result;
  },

  ParseException: function(description) {
    this.description = description;
  }
};

JSONMenu.addEvent(window, 'load', JSONMenu.getJson, false);

