// JavaScript Document

String.prototype.trim = function() {
	return this.replace(/^\s+|\s+$/g,"");
}
String.prototype.ltrim = function() {
	return this.replace(/^\s+/,"");
}
String.prototype.rtrim = function() {
	return this.replace(/\s+$/,"");
}
String.prototype.xmlEncode = function() {
	return this.replace(/&/g,'&amp;').
		replace(/</g,'&lt;').
		replace(/>/g,'&gt;').
		replace(/\'/g,'&apos;').
		replace(/"/g,'&quot;').
		replace(/\r/g,'&#10;').
		replace(/\n/g,'&#13;');
}

var overGridCheckbox = false;
var curr_row = null;
var colMapping;
var colAlignment;

function URLencode(sStr) { 
	return escape(sStr). 
		replace(/\+/g, '%2B'). 
			replace(/\"/g,'%22'). 
				replace(/\'/g, '%27'). 
					replace(/\//g,'%2F'); 
}

function xmlEncode(sStr) {
	return sStr.replace(/&/g,'&amp;').
		replace(/</g,'&lt;').
		replace(/>/g,'&gt;').
		replace(/\'/g,'&apos;').
		replace(/"/g,'&quot;').
		replace(/\r'/g,'&#10;').
		replace(/\n/g,'&#13;');
}

function formatCurrency(num) {
	num = num.toString().replace(/\$|\,/g,'');
	if (isNaN(num)) num = "0";
	
	sign = (num == (num = Math.abs(num)));
	num = Math.floor(num * 100 + 0.50000000001);
	cents = num % 100;
	num = Math.floor(num / 100).toString();
	
	if (cents < 10) cents = "0" + cents;
	for (var i = 0; i < Math.floor((num.length - (1 + i)) / 3); i++)
		num = num.substring(0, num.length - (4 * i + 3)) + ',' + num.substring(num.length - (4 * i + 3));
		
	return (((sign) ? '' : '-') + '$' + num + '.' + cents);
}

function ajaxRequest(eventObj, callbackFunction, debug) {				// This is the object constructor
	var that = this;													// A workaround for some javascript idiosyncrocies
	var updating = false;												// Set to true if this object is already working on a request
	
	if (callbackFunction == null)
		this.callback = function() { }									// A post-processing call -- a stub you overwrite.
	else
		this.callback = callbackFunction;
	
	this.update = function(url, param, contentType) {					// Initiates the server call.
		if (updating == true) { return false; }							// Abort if we're already processing a call.
		updating = true;												// Set the updating flag.
		var AJAX = null;												// Initialize the AJAX variable.
		if (window.XMLHttpRequest)										// Are we working with mozilla?
			AJAX = new XMLHttpRequest();								//  Yes -- this is mozilla.
		else															// Not Mozilla, must be IE
			AJAX = new ActiveXObject("Microsoft.XMLHTTP");				//  Wheee, ActiveX, how do we format c: again?

		if (AJAX == null) {												// If we couldn't initialize Ajax...
			alert("Your browser doesn't support AJAX.");				// Sorry msg.
			return false;												// Return false (WARNING - SAME AS ALREADY PROCESSING!)
		
		} else {
			AJAX.onreadystatechange = function() {							// When the browser has the request info..
				if (AJAX.readyState == 4 || AJAX.readyState=="complete") {	//   see if the complete flag is set.
				
					var res = AJAX.responseXML;
					
					if (l_debug) alert(AJAX.responseText);
					
					var responseCode = 0;
						
					if (res != null) {
						var xmlStatus = res.getElementsByTagName("ajax_status");
	
						// if return response is "success" then proceed
						if (xmlStatus != null) {
							responseCode = checkXMLResponse(xmlStatus);
							if (responseCode == 1) {
								// immediate processing logic goes here
							}
						}
					}
					
					delete AJAX;										//   delete the AJAX object since it's done.
					updating = false;									//   Set the updating flag to false so we can do a new request
					
					if (responseCode == 2)
						top.window.location.href = "index?timeout=1";
					else
						that.callback(res);							//   Call the post-processing function.
				}													// End Ajax readystate check.
			}														// End create post-process fucntion block.

			
			AJAX.open("POST", url, true);									// Open the url this object was set-up with.
			
			if (contentType != null && contentType.toLowerCase() == "xml")
				AJAX.setRequestHeader("Content-Type", "text/xml");
				
			else {
				param += "&ts=" + (new Date() * 1);						// Append date to url (so the browser doesn't cache the call)
				AJAX.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
			}
			
			if (l_debug) alert(param);
			
			AJAX.send(param);										// Send the request.
			return true;											// Everything went a-ok.
		}															// End Ajax setup aok if/else block
	}
	
	// This area set up on constructor calls.
	var l_eventObj = eventObj;										// Remember the layer associated with this object.
	var l_debug = (debug == null ? false : debug);
}

function checkXMLResponse(xmlStatus, silent) {
	if (xmlStatus == null || xmlStatus.length == 0) return 0;
	
	var statusCode = nvlXML(xmlStatus[0].getElementsByTagName("code")[0]);
	
	if (statusCode == "timeout") {
		return 2;
		
	} else if (statusCode != "success") {
		var statusMsg = nvlXML(xmlStatus[0].getElementsByTagName("message")[0]);
		if (silent == null || silent == false)
			alert("Error:\n\n" + statusMsg);
		
		return 0;
	
	} else return 1;
}

function nvlXML(node, dataIfNULL) {
	try {
		return node.firstChild.nodeValue;
	} catch (err) {
		if (dataIfNULL != null)
			return dataIfNULL;
		else
			return "";
	}
}

function clearTable(table) {
	while (table.rows.length > 0) table.deleteRow(0);
}

function getTBODY(table) {
	var tableBody = null;
	
	// find the table <TBODY> element to append child rows to
	for (var i = 0; i < table.childNodes.length; i++) {
		if (table.childNodes[i].tagName == "TBODY") {
			tableBody = table.childNodes[i];
			break;
		}
	}
	
	if (tableBody == null)
		alert("Error: Could not find grid table element TBODY.");
	
	return tableBody;
}

function getTableColHeaders(table, columns, align, key, columnObj) {
	var colGroup = null;
		
	for (var i = 0; i < table.childNodes.length; i++) {
		if (table.childNodes[i].tagName == "COLGROUP") {
			colGroup = table.childNodes[i];
			break;
		}
	}
	
	if (colGroup == null) return false;
		
	for (var i = 0; i < colGroup.childNodes.length; i++) {
		if (colGroup.childNodes[i].tagName == "COL") {
			if (columns != null)
				columns[columns.length] = colGroup.childNodes[i].getAttribute("_field");
			
			if (align != null)
				align[align.length] = colGroup.childNodes[i].getAttribute("_align");
				
			if (key != null)
				key[key.length] = colGroup.childNodes[i].getAttribute("_key");
				
			if (columnObj != null)
				columnObj[columnObj.length] = colGroup.childNodes[i];
		}
	}
}

function gridCheckboxOver() {
	overGridCheckbox = true;
}

function gridCheckboxOut() {
	overGridCheckbox = false;
}

function rowOver(ev) {
	var row = ev.target || ev.srcElement;
	
	while (row.tagName != "TR" && row.parentNode != null)
		row = row.parentNode;
		
	if (row.tagName != "TR") return false;
		
	if (curr_row != null && curr_row == row)
		row.style.background = "#E8E800";
	else
		row.style.background = "#FFFFA8";
}

function rowOut(ev) {
	var row = ev.target || ev.srcElement;
	
	while (row.tagName != "TR" && row.parentNode != null)
		row = row.parentNode;
		
	if (row.tagName != "TR") return false;
	
	if (curr_row != null && curr_row == row)
		row.style.background = "#E8E800";
	else
		row.style.background = "transparent";
}

function indexColumns(tableName) {
	var columns = new Array();
	var allignments = new Array();
	
	var table = document.getElementById("tbl-grid");
	getTableColHeaders(table, columns, allignments);
	
	colMapping = new Array();
	colAlignment = new Array();
	
	for (var i = 0; i < columns.length; i++) {
		colMapping[columns[i]] = i;
		colAlignment[columns[i]] = allignments[i];
	}
}

function buildTable(tableGrid, xmlPageInfo, xmlData, enableRowDblClick) {
	try {
		var tableBody = getTBODY(tableGrid);
		if (tableBody == null)
			return false;
			
		clearTable(tableBody);
		
		if (xmlData == null || xmlData.length == 0)
			return false;
		
		// enumerate all the table columns
		var columns = new Array();
		var align = new Array();
		var key = new Array();
		var columnObj = new Array();
		
		getTableColHeaders(tableGrid, columns, align, key, columnObj);
		
		if (enableRowDblClick == null) enableRowDblClick = true;
		
		var rowOffSet = parseInt(nvlXML(xmlPageInfo[0].getElementsByTagName("start_row")[0]));
		if (isNaN(rowOffSet)) rowOffSet = 0;
		rowOffSet++;
		
		var numRows = parseInt(nvlXML(xmlPageInfo[0].getElementsByTagName("num_rows")[0]));
		if (isNaN(numRows)) numRows = "";
		
		for (var i = 0; i < xmlData.length; i++) {
			newR = document.createElement("tr");
			
			newR.onmouseover = function(ev) { ev = ev || window.event; rowOver(ev); }
			newR.onmouseout = function(ev) { ev = ev || window.event; rowOut(ev); }
			//newR.onclick = function(ev) { ev = ev || window.event; rowClicked(ev); }
			
			if (enableRowDblClick)
				newR.ondblclick = function(ev) { ev = ev || window.event; rowDblClicked(ev); }
			
			for (var col = 0; col < columns.length; col++) {
					
				newC = document.createElement("td");
				
				if (columns[col] == "[rownum]") {
					newC.innerHTML = (i + rowOffSet);
					newC.style.textAlign = "right";
					newC.style.color = "#999999";

				} else if (columns[col] == "[check]") {
					// assign key data to cell
					try {
						newC.setAttribute("_key", nvlXML(xmlData[i].getElementsByTagName(key[col])[0]));
					} catch (err) {
						alert("Error In: buildTable\n\nUnable to get [check] XML node for " + key[col]);
						continue;
					}
					
					var chkSelect = document.createElement("INPUT");
					chkSelect.type = "checkbox";
					
					if (columnObj[col].getAttribute("_name") != null) {
						chkSelect.name = columnObj[col].getAttribute("_name");
						chkSelect.id = columnObj[col].getAttribute("_name");
						
					} else {
						chkSelect.name = "chkSelect";
						chkSelect.id = "chkSelect";
					}
					
					chkSelect.value = nvlXML(xmlData[i].getElementsByTagName(key[col])[0]);
					
					if (columnObj[col].getAttribute("_chkColumn") != null) {
					}
											  
					chkSelect.checked = "";
					chkSelect.onclick = function(ev) { ev = ev || window.event; checkBoxClicked(ev); }
	
					newC.style.textAlign = "center";
					newC.appendChild(chkSelect);
					
					newC.onmouseover = function() { gridCheckboxOver(); }
					newC.onmouseout = function() { gridCheckboxOut(); }
												
				} else if (columns[col] == "[spacer]") {
					newC.innerHTML = "";
	
				} else {		
					try {						
						var value = nvlXML(xmlData[i].getElementsByTagName(columns[col])[0]);
						newC.setAttribute("_value", value);
						
						if (align[col] == "cb") {
							// convert value and display as boolean
							if (value == "1" || value == "Y")
								value = "Y";
							else
								value = "";							
						}
						
						if (columnObj[col].getAttribute("_format") != null && columnObj[col].getAttribute("_format") == "currency")
							newC.innerHTML = "<div nowrap>" + formatCurrency(value) + "</div>";
						else
							newC.innerHTML = "<div nowrap>" + value + "</div>";
	
						if (align[col] == "c" || align[col] == "cb")
							newC.style.textAlign = "center";
							//newC.setAttribute("className", "cellDataCenter");
						else if (align[col] == "r")
							newC.style.textAlign = "right";
							//newC.setAttribute("className", "cellDataRight");
						
					} catch (err) {
						// null
					}
				}
				
				newR.appendChild(newC);
			}
			
			tableBody.appendChild(newR);
		}
		
	} catch (err) {
		alert("Error In: buildTable\n\n" + err.message);
	}
}

function rowDblClicked(ev) {
	if (overGridCheckbox == true) return false;
		
	var row = ev.target || ev.srcElement

	while (row.tagName != "TR" && row.parentNode != null)
		row = row.parentNode;

	if (row.tagName != "TR") return false;

	var colIndex = colMapping["[check]"];
	
	if (colIndex != null) {
		var key = row.cells[colIndex].getAttribute("_key");	

		try {
			local_rowClicked(key);
		} catch (err) {
			// do nothing
		}
	}
}

function populateDocXMLData(xmlData) {
	try {
		var startField = null;
		
		// get array of document elements
		var ele = document.getElementsByTagName("*");
		
		if (ele != null && ele.length > 0) {
			for (var i = 0; i < ele.length; i++) {
				
				var column = ele[i].getAttribute("_column");
				if (column == null) column = "";
				
				isStartField = ele[i].getAttribute("_startField");
				if (isStartField == null) isStartField = "";
				
				try {
					if (column > "") {
						if (ele[i].tagName == "SELECT") {
							var value = nvlXML(xmlData[0].getElementsByTagName(column)[0]);
							
							for (var j = 0; j < ele[i].options.length; j++) {
								if (ele[i].options[j].value == value) {
									ele[i].selectedIndex = j;
									ele[i].setAttribute("_curValue", value);
									break;
								}
							}
							
						} else if (ele[i].type == "text" || ele[i].type == "hidden") {
							ele[i].value = nvlXML(xmlData[0].getElementsByTagName(column)[0]);
							ele[i].setAttribute("_curValue", ele[i].value);
												
							if (isStartField == "1") startField = ele[i];
							
						} else if (ele[i].type == "textarea") {
							ele[i].value = nvlXML(xmlData[0].getElementsByTagName(column)[0]);
							ele[i].setAttribute("_curValue", ele[i].value);
															
							if (startField == "1") startField = ele[i];
							
						} else if (ele[i].type == "checkbox") {
							if (ele[i].value == nvlXML(xmlData[0].getElementsByTagName(column)[0]))
								ele[i].checked = true;
							else
								ele[i].checked = false;
							
							ele[i].setAttribute("_checked", ele[i].checked);
							
						} else if (ele[i].tagName == "TD" || ele[i].tagName == "SPAN") {
							ele[i].innerHTML = nvlXML(xmlData[0].getElementsByTagName(column)[0]);
						}
					}
					
					/*
					if (ele[i].type == "text" && ele[i]._column > "" ) {
						ele[i].value = xmlNVL(xmlData[0].getElementsByTagName(ele[i]._column.toUpperCase())[0].firstChild);
						ele[i]._curValue = ele[i].value;
												
						if (ele[i]._startField != null && ele[i]._startField == "1") startField = ele[i];
					}
					
					var chkStatus = document.getElementById("chk.status");
					if (chkStatus != null) {
					chkStatus.checked = (xmlNVL(xmlData[0].getElementsByTagName("DELETED_RECORD")[0].firstChild) == "A");
					chkStatus._checked = chkStatus.checked;
					}
					*/
	
				} catch (err) {
					alert("Error In: populateDocXMLData\n\nUnable to populate data for field " + column + "\n\n" + err.message);
				}
			}
			
			if (startField != null) {
				// Put default focus on field with lowest tabIndex value
				startField.select();
				startField.focus();
			}
		}
		
	} catch (err) {
		alert("Error In: populateDocXMLData\n\n" + err.message);
	}
}

function countCheckSelected() {
	var checks = document.getElementsByName("chkSelect");
	var count = 0;
	
	for (var i = 0; i < checks.length; i++)
		if (checks[i].checked) count++;
	
	return count;
}

function getCheckSelected(elementName) {
	if (elementName == null || elementName == "")
		elementName = "chkSelect";
		
	var checks = document.getElementsByName(elementName);	
	var selected = new Array();
	var count = 0;
	
	for (var i = 0; i < checks.length; i++) {
		if (checks[i].checked) {
			selected[count++] = checks[i].value;
		}
	}
	
	return selected;
}

function buildCheckedKeysXML(keyColumn, elementName) {
	var xml = "";
	
	var checkboxes = document.getElementsByName(elementName);
	
	for (var i = 0; i < checkboxes.length; i++) {
		if (checkboxes[i].checked) {
			if (xml > "") xml += "\n";
			xml += "\t<record>";
			xml += "\n\t\t<" + keyColumn + ">" + checkboxes[i].value + "</" + keyColumn + ">";
			xml += "\n\t<\/record>";
		}
	}
	
	return xml;
}

function doSave(formID, excludeElementID) {
	if (!validateForm(formID)) return false;
	
	var xmlData = buildXML(formID, excludeElementID);
	
	if (xmlData != null && xmlData > "") {				
		document.getElementById("btn-left").disabled = true;
		document.getElementById("btn-right").disabled = true;
		
		var ajxReq = new ajaxRequest(document.getElementById(formID), updateReturn);
		
		var form = document.getElementById(formID);	
		var mode = form.getAttribute("_mode");
	
		if (mode == "add")
			ajxReq.update("server?cmd=g_insert", xmlData, "xml");
		else
			ajxReq.update("server?cmd=g_update", xmlData, "xml");
	}
}

function receiveEditData(xmlData) {
	populateDocXMLData(xmlData.getElementsByTagName("record"))
}

function prepareForm(formID) {
	var form = document.getElementById(formID);
	if (form == null) return false;
	
	var startField = null;
			
	for (var i = 0; i < form.elements.length; i++) {
		var field = form.elements[i];
		if (field.type == "text" || field.type == "textarea") {
			field.onblur = function(ev) { ev = ev || window.event; trimField(ev); }
		}
		
 		isStartField = field.getAttribute("_startField");
		if (isStartField != null && isStartField == "1")
			startField = field;
	}
	
	if (startField != null) {
		startField.select();
		startField.focus();
	}
}

function validateForm(formID) {
	if (formID == null) {
		alert("Error:  FormID missing for validateForm()");
		return false;
	}
	
	var form = document.getElementById(formID);
	if (form == null) return false;
		
	var missingFields = "";
	var focusField = null;
	
	for (var i = 0; i < form.elements.length; i++) {
		var field = form.elements[i];
		if (field.type == "text" || field.type == "textarea") {
			var required = field.getAttribute("_required");
			var label = field.getAttribute("_label");
			if (label == null) label = field.name;
				
			if (required != null && required == "1" && field.value == "") {
				missingFields += "\n\t" + label;
				if (focusField == null) focusField = field;
				
			} else if (field.type == "textarea") {
				var maxLength = field.getAttribute("maxlength");
				
				if (maxLength != null && field.value.length > maxLength) {
					if (!confirm("Data for field \"" + label + "\" is too long.\n\nMax length is " + maxLength + ".\n\nDo you want information to be truncated and continue?")) {
						field.select();
						field.focus();
						return false;
						
					} else {
						field.value = field.value.substring(0, maxLength).trim();
					}
				}
			}
		}
		
	}
	
	if (missingFields > "") {
		alert("The Following required fields are missing data:\n" + missingFields + "\n\nPlease provide required information.");
		focusField.focus();
	}
		
	return (missingFields == "");
}

function clearForm(formID) {
	var form = document.getElementById(formID);
	if (form == null) return false;
	
	var firstField = null;
	
	for (var i = 0; i < form.elements.length; i++) {
		var field = form.elements[i];
		if (field.type == "text" || field.type == "textarea") {
			if (firstField == null) firstField = field;
			field.value = "";
		}
	}
	
	if (firstField) firstField.focus();
	
	return true;
}

function trimField(ev) {
	var field = ev.target || ev.srcElement;
	var trailingSpaces = field.getAttribute("_allowTrailingSpace");
	
	if (trailingSpaces != null && trailingSpaces == "1") {
		// allow trailing spaces so only trim at beginning
		field.value = field.value.ltrim();
		
	} else {
		field.value = field.value.trim();
	}	
}

function buildXML(formID, excludeElementID) {
	var form = document.getElementById(formID);
	if (form == null) return null;
	
	var mode = form.getAttribute("_mode");

	// get array of form elements
	var ele = form.elements;

	var xmlChangedValues = "";
	var xmlPredicate = "";
	var xmlData = null;
		
	if (ele != null && ele.length > 0) {
		for (var i = 0; i < ele.length; i++) {
			var column = ele[i].getAttribute("_column");
			if (column == null || column == "") continue;
			
			var curValue = ele[i].getAttribute("_curValue");
			if (curValue == null) curValue = "";
			
			if (ele[i].tagName == "SELECT") {
				if  (ele[i].value != curValue && column != "") {
					if (xmlChangedValues > "") xmlChangedValues += "\n";
					xmlChangedValues += "\t<" + column + " type=\"string\">" + ele[i].value + "<\/" + column + ">";
				}
	
			} else if (ele[i].type == "text" || ele[i].type == "textarea") {
				if (ele[i].value != curValue && column != "") {
					if (xmlChangedValues > "") xmlChangedValues += "\n";
					
					var dataType = ele[i].getAttribute("_type");
													
					if (dataType != null && dataType == "date") {
						xmlChangedValues += "\t<" + column + " type=\"" + dataType + "\" format=\"" + ele[i].getAttribute("_format") + "\">" + ele[i].value.xmlEncode() + "<\/" + column + ">";
						
					} else {
						xmlChangedValues += "\t<" + column + " type=\"string\">" + ele[i].value.xmlEncode() + "<\/" + column + ">";
					}
				}
				
				// do not check for key if in Add mode since there will be no key yet
				if (ele[i].getAttribute("_isKey") == "1" && mode != "add") {
					if (xmlPredicate > "") xmlPredicate += "\n";
					xmlPredicate += "\t<" + column + ">" + ele[i]._curValue + "<\/" + column + ">";
				}

			} else if (ele[i].type == "hidden") {
				// hidden fields usually only contain key information so there is no need to check for changed values		
				// do not check for key if in Add mode since there will be no key yet
				if (ele[i].getAttribute("_isKey") == "1") {
					if (mode == "add") {
						if (xmlChangedValues > "") xmlChangedValues += "\n";
						
						var sequence = ele[i].getAttribute("_sequence");
						
						if (sequence != null && sequence != "")
							sequence = " sequence=\"" + sequence + "\"";
						else
							sequence = "";
							
						xmlChangedValues += "\t<" + column + sequence + ">" + ele[i].value + "<\/" + column + ">";

					} else {
						if (xmlPredicate > "") xmlPredicate += "\n";	
						xmlPredicate += "\t<" + column + ">" + ele[i].value + "<\/" + column + ">";
					}
				}
			
			} else if (ele[i].type == "checkbox") {
				var curChecked = ele[i].getAttribute("_checked");
				if (curChecked == null) curChecked = false;
				
				if (ele[i].checked != curChecked) {
					if (xmlChangedValues > "") xmlChangedValues += "\n";

					if (ele[i].checked)
						xmlChangedValues += "\t<" + column + " type=\"string\">" + ele[i].value + "<\/" + column + ">";
					else
						xmlChangedValues += "\t<" + column + " type=\"string\" \/>";
				}
			}
		}
	}
	
	if (xmlChangedValues > "") {
		if (mode == "add") {
			//xmlChangedValues += "\t<user_id default=\"user_id\" />";
			xmlChangedValues += "\n\t<create_ts default=\"now\" />";
			
		} else if (mode == "chg") {
			xmlChangedValues += "\n\t<update_ts default=\"now\" />";
		}
		
		xmlChangedValues = "<column>\n" + xmlChangedValues + "\n</column>";
	
		if (xmlPredicate > "") xmlPredicate = "<key>\n" + xmlPredicate + "\n</key>";
		
		xmlData = "<file>";
		xmlData += "\n<table>" + form.getAttribute("_table") + "</table>";
		if (xmlPredicate > "") xmlData += "\n" + xmlPredicate;
		xmlData += "\n" + xmlChangedValues;
		xmlData += "\n</file>";
			
		/*
		if (varScriptDebug == 1) {
			if (!confirm("Debug:\n\n" + xmlData + "\n\nContinue with Save?"))
				return false;
		}
		
		if (mode == "chg")
			ajxSendPOSTXML("adc_api?cmd=g_update", xmlData, "saveReturn", true);
		else if (mode == "add")
			ajxSendPOSTXML("adc_api?cmd=g_insert", xmlData, "saveReturn", true);
		*/
				
	} else
		alert("No changes detected.");
		
	return xmlData;
}

function doFormSend(formID, debug) {
	if (!validateForm(formID)) return false;

	var xmlData = buildMailXML(formID);
	
	if (xmlData > "") {
		if (debug != null && debug == true) alert(xmlData);
			
		document.getElementById("btn-left").disabled = true;
		document.getElementById("btn-right").disabled = true;
		
		var ajxReq = new ajaxRequest(document.getElementById(formID), sendFormReturn);
		ajxReq.update("webform?cmd=send", xmlData, "xml");
	}
}

function sendFormReturn(xmlData) {	
	var xmlStatus = xmlData.getElementsByTagName("ajax_status");
	var page = nvlXML(xmlStatus[0].getElementsByTagName("page")[0]);
	
	if (page > "")
		window.location.href = page;
		
	else {
		document.getElementById("btn-left").disabled = false;
		document.getElementById("btn-right").disabled = false;
	}
}

function buildMailXML(formID) {
	var form = document.getElementById(formID);
	if (form == null) return null;
	
	var hasSubject = false;
	var subject = "";
	
	// get array of form elements
	var ele = form.elements;

	var xmlData = "";

	if (ele != null && ele.length > 0) {
		for (var i = 0; i < ele.length; i++) {
			var label = ele[i].getAttribute("_label");
			if (label == null) label = ele[i].name;
			
			var ls = ele[i].getAttribute("_ls");
			if (ls == null) ls = "";

			if (ele[i].tagName == "SELECT") {
				// xmlData += "\n\t<field name=\"" + label +"\">";
				xmlData += "\n\t<field name=\"" + label +"\" " + (ls > "" ? "ls=\"" + ls + "\" " : "") + ">";

				xmlData += ele[i].value.xmlEncode();
				xmlData += "<\/field>";
	
			} else if (ele[i].type == "text" || ele[i].type == "textarea") {
				xmlData += "\n\t<field name=\"" + label +"\" " + (ls > "" ? "ls=\"" + ls + "\" " : "") + ">";
				xmlData += ele[i].value.xmlEncode();
				xmlData += "<\/field>"; 
				
			} else if (ele[i].type == "hidden") {
				if (ele[i].name == "hid_subject") {
					hasSubject = true;
					subject = ele[i].value.xmlEncode();
				}
			}
		}
	}
	
	if (xmlData > "")
		xmlData = "<file>\n<subject>" + subject + "<\/subject>\n<fields>" + xmlData + "\n<\/fields>\n<\/file>";
	
	if (!hasSubject && !confirm("Form mail has no Subject.  Continue to send?"))
		return false;
	
	return xmlData;
}