tar_dmenu={
	init:function(cust){
		acton=(cust)?cust:".tar_dmenu";
		$(acton).each(function(){
			tar_dmenu.getvars(this);
		});
	},
	getvars:function(elem){
		if($(elem).children("var").length>0){
			vars=tar_dmenu.buildobject($(elem),"var","title","text");
		}else{vars={};};
		if($(elem).children("var").length>0&&$(elem).children(":not(var)").length==1){
			elem=$(elem).children(vars["listtype"]);
		}
		tar_dmenu.setup(elem,vars);
	},
	setup:function(elem,vars){
		if("actioner"in vars&&"submenu"in vars&&"relationship"in vars){
			var submenu=vars.submenu;
			var actioner=vars.actioner;
			var relationship=vars.relationship;
		}else{
			thisnode=("listtype"in vars)?vars["listtype"]:elem.nodeName.toLowerCase();
			if(thisnode=="ul"||thisnode=="ol"){
				var relationship="child";
				var actioner="li";
				if($(elem).children("li").children(".dmc_sub").length>0){
					var submenu=".dmc_sub";
				}else if($(elem).children("li").children("ul").length>0){
					var submenu="ul";
				}else if($(elem).children("li").children("ol").length>0){
					var submenu="ol";
				}else if($(elem).children("li").children("div").length>0){
					var submenu="div";
				}
			}else if(thisnode=="dl"){
				var relationship="sibling";
				var submenu="dd";
				var actioner="dt";
			}else{
				if($(elem).find(".dmc_act").length>0&&$(elem).find(".dmc_sub").length>0){
					var actioner=".dmc_act";
					var submenu=".dmc_sub";
					var relationship=($(elem).find(".dmc_act").children(".dmc_sub").length>0)?"child":"sibling";
				}else{
					var guessresults=tar_dmenu.takeawildguess(elem);
					var actioner=guessresults[0];
					var submenu=guessresults[1];
					var relationship="sibling";
				}
			}
		}
		var event=("event"in vars)?vars.event:"hover";
		var effect=("effect"in vars)?vars.effect:"basic";
		var duration=("duration"in vars)?vars.duration:"300";
		var orientation=("orientation"in vars)?vars.orientation:"horizontal";
		if(relationship=="sibling"){
			$(elem).find(submenu).hide();
			$(elem).find(actioner).children("a").addClass("parentlink");
		}else{
			$(elem).find(actioner).children(submenu).hide();
			$(elem).find(actioner).children(submenu).parent().children("a").addClass("parentlink");
		}
		tar_dmenu.setupjsevent(elem,actioner,submenu,relationship,event,effect,orientation,duration);
		$(elem).find("a.open").parents(actioner).each(function(){
			if(relationship == "child"){
				$(this).children("a").addClass("expanded");
				$(this).addClass("expanded").children(submenu).addClass("open").show();
			}else{
				$(this).children("a").addClass("expanded");
				$(this).addClass("expanded").next(submenu).addClass("open").show();
			}
		});
	},
	setupjsevent:function(elem,actioner,submenu,relationship,event,effect,orientation,duration){
		if(event=="hover"){
			tar_dmenu.setupjshoverevent(elem,actioner,submenu,relationship,event,effect,orientation,duration);
		}else{
			tar_dmenu.setupjsclickevent(elem,actioner,submenu,relationship,event,effect,orientation,duration);
		}
	},
	setupjsclickevent:function(elem,actioner,submenu,relationship,event,effect,orientation,duration){
		if($(elem).find(actioner).children("a").length>0){
			$(elem).find(actioner).children("a").click(function(){
				$(this).blur();
				return tar_dmenu.performeffect[relationship]($(this).parent(),actioner,submenu,event,effect,orientation,duration,"open");
			});
		}else{
			$(elem).find(actioner).click(function(){
				$(this).blur();
				return tar_dmenu.performeffect[relationship](this,actioner,submenu,event,effect,orientation,duration,"close");
			});
		}
	},
	setupjshoverevent:function(elem,actioner,submenu,relationship,event,effect,orientation,duration){
		$(elem).find(actioner).hover(function(){
			tar_dmenu.performeffect[relationship](this,actioner,submenu,event,effect,orientation,duration,"open");
		},function(){
			tar_dmenu.performeffect[relationship](this,actioner,submenu,event,effect,orientation,duration,"close");
		});
	},
	performeffect:{
		child:function(elem,actioner,submenu,event,effect,orientation,duration,direction){
			if($(elem).children(submenu).length>0){
				if(direction=="close"){
					if(event=="hover"){
						$(elem).children("a").removeClass("expanded");
						$(elem).removeClass("expanded").removeAttr("style").children(submenu).removeClass("open").removeAttr("style").hide();
					}else{
						$(elem).children("a").removeClass("expanded");
						$(elem).removeClass("expanded").removeAttr("style").children(submenu).removeClass("open").removeAttr("style");
						tar_dmenu.animations[effect]["hide"]($(elem).children(submenu),actioner,submenu,orientation,duration);
					}
				}else{
					$(elem).children("a").addClass("expanded");
					$(elem).addClass("expanded").children(submenu).addClass("open");
					tar_dmenu.animations[effect]["show"]($(elem).children(submenu),actioner,submenu,orientation,duration);
				}
				return(event=="hover");
			}
		},
		sibling:function(elem,actioner,submenu,event,effect,orientation,duration,direction){
			if(direction=="close"){
				if(event=="hover"){
					$(elem).next(submenu).removeClass("open").hide();
				}else{
					$(elem).next(submenu).removeClass("open");
					tar_dmenu.animations[effect]["hide"]($(elem).next(submenu),actioner,submenu,orientation,duration);
				}
			}else{
				$(elem).next(submenu).addClass("open");
				tar_dmenu.animations[effect]["show"]($(elem).next(submenu),actioner,submenu,orientation,duration);
			}
			return(event=="hover");
		}
	},
	checkstillopen:function(elem){
		if(!($(elem).hasClass("open"))){$(elem).hide()};
	},
	animations:{
		basic:{
			show:function(elem,actioner,submenu,orientation,duration){
				$(elem).show(parseInt(duration),function(){tar_dmenu.checkstillopen(elem)});
			},
			hide:function(elem,actioner,submenu,orientation,duration){
				$(elem).hide(parseInt(duration),function(){tar_dmenu.checkstillopen(elem)});
			}
		},
		fade:{
			show:function(elem,actioner,submenu,orientation,duration){
				$(elem).fadeIn(parseInt(duration),function(){tar_dmenu.checkstillopen(elem)});
			},
			hide:function(elem,actioner,submenu,orientation,duration){
				$(elem).fadeOut(parseInt(duration),function(){tar_dmenu.checkstillopen(elem)});
			}
		},
		slidedown:{
			show:function(elem,actioner,submenu,orientation,duration){
				$(elem).slideDown(parseInt(duration),function(){tar_dmenu.checkstillopen(elem)});
			},
			hide:function(elem,actioner,submenu,orientation,duration){
				$(elem).slideUp(parseInt(duration),function(){tar_dmenu.checkstillopen(elem)});
			}
		}
	},
	getmyeffect:function(elem){
		if($(elem).attr("class").indexOf("dme_")>0){
			var fullclassstring=$(elem).attr("class");
			var getindex=fullclassstring.indexOf("dme_");
			var geteffect=(fullclassstring.substr(getindex+4).indexOf(" ")>0)?fullclassstring.substr(getindex+4).substring(0,fullclassstring.substr(getindex+4).indexOf(" ")):fullclassstring.substr(getindex+4);
		}else{
			var geteffect="none";
		}
		return geteffect;
	},
	takeawildguess:function(elem){
		var childnodes=tar_dmenu.getmychildren(elem);
		var parseresults=tar_dmenu.parsenodes(childnodes);
		var hasheading=false;
		var hassub=false;
		var smallestheadingval=1;
		var commonsubval=0;
		var smallestheading="h1";
		var commonsub="div";
		for(var key in parseresults){
			if(key=="h1"||key=="h2"||key=="h3"||key=="h4"||key=="h5"||key=="h6"){
				hasheading=true;
				if(parseInt(key.substr(1))>smallestheadingval){
					smallestheadingval=parseInt(key.substr(1));smallestheading=key;
				}
			}
			if(key=="ul"||key=="ol"||key=="dl"||key=="div"){
				hassub==true;
				if(parseresults[key]>commonsubval){
					commonsubval=parseresults[key];
					commonsub=key;
				}
			}
		}
		return[smallestheading,commonsub];
	},
	getmychildren:function(elem){
		var childnodes=[];
		$(elem).children().each(function(){
			childnodes.push(this.nodeName.toLowerCase());
		});
		return childnodes;
	},
	parsenodes:function(nodelist){
		var parseresults={};
		for(i=0;i<nodelist.length;i++){
			if(nodelist[i]in parseresults){
				parseresults[nodelist[i]]++;
			}else{
				parseresults[nodelist[i]]=1;
			}
		}
		return parseresults;
	},
	buildobject:function(elem,node,k,v){
		varlist={};
		for(i=0;i<$(elem).children(node).length;i++){
			var key=$(elem).children(node+":eq("+i+")").attr(k);
			var val=(v=="text")?$(elem).children(node+":eq("+i+")").text():$(elem).children(node+":eq("+i+")").attr(v);
			varlist[key]=val;
		}
		return varlist;
	}
}

