liquid_feedback_frontend
view static/js/partialload.js @ 159:5d797c6706d5
implement quorum display
show the initiative quorum as a small 1px line in bargraph
allow to update your support on the diff page
better linked title in diff page
show absolute quorum numbers in detail pages of issue and initiative
show the initiative quorum as a small 1px line in bargraph
allow to update your support on the diff page
better linked title in diff page
show absolute quorum numbers in detail pages of issue and initiative
| author | Daniel Poelzleithner <poelzi@poelzi.org> | 
|---|---|
| date | Sat Oct 09 03:42:48 2010 +0200 (2010-10-09) | 
| 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 }
