text: /*
   * ContextMenu - jQuery plugin for right-click context menus
   *
   * Author: Chris Domigan
   * Contributors: Dan G. Switzer, II
   * Parts of this plugin are inspired by Joern Zaefferer's Tooltip plugin
   *
   * Dual licensed under the MIT and GPL licenses:
   *   http://www.opensource.org/licenses/mit-license.php
   *   http://www.gnu.org/licenses/gpl.html
   *
   * Version: r2
   * Date: 16 July 2007
   *
   * For documentation visit http://www.trendskitchens.co.nz/jquery/contextmenu/
   *
   */
  
  (function($) {
  
   	var menu, shadow, trigger, content, hash, currentTarget,allowLeft;
    var defaults = {
      menuStyle: {
        listStyle: 'none',
        padding: '1px',
        margin: '0px',
        backgroundColor: '#fff',
        border: '1px solid #999',
        width: '100px'
      },
      itemStyle: {
        margin: '0px',
        color: '#000',
        display: 'block',
        cursor: 'default',
        padding: '3px',
        border: '1px solid #fff',
        backgroundColor: 'transparent'
      },
      itemHoverStyle: {
        border: '1px solid #fff',
        backgroundColor: '#D0EDFA'
      },
      eventPosX: 'pageX',
      eventPosY: 'pageY',
      shadow : true,
      onContextMenu: null,
      onShowMenu: null,
      allowLeft: false,
      allowMouseOver:false,
      offsetx : 0
   	};
  
    $.fn.contextMenu = function(id, options) {
      if (!menu) {                                      // Create singleton menu
        menu = $('<div id="jqContextMenu"></div>')
                 .hide()
                 .css({position:'absolute', zIndex:'500'})
                 .appendTo('body')
                 .bind('click', function(e) {
                   e.stopPropagation();
                 });
      }
      if (!shadow) {
        shadow = $('<div></div>')
                   .css({backgroundColor:'#000',position:'absolute',opacity:0.2,zIndex:499})
                   .appendTo('body')
                   .hide();
      }
      hash = hash || [];
      hash.push({
        id : id,
        menuStyle: $.extend({}, defaults.menuStyle, options.menuStyle || {}),
        itemStyle: $.extend({}, defaults.itemStyle, options.itemStyle || {}),
        itemHoverStyle: $.extend({}, defaults.itemHoverStyle, options.itemHoverStyle || {}),
        bindings: options.bindings || {},
        shadow: options.shadow || options.shadow === false ? options.shadow : defaults.shadow,
        onContextMenu: options.onContextMenu || defaults.onContextMenu,
        onShowMenu: options.onShowMenu || defaults.onShowMenu,
        eventPosX: options.eventPosX || defaults.eventPosX,
        eventPosY: options.eventPosY || defaults.eventPosY,
        offsetx: options.offsetx || defaults.offsetx
      });
  
      var index = hash.length - 1;
      $(this).bind('contextmenu', function(e) {
        // Check if onContextMenu() defined
        var bShowContext = (!!hash[index].onContextMenu) ? hash[index].onContextMenu(e) : true;
        if (bShowContext) display(index, this, e, options);
        return false;
      });
      
      $(this).bind('click', function(e) {
          if (options.allowLeft) display(index, this, e, options);
          return false;
        });
      
      $(this).bind('mouseover', function(e) {
          if (options.allowMouseOver) display(index, this, e, options);
          return false;
        });
      
      return this;
    };
  
    function display(index, trigger, e, options) {
      var cur = hash[index];
      content = $('#'+cur.id).find('ul:first').clone(true);
      content.css(cur.menuStyle).find('li').css(cur.itemStyle).hover(
        function() {
          $(this).css(cur.itemHoverStyle);
        },
        function(){
          $(this).css(cur.itemStyle);
        }
      ).find('img').css({verticalAlign:'middle',paddingRight:'2px'});
  
      // Send the content to the menu
      menu.html(content);
  
      // if there's an onShowMenu, run it now -- must run after content has been added
  		// if you try to alter the content variable before the menu.html(), IE6 has issues
  		// updating the content
      if (!!cur.onShowMenu) menu = cur.onShowMenu(e, menu);
  
      $.each(cur.bindings, function(id, func) {
        $('#'+id, menu).bind('click', function(e) {
          hide();
          func(trigger, currentTarget);
        });
      });
      menu.css({'left':(e[cur.eventPosX] - cur.offsetx),'top':e[cur.eventPosY]}).show();
      if (cur.shadow) shadow.css({width:menu.width(),height:menu.height(),left:(e.pageX+2 - cur.offsetx),top:e.pageY+2}).show();
      $(document).one('click', hide);
    }
  
    function hide() {
      menu.hide();
      shadow.hide();
    }
  
    // Apply defaults
    $.contextMenu = {
      defaults : function(userDefaults) {
        $.each(userDefaults, function(i, val) {
          if (typeof val == 'object' && defaults[i]) {
            $.extend(defaults[i], val);
          }
          else defaults[i] = val;
        });
      }
    };
  
  })(jQuery);