liquid_feedback_frontend
view static/js/partialload.js @ 741:6e4392a4ed9b
Fixed hidden actions in registration process
| author | bsw | 
|---|---|
| date | Thu Jun 28 22:24:54 2012 +0200 (2012-06-28) | 
| 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 }
