/*  ******************************************************************
 **  Soubor  :  /ariadne/javascript/contextmenu.js
 **
 **  Modul   :  Práce s kontextovým menu
 **  Verze   :  0.1.0
 **
 **  Autor   :  Michal Hromádko      michal.hromadko@lifeweb.cz
 **  Revize  :  Martin Jonáš         martin.jonas@lifeweb.cz
 **
 **  Popis   :  Funkce pro umístění, zobrazení a skrytí kontextového
 **             menu
 ** ***************************************************************** */

// Právě zobrazené menu
var contextMenu;

// seznam nacachovaných JSCookMenu
var _context = new Array();

/**
 * Funkce zobrazí kontextové menu
 * @param id Id elementu (DIVu) s kontextovým menu
 * @param e Event
 * @return Návratová hodnota pro prohlížeč
 */
function ShowMenu(id, request, e, force, callbacks) {
  if (!e) var e = window.event;

  // zobrazíme pouze na right click
  if (!isRightClick(e) && force !== true) {
    return;
  }

  if (e.pageX || e.pageY) 	{
    posx = e.pageX;
    posy = e.pageY;
  } else if (e.clientX || e.clientY) 	{
    posx = e.clientX + document.body.scrollLeft
      + document.documentElement.scrollLeft;
    posy = e.clientY + document.body.scrollTop
      + document.documentElement.scrollTop;
  }
  
  posx += 1;
  posy += 1;

  // Zabrání vyvolání standartního kontextového menu
  cancelContextMenu(null, e);

  if (!_context[id]) {
    // zobrazíme dočasný ajaxový spinner
    DisplayMenu(false, posx, posy);

    var xmlHttp=null; // Defines that xmlHttp is a new variable.
    // Try to get the right object for different browser
    try {
      // Firefox, Opera 8.0+, Safari, IE7+
      xmlHttp = new XMLHttpRequest(); // xmlHttp is now a XMLHttpRequest.
    } catch (err) {
      // Internet Explorer
      try {
        xmlHttp=new ActiveXObject("Msxml2.XMLHTTP");
      } catch (err) {
        xmlHttp=new ActiveXObject("Microsoft.XMLHTTP");
      }
    }

    xmlHttp.onreadystatechange = function() {

      if (xmlHttp.readyState == 4)
        try { // In some instances, status cannot be retrieved and will produce an error (e.g. Port is not responsive)
          if (xmlHttp.status == 200) {
            try {
              eval(xmlHttp.responseText);
              if (_context[id]) {
                DisplayMenu(id, posx, posy, callbacks);
                return false;
              }
            }
            catch (err){
              alert("Error reading the response: " + err.toString());//description);
            }
          }
        } catch (err) {
          alert("Error reading the response: " + err.description);
        }
    }
    xmlHttp.open("get", request); // .open(RequestType, Source);
    xmlHttp.send(null); // Since there is no supplied form, null takes its place as a new form.

    return true;
  }

  DisplayMenu(id, posx, posy, callbacks);
  return false; // Vrací false aby se zabránilo zobrazení standartního kontextového menu
}

function DisplayMenu(id, x, y, callbacks) {
  HideMenu();

  if (typeof(id) == 'string') {
    contextMenu = returnObjById(id);
    var prop = cmClone(cmThemeGray);
    prop.effect = new CMSlidingEffect(80);

    if (!contextMenu) {
      contextMenu = document.createElement("div");
      contextMenu.setAttribute("id", id);
      contextMenu.style.position = "absolute";
      contextMenu.style.visibility = "hidden";

      document.body.appendChild(contextMenu);
    }

    cmDraw(id, _context[id], 'vbr', prop);
  }
  else {
    contextMenu = returnObjById('_cmsLoader');
    if (!contextMenu) {
      contextMenu = document.createElement("div");
      contextMenu.setAttribute('id', '_cmsLoader');
      contextMenu.style.position = "absolute";
      contextMenu.style.visibility = "hidden";
      document.body.appendChild(contextMenu);
    }

    var prop = cmClone(cmThemeGray);
    var loader = [[_cmNoClick, ajaxTreeMenu.meta.loader]];
    cmDraw ('_cmsLoader', loader, 'vbr', prop);
  }
  
  // nastavime callbacky
  contextMenu.callbacks = callbacks;

  contextMenu.style.top = y + 'px';
  contextMenu.style.left = x + 'px';
  contextMenu.style.zIndex = 100;

  // zobrazíme průhledně - browser přepočte výšku menu
  contextMenu.style.opacity = 0.001;
  contextMenu.style.visibility = 'visible';

  // posuneme menu nahorů, pokud se má zobrazit pod úrovní obrazovky
  var spaceToBottom = $(window).height() + $(document).scrollTop() - y - $(contextMenu).outerHeight();
  if (spaceToBottom < 0) {
    y = y + spaceToBottom;
    contextMenu.style.top = (y > 0 ? y : 0) + 'px';
  }

  // nastavíme výslednou průhlednost
  contextMenu.style.opacity = 1;

  return true;
}

/**
 * Funkce pro skrytí kontextového menu
 */
function HideMenu() {
  if (contextMenu) {
    // vyvolame callbacky na hide
    if (contextMenu.callbacks && contextMenu.callbacks.hide) {
      contextMenu.callbacks.hide();
      contextMenu.callbacks.hide = null;
    } 
  
    contextMenu.style.visibility = 'hidden';
  }
}
