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.send(requestBody); 21 22 // Parse the result document. 23 24 var newDocument = Sarissa.getDomDocument(); 25 newDocument = (new DOMParser()).parseFromString(xmlhttp.responseText, "text/xml"); 26 27 // Find the definition of the affected field in the result document. 28 29 var newElement = newDocument.getElementById(targetName); 30 var targetElement = document.getElementById(targetName); 31 32 // Insert the new definition into the current document. 33 34 if (newElement != null && targetElement != null) { 35 var importedElement = document.importNode(newElement, true); 36 targetElement.parentNode.replaceChild(importedElement, targetElement); 37 //importedElement.setAttribute("style", "background-color:red;"); 38 } 39 40 // NOTE: Test Konqueror bug. 41 42 //showMismatch(targetFieldNameArray); 43 } 44 45 function addFields(fieldNames, disable) { 46 47 // If no field names exist do not attempt to collect their values. 48 49 if (fieldNames == "") { 50 return ""; 51 } 52 53 var requestBody = ""; 54 55 // Process each target field name. 56 57 var fieldNameArray = fieldNames.split(","); 58 59 // Add the values of the dependent fields. 60 61 for (var i = 0; i < fieldNameArray.length; i++) { 62 var fieldName = fieldNameArray[i]; 63 64 // Find the values of the target field. 65 66 var fieldValue; 67 var fieldNodes = document.getElementsByName(fieldName); 68 for (var v = 0; v < fieldNodes.length; v++) { 69 70 // Test for different field types. 71 72 if (fieldNodes[v].options) { 73 for (var opt = 0; opt < fieldNodes[v].options.length; opt++) { 74 if (fieldNodes[v].options[opt].selected) { 75 fieldValue = fieldNodes[v].options[opt].value; 76 requestBody += ("\r\n" + fieldName + "=" + fieldValue); 77 } 78 } 79 } else { 80 fieldValue = fieldNodes[v].value; 81 requestBody += ("\r\n" + fieldName + "=" + fieldValue); 82 } 83 } 84 85 // NOTE: Konqueror hack: disable fields. 86 87 if (disable) { 88 disableFields(fieldName); 89 } 90 } 91 92 return requestBody; 93 } 94 95 function disableFields(targetFieldName) { 96 97 for (var i = 0; i < document.forms.length; i++) { 98 var form = document.forms[i]; 99 for (var j = 0; j < form.elements.length; j++) { 100 if (form.elements[j].name == targetFieldName) { 101 form.elements[j].name = ""; 102 } 103 } 104 } 105 } 106 107 function showMismatch(targetFieldNameArray) { 108 109 // Show how the number of field elements with a given name can be different 110 // from the number known to the DOM Level 0 part of the API. 111 112 for (var h = 0; h < targetFieldNameArray.length; h++) { 113 var targetFieldName = targetFieldNameArray[h]; 114 var targetFieldNodes = document.getElementsByName(targetFieldName); 115 alert("Nodes for " + targetFieldName + ": " + targetFieldNodes.length); 116 117 var count = 0; 118 for (var i = 0; i < document.forms.length; i++) { 119 var form = document.forms[i]; 120 for (var j = 0; j < form.elements.length; j++) { 121 if (form.elements[j].name == targetFieldName) { 122 count++; 123 } 124 } 125 } 126 alert("Fields for " + targetFieldName + ": " + count); 127 } 128 }