(function($) {
	var menu, shadow, trigger, content, hash, currentTarget;
	var defaults = {
		tagStyle:	{
			margin	:	'0.5em',
			width	:	'100px'
		},
		eventPosX: 'pageX',
		eventPosY: 'pageY',
		shadow : true
	};
	
	$.fn.tagMenu = function(id, options) {
		if (!menu) {	// Create singleton menu
			menu = $('<div CLASS="tagStyle"></div>')
				.hide()
				.css({position:'absolute', zIndex:'500'})
				.appendTo('body')
				.bind('click', function(e) {
					e.stopPropagation();
				});
		}
		if (!shadow) {
			shadow = $('<div CLASS="tagStyle"></div>')
				.css({backgroundColor:'#000',position:'absolute',opacity:0.2,zIndex:499})
				.appendTo('body')
				.hide();
		}
		hash = hash || [];
		hash.push({
			id : id,
			bindings: options.bindings || {},
			shadow: options.shadow || options.shadow === false ? options.shadow : defaults.shadow,
			eventPosX: options.eventPosX || defaults.eventPosX,
			eventPosY: options.eventPosY || defaults.eventPosY
		});

		var index = hash.length - 1;
		$(this).bind('click', function(e) {
			display(index, this, e, options) ;
			return false;
		});
		return this;
	};
	
	function display(index, trigger, e, options) {
		var cur = hash[index];
		menu.append($('#'+cur.id).children());
		
		$.each(cur.bindings, function(id, func) {
			$('#'+id, menu).bind('click', function(e) {
				fadeOut('slow');
				func(trigger, currentTarget);
			});
		});
		
		menu.fadeOut('fast',function(){
			menu.find(':input[@name=tags]').val('') ;
			menu.css({'left':e[cur.eventPosX],'top':e[cur.eventPosY]})
				.fadeIn('fast',function(){
					var	data		=	$(trigger).attr('rel').split(':') ;
					var	plain_text	=	$.ajax({
						type	:	"POST" ,
						url		:	"/tag/loader" ,
						data	:	{
									db		:	data[0] ,
									record	:	data[1]
									},
						async	:	false
					}).responseText ;
					menu.find(':input[@name=tags]').focus().val(plain_text) ;
					menu.find(':hidden[@name=db]').val(data[0]) ;
					menu.find(':hidden[@name=record]').val(data[1]) ;
				});
		}) ;
		if (cur.shadow) shadow.fadeOut('fast',function(){
			shadow.css({width:menu.width(),height:menu.height(),left:e.pageX+3,top:e.pageY+3}).fadeIn('fast');
		}) ;
		$(document).one('click', hide);
	}
	
	function hide() {
		menu.fadeOut('slow');
		shadow.fadeOut('slow');
	}
	
	// Apply defaults
	$.tagMenu = {
		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.tagMenu').hide();
});