/*
	PageDataPackaging.js	
	authors: hd/yc
	started on: july 31, 2k
	last modified: aug 01, 2k

	NOTES:
	======
	*	one of the first things encountered that was pretty interesting to say the least is
		that when the BS programmer puts the xml (string) as an attribute of the INPUT (xml) 
		element, all of the quotation marks are converted to (&lt;) and (&gt;) -- therefore,
		the first thing that will need to happen is to convert all of these back to quotation
		marks
		--> NEVERMIND: fortunately, the input element has the behavior to convert all quotes
			back when assigning it's 'value' property to a string
	*	UnpackData() and PackData() modified to exert different behaviors over different types
		of HTML form elements.  Essentially, I'm using a switch statement for major types (those
		with different tagNames) and nested switch statements for tags of the same name which 
		show different behaviors
	*	I have added a document.onclick event handler that checks to see if a checkbox was the
		cause of the event.  If it was, it will set the value of the checkbox to either [on|off]
		based on the prior value.  If there was no value set, the function assumes that it was
		set to off, and subsequently sets the value to "on"
	*	I have removed the document.onclick event handler for checkboxes -- this created a severe
		limitation for any other developer that wanted to use his own custom document.onclick
		event handler.  The routine now, making better use of the switch statment, looks to see
		what the "checked" attribute is and bases the value assignment off of this value
	*	now will unpack multiple PAGEERROR tags
		~~~~~~~~~~~~~
	*	TODO: enable the BS layer to pass in a blank <INPUT id="PageData"> element and have
			  the PackData routine create all the necessary elements - basically have this
			  routine be *smarter*
*/

var mx_dom = new ActiveXObject("Microsoft.XMLDOM");

function UnpackData(){
	var oData = document.getElementById("PageData");

//	alert(oData.value);

	//verify that data is received correctly
	if(!oData || oData.tagName != "INPUT"){
		alert("error in retrieving data for this page");
		return;
	}
	//begin unpacking
	var sDataString = oData.value;
	if(!mx_dom){
		alert("error in creating XML object");
		return;
	}
	mx_dom.loadXML(sDataString);
	if(mx_dom.parsed!=true || !mx_dom.documentElement){
		alert("XML parsing error:" + mx_dom.parseError.reason + ":" + sDataString);
		return;
	}

	UpdatePage(mx_dom);
}

function refreshPage(url)
{
	
	mx_dom.async = false;
	mx_dom.load(url);
	if(mx_dom.parsed!=true || !mx_dom.documentElement){
		alert("XML parsing error");
		return;
	}
	
	UpdatePage(mx_dom);
}

var maOptAttrNames=new Array("defaultvalue","validate","enabled",
						     "decimalplaces","minnumber","maxnumber","maxstrlen");

function vSetXMLOptAttr(aoXMLNode,aoHTMLEl,asAttrName)
{
	var lerr;
	var loAttr=aoXMLNode.attributes.getNamedItem(asAttrName);
	if(loAttr)
	{
		try
		{
			aoHTMLEl.setAttribute(asAttrName,loAttr.text);
		}
		catch(lerr)
		{
			//ignore any error
		}
	}
}

function UpdatePage(mx_dom)
{
	var disableField;
	disableField = "";
	
	//set any PageErrors
	var ox_PageErrors = mx_dom.documentElement.selectNodes("//PAGEERROR");
	if(ox_PageErrors.length>0){
		var oHTMLPageErrors = document.getElementById("PageErrors");
		if(!oHTMLPageErrors){
			alert("Required DIV tag \"PageErrors\" was not found -- halting load");
			return;
		}else{
			for(var c=0; c<ox_PageErrors.length;c++){
				oHTMLPageErrors.innerHTML += "<FONT color=\"red\"><B>" + ox_PageErrors[c].attributes.getNamedItem("desc").text + "</B></FONT><BR/><BR/>";
			}
		}
	}else{
		//alert("PAGEERRORS fields were not provided by the BS class")	//debug info only
	}

	//now go through and for each FIELD element in the XML, match it to an 
	//HTML element with a corresponding attribute
	
	var ox_NodeList = mx_dom.getElementsByTagName("FIELD");
	var oHTMLEl;
	if(ox_NodeList.length > 0){
		for(var i=0; i<ox_NodeList.length; i++){
			//get HTML element with the same ID
			oHTMLEl=document.getElementById(ox_NodeList.item(i).attributes.getNamedItem("name").text);
			if(!oHTMLEl){
				alert("HTML Element corresponding to XML Node " + ox_NodeList.item(i).attributes.getNamedItem("name").text + " not found.");
			}else{
				//CHECK THE TAGNAME FOR THE HTML ELEMENT -- LOAD VARIES BASED ON THIS
				switch(oHTMLEl.tagName){
					case "INPUT":
						switch(oHTMLEl.type){
							case "text":
							case "password":
							case "hidden":
								//alert("text | password | hidden");
								oHTMLEl.value = ox_NodeList.item(i).attributes.getNamedItem("value").text;
								break;
							case "button":
							case "submit":
							case "reset":
								alert("button | submit | reset");
								break;
							case "checkbox":
								//alert("checkbox");
								if(ox_NodeList.item(i).attributes.getNamedItem("value").text=="on"){
									oHTMLEl.setAttribute("checked","true");
								}else{
									//oHTMLEl.setAttribute("checked","false");
								}
								break;
							case "radio":
								//get all radio buttons with the same name as this one and then
								//check the appropriate one
								var RadioList = document.getElementsByName(oHTMLEl.name);
								if(RadioList){
									for(var y=0; y<RadioList.length;y++){
										if(RadioList.item(y).value == ox_NodeList.item(i).attributes.getNamedItem("value").text){
											RadioList.item(y).checked=true;
											break;
										}
									}
								}else{
									alert("List not found");
								}
								break;
							case "file":
								alert("file");
								break;
						}
						if (ox_NodeList.item(i).attributes.getNamedItem("disabled"))
							if (ox_NodeList.item(i).attributes.getNamedItem("disabled").text.toUpperCase() == "TRUE")
								document.getElementById(oHTMLEl.id).disabled = true;
						break;
					case "SELECT":
						//remember -- the actual text between <OPTION>..</OPTION>
						//will be populated by the Business Service component 
						//alert(ox_NodeList.item(i).name+"="+ox_NodeList.item(i).attributes.getNamedItem("value").text);
						if(ox_NodeList.item(i).attributes.getNamedItem("value").text){
							var oOptions = oHTMLEl.getElementsByTagName("OPTION");
							if(!oOptions){
								alert("There are no options corresponding to this select box");
							}else{
								var lblnAnySelectedFound=false;
								var ox_ChildNodeList = ox_NodeList.item(i).selectNodes("VALUE");
								//alert(oHTMLEl.name+":"+oHTMLEl.type);
								for(var z=0;z<oOptions.length;z++){
									if(oHTMLEl.type=="select-multiple"){
										for(var y=0;y<ox_ChildNodeList.length;y++){
											if(oOptions.item(z).value==ox_ChildNodeList.item(y).attributes.getNamedItem("value").text){
												//alert("match found for " + oOptions.item(z).value);
												oOptions.item(z).setAttribute("selected","true");	//NOTE: there is no "selected=false"  if the browser sees "selected" it thinks it is true
												lblnAnySelectedFound=true;
												break;
											}
										}
									}else{
										if(oOptions.item(z).value==ox_NodeList.item(i).attributes.getNamedItem("value").text){
											//alert("match found for " + oOptions.item(z).value);
											oOptions.item(z).setAttribute("selected","true");	//NOTE: there is no "selected=false"  if the browser sees "selected" it thinks it is true
											lblnAnySelectedFound=true;
										}
									}
								}
								if(lblnAnySelectedFound==false){
									alert("There was no <SELECT><OPTION> tag found for the set value of "+oHTMLEl.name);
									return;
								}else{
									//alert("There was an OPTION match found");
								}
							}
						}else{
							//alert("The value returned from Business Service was blank");
						}

						if (ox_NodeList.item(i).attributes.getNamedItem("disabled"))
							if (ox_NodeList.item(i).attributes.getNamedItem("disabled").text.toUpperCase() == "TRUE")
								document.getElementById(oHTMLEl.id).disabled = true;
						break;

					case "TEXTAREA":
						if(ox_NodeList.item(i).attributes.getNamedItem("value")){
							oHTMLEl.innerText = ox_NodeList.item(i).attributes.getNamedItem("value").text;
						}
						if (ox_NodeList.item(i).attributes.getNamedItem("disabled"))
							if (ox_NodeList.item(i).attributes.getNamedItem("disabled").text.toUpperCase() == "TRUE")
								document.getElementById(oHTMLEl.id).disabled = true;
						break;
					case "SPAN":
					case "DIV":
						if(ox_NodeList.item(i).attributes.getNamedItem("packtype") || ox_NodeList.item(i).attributes.getNamedItem("value"))	//if the XML node has a value
						{
							var divType="";
							if (ox_NodeList.item(i).attributes.getNamedItem("packtype"))
							{
								divType = ox_NodeList.item(i).attributes.getNamedItem("packtype").text;
							}
							//else
							//{
							//	//huh? - remmed out by JMT
							//	if (ox_NodeList.item(i).attributes.getNamedItem("value"))
							//		divType = ox_NodeList.item(i).attributes.getNamedItem("value").text;
							//}
							switch(divType){
								//*****************************************************************************
								//  LOAD ANY RESERVED WORD EXTENSIONS
								//	---------------------------------------------------------------------------
								//	you can add reserved words (such as "GRID" to the value attribute in your 
								//	xml stream, and thus extend this routine HERE -- simply add another case 
								//	statement to this switch and specify your extended reserved word.  As a 
								//	convention, please write all reserved words in ALL CAPS, as this should 
								//	help avoid confusion in the future from actual values of the same name.
								//	***************************************************************************
								case "GRID":
									BuildAGrid(oHTMLEl,ox_NodeList.item(i));
									break;
								default:
									oHTMLEl.innerText = ox_NodeList.item(i).attributes.getNamedItem("value").text;
							}
						}
						else
						{
							alert("Unknow DIV type!");
						}
					break;
				}
				if(oHTMLEl.tagName != "SPAN" && oHTMLEl.tagName != "DIV")
				{
					//set optional attributes if present
					for(y=0;y<maOptAttrNames.length;y++)
						vSetXMLOptAttr(ox_NodeList.item(i),oHTMLEl,maOptAttrNames[y]);
				}
				
				if(ox_NodeList.item(i).attributes.getNamedItem("error") && ox_NodeList.item(i).attributes.getNamedItem("error").text!=""){
					//there is a value in the 'error' attribute
					oHTMLEl.insertAdjacentHTML("afterEnd","<FONT color=\"red\">" + ox_NodeList.item(i).attributes.getNamedItem("error").text + "</FONT");
				}
				/////////////////////////////SECURITY///////////////////////////////
				if(ox_NodeList.item(i).attributes.getNamedItem("visible")){
					//the visible attribute has been set for this object
					if(ox_NodeList.item(i).attributes.getNamedItem("visible").text == "false"){
						oHTMLEl.style.visibility = "hidden";
					}
				}
			}	//end conditional for all matched elements
		}	//end for
	}
}

function PackData(){
	var oData = document.getElementById("PageData");
	//verify that data is received correctly
	if(!oData || oData.tagName != "INPUT"){
		alert("error in retrieving data for this page");
		return;
	}
	if(!mx_dom){
		alert("error in XML object.  The object has been destroyed.");
		return;
	}
	//set PAGEERRORs equal to empty string
	var ox_PageErrors = mx_dom.documentElement.selectNodes("//PAGEERROR");
	if(ox_PageErrors.length>0){
		var oHTMLPageErrors = document.getElementById("PageErrors");
		if(!oHTMLPageErrors){
			alert("Required DIV tag \"PageErrors\" was not found -- halting load");
			return;
		}else{
			for(var c=0; c<ox_PageErrors.length;c++){
				ox_PageErrors[c].attributes.getNamedItem("desc").text = "";
			}
		}
	}else{
		//alert("PAGEERRORS fields were not found")	//debug info only
	}

	var ox_PageError = mx_dom.selectSingleNode("//PAGEERROR");
	if(!ox_PageError){
		//alert("PageError element not found"); // debug use
	}else{
		//alert("PageError element found");
		ox_PageError.attributes.getNamedItem("desc").text = "";
	}
	var ox_NodeList = mx_dom.getElementsByTagName("FIELD");
	var oHTMLEl;
	if(ox_NodeList.length > 0){
		for(var i=0; i<ox_NodeList.length; i++){
			oHTMLEl=document.getElementById(ox_NodeList.item(i).attributes.getNamedItem("name").text);
			if(!oHTMLEl){
				alert("HTML Element corresponding to XML Node " + ox_NodeList.item(i).attributes.getNamedItem("name").text + " not found.");
			}else{
				//alert(oHTMLEl.name + " :: " + oHTMLEl.value + " :: " + oHTMLEl.checked);
				//package data differently based on the tag type
				switch(oHTMLEl.tagName){
					case "INPUT":
						switch(oHTMLEl.type){
							case "text":
							case "password":
							case "hidden":
								//alert("text | password | hidden");
								ox_NodeList.item(i).attributes.getNamedItem("value").text = oHTMLEl.value;
								break;
							case "button":
							case "submit":
							case "reset":
								alert("button | submit | reset");
								break;
							case "checkbox":
								//alert("checkbox");
								if(oHTMLEl.checked==true){
									ox_NodeList.item(i).attributes.getNamedItem("value").text = "on";
								}else{
									ox_NodeList.item(i).attributes.getNamedItem("value").text="";
								}
								break;
							case "radio":
								//get the one that was actually checked
								var RadioList = document.getElementsByName(oHTMLEl.name);
								if(RadioList){
									for(var y=0;y<RadioList.length;y++){
										if(RadioList.item(y).checked==true){
											//alert("radio button: " + RadioList.item(y).id + " :: " + RadioList.item(y).name + " :: " + RadioList.item(y).value);
											ox_NodeList.item(i).attributes.getNamedItem("value").text = RadioList.item(y).value;
										}
									}
								}else{
									alert("List not found");
								}
								break;
							case "file":
								alert("file");
								break;
						}
						break;
					case "SELECT":
						//remember -- the actual text between <OPTION>..</OPTION>
						//will be populated by the Business Service component 
						//alert("select")
						//- OLD select-one: ox_NodeList.item(i).attributes.getNamedItem("value").text = oHTMLEl.value;
						var oOptions = oHTMLEl.getElementsByTagName("OPTION");
						if(!oOptions){
							alert("There are no options corresponding to this select box");
						}else{
							if(oHTMLEl.type=="select-multiple"){
								var z;
								var ox_NewChildNode;
								var ox_ChildNodeList = ox_NodeList.item(i).selectNodes("VALUE");
								for(z=0;z<ox_ChildNodeList.length;z++){
									ox_NodeList.item(i).removeChild(ox_ChildNodeList(z));
								}
								for(z=0;z<oOptions.length;z++){
									if(oOptions.item(z).selected){
										ox_NewChildNode=mx_dom.createNode("ELEMENT","VALUE","");
										ox_NewChildNode.setAttribute("value",oOptions.item(z).value);
										ox_NodeList.item(i).appendChild(ox_NewChildNode);
									}
								}
							}else{
								for(z=0;z<oOptions.length;z++){
									if(oOptions.item(z).selected){
										ox_NodeList.item(i).setAttribute("value",oOptions.item(z).value);
										break;
									}
								}
							}
							
						}
						break;

					case "TEXTAREA":
						//alert("textarea");
						ox_NodeList.item(i).attributes.getNamedItem("value").text = oHTMLEl.innerText;
						break;
						
					case "SPAN":
					case "DIV":
						//get NodeList = ox_NodeList.item(i)
						//get <TABLE> tag
						//oHTMLl.getElementsByTagName("TABLE").item(tableIndex)
						//id = oHTMLl1.id + "_table";
						for (var tableIndex=0; tableIndex<oHTMLEl.getElementsByTagName("TABLE").length; tableIndex++)
						{
							if (oHTMLEl.getElementsByTagName("TABLE").item(tableIndex).id.toUpperCase() == (oHTMLEl.id+"_table").toUpperCase())
							{
								//get <TABLE>
								//*****oHTMLEl.getElementsByTagName("TABLE").item(tableIndex)****
								//get <TABLE> value and put into XML data island
								//Yong to here 08/09/2000
								
							}
						}
						
						break;
				}

				//strip off any field errors			
				if(ox_NodeList.item(i).attributes.getNamedItem("error")){
					ox_NodeList.item(i).attributes.getNamedItem("error").text = "";
				}
				
				//disable the form element so that it is not sent back
				if(oHTMLEl.type!="radio"){
					oHTMLEl.disabled="true";
				}else{
					//use the RadioList collection and 'y' variable declared above
					//alert("radio elements to disable: " + RadioList.length);
					for(y=0;y<RadioList.length;y++){
						RadioList[y].disabled="true";
					}
				}
			}
		}

		oData.value = mx_dom.xml;	
	} 
//DEBUG::display data being sent back
//alert("XML Data being sent back: \n==========================\n" + oData.value);
}

function ChangeCheckBoxValue(){
	var SrcEl = event.srcElement;
	if(SrcEl.tagName=="INPUT" && SrcEl.type=="checkbox"){
		if(SrcEl.value=="" || SrcEl.value=="on"){
			SrcEl.value="off";
		}else{
			SrcEl.value="on";
		}
	}
}

function sOptionalAttr(aoNode,asAttr)
{
	var lsResult="";
	if(aoNode.attributes.getNamedItem(asAttr))
		lsResult=aoNode.attributes.getNamedItem(asAttr).text;
	return lsResult;
}	
function fNumericOptionalAttr(aoNode,asAttr)
{
	var lsResult=sOptionalAttr(aoNode,asAttr);
	if(lsResult>"")
		return parseFloat(lsResult);
	else
		return 0;
}	
function sValidateAdd(aoNode)
{
	var lsResult="";
	if(aoNode.attributes.getNamedItem("validate"))
	{
		lsResult=aoNode.attributes.getNamedItem("validate").text;
		if(lsResult>"")
			lsResult='onblur="'+lsResult+'" ';
	}
	return lsResult;
}	

//function BuildAGrid(aHTMLContainer, aFieldofGrid)
//aHTMLContainer -- this is the DIV or SPAN tag that
//will hold the Grid
//aFieldofGrid -- this is the FIELD tag in the XML 
//stream that is parsed out of the hidden input tag
//that holds all of the grid metadata and data
function BuildAGrid(aHTMLContainer, aFieldofGrid){

	var gridHeader_NodeList, gridBody_NodeList, navi_NodeList;
	var colKeyNode, colKey;
	var colLen, rowLen;
	var bldHTML;
	var lsColName, lsColValue, lsColType, c, colClass, saveClass, cLink, colAction;
	var colWidth, colWidthNode;
	var navigator = new Array("","","","");
	var navi_css = new Array("class=\"button_disable\" ", "class=\"button_disable\" ", "class=\"button_disable\" ", "class=\"button_disable\" ");
	
	var lsTmp;
	var lsResult;
	var lfDefaultNumLength=10;
	var lfDefaultInputLength=30;
	var liBuiltItemCount=0;

	bldHTML = "<TABLE width=\"100%\" id=\""+aHTMLContainer.id+"_table\" border=\"1\" class=\"colorspecs\" bordercolor=\"#ffffff\" bordercolorlight=\"#c0c0c0\" cellPadding=\"0\" cellSpacing=\"0\">\n";
	
	gridHeader_NodeList = aFieldofGrid.selectNodes(".//COLUMN");
	colLen = gridHeader_NodeList.length;
	
	gridBody_NodeList = aFieldofGrid.selectNodes(".//ROW");
	rowLen = gridBody_NodeList.length;
	
	navi_NodeList = aFieldofGrid.selectNodes(".//GRIDREFRESH");
	
	//validation
	if ((colLen==0) && (rowLen==0))
	{
		alert("Grid builder error: wrong column number");
		return;
	}
	
	//build table head
	//assuming: there is only one title
	if (colLen != 0)
	{
		bldHTML += "<TR id=\""+aHTMLContainer.id+"_head\" class=\"head\">" + "\n";
		for (var i=0; i<colLen; i++)
		{
			lsColName = gridHeader_NodeList.item(i).attributes.getNamedItem("name").text;
			lsColType = gridHeader_NodeList.item(i).attributes.getNamedItem("type").text;
			
			colWidthNode = gridHeader_NodeList.item(i).attributes.getNamedItem("width");
			if ((colWidthNode) && (colWidthNode.text != ""))
				colWidth = "width="+colWidthNode.text
			else
				colWidth = "";
			
			if (gridHeader_NodeList.item(i).attributes.getNamedItem("type").text == "hidden")
				colClass = " style=\"display:none\" "
			else
				colClass = "";
			bldHTML += "<TD "+colWidth+" class=\"headinfo\" id=\""+lsColName+ "\" name=\""+lsColName+"\" "+ colClass
			if (lsColType=="number")
				{bldHTML +=" align=\"right\"";
				};
			bldHTML += ">";
			bldHTML += gridHeader_NodeList.item(i).attributes.getNamedItem("title").text;
			bldHTML += "</TD>";
		}
		bldHTML += "</TR>" + "\n";
	}
	// build table body
	if (rowLen != 0)
	{
		c= 'class="bgcolor"';
		saveClass = "";
		for (var i=0; i<rowLen; i++)
		{
			bldHTML += "<TR " +c+">" + "\n";
			//if (c == "") 'commented out by Lovai to change the row colors of the grid
				c = 'class="bgcolor"';
			//else  commented out by Lovai to change the row colors of the grid
			//	c = 'bgcolor="#dcdcdc"'; commented out by Lovai to change the row colors of the grid
			for (var j=0; j<colLen; j++)
			{
				//    lsColName: COLUMN 's name
				//   lsColValue: COLUMN content
				//    lsColType: COLUMN type
				// colWidthNode: COLUMN width node
				//   colKeyNode: COLUMN key value node
				//    saveClass: original class
				
				lsColName = gridHeader_NodeList.item(j).attributes.getNamedItem("name").text;
				lsColValue = gridBody_NodeList.item(i).attributes.getNamedItem(lsColName).text;
				lsColType = gridHeader_NodeList.item(j).attributes.getNamedItem("type").text;
				colWidthNode = gridHeader_NodeList.item(j).attributes.getNamedItem("width");
				colKeyNode = gridHeader_NodeList.item(j).attributes.getNamedItem("key");
				// check and set width attribute
				colWidth = "";
				if (colWidthNode)
					if (colWidthNode.text != "")
						colWidth = " width="+colWidthNode.text;
				// check and set action attribute
				if (gridHeader_NodeList.item(j).attributes.getNamedItem("action"))
				{
					colAction = gridHeader_NodeList.item(j).attributes.getNamedItem("action").text;
					saveClass = ' saveClass="" '; //default is actionColumn when has action attribute
				}
				else
					colAction = "";
				// check and set key attribute
				if (colKeyNode)
					colKey = ' key="'+colKeyNode.text+'" ';
				else
					colKey = "";
					
				if (gridBody_NodeList.item(i).attributes.getNamedItem("link"))
					cLink = gridBody_NodeList.item(i).attributes.getNamedItem("link").text
				else
					cLink ="";
				
				colClass="";
				switch (lsColType)
				{
					case "input":
						liBuiltItemCount++;
						lsColName+=liBuiltItemCount.toString();
						lsResult=fNumericOptionalAttr(gridHeader_NodeList.item(j),"maxstrlen")
						if(lsResult==null || isNaN(lsResult))
							lsResult=lfDefaultInputLength;
						lsTmp ='<INPUT id="'+lsColName+'" name="'+lsColName+'" type="text" maxlength="'+lsResult+'" size="'+lsResult+'" ';
						lsTmp+=' value="'+lsColValue+'" '+sValidateAdd(gridHeader_NodeList.item(j))+'/>';
						lsColValue=lsTmp;
						break;
					case "select":
						liBuiltItemCount++;
						lsColName+=liBuiltItemCount.toString();
							
						//??want MULTIPLE attribute? - maybe later per KWS
						var ox_ChildNodeList = gridHeader_NodeList.item(j).selectNodes("SELECTITEMS");
						lsResult=parseInt(ox_ChildNodeList.item(0).attributes.getNamedItem("listcount").text,10);
						ox_ChildNodeList = ox_ChildNodeList.item(0).selectNodes("SELECTITEM");
						lsResult=ox_ChildNodeList.length;
						if(lsResult)
						{
							var lsWork;
							lsTmp ='<SELECT id="'+lsColName+'" name="'+lsColName+'" ';
							//if(lsResult>10)
							//	lsTmp+='size="10"';
							lsTmp+='>\n';
							
							for(var y=0;y<ox_ChildNodeList.length;y++)
							{
								lsResult=ox_ChildNodeList.item(y).attributes.getNamedItem("value").text;
								lsTmp+='<OPTION VALUE="'+ox_ChildNodeList.item(y).attributes.getNamedItem("id").text+'" ';
								if(lsResult==lsColValue)
									lsTmp+='SELECTED';
								lsTmp+='>'+lsResult+'\n';
							}
							lsTmp+='</SELECT>\n';
						}
						lsColValue=lsTmp;
						break;
					case "checkbox":
						if (lsColValue == "on")
							lsColValue = '<INPUT type="checkbox" class="checkbox" checked/ >';
						else
							lsColValue = '<INPUT type="checkbox" class="checkbox"/ >';
						break;
					case "boolean":
						colClass = 'class="bodyoperation" ';
						if (lsColValue.toUpperCase() != "TRUE") {lsColValue="r";}
						else {lsColValue="a";}
						break;
					case "hidden":
						colClass = 'style="display:none" ';
						break;
					case "symbol":
						if (colAction == "")
							colClass = 'class="onlySymbol" ';
						else
							colClass = 'class="actionColumnSymbol" ';
						saveClass = ' saveClass="Symbol" ';
						break; 
					case "date":
						colClass =' class="number" ';	//text-align=right
						//alert(lsColValue);
						break;
					case "calendar":
						//colClass =' class="number" ';
						liBuiltItemCount++;
						lsColName+=liBuiltItemCount.toString();
						lsResult="";
						lsResult=fNumericOptionalAttr(gridHeader_NodeList.item(j),"validate")

						lsTmp ='<INPUT id="'+lsColName+'" name="'+lsColName+'" maxlength="10" size="10" class="number"';
						lsTmp+=' value="'+lsColValue+'" />';
						lsTmp+='<A href="javascript:ShowCalendar(document.all.dateimg'+liBuiltItemCount;

						lsTmp+=',document.all.'+lsColName+',null,-365*20,365*20)" onclick="event.cancelBubble=true;" ';
						
						lsTmp+=sValidateAdd(gridHeader_NodeList.item(j));
						lsTmp+='>';
						
						lsTmp+='<IMG align="top" border="0" id="dateimg'+liBuiltItemCount+'" src="images/caldate.gif" style="POSITION: relative" /></A>';
						lsColValue=lsTmp;
						//alert(lsColValue);
						break;
					case "currency":
					case "numeric":
					case "calculator":
						colClass =' class="number" ';
							
						liBuiltItemCount++;
						lsResult=fNumericOptionalAttr(gridHeader_NodeList.item(j),"maxstrlen")
						if(lsResult==null)
							lsResult=lfDefaultNumLength;
						lsColName+=liBuiltItemCount.toString();
						lsTmp ='<INPUT id="'+lsColName+'" name="'+lsColName+'" maxlength="'+lsResult+'" size="'+lsResult+'" ';
						lsTmp+=' value="'+lsColValue+'"';
						lsTmp+=' class="number" />';
						lsTmp+='<A href="javascript:ShowCalculator(document.all.calcimg'+liBuiltItemCount;
						lsTmp+=',document.all.'+lsColName+',';
						lsResult=fNumericOptionalAttr(gridHeader_NodeList.item(j),"decimalplaces")
						if(lsResult==null)
							lsResult=0;
						lsTmp+=lsResult+',';
						
						lsResult=sValidateAdd(gridHeader_NodeList.item(j))
						if(lsResult>"")
							lsResult="'"+lsResult+"'"; //we have a validate string, so use it
						else
							lsResult="'document.all."+lsColName+".value=asResult;'"; // else build a validate string that just sets the value attribute of the column
						lsTmp+=lsResult+')" ';

						lsTmp+='onclick="event.cancelBubble=true;">';
						lsTmp+='<IMG align="top" border="0" height="21" id="calcimg'+liBuiltItemCount+'" src="images/caldate.gif" style="POSITION: relative"/></A>';
						lsColValue=lsTmp;
						//alert(lsColValue);
						break;
					
					case "number":
						colClass =' class="number" ';
						break;
					case "rawhtml":
					case "string":
						if (colAction == "")
							colClass = "";
						else
							colClass = ' class="actionColumn" ';
						break;
					default:
						alert('XML Data error: invalid column type: "'+lsColType+'"');
						colClass="";
				}
				if (colAction != "")
				{
					colAction += " onmouseover=\"window.event.srcElement.className='mouseover'+window.event.srcElement.saveClass;\" onmouseout=\"window.event.srcElement.className='actionColumn'+window.event.srcElement.saveClass;\" ";
				}
				if (lsColValue != "")
					bldHTML += "<TD " +colWidth+" "+ colClass + colAction + colKey + saveClass +">" 
				else
					bldHTML += "<TD " +colWidth+" "+ colClass + colKey + saveClass +">" ;
				
				if (cLink != "")
					bldHTML += "<A id=\"hypergrid\" href=\"" + cLink + "\">";

				if (lsColValue != "")
					bldHTML += lsColValue;
				else
					bldHTML += "&nbsp;";
				
				if (cLink != "")
					bldHTML += "</A>";

				bldHTML += "</TD>" + "\n";
			}
			bldHTML += "</TR>" + "\n";
		}
	}
	//build footer
	bldHTML += "<TR id=\"foot\">\n";
	bldHTML += "<TD colspan=\"2\">";
	if (aFieldofGrid.selectNodes(".//PAGES").item(0).attributes.getNamedItem("currentpage") &&
		(aFieldofGrid.selectNodes(".//PAGES").item(0).attributes.getNamedItem("currentpage").text != ""))
	{
		bldHTML += aFieldofGrid.selectNodes(".//PAGES").item(0).attributes.getNamedItem("currentpage").text;
	}
	else
	{
		bldHTML += "Unknown";
	}
	bldHTML += " of ";
	if (aFieldofGrid.selectNodes(".//PAGES").item(0).attributes.getNamedItem("totalpage") &&
		(aFieldofGrid.selectNodes(".//PAGES").item(0).attributes.getNamedItem("totalpage").text != ""))
	{
		bldHTML += aFieldofGrid.selectNodes(".//PAGES").item(0).attributes.getNamedItem("totalpage").text;
	}
	else
	{
		bldHTML += "Unknown";
	}
	bldHTML += "</TD>";
	bldHTML += "<TD colspan="+(colLen-2)+" class=\"GridFoot\">";
	bldHTML += "<DIV align=\"right\">";
	bldHTML += "<TABLE border=0 cellpadding=0 cellspacing=0>\n";
	bldHTML += "<TR>\n";
	for (i = 0; i<navi_NodeList.length; i++)
	{
		switch (navi_NodeList.item(i).attributes.getNamedItem("direction").text)
		{
			case "first":
				navigator[0] = "onclick=\"refreshPage(\'" + navi_NodeList.item(i).attributes.getNamedItem("src").text + "\',\'"+aHTMLContainer.id+"\');\""
				navigator[0] += " onmouseover=\"window.event.srcElement.className='button_over';\" " + " onmouseout=\"window.event.srcElement.className='button_normal';\" ";
				navigator[0] += " onmousedown=\"window.event.srcElement.className='button_down';\"";
				navi_css[0] = "class=\"button_normal\" ";
				break;
			case "previous":
				navigator[1] = "onclick=\"refreshPage(\'" + navi_NodeList.item(i).attributes.getNamedItem("src").text + "\',\'"+aHTMLContainer.id+"\');\""
				navigator[1] += " onmouseover=\"window.event.srcElement.className='button_over';\" " + " onmouseout=\"window.event.srcElement.className='button_normal';\" ";
				navigator[1] += " onmousedown=\"window.event.srcElement.className='button_down';\"";
				navi_css[1] = "class=\"button_normal\" ";
				break;
			case "next":
				navigator[2] = "onclick=\"refreshPage(\'" + navi_NodeList.item(i).attributes.getNamedItem("src").text + "\',\'"+aHTMLContainer.id+"\');\""
				navigator[2] += " onmouseover=\"window.event.srcElement.className='button_over';\" " + " onmouseout=\"window.event.srcElement.className='button_normal';\" ";
				navigator[2] += " onmousedown=\"window.event.srcElement.className='button_down';\"";
				navi_css[2] = "class=\"button_normal\" ";
				break;
			case "last":
				navigator[3] = "onclick=\"refreshPage(\'" + navi_NodeList.item(i).attributes.getNamedItem("src").text + "\',\'"+aHTMLContainer.id+"\');\""
				navigator[3] += " onmouseover=\"window.event.srcElement.className='button_over';\" " + " onmouseout=\"window.event.srcElement.className='button_normal';\" ";
				navigator[3] += " onmousedown=\"window.event.srcElement.className='button_down';\"";
				navi_css[3] = "class=\"button_normal\" ";
				break;
		}
	}
	//first
	bldHTML += "<TD "+navi_css[0]+navigator[0]+">9</TD>\n";
	//previous
	bldHTML += "<TD "+navi_css[1]+navigator[1]+">3</TD>";
	//next
	bldHTML += "<TD "+navi_css[2]+navigator[2]+">4</TD>";
	//last
	bldHTML += "<TD "+navi_css[3]+navigator[3]+">:</TD>";
	bldHTML += "</TR>\n";
	bldHTML += "</TABLE>\n";
	bldHTML += "</DIV>\n";
	bldHTML += "</TD>\n";
	bldHTML += "</TR>\n";
	bldHTML += "</TABLE>";
	
	//yong's sample code
	//bldHTML += "<BUTTON onclick=PackData()>Test Packing</BUTTON>";
	//end of yong's sample code
	aHTMLContainer.innerHTML = bldHTML;
	
	//alert(bldHTML);
	//HTML elements have been created by the line immediately above, so now we can add 
	//optional attributes to the column header HTML elements
	var oHTMLEl;
	if (colLen != 0)
	{
		for(i=0;i<colLen;i++)
		{
			lsColName = gridHeader_NodeList.item(i).attributes.getNamedItem("name").text;	//xml node
			oHTMLEl=eval('document.all.'+lsColName);
			//alert(lsColName+"="+oHTMLEl.id);
			if(oHTMLEl.id != "undefined")
			{
				for(var y=0;y<maOptAttrNames.length;y++)
				{
					vSetXMLOptAttr(gridHeader_NodeList.item(i),oHTMLEl,maOptAttrNames[y]);
				}
			}
		}
	}
	/****************************************************************
	//now apply any attributes to the individual HTML elements
	for(var z=0;z<document.all.length;z++)
	{
		//alert(document.all[z].id);
		if(document.all[z].id > "" && document.all[z].id != "undefined")
		{
			oHTMLEl=document.all[z];
			for(i=0;i<colLen;i++)
			{
				lsColName = gridHeader_NodeList.item(i).attributes.getNamedItem("name").text;	//xml node
				if(document.all[z].id.length > lsColName.length)
				{
					if(document.all[z].id.substr(0,lsColName.length)==lsColName)
					{
						lsColType = gridHeader_NodeList.item(i).attributes.getNamedItem("type").text;	
						oHTMLEl.setAttribute("subtype",lsColType);	
						for(var y=0;y<maOptAttrNames.length;y++)
						{
							if(document.all(lsColName).getAttribute(maOptAttrNames[y]))
							{
								vSetXMLOptAttr(gridHeader_NodeList.item(i),oHTMLEl,maOptAttrNames[y]);
							}
						}
						break;
					}
				}
			}
		}
	}
	********************************************/
}

function assemblekey(lobjEl) {
	//trace up to TR element
	var lblnFound=0;
	var tempKey="";
	while(lblnFound != 1){
		if(lobjEl.nodeName=='TR'){
			lblnFound = 1;
		}
		else{
			lobjEl = lobjEl.parentElement;
		}
	}
	
	//get the necessary information for name change 
	//starting from TR down
	//lobjEl should equal a TR element
	if (lobjEl.nodeName=='TR'){
		//no error
		for(var i=0;i < lobjEl.cells.length;i++){
			if(lobjEl.cells(i).getAttribute("key")=="true"){
				if (tempKey !="") tempKey += "|";
				tempKey += lobjEl.cells(i).innerText;
			}
		}
	}
	else{
		alert("error tracing up to TR");
	}
	return tempKey;
}


function editthisrecord(url){
	var tempKey = "";
	if (event.srcElement == null)
		return;
	tempKey = assemblekey(event.srcElement);
	if (tempKey != "")
		window.navigate('default.asp?toLoc=' + url + '&key=' + tempKey);
}

function deletethisrecord(url,gridid){
	var tempKey = "";
	if (event.srcElement == null)
		return;
	tempKey = assemblekey(event.srcElement);
	refreshPage("default.asp?toLoc=" + url + "&key=" + tempKey,gridid);
}

function deletethisrecordconfirm(url,gridid){
	var tempKey = "";
	if (event.srcElement == null)
		return;
	tempKey = assemblekey(event.srcElement);
	if (confirmdelete(tempKey))
	refreshPage("default.asp?toLoc=" + url + "&key=" + tempKey,gridid);
}

function convertthisrecord(url){
	var tempKey = "";
	if (event.srcElement == null)
		return;
	tempKey = assemblekey(event.srcElement);
	if (tempKey != "")
		window.navigate('default.asp?toLoc=' + url + '&key=' + tempKey + '&ActionType=convert');
	}