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(node, opacity){
		var astr = "DXImageTransform.Microsoft.Alpha";
		var af = function(n, f){
			try {return n.filters.item(astr);}
			catch(e) {return f ? {} : null;}
		};
		var ov = opacity * 100, opaque = opacity == 1;
		node.style.zoom = opaque ? "" : 1;
		if(node.nodeName.toLowerCase() == "tr")
			dojo.query("> td", node).forEach(function(i){
				dojo._setOpacity(i, opacity);
			});
		else if(!af(node)) {
			if(opaque) return opacity;
			node.style.filter += " progid:" + astr + "(Opacity=" + ov + ")";
		} else af(node, 1).Opacity = ov;
		af(node, 1).Enabled = !opaque;
		return opacity;
	},

	setOpacity: function() {
	    if (dojo.isIE == 9) dojo._setOpacity = this._setOpacity;
	    var tag = dojo.isOpera? "td" : "tr";
	    var tags = dojo.query(tag, this.menu);
	    if (dojo.isIE < 9 && 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.link = dojo.query("a", menu)[0];
			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) {
		  if (dojo.isIE) submenu.style.opacity = 1;
			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? "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) {
	  if (e.target.tagName == 'A') e.stopPropagation();
	  else if (e.currentTarget.link.attributes.target) window.open(e.currentTarget.link.href).focus();
		else location.href = e.currentTarget.link.href;
		e.cancelBubble = true;
	}

});
