/**
 * @author Alain Duchesneau (aduchesneau à terrainmarketing point com)
 */

var MenuController =  new Class({
	currentItem: null,
	currentItemId: '',
	cancelHoverOut: false,
	
    initialize: function() {
	},
	
   addEventListener: function(obj) {
		obj.addEvent('hoverIn',this.onHoverInLayer.bind(this));
		obj.addEvent('setHoverOut',function(){
			this.cancelHoverOut = false;
		}.bind(this));
		obj.addEvent('hoverOut',this.onHoverOutLayer.bind(this));
	},
	
	onCloseCurrent: function() {
		if (this.currentItem) {
			this.currentItem.close();
			this.currentItem = null;
			this.currentItemId = '';
		}
	},

    onHoverInLayer: function(target,doHover) {
		if (interfaceActive) {
			if (this.currentItem) 
				this.currentItem.close();
			
			this.currentItem = target;
			this.currentItemId = target.id;
			
			if (doHover) {
				this.currentItem.open();
				this.cancelHoverOut = true;
			}
		}
	},
	
    onHoverOutLayer: function() {
		if (!this.cancelHoverOut && interfaceActive) {
			if (this.currentItem) {
				this.currentItem.close();
				this.currentItem = null;
				this.currentItemId = '';
			}
		}
	}
});

var MenuItem =  new Class({
    Implements: Events,
	anchor: null,
	hoverImage:null,
	id: null,
	isSelected: false,
	MOUSELEAVE_TIMEOUT:2000,
	
    initialize: function(a) {
		this.anchor = a;
		this.hoverImage = this.anchor.getNext('div');
		this.hoverImage.fade('hide');
		this.hoverImage.set('tween', {duration:250});
		this.id = this.hoverImage.id;
		this.isSelected = this.anchor.getParent('li').hasClass('selected');
		if (!this.isSelected) {
			this.anchor.addEvent('mouseenter',function(evt){
				this.fireEvent("hoverIn", [this, true]);
			}.bind(this));
			this.hoverImage.addEvent('mouseenter',function(evt){
//				console.log('hoverImage mouseenter');
				this.fireEvent("hoverIn", [this, true]);
			}.bind(this));
			this.hoverImage.addEvent('mouseleave',function(evt){
				this.fireEvent("setHoverOut");
				this.fireEvent("hoverOut", [this],this.MOUSELEAVE_TIMEOUT);
			}.bind(this));
			this.swapClick();
		} else {
			this.anchor.addEvent('mouseenter',function(evt){
				this.fireEvent("hoverIn", [this, false]);
			}.bind(this));
			
		}
	},
	swapClick: function () {
		this.hoverImage.addEvent('click', function(el){
			document.location = this.anchor.href;
		}.bind(this));
	},
	
	open: function(){
		this.hoverImage.fade('in');
	},
	close: function(){
		this.hoverImage.fade('out');
	}
});

var MenuLayer =  new Class({
    Extends: MenuItem,
	  layer: null,
    initialize: function(a) {
		var aSubItem;
		this.parent(a);
		this.layer = this.hoverImage.getElement('div');
		if (!this.isSelected) {
			this.layer.addEvent('mouseenter', function(evt){
				this.fireEvent("hoverIn", [this, true]);
			}.bind(this));
		}
		this.layer.getElements('li[class=subItem]').each(function(el){
			aSubItem = new SubMenu(el);
		}.bind(this));
	},
	swapClick: function () {
		return;
	}
});
/*
var SubMenu = new Class({
    Implements: Events,
	parentItem: null, /* LI */
/*
	anchor: null,
	layerMenu:  null,
	layerID:  null,
	hasSubMenu: false,
	
    initialize: function(pi) {
		this.parentItem = pi;
		this.anchor = this.parentItem.getElement('a');
		if (this.anchor) {
			var pin = this.anchor.getNext('div');
			if (pin) {
				this.layerMenu = pin.getElement('div');
				if (this.layerMenu) {
					this.hasSubMenu = true;
					this.layerID = this.layerMenu.id;
					this.parentItem.addEvent('mouseenter',this.onMouseEnter.bind(this));
					this.parentItem.addEvent('mouseleave',this.onMouseLeave.bind(this));
				}
			}
		}
	},
	
	onMouseEnter: function (evt) {
		if (interfaceActive) {
			this.layerMenu.setStyle('visibility', 'visible');
		}
	},
	
	onMouseLeave: function (evt) {
		if (interfaceActive) {
			this.layerMenu.setStyle('visibility', 'hidden');
			/*(function(){
				Cufon.refresh('.subItem > a');
			}.bind(this)).delay(1);*/
/*
    }
	}
	
});
*/

var MenuPrincipal = new Class({
    Implements: Events,
	controller: null,
	items: [],
	
    initialize: function(selecteur){
	
		this.controller = new MenuController();
		this.addEvent('closecurrent',function(e){
			this.controller.onCloseCurrent();
		});
		
		$$(selecteur).each(function(el){
			var item = (el.getNext('div').getElement('div')) ? new MenuLayer(el) : new MenuItem(el) ;
			this.controller.addEventListener(item);
			this.items.push(item);

		}.bind(this));
	}
	
});


