dojo.require("dojo.fx");
dojo.require("dojo.fx.easing");
dojo.require("dojo.NodeList-fx");

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() {
	    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 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;
	        if (dojo.isOpera) {
                var tds = dojo.query("#" + cat.id + " > td", cat.parentTable);
				cat.fxOver = tds.fadeIn({end: this.over, duration: this.duration, rate: 40});
				cat.fxOut = tds.fadeOut({end: this.out, duration: this.duration, rate: 40});
			} else {
				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) {
	        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 < 7? "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;
	}
	
});
