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