liquid_feedback_frontend

view static/js/partialload.js @ 118:93f4e465b50d

add initiator support in delegation

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

Impressum / About Us