function _webrRSV_handleReturnKey(e, formID, controlIdentity, controlUniqueID, argument)
{
	if (e.keyCode == 13) {
		_webrDoPostBack(formID, controlIdentity, controlUniqueID, argument);
		return false;
	}

	return true;
}

function _webrRSV_getDynamicFilterSelectionValue(formID, selectionID)
{
	var theForm = document.forms[formID];
	if (theForm == null) { alert("Could not find form with ID [" + formID + "]"); return "No Value"; }
	
	var selectionElement = theForm.elements[selectionID];
	if (selectionElement != null) return selectionElement.value;
	return "No Value";
}

function _webrRSV_toggleFilterDisplay(linkButton, formID, filterTableID, tbodyID, filterPrefID, filterPref, filterFieldPrefix, isDynamicFilterFieldAtTop, dynamicFilterField)
{
	var filterTable = document.getElementById(filterTableID);
	if (filterTable == null) { alert("Could not find table [" + filterTableID + "]"); return; }
	
	var advancedSection = null;
	
	for (var i = 0; i < filterTable.tBodies.length; i++) {
		if (filterTable.tBodies.item(i).id == tbodyID) { advancedSection = filterTable.tBodies.item(i); break; }
	}
	
	if (advancedSection == null) { alert("Could not find TBODY [ " + tbodyID + "]"); return; }

	advancedSection.style.display = advancedSection.style.display == "none" ? "" : "none";
	linkButton.style.display = "none";
	
	if (linkButton.parentNode.firstChild == linkButton) {
		linkButton.parentNode.lastChild.style.display = "";
	} else {
		linkButton.parentNode.firstChild.style.display = "";
	}	
	
	var theForm = document.forms[formID];
	if (theForm == null) { alert("Could not find form with ID [" + formID + "]"); return; }
	
	if (isDynamicFilterFieldAtTop) {
		var	isSimple = advancedSection.style.display == "none";
		var dynamicFilterDropdown = theForm.elements[dynamicFilterField];
		
		if (dynamicFilterDropdown != null) {
			dynamicFilterDropdown.style.width = isSimple ? "" : "100%";
		}
	}
	 
	var filterPrefElement = theForm.elements[filterPrefID];
	if (filterPrefElement != null) filterPrefElement.value = filterPref;	
	
	if (filterPref == "basic") {
		// Start at second field unless the dynamic filter is shown at top
		var j = isDynamicFilterFieldAtTop ? 0 : 1;
		var filterField = null;
		// clear filter fields with name starting with filterFieldPrefix and ending with a number, starting with one.
		while ((filterField = theForm.elements[filterFieldPrefix + (j++)]) != null) {
			filterField.value = "";
		}
	}
}

function _webrRSV_toggleSelection(selectionControl, normalClassName, selectedClassName, formID, tableID)
{
	var postbackIDAttrName = "postbackID";
	var verticalBindingAttrName = "verticalBinding";
	var table = document.getElementById(tableID);
	if (table == null) { alert("Could not find result set table with ID [" + tableID + "]."); return null; }
	var postbackID = table.getAttribute(postbackIDAttrName);
	var	verticalBinding = table.getAttribute(verticalBindingAttrName);

	if (("" + verticalBinding).toLowerCase() != "false") {
		var parentElem = selectionControl.parentNode;
		while (parentElem != null && parentElem.nodeName != "TR") parentElem = parentElem.parentNode;
	 
		if (parentElem == null) { alert("PROBLEM"); return; }
	 
		var rowCells = parentElem.cells;
		var newClassName = selectionControl.checked ? selectedClassName : normalClassName;
	 
		for (var i = 0; i < rowCells.length; i++) {
			var	cell = rowCells.item(i);
			
			if (cell.className == selectedClassName || cell.className == normalClassName) {
				cell.className = newClassName;
			}
		}
	    
		// Fix for toggling radio button rows off
		if (selectionControl.type == "radio") {
			var dataTable = parentElem.parentNode;
			if (dataTable.nodeName == "TBODY") dataTable = parentElem.parentNode.parentNode;

			for (i = 0; i < dataTable.rows.length; i++) {
				if (i == parentElem.rowIndex) continue;
				rowCells = dataTable.rows.item(i).cells;
				
				if (rowCells.item(0).className == selectedClassName) {
					for (var j = 0; j < rowCells.length; j++) {
						rowCells.item(j).className = normalClassName;
					}

					break;
				}
			}
		}
	} else {
		var	newID = selectionControl.value.toLowerCase();
		var parentElem = selectionControl.parentNode;
		while (parentElem != null && parentElem.nodeName != "TD") parentElem = parentElem.parentNode;
		if (parentElem == null) { alert("PROBLEM"); return; }
		var		foundCell = parentElem;
		var		tdIndex = -1;
		
		// The line below normally works, but it doesn't work on Safari, so we have to figure
		// out our own column index by hand.
		//var	tdIndex = parentElem.cellIndex;
		
		while (parentElem != null && parentElem.nodeName != "TR") parentElem = parentElem.parentNode;
		if (parentElem == null) { alert("PROBLEM"); return; }
		
		for (i = 0; i < parentElem.cells.length; i++) {
			if (parentElem.cells.item(i) == foundCell) {
				tdIndex = i;
				break;
			}
		}

		if (tdIndex == -1) { alert("PROBLEM"); return; }
		while (parentElem != null && parentElem.nodeName != "TABLE") parentElem = parentElem.parentNode;
		if (parentElem == null) { alert("PROBLEM"); return; }
		
		var	single = (selectionControl.type == "radio");
		var newClassName = selectionControl.checked ? selectedClassName : normalClassName;

		for (i = 0; i < parentElem.rows.length; i++) {
			var	row = parentElem.rows.item(i);
			
			if (single) {
				for (j = 0; j < row.cells.length; j++) {
					var	cell = row.cells.item(j);
					
					if (cell.className == selectedClassName || cell.className == normalClassName) {
						cell.className = (j == tdIndex ? newClassName : normalClassName);
					}
				}
			} else {
				var	cell = row.cells.item(tdIndex);
					
				if (cell.className == selectedClassName || cell.className == normalClassName) {
					cell.className = newClassName;
				}
			}
		}
	}

	if (typeof(postbackID) == "undefined" || postbackID == null || postbackID === "") {
		alert("Could not find result table postbackID for table [" + tableID + "]."); return null;
	}
	
    var	selectedItems = _webrRSV_getSelectedItems(formID, tableID);

	for (var spanCount = 0; spanCount < 2; spanCount++) {
		var totalItemsSpan = document.getElementById("webrRSV__TotalItems" + spanCount + "_" + postbackID);
		var totalItemCountSpan = document.getElementById("webrRSV__TotalItemsCount" + spanCount + "_" + postbackID);

		if (totalItemsSpan != null && totalItemCountSpan != null) {	    
			if (selectedItems.length == 0) {
				// Hide the total items span
				totalItemsSpan.style.display = "none";
			} else {
				totalItemsSpan.style.display = "";
				totalItemCountSpan.innerHTML = "" + selectedItems.length;
			}
		}
	}
	
	var	buttonBarID = "webrRSV__BBDIV_" + postbackID;
	var buttonBarDiv = document.getElementById(buttonBarID);
	
	if (buttonBarDiv != null) {
		var	inputs = buttonBarDiv.getElementsByTagName("INPUT");
		
		for (var i = 0; i < inputs.length; i++)
		{
			var	inputButton = inputs[i];
			if (inputButton.type != "button") continue;
			
			if (inputButton.getAttribute("disableWhenNothingSelected") == "true") {
				inputButton.disabled = (selectedItems.length == 0);
			}
		}
	}
}

function _webrRSV_getSelectedItems(formID, tableID)
{
	var table = document.getElementById(tableID);
	if (table == null) { alert("Could not find result set table with ID [" + tableID + "]."); return null; }
	
	var postbackID = table.getAttribute("postbackID");
	if (typeof(postbackID) == "undefined" || postbackID == null || postbackID === "") {
		alert("Could not find result table postbackID for table [" + tableID + "]."); return null;
	}

	return _webrRSV_getSelectedItemsUsingPostbackID(formID, postbackID);
}

function _webrRSV_getSelectedItemsUsingPostbackID(formID, postbackID)
{
	var selectedItemPrefix = "webrRSV__SelectedItem_";
	var currentSelectionPrefix = "webrRSV__CurrentSelection_";
	return _webrRSV_internalGetSelectedItemsUsingPostbackID(formID, postbackID, selectedItemPrefix, currentSelectionPrefix);
}

function _webrRSV_internalGetSelectedItemsUsingPostbackID(formID, postbackID, selectedItemPrefix, currentSelectionPrefix)
{
	var theForm = document.forms[formID];
	if (theForm == null) { alert("Could not find form with ID [" + formID + "]"); return null; }
	
	var selections = new Array();
	var currentSelectionsField = theForm.elements[currentSelectionPrefix + postbackID];

	if (currentSelectionsField != null && currentSelectionsField.value !== "") {
		var currentSelections = currentSelectionsField.value.split(";");
		for (var i = 0; i < currentSelections.length; i++) {
			var currentSelection = currentSelections[i];
			selections[currentSelection] = currentSelection;
		}
	}

	var hiddenSelections = _webrRSV_getFormElements(theForm, selectedItemPrefix + postbackID + "_hidden");
	if (hiddenSelections != null) {
		for (var j = 0; j < hiddenSelections.length; j++) {
			var hiddenSelection = hiddenSelections.item(j).value;
			if (selections[hiddenSelection] != null) selections[hiddenSelection] = null;
		}
	}
	
	var newSelections = _webrRSV_getFormElements(theForm, selectedItemPrefix + postbackID);
	if (newSelections != null) {
		for (var k = 0; k < newSelections.length; k++) {
			var newSelection = newSelections.item(k);
			if (newSelection.checked) {
				if (newSelection.type.toUpperCase() == "RADIO") {
					// clear array and put single selection in it.
					selections = new Array();
					selections[newSelection.value] = newSelection.value;
					break;
				} else {
					selections[newSelection.value] = newSelection.value;
				}
			}
		}
	}
	
	// Convert hashtable-like array to a "flat" array with items at indexes 0-n.
	var selectionsCopy = new Array();
	var selectionKey = null;
	var counter = 0;
	for (key in selections) {
		var selection = selections[key];
		if (selection != null) selectionsCopy[counter++] = selection;
	}
	
	return selectionsCopy;
}

function _webrRSV_getSelectedItemDisplayStrings(formID, tableID)
{
	var table = document.getElementById(tableID);
	if (table == null) { alert("Could not find result set table with ID [" + tableID + "]."); return null; }
	
	var postbackID = table.getAttribute("postbackID");
	if (typeof(postbackID) == "undefined" || postbackID == null || postbackID === "") {
		alert("Could not find result table postbackID for table [" + tableID + "]."); return null;
	}

	return _webrRSV_getSelectedItemDisplayStringsUsingPostbackID(formID, postbackID);
}

function _webrRSV_getSelectedItemDisplayStringsUsingPostbackID(formID, postbackID)
{
	var selectedItemPrefix = "webrRSV__SelectedItem_";
	var currentSelectionPrefix = "webrRSV__CurrentSelection_";
	var	displayStringAttributeName = "displayString";
	var	displayStringSelectionPrefix = "webrRSV__CurrentSelectionDisplay_";
	return _webrRSV_internalGetSelectedItemStringsUsingPostbackID(formID, postbackID, selectedItemPrefix, displayStringAttributeName, currentSelectionPrefix, displayStringSelectionPrefix);
}

function _webrRSV_getSelectedItemValues(formID, tableID)
{
	var table = document.getElementById(tableID);
	if (table == null) { alert("Could not find result set table with ID [" + tableID + "]."); return null; }
	
	var postbackID = table.getAttribute("postbackID");
	if (typeof(postbackID) == "undefined" || postbackID == null || postbackID === "") {
		alert("Could not find result table postbackID for table [" + tableID + "]."); return null;
	}

	return _webrRSV_getSelectedItemValuesUsingPostbackID(formID, postbackID);
}

function _webrRSV_getSelectedItemValuesUsingPostbackID(formID, postbackID)
{
	var selectedItemPrefix = "webrRSV__SelectedItem_";
	var currentSelectionPrefix = "webrRSV__CurrentSelection_";
	var	valueStringAttributeName = "valueString";
	var	valueStringSelectionPrefix = "webrRSV__CurrentSelectionValue_";
	return _webrRSV_internalGetSelectedItemStringsUsingPostbackID(formID, postbackID, selectedItemPrefix, valueStringAttributeName, currentSelectionPrefix, valueStringSelectionPrefix);
}

function _webrRSV_internalGetSelectedItemStringsUsingPostbackID(formID, postbackID, selectedItemPrefix, stringAttributeName, currentSelectionPrefix, stringSelectionPrefix)
{
	var theForm = document.forms[formID];
	if (theForm == null) { alert("Could not find form with ID [" + formID + "]"); return null; }
	
	var	selections = new Array();

	var currentSelectionsField = theForm.elements[currentSelectionPrefix + postbackID];
	var currentSelectionDisplayNamesField = theForm.elements[stringSelectionPrefix + postbackID];
	
	if (currentSelectionDisplayNamesField == null) {
		return _webrRSV_internalGetSelectedItemsUsingPostbackID(formID, postbackID, selectedItemPrefix, currentSelectionPrefix);
	}
	
	if (currentSelectionsField != null && currentSelectionsField.value !== "" &&
		currentSelectionDisplayNamesField != null && currentSelectionDisplayNamesField.value !== "")
	{
		var currentSelections = currentSelectionsField.value.split(";");
		var	currentSelectionNames = currentSelectionDisplayNamesField.value.split(";");
		
		for (var i = 0; i < currentSelections.length; i++) {
			var currentSelection = currentSelections[i];
			selections[currentSelection] = currentSelectionNames[i];
		}
	}

	var newSelections = _webrRSV_getFormElements(theForm, selectedItemPrefix + postbackID);

	if (newSelections != null) {
		for (var k = 0; k < newSelections.length; k++) {
			var newSelection = newSelections.item(k);
			if (typeof newSelection.getAttribute == "undefined") break;
			
			if (newSelection.checked) {
				if (newSelection.type.toUpperCase() == "RADIO") {
					// clear array and put single selection in it.
					selections = new Array();
					selections[newSelection.value] = newSelection.getAttribute(stringAttributeName);
					break;
				} else {
					selections[newSelection.value] = newSelection.getAttribute(stringAttributeName);
				}
			}
		}
	}
	
	// Convert hashtable-like array to a "flat" array with items at indexes 0-n, in the order
	// that the selected items come back in.
	var selectionsCopy = new Array();
	var selectionKey = null;
	var counter = 0;
	var	curSel = _webrRSV_internalGetSelectedItemsUsingPostbackID(formID, postbackID, selectedItemPrefix, currentSelectionPrefix); 
	
	for (var i = 0; i < curSel.length; i++) {
		var key = curSel[i];
		var selection = selections[key];
		if (selection != null) selectionsCopy[counter++] = selection;
	}
	
	return selectionsCopy;
}

// Used for retrieving form elements in cases where there may be more than one element with the same name.
// Returns null if no form element exists with the specified name.
// Otherwise, returns collection of form elements.  The collection supports the length property and item() method.
function _webrRSV_getFormElements(theForm, elementName)
{
	function _webrRSV_ArrayAdapter(sourceArray)
	{
		function _webrRSV_ArrayAdapter_item(index) {
		    return this.sourceArray[index];
		}

		this.sourceArray = sourceArray;
		this.length = sourceArray.length;		
		this.item = _webrRSV_ArrayAdapter_item;
	}

	if (document.all) { // for IE
		var elements = theForm.elements(elementName);
		if (elements != null && typeof(elements.length) == "undefined") return new _webrRSV_ArrayAdapter([elements]);
		return elements;
	}	

	var elementArray = new Array();
	var formElements = theForm.elements;
	var elementCount = formElements.length;

	for (var i = 0; i < elementCount; i++) {
		var formElement = formElements[i];
		if (formElement.name == elementName) elementArray[elementArray.length] = formElement;
	}

	if (elementArray.length == 0) return null;
	return new _webrRSV_ArrayAdapter(elementArray);
}

function _webrRSV_convertValidIDToOID(oid)
{
	return oid.replace(/\-/g, "[").replace(/\_/g, "]");
}
