cmlenz@39: function initializeFilters() { cmlenz@39: cmlenz@39: // Bail early for Konqueror and IE5.2/Mac, which don't fully support dynamic cmlenz@39: // creation of form controls cmlenz@39: try { cmlenz@39: var test = document.createElement("input"); cmlenz@39: test.type = "button"; cmlenz@39: if (test.type != "button") throw Error(); cmlenz@39: } catch (e) { cmlenz@39: return; cmlenz@39: } cmlenz@39: cmlenz@39: // Removes an existing row from the filters table cmlenz@39: function removeRow(button, propertyName) { cmlenz@39: var tr = getAncestorByTagName(button, "tr"); cmlenz@39: cmlenz@39: var mode = null; cmlenz@39: var selects = tr.getElementsByTagName("select"); cmlenz@39: for (var i = 0; i < selects.length; i++) { cmlenz@39: if (selects[i].name == propertyName + "_mode") { cmlenz@39: mode = selects[i]; cmlenz@39: break; cmlenz@39: } cmlenz@39: } cmlenz@39: if (mode && (getAncestorByTagName(mode, "tr") == tr)) { cmlenz@39: // Check whether there are more 'or' rows for this filter cmlenz@39: var next = tr.nextSibling; cmlenz@39: if (next && (next.className == propertyName)) { cmlenz@39: function getChildElementAt(e, idx) { cmlenz@39: e = e.firstChild; cmlenz@39: var cur = 0; cmlenz@39: while (cur <= idx) { cmlenz@39: while (e && e.nodeType != 1) e = e.nextSibling; cmlenz@39: if (cur++ == idx) break; cmlenz@39: e = e.nextSibling; cmlenz@39: } cmlenz@39: return e; cmlenz@39: } cmlenz@39: cmlenz@39: var thisTh = getChildElementAt(tr, 0); cmlenz@39: var nextTh = getChildElementAt(next, 0); cmlenz@39: next.insertBefore(thisTh, nextTh); cmlenz@39: nextTh.colSpan = 1; cmlenz@39: cmlenz@39: thisTd = getChildElementAt(tr, 0); cmlenz@39: nextTd = getChildElementAt(next, 1); cmlenz@39: next.replaceChild(thisTd, nextTd); cmlenz@39: } cmlenz@39: } cmlenz@39: cmlenz@39: var tBody = tr.parentNode; cmlenz@39: tBody.deleteRow(tr.sectionRowIndex); cmlenz@39: if (!tBody.rows.length) { cmlenz@39: tBody.parentNode.removeChild(tBody); cmlenz@39: } cmlenz@39: cmlenz@39: if (propertyName) { cmlenz@39: var select = document.forms["query"].elements["add_filter"]; cmlenz@39: for (var i = 0; i < select.options.length; i++) { cmlenz@39: var option = select.options[i]; cmlenz@39: if (option.value == propertyName) option.disabled = false; cmlenz@39: } cmlenz@39: } cmlenz@39: } cmlenz@39: cmlenz@39: // Initializes a filter row, the 'input' parameter is the submit cmlenz@39: // button for removing the filter cmlenz@39: function initializeFilter(input) { cmlenz@39: var removeButton = document.createElement("input"); cmlenz@39: removeButton.type = "button"; cmlenz@39: removeButton.value = input.value; cmlenz@39: if (input.name.substr(0, 10) == "rm_filter_") { cmlenz@39: removeButton.onclick = function() { cmlenz@39: var endIndex = input.name.search(/_\d+$/); cmlenz@39: if (endIndex < 0) endIndex = input.name.length; cmlenz@39: removeRow(removeButton, input.name.substring(10, endIndex)); cmlenz@39: return false; cmlenz@39: } cmlenz@39: } else { cmlenz@39: removeButton.onclick = function() { cmlenz@39: removeRow(removeButton); cmlenz@39: return false; cmlenz@39: } cmlenz@39: } cmlenz@39: input.parentNode.replaceChild(removeButton, input); cmlenz@39: } cmlenz@39: cmlenz@39: // Make the submit buttons for removing filters client-side triggers cmlenz@39: var filters = document.getElementById("filters"); cmlenz@39: var inputs = filters.getElementsByTagName("input"); cmlenz@39: for (var i = 0; i < inputs.length; i++) { cmlenz@39: var input = inputs[i]; cmlenz@39: if (input.type == "submit" && input.name cmlenz@39: && input.name.match(/^rm_filter_/)) { cmlenz@39: initializeFilter(input); cmlenz@39: } cmlenz@39: } cmlenz@39: cmlenz@39: // Make the drop-down menu for adding a filter a client-side trigger cmlenz@39: var addButton = document.forms["query"].elements["add"]; cmlenz@39: addButton.parentNode.removeChild(addButton); cmlenz@39: var select = document.getElementById("add_filter"); cmlenz@39: select.onchange = function() { cmlenz@39: if (select.selectedIndex < 1) return; cmlenz@39: cmlenz@39: if (select.options[select.selectedIndex].disabled) { cmlenz@39: // Neither IE nor Safari supported disabled options at the time this was cmlenz@39: // written, so alert the user cmlenz@39: alert("A filter already exists for that property"); cmlenz@39: return; cmlenz@39: } cmlenz@39: cmlenz@39: // Convenience function for creating a