aEqx.version ("Menu Pat","1.0") ;

function Console(mesg,typeConsole) {
	if (Browser.Engine.gecko) {
		if (typeConsole=="debug") {
			console.debug(mesg);
		}
		else if (typeConsole=="info") {
			console.info(mesg);
		}
		else if (typeConsole=="warning") {
			console.warn(mesg);
		}
		else return;
	}
	else { return ;}
}



Element.implement({

		hide: function(options) {
			if (options.o_afficheSousMenu=='false') {
				this.timerHide=(function action() {
					this.setStyle('display','none')
				}).delay(options.o_delay,this);
				}
		},
		show: function(options) {
			if (options.o_afficheSousMenu=='false') {
				this.timerShow=(function action() {
					this.setStyle('left',this.m_x);
					this.setStyle('top',this.m_y);
					this.setStyle('position', 'absolute'); // indispensable pour le menu contectuel
					this.setStyle('display','block');
				}).delay(options.o_delay,this);
			}
		},
		setActive:function(keepPathActive) {
			// ajout d'une classe active à l'élément
			// Pour lui donner un style
			if (keepPathActive == 'true')	this.addClass('active');
		},
		setDeactive: function() {
			// Pour lui enlever le style précédent
			this.removeClass('active');
		},
		
		setEffet: function(effet) {
			// on associe des effets
			// On aurait des effets 
		},
		

		calculPosition : function (event,isContextMenu,constraintToViewPort) {
			
			if (isContextMenu) {
				this.m_x = event.client.x;
				this.m_y = event.client.y;
				this.getFirst().getSizeItemMenu();
				// TBD à faire prendre la taille largeur du fils ? Est-ce nécessaire ?
				
				return;
			}
			
			if (this.hasClass('bottomLeft')) this.typePosSousMenu = 'bottomLeft';
			else if (this.hasClass('topRight')) this.typePosSousMenu = 'topRight';
			else if (this.hasClass('bottomMiddle')) this.typePosSousMenu = 'bottomMiddle';
			else ;
			
			var elementPere = this.getParent();
			var widthPere = elementPere.getStyle('width').toInt();
			var heightPere = elementPere.getStyle('height').toInt();
			var availableSize=this.getParent('body').getSize();

			
			
			if (this.typePosSousMenu =='bottomLeft') { 
				// Pas d'offset sinon prb de capture de souris onEnter et onLeave, on perd le focus ...
				this.m_x = 0;
				this.m_y = heightPere; 

				
			}
			else if (this.typePosSousMenu=='topRight') {
				this.m_x = widthPere;
				this.m_y = 0;
				if((this.m_width + this.getParent().getCoordinates().right) && constraintToViewPort >= availableSize.x) {
					if (this.hasClass('Hmenu')) { 
						this.m_x = -(this.m_width);
						var m = this.getPath() +" li";
						$$( m ).setStyles({
							'float':'right'
						});	
					}
					else this.m_x = -(widthPere);
				}

			}
			else if (this.typePosSousMenu=="bottomMiddle") {
				this.m_x = widthPere/2;
				this.m_y = heightPere;
				if((this.m_width + (this.getParent().getCoordinates().left+widthPere/2)&& constraintToViewPort)>= availableSize.x) {
					this.m_x=0;
				}
			}
			else ; // peut être le menu principal
			
			
		
		},
		initCss: function(path) { 
			// Est appelé par un menu (<ul>)
			var CssPath_li = path + " li";
			var width = 0;
			// on affecte le menu de ses propriétés Css en fonction des attributs Html
			// la responsabilité est d'initialiser l'élément ses li et ses éventuels ul (sous menu)
			$$(CssPath_li +" a" ).setStyles({
				'display':'block'
			});			
			if (this.hasClass('Hmenu')){// On affecte les sous menu
				$$(CssPath_li ).setStyles({
					'clear':'none',
					'float':'left',
					'position':'relative',
					'cursor':'pointer'
				});
				// determiner le width :
				
				this.getChildren().each(function(element) {
					width += element.getStyle('width').toInt(); 
					width += element.getStyle('padding-left').toInt();
					width += element.getStyle('padding-right').toInt();
					width += element.getStyle('margin-left').toInt();
					width += element.getStyle('margin-right').toInt();
					width += element.getStyle('border-right').toInt();
					width += element.getStyle('border-left').toInt();
				});
				this.setStyle('width',width);
				this.m_width = width;
			}
			else if (this.hasClass('Vmenu')) {
				$$(CssPath_li ).setStyles({
					clear:'left',
					position:'relative'
				});	
				// Le width est celui d'un de ses enfants (n'importe lequel)
				this.getFirst().getSizeItemMenu();
			}
			if(this.hasClass('eqxMenu') ) { // On affiche sauf si contextuel
				$$('eqxMenu').setStyles({// On traite le <ul>
					'display':'block',
					'position':'relative'
				});
				$$(CssPath_li).setStyles({
					'display':'block'
				});
				
			}
			else {// On a un menu fils de ...
					$$(path).setStyles({// On traite le <ul>
					'position':'absolute'
				});			
	
			}
			
			
		},
		getPath:function() {
			if (this.hasClass('eqxMenu')) return "ul.eqxMenu" ;
			else {
				var parent = this.getParent() ;
				if ($(parent).get('tag') == 'ul') return $(parent).getPath() + " ul";
				else return (this.getParent().getPath() );
			}
		},
		getSizeItemMenu: function() {
			var width = 0 ; var height=0;
			width += this.getStyle('width').toInt(); 
			width += this.getStyle('padding-left').toInt();
			width += this.getStyle('padding-right').toInt();
			width += this.getStyle('margin-left').toInt();
			width += this.getStyle('margin-right').toInt();
			width += this.getStyle('border-right').toInt();
			width += this.getStyle('border-left').toInt();	
			//
			height += this.getStyle('height').toInt(); 
			height += this.getStyle('padding-top').toInt();
			height += this.getStyle('padding-bottom').toInt();
			height += this.getStyle('margin-top').toInt();
			height += this.getStyle('margin-bottom').toInt();
			height += this.getStyle('border-top').toInt();
			height += this.getStyle('border-bottom').toInt();		
			this.m_width = width ;
			this.m_height = height;
		},
		
		setEventContextMenu: function(options) {
			var eventMenuOpen = 'ClickDroit';
			var eventMenuClose = "click";
			var  me = this;
			var parent = this.getParent('html') ;
			Element.Events.ClickDroit = {
				base:'click',
				condition:function(event){
					return ((event.which == 3) || (event.button == 2));
				}
			
			}
			parent.addEvent("contextmenu", function(event) {
				me.setActive(options.o_keepPathActive);
				me.calculPosition(event,true,options.o_constraintToViewPort);
				me.show(options);		
				event.stop(); 
			});
			
			var myElement;
			if(options.o_keepOpen =='false') {
				myElement = me;
			}
			else myElement=parent ;
			myElement.addEvent(eventMenuClose, function(event) {
				me.setDeactive();
				$clear(me.timerShow);
				me.hide(options);
			});	
			
		},
		setEventMenu: function (fils,options) {
			var eventMenuOpen = "mouseenter";
			var eventMenuClose = "";

			if(options.o_keepOpen =='false') {
				eventMenuClose = 'mouseleave';
			}
			else {
				eventMenuClose = 'click'; 
			}
			if (options.o_openOnClick =='false') {
				eventMenuOpen = 'mouseenter';
			}
			else {
				if (this.isContextMenu) eventMenuOpen = 'click'; 
				else eventMenuOpen = 'click'; 
			}
							
			this.addEvent(eventMenuOpen, function(event) {
				this.setActive(options.o_keepPathActive);
				fils.calculPosition(event,false,options.o_constraintToViewPort);
				fils.show(options);
				event.stopPropagation();
			});
			var myElement;
			if(options.o_keepOpen =='false') {
				myElement = this;
			}
			else myElement=this.getParent('html') ;
			myElement.addEvent(eventMenuClose, function(event) {
				this.setDeactive();
				$clear(fils.timerShow);
				fils.hide(options);
			});			
	
		
		}

	});

	var eqxMenu = new Class({

			initialize: function(element, options){
				if (options.o_contextMenu == 'true') {
					element.setStyle('display','none');
					element.setEventContextMenu(options);			
					options.o_contextMenu = false;
				}
				var path = element.getPath() ;
				element.initCss(path);
				$A($(element).getChildren()).each(function(elt) {
					if(elt.get('tag')=='li') { // === ?
						elt.getSizeItemMenu();
						$A($(elt).getChildren()).each(function(eltDown) {
						if (eltDown.get('tag')=='ul') { // === ?
								elt.addClass('hassubmenu') ;
								//eltDown.parent = elt;
								if (eltDown.hasClass('bottomLeft') || eltDown.hasClass('bottomMiddle')) 
									elt.addClass('iconSubMenuBottom');
								else 
									elt.addClass('iconSubMenuRight');
								// si on a un ul c'est un sous menu
								if (options.o_afficheSousMenu == 'false') eltDown.setStyle('display','none');
								else eltDown.setStyle('display','block');

								elt.setEventMenu(eltDown,options);
								new eqxMenu($(eltDown),options); 
						}} );				
					}
				});
			}

	} );
		


