/*
originally Written by: Adam Crownoble (adam@bryan.edu)
Date: April 3 2006
modified for Up Menu by: WebService Unisi.ch
Date: September 5 2007
License: LGPL (http://www.gnu.org/copyleft/lesser.html)
Dependencies: mootools (mootools.net)
*/

var DropUpMenu = new Class({

	initialize: function(menuElement) {

	this.menu = menuElement;
	this.expandedCount = 0;
	this.id = menuElement.id;
	this.duration = 250;
	this.buttons = [];
  
	this.locked = false;
	this.switchedOn = false;
	this.switchedElement; 
	this.fixedImg;									/** IMG TO BE KEPT SWITCHED ON **/
	this.switchedElementOriginalValue;
	this.fake;
	this.currentEvent; 
	this.alwaysOnTopSubmenu;
	this.currentSubmenuIsExpanded = false;
	
	$A(this.menu.getElementsByTagName('li')).each(
		function(li) {
			if(li.parentNode == menuElement) { this.buttons.push($(li)); }
		}.bind(this)
	);
  
	this.submenus = $A(this.menu.getElementsByTagName('ul'));

	this.submenus.each(
		function(submenu) {
			submenu = $(submenu);
			submenu.setStyle('display','');
			submenu.originalHeight = submenu.offsetHeight;
			submenu.effectHeight = new Fx.Style(submenu, 'height',{ duration: this.duration, transition:Fx.Transitions.quartOut }).set(0);
			
			submenu.effectTop = new Fx.Style(submenu, 'top',{ duration: this.duration, transition:Fx.Transitions.quartOut }).set(-1);
			submenu.effectOpacity = new Fx.Style(submenu, 'opacity').set(0.93);
	
		}.bind(this)
	);

	this.buttons.each(
		function(button) {
			button.addEvent('mouseover',this.expand.bindAsEventListener(this));
			button.addEvent('mouseout', this.collapse.bindAsEventListener(this));
		}.bind(this)
	);

	},
	
	getEventTarget: function(event) {
		var event = new Event(event);		/* mootools handler */
		return event.target;
	},

	findButton: function(element) {
		var button = false;
		while(element.parentNode) {
			if(this.buttons.test(element)) { button = element; }
			element = element.parentNode;
			}
		return button;
	},

	findSubmenu: function(element) {
		var button = this.findButton(element);
		var submenu = button.getElementsByTagName('ul')[0];
		return submenu;
	},
 
	switchOnOpenItem: function(element) {
		
		/**/ this.locked = true;   
		if (!this.switchedOn) {

			/**/ this.switchedOn = true;
			var button = this.findButton(element);
			var subImg = button.getElementsByTagName('img')[0];

			if (this.fixedImg && subImg == this.fixedImg) {
				this.locked = false;
				return;
			}
			
			/**/ this.switchedElement = subImg;
			var subImgPath 	= subImg.src;
			/**/ this.switchedElementOriginalValue = subImgPath;
			var subImgArray 	= subImgPath.split("/");
			var subImgName 	= subImgArray[subImgArray.length-1];
			var subImgNameArray = subImgName.split(".");
			var subImgFileName	= subImgNameArray[0];
			var newSubImgFileName = subImgFileName + "Over";
			var newSubImgPath = subImgPath.replace(subImgFileName, newSubImgFileName);
	
			subImg.src = newSubImgPath;
		}
		/**/ this.locked = false;
	},

	switchOffOpenItem: function(element) {

		/**/ this.locked = true; 
		if ($(element) == $(this.fixedImg)) {
			this.locked = false;
			return;	
		}
		
		if (this.switchedOn) {
		
			
				/**/ this.switchedOn = false;
				/**/ this.switchedElement.src = this.switchedElementOriginalValue;

		
		
		}
		/**/ this.locked = false;
	},

	expand: function(event) {
		var submenu = this.findSubmenu(this.getEventTarget(event));
		// customization
		// accendere main menu se non è già acceso
		var triggeredElement = this.getEventTarget(event);
		if (!this.locked) this.switchOnOpenItem(triggeredElement);
		//if (!this.locked && ($(triggeredElement).getTag() == "img")) this.switchOnOpenItem(triggeredElement);
		
		if(submenu) {
			this.expandedCount++;
			submenu.effectHeight.clearTimer();
			submenu.effectTop.clearTimer();
			submenu.effectHeight.start(submenu.originalHeight);
			submenu.effectTop.start(-(submenu.originalHeight+1));
		}

	},

	collapse: function(event) {
		
		var submenu = this.findSubmenu(this.getEventTarget(event));

		// customization
		// spegnere main menu se non è già spento
		var triggeredElement = this.getEventTarget(event);
		if (!this.locked) this.switchOffOpenItem(triggeredElement);
		//if ((!this.locked) && ($(triggeredElement).getTag() == "img")) this.switchOffOpenItem(triggeredElement);


		if((submenu) && (submenu.id != this.alwaysOnTopSubmenu)) {
			this.expandedCount--;
			submenu.effectHeight.clearTimer();
			submenu.effectTop.clearTimer();
			submenu.effectHeight.start(0);
			submenu.effectTop.start(-1);
		}
		
	}

});