dojo.declare("WW.CategoryMenu", null, {

    constructor: function(args) {
        dojo.mixin(this, args);
        this.id = "CategoryMenu" + this.id;
        this.menu = dojo.byId(this.id);
        this.setOpacity();
		this.addEffects();
        this.replaceSubcats();
	},

	_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 cats = dojo.query(".cat", this.menu);
	    dojo.forEach(cats, function(cat) {
	        cat.parentTable = cat.parentNode.parentNode;
	        cat.subcat = dojo.byId("sub"+cat.id);
	        cat.url = dojo.query("a", cat)[0].href;
			cat.fxOver = dojo.fadeIn({node: cat, end: this.over, duration: this.duration, rate: 40});
			cat.fxOut = dojo.fadeOut({node: cat, end: this.out, duration: this.duration, rate: 40});
			dojo.connect(cat, "onmouseenter", this, "onMouseEnterMenu");
			dojo.connect(cat, "onmouseleave", this, "onMouseLeaveMenu");
			dojo.connect(cat, "onclick", this, "onMouseClick");
		}, this);
	},

	replaceSubcats: function() {
	    this.subcats = dojo.query(".subcat", this.menu);
		dojo.forEach(this.subcats, function(subcat) {
		  if (dojo.isIE) subcat.style.opacity = 1;
	        subcat.fxOver = dojo.fadeIn({node: subcat, end: 1, duration: this.duration, rate: 40});
	        subcat.fxOut = dojo.fadeOut({node: subcat, end: 0, duration: this.duration, rate: 40, onEnd: function() {subcat.style.display = "none";}});
	        dojo.connect(subcat, "onmouseenter", this, "onMouseEnterSubcat");
			dojo.connect(subcat, "onmouseleave", this, "onMouseLeaveSubcat");
	        subcat.parentMenu = subcat.parentNode.parentNode;
         	if (subcat.parentMenu.parentTable.id == this.id) {
				dojo.place(subcat, dojo.body(), "last");
				subcat.parentMenu.level0 = true;
			} else subcat.parentMenu.level0 = false;
		}, this);
		dojo.forEach(this.subcats, function(subcat) {
		    subcat.style.display = "none";
		});
	},

	onMouseEnterSubcat: function(e) {
		var subcat = e.currentTarget;
		this.onMouseEnterMenu(e);
		subcat.parentMenu.fxOut.stop();
		subcat.parentMenu.fxOver.play();
	},

	onMouseLeaveSubcat: function(e) {
	    var subcat = e.currentTarget;
	    if (subcat.parentMenu.parentTable.id == this.id) {
	        subcat.parentMenu.fxOver.stop();
			subcat.parentMenu.fxOut.play();
			subcat.fxOver.stop();
			subcat.fxOut.play();
		}
	},

	onMouseEnterMenu: function(e) {
	    var subcat, cat;
	    cat = e.currentTarget;
	    cat.fxOut.stop();
    	cat.fxOver.play();
	    if (cat.subcat != null) {
	        if (cat.level0) {
         	    var pos = dojo.position(cat, true);
		        cat.subcat.style.top = pos.y + "px";
		    	cat.subcat.style.left = pos.x + pos.w + "px";
			}
			cat.subcat.style.display = dojo.isIE? "block" : "table";
	        cat.subcat.fxOut.stop();
	        cat.subcat.fxOver.play();
		}
	},

	onMouseLeaveMenu: function(e) {
	    var cat = e.currentTarget;
	    if (cat.subcat != null) {
	        cat.subcat.fxOver.stop();
	        cat.subcat.fxOut.play();
		}
	    cat.fxOver.stop();
	    cat.fxOut.play();
	},

	onMouseClick: function(e) {
	    location.href = e.currentTarget.url;
	}
	
});
