function glAppLoad() {
	try {
		glNameIdInitFields();
	} catch(e) {
		glHndlError("glNameIdInitFields() failed - " + e.description, '', '');
	}
}
/***************************************************************************
**************************** Name-Id functions *****************************
****************************************************************************/
var glNameIdFields = new Array();
function glNameIdInitFields() {
	//first create the span container
	var sp = document.createElement('span');
	utSetAttribute(sp, "id", "glSpanDynamicCombo");
	sp.className = "glComboSpanStyle";
	document.body.appendChild(sp);
	sp.style.display='none';
	//now go through the array
	for (var i = 0; i < glNameIdFields.length; i++) {
		var nArr = glNameIdFields[i].split('|');
		var type = nArr[0];
		var nameFieldId = nArr[1];
		var idFieldId = nArr[2];
		var oName = document.getElementById(nameFieldId);
		utSetAttribute(oName, "_nameType", type);
		utSetAttribute(oName, "_idFieldId", idFieldId);
		utAttachEvent(oName, "keyup", glNameIdRetrieveNameCombo);
		utAttachEvent(oName, "change", glNameIdRetrieveIdFromName);
		var oId = document.getElementById(idFieldId);
		utSetAttribute(oId, "_nameType", type);
		utSetAttribute(oId, "_nameFieldId", utGetAttribute(oName,"id"));
		utAttachEvent(oId, "change", glNameIdRetrieveNameFromId);
	}
}
function glNameIdRetrieveNameFromId(e) {
	var oId = utGetEventTarget(e, window.event);
	if (oId.value == '') {
		return;
	}
	var type = utGetAttribute(oId, "_nameType");
	var idFieldId = utGetAttribute(oId, "id");
	var url =	"/UTI_NAM_02_OPN.aspx?" +
				"type=" + utUrlEncode(type) +
				"&idValue=" + utUrlEncode(oId.value) +
				"&idFieldId=" + utUrlEncode(idFieldId);
	utMakeAjaxRequest(url, "glNameIdSetName");
}
function glNameIdRetrieveIdFromName(e) {
	var oName = utGetEventTarget(e, window.event);
	var type = utGetAttribute(oName, "_nameType");
	var nameFieldId = utGetAttribute(oName, "id");
	var idFieldId = utGetAttribute(oName, "_idFieldId");
	if (oName.value == '') {
		oName.className = '';
		if (document.getElementById(idFieldId).readOnly) //if readonly erase id field
			document.getElementById(idFieldId).value = '';
		return;
	}
	var url =	"/UTI_NAM_03_OPN.aspx?" +
				"type=" + utUrlEncode(type) +
				"&nameFieldId=" + utUrlEncode(nameFieldId) +
				"&nameValue=" + utUrlEncode(oName.value);
	utMakeAjaxRequest(url, "glNameIdSetId");
}
function glNameIdSetName(responseXML) {
	var root = utGetXMLRoot(responseXML);
	var type = root.getElementsByTagName('type').item(0).firstChild.data;
	var idValue = root.getElementsByTagName('idValue').item(0).firstChild.data;
	var idFieldId = root.getElementsByTagName('idFieldId').item(0).firstChild.data;
	var oId = document.getElementById(idFieldId);
	var oName = document.getElementById(utGetAttribute(oId, "_nameFieldId"));
	var matchedName = "";
	if (root.getElementsByTagName('matchedName').item(0).firstChild != null)
		matchedName = root.getElementsByTagName('matchedName').item(0).firstChild.data;
	if (matchedName == '') {
		oId.className = 'glError';
		oName.value = '';
	} else {
		if (oId.value == idValue) { //if id is still same
			oId.className = '';
			oName.className = '';
			oName.value = matchedName;
		}
	}
}
function glNameIdSetId(responseXML) {
	var root = utGetXMLRoot(responseXML);
	var type = root.getElementsByTagName('type').item(0).firstChild.data;
	var nameValue = root.getElementsByTagName('nameValue').item(0).firstChild.data;
	var nameFieldId = root.getElementsByTagName('nameFieldId').item(0).firstChild.data;
	var oName = document.getElementById(nameFieldId);
	var oId = document.getElementById(utGetAttribute(oName, "_idFieldId"));
	//if nameValue is not same as the initial value, then bypass
	if (oName.value != nameValue)
		return;
	var matchedId = "";
	if (root.getElementsByTagName('matchedId').item(0).firstChild != null)
		matchedId = root.getElementsByTagName('matchedId').item(0).firstChild.data;
	if (matchedId == '') {
		oName.className = 'glError';
		oId.value = '';
	} else {
		if (oName.value == nameValue) { //if name stayed same
			oName.className = '';
			oId.className = '';
			oId.value = matchedId;
			if (oId.readOnly)
				oId.className='glReadOnly';
		}
	}
}
function glNameIdRetrieveNameCombo(e) {
	var oName = utGetEventTarget(e, window.event);
	var type = utGetAttribute(oName, "_nameType");
	var nameFieldId = utGetAttribute(oName, "id");
	var idFieldId = utGetAttribute(oName, "_idFieldId");
	if (oName.value == '') {
		document.getElementById('glSpanDynamicCombo').style.display = 'none';
		oName.className = '';
		if (document.getElementById(idFieldId).readOnly) //if readonly erase id field
			document.getElementById(idFieldId).value = '';
		return;
	}
	var url =	"/UTI_NAM_01_OPN.aspx?" +
				"type=" + utUrlEncode(type) +
				"&nameFieldId=" + utUrlEncode(nameFieldId) +
				"&nameValue=" + utUrlEncode(oName.value) +
				"&idFieldId=" + utUrlEncode(idFieldId);
	utMakeAjaxRequest(url, "glNameIdShowCombo");
}
function glNameIdShowCombo(responseXML) {
	var root = utGetXMLRoot(responseXML);
	var type = root.getElementsByTagName('type').item(0).firstChild.data;
	var nameFieldId = root.getElementsByTagName('nameFieldId').item(0).firstChild.data;
	var nameValue = root.getElementsByTagName('nameValue').item(0).firstChild.data;
	var oName = document.getElementById(nameFieldId);
	var idFieldId = utGetAttribute(oName, "_idFieldId");
	var oId = document.getElementById(idFieldId);

	//if oName does not exist on this page 
	// or
	//if value in name field is not same as what was sent in request xml
	// then ignore this response
	if (oName == null || oName.value != nameValue)
		return;

	var listTable = "";
	if (root.getElementsByTagName('listTable').item(0).firstChild != null)
		listTable = root.getElementsByTagName('listTable').item(0).firstChild.data;
	var sp = document.getElementById('glSpanDynamicCombo');
	if (listTable == '') {
		sp.style.display = 'none';
		oName.className = 'glError';
		oId.value = '';
	} else {
		utSetAttribute(sp, "_nameFieldId", nameFieldId);
		utSetAttribute(sp, "_idFieldId", idFieldId);
		sp.innerHTML = "<table cellpadding=2px >" + listTable + "</table>";
		oName.className = '';
		var t = sp.childNodes[0]; //get table

		// go through all table rows and attach events
		for (var i = 0; i < t.rows.length; i++) {
			var tr = t.rows[i];
			utAttachEvent(tr, "mouseover", glHndlMouseOver);
			utAttachEvent(tr, "mouseout", glHndlMouseOut);
			var td = tr.cells[0];
			utAttachEvent(td, "click", glNameIdHndlComboItemClick);
		}

		//show and and hide again just to get table height
		sp.style.display = '';
		var tHeight = t.clientHeight;
		var tWidth = t.clientWidth;
		if (tWidth < 50) {
			t.style.width = '60px';
		}
		if (tHeight > 75) {
			sp.style.height = '75px';
			sp.style.paddingRight = '25px';
		} else {
			sp.style.height = (tHeight+10) + 'px';
			sp.style.paddingRight = '0px';
		}

		var x = utGetLeftPos(oName);
		var y = utGetTopPos(oName) + oName.offsetHeight;
//		if (sp.clientHeight > (document.body.clientHeight-y)+document.body.scrollTop) {
//			//show it at the top
//			y = utGetTopPos(oName) - sp.clientHeight;
//			if (y < 0)
//				y = 1;
//		}
		sp.style.display = 'none';
		sp.style.left = x;
		sp.style.top = y;
		sp.style.display = '';

		if (t.rows.length == 1) {
			var td = t.rows[0].cells[0];
			glNameIdHndlComboItemClick(td); //click on this only td
		}
	}
}
function glNameIdHndlComboItemClick(e) {
	var oComboRow = utGetEventTarget(e, window.event);
	var comboId = utGetAttribute(oComboRow, "_comboId");
	var oCombo = document.getElementById('glSpanDynamicCombo');
	var oName = document.getElementById(utGetAttribute(oCombo, "_nameFieldId"));
	var oId = document.getElementById(utGetAttribute(oName, "_idFieldId"));
	oId.value = comboId;
	oName.value = oComboRow.innerText;
	if(oId.parentNode.style.display == '')
		oId.focus();
	oCombo.style.display = 'none';
	oName.className='';
	oId.className='';
	if (oId.readOnly)
		oId.className='glReadOnly';
}
