dojo.require("dojo.fx");
dojo.require("dojo.fx.easing");
dojo.require("dojo.NodeList-fx");

dojo.declare("WW.VerticalMenu", null, {

    constructor: function(args) {
        dojo.mixin(this, args);
        this.id = "VerticalMenu"+this.id;
        this.menu = dojo.byId(this.id);
        this.setOpacity();
		this.addEffects();
        this.replaceSubmenus();
	},

	setOpacity: function() {
	    var tag = dojo.isOpera? "td" : "tr";
	    var tags = dojo.query(tag, this.menu);
	    if (dojo.isIE && this.over == 1) this.over = 0.99;
	    dojo.forEach(tags, function(tag) {
		    dojo.style(tag, "opacity", this.out);
		}, this);
		dojo.style(this.menu, "opacity", 1);
	},

	addEffects: function() {
	    var menus = dojo.query(".menu", this.menu);
	    dojo.forEach(menus, function(menu) {
	        menu.parentTable = menu.parentNode.parentNode;
	        menu.submenu = dojo.byId("sub"+menu.id);
	        menu.url = dojo.query("a", menu)[0].href;
	        if (dojo.isOpera) {
	            var tds = dojo.query("#" + menu.id + " > td", menu.parentTable);
				menu.fxOver = tds.fadeIn({end: this.over, duration: this.duration, rate: 40});
				menu.fxOut = tds.fadeOut({end: this.out, duration: this.duration, rate: 40});
			} else {
				menu.fxOver = dojo.fadeIn({node: menu, end: this.over, duration: this.duration, rate: 40});
				menu.fxOut = dojo.fadeOut({node: menu, end: this.out, duration: this.duration, rate: 40});
			}
			dojo.connect(menu, "onmouseenter", this, "onMouseEnterMenu");
			dojo.connect(menu, "onmouseleave", this, "onMouseLeaveMenu");
			dojo.connect(menu, "onclick", this, "onMouseClick");
		}, this);
	},
	
	replaceSubmenus: function() {
	    this.submenus = dojo.query(".submenu", this.menu);
		dojo.forEach(this.submenus, function(submenu) {
	        submenu.fxOver = dojo.fadeIn({node: submenu, end: 1, duration: this.duration, rate: 40});
	        submenu.fxOut = dojo.fadeOut({node: submenu, end: 0, duration: this.duration, rate: 40, onEnd: function() {submenu.style.display = "none";}});
	        dojo.connect(submenu, "onmouseenter", this, "onMouseEnterSubmenu");
			dojo.connect(submenu, "onmouseleave", this, "onMouseLeaveSubmenu");
	        submenu.parentMenu = submenu.parentNode.parentNode;
         	if (submenu.parentMenu.parentTable.id == this.id) {
				dojo.place(submenu, dojo.body(), "last");
				submenu.parentMenu.level0 = true;
			} else submenu.parentMenu.level0 = false;
		}, this);
 		dojo.forEach(this.submenus, function(submenu) {
		    submenu.style.display = "none";
		});
	},
	
	onMouseEnterSubmenu: function(e) {
		var submenu = e.currentTarget;
		this.onMouseEnterMenu(e);
		submenu.parentMenu.fxOut.stop();
		submenu.parentMenu.fxOver.play();
	},
	
	onMouseLeaveSubmenu: function(e) {
	    var submenu = e.currentTarget;
	    if (submenu.parentMenu.parentTable.id == this.id) {
	        submenu.parentMenu.fxOver.stop();
			submenu.parentMenu.fxOut.play();
			submenu.fxOver.stop();
			submenu.fxOut.play();
		}
	},
	
	onMouseEnterMenu: function(e) {
	    var menu = e.currentTarget;
	    menu.fxOut.stop();
    	menu.fxOver.play();
	    if (menu.submenu != null) {
	        if (menu.level0) {
         	    var pos = dojo.position(menu, true);
		        menu.submenu.style.top = pos.y + "px";
		        menu.submenu.style.left = pos.x + pos.w + "px";
			}
	        menu.submenu.style.display = dojo.isIE < 7? "block" : "table";
	        menu.submenu.fxOut.stop();
	        menu.submenu.fxOver.play();
		}
	},
	
	onMouseLeaveMenu: function(e) {
	    var menu = e.currentTarget;
	    if (menu.submenu != null) {
	        menu.submenu.fxOver.stop();
	        menu.submenu.fxOut.play();
		}
	    menu.fxOver.stop();
	    menu.fxOut.play();
	},
	
	onMouseClick: function(e) {
	    location.href = e.currentTarget.url;
	}

});
