1 function requestUpdate(url, fieldNames, targetName, targetFieldNames, elementPath) { 2 3 // Note that XMLHttpRequest access may be denied if Mozilla believes that 4 // this resource's URL and the supplied URL are different. 5 6 var xmlhttp = new XMLHttpRequest(); 7 xmlhttp.open("POST", url, false); 8 9 // Add the element path specification. 10 11 var requestBody = ("element-path=" + elementPath); 12 13 // Send the controlling field value. 14 15 requestBody += addFields(fieldNames, false); 16 requestBody += addFields(targetFieldNames, true); 17 18 // Load the remote document with the given parameters sent as text in the request body. 19 20 xmlhttp.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded'); 21 xmlhttp.send(requestBody); 22 23 // Parse the result document. 24 25 var newDocument = Sarissa.getDomDocument(); 26 newDocument = (new DOMParser()).parseFromString(xmlhttp.responseText, "text/xml"); 27 28 // Find the definition of the affected field in the result document. 29 30 var newElement = newDocument.getElementById(targetName); 31 var targetElement = document.getElementById(targetName); 32 33 // Insert the new definition into the current document. 34 35 if (newElement != null && targetElement != null) { 36 var importedElement = document.importNode(newElement, true); 37 targetElement.parentNode.replaceChild(importedElement, targetElement); 38 //importedElement.setAttribute("style", "background-color:red;"); 39 } 40 41 // NOTE: Test Konqueror bug. 42 43 //showMismatch(targetFieldNameArray); 44 45 return false; 46 } 47 48 function addFields(fieldNames, disable) { 49 50 // If no field names exist do not attempt to collect their values. 51 52 if (fieldNames == "") { 53 return ""; 54 } 55 56 var requestBody = ""; 57 58 // Process each target field name. 59 60 var fieldNameArray = fieldNames.split(","); 61 62 // Add the values of the dependent fields. 63 64 for (var i = 0; i < fieldNameArray.length; i++) { 65 var fieldName = fieldNameArray[i]; 66 67 // Skip empty field names (arising through empty elements in the CSV list). 68 69 if (fieldName == "") { 70 continue; 71 } 72 73 // Find the values of the target field. 74 75 var fieldValue; 76 var fieldNodes = document.getElementsByName(fieldName); 77 for (var v = 0; v < fieldNodes.length; v++) { 78 79 // Test for different field types. 80 81 if (fieldNodes[v].options) { 82 for (var opt = 0; opt < fieldNodes[v].options.length; opt++) { 83 if (fieldNodes[v].options[opt].selected) { 84 fieldValue = fieldNodes[v].options[opt].value; 85 requestBody += ("&" + encodeURIComponent(fieldName) + "=" + encodeURIComponent(fieldValue)); 86 } 87 } 88 } else { 89 fieldValue = fieldNodes[v].value; 90 requestBody += ("&" + encodeURIComponent(fieldName) + "=" + encodeURIComponent(fieldValue)); 91 } 92 } 93 94 // NOTE: Konqueror hack: disable fields. 95 96 if (disable) { 97 disableFields(fieldName); 98 } 99 } 100 101 return requestBody; 102 } 103 104 function disableFields(targetFieldName) { 105 106 for (var i = 0; i < document.forms.length; i++) { 107 var form = document.forms[i]; 108 for (var j = 0; j < form.elements.length; j++) { 109 if (form.elements[j].name == targetFieldName) { 110 form.elements[j].name = ""; 111 } 112 } 113 } 114 } 115 116 function showMismatch(targetFieldNameArray) { 117 118 // Show how the number of field elements with a given name can be different 119 // from the number known to the DOM Level 0 part of the API. 120 121 for (var h = 0; h < targetFieldNameArray.length; h++) { 122 var targetFieldName = targetFieldNameArray[h]; 123 var targetFieldNodes = document.getElementsByName(targetFieldName); 124 alert("Nodes for " + targetFieldName + ": " + targetFieldNodes.length); 125 126 var count = 0; 127 for (var i = 0; i < document.forms.length; i++) { 128 var form = document.forms[i]; 129 for (var j = 0; j < form.elements.length; j++) { 130 if (form.elements[j].name == targetFieldName) { 131 count++; 132 } 133 } 134 } 135 alert("Fields for " + targetFieldName + ": " + count); 136 } 137 } 138 139 // vim: tabstop=4 expandtab shiftwidth=4