	// createHTTPRequestObject
	// This creates a cross-browser HTTP Request Object

	function createHTTPRequestObject()
	{
		var http_request;
	
		if (window.XMLHttpRequest)
		{
			// Mozilla, Safari,...
			http_request = new XMLHttpRequest();
		}
		else if (window.ActiveXObject) 
		{
			// IE
			try
			{
				http_request = new ActiveXObject("Msxml2.XMLHTTP");
			}
			catch (e)
			{
				try
				{
					http_request = new ActiveXObject("Microsoft.XMLHTTP");
				}
				catch (e) 
				{
					// nothing!
				}
			}
		}

		if (!http_request)
		{
//			alert('Giving up :( Cannot create an XMLHTTP instance');
			return false;
		}
		else
		{
			return http_request;
		}
	}

	// sendRequest
	// Request handler
	
	function sendRequest(url, keyword, target_object)
	{
		var http_request = createHTTPRequestObject();
		http_request.onreadystatechange = function foo()
		{
			if (http_request.readyState == 4)
			{
				if (http_request.status == 200) 
				{
					if (keyword == "populateMenu")
					{
						target_object.populateMenu(http_request.responseText);			
					}
					else if (keyword == "createSelect")
					{
						target_object.populateSelect(http_request.responseText);			
					}
					else if (keyword == "createCheckbox")
					{
						target_object.populateCheckbox(http_request.responseText);
					}
					else if (keyword == "hr_employee_change")
					{
						target_object.compareCostCenter(http_request.responseText);
					}
				}
			}
		};
	
		http_request.open('GET', encodeURI(url), true);
		http_request.send(null);
	}
	

	// Form functions
	
	function setFieldValue(to_set, from_set_value)
	{
		to_set.value = from_set_value;
	}
	
	function add_to_list(list, l_value, l_text)
	{
		if (list.options[0].value == "")
		{
			list.length = 0;
		}

		for (i=0; i<list.length; i++)
		{
			var list_item = list.options[i];
			
			if (list_item.value == l_value)
			{
				return false;
			}
		}
		
		list.length++;		
		list.options[(list.length - 1)].value = l_value;
		list.options[(list.length - 1)].text = l_text;
	}
	
	function delete_from_list(list)
	{
		if (confirm("Delete from list?") == false)
		{
			list.selectedIndex = -1;
			return false;
		}
		
		var itemArray = new Array();
		var itemArrayIndex = 0;	
		
		for (i=0; i<list.length; i++)
		{
			var list_item = list.options[i];

			if (list_item.selected != true)
			{
				itemArray.length++;
				itemArray[itemArrayIndex] = list_item;
				itemArrayIndex++;
			}
		}
		
		if (itemArray.length == 0)
		{
			list.length = 1;
			list.options[0].value = "";
			list.options[0].text = "Add to this list.";
		}
		else
		{
			list.length = 0;
			for (i=0; i<itemArray.length; i++)
			{
				list.length++;
				list.options[i] = itemArray[i];
			}
		}
		
		list.selectedIndex = -1;
	}

	function selectallfields(list)
	{
		if (list)
		{
			for (i=0; i<list.length; i++)
			{
				list.options[i].selected = true;
			}
		}
		
		return true;
	}
	

	// Base Functions
	
	// menu management
	// until I find a better way to do it!
	
	var d_menu;

	function destroyMenu()
	{
		if (d_menu)
		{
			setTimeout("d_menu.hideMenu(true); d_menu.clearMenu();", 200);
			cleanUpInput(d_menu.inputObject, d_menu.outputObject);
		}
	}
	
	function cleanUpInput(v_field, h_field)
	{
		if (h_field.value == "")
		{
			v_field.value = "";
		}
	}
	
	
	// createMenu
	// Pivot point for HTTPRequest and dynamicMenu
	
	function createMenu(menu_contents, menu_type, menu_name, inputID, outputID)
	{
		d_menu = new dynamicMenu(menu_name, inputID, outputID, menu_type);

		var search_text = d_menu.getInputText();
		
		if (search_text.length >= 2)
		{
			if (menu_contents == "EmployeeList")
			{
			    sendRequest("/ajax/find_name_as_you_type.cfm?starts_with=" + search_text, "populateMenu", d_menu);
			}
			else if (menu_contents == "EmployeeQuery")
			{
			    sendRequest("/ajax/employees.cfm?selection=" + search_text, "populateMenu", d_menu);
			}
			else if (menu_contents == "IntranetEmployeeQuery_ntuserid")
			{
			    sendRequest("/ajax/employees.cfm?return=ntuserid&type=intranet&selection=" + search_text, "populateMenu", d_menu);
			}
			else if (menu_contents == "IntranetEmployeeQuery_employeeid")
			{
			    sendRequest("/ajax/employees.cfm?return=employeeid&type=intranet&selection=" + search_text, "populateMenu", d_menu);
			}
			else if (menu_contents == "IntranetEmployeeQuery_email")
			{
			    sendRequest("/ajax/employees.cfm?return=email&type=intranet&selection=" + search_text, "populateMenu", d_menu);
			}
			else if (menu_contents == "EmployeeQuery_ntuserid")
			{
			    sendRequest("/ajax/employees.cfm?return=ntuserid&selection=" + search_text, "populateMenu", d_menu);
			}
			else if (menu_contents == "EmployeeQuery_employeeid")
			{
			    sendRequest("/ajax/employees.cfm?return=employeeid&selection=" + search_text, "populateMenu", d_menu);
			}
			else if (menu_contents == "EmployeeQuery_email")
			{
			    sendRequest("/ajax/employees.cfm?return=email&selection=" + search_text, "populateMenu", d_menu);
			}

		}
		else
		{
			d_menu.clearMenu();
			d_menu.hideMenu(true);
		}
		
		return true;
	}

	function scrollDynamicMenu(e)
	{
		if (d_menu && d_menu.getActive())
		{
			var keyPressed;
			
			if (window.Event)
			{
				keyPressed = e.which;
			}
			else
			{
				keyPressed = window.event.keyCode;
			}

			if (keyPressed == 38)
			{
				//Up
				d_menu.selectPrevious();
				return true;
			}
			else if (keyPressed == 40)
			{
				//Down
				d_menu.selectNext();
				return true;
			}
			else if (keyPressed == 13)
			{
				//Enter
				d_menu.clickIt();
				return true;
			}
			else
			{
				return false;
			}
		}
		else
		{
			return false;
		}

	}

	function ignoreEnter(e)
	{
		var keyPressed;
		
		if (window.Event)
		{
			keyPressed = e.which;
		}
		else
		{
			keyPressed = window.event.keyCode;
		}

		if (keyPressed == 13)
		{
			return false;
		}
		else
		{
			return true;
		}
	}

	
	// createSelect
	// Dynamically populates a select box
	
	function createSelect(selectObject, menu_type, param1)
	{
		var s_menu = new selectMenu(selectObject);
		
		if (menu_type == "cm_queues")
		{
			sendRequest("/ajax/cm_queues.cfm?queue_type=" + param1, "createSelect", s_menu);
		}
		else if (menu_type == "hr_injury_form")
		{
			sendRequest("/ajax/hr_injury_form.cfm?selection=" + param1, "createSelect", s_menu);
		}
		else if (menu_type == "hpd_subarea")
		{	
			sendRequest("/ajax/hpd_subarea.cfm?selection=" + param1, "createSelect", s_menu);
		}
		else if (menu_type == "queue_members")
		{	
			sendRequest("/ajax/queue_members.cfm?selection=" + param1, "createSelect", s_menu);
		}
		else if (menu_type == "tech_purchasing_categories")
		{	
			sendRequest("/ajax/tech_purchasing_categories.cfm?selection=" + param1, "createSelect", s_menu);
		}
	}
	
	function createCheckbox(selectObject, checkboxObject, menu_type, param1)
	{
		var s_menu = new checkboxMenu(selectObject, checkboxObject);
		
		if (menu_type == "part_number_wizard_wavelength")
		{
			sendRequest("/ajax/part_number_wizard_wavelength.cfm?OptionValueID=" + param1, "createCheckbox", s_menu);
		}
	}
	
	// selectMenu Object
	// selectMenu takes an argument of the "real" select menu object.
	
	function selectMenu(selectObject)
	{
		this.selectObject = selectObject;
		
		this.parseResponse = function(responseText)
		{
			return parseResponse(responseText);
		};
		
		this.populateSelect = function(responseText)
		{
			var returnedData = this.parseResponse(responseText); // returns a two-dimensional array
			var oldSelectedIndex = this.selectObject.selectedIndex;
			this.selectObject.length = 0;
			
			for (var i=0; i<returnedData.length; i++)
			{
				var d0 = returnedData[i][0];
				var d1 = returnedData[i][1];

				this.selectObject.length++;
				this.selectObject.options[i].value = d0;
				this.selectObject.options[i].text = d1;
			}

			if (returnedData.length == 0)
			{
				// in case we want to display something when we don't get a response.
			}
			else
			{
				this.selectObject.selectedIndex = oldSelectedIndex;
			}
		};
	}

	function checkboxMenu(selectObject, checkboxObject)
	{
		this.selectObject = selectObject;
		selectObject.checkboxes = new Array();
		
		this.checkboxObject = checkboxObject;
		
		this.parseResponse = function(responseText)
		{
			return parseResponse(responseText);
		};
	
		this.populateCheckbox = function(responseText)
		{
			var returnedData = this.parseResponse(responseText); // returns a two-dimensional array

			this.checkboxObject.innerHTML = "";
			this.selectObject.checkboxes.length = 0;
			
			var OptionValueID = this.selectObject.options[this.selectObject.selectedIndex].value;
			
			var topSpan = document.createElement("span");
			var waveValue = lookupWaveOptionNum(OptionValueID);
			
			if (waveValue)
			{
			topSpan.innerHTML = "<strong>Must select " + waveValue + " wavelength(s)</strong><br>";
			}
			else
			{
			topSpan.innerHTML = "&nbsp;";
			}
					
			this.checkboxObject.appendChild(topSpan);

			for (var i=0; i<returnedData.length; i++)
			{
				var d0 = returnedData[i][0];
				var d1 = returnedData[i][1];
				
				var myCheckbox = document.createElement("input");
				var mySpan = document.createElement("span");
				
				myCheckbox.parentSelect = this.selectObject;
				
				myCheckbox.type = "checkbox";
				myCheckbox.value = d0;
				myCheckbox.name = "wavelength_value";
				myCheckbox.onclick = function()
				{
					this.parentSelect.createCode(this);
				};
				
				mySpan.innerHTML = d1 + " (" + d0 + ")<br>";
				
				this.checkboxObject.appendChild(myCheckbox);
				this.checkboxObject.appendChild(mySpan);
				
				this.selectObject.checkboxes.push(myCheckbox);
				
				
			}

			if (returnedData.length == 0)
			{
				// in case we want to display something when we don't get a response.
			}
		};
		
	}
	
	
	
	
	// Dynamic Menu Object
	// dynamicMenu takes four *text* arguments
		
	function dynamicMenu(menu_name, inputID, outputID, menu_type)
	{
		this.selected_index = -1;
		this.menu_name = menu_name;
		this.menu_element = document.getElementById(menu_name);
		this.inputObject = document.getElementById(inputID);
		this.outputObject = document.getElementById(outputID);
		this.inputID = inputID;
		this.outputID = outputID;
		this.menu_type = menu_type;
		
		this.menu_active = false;

		if (this.menu_type == "text")
		{
			this.outputObject.value = "";
		}
		
		this.clearInputBox = function()
		{
			this.inputObject.value = "";
			this.inputObject.focus();
		};
		
		this.getInputText = function()
		{
			return this.inputObject.value;
		};
		
		this.getActive = function()
		{
			return this.menu_active;
		};
		
		this.setActive = function(flag)
		{
			this.menu_active = flag;
		};

		this.selectNext = function()
		{
			var newSelectedItem = this.menu_element.childNodes[(this.selected_index + 1)];

			if (newSelectedItem)
			{
				this.selectMenuItem(newSelectedItem);
			}
		};

		this.selectPrevious = function()
		{
			var newSelectedItem = this.menu_element.childNodes[(this.selected_index - 1)];

			if (newSelectedItem)
			{
				this.selectMenuItem(newSelectedItem);
			}
		};
		
		this.clickIt = function()
		{
			var selectedItem = this.menu_element.childNodes[this.selected_index];

			if (selectedItem)
			{
				selectedItem.onmousedown();
			}
		};
		
		this.deselectCurrent = function ()
		{
			if (this.selected_index >= 0 && (this.menu_element.childNodes[this.selected_index]))
			{
				var currentSelectedItem = this.menu_element.childNodes[this.selected_index];

				if (currentSelectedItem)
				{
					this.deselectMenuItem(currentSelectedItem);
				}
			}
		};
		
		this.getRowIndex = function(row_id)
		{
			var regEx = new RegExp("d_menu_row_([0-9]+)");

			var returnArray = row_id.match(regEx);

			if (row_id.match(regEx))
			{
				return returnArray[1];
			}
			else
			{
				return false;
			}
		};
		
		this.selectMenuItem = function (myitem)
		{
			this.deselectCurrent();
			
			myitem.className = "pop_element_selected";

			var si = this.getRowIndex(myitem.id);
			
			if (si)
			{
				this.selected_index = Number(si);
			}
			
			this.setActive (true);
		};
		
		this.deselectMenuItem = function (myitem)
		{
			myitem.className = "pop_element";
			this.setActive (false);
			setTimeout("d_menu.hideMenu(false)", 400);
		};
		
		this.hideMenu = function(force)
		{
			if (this.getActive() == false || force)
			{
				this.menu_element.style.display = "none";
				this.setActive(false);
			}
		};
		
		this.showMenu = function(force)
		{
			if (this.getActive() == true || force)
			{
				this.menu_element.style.display = "";
				this.setActive(true);
			}
		};
		
		this.clearMenu = function()
		{
			this.menu_element.innerHTML = "";
		};
		
		this.appendMenu = function(theMenuItem)
		{
			this.menu_element.appendChild(theMenuItem);
		};

		this.populateMenu = function(responseText)
		{
			this.hideMenu(true);
			this.clearMenu();
			
			var returnedData = this.parseResponse(responseText); // returns a two-dimensional array

			for (var i=0; i<returnedData.length; i++)
			{
				var d0 = returnedData[i][0];
				var d1 = returnedData[i][1];

				var theDiv = document.createElement("div");
				theDiv.id = "d_menu_row_" + i;
				theDiv.className = "pop_element";
				theDiv.innerHTML = d1;
				
				theDiv.outputObject = this.outputObject;
				theDiv.inputObject = this.inputObject;
				theDiv.d0 = d0;
				theDiv.d1 = d1;
				
				theDiv.onmouseover = function ()
				{
					d_menu.selectMenuItem(this);
				};

				theDiv.onmouseout = function ()
				{
					d_menu.deselectMenuItem(this);
				};

				if (this.menu_type == "select")
				{
					theDiv.activateMenu = function ()
					{
						add_to_list(this.outputObject, this.d0, this.d1);
					};
				}
				else if (this.menu_type == "text")
				{
					theDiv.activateMenu = function ()
					{
						setFieldValue(this.outputObject, this.d0);
						setFieldValue(this.inputObject, this.d1);
					};
				}

				theDiv.onmousedown = function ()
				{
					d_menu.clearInputBox(); 
					d_menu.hideMenu(true);
					this.activateMenu();
				};

				this.appendMenu(theDiv);
			}

			if (returnedData.length == 0)
			{
				var theDiv = document.createElement("div");
				theDiv.id = "none_row";
				theDiv.className = "pop_element";
				theDiv.innerHTML = "No Data Returned.";
				
				this.appendMenu(theDiv);
				
				this.inputObject.value = "";

				if (this.menu_type == "text")
				{
					setFieldValue(this.outputObject.value, "");
				}

				this.showMenu(true);
			}
			else if (returnedData.length == -1)
			{
				d_menu.clearInputBox();
				d_menu.hideMenu(true);
			}
			else
			{
				this.showMenu(true);
			}



		};
		
		this.parseResponse = function(responseText)
		{
			return parseResponse(responseText);
		};
		
	}
	
	// parseResponse
	// This is a kludge.
	// I don't want to debug multiple inheritance in Javascript, 
	// and I only want to share this functionality without
	// copying and pasting code.
	
	function parseResponse(responseText)
	{
		var returnedData = new Array();
		
		var lines = responseText.split("__RECORD__");
		var counter = 0;
		for (var i=0; i<=lines.length; i++)
		{
			var line_text = lines[i] + '';
			var fields = line_text.split("__FIELD__");

			if (fields[0] && fields[1])
			{
				if (fields[0] == " ")
				{
					fields[0] = "";
				}

				if (fields[1] == " ")
				{
					fields[1] = "";
				}

				returnedData[counter] = new Array(fields[0] , fields[1]);
				counter++;
			}
		}

		return returnedData;
	}
	
	
