/*
menus.js.php

Copyright (c) Gareth Hadfield 2008
*/


function create_menu(aMenuName, aOnPopup, aUseShadows){
  preload("/opendots/themes/Donald/header.gif");
  
  if(aUseShadows == undefined){
    aUseShadows = true;
  }

  var aMenu = document.createElement('div');

  aMenu.className = "opendots_menu";
  aMenu.id = aMenuName;

  setCSSAttribute(aMenu, "display", "none");
  setCSSAttribute(aMenu, "visibility", "visible"); // keep

  aMenu.onPopup = aOnPopup;

  // heading
  var aMenuHeading = new_heading("");
  aMenu.appendChild(aMenuHeading);
  aMenu.heading = aMenuHeading;

  aMenu.hide = bind(aMenu, function(aHideParentMenus){
    if(aHideParentMenus == undefined){
      aHideParentMenus = false;
    }

    setCSSAttribute(this, "display", "none");

    if(aHideParentMenus && (this.parentMenu != undefined)){
      this.parentMenu.hide(aHideParentMenus);
    }
  });

  aMenu.set_heading = bind(aMenu, function(aHeadingText){
    this.heading.innerHTML = aHeadingText;
    if(aHeadingText==""){
      setCSSAttribute(this.heading, "display", "none");
    }
    else{
      this.heading.style.display="";
    }
  });

  aMenu.set_heading("");

  aMenu.close_sub_menu = bind(aMenu, function(){
    var aSubMenus = this.parentNode.childNodes;
    var aSubMenu;
    for(iMenu=0; iMenu<aSubMenus.length; iMenu++){
      aSubMenu = aSubMenus[iMenu];
      if((aSubMenu != this) && (aSubMenu.className == "opendots_menu") && (!this.has_parent(aSubMenu))){
        aSubMenu.close();
      }
    }
  });

  aMenu.has_parent = bind(aMenu, function(aParentMenu){
    var aParent = this.parentMenu;
    var result = false;
    while( (aParent != undefined) && (!result) ){
      result = (aParent==aParentMenu);
      aParent = aParent.parentMenu;
    }
    return(result);
  });

  aMenu.close = bind(aMenu, function(){
    this.parentMenu = undefined;
    setCSSAttribute(this, "display", "none");
  });

  aMenu.show = bind(aMenu, function(aEvent){
    show_menu(aEvent, this);
  });

  aMenu.get_menu_item = bind(aMenu, function(aItemId){
     return(get_menu_item(aItemId));
  });

  aMenu.add_menu_item = bind(aMenu, function(aItemId, aCaption, aOnClick, aHintText, aIcon){
     this.appendChild(new_menu_item(aItemId, aCaption, aOnClick, this, aHintText, aIcon));
  });

  aMenu.add_separator = bind(aMenu, function(){
     this.appendChild(new_separator());
  });

  aMenu.add_sub_menu = bind(aMenu, function(aItemId, aCaption, aSubMenuName, aParentMenuName, aHintText, aIcon){
    var aNewSubMenu = new_sub_menu(aItemId, aCaption, aSubMenuName, aParentMenuName, aHintText, aIcon);
    this.appendChild(aNewSubMenu);
    return(aNewSubMenu);
  });

  aMenu.clear = bind(aMenu, function(){
    // remove all menu items
    var aChild;
    var aChildren = all_menu_items(this, false);
    for(var iChild=0; iChild<aChildren.length; iChild++){
      this.removeChild(aChildren[iChild]);
    }
  });

  aMenu.onblur = bind(aMenu, function(){
    this.close();
  });
  
  aMenu.useShadows = aUseShadows;

  // mmm gold plating
  //add_shadow(aDot, aShadowNumber, aShadowOpacity, aStartColor, aEndColor, aSize, aRounded, aWhichShadows)
  //.shadow?start_color=000000&end_color=303030&size=5&opacity=30
  if((aMenu.useShadows) && (!(IS_IE && (IE_VERSION() > 7)))){
    //add_shadow(aMenu, undefined, 10, "#000000", "#c0c0c0", 10, true, "rb");
    add_standard_shadow(aMenu);
  }
  //add_shadow(aMenu, undefined, 15, "#000000", "#c0c0c0", 4, true, "rb");

  return(aMenu);
}

function get_menu_item(aItemId){
  return(geid(aItemId));
}

function new_menu_item(aItemId, aCaption, aOnClick, aParentMenu, aHintText, aIcon){
  var aMenuItem = document.createElement("div");
  aMenuItem.id = aItemId;

  if(aHintText == undefined){
    aHintText = "";
  }

  aMenuItem.title = aHintText;

  aMenuItem.parentMenu = aParentMenu;

  aMenuItem.set_enabled = bind(aMenuItem, function(aEnabled){
    this.enabled = aEnabled;

    if(this.enabled){
      this.style.color = this.normalColor;
    }
    else{
      this.style.color = "#C0C0C0";
    }
  });

  aMenuItem.set_visible = bind(aMenuItem, function(aVisible){
    if(aVisible){
      this.style.display = "";
    }
    else{
      this.style.display = "none";
    }
  });

  aMenuItem.doOnClick = aOnClick;
  aMenuItem.onclick = bind(aMenuItem, function(aEvent){
    if(this.enabled){
      if(!aEvent){aEvent=event;}
      if(this.parentMenu!=undefined){
        this.parentMenu.hide(true);
      }
      if(this.doOnClick != undefined){
        this.doOnClick(aEvent);
      }
      this.onmouseout();
    }
  });

  aMenuItem.onmouseover = bind(aMenuItem, function(aEvent){
    this.style.backgroundColor='#e0e0e0';
    this.parentNode.close_sub_menu();
    cancel_selection();
  });

  aMenuItem.onmouseout = bind(aMenuItem, function(aEvent){
    this.style.backgroundColor='#FFFFFF';
  });

  aMenuItem.className = "opendots_menu_item";
  var aHtml = "";
  if(aIcon != undefined){
    aHtml += "<img align='top' width='16' height='16' src='"+aIcon+"'> ";
  }
  aHtml += aCaption;
  aMenuItem.innerHTML = aHtml;

  aMenuItem.normalColor = aMenuItem.style.color;
  if(aMenuItem.normalColor == undefined){
    aMenuItem.normalColor = "";
  }
  aMenuItem.set_enabled(true);

  return(aMenuItem);
}

function new_separator(){
  var aMenuItem = document.createElement("div");
  aMenuItem.className = "opendots_menu_separator";

  aMenuItem.set_visible = bind(aMenuItem, function(aVisible){
    if(aVisible){
      this.style.display = "";
    }
    else{
      this.style.display = "none";
    }
  });

  return(aMenuItem);
}

function new_heading(aHeadingText){
  var aMenuItem = document.createElement("div");
  aMenuItem.innerHTML = aHeadingText;
  aMenuItem.className = "opendots_menu_heading";
  return(aMenuItem);
}

function new_sub_menu(aItemId, aCaption, aSubMenuName, aParentMenuName, aHintText, aIcon){
  var aMenuItem = document.createElement("div");
  aMenuItem.id = aItemId;

  if(aHintText == undefined){
    aHintText = "";
  }

  aMenuItem.title = aHintText;

  aMenuItem.onmouseover = bind(aMenuItem, function(aEvent){
    if(!aEvent){aEvent=event;}
    this.style.backgroundColor='#e0e0e0';
    if(this.enabled){
      show_menu(aEvent, this.subMenuName, this.parentMenuName, this);
    }
  });

  aMenuItem.onmouseout = bind(aMenuItem, function(aEvent){
    this.style.backgroundColor='#FFFFFF';
  });

  aMenuItem.className = "opendots_menu_item";

  var aHtml = nbsp(aCaption);
  if(aIcon != undefined){
    aHtml = "<img align='top' width='16' height='16' src='"+aIcon+"'> " + aHtml;
  }
  aHtml += " &gt;";
  aMenuItem.innerHTML = aHtml;

  aMenuItem.subMenuName = aSubMenuName;
  aMenuItem.parentMenuName = aParentMenuName;

  aMenuItem.set_enabled = bind(aMenuItem, function(aEnabled){
    this.enabled = aEnabled;

    if(this.enabled){
      this.style.color = this.normalColor;
    }
    else{
      this.style.color = "#C0C0C0";
    }
  });

  aMenuItem.set_visible = bind(aMenuItem, function(aVisible){
    if(aVisible){
      this.style.display = "";
    }
    else{
      this.style.display = "none";
    }
  });

  aMenuItem.normalColor = aMenuItem.style.color;
  if(aMenuItem.normalColor == undefined){
    aMenuItem.normalColor = "";
  }
  aMenuItem.set_enabled(true);

  return(aMenuItem);
}

function getMenu(aMenuId){
  return(geid(aMenuId));
}

function get_menu(aMenuId){
  return(getMenu(aMenuId));
}

function show_menu(aEvent, aMenu, aParentMenuId, aMenuItem){
  // NB aMenu can be a menu object OR a menu id string
//  if(!aEvent){aEvent=event;}

  var aMenuObject;

  if(aMenu.className && (aMenu.className=="opendots_menu")){
    // aMenu is a menu object
    aMenuObject = aMenu;
  }
  else{
    // aMenu is a menu id
    aMenuObject = getMenu(aMenu);
  }

  assert(aMenuObject != undefined, "show_menu can not find menu ("+aMenu+")");

  var aParent;
  if(aParentMenuId != undefined){
    aParent = geid(aParentMenuId);
  }

  // displayed early since some browsers need visible to calc position
  var aScrollLeft = scrollLeft();
  var aScrollTop = scrollTop();

  aMenuObject.style.left = aScrollLeft+"px";
  aMenuObject.style.top = aScrollTop+"px";
  aMenuObject.parentMenu = aParent;

  aMenuObject.close_sub_menu();

  aMenuObject.style.display = "";
  aMenuObject.focus();


  var x = 0;
  var y = 0;

  if(aParent == undefined){
    if(aEvent){
      // popup at mouse position
      x = mouseX(aEvent);
      y = mouseY(aEvent);
    }

    if(aMenuObject.parentNode!=document.body){
      x = x - aMenuObject.parentNode.offsetLeft;
      y = y - aMenuObject.parentNode.offsetTop;
    }

    if(IS_OPERA || IS_CHROME){
      // Opera wont let us get rid of the context menu so move this popup menu to
      // the left so it can be seen
      x = x - aMenuObject.offsetWidth;
    }

  }
  else{
    // popup as a sub menu
    x = parseInt(aParent.style.left, 10) + parseInt(aParent.clientWidth, 10);

    if(aMenuItem != undefined){
      y = parseInt(aParent.style.top, 10) + aMenuItem.offsetTop;
    }
    else{
      y = mouseY(aEvent);
    }
  }


  var MENU_MARGIN = 18; // magic

  var aMaxX = ((aMenuObject.parentNode.offsetWidth + aScrollLeft) - aMenuObject.offsetWidth - MENU_MARGIN);
  var aMaxY = ((aMenuObject.parentNode.offsetHeight + aScrollTop) - aMenuObject.offsetHeight - MENU_MARGIN);

  var aMinX = aScrollLeft;
  var aMinY = aScrollTop;

  x = Math.min(aMaxX, Math.max(x, aMinX));
  y = Math.min(aMaxY, Math.max(y, aMinY));

  aMenuObject.style.left = x+"px";
  aMenuObject.style.top = y+"px";


  if(aMenuObject.onPopup!=undefined){
    aMenuObject.onPopup(aEvent);
  }

  bring_to_front(aMenuObject);
  cancel_selection();

  return(aMenuObject);
}

function hide_menu(aMenuName){
  var aMenu = geid(aMenuName);

  if(aMenu != undefined){
    aMenu.parentMenu = undefined;
    setCSSAttribute(aMenu, "display", "none");
  }
}

function all_menus(aParentNode, aRecurseAllAncestors){
  // return an array containing all opendots_menu elements
  return(get_all_class("div", "opendots_menu", false, aParentNode, aRecurseAllAncestors));
}

function all_menu_items(aParentNode, aRecurseAllAncestors){
  // return an array containing all opendots_menu_item elements
  return(get_all_class("div", "opendots_menu_item", false, aParentNode, aRecurseAllAncestors));
}

function hide_all_menus(aParentNode, aRecurseAllAncestors){
  if((!IS_IE) || (parseInt(IE_VERSION()) > 6)){// really slow on ie6
    // hide all menus that are child elements of aParentNode
    var aMenus = all_menus(aParentNode, aRecurseAllAncestors);
    for(var iMenu=0; iMenu<aMenus.length; iMenu++){
      aMenus[iMenu].close();
    }
  }
  else{
  // todo
  }
}

function menu_is_open(aParentNode, aRecurseAllAncestors){
  result = false;
  if((!IS_IE) || (parseInt(IE_VERSION()) > 6)){// really slow on ie6
    // hide all menus that are child elements of aParentNode
    var aMenus = all_menus(aParentNode, aRecurseAllAncestors);
    for(var iMenu=0; iMenu<aMenus.length; iMenu++){
      if(aMenus[iMenu].style.display != "none"){
        result = true;
        break;
      }
    }
  }
  else{
  // todo
  }
  return(result);
}

function remove_menus(aParent){
  var aMenus = all_menus(aParent);
  var aMenu;
  // remove menus
  for(var i=0; i<aMenus.length; i++){
    aMenu = aMenus[i];
    aMenu.parentNode.removeChild(aMenu);
  }
  return(aMenus);
}

function replace_menus(aMenus, aParent){
  if(aParent==undefined){
    aParent = document.body;
  }
  // restore
  for(var i=0; i<aMenus.length; i++){
    aMenu = aMenus[i];
    aParent.appendChild(aMenu);
  }
}

/* simple menus for html pages*/
function menu_item(aText, aHref, aOnClick, aClassPrefix, aTitle){
  var aA = document.createElement("a");
  if(aOnClick != undefined){
    aA.onclick = aOnClick;
  }

  if(aClassPrefix == undefined){
    aClassPrefix = "";
  }

  if(aTitle == undefined){
    aTitle = "";
  }

  aA.className = aClassPrefix + "menu_item";
  aA.href = aHref;

  aA.innerHTML = aText;
  aA.title = aTitle;
  return(aA);
}

function init_menus(aClassPrefix){
  if(aClassPrefix == undefined){
    aClassPrefix = "";
  }
  init_hover_info(aClassPrefix + "menu_item", true);
}
