dojo.require("dojo.uacss");
dojo.require("dojo.window");

dojo.declare("WWDropDown", null, {
	constructor: function(args) {
		this.interval = 300;
		this.hideDur = 300;
		this.rtl = false;
		this.mode = 'opacity';
		dojo.mixin(this,args);
		this.node = dojo.byId(this.id);
		this.space = dojo.isIE9? 3 : 2;
		this.init();
	},
	
	init: function(){
	  this.submenus = dojo.create('div', {id: this.id+'-submenus'}, dojo.body(), 'last');
	  this.parents = dojo.query('.parent', this.node);
	  for (var i=0; i<this.parents.length; ++i) {
	    var dt = this.parents[i++];
	    if (!dt.parentNode.dts) dt.parentNode.dts = new Array();
	    dt.parentNode.dts.push(dt);
			dojo.connect(dt, "onmouseenter", this, "onMouseEnterDT");
			dojo.connect(dt, "onmouseleave", this, "onMouseLeaveDT");
	    dt.submenu = dojo.place(this.parents[i].children[0], this.submenus, 'last');
	    dt.submenu.hover = dojo.style(dt.submenu, this.mode);
			if (dojo.isIE < 8)
				dt.submenu.style.width = dojo.style(dt.submenu, 'width');
	    dt.submenu.parent = dt;
	    dojo.connect(dt.submenu, "onmouseenter", this, "onMouseEnterDL");
	    dojo.connect(dt.submenu, "onmouseleave", this, "onMouseLeaveDL");
	    dojo.style(dt.submenu, this.mode, 0);
	    eval('var prop = {'+this.mode+':'+dt.submenu.hover+'}');
	    dt.submenu.anim = dojo.animateProperty({
				node: dt.submenu,
				properties: prop,
				duration: this.interval
			});
		}
  },
  
  onMouseEnterDT: function(e) {
    var dt = e.currentTarget;
    dojo.addClass(dt, 'open');
    if (dt.timeout) dt.timeout = clearTimeout(dt.timeout);
    var submenu = dt.submenu;
    var p = dojo.position(dt, true);
    var w = dojo.window.getBox();
    var t = 0, h = 0;
    var b = p.h*submenu.children.length/2+p.y;
    if (w.t+w.h < b) {
			t = Math.floor((w.t+w.h-b)/p.h);
			t = -t>=submenu.children.length/2? ++t*p.h : t*p.h;
		}
    submenu.style.top = (t+p.y)+'px';
    if (this.rtl) submenu.style.right = (w.w-p.x+this.space)+'px';
    else submenu.style.left = (p.x+p.w+this.space)+'px';
    submenu.style.display = 'block';
    if (dojo.style(submenu, this.mode) != submenu.hover) {
	    submenu.anim.stop();
	    submenu.anim.play();
	  }
		var dts = dt.parentNode.dts;
		for (var i=0; i<dts.length; ++i)
		  if (dts[i].timeout) {
		    dts[i].timeout = clearTimeout(dts[i].timeout);
		    this.hideSubmenu(dts[i].submenu);
				break;
			}
	},
	
	onMouseLeaveDT: function(e) {
	  var dt = e.currentTarget;
		dt.timeout = setTimeout(dojo.hitch(this, 'hideSubmenu', dt.submenu), this.hideDur);
	},

	onMouseEnterDL: function(e) {
    var parent = e.currentTarget.parent;
    while (parent && parent.timeout) {
			parent.timeout = clearTimeout(parent.timeout);
			parent = parent.parentNode.parent;
		}
	},
	
	onMouseLeaveDL: function(e) {
	  var dt = e.currentTarget.parent;
	  do dt.timeout = setTimeout(dojo.hitch(this, 'hideSubmenu', dt.submenu), this.hideDur);
		while (dt = dt.parentNode.parent);
	},
	
	hideSubmenu: function(submenu) {
	  submenu.style.display = 'none';
	  dojo.style(submenu, this.mode, 0);
	  dojo.removeClass(submenu.parent, 'open');
	}
  
});
