//this is a black box JS file not intended for modification. its purpose is to segregate some gnarly code
//that supports the listBuilder widget. the user-friendly, easily customized interface to the listBuilder widget 
//uses the functions getListBuilderHTML() and getListBuilderValue()

//Example:
//var hedArr=new Array("Title","Instructor");
//var colArr=new Array(4,3);
//var widArr=new Array(230,185);
//var relArr=arr[26].split(",");
//txt+=drawListBuilderHTML("relatedClasses",205,10,460,6,"Related classes",0,50,"classesArr",hedArr,colArr,widArr,relArr);

//Explanation:
//this is a display box, with delete commends for each line. Items can be added from a related drop down
//nam:	basic handle for using getElementById. nam+"ListBuilderDiv=main div; nam+"ScrollingList"=main content list; nam+"Div"=table holder;nam+"Form"=dropDown; used by function addToBox(); 
//		also, these hidden containers are nam+ and contain data for rebuilding the table: hidColArr,hidWidArr,hidRelArr,hidSrcNam
//def:	sets the default ID value for the drop down	
//srcNam:	used by table builder and is eval-ed to create a source array, curArr, for the dropDown
//hedArr:	list of header names, stored for re-use when rebuilding
//colArr:	each value indicates a column to use from curArr, used by table builder, first value is sort value, stored for re-use when rebuilding
//widArr:	list of header widths, stored for re-use when rebuilding
//relArr:	used by table builder, stored for re-use when rebuilding

function drawListBuilderHTML(nam,tp,lf,wd,tab,cap,def,ht,srcNam,hedArr,colArr,widArr,relArr){
	if(srcNam=="")return "";
	if(hedArr!="")hedArr=hedArr.toString().split(",");
	colArr=colArr.toString().split(",");
	widArr=widArr.toString().split(",");
	relArr=relArr.toString().split(",");
	var listHt=ht-25;
	var txt="<div id=\""+nam+"ListBuilderDiv\" class=formHolder style=position:absolute;top:"+tp+";left:"+lf+";width:"+wd+";height:"+listHt+";>";
	txt+="<span class=\"listboxdiv\">"+cap+"</span>";
	if(hedArr!=""){
		var hed="<table width="+wd+" cellpadding=0 cellspacing=0 border=0><tr><td class=listitem width=45><img src=../images/blank.gif width=45 height=5 /></td>";
		for(var h=0;h<hedArr.length;h++){
			hed+="<td class=listhead width="+widArr[h]+">"+hedArr[h]+"</td>";
		}
		hed+="</tr></table>";
		txt+="<span class=\"subtitle\" style=position:absolute;top:12;left:0px>"+hed+"</span>";
	}
	txt+="<div id=\""+nam+"ScrollingList\" name=\""+nam+"ScrollingList\" type=\"text\" tabindex=\""+tab+"\" style=position:absolute;left:0;top:18px;width:"+wd+"px;height:"+ht+"px;minheight:"+ht+"px;maxheight:"+ht+"px;\" class=\"scrollbox\" />";

	txt+=getListBuilderTable(nam,srcNam,colArr,widArr,relArr);

	txt+="</div></div>";
	txt+="<div id=\""+nam+"Div\" name=\""+nam+"Div\" style=\"position:absolute;top:"+(tp+listHt+46)+";left:"+lf+";width:"+wd+"\" class=\"formHolder\">";
	txt+="<nobr><span class=subtitle>Add </span>";
	var curArr=new Array();
	if(srcNam){
		curArr=eval(srcNam);
		uniSort=colArr[0];
		curArr=curArr.sort(uniSorter);
	}
	txt+="<select id=\""+nam+"Form\" tabindex=\""+tab+"\" class=\"dropdown\" onchange=addToBox(\""+nam+"\") />";
	txt+="<option value=\"\"> ";
	for(var s=0;s<curArr.length;s++){
		if(typeof(curArr[s])=="object"){
			if(colArr[0].toString().indexOf("-")==-1){
				if(curArr[s][0]!=def)txt+="<option value=\""+curArr[s][0]+"\">"+curArr[s][colArr[0]];
				else txt+="<option value=\""+curArr[s][0]+"\" selected>"+curArr[s][colArr[0]];
			}
			else{
				var co=colArr[0].toString().split("-");
				if(curArr[s][0]!=def)txt+="<option value=\""+curArr[s][0]+"\">"+curArr[s][co[0]]+" "+curArr[s][co[1]];
				else txt+="<option value=\""+curArr[s][0]+"\" selected>"+curArr[s][co[0]]+" "+curArr[s][co[1]];
			}
		}
	}
	txt+="</select></nobr>";
	txt+="<input id="+nam+"hidColArr type=hidden value=\""+colArr.toString()+"\" />";
	txt+="<input id="+nam+"hidWidArr type=hidden value=\""+widArr.toString()+"\" />";
	txt+="<input id="+nam+"hidRelArr type=hidden value=\""+relArr.toString()+"\" />";
	txt+="<input id="+nam+"hidSrcNam type=hidden value=\""+srcNam+"\" />";
	txt+="</div>";
	return txt;
}

//this draws the content table displaying the active list, all values come from drawListBuilderHTML()
//nam:	hiddenData+nam stores the relevant line number in a hidden span on each line of the table, used by deleteFromTable() command
//srcNam:	eval-ed to create data source, datSrc; based on this string, a row of data is pulled from a known source array and used to populate each table row (curRow)
//colArr:	each item is used to pull a data item out of curRow
//widArr:	sets widths of table
//relArr:	this is the set of numbers used to pull rows from large data stores, used with nam for deleting items from builder table

function getListBuilderTable(nam,srcNam,colArr,widArr,relArr){
	var wd=45;
	for(var w=0;w<widArr.length;w++){
		wd+=parseInt(widArr[w]);
	}
	var datSrc=new Array();
	if(srcNam){
		datSrc=eval(srcNam);
		uniSort=colArr[0];
		datSrc=datSrc.sort(uniSorter);
	}
	var txt="<table width="+wd+" cellpadding=0 cellspacing=0 border=0>";
	for(var r=0;r<relArr.length;r++){
		var rVal=relArr[r];
		if(rVal!=""){
			curRow=getRowByKeyTerm(datSrc,rVal);
			if(curRow!=-1){
				if(typeof(curRow)!="object")curRow=new Array(curRow.toString());
				var hid="<span class=hiddenData id=hiddenData"+nam+c+">"+rVal+"</span>";
				txt+="<tr><td class=listlink width=45 onclick='deleteFromBuilderTable(\""+nam+"\",\""+rVal+"\")'>DELETE"+hid+"</td>";
				for(var c=0;c<colArr.length;c++){
					var cVal=colArr[c];
					if(cVal.toString().indexOf("-")==-1)txt+="<td class=listitem width="+widArr[c]+">"+curRow[parseInt(cVal)]+"</td>";
					else{
						cVal=cVal.toString().split("-");
						txt+="<td class=listitem width="+widArr[c]+">"+curRow[cVal[0]]+" "+curRow[cVal[1]]+"</td>";
					}
				}
				txt+="</tr>";
			}
		}
	}
	txt+="</table>";
	return txt;
}

function extractFromListBuilder(nam){
	var relArr=grab(nam+"hidRelArr").value;
	return relArr.toString();
}

function addToBox(nam){
	var frm=grab(nam+"Form");
	var num=frm.selectedIndex;
	var val=frm[num].value;
	var srcNam=grab(nam+"hidSrcNam").value;
	var colArr=grab(nam+"hidColArr").value.split(",");
	var widArr=grab(nam+"hidWidArr").value.split(",");
	var relArr=grab(nam+"hidRelArr").value;
	if(relArr.charAt(0)==",")relArr=relArr.substring(1,relArr.length);
	relArr=relArr.split(",");
	relArr[relArr.length]=val;
	grab(nam+"hidRelArr").value=relArr.toString();
	var cont=grab(nam+"ScrollingList");
	var res=getListBuilderTable(nam,srcNam,colArr,widArr,relArr);
	cont.innerHTML=res;
	return true;
}

function deleteFromBuilderTable(nam,delTerm){
	var srcNam=grab(nam+"hidSrcNam").value;
	var colArr=grab(nam+"hidColArr").value.split(",");
	var widArr=grab(nam+"hidWidArr").value.split(",");
	var relArr=grab(nam+"hidRelArr").value.split(",");
	var newRelArr=new Array();
	for(var r=0;r<relArr.length;r++){
		if(relArr[r]!=""&&relArr[r]!=delTerm)newRelArr[newRelArr.length]=relArr[r];
	}
	relArr=newRelArr;
	grab(nam+"hidRelArr").value=relArr.toString();
	var cont=grab(nam+"ScrollingList");
	var res=getListBuilderTable(nam,srcNam,colArr,widArr,relArr);
	cont.innerHTML=res;
	return true;
}


