﻿/**
*
*  Simple Context Menu
*  http://www.webtoolkit.info/
*
*  Original script changed for Quick Bookmarks.
*
**/

var SimpleContextMenu = 
{
  // private attributes
  _menus : new Array,
  _attachedElement : null,
  _menuElement : null,
  _preventDefault : true,
  _preventForms : true,
  _leftMenuPos : 0,
  _topMenuPos : 0,

  // public method. Sets up whole context menu stuff..
  setup : function (conf) 
  {
      if ( document.all && document.getElementById && !window.opera ) 
      {
        SimpleContextMenu.IE = true;
      }

      if ( !document.all && document.getElementById && !window.opera ) 
      {
        SimpleContextMenu.FF = true;
      }

      if ( document.all && document.getElementById && window.opera ) 
      {
        SimpleContextMenu.OP = true;
      }

      if ( SimpleContextMenu.IE || SimpleContextMenu.FF ) 
      {
       // document.oncontextmenu = SimpleContextMenu._show;
        document.onclick = SimpleContextMenu._show;
      }
      else
      {
        //document.addEventListener('contextmenu', SimpleContextMenu._show, false);
        document.onclick = SimpleContextMenu._show;
      }
//      if (conf && typeof(conf.preventDefault) != "undefined") 
//      {
//        SimpleContextMenu._preventDefault = conf.preventDefault;
//      }

//      if (conf && typeof(conf.preventForms) != "undefined") 
//      {
//         SimpleContextMenu._preventForms = conf.preventForms;
//      }
  },

  // public method. Attaches context menus to specific class names
  attach : function (classNames, menuId) 
  {
    if (typeof(classNames) == "string") 
    {
      SimpleContextMenu._menus[classNames] = menuId;
    }

    if (typeof(classNames) == "object") 
    {
      for (x = 0; x < classNames.length; x++) 
      {
        SimpleContextMenu._menus[classNames[x]] = menuId;
      }
    }
  },
  
  // private method. Get which context menu to show
  _getMenuElementId : function (e) 
  {
    if (SimpleContextMenu.IE) 
    {
      SimpleContextMenu._attachedElement = event.srcElement;
    } 
    else 
    {
      SimpleContextMenu._attachedElement = e.target;
    }

    while(SimpleContextMenu._attachedElement != null) 
    {
      var className = SimpleContextMenu._attachedElement.className;

      if (typeof(className) != "undefined") 
      {
        className = className.replace(/^\s+/g, "").replace(/\s+$/g, "")
        var classArray = className.split(/[ ]+/g);

        for (i = 0; i < classArray.length; i++) 
        {
          if (SimpleContextMenu._menus[classArray[i]]) 
          {
            return SimpleContextMenu._menus[classArray[i]];
          }
        }
      }

      if (SimpleContextMenu.IE) 
      {
        SimpleContextMenu._attachedElement = SimpleContextMenu._attachedElement.parentElement;
      } 
      else 
      {
        SimpleContextMenu._attachedElement = SimpleContextMenu._attachedElement.parentNode;
      }
    }
    return null;
  },

  // private method
  _getReturnValue : function (e) 
  {
    var returnValue = true;
    var evt = SimpleContextMenu.IE ? window.event : e;

    if (evt.button != 1) 
    {
      if (evt.target) 
      {
        var el = evt.target;
      } 
      else if (evt.srcElement) 
      {
        var el = evt.srcElement;
      }

      var tname = el.tagName.toLowerCase();

      if ((tname == "input" || tname == "textarea")) 
      {
        if (!SimpleContextMenu._preventForms) 
        {
            returnValue = true;
        } 
        else 
        {
            returnValue = false;
        }
      } 
      else 
      {
        if (!SimpleContextMenu._preventDefault) 
        {
            returnValue = true;
        } 
        else 
        {
            returnValue = false;
        }
      }
    }
    
    return returnValue;
  },


  // private method. Shows context menu
  _show : function (e) 
  {
    // check if the menu is opened
    if (SimpleContextMenu._menuElement != null && SimpleContextMenu._menuElement.style.display != 'none')
    {
      // is opened...
      var m = SimpleContextMenu._getMousePosition(e);
      var s = SimpleContextMenu._getScrollPosition(e);
    
      // if the click is inside the menu, don't close the menu (do nothing)
      if (m.x + s.x > SimpleContextMenu._leftMenuPos && m.x + s.x < SimpleContextMenu._leftMenuPos + SimpleContextMenu._menuElement.offsetWidth &&
        m.y + s.y > SimpleContextMenu._topMenuPos && m.y + s.y < SimpleContextMenu._topMenuPos + SimpleContextMenu._menuElement.offsetHeight)
        return;
    }
    
    // menu is hidden: open it
    SimpleContextMenu._hide();
    var menuElementId = SimpleContextMenu._getMenuElementId(e);

    if (menuElementId) 
    {
      var m = SimpleContextMenu._getMousePosition(e);
      var s = SimpleContextMenu._getScrollPosition(e);

      SimpleContextMenu._menuElement = document.getElementById(menuElementId);
      SimpleContextMenu._menuElement.style.left = m.x + s.x - 5 + 'px';
      SimpleContextMenu._menuElement.style.top = m.y + s.y + 5 + 'px';
      SimpleContextMenu._menuElement.style.display = 'block';
      
      SimpleContextMenu._leftMenuPos = m.x + s.x - 5;
      SimpleContextMenu._topMenuPos = m.y + s.y + 5;
      
      var title = SimpleContextMenu._attachedElement.getAttribute("title");
      SimpleContextMenu._attachedElement.setAttribute("title_tmp", title);
      SimpleContextMenu._attachedElement.setAttribute("title", "");
      return false;
    }
    return true;
    //return SimpleContextMenu._getReturnValue(e);
  },
  
  // private method. Hides context menu
  _hide : function () 
  {
    if (SimpleContextMenu._menuElement) 
    {
      SimpleContextMenu._menuElement.style.display = 'none';
      if (SimpleContextMenu._attachedElement)
      {
        var title = SimpleContextMenu._attachedElement.getAttribute("title_tmp");
        SimpleContextMenu._attachedElement.setAttribute("title", title);
      }
    }
  },

  // private method. Returns mouse position
  _getMousePosition : function (e) 
  {
    e = e ? e : window.event;
    var position = 
    {
      'x' : e.clientX,
      'y' : e.clientY
    }

    return position;
  },

  // private method. Get document scroll position
  _getScrollPosition : function () 
  {
    var x = 0;
    var y = 0;

    if( typeof( window.pageYOffset ) == 'number' ) 
    {
      x = window.pageXOffset;
      y = window.pageYOffset;
    } 
    else if (document.documentElement && ( document.documentElement.scrollLeft || document.documentElement.scrollTop ) ) 
    {
      x = document.documentElement.scrollLeft;
      y = document.documentElement.scrollTop;
    } 
    else if (document.body && ( document.body.scrollLeft || document.body.scrollTop ) ) 
    {
      x = document.body.scrollLeft;
      y = document.body.scrollTop;
    }

    var position = 
    {
      'x' : x,
      'y' : y
    }
    return position;
  }
}