Aleksander Machniak
2015-09-10 e85bbc9e9c577efd4437a032463d4fd79da932b5
program/js/common.js
@@ -654,12 +654,89 @@
  });
};
// function to parse query string into an object
rcube_parse_query = function(query)
{
  if (!query)
    return {};
// This code was written by Tyler Akins and has been placed in the
// public domain.  It would be nice if you left this header intact.
  var params = {}, e, k, v,
    re = /([^&=]+)=?([^&]*)/g,
    decodeRE = /\+/g, // Regex for replacing addition symbol with a space
    decode = function (str) { return decodeURIComponent(str.replace(decodeRE, ' ')); };
  query = query.replace(/\?/, '');
  while (e = re.exec(query)) {
    k = decode(e[1]);
    v = decode(e[2]);
    if (k.substring(k.length - 2) === '[]') {
      k = k.substring(0, k.length - 2);
      (params[k] || (params[k] = [])).push(v);
    }
    else
      params[k] = v;
  }
  return params;
};
// Base64 code from Tyler Akins -- http://rumkin.com
var Base64 = (function () {
  var keyStr = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
  // private method for UTF-8 encoding
  var utf8_encode = function(string) {
    string = string.replace(/\r\n/g, "\n");
    var utftext = '';
    for (var n = 0; n < string.length; n++) {
      var c = string.charCodeAt(n);
      if (c < 128) {
        utftext += String.fromCharCode(c);
      }
      else if(c > 127 && c < 2048) {
        utftext += String.fromCharCode((c >> 6) | 192);
        utftext += String.fromCharCode((c & 63) | 128);
      }
      else {
        utftext += String.fromCharCode((c >> 12) | 224);
        utftext += String.fromCharCode(((c >> 6) & 63) | 128);
        utftext += String.fromCharCode((c & 63) | 128);
      }
    }
    return utftext;
  };
  // private method for UTF-8 decoding
  var utf8_decode = function (utftext) {
    var i = 0, string = '', c = c2 = c3 = 0;
    while (i < utftext.length) {
      c = utftext.charCodeAt(i);
      if (c < 128) {
        string += String.fromCharCode(c);
        i++;
      }
      else if (c > 191 && c < 224) {
        c2 = utftext.charCodeAt(i + 1);
        string += String.fromCharCode(((c & 31) << 6) | (c2 & 63));
        i += 2;
      }
      else {
        c2 = utftext.charCodeAt(i + 1);
        c3 = utftext.charCodeAt(i + 2);
        string += String.fromCharCode(((c & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63));
        i += 3;
      }
    }
    return string;
  };
  var obj = {
    /**
@@ -667,12 +744,19 @@
     * @param {String} input The string to encode in base64.
     */
    encode: function (input) {
      if (typeof(window.btoa) === 'function')
        return btoa(input);
      if (typeof(window.btoa) === 'function') {
        // it may fail on unicode characters, the fallback can handle them
        try {
          return btoa(input);
        }
        catch (e) {};
      }
      input = utf8_encode(input);
      var chr1, chr2, chr3, enc1, enc2, enc3, enc4, i = 0, output = '', len = input.length;
      do {
      while (i < len) {
        chr1 = input.charCodeAt(i++);
        chr2 = input.charCodeAt(i++);
        chr3 = input.charCodeAt(i++);
@@ -690,7 +774,7 @@
        output = output
          + keyStr.charAt(enc1) + keyStr.charAt(enc2)
          + keyStr.charAt(enc3) + keyStr.charAt(enc4);
      } while (i < len);
      }
      return output;
    },
@@ -700,8 +784,13 @@
     * @param {String} input The string to decode.
     */
    decode: function (input) {
      if (typeof(window.atob) === 'function')
         return atob(input);
      if (typeof(window.atob) === 'function') {
        // it may fail on unicode characters, the fallback can handle them
        try {
          return utf8_decode(atob(input));
        }
        catch (e) {};
      }
      var chr1, chr2, chr3, enc1, enc2, enc3, enc4, len, i = 0, output = '';
@@ -709,7 +798,7 @@
      input = input.replace(/[^A-Za-z0-9\+\/\=]/g, "");
      len = input.length;
      do {
      while (i < len) {
        enc1 = keyStr.indexOf(input.charAt(i++));
        enc2 = keyStr.indexOf(input.charAt(i++));
        enc3 = keyStr.indexOf(input.charAt(i++));
@@ -725,9 +814,9 @@
          output = output + String.fromCharCode(chr2);
        if (enc4 != 64)
          output = output + String.fromCharCode(chr3);
      } while (i < len);
      }
      return output;
      return utf8_decode(output);
    }
  };