var findMade = false;
var lastFind;

function find_findElement2(elementId, frame) {
	var element = null;
	if (!frame)
		return null;
	try {
		if (frame.document != null)
			element = frame.document.getElementById(elementId);
		if (element == null) {
			if (frame.frames)
				for (var i = 0; i < frames.length; i++)
				if (frame.frames[i] != undefined) {
				element = find_findElement(elementId, frame.frames[i]);
				if (element != null)
					return element;
			}
			return null;
		}
		else {
			return element;
		}
	}
	catch (ex) {
		return null;
	}
}

function find_findElement(elementId, frame) {
	var nextFrames = new Array();
	nextFrames.push(frame);
	for (var i = 0; i < nextFrames.length; i++) {
		var currentFrame = nextFrames[i];
		var element = null;
		if (currentFrame.document != null)
			element = currentFrame.document.getElementById(elementId);
		if (element == null) {
			for (var k = 0; k < currentFrame.frames.length; k++)
				nextFrames.push(currentFrame.frames[k]);
		}
		else
			return element;
	}
	return null;
}

function find_findElementByName(elementName, frame) {
	var element = null;
	if (!frame)
		return null;
	if (frame.document != null)
		element = frame.document.getElementsByName(elementName).item(0);
	if (element == null) {
		if (frame.frames) {
			for (var i = 0; i < frames.length; i++)
				if (frame.frames[i] != undefined) {
				element = find_findElementByName(elementName, frame.frames[i]);
				if (element != null)
					return element;
			}
		}
		return null;
	}
	else
		return element;
}

function find_getCurrentCallId(inputCtrlId) {
	var textCtrl = document.getElementById(inputCtrlId);
	var callId = textCtrl["callId"];
	if (callId == null)
		callId = 0;
	return callId;
}

function find_getNextCallId(inputCtrlId) {
	var textCtrl = document.getElementById(inputCtrlId);
	var callId = textCtrl["callId"];
	if (callId == null)
		callId = 0;
	else
		callId++;
	textCtrl["callId"] = callId;
	return callId;
}

function find_onTextChanged(keyCode, url, inputCtrlID, textCtrlId, selectCtrlId, valueCtrlId, staticBehaviour, selectUrl, textFields, virtuals, isShowResults, selectDefaultValue) {
	//Clear all values if text has changed
	if (keyCode != 9 && keyCode != 13 && keyCode != 16 && keyCode != 36 && keyCode != 38 && keyCode != 40) {
		findMade = true;
		document.getElementById(inputCtrlID + "_value").value = "";
		find_virtualsClean(virtuals);
		// Register call id
		var callId = find_getNextCallId(inputCtrlID);
		writeDebugLog("Requesting search with callId " + callId);
		var callBack = 'find_getData(\'' + find_getSafeUrl(url) + '\',\'' + inputCtrlID + '\',\'' + textCtrlId + '\',\'';
		callBack = callBack + valueCtrlId + '\',\'' + staticBehaviour + '\',\'' + find_getSafeUrl(selectUrl) + '\',\'';
		callBack = callBack + textFields + '\',\'' + virtuals + '\', ' + callId + ',\'' + selectDefaultValue + '\')';
		setTimeout(callBack, 500);
	}
	else if (keyCode == 40 && isShowResults)	// down
	{
		if (find_findElement(selectCtrlId, window).style.visibility == "hidden")
			find_dropButtonPress(url, selectCtrlId, inputCtrlID, textCtrlId, valueCtrlId);
	}
}

function find_keyDown(keyCode, url, inputCtrlID, textCtrlId, valueCtrlID, selectctrlID, virtuals, textFields, selectDefaultValue, selectUrl, staticBehaviour, findUrl) {
	if (keyCode == 9 || keyCode == 13)// Tab
	{
		var callId = find_getNextCallId(inputCtrlID);
		if (selectDefaultValue == "true" && find_findElement(selectctrlID, window).style.visibility == "hidden") {
			if (findMade)
				find_onSelectDefault(url, inputCtrlID, selectDefaultValue, false, textCtrlId, selectUrl, callId, valueCtrlID, virtuals, textFields, staticBehaviour);
			//find_onSelectDefault(url,inputCtrlID,selectDefaultValue,false,textCtrlId,findUrl,callId,valueCtrlID,virtuals,textFields, staticBehaviour);
		}
		else
			find_onSelectValue(url, inputCtrlID, virtuals, textFields, false);
		return true;
	}
	var selectBox = document.getElementById(selectctrlID);
	if (keyCode == 38)		// Cursor Up
	{
		find_selectPrevious(selectBox);
		return true;
	}
	else if (keyCode == 40)	// Cursor Down
	{
		find_selectNext(selectBox);
		return true;
	}
	return false;
}

function find_selectPrevious(selectBox) {
	var opts = selectBox.options;
	for (var index = 0; index < opts.length; index++) {
		if (opts[index].selected == true) {
			if (index - 1 >= 0) {
				opts[index].selected = false;
				opts[index - 1].selected = true;
			}
			return;
		}
	}

	// None selected...
	find_selectDefault(selectBox);
}

function find_selectNext(selectBox) {
	var opts = selectBox.options;
	for (var index = 0; index < opts.length; index++) {
		if (opts[index].selected == true) {
			if ((index + 1) < opts.length) {
				opts[index].selected = false;
				opts[index + 1].selected = true;
			}
			return;
		}
	}
	// None selected...
	find_selectDefault(selectBox);
}

function find_selectDefault(selectBox) {
	var opts = selectBox.options;
	if (opts.length > 0)
		opts[0].selected = true;
}

function find_replace(request, inputCtrlID, staticBehaviour, selectUrl, textFields, virtuals, selectDefaultValue) {
	var object = Utils.Node.getChildById(request.getResult(), "resultGroup");
	var data = "";
	if (object != null && object.firstChild != null)
		data = object.firstChild.nodeValue;
	find_parseData(data, inputCtrlID, staticBehaviour, selectUrl, textFields, virtuals, selectDefaultValue);
}

function find_getData(url, inputCtrlID, textCtrlId, valueCtrlId, staticBehaviour, selectUrl, textFields, virtuals, callId, selectDefaultValue) {
	var lastCallId = find_getCurrentCallId(inputCtrlID);
	window.status = '';
	if (callId != lastCallId)	// Ignore all requests except the last registered one
	{
		writeDebugLog("Ignoring search with callId " + callId + " (last callId = " + lastCallId + ")");
		return;
	}
	if (document.getElementById(textCtrlId).value != lastFind) {
		var searchValue = htmlSafe(document.getElementById(textCtrlId).value);
		var request = new DataRequest();
		request.setUrl(url + searchValue);
		var func = new DelayedFunction();
		func.setFunctionString("find_replace($#arg0#,$#arg1#,$#arg2#,$#arg3#,$#arg4#,$#arg5#,$#arg6#);");
		func.bindArgument(request);
		func.bindArgument(inputCtrlID);
		func.bindArgument(staticBehaviour);
		func.bindArgument(selectUrl);
		func.bindArgument(textFields);
		func.bindArgument(virtuals);
		func.bindArgument(selectDefaultValue);

		request.setOnDoneFunction(func);

		DataRequester.execute(request);
	}
}

function find_parseData(data, inputCtrlID, staticBehaviour, selectUrl, textFields, virtuals, selectDefaultValue) {
	var i, j;
	var items = new Array();
	items = data.split('|');
	if (items.length % 2 != 0)
		items = new Array();

	var listNode = document.getElementById(inputCtrlID + "_selectResult");
	var chosenIndex = listNode.selectedIndex;
	var chosenValue = null;
	if (chosenIndex != -1) {
		var chosenOption = listNode.options[chosenIndex];
		chosenValue = chosenOption.value;
	}

	listNode.options.length = 0;
	for (var m = 0; m < items.length / 2; m++) {
		var opt = new Option(items[(m * 2) + 1], items[(m * 2)]);
		listNode.options[m] = opt;
		if (m % 2 == 0)
			opt.className = "list-table-element";
		else
			opt.className = "list-table-element-gray";


		if (opt.value == chosenValue)
			opt.selected = true;
	}
	listNode.style.width = null;
	if (listNode.clientWidth < listNode["INITIAL-WIDTH"])
		listNode.style.width = listNode["INITIAL-WIDTH"];
	if (staticBehaviour == 1) {
		//Static Behaviour == 1 -> Don't show result list... if there any matches, assume the first one and carry on
		if (document.getElementById(inputCtrlID + "_selectResult").length == 1) {
			var opts = document.getElementById(inputCtrlID + "_selectResult").options;
			document.getElementById(inputCtrlID + "_value").value = opts[0].value;
			document.getElementById(inputCtrlID + "_text").value = opts[0].text;
			find_getRecord(selectUrl, inputCtrlID, inputCtrlID + "_value", virtuals, textFields, 0);
		}
		else	// Multiple (or none) matches... Let's try to find an exact one
		{
			var searchValue = rtrim(document.getElementById(inputCtrlID + "_text").value);
			var foundExactMatch = false;
			for (var n = 0; n < listNode.options.length; n++) {
				var opt = listNode.options[n];
				if (rtrim(opt.value) == searchValue) {
					document.getElementById(inputCtrlID + "_value").value = opt.value;
					document.getElementById(inputCtrlID + "_text").value = opt.text;
					lastFind = opt.text; //issue 1980
					find_getRecord(selectUrl, inputCtrlID, inputCtrlID + "_value", virtuals, textFields, 0);
					foundExactMatch = true;
					break;
				}
			}
			//HQ: Issue 2229
			if (selectDefaultValue == 'true' && foundExactMatch == false && listNode.options.length > 0)
				document.getElementById(inputCtrlID + "_value").value = listNode.options[0].value;
		}
	}
	else {
		//Show ResultList
		var listCtrl = document.getElementById(inputCtrlID + "_selectResult");
		if (listNode.options.length != 0)
			find_ListCtrl_SetVisible(inputCtrlID, true);
	}
}

function find_ListCtrl_SetVisible(baseId, visible) {
	var listCtrl = find_findElement(baseId + "_selectResult", window);

	if (visible) {
		listCtrl.style.left = Utils.Element.getClientLeft(window.document.getElementById(baseId + "_text"));
		listCtrl.style.top = Utils.Element.getClientBottom(window.document.getElementById(baseId + "_text"));
		listCtrl.style.visibility = "visible";
	}
	else {
		listCtrl.style.visibility = "hidden";
		listCtrl.style.left = 0;
		listCtrl.style.top = 0;
	}
}

function find_dropButtonPress(url, selectCtrlID, inputCtrlID, textCtrlID, valueCtrlID) {
	var listCtrl = find_findElement(selectCtrlID, window);
	var textCtrl = find_findElement(textCtrlID, window);
	var valueCtrl = find_findElement(valueCtrlID, window);

	if (listCtrl.style.visibility != "hidden") {
		find_ListCtrl_SetVisible(inputCtrlID, false);
		textCtrl.focus();
	}
	else {
		//if (valueCtrl.value == "")
		find_getData(url, inputCtrlID, textCtrlID, valueCtrlID, 0, '', '', '', find_getNextCallId(inputCtrlID));
		find_ListCtrl_SetVisible(inputCtrlID, true);
		textCtrl.focus();
	}
}

function find_hideSelect(selectctrlID, inputctrlID, focusTextBox) {
	var listCtrl = find_findElement(selectctrlID, window);
	find_ListCtrl_SetVisible(inputctrlID, false);
	if (focusTextBox)
		find_findElement(inputctrlID + "_text", window).focus();
}

function find_onSelectValue(url, inputCtrlID, virtuals, textFields, focusTextBox) {
	find_hideSelect(inputCtrlID + "_selectResult", inputCtrlID, focusTextBox);
	var opts = document.getElementById(inputCtrlID + "_selectResult").options;
	var chosenIndex = document.getElementById(inputCtrlID + '_selectResult').selectedIndex;
	if (chosenIndex == -1)
		return;
	var chosenOption = opts[chosenIndex];
	document.getElementById(inputCtrlID + "_value").value = chosenOption.value;
	document.getElementById(inputCtrlID + "_text").value = chosenOption.text;
	lastFind = chosenOption.text;
	find_getRecord(url, inputCtrlID, inputCtrlID + "_value", virtuals, textFields, 0);
}

function find_onSelect(keyCode, url, selectctrlID, inputCtrlID, virtuals, textFields) {
	if (keyCode != 13 && keyCode != 32 && keyCode != 0)
		return;
	var opts = document.getElementById(selectctrlID).options;
	for (var index = 0; index < opts.length; index++) {
		if (opts[index].selected == true) {
			document.getElementById(inputCtrlID + "_value").value = opts[index].value;
			document.getElementById(inputCtrlID + "_text").value = opts[index].text;
			opts[index].selected = false;
			break;
		}
	}
	find_hideSelect(selectctrlID, inputCtrlID, true);
	find_getRecord(url, inputCtrlID, inputCtrlID + "_value", virtuals, textFields, 0);
}

function find_replaceGetRecord(request, inputCtrlID, virtuals, virtualCall, textFields) {
	var object = Utils.Node.getChildById(request.getResult(), "resultGroup");

	if (object != null && object.firstChild != null) {
		if (virtualCall == 0)
			find_parseRecord(object.firstChild.nodeValue, inputCtrlID, virtuals);
		else
			find_handleVirtualFind(object.firstChild.nodeValue, inputCtrlID, virtuals, textFields);
	}
}

function find_getRecord(url, inputCtrlID, valueCtrlID, virtuals, textFields, virtualCall) {
	var request = new DataRequest();
	request.setUrl(url + document.getElementById(valueCtrlID).value);
	var func = new DelayedFunction();
	func.setFunctionString("find_replaceGetRecord($#arg0#,$#arg1#,$#arg2#,$#arg3#,$#arg4#);");
	func.bindArgument(request);
	func.bindArgument(inputCtrlID);
	func.bindArgument(virtuals);
	func.bindArgument(virtualCall);
	func.bindArgument(textFields);

	request.setOnDoneFunction(func);

	DataRequester.execute(request);
}


function find_parseRecord(data, inputCtrlID, virtuals) {
	var i, j;
	var items = new Array();
	items = data.split('|');
	var virtualArray = eval(virtuals);  //Using eval
	fillVirtualFields(virtualArray, items);
}

//Select default value if flag is True and if nothing has been selected on SELECT element.
function find_onSelectDefault(url, inputCtrlID, selectDefaultValue, focusTextBox, textCtrlId, selectUrl, callId, valueCtrlId, virtuals, textFields, staticBehaviour) {
	find_hideSelect(inputCtrlID + "_selectResult", inputCtrlID, focusTextBox);
	searchValue = htmlSafe(document.getElementById(textCtrlId).value);
	if (searchValue == "" || document.getElementById(textCtrlId).value == lastFind)
		return;
	find_getData(url, inputCtrlID, textCtrlId, valueCtrlId, staticBehaviour, selectUrl, textFields, virtuals, callId, selectDefaultValue);
}

function find_showSearchWindow(link, inputCtrlID, origField, virtualArray, requiredValidator, selectctrlID, textFields, numCols) {
	var win = window;
	var frame = window.document.getElementById("searchWindow");
	while (frame == null) {
		win = win.parent;
		frame = win.document.getElementById("searchWindow");
	}
	win.InstanceChooser.link = link;
	win.InstanceChooser.inputCtrlID = document.getElementById(inputCtrlID);
	win.InstanceChooser.origField = origField;
	win.InstanceChooser.virtualArray = virtualArray;
	win.InstanceChooser.requiredValidator = requiredValidator;
	win.InstanceChooser.selectctrlID = selectctrlID;
	win.InstanceChooser.textFields = textFields;
	win.InstanceChooser.numCols = numCols;
	showChooseInstance(link, numCols, findPosition(document.getElementById(inputCtrlID + "_text")));
	W3C.EventTarget.addEventListener(frame, "mouseout", find_frameMouseOut, false);
	W3C.EventTarget.addEventListener(frame, "mouseover", find_frameMouseOver, false);
}

function findPosition(elt) {
	if (elt.offsetParent) {
		for (var posX = 0, posY = 0; elt.offsetParent; elt = elt.offsetParent) {
			posX += elt.offsetLeft;
		}
		return posX;
	}
	else {
		return elt.x;
	}
}

function find_closeSearchWindow() {
	var win = window;
	var frame = window.document.getElementById("searchWindow");
	while (frame == null) {
		win = win.parent;
		frame = win.document.getElementById("searchWindow");
	}
	W3C.EventTarget.removeEventListener(frame, "mouseout", find_frameMouseOut, false);
	W3C.EventTarget.removeEventListener(frame, "mouseover", find_frameMouseOver, false);
	find_lockChooseInstanceWindow(false);
	frame.src = "";
	frame.style.visibility = "hidden";
}

function find_frameMouseOut(e) {
	var evt = W3C.getEvent(e);
	var target = W3C.Event.getTarget(evt);
	var win = window;
	var iframe = window.document.getElementById("searchWindow");
	while (iframe == null) {
		win = win.parent;
		iframe = win.document.getElementById("searchWindow");
	}
	if (target == iframe) {
		var x = W3C.Event.UIEvent.MouseEvent.getClientX(evt);
		var y = W3C.Event.UIEvent.MouseEvent.getClientY(evt);
		var left = Utils.Element.getClientLeft(iframe) + 2;
		var right = Utils.Element.getClientRight(iframe) - 2;
		var top = Utils.Element.getClientTop(iframe) + 2;
		var bottom = Utils.Element.getClientBottom(iframe) - 2;
		if (!(left < x && x < right && top < y && y < bottom) && iframe.style.display == "block")
			find_lockChooseInstanceWindow(true);
	}
}

function find_frameMouseOver(e) {
	var evt = W3C.getEvent(e);
	var target = W3C.Event.getTarget(evt);
	var win = window;
	var iframe = window.document.getElementById("searchWindow");
	while (iframe == null) {
		win = win.parent;
		iframe = win.document.getElementById("searchWindow");
	}
	if (target == iframe) {
		W3C.EventTarget.removeEventListener(iframe, "click", find_recapture, false);
		W3C.EventTarget.removeEventListener(iframe, "mousedown", find_recapture, false);
		W3C.EventTarget.removeEventListener(iframe, "mouseup", find_recapture, false);
		iframe.releaseCapture();
	}
}

function find_recapture(e) {
	var evt = W3C.getEvent(e);
	var win = window;
	var iframe = window.document.getElementById("searchWindow");
	while (iframe == null) {
		win = win.parent;
		iframe = win.document.getElementById("searchWindow");
	}
	if (iframe.style.display == "block") {
		window.document.releaseCapture();
		iframe.setCapture(true);
		W3C.Event.preventDefault(evt);
		W3C.Event.stopPropagation(evt);
	}
}

function find_setReturnValue(retValue) {
	InstanceChooser.returnValue = retValue;
}

function find_virtualFieldsFind() {
	find_closeSearchWindow();
	var win = window;
	var frame = window.document.getElementById("searchWindow");
	while (frame == null) {
		win = win.parent;
		frame = win.document.getElementById("searchWindow");
	}
	var link = InstanceChooser.link;
	var inputCtrlID = InstanceChooser.inputCtrlID;
	var origField = InstanceChooser.origField;
	var virtualArray = InstanceChooser.virtualArray;
	var requiredValidator = InstanceChooser.requiredValidator;
	var selectctrlID = InstanceChooser.selectctrlID;
	var textFields = InstanceChooser.textFields;
	var numCols = InstanceChooser.numCols;
	find_hideSelect(selectctrlID, inputCtrlID.id, true);
	response = InstanceChooser.returnValue; //showChooseInstance(link, numCols);
	if (response != undefined) {
		//Change value for find fields
		for (i = 0; i < response.length - 1; i += 2) {
			if (response[i] == origField) {
				//Utils.Node.getChildById(inputCtrlID, inputCtrlID.id + "_value").value = response[i + 1];
				document.getElementById(inputCtrlID.id + "_value").value = response[i + 1];
				var hiddenValueField = find_findElement(inputCtrlID.id + "_hidden", window);
				if (hiddenValueField != null)
					hiddenValueField.value = response[i + 1];
				find_findElement(inputCtrlID.id + "_text", window).value = getTextFromResponse(response, textFields);
				if (requiredValidator != undefined) {
					ValidatorValidate(requiredValidator);
				}
			}
		}
		//Affect virtuals
		fillVirtualFields(virtualArray, response);
	}
	setTimeout("find_hideSelect('" + selectctrlID + "','" + inputCtrlID.id + "', true);", 10);  //Why?
}

function showChooseInstance(link, numCols, textLeft) {
	var windowWidth = (numCols * 200) + 20;
	if (windowWidth < 440)
		windowWidth = 440;
	else if (windowWidth > 1000)
		windowWidth = 1000;

	var win = window;
	var frame = window.document.getElementById("searchWindow");
	while (frame == null) {
		win = win.parent;
		frame = win.document.getElementById("searchWindow");
	}

	find_lockChooseInstanceWindow(true);

	frame.src = link;
	frame.style.width = windowWidth + "px";
	frame.style.height = "495px";
	frame.style.overflow = "auto";
	frame.style.visibility = "visible";
	frame.style.display = "block";
	var leftNum = (Utils.Element.getClientWidth(win.document.body) / 2) - (parseInt(frame.style.width) / 2);
	frame.style.left = (Utils.Element.getClientWidth(win.document.body) / 2) + win.document.body.scrollLeft - (parseInt(frame.style.width) / 2) + "px";
	frame.style.top = ((Utils.Element.getClientHeight(win.document.body) / 2) + win.document.body.scrollTop) - (parseInt(frame.style.height) / 2) + "px";
	frame.style.zIndex = 100000;
}

//From an array containing all fields of an element, extract the text that should appear on find text box
function getTextFromResponse(response, selectTextFields) {
	var textFieldsArr = selectTextFields.split(";");
	var finalText = "";
	if (response != undefined) {
		for (j = 0; j < textFieldsArr.length; j++) {
			for (i = 0; i < response.length - 1; i += 2) {
				if (response[i] == textFieldsArr[j]) {
					if (finalText != "") {
						finalText = finalText + " - ";
					}
					finalText = finalText + response[i + 1];
				}
			}
		}
	}
	lastFind = finalText;
	return finalText;
}

function find_virtualsClean(virtualsArrayName) {
	var virtualsArray = eval(virtualsArrayName); //Using eval
	for (anItem in virtualsArray) {
		document.Form1[virtualsArray[anItem] + "_value"].value = "";
		document.Form1[virtualsArray[anItem] + "_value"].selectedIndex = -1;
		if (document.Form1[virtualsArray[anItem] + "_text"] != undefined)
			document.Form1[virtualsArray[anItem] + "_text"].value = "";
	}
}

function fillVirtualFields(virtualArray, items) {
	for (var m = 0; m < items.length - 1; m++) {
		var virtualPos = virtualArray[items[m]];
		if (virtualPos != undefined) {
			document.Form1[virtualPos + "_value"].value = items[m + 1];
			var hiddenValueField = find_findElement(virtualPos + "_hidden", window);
			if (hiddenValueField != null)
				hiddenValueField.value = items[m + 1];

			//document.Form1[virtualPos + "_value"].selectedIndex = items[m+1];
			if (document.Form1[virtualPos + "_value"].onchange != undefined) {		//PV: REVIEW HERE
				var x = document.Form1[virtualPos + "_value"].onchange.toString();
				if (x.indexOf("virSelect") != -1) {
					document.Form1[virtualPos + "_value"].onchange();
				}
			}
		}
	}
}

function find_getSafeUrl(url) {
	return url.replace(/\'/g, '\\\'');
}

function find_lockChooseInstanceWindow(enable) {
	return;
	// Disable it for now...
	var win = window;
	var frame = window.document.getElementById("searchWindow");
	while (frame == null) {
		win = win.parent;
		frame = win.document.getElementById("searchWindow");
	}

	if (enable) {
		try {
			W3C.EventTarget.addEventListener(frame, "click", find_recapture, false);
			W3C.EventTarget.addEventListener(frame, "mousedown", find_recapture, false);
			W3C.EventTarget.addEventListener(frame, "mouseup", find_recapture, false);
			W3C.EventTarget.addEventListener(win.document, "keydown", find_recapture, false);
			W3C.EventTarget.addEventListener(win.document, "keyup", find_recapture, false);
			W3C.EventTarget.addEventListener(win.document, "keypress", find_recapture, false);
			W3C.EventTarget.addEventListener(win.document, "focus", find_recapture, false);
			W3C.EventTarget.addEventListener(win.document, "change", find_recapture, false);
			W3C.EventTarget.addEventListener(win, "focus", find_recapture, false);
		}
		catch (ex) {
			alert(ex + ": " + ex.name + "\n" + ex.message + "\n" + ex.description);
		}

		try {
			window.document.releaseCapture();
			frame.setCapture(true);
		}
		catch (ex) {
			alert(ex + ": " + ex.name + "\n" + ex.message + "\n" + ex.description);
		}
	}
	else {
		try {
			W3C.EventTarget.removeEventListener(frame, "click", find_recapture, false);
			W3C.EventTarget.removeEventListener(frame, "mousedown", find_recapture, false);
			W3C.EventTarget.removeEventListener(frame, "mouseup", find_recapture, false);
			W3C.EventTarget.removeEventListener(win.document, "keydown", find_recapture, false);
			W3C.EventTarget.removeEventListener(win.document, "keyup", find_recapture, false);
			W3C.EventTarget.removeEventListener(win.document, "keypress", find_recapture, false);
			W3C.EventTarget.removeEventListener(win.document, "focus", find_recapture, false);
			W3C.EventTarget.removeEventListener(win.document, "change", find_recapture, false);
			W3C.EventTarget.removeEventListener(win, "focus", find_recapture, false);
		}
		catch (ex) {
			alert(ex + ": " + ex.name + "\n" + ex.message + "\n" + ex.description);
		}

		try {
			frame.releaseCapture();
		}
		catch (ex) {
			alert(ex + ": " + ex.name + "\n" + ex.message + "\n" + ex.description);
		}
	}
}


// Virtual Find
function find_virSelect(url, inputCtrlID, valueCtrlID, textFields, virtualsArray) {
	find_getRecord(url, inputCtrlID, valueCtrlID, virtualsArray, textFields, 1);
}

function find_handleVirtualFind(data, inputCtrlID, virtuals, textFields) {
	var i, j;
	var items = new Array();
	items = data.split('|');
	var textFieldData = getTextFromResponse(items, textFields);
	document.getElementById(inputCtrlID + "_text").value = textFieldData;
	var virtualArray = eval(virtuals);  //Using eval
	fillVirtualFields(virtualArray, items);
}

function find_validateRequired(source, arguments) {
	var hiddenFieldId = source.controltovalidate.replace(/(.*)_text$/, "$1") + "_value";
	var hiddenControl = window.document.getElementById(hiddenFieldId);
	arguments.IsValid = hiddenControl.value != null && hiddenControl.value.length > 0;
	return arguments.IsValid;
}