// window's bota function doesn't properly encode umlauts. Use base64.encode instead
// shamelessly stolen from https://gist.github.com/Nijikokun/5192472
export var utf8 = {
    encode: function (input) {
        if (typeof input !== "string")
            return input;
        else
            input = input.replace(/\r\n/g, "\n");
        var output = "", i = 0, charCode;
        for (i; i < input.length; i++) {
            charCode = input.charCodeAt(i);
            if (charCode < 128)
                output += String.fromCharCode(charCode);
            else if (charCode > 127 && charCode < 2048)
                (output += String.fromCharCode((charCode >> 6) | 192)),
                    (output += String.fromCharCode((charCode & 63) | 128));
            else
                (output += String.fromCharCode((charCode >> 12) | 224)),
                    (output += String.fromCharCode(((charCode >> 6) & 63) | 128)),
                    (output += String.fromCharCode((charCode & 63) | 128));
        }
        return output;
    },
    decode: function (input) {
        if (typeof input !== "string")
            return input;
        var output = "", i = 0, charCode = 0;
        while (i < input.length) {
            charCode = input.charCodeAt(i);
            if (charCode < 128)
                (output += String.fromCharCode(charCode)), i++;
            else if (charCode > 191 && charCode < 224)
                (output += String.fromCharCode(((charCode & 31) << 6) | (input.charCodeAt(i + 1) & 63))),
                    (i += 2);
            else
                (output += String.fromCharCode(((charCode & 15) << 12) |
                    ((input.charCodeAt(i + 1) & 63) << 6) |
                    (input.charCodeAt(i + 2) & 63))),
                    (i += 3);
        }
        return output;
    },
};
var map = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
export var base64 = {
    encode: function (input) {
        if (typeof utf8 === "undefined")
            throw {
                error: "MissingMethod",
                message: "UTF8 Module is missing.",
            };
        if (typeof input !== "string")
            return input;
        else
            input = utf8.encode(input);
        var output = "", a, b, c, d, e, f, g, i = 0;
        while (i < input.length) {
            a = input.charCodeAt(i++);
            b = input.charCodeAt(i++);
            c = input.charCodeAt(i++);
            d = a >> 2;
            e = ((a & 3) << 4) | (b >> 4);
            f = ((b & 15) << 2) | (c >> 6);
            g = c & 63;
            if (isNaN(b))
                f = g = 64;
            else if (isNaN(c))
                g = 64;
            output +=
                map.charAt(d) + map.charAt(e) + map.charAt(f) + map.charAt(g);
        }
        return output;
    },
    decode: function (input) {
        if (typeof utf8 === "undefined")
            throw {
                error: "MissingMethod",
                message: "UTF8 Module is missing.",
            };
        if (typeof input !== "string")
            return input;
        else
            input = input.replace(/[^A-Za-z0-9\+\/\=]/g, "");
        var output = "", a, b, c, d, e, f, g, i = 0;
        while (i < input.length) {
            d = map.indexOf(input.charAt(i++));
            e = map.indexOf(input.charAt(i++));
            f = map.indexOf(input.charAt(i++));
            g = map.indexOf(input.charAt(i++));
            a = (d << 2) | (e >> 4);
            b = ((e & 15) << 4) | (f >> 2);
            c = ((f & 3) << 6) | g;
            output += String.fromCharCode(a);
            if (f !== 64)
                output += String.fromCharCode(b);
            if (g !== 64)
                output += String.fromCharCode(c);
        }
        return utf8.decode(output);
    },
};
