function initTagMenus(jq, menuSelector, btnSelector, menuHotClass) {
	var menus = new Array();
	jq.each(
		function() {
			menus.push(new TagMenu($(this).children(menuSelector).get(0),
									$(this).children(btnSelector).get(0),
									menuHotClass));
	});
	return menus;
}

function TagMenu(menu, btn, menuHotClass)
{
	if(menu == undefined) return;
    this.subMenu = null;
	$(btn).bind("click", beHot);
    $(menu).children(".tag_btn:not(.has_subtags)").bind("click",
	    function() {
			var cid = $(this).attr("tagid");
			var sub = $(this).attr("sub");
			var linkUrl = (cid == undefined) ? "/category.php" : "/category.php?cid="+$(this).attr('tagid');
			linkUrl = (cid == 0) ? "/category.php" : "/category.php?cid="+$(this).attr('tagid')
			location.href = linkUrl;
	        return false;
	    }
	);
	$(menu).children(".has_subtags").bind("click",
	    function() {
	        createSubMenu(this, menu);
	        return false;
	    }
	);
	function createSubMenu($btn, $menu) {
	    if(this.subMenu != null) {
	        if(this.subMenu.btn == $btn) return;
            this.subMenu.terminate();
            $menu.removeChild(this.subMenu.ele);
	    }
	    this.subMenu = new SubTagMenu($btn, $menu);
	}
	
	function beHot() {
		$(btn).unbind("click", beHot);
		$(btn).bind("click", beCold);
		$(document.body).bind("click", bodyClick);
		$(menu).addClass(menuHotClass);
		return false;
	}
	
	function beCold() {
	    if(this.subMenu != null) {
            this.subMenu.terminate();
            menu.removeChild(this.subMenu.ele);
            this.subMenu = null;
	    }
		$(btn).unbind("click", beCold);
		$(btn).bind("click", beHot);
		$(document.body).unbind("click", bodyClick);
		$(menu).removeClass(menuHotClass);
		return false;
	}
	
	function bodyClick(e) {
		if(!e) e = window.event;
		if(!isParentOf(menu, e.target)) beCold();
	}
}

function SubTagMenu(tagBtn, parentMenu)
{
    var obj = this;
    this.subMenu = null;
    this.ready = false;
    this.btn = tagBtn;
    $(tagBtn).addClass("has_subtags_hot");
    this.ele = document.createElement("div");
    this.ele.className = "sub_tag_menu";
    this.ele.innerHTML = "Loading...";
    $(this.ele).css("top", ($(tagBtn).offset().top-$(parentMenu).offset().top)+"px");
    $(this.ele).css("left", ($(tagBtn).width()+10)+"px");
    parentMenu.appendChild(this.ele);
    jQuery.post( "/ajaxtagmenu.php", {tagid:$(tagBtn).attr('tagid')}, dataGotHandle);
    function dataGotHandle(data, textStatus) {
        obj.gotData(data, textStatus);
    }
}
    
SubTagMenu.prototype.gotData = function (data, textStatus) {
    this.ele.innerHTML = data;
    //alert("data:\r"+data);
    var obj = this;
    $(obj.ele).children(".tag_btn:not(.has_subtags)").bind("click",
	    function() {
			var cid = $(this).attr("tagid");
			var sub = $(this).attr("sub");
			var linkUrl = (cid == undefined) ? "/category.php" : "/category.php?cid="+$(this).attr('tagid');
			linkUrl = (cid == 0) ? "/category.php" : "/category.php?cid="+$(this).attr('tagid')
			location.href = linkUrl;
	        return false;
	    }
	);
    $(obj.ele).children(".has_subtags").bind("click",
    function() {
        obj.createSubMenu(this, obj.ele);
        return false;
    }
    );
}
    
    
SubTagMenu.prototype.createSubMenu = function ($btn, $menu) {
    if(this.subMenu != null) {
	    if(this.subMenu.btn == $btn) return;
        this.subMenu.terminate();
        $menu.removeChild(this.subMenu.ele);
	}
	this.subMenu = new SubTagMenu($btn, $menu);
}

SubTagMenu.prototype.terminate = function() {
    $(this.btn).removeClass("has_subtags_hot");
    if(this.subMenu != null){
        this.subMenu.terminate();
        this.ele.removeChild(this.subMenu.ele);
        this.subMenu = null;
    }
}