// ////////////////////////////////////////////////////
//
// derived from a js Copyright by Mike Hall
// see http://www.brainjar.com for demos and
// samples Copyright by Mike Hall
//
// ////////////////////////////////////////////////////
function Browser() {
  var agent;

  agent = navigator.userAgent;
  this.agentNS = false; this.agentIE=false;

  if( agent.indexOf("Netscape6/") >= 0) {
    this.agentNS = true;
    return;
  }
  else if( agent.indexOf("MSIE") >= 0 ) {
    this.agentIE = true;
    return;
  }
  else if( agent.indexOf("Gecko") >= 0 ) {
    this.agentNS = true;
    return;
  }
}


var menuActive = null;
var subMenu = null;
var subMenuName = '';
var contextMenu = null;
var browser = new Browser();

var x=0,y=0;

// register mouse event handler - if we are lucky we can close open menus
// if someone clicks something outside of it
if( browser.agentIE )
  document.onmousedown = pageMousedown;
else if( document.addEventListener ) 
  document.addEventListener("mousedown", pageMousedown, false);

//else if( browser.agentNS )

function closeMenu() {
  closeSubmenu();
  closeContextMenu();
  if( ! menuActive ) return;
  menuActive.className = "menuButton";
  if( menuActive.menu )
    menuActive.menu.style.visibility = "hidden";
  menuActive.isDepressed = false;
  menuActive = null;
}


function pageMousedown(event) {
  var obj;

  // don't need to do anything if no menu is active, anyway
  if( window.event && window.event.srcElement ) obj = window.event.srcElement;
    else if( event.target.parentNode ) obj = event.target.parentNode;
    else if( event.target ) obj = event.target;
    else return;
  
  if(event) {
      x=event.pageX?event.pageX:event.clientX?event.clientX:0;
      y=event.pageY?event.pageY:event.clientY?event.clientY:0;
  }
  else if(window.event) {
      x=window.event.clientX;
      y=window.event.clientY;
      if(document.documentElement) {
	  x+=document.documentElement.scrollLeft;
	  y+=document.documentElement.scrollTop;
      }
      else if( document && document.body && (document.body.scrollLeft || document.body.scrollTop) ) {
	  x += document.body.scrollLeft;
	  y += document.body.scrollTop;
      }
  }
  else {
      x=0;
      y=0;
  }

  if( !menuActive && !contextMenu ) return;

  if( obj == menuActive ) return;

  // close menu if clicked outside of it
  if( obj.className != "menuButton"  && obj.className != "menuItem" &&
      obj.className != "menuItemSep" && obj.className != "menu" )
    closeMenu();
}


function openMenu(menu_button, menuName ) {
  // close active menu if any
  if (menuActive && menuActive != menu_button)
    closeMenu();

  if( !menu_button.menu )
    menu_button.menu = document.getElementById( menuName );
  menu_button.blur();

  if( menu_button.isDepressed )
    closeMenu();
  else
    clickMenu( menu_button );

  return false;
}

function changeMenu( menu_button, menuName ) {
  if( ! menuActive ) return;
  if( menuActive != menu_button ) {
    closeMenu();
    if( menuName ) openMenu( menu_button, menuName);
  }
}


function closeSubmenu() {
  if( ! (subMenu && subMenu.menu ) ) return;
  subMenu.menu.style.visibility = "hidden";
  subMenu.menu.isOnPage = false;
  subMenu = null;
  subMenuName = '';
}


function closeSubmenuOf( name ) {
  if( subMenuName != name ) closeSubmenu();
}
  

function openSubmenu( item, subName ) {
  var x,y,parentContainer;

  if( subMenu && subMenu != item )
    closeSubmenu();

  if( !item.menu )
    item.menu = document.getElementById(subName);

  if( item.menu.isOnPage ) return;

  x = getPageOffsetLeft( item ) + item.offsetWidth;
  y = getPageOffsetTop( item ) + item.offsetHeight/3;
  parentContainer = document.getElementById( 'menuWrap' );
  if( parentContainer ) x -= getPageOffsetLeft( parentContainer );
  if( parentContainer ) y -= getPageOffsetTop( parentContainer );
  if( y<2 ) y = 30;
  if( x<3 ) x = 40;
  
  item.menu.style.left = x + "px";
  item.menu.style.top = y + "px";
  item.menu.style.visibility = "visible";
  subMenu = item;
  subMenuName = subName;
  item.menu.isOnPage = true;
}


function clickMenu( menu_button ) {
  var w, dw, x, y, parentContainer;

  menu_button.className = "menuButtonActive";

  // nice trick (Mike Hall)
  // solves some hover problems with IE
//  if( browser.agentIE && !menu_button.menu.firstChild.style.width ) {
//    w = menu_button.menu.firstChild.offsetWidth;
//    menu_button.menu.firstChild.style.width = w + "px";
//    dw = menu_button.menu.firstChild.offsetWidth - w;
//    w -= dw;
//    menu_button.menu.firstChild.style.width = w + "px";
//  }

  x = getPageOffsetLeft( menu_button );
  y = getPageOffsetTop( menu_button ) + menu_button.offsetHeight;
  parentContainer = document.getElementById( 'menuWrap' );
  if( parentContainer ) x -= getPageOffsetLeft( parentContainer );
  if( parentContainer ) y -= getPageOffsetTop( parentContainer );
  if( y<2 ) y = 30;
  if( x<3 ) x = 40;
  if( browser.agentIE ) {
//    x += 2;
//    y += 2;
;
  }
  y += 1;

  menu_button.menu.style.left = x + "px";
  menu_button.menu.style.top  = y + "px";
  menu_button.menu.style.visibility = "visible";
  menu_button.isDepressed = true;
  menuActive = menu_button;
}

function getPageOffsetLeft( obj ) {
  var x;
  x = obj.offsetLeft; 
  while( obj.offsetParent ) {
      obj = obj.offsetParent;
      x += obj.offsetLeft;
  }
  return x;
}

function getPageOffsetTop( obj ) {
  var y;
  y = obj.offsetTop; 
  while( obj.offsetParent ) {
      obj = obj.offsetParent;
      y += obj.offsetTop;
  }
  return y;
}


function showContextMenu( id ) {
  var menu, x, y;

  menu = document.getElementById(id);
  if( ! menu ) return false;
  if( contextMenu && contextMenu == menu ) return false;
  if( contextMenu ) closeContextMenu();
  contextMenu = menu;
  x = getMouseX();
  y = getMouseY();
  menu.style.left = (x-14) + "px";
  menu.style.top = (y-10) + "px";
  menu.style.visibility = "visible";
  return false;
}


function closeContextMenu() {
  if( ! contextMenu ) return;
  contextMenu.style.visibility = "hidden";
  contextMenu.isOnPage = false;
  contextMenu = null;
}


function getMouseX() {
    var winW;

    if( x<=0 ) {
	winW=(window.innerWidth)
	     ? window.innerWidth+window.pageXOffset
	     : document.body.offsetWidth;
	x=winW/2+(window.pageXOffset?window.pageXOffset:0);
    }
    return x;
}

function getMouseY() {
    var winH;

    if( y<=0 ) {
       winH=(window.innerHeight)
            ? window.innerHeight+window.pageYOffset
	    : document.body.offsetHeight;
	y=winH/2+(window.pageYOffset?window.pageYOffset:0);
    }
    return y;
}


function replace(string,search,replace) {
    result = "" + string;
    while (result.indexOf(search)>-1) {
        pos= result.indexOf(search);
        result = (result.substring(0, pos) + replace +
        result.substring((pos + search.length), result.length));
    }
    return result;
}

function encodeArgument( arg ) {
        // ok, this is were I gave up ... just use deprecated escape()
        // since encodeURI* is not yet implemented everywhere and
        // there is no browser independent way of finding out if it is
        return( replace( escape( arg ), "+", "%2B" ) );
}


function contextURI( uri, names, translated ) {
    var i,j;
    var args;

    for( i=0; i<names.length; i++ ) {
        args = document.getElementsByName( names[i] );
	if( ! args ) continue;
	for( j=0; j<args.length; j++ ) {
	    if( args[j].type && (
	      args[j].type == 'radio'
	      || args[j].type == 'checkbox'
	      ) && ! args[j].checked ) continue;
	    uri = uri + "&" + translated[i] + "=" + encodeArgument( args[j].value );
	}
    }
    return uri;
}

	    
function openContext( uri, names, translated, window, params ) {
    self.open( contextURI( uri, names, translated ), window, params );
    closeMenu();
} 
