webmcp
annotate framework/js/partialload.js @ 11:d76a8857ba62
Added ui.partial and other functions, which allow partial content replacement using XMLHttpRequests; Image support for ui.link
Also includes following changes:
- Fix for rocketcgi library to accept POST data content-types, which contain additional charset information.
- Support arrays passed as params to encode.url (only for keys ending with "[]")
- Version information changed to "1.0.7"
Documentation for added functions is not yet complete.
Also includes following changes:
- Fix for rocketcgi library to accept POST data content-types, which contain additional charset information.
- Support arrays passed as params to encode.url (only for keys ending with "[]")
- Version information changed to "1.0.7"
Documentation for added functions is not yet complete.
| author | jbe/bsw | 
|---|---|
| date | Fri Feb 12 18:40:22 2010 +0100 (2010-02-12) | 
| parents | |
| children | 89030e955845 | 
| 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/bsw@11 | 26 if (typeof(value) == "string") { | 
| jbe/bsw@11 | 27 if (result != "") result += "&"; | 
| jbe/bsw@11 | 28 result += encodeURIComponent(key) + "=" + encodeURIComponent(value); | 
| jbe/bsw@11 | 29 } else if (typeof(value) == "object") { | 
| jbe/bsw@11 | 30 var i; | 
| jbe/bsw@11 | 31 for (i=0; i<value.length; i++) { | 
| jbe/bsw@11 | 32 if (result != "") result += "&"; | 
| jbe/bsw@11 | 33 result += encodeURIComponent(key) + "=" + encodeURIComponent(value[i]); | 
| jbe/bsw@11 | 34 } | 
| 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 } |