tar_climit = {
	init : function() {
		$(".tar_charlimit").each(function(){
			var varlist = tar_utilities.buildobject($(this).parent(),"var","title","text");
			var showmessage = (("showmessage" in varlist)) ? varlist.showmessage : true;
			if (showmessage == true) {
				$(this).before("<p class=\"limitnotice\"><span class=\"printstring\"></span> character<span class=\"pluralism\">s</span> <span class=\"whisker\">remaining</span></p>");
			}
			tar_climit.eventsetup(this,varlist);
			tar_climit.countchars(this,varlist);
		});	
	},
	eventsetup : function(elem) {
		$(elem).keyup(function(){
			tar_climit.countchars(elem);
		}).keydown(function(e){
			return tar_climit.allowthis(elem,e);
		});
	},
	countchars : function(elem) {
		var getlength = $(elem).val().length;
		var getlimit = parseInt($(elem).parent().find("var[title=\"charlimit\"]").text());
		var printstring = Math.abs(getlimit-getlength);
		$(elem).prev(".limitnotice").children(".printstring").html(printstring);
		if (printstring == 1) {
			$(elem).addClass("singlechar").prev(".limitnotice").children(".pluralism").html("");
		} else if ($(elem).hasClass("singlechar")) {
			$(elem).removeClass("singlechar").prev(".limitnotice").children(".pluralism").html("s");
		}
		if (getlength > getlimit) {
			if (!($(elem).hasClass("overlimit"))) {
				$(elem).addClass("overlimit").prev(".limitnotice").addClass("overlimit").children(".whisker").html("over");
			}
		} else if ($(elem).hasClass("overlimit")) {
			$(elem).removeClass("overlimit").prev(".limitnotice").removeClass("overlimit").children(".whisker").html("remaining");
		}
	},
	allowthis : function(elem,e) {
		var forcelimit = ($(elem).parent().find("var[title=\"forcelimit\"]").length > 0) ? $(elem).parent().find("var[title=\"forcelimit\"]").text() : false;
		var getlength = $(elem).val().length;
		var getlimit = parseInt($(elem).parent().find("var[title=\"charlimit\"]").text());
		var permit = tar_climit.detectkeys(e,[8,37,38,39,40,46]);
		if ((getlength >= getlimit) && forcelimit && (!(permit))) { return false; }
	},
	detectkeys : function(e,validkeys) {
		var evt = e || window.event;
		var keycode = evt.keyCode;
		var tester = false;
		for(i=0;i<validkeys.length;i++) {
			tester = (tester == false) ? (keycode == validkeys[i]) : true;
		}
		return tester;
	}
}
tar_cselect={
	init:function(arg){
		if(arg){
			tar_cselect.setup(arg);
			$(arg+":eq(0)").each(function(){ tar_cselect.selectchild(this,$(this).data("vars")); });
			$(arg).change();
		}else{
			$(".tar_cselect").each(function(){ tar_cselect.setup(this); });
			$(".tar_cselect:eq(0)").each(function(){ tar_cselect.selectchild(this,$(this).data("vars")); });
			$(".tar_cselect").each(function(){ $(this).change(); });
		}
	},
	setup:function(elem){
		var vars=tar_utilities.buildobject(elem,".tar_var","title","text");
		$(elem).find(".tar_var").remove();
		var openres=("openres" in vars && vars.openres != "") ? vars.openres : false;
		$(elem).data("openres",openres);
		var target=("target" in vars && vars.target != "") ? "#"+vars.target:null;
		$(elem).data("vars",vars);
		if($(elem).children().length>0){ $(elem).data("defopt",$(elem).children()); }
		tar_cselect.events(elem,vars,target);
	},
	events:function(elem,vars,target){
		$(elem).unbind("change").bind("change",function(){
			var newcode=($(this).val()==null)?"":$(this).val();
			if(target){
				if(newcode!=""){
					tar_cselect.json(newcode,vars);
				}else{
					if($(target).is(":text")){ tar_cselect.typeswapper(target,"return"); }
					tar_cselect.restoredefault(target);
				}
			}
			$(this).blur();
		});
	},
	json:function(code,vars){
		var getpage=vars.ping+"?q="+code+"&fu="+(new Date().getTime());
		var target="#"+vars.target;
		var formname=$(target).closest("form").attr("name");
		$(target).empty();
		$.ajax({
			url:getpage,
			dataType:'json',
			success:function(json){
				var tag=(json.tag)?json.tag:"option";
				var dtrig="display";
				var elements="";
				if(json.items.length>0){
					if($(target).is(":text")){ tar_cselect.typeswapper(target,"return"); }
					$.each(json.items,function(i,item){
						elements+=tar_utilities.htmlformatobject(item,tag,dtrig);
					});
					$(target).empty().append(elements)
				}else{
					if($(target).data("openres")==true){
						tar_cselect.typeswapper(target,"text");
					}else{
						if(!($(target).is(":text"))){
							tar_cselect.restoredefault(target);
							return;
						}
					}
				}
				tar_cselect.selectchild(target,$(target).data("vars"));
				$(target).change();
			},
			error:function(XMLHttpRequest,textStatus,errorThrown){
				if($(target).data("openres")==true){
					tar_cselect.typeswapper(target,"text");
				}else{
					if(!($(target).is(":text"))){
						tar_cselect.restoredefault(target);
						return;
					}
				}
			}
		});
	},
	typeswapper:function(elem,direc){
		var formname=$(elem).closest("form").attr("name");
		if(direc=="return"){
			$(elem).after($("#purg_"+formname+" #purg_"+elem.substring(1)));
			$(elem).remove();
			$("#purg_"+elem.substring(1)).attr("id",elem.substring(1));
		}else{
			var portattr=tar_utilities.htmlformatobject(tar_utilities.attrtoobj(elem,["id","name","class","rel"]));
			var appendstring='<input type="text"'+portattr+'/>';
			if(!($("#purg_"+formname).length>0)){
				$(elem).closest("form").before('<div style="display:none;" id="purg_'+formname+'"></div>')
			}
			$(elem).after(appendstring);
			$("#purg_"+formname).append($(elem));
			$(elem).attr("id",("purg_"+$(elem).attr("id")));
		}
	},
	restoredefault:function(target){
		$(target).empty();
		var s="";
		var defvars=$(target).data("defopt");
		var dlength=defvars.length;
		for(var i=0;i<dlength;i++){
			$(target).append(defvars[i]);
		}
		tar_cselect.selectchild(target,$(target).data("vars"));
		$(target).change();
	},
	selectchild:function(elem,vars,kill){
		if("value" in vars && vars.value!=null){
			$(elem).children("[value="+vars.value+"]").attr("selected","selected");
			vars.value=null;
			$(elem).data("vars",vars);
		}else{
			$(elem).children(":eq(0)").attr("selected","selected");
		}
	}
}
					
tar_mselect = {
	init : function() {
		$(".tar_mselect").each(function(){
			tar_mselect.build(this);
		});
		tar_mselect.eventsetup();
	},
	addboxstring : function(thisid){
		thisid=thisid.substr(4);
		var basestring='<div class="addbox">Add an item:&nbsp;&nbsp;&nbsp;<select name="tempbox" class="addcombo" id="select_'+thisid+'"></select> <input type="button" class="additem" value="&nbsp;&nbsp;+&nbsp;&nbsp;"/></div>';
		$("#box_"+thisid).append(basestring);
		tar_mselect.addoptions(thisid);
	},
	addoptions : function(thisid){
		optionstring="";
		optioncount=0;
		$("#"+thisid).children().each(function(){
			if(!($(this).attr("selected"))){
				optionstring=optionstring+'<option rel="'+optioncount+'">'+$(this).html()+'</option>';
			}
			optioncount++;
		});
		$("#select_"+thisid).empty().append('<option rel="x">Choose an option to add to the list...</option>'+optionstring);
		tar_mselect.eventsetup();
	},
	build : function(elem){
		var thisid="box_"+$(elem).attr("id");
		var isimg=($(elem).hasClass("imglist"))?" imglist":"";
		$(elem).hide();
		$(elem).before('<div class="superselectbox'+isimg+'" id="'+thisid+'"></div>');
		tar_mselect.addboxes(elem,thisid);
	},
	addboxes : function(elem,thisid,indi){
		$("#"+thisid).empty();
		thislist=$(elem).children(":selected");
		for(i=0;i<thislist.length;i++){
			thisindex=$(thislist[i]).parent().children().index($(thislist[i]));
			$("#"+thisid).append(tar_mselect.structure($(thislist[i]).html(),thisindex));
		}
		$("#"+thisid).append('<div class="clearfloat"></div>');
		tar_mselect.addboxstring(thisid);
		tar_mselect.eventsetup();
	},
	structure : function(val,rel){
		return'<div class="supertag" rel="'+rel+'"><span class="supertagval">'+val+'</span><span class="supertagbutton remove" title="Remove this entry."></span></div>';
	},
	eventsetup : function(){
		$(".superselectbox .supertagbutton").unbind("click").click(function(){
			if($(this).hasClass("remove")){
				tar_mselect.startremove($(this).parent());
			}
		});
		$(".superselectbox .additem").unbind("click").click(function(){ tar_mselect.additem($(this).parent().parent()); });
		$(".superselectbox .addcombo").unbind("keydown").bind("keydown",function(e){
			if(e.keyCode==13){
				$(this).next().click();
				return false;
			}
		});
		$(".superselectbox.imglist .addcombo").unbind("keyup").bind("keyup",function(e){
			tar_mselect.imgpreview(this,"key")
		});
		$(".superselectbox.imglist .addcombo option").unbind("mouseenter").bind("mouseenter",function(){ tar_mselect.imgpreview(this,"hover"); });
	},
	startremove : function(elem){
		$(elem).hide(400,function(){ tar_mselect.killnode(this,$(this).parent()); });
	},
	killnode : function(elem,parent){
		thisindex=$(elem).attr("rel");
		$(elem).remove();
		tar_mselect.selectio($(parent).attr("id").substr(4),thisindex,"remove");
		tar_mselect.addoptions($(parent).attr("id").substr(4));
	},
	selectio : function(thisid,thisindex,mode){
		statechange=(mode=="add")?true:false;
		$("#"+thisid).children(":eq("+thisindex+")").attr("selected",statechange);
	},
	additem : function(elem){
		addrel=$(elem).find(".addcombo").children(":selected").attr("rel");
		$("#imglistpreview").remove();
		if(addrel!="x"){
			addtext=$(elem).find(".addcombo").children(":selected").text();
			addtext=($(elem).hasClass("imglist"))?'<img src="'+$("#"+$(elem).attr("id").substr(4)).next(".img_path").attr("rel")+addtext+'"/>'+addtext:addtext;
			$(elem).find(".addcombo").children(":selected").remove();
			$(elem).children(".clearfloat").before(tar_mselect.structure(addtext,addrel));
			tar_mselect.selectio($(elem).attr("id").substr(4),addrel,"add");
			$(elem).find(".addtext").val("");
			tar_mselect.eventsetup();
		}
	},
	renamebuttons : function(elem,direc){
		if(direc=="toedit"){
			editbutton="Confirm this change.";
			removebutton="Canced this change.";
		}else{
			editbutton="Edit this entry.";
			removebutton="Remove this entry.";
		}
		$(elem).children(".supertagbutton.edit").attr("title",editbutton);
		$(elem).children(".supertagbutton.remove").attr("title",removebutton);
	},
	imgpreview : function(elem,act){
		getrel=(act=="hover")?$(elem).attr("rel"):$(elem).children(":selected").attr("rel");
		if(getrel!="x"){
			getimg=(act=="hover")?$(elem).text():$(elem).children(":selected").text();
			thisid=(act=="hover")?$(elem).parent().attr("id").substr(7):$(elem).attr("id").substr(7);
			getpath=$("#"+thisid).next(".img_path").attr("rel");
			$("#imglistpreview").remove();
			$("#box_"+thisid).find(".addbox").append('<div id="imglistpreview"><img src="'+getpath+getimg+'"/></div>');
		}else{
			$("#imglistpreview").remove();
		}
	}
}

tar_mtag = {
	addboxstring : '<div class="addbox">Add an item:&nbsp;&nbsp;&nbsp;<input type="text" class="addtext" value=""/> <input type="button" class="additem" value="&nbsp;&nbsp;+&nbsp;&nbsp;"/></div>',
	init : function() {
		$(".tar_mtag").each(function(){
			tar_mtag.build(this);
		});
		tar_mtag.eventsetup();
	},
	build : function(elem) {
		var thisid = "box_" + $(elem).attr("id");
		listtype = ($(elem).hasClass("list")) ? "bulletlist" : "taglist"; 
		$(elem).change(function(){ tar_mtag.addboxes(this,"box_" + this.id,true) }).hide();
		$(elem).before('<div class="supertagbox ' + listtype + '" id="' + thisid + '"></div>');
		tar_mtag.addboxes(elem,thisid);
	},
	addboxes : function(elem,thisid,indi) {
		$("#" + thisid).empty();
		thislist = $(elem).val().split(";");
		for (i=0;i<thislist.length;i++) {
			if ($.trim(thislist[i]) != "") {
				$("#" + thisid).append(tar_mtag.structure(thislist[i]));
			}
		}
		$("#" + thisid).append('<div class="clearfloat"></div>');
		$("#" + thisid).append(tar_mtag.addboxstring);
		tar_mtag.addrels($("#" + thisid));
		if (indi) {
			tar_mtag.eventsetup();
		}
	},
	addrels : function(elem) {
		var childnum = $(elem).children(".supertag").length;
		for (i=0;i<childnum;i++) {
			$(elem).children(".supertag:eq(" + i + ")").attr("rel",i);
		}
	},
	structure : function(val) {
		val = val.replace("<","&lt;");
		return '<div class="supertag"><span class="supertagval">' + $.trim(val) + '</span><span class="supertagbutton edit" title="Edit this entry."></span><span class="supertagbutton remove" title="Remove this entry."></span></div>';
	},
	eventsetup : function() {
		$(".supertagbox .supertagbutton").unbind("click").click(function(){
			if ($(this).parent().hasClass("editing")) {
				if ($(this).hasClass("edit")) {
					tar_mtag.finishedit($(this).parent(),"finish");
				} else if ($(this).hasClass("remove")) {
					tar_mtag.finishedit($(this).parent(),"cancel");
				}
			} else {
				if ($(this).hasClass("edit")) {
					tar_mtag.startedit($(this).parent());
				} else if ($(this).hasClass("remove")) {
					tar_mtag.startremove($(this).parent());
				}
			}
		});
		$(".supertagbox .additem").unbind("click").click(function(){ tar_mtag.additem($(this).parent().parent()); });
		$(".supertagbox .addtext").unbind("keydown").bind("keydown",function(e){
			if (e.keyCode == 13) {
				$(this).next().click();
				return false;
			}
		}); 
	},
	startedit : function(elem) {
		if ($("#editingbox").length > 0) {
			tar_mtag.finishedit($("#editingbox").parent().parent(),"cancel");
		}
		curwidth = parseInt($(elem).css("width")) - 55;
		$(elem).addClass("editing");
		tar_mtag.renamebuttons(elem,"toedit");
		gettext = $(elem).children(".supertagval").html();
		$(elem).children(".supertagval").attr("rel",gettext);
		inclass = $(elem).parent().hasClass("bulletlist");
		if (gettext.length > 128 || inclass) {
			$(elem).children(".supertagval").html('<span id="editingbox"><textarea id="newval" style="width:' + (curwidth+5) + 'px">' + gettext + '</textarea></span>');
		} else {
			$(elem).children(".supertagval").html('<span id="editingbox"><input id="newval" type="text" value="' + gettext + '" style="width:' + curwidth + 'px"/></span>');
		}
		$("#newval").unbind("keydown").bind('keydown',function(e){
			if (e.keyCode == 13) {
				$(this).parent().parent().next().click();
				return false;
			}
		});
		$("#editingbox").children("input").focus();
	},
	finishedit : function(elem,action) {
		if ($("#editingbox").children("#newval").val() != "") {
			$(elem).removeClass("editing").removeAttr("style");
			tar_mtag.renamebuttons(elem,"unedit");
			newtext = (action == "finish") ? $("#editingbox").children("#newval").val() : $(elem).children(".supertagval").attr("rel");
			tar_mtag.boxio($(elem).attr("rel"),"#"+$(elem).parent().attr("id").substr(4),newtext);
			$(elem).children(".supertagval").html(newtext);
			$("#editingbox").remove();
		} else {
			tar_mtag.startremove(elem);
		}
	},
	startremove : function(elem) {
		$(elem).hide(400,function(){ tar_mtag.killnode(this,$(this).parent()); });
	},
	killnode : function(elem,parent) {
		thisindex = $(elem).attr("rel"); 
		$(elem).remove();
		tar_mtag.boxio(thisindex,"#"+$(parent).attr("id").substr(4),"");
		tar_mtag.addrels($(parent));
	},
	boxio : function(thisindex,getid,newstring,mode) {
		rawval = $(getid).val();
		if (rawval.charAt(rawval.length-1) != ";") {
			rawval = rawval + ";";
		}
		curval = rawval.split(";");
		if (thisindex != "add") {
			curval.splice(thisindex,1,newstring);
		} else {
			curval.splice(curval.length-1,1,newstring);
		}
		newstring = "";
		for (i=0;i<curval.length;i++) {
			if ($.trim(curval[i]) != "") {
				newstring += $.trim(curval[i]) + ";";
			}
		}
		$(getid).val(newstring);
	},
	additem : function(elem) {
		addrel = parseInt($(elem).children(".supertag").length);
		addtext = $(elem).find(".addtext").val().split(";");
		addtextstring = "";
		for (i=0;i<addtext.length;i++) {
			if ($.trim(addtext[i]) != "") {
				$(elem).children(".clearfloat").before(tar_mtag.structure(addtext[i]));
				addtextstring+=addtext[i]+";";
			}
		}
		tar_mtag.boxio("add","#"+$(elem).attr("id").substr(4),addtextstring.substr(0,addtextstring.length-1));
		$(elem).find(".addtext").val("");
		tar_mtag.eventsetup();
		tar_mtag.addrels(elem);
	},
	renamebuttons : function(elem,direc) {
		if (direc == "toedit") {
			editbutton = "Confirm this change.";
			removebutton = "Canced this change.";
		} else {
			editbutton = "Edit this entry.";
			removebutton = "Remove this entry.";
		}
		$(elem).children(".supertagbutton.edit").attr("title",editbutton);
		$(elem).children(".supertagbutton.remove").attr("title",removebutton);
	}
}

$(document).ready(function(){tar_climit.init();tar_cselect.init();tar_mselect.init();tar_mtag.init()});

