/*
 * 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;
	var defaults = {
menuStyle: {
listStyle: 'none',
padding: '1px',
margin: '0px',
backgroundColor: '#fff',
border: '1px solid #999',
width: '200px'
			  },
itemStyle: {
margin: '0px',
color: '#000',
display: 'block',
cursor: 'default',
padding: '3px',
border: '1px solid #fff',
backgroundColor: 'transparent'
			  },
itemHoverStyle: {
border: '1px solid #0a246a',
backgroundColor: '#b6bdd2'
			  },
eventPosX: 'pageX',
eventPosY: 'pageY',
shadow : true,
onContextMenu: null,
onShowMenu: null
	};

	$.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
		});

		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;
		});
		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);
			});
		});

		var altomenu = menu.height();
		var topmenu = Math.ceil(altomenu/2);
		if (altomenu < 50)
			topmenu = 50
		var topshadow = topmenu-5;
		
		menu.css({'left':e[cur.eventPosX],'top':e[cur.eventPosY]-topmenu}).show();
		//alert("Alto menu:" + altomenu)
		if (cur.shadow) shadow.css({width:menu.width(),height:menu.height(),left:e.pageX+5,top:e.pageY-topshadow}).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);

$(function() {
	$('div.contextMenu').hide();
});
