From 0344b168276f80189e2254c75a762aff5b517b6b Mon Sep 17 00:00:00 2001
From: Aleksander Machniak <alec@alec.pl>
Date: Sun, 22 May 2016 06:32:57 -0400
Subject: [PATCH] Fix priority icon(s) position

---
 program/js/common.js |   82 +++++++++++++++++++++++++++++++++++-----
 1 files changed, 71 insertions(+), 11 deletions(-)

diff --git a/program/js/common.js b/program/js/common.js
index fa0f446..158f8cc 100644
--- a/program/js/common.js
+++ b/program/js/common.js
@@ -683,11 +683,60 @@
 };
 
 
-// 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.
 // 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 = {
     /**
@@ -695,12 +744,19 @@
      * @param {String} input The string to encode in base64.
      */
     encode: function (input) {
-      if (typeof(window.btoa) === 'function')
-        return btoa(input);
+      // encode UTF8 as btoa() may fail on some characters
+      input = utf8_encode(input);
+
+      if (typeof(window.btoa) === 'function') {
+        try {
+          return btoa(input);
+        }
+        catch (e) {};
+      }
 
       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++);
@@ -718,7 +774,7 @@
         output = output
           + keyStr.charAt(enc1) + keyStr.charAt(enc2)
           + keyStr.charAt(enc3) + keyStr.charAt(enc4);
-      } while (i < len);
+      }
 
       return output;
     },
@@ -728,8 +784,12 @@
      * @param {String} input The string to decode.
      */
     decode: function (input) {
-      if (typeof(window.atob) === 'function')
-         return atob(input);
+      if (typeof(window.atob) === 'function') {
+        try {
+          return utf8_decode(atob(input));
+        }
+        catch (e) {};
+      }
 
       var chr1, chr2, chr3, enc1, enc2, enc3, enc4, len, i = 0, output = '';
 
@@ -737,7 +797,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++));
@@ -753,9 +813,9 @@
           output = output + String.fromCharCode(chr2);
         if (enc4 != 64)
           output = output + String.fromCharCode(chr3);
-      } while (i < len);
+      }
 
-      return output;
+      return utf8_decode(output);
     }
   };
 

--
Gitblit v1.9.1