var Class = {
	create: function() {
		return function() {
			this.initialize.apply(this, arguments);
		}
	}
}

Function.prototype.bind = function(object) {
	var __method = this;
	return function() {
		return __method.apply(object, arguments);
	}
}

function get_offsetYX(el, elPar)
{ 
	if( ! elPar ) elPar = document.body;
	if( elPar != document.body )
	{
	   var XY_P =  get_offsetYX( elPar );
	   var XY_E =  get_offsetYX( el );
		return Array( XY_E[0] - XY_P[0] , XY_E[1] - XY_P[1] );
	 }
	 var offY=0; var offX=0;
	 while( el.offsetParent ){  offY += el.offsetTop;  offX += el.offsetLeft;
								el = el.offsetParent;
								if (el.style.marginLeft != 0)
								{
									offX += parseInt(el.style.marginLeft); 
								}
								if (el.style.marginTop != 0)
								{
									offX += parseInt(el.style.marginTop); 
								}
	 } return Array(offY, offX);
}

var Menu_Contextuel = Class.create();
Menu_Contextuel.prototype = {
		initialize : function (itemArray,options)
		{
			this.items = itemArray;
			this.menu_style = 'z-index:500;'+
							  'position:absolute;'+
							  'width:300px;'+
							  'border:1px solid '+options.menu_color.shadow+';'+
							  'background-color:'+options.menu_color.background+';'+
							  'font-family:Microsoft sans serif;'+
							  'font-size:12px;'+
							  'cursor:default;'+
							  'visibility:hidden;'+
							'padding:3;';
			this.shadow_style = 'z-index:400;'+
								'position:absolute;'+
								'width:300px;'+
								'border:1px solid '+options.menu_color.shadow+';'+
								'background-color:'+options.menu_color.shadow+';'+
								'font-family:Microsoft sans serif;'+
								'font-size:12px;'+
								'color:'+options.menu_color.shadow+';'+
								'cursor:default;'+
								'visibility:hidden;'+
								'padding:3;filter:alpha(opacity=60);-moz-opacity:0.6;opacity: 0.6;';
			this.focusOn_style = 'background:'+options.focusOn.background+';'+
								 'color:'+options.focusOn.color+';';
			this.focusOff_style = 'background:'+options.focusOff.background+';'+
								  'color:'+options.focusOff.color+';';
			this.separator_style = 'size='+options.separator.size+' '+
								   'color='+options.separator.color+' ';
			this.shadow_padding = options.shadow_padding;
			this.create_html();
			this.set_listener();
		},

		mousePositionCapture: function(e)
		{
			var event = typeof window.event != 'undefined' ? window.event : e;
			var Xfen, Xdoc, Yfen, Ydoc, el, scrollL, scrollT;
			if ( document.documentElement.scrollLeft != 0 ) scrollL = document.documentElement.scrollLeft;
			else if ( document.body.scrollLeft != 0 ) scrollL = document.body.scrollLeft;
			else scrollL = 0;
			if ( document.documentElement.scrollTop != 0 ) scrollT = document.documentElement.scrollTop;
			else if ( document.body.scrollTop != 0 ) scrollT = document.body.scrollTop;
			else scrollT = 0;
			Xfen = event.clientX;
			Xdoc = Xfen + scrollL;
			Yfen = event.clientY;
			Ydoc = Yfen + scrollT;

			this.mouse_x = Xdoc;
			this.mouse_y = Ydoc;
		},
		
		open: function()
		{
			if (document.body)
			{
				var larg = (document.body.clientWidth);
				var haut = (document.body.clientHeight);
			}
			else
			{
				var larg = (window.innerWidth);
				var haut = (window.innerHeight);
			}
			if (this.mouse_y + document.getElementById("menu_contextuel_div").firstChild.offsetHeight > haut)
				this.mouse_y -= document.getElementById("menu_contextuel_div").firstChild.offsetHeight;
			if (this.mouse_x + document.getElementById("menu_contextuel_div").firstChild.offsetWidth > larg)
				this.mouse_x -= document.getElementById("menu_contextuel_div").firstChild.offsetWidth;
			document.getElementById("menu_contextuel_div").firstChild.style.top = this.mouse_y+'px';
			document.getElementById("menu_contextuel_div").firstChild.style.left = this.mouse_x+'px';
			document.getElementById("menu_contextuel_shadow_div").style.top = this.mouse_y+parseInt(this.shadow_padding)+'px';
			document.getElementById("menu_contextuel_shadow_div").style.left = this.mouse_x+parseInt(this.shadow_padding)+'px'
			document.getElementById("menu_contextuel_div").firstChild.style.visibility = "visible";
			document.getElementById("menu_contextuel_shadow_div").style.visibility = "visible";
			return false;
		},

		close: function()
		{
			document.getElementById("menu_contextuel_div").firstChild.style.top = 0;
			document.getElementById("menu_contextuel_div").firstChild.style.left = 0;
			document.getElementById("menu_contextuel_shadow_div").style.top = 0;
			document.getElementById("menu_contextuel_shadow_div").style.left = 0;
			document.getElementById("menu_contextuel_div").firstChild.style.visibility = "hidden";
			document.getElementById("menu_contextuel_shadow_div").style.visibility = "hidden";
		},
		
		create_html: function()
		{
			var html_code_ombre = '<div id="menu_contextuel_shadow_div" style="'+this.shadow_style+'">';
			var html_code_item = '';
			var background_focusOn = this.focusOn_style.split(';')[0].split(':')[1];
			var background_focusOff = this.focusOff_style.split(';')[0].split(':')[1];
			var color_focusOn = this.focusOn_style.split(';')[1].split(':')[1];
			var color_focusOff = this.focusOff_style.split(';')[1].split(':')[1];
				
			for(var i=0;i<this.items.length;i++) {
				if (this.items[i].ItemName != null) {
					var imageLeft = this.items[i].Image == null ?
						''	:	(this.items[i].Image.position == 'right' ?
									''	:	'<img valign=bottom style="position:absolute;left:1px;right:5px;" src="'+this.items[i].Image.url+'" height="16" width="16">&nbsp;&nbsp;'
					);
					var imageRight = this.items[i].Image == null ?
						''	:	(this.items[i].Image.position == 'left' ?
									''	:	'<img valign=bottom style="position:absolute;right:1px;" src="'+this.items[i].Image.url+'" height="16" width="16">'
					);
					html_code_item += '<div style="padding:2px;padding-left:25px;padding-right:7px;'+this.focusOff_style+'">'+imageLeft+this.items[i].ItemName+imageRight+'</div>';
					html_code_ombre += '<div style="padding:2px;padding-left:25px;padding-right:7px;">&nbsp;</div>';
				}
				else {
					html_code_item += '<hr '+this.separator_style+'>';
					html_code_ombre += '<hr '+this.separator_style+'>';
				}
			}
			html_code_item += '</div>';

			var tempDiv = document.createElement('div');
			tempDiv.id = 'menu_contextuel_div';
			tempDiv.innerHTML = '<div style="'+this.menu_style+'">'+html_code_item+html_code_ombre+'</div>';

			if (document.getElementById('menu_contextuel_div')) document.body.removeChild(document.getElementById('menu_contextuel_div'));
			document.body.appendChild(tempDiv);
				
			var i = 0;
			var divItem = null;
			while (divItem = document.getElementById('menu_contextuel_div').firstChild.childNodes[i++]) {
				divItem.onmouseover = function(){
					this.style.background = background_focusOn;
					this.style.color = color_focusOn;
				}
				divItem.onmouseout = function(){
					this.style.background = background_focusOff;
					this.style.color = color_focusOff;
				}
				eval('divItem.onclick = function(){'+
						'document.onclick();'+
						this.items[i-1].Action+
					 '}'
					);
			}
		},
		
		set_listener: function()
		{
			document.onmousemove = this.mousePositionCapture.bind(this);
			document.oncontextmenu = this.open.bind(this);

			var oldOnClick = document.onclick;
			var addedFunc = this.close.bind(this);
			if (typeof (document.onclick) != 'function')
				document.onclick = addedFunc;
			else
			{
				document.onclick = function(e)
				{
					oldOnClick(e);
					addedFunc(e);
				}
			}
		}
};
