//
//	Librairie by The Rubik's Man
//		    © 2005-2006
//

/*==================================================================================================================*/
/*==================================================================================================================*/
/*===>					--------------------------------------------------------------------------					         <====*/
/*===>					|        Librairie Menu Contextuel par The Rubik's Man       |					         <====*/
/*===>					--------------------------------------------------------------------------					         <====*/
/*===>   -- 2 Methodes provenant de la librairie open source " prototype.js " : Class.create() et Function.prototype.bind()	         <====*/
/*===>																			         <====*/
/*===>   -- Installation d'un menu contextuel personnalise tres simple avec ou sans image ( a droite ou a gauche )			         <====*/
/*===>																			         <====*/
/*===>							          © The Rubik's Man ©								         <====*/
/*===>																			         <====*/
/*===>	Plan du fichier : 	1)	Extrait de la librairie  "prototype" (2 fonctions)		(ligne 28 -> 42)			         <====*/
/*===>				2)	Librairie de creation du menu contextuel			(ligne 56 ->221)			         <====*/
/*===>																			         <====*/
/*==================================================================================================================*/
/*==================================================================================================================*/

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//									Extrait de la librairie PROTOTYPE								//
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Permet avec la syntaxe " var maClasse = Class.create() " d'instancier une nouvelle classe et d'appeler la methode " initialize() " de cette classe
// la methode " initialize() " est considere comme le constructeur de la classe
var Class = {
	create: function() {
		return function() {
			this.initialize.apply(this, arguments);
		}
	}
}
// Permet de contrer le moteur javascript dans un bug de reference de fonction
// Generalement utilisee dans les methodes onComplete... onLoad... etc pour faire reference a l'objet en cours
Function.prototype.bind = function(object) {
	var __method = this;
	return function() {
		return __method.apply(object, arguments);
	}
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//									Fin Extrait de la librairie PROTOTYPE							//
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////



//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////   Debut librairie principale Menu_Contextuel      ///////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/*  				Contextuel Menu javascript creation
 *	  Copyright (c) 2006 Peter BUGAN ( alias The Rubik's Man)  <ocbslim@tiscali.fr>
 *	  		Free but protected by the Apache License 2.0
*/
var Menu_Contextuel = Class.create();
Menu_Contextuel.prototype = {
		// Constructeur du menu contextuel
		initialize : function (itemArray,options,idDiv,typeMenu,originalBC) {
			// Enregistrement du tableau des elements du menu
			this.items = itemArray;
				
			// Enregistrement des parametres de style //
			// Style de la boite principale
			this.menu_style = 'z-index:500;'+
							  'position:absolute;'+
							  'width:200px;'+
							  '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;';
			// Style de la boite ombree
			this.shadow_style = 'z-index:400;'+
								'position:absolute;'+
								'width:200px;'+
								'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;';
			// Style des items lors du focus
			this.focusOn_style = 'background:'+options.focusOn.background+';'+
								 'color:'+options.focusOn.color+';';
			// Style des items lors du non focus
			this.focusOff_style = 'background:'+options.focusOff.background+';'+
								  'color:'+options.focusOff.color+';';
			// Style des lignes de separation
			this.separator_style = 'size='+options.separator.size+' '+
								   'color='+options.separator.color+' ';
			// Valeur de la profondeur de l'ombre
			this.shadow_padding = options.shadow_padding;
			// -----------------------------------------------------------  //
				
			this.create_html(); // Creation du code HTML du menu contextuel
			this.set_listener(); // Instanciation des ecouteurs de mouvement, de clic gauche et droit de la souris
			this.idDiv = idDiv; 
			this.typeMenu = typeMenu;
			this.originalBC = originalBC; 
		},
		
		// Fonction permettant de capturer les coordonnees de la souris sur tous les navigateurs
		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;
		},
		
		// Fonction permettant d'ouvir le menu contextuel lors d'un clic droit de la souris
		open: function() {
			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;
		},
			
		// Fonction permettant de fermer le menu contextuel
		close: function() {
			
			//document.getElementById('MC_'+this.idDiv).style.backgroundColor=this.originalBC;
			document.getElementById('MC_'+this.idDiv).parentNode.style.border='';


			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";
		},
		
		// Fonction permettant de creer le code html du menu contextuel
		create_html: function() {
			// Generation du code HTML des 2 div
			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;" src="'+this.items[i].Image.url+'" height="15" width="15">'
					);
					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="15" width="15">'
					);
					html_code_item += '<div style="padding-left:15px;padding-right:7px;'+this.focusOff_style+'">'+imageLeft+this.items[i].ItemName+imageRight+'</div>';
					html_code_ombre += '<div style="padding-left:15px;padding-right:7px;">&nbsp;</div>';
				}
				else {
					html_code_item += '<hr '+this.separator_style+'>';
					html_code_ombre += '<hr '+this.separator_style+'>';
				}
			}
			html_code_item += '</div>';
			// Fin de generation du code HTML
				
			// Integration du code html dynamiquement dans le document en cours
			// On cree l'element
			var tempDiv = document.createElement('div');
			tempDiv.id = 'menu_contextuel_div';
			tempDiv.innerHTML = '<div style="'+this.menu_style+'">'+html_code_item+html_code_ombre+'</div>';
				
			// Si le container existe deja alors on le supprime
			if (document.getElementById('menu_contextuel_div')) document.body.removeChild(document.getElementById('menu_contextuel_div'));
			// Puis on integre le nouveau menu contextuel a la suite du code courant de la page
			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+
					 '}'
					);
			}
		},
		
		// Fonction permettant d'attribuer les ecouteurs des evenements souris
		set_listener: function() {
			document.onmousemove = this.mousePositionCapture.bind(this);
			document.oncontextmenu = this.open.bind(this);
			
			// OnClick
			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);
				}
			}
		}
};
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////   Fin librairie principale Menu_Contextuel      ///////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

//
//	Librairie by The Rubik's Man
//		    © 2005-2006
//
