| rev | line source | 
| bsw/jbe@19 | 1 | 
| bsw/jbe@19 | 2 partialload_queue = []; | 
| bsw/jbe@19 | 3 partialload_queueRPos = 0; | 
| bsw/jbe@19 | 4 partialload_queueWPos = 0; | 
| bsw/jbe@19 | 5 | 
| bsw/jbe@19 | 6 function partialload_getFormKeyValuePairs(form) { | 
| bsw/jbe@19 | 7   var result = {}; | 
| bsw/jbe@19 | 8   for (var i=0; i<form.elements.length; i++) { | 
| bsw/jbe@19 | 9     var inputElement = form.elements[i]; | 
| bsw/jbe@19 | 10     var key = inputElement.name; | 
| bsw/jbe@19 | 11     var value = inputElement.value; | 
| bsw/jbe@19 | 12     if (result[key] == null) result[key] = value; | 
| bsw/jbe@19 | 13     else if (typeof(result[key]) == "object") { | 
| bsw/jbe@19 | 14       result[key][result[key].length] = value; | 
| bsw/jbe@19 | 15     } else { | 
| bsw/jbe@19 | 16       result[key] = [result[key], value]; | 
| bsw/jbe@19 | 17     } | 
| bsw/jbe@19 | 18   } | 
| bsw/jbe@19 | 19   return result; | 
| bsw/jbe@19 | 20 } | 
| bsw/jbe@19 | 21 | 
| bsw/jbe@19 | 22 function partialload_encodeFormData(params) { | 
| bsw/jbe@19 | 23   var result = ""; | 
| bsw/jbe@19 | 24   for (var key in params) { | 
| bsw/jbe@19 | 25     var value = params[key]; | 
| bsw/jbe@19 | 26     if (typeof(value) == "string") { | 
| bsw/jbe@19 | 27       if (result != "") result += "&"; | 
| bsw/jbe@19 | 28       result += encodeURIComponent(key) + "=" + encodeURIComponent(value); | 
| bsw/jbe@19 | 29     } else if (typeof(value) == "object") { | 
| bsw/jbe@19 | 30       var i; | 
| bsw/jbe@19 | 31       for (i=0; i<value.length; i++) { | 
| bsw/jbe@19 | 32         if (result != "") result += "&"; | 
| bsw/jbe@19 | 33         result += encodeURIComponent(key) + "=" + encodeURIComponent(value[i]); | 
| bsw/jbe@19 | 34       } | 
| bsw/jbe@19 | 35     } | 
| bsw/jbe@19 | 36   } | 
| bsw/jbe@19 | 37   return result; | 
| bsw/jbe@19 | 38 } | 
| bsw/jbe@19 | 39 | 
| bsw/jbe@19 | 40 function partialload_addFormDataToUrl(url, params) { | 
| bsw/jbe@19 | 41   if (params != null && typeof(params) != "string") { | 
| bsw/jbe@19 | 42     params = partialload_encodeFormData(params); | 
| bsw/jbe@19 | 43   } | 
| bsw/jbe@19 | 44   if (params != null) { | 
| bsw/jbe@19 | 45     if (url.search(/\?/) >= 0) { | 
| bsw/jbe@19 | 46       if (url.search(/&$/) >= 0) { | 
| bsw/jbe@19 | 47         url = url + params; | 
| bsw/jbe@19 | 48       } else { | 
| bsw/jbe@19 | 49         url = url + "&" + params; | 
| bsw/jbe@19 | 50       } | 
| bsw/jbe@19 | 51     } else { | 
| bsw/jbe@19 | 52       url = url + "?" + params; | 
| bsw/jbe@19 | 53     } | 
| bsw/jbe@19 | 54   } | 
| bsw/jbe@19 | 55   return url; | 
| bsw/jbe@19 | 56 } | 
| bsw/jbe@19 | 57 | 
| bsw/jbe@19 | 58 function partialload_mergeEncodedFormData(data1, data2) { | 
| bsw/jbe@19 | 59   if (data2 == null || data2 == "") return data1; | 
| bsw/jbe@19 | 60   if (data1 == null || data1 == "") return data2; | 
| bsw/jbe@19 | 61   return data1 + "&" + data2; | 
| bsw/jbe@19 | 62 } | 
| bsw/jbe@19 | 63 | 
| bsw/jbe@19 | 64 function partialload_startNextRequest() { | 
| bsw/jbe@19 | 65   var entry = partialload_queue[partialload_queueRPos++]; | 
| bsw/jbe@19 | 66   var req = new XMLHttpRequest(); | 
| bsw/jbe@19 | 67   req.open(entry.method, entry.url, true); | 
| bsw/jbe@19 | 68   req.onreadystatechange = function() { | 
| bsw/jbe@19 | 69     if (req.readyState == 4) { | 
| bsw/jbe@19 | 70       if (req.status == 200) { | 
| bsw/jbe@19 | 71         if (entry.successHandler != null) entry.successHandler(req.responseText); | 
| bsw/jbe@19 | 72       } else { | 
| bsw/jbe@19 | 73         if (entry.failureHandler != null) entry.failureHandler(); | 
| bsw/jbe@19 | 74       } | 
| bsw/jbe@19 | 75       if (partialload_queue[partialload_queueRPos]) { | 
| bsw/jbe@19 | 76         partialload_startNextRequest(); | 
| bsw/jbe@19 | 77       } else { | 
| bsw/jbe@19 | 78         partialload_queue = []; | 
| bsw/jbe@19 | 79         partialload_queueRPos = 0; | 
| bsw/jbe@19 | 80         partialload_queueWPos = 0; | 
| bsw/jbe@19 | 81       } | 
| bsw/jbe@19 | 82     } | 
| bsw/jbe@19 | 83   } | 
| bsw/jbe@19 | 84   if (entry.data) { | 
| bsw/jbe@19 | 85     req.setRequestHeader("Content-type", "application/x-www-form-urlencoded"); | 
| bsw/jbe@19 | 86   } | 
| bsw/jbe@19 | 87   req.send(entry.data); | 
| bsw/jbe@19 | 88 } | 
| bsw/jbe@19 | 89 | 
| bsw/jbe@19 | 90 function queuedHttpRequest( | 
| bsw/jbe@19 | 91   url_or_form, | 
| bsw/jbe@19 | 92   urlParams, | 
| bsw/jbe@19 | 93   postParams, | 
| bsw/jbe@19 | 94   successHandler, | 
| bsw/jbe@19 | 95   failureHandler | 
| bsw/jbe@19 | 96 ) { | 
| bsw/jbe@19 | 97   var method; | 
| bsw/jbe@19 | 98   var data = null; | 
| bsw/jbe@19 | 99   if (typeof(postParams) == "string") { | 
| bsw/jbe@19 | 100     data = postParams; | 
| bsw/jbe@19 | 101   } else if (postParams != null) { | 
| bsw/jbe@19 | 102     data = partialload_encodeFormData(postParams); | 
| bsw/jbe@19 | 103   } | 
| bsw/jbe@19 | 104   var url; | 
| bsw/jbe@19 | 105   if (typeof(url_or_form) == "object") { | 
| bsw/jbe@19 | 106     // form element given | 
| bsw/jbe@19 | 107     var form = url_or_form; | 
| bsw/jbe@19 | 108     url = partialload_addFormDataToUrl(form.action, urlParams); | 
| bsw/jbe@19 | 109     var dataFromForm = partialload_encodeFormData( | 
| bsw/jbe@19 | 110       partialload_getFormKeyValuePairs(form) | 
| bsw/jbe@19 | 111     ); | 
| bsw/jbe@19 | 112     if (form.method != null && form.method.search(/^POST$/i) >= 0) { | 
| bsw/jbe@19 | 113       method = "POST"; | 
| bsw/jbe@19 | 114       data = partialload_mergeEncodedFormData(data, dataFromForm); | 
| bsw/jbe@19 | 115     } else { | 
| bsw/jbe@19 | 116       method = (postParams == NULL) ? "GET" : "POST"; | 
| bsw/jbe@19 | 117       url = partialload_addFormDataToUrl(url, dataFromForm); | 
| bsw/jbe@19 | 118     } | 
| bsw/jbe@19 | 119   } else { | 
| bsw/jbe@19 | 120     // URL given | 
| bsw/jbe@19 | 121     url = partialload_addFormDataToUrl(url_or_form, urlParams); | 
| bsw/jbe@19 | 122     if (postParams == null) { | 
| bsw/jbe@19 | 123       method = "GET"; | 
| bsw/jbe@19 | 124     } else { | 
| bsw/jbe@19 | 125       method = "POST"; | 
| bsw/jbe@19 | 126       if (typeof(postParams) == "string") { | 
| bsw/jbe@19 | 127 	data = postParams; | 
| bsw/jbe@19 | 128       } else { | 
| bsw/jbe@19 | 129 	data = partialload_encodeFormData(postParams); | 
| bsw/jbe@19 | 130       } | 
| bsw/jbe@19 | 131     } | 
| bsw/jbe@19 | 132   } | 
| bsw/jbe@19 | 133   partialload_queue[partialload_queueWPos++] = { | 
| bsw/jbe@19 | 134     method:         method, | 
| bsw/jbe@19 | 135     url:            url, | 
| bsw/jbe@19 | 136     data:           data, | 
| bsw/jbe@19 | 137     successHandler: successHandler, | 
| bsw/jbe@19 | 138     failureHandler: failureHandler | 
| bsw/jbe@19 | 139   }; | 
| bsw/jbe@19 | 140   if (partialload_queueRPos == 0) { | 
| bsw/jbe@19 | 141     partialload_startNextRequest(); | 
| bsw/jbe@19 | 142   } | 
| bsw/jbe@19 | 143 } | 
| bsw/jbe@19 | 144 | 
| bsw/jbe@19 | 145 function setHtmlContent(node, htmlWithScripts) { | 
| bsw/jbe@19 | 146   var uniquePrefix = "placeholder" + Math.floor(Math.random()*10e16) + "_"; | 
| bsw/jbe@19 | 147   var i = 0; | 
| bsw/jbe@19 | 148   var scripts = []; | 
| bsw/jbe@19 | 149   var htmlWithPlaceholders = ""; | 
| bsw/jbe@19 | 150   // NOTE: This function can not handle CDATA blocks at random positions. | 
| bsw/jbe@19 | 151   htmlWithPlaceholders = htmlWithScripts.replace( | 
| bsw/jbe@19 | 152     /<script[^>]*>(.*?)<\/script>/ig, | 
| bsw/jbe@19 | 153     function(all, inside) { | 
| bsw/jbe@19 | 154       scripts[i] = inside; | 
| bsw/jbe@19 | 155       var placeholder = '<span id="' + uniquePrefix + i + '"></span>'; | 
| bsw/jbe@19 | 156       i++; | 
| bsw/jbe@19 | 157       return placeholder; | 
| bsw/jbe@19 | 158     } | 
| bsw/jbe@19 | 159   ) | 
| bsw/jbe@19 | 160   node.innerHTML = htmlWithPlaceholders; | 
| bsw/jbe@19 | 161   var documentWriteBackup   = document.write; | 
| bsw/jbe@19 | 162   var documentWritelnBackup = document.writeln; | 
| bsw/jbe@19 | 163   var output; | 
| bsw/jbe@19 | 164   document.write   = function(str) { output += str; } | 
| bsw/jbe@19 | 165   document.writeln = function(str) { output += str + "\n"; } | 
| bsw/jbe@19 | 166   for (i=0; i<scripts.length; i++) { | 
| bsw/jbe@19 | 167     var placeholderNode = document.getElementById(uniquePrefix + i); | 
| bsw/jbe@19 | 168     output = ""; | 
| bsw/jbe@19 | 169     eval(scripts[i]); | 
| bsw/jbe@19 | 170     if (output != "") { | 
| bsw/jbe@19 | 171       placeholderNode.innerHTML = output; | 
| bsw/jbe@19 | 172       while (placeholderNode.childNodes.length > 0) { | 
| bsw/jbe@19 | 173         var childNode = placeholderNode.childNodes[0]; | 
| bsw/jbe@19 | 174         placeholderNode.removeChild(childNode); | 
| bsw/jbe@19 | 175         placeholderNode.parentNode.insertBefore(childNode, placeholderNode); | 
| bsw/jbe@19 | 176       } | 
| bsw/jbe@19 | 177     } | 
| bsw/jbe@19 | 178     placeholderNode.parentNode.removeChild(placeholderNode); | 
| bsw/jbe@19 | 179   } | 
| bsw/jbe@19 | 180   document.write   = documentWriteBackup; | 
| bsw/jbe@19 | 181   document.writeln = documentWritelnBackup; | 
| bsw/jbe@19 | 182 } | 
| bsw/jbe@19 | 183 | 
| bsw/jbe@19 | 184 function partialLoad( | 
| bsw/jbe@19 | 185   node, | 
| bsw/jbe@19 | 186   tempLoadingContent, | 
| bsw/jbe@19 | 187   failureContent, | 
| bsw/jbe@19 | 188   url_or_form, | 
| bsw/jbe@19 | 189   urlParams, | 
| bsw/jbe@19 | 190   postParams, | 
| bsw/jbe@19 | 191   successHandler, | 
| bsw/jbe@19 | 192   failureHandler | 
| bsw/jbe@19 | 193 ) { | 
| bsw/jbe@19 | 194   if (typeof(node) == "string") node = document.getElementById(node); | 
| bsw/jbe@19 | 195   if (tempLoadingContent != null) setHtmlContent(node, tempLoadingContent); | 
| bsw/jbe@19 | 196   queuedHttpRequest( | 
| bsw/jbe@19 | 197     url_or_form, | 
| bsw/jbe@19 | 198     urlParams, | 
| bsw/jbe@19 | 199     postParams, | 
| bsw/jbe@19 | 200     function(response) { | 
| bsw/jbe@19 | 201       setHtmlContent(node, response); | 
| bsw/jbe@19 | 202       if (successHandler != null) successHandler(); | 
| bsw/jbe@19 | 203     }, | 
| bsw/jbe@19 | 204     function() { | 
| bsw/jbe@19 | 205       if (failureContent != null) setHtmlContent(node, failureContent); | 
| bsw/jbe@19 | 206       if (failureHandler != null) failureHandler(); | 
| bsw/jbe@19 | 207     } | 
| bsw/jbe@19 | 208   ); | 
| bsw/jbe@19 | 209 } | 
| bsw/jbe@19 | 210 | 
| bsw/jbe@19 | 211 function partialMultiLoad( | 
| bsw/jbe@19 | 212   mapping, | 
| bsw/jbe@19 | 213   tempLoadingContents, | 
| bsw/jbe@19 | 214   failureContents, | 
| bsw/jbe@19 | 215   url_or_form, | 
| bsw/jbe@19 | 216   urlParams, | 
| bsw/jbe@19 | 217   postParams, | 
| bsw/jbe@19 | 218   successHandler, | 
| bsw/jbe@19 | 219   failureHandler | 
| bsw/jbe@19 | 220 ) { | 
| bsw/jbe@19 | 221   if (mapping instanceof Array) { | 
| bsw/jbe@19 | 222     var mappingHash = {} | 
| bsw/jbe@19 | 223     for (var i=0; i<mapping.length; i++) { | 
| bsw/jbe@19 | 224       mappingHash[mapping[i]] = mapping[i]; | 
| bsw/jbe@19 | 225     } | 
| bsw/jbe@19 | 226     mapping = mappingHash; | 
| bsw/jbe@19 | 227   } | 
| bsw/jbe@19 | 228   if (typeof(tempLoadingContents) == "string") { | 
| bsw/jbe@19 | 229     for (var key in mapping) { | 
| bsw/jbe@19 | 230       var node = key; | 
| bsw/jbe@19 | 231       if (typeof(node) == "string") node = document.getElementById(node); | 
| bsw/jbe@19 | 232       setHtmlContent(node, tempLoadingContents); | 
| bsw/jbe@19 | 233     } | 
| bsw/jbe@19 | 234   } else if (tempLoadingContents != null) { | 
| bsw/jbe@19 | 235     for (var key in tempLoadingContents) { | 
| bsw/jbe@19 | 236       var node = key; | 
| bsw/jbe@19 | 237       if (typeof(node) == "string") node = document.getElementById(node); | 
| bsw/jbe@19 | 238       setHtmlContent(node, tempLoadingContents[key]); | 
| bsw/jbe@19 | 239     } | 
| bsw/jbe@19 | 240   } | 
| bsw/jbe@19 | 241   queuedHttpRequest( | 
| bsw/jbe@19 | 242     url_or_form, | 
| bsw/jbe@19 | 243     urlParams, | 
| bsw/jbe@19 | 244     postParams, | 
| bsw/jbe@19 | 245     function(response) { | 
| bsw/jbe@19 | 246       var data = eval("(" + response + ")"); | 
| bsw/jbe@19 | 247       for (var key in mapping) { | 
| bsw/jbe@19 | 248         var node = key; | 
| bsw/jbe@19 | 249         if (typeof(node) == "string") node = document.getElementById(node); | 
| bsw/jbe@19 | 250         setHtmlContent(node, data[mapping[key]]); | 
| bsw/jbe@19 | 251       } | 
| bsw/jbe@19 | 252       if (successHandler != null) successHandler(); | 
| bsw/jbe@19 | 253     }, | 
| bsw/jbe@19 | 254     function() { | 
| bsw/jbe@19 | 255       if (typeof(failureContents) == "string") { | 
| bsw/jbe@19 | 256         for (var key in mapping) { | 
| bsw/jbe@19 | 257           var node = key; | 
| bsw/jbe@19 | 258           if (typeof(node) == "string") node = document.getElementById(node); | 
| bsw/jbe@19 | 259           setHtmlContent(node, failureContents); | 
| bsw/jbe@19 | 260         } | 
| bsw/jbe@19 | 261       } else if (failureContents != null) { | 
| bsw/jbe@19 | 262         for (var key in failureContents) { | 
| bsw/jbe@19 | 263           var node = key; | 
| bsw/jbe@19 | 264           if (typeof(node) == "string") node = document.getElementById(node); | 
| bsw/jbe@19 | 265           setHtmlContent(node, failureContents[key]); | 
| bsw/jbe@19 | 266         } | 
| bsw/jbe@19 | 267       } | 
| bsw/jbe@19 | 268       if (failureHandler != null) failureHandler(); | 
| bsw/jbe@19 | 269     } | 
| bsw/jbe@19 | 270   ); | 
| bsw/jbe@19 | 271 } |