VaKeR CYBER ARMY
Logo of a company Server : Apache/2.4.41 (Ubuntu)
System : Linux absol.cf 5.4.0-198-generic #218-Ubuntu SMP Fri Sep 27 20:18:53 UTC 2024 x86_64
User : www-data ( 33)
PHP Version : 7.4.33
Disable Function : pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wifcontinued,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_get_handler,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority,pcntl_async_signals,pcntl_unshare,
Directory :  /var/www/html/keeview_app/html/

Upload File :
current_dir [ Writeable ] document_root [ Writeable ]

 

Current File : /var/www/html/keeview_app/html/jsform.js
'use strict'

var FormClass = function () {

    var core = {
        apiqueue: [],
        apiThreadCount: 0
    };
    var retval = {};

    retval.openUrlInNewTab = function (url) {     // must exec in "onclick" event
        window.open(url, "_blank");
    };

    retval.form_post_newtab = function (me) {
        return function (url, params) {
            me.form_post(url, params, "_blank");
        };
    } (retval);

    retval.form_post = function (url, params, target) {
        var form = document.createElement("form");
        if (params === undefined) {
            params = [];
            target = null;
        }
        else if (target === undefined) {
            target = null;
        }
        var hiddenField;
        var i;

        form.setAttribute("method", "post");
        form.setAttribute("action", url);
        if (target != null) form.setAttribute("target", target);

        for (i = 0; i < params.length; i++) {
            hiddenField = document.createElement("input");
            hiddenField.setAttribute("type", "hidden");
            hiddenField.setAttribute("name", params[i][0]);
            hiddenField.setAttribute("value", params[i][1]);
            form.appendChild(hiddenField);
        }
        document.body.appendChild(form);
        form.submit();
    };

    retval.unpackString = function (params) {
        var xlen, hlen, data;
        if (params.offset === undefined) params.offset = 0;
        xlen = parseInt(param.text.substr(params.offset, 1), 16);
        params.offset += 1;
        hlen = parseInt(param.text.substr(params.offset, xlen), 16);
        params.offset += xlen;
        data = param.text.substr(params.offset, hlen);
        params.offset += hlen;
        return data;
    };

    retval.parseArray_o = function (params) {
        var i, len, code, data;
        code = params.text.substr(params.offset, 1);
        params.offset += 1;
        if (code == "v") {
            return EncodingClass.utf8.decode(FormClass.unpackString(params));
        }
        if (code == "a") {
            len = parseInt(FormClass.unpackString(params), 10);
            data = [];
            for (i = 0; i < len; i++) {
                data.push(FormClass.parseArray_o(params));
            }
            return data;
        }
        return null;
    };

    retval.parseArray = function (me) {
        return function (str) {
            return me.parseArray_o({text: str, offset: 0});
        };
    } (retval);

    retval.urlencode = function (str) {

        str = (str + '');

        return encodeURIComponent(str)
        .replace(/!/g, '%21')
        .replace(/'/g, '%27')
        .replace(/\(/g, '%28')
        .replace(/\)/g, '%29')
        .replace(/\*/g, '%2A')
        .replace(/%20/g, '+');
    };

    retval.queue = function (n) {
        var r, i, x = [];
        for (i = 0; i < n; i++) x.push(null);
        r = {
            list: [],
            buffer: x,
        }
        r.call = function (r) {
            return function (tparams) {
                r.list.push(tparams);
            }
        }(r);
        r.release = function (r) {
            return function () {
                r.list = null;
                r.buffer = null;
            };
        }(r);
        r.thread = function(r) {
            return function () {
                var i, j, c, x, t;
                if ((r.buffer != null) && (r.list != null)) {
                    if (r.list.length > 0) {
                        c = 0;
                        for (i = 0; i < r.buffer.length; i++) {
                            if (r.buffer[i] == null) {
                                c = 1;
                                break;
                            }
                        }
                        if (c > 0) {
                            for (i = 0; i < r.buffer.length; i++) {
                                if (r.buffer[i] == null) {
                                    r.buffer[i] = r.list[0].func;
                                    r.list[0].func = function(i) {
                                        return function (success, message) {
                                            var t;
                                            if (r.buffer != null) {
                                                t = r.buffer[i];
                                                r.buffer[i] = null;
                                                if (t != null) t(success, message);
                                            }
                                        }
                                    }(i);
                                    t = r.list.shift();
                                    FormClass.api_call(t);
                                    if (r.list.length == 0) break;
                                }
                            }
                        }
                    }
                    setTimeout(function() {r.thread();}, 10);
                }
            }
        } (r);
        setTimeout(function() {r.thread();}, 10);
        return r;
    };

    retval.hook = function (me) {
        return function (func) {
            var i, n;
            if (me.hookList === undefined) me.hookList = [];
            if (!EncodingClass.type.isFunction(func)) return false;
            n = me.hookList.length;
            for (i = 0; i < n; i++) {
                if (me.hookList[i] === func) return;
            }
            me.hookList.push(func);
        }
    } (retval);

    core.responseFunc = function (func, event) {
        var i, n, p;
        var stacks;
        if (FormClass.hookList === undefined) n = 0;
        try {
            for (i = 0; i < n; i++) {
                p = FormClass.hookList[i](event);
                if (p === true) break;
            }
            if (event.cancel === true) return;
            p = (new Date()).getTime();
            func(event.success, event.message);
            p = (new Date()).getTime() - p;
            if (p > 200) {
                console.log("api_call callbackfunc's time alert (" + p + ")", {func: func});
            }
        }
        catch (e) {
            console.error(e);
        }
    }

    core.exec_apicall = function (calldata) {
        var st;
        var i, k;
        var boundary;
        var index, url, params, fileuploads, func;
        var lp;
        var x = {
            req: null,
            func: calldata.func
        };

        calldata = EncodingClass.string.duplicateObject(calldata);
        params = calldata.params;
        if ((FormClass.prefix === undefined) || (calldata.url.indexOf("://") >= 0) || (calldata.url.substr(0, 1) == "/")) {
            url = calldata.url;
        }
        else if (EncodingClass.type.isString(FormClass.prefix)) {
            if (FormClass.prefix.length > 0) {
                lp = FormClass.prefix.substr(FormClass.prefix.length - 1, 1);
                if (lp == "/") {
                    url = FormClass.prefix + calldata.url;
                }
                else {
                    url = FormClass.prefix + "/" + calldata.url;
                }
            }
            else {
                url = calldata.url;
            }
        }
        else {
            url = calldata.url;
        }
        if (calldata.fileuploads !== undefined) {
            fileuploads = calldata.fileuploads;
        }
        else {
            fileuploads = [];
        }
        try {
            x.req = new XMLHttpRequest();
        } catch (e) {
            try {
                x.req = new ActiveXObject("Msxml2.XMLHTTP");
            } catch (e) {
                try {
                    x.req = new ActiveXObject("Microsoft.XMLHTTP");
                } catch (oc) {
                    alert("No AJAX Support");
                    return;
                }
            }
        }

        if (calldata.retry === undefined) calldata.retry = 3;
        if (!EncodingClass.type.isNumber(calldata.retry)) calldata.retry = 3;
        calldata.responseFunc = function (calldata) {
            return function (success, message) {
                Thread.setTimeout({
                    func: core.responseFunc,
                    args: [calldata.func, {
                        success: success,
                        message: message,
                        cancel: false
                    }]
                });
            }
        } (calldata);

        x.req.onreadystatechange = function (x, calldata) {
            return function () {
                var getraw = false;
                var i, n;
                if (calldata.rawcontent === true) getraw = true;
                if (x.req.readyState == 4) {
                    if (x.req.status == 200) {
                        if (!getraw) {
                            calldata.responseFunc(true, x.req.responseText);
                        }
                        else {
                            calldata.responseFunc(true, new Uint8Array(x.req.response));
                        }
                    }
                    else if ((x.req.status == 0) && (calldata.retry > 0)) {
                        calldata.retry -= 1;
                        console.log("network connection failed, retry (" + calldata.retry + ") in 2 secs");
                        Thread.setTimeout({
                            func: FormClass.api_call,
                            args: [calldata],
                            time: 2000
                        });
                    }
                    else if (x.req.statusText != "") {
                        calldata.responseFunc(false, "Response Code: " + x.req.status + " / " + x.req.statusText);
                    }
                    else {
                        calldata.responseFunc(false, "Response Code: " + x.req.status);
                    }
                }
            }
        } (x, calldata);


        if ((params.length > 0) || (fileuploads.length > 0)) {
            x.req.open("POST", url, true);
            if (calldata.nocache !== undefined) {
                if (calldata.nocache !== false) {
                    x.req.setRequestHeader("Cache-Control", "no-cache, no-store, must-revalidate");
                    x.req.setRequestHeader("Pragma", "no-cache");
                    x.req.setRequestHeader("Expires", "0");
                }
            }
            if (calldata.cors === true) {
                //x.req.setRequestHeader("Access-Control-Allow-Origin", "*");
            }
            if (calldata.withCredentials === true) {
                x.req.withCredentials = true;
            }
            i = ((new Date()).getTime());
            boundary = i + EncodingClass.md5.encode(i);
            x.req.setRequestHeader("Content-type", "multipart/form-data; boundary=" + boundary);
            st = "";
            for (i = 0; i < params.length; i++) {
                st += "--" + boundary + "\r\n";
                st += "Content-Disposition: form-data; ";
                st += "name=\"" + EncodingClass.utf8.encode(params[i].name) + "\"\r\n\r\n";
                st += EncodingClass.utf8.encode(params[i].value) + "\r\n";
            }
            for (i = 0; i < fileuploads.length; i++) {
                st += "--" + boundary + "\r\n";
                st += "Content-Disposition: form-data; ";
                st += "name=\"" + EncodingClass.utf8.encode(fileuploads[i].name) + "\"; filename=\"" + EncodingClass.utf8.encode(fileuploads[i].filename) + "\"\r\n\r\n";
                st += fileuploads[i].content + "\r\n";
            }
            st += "--" + boundary + "--\r\n";
            var nBytes = st.length, ui8Data = new Uint8Array(nBytes);
            for (var nIdx = 0; nIdx < nBytes; nIdx++) {
                ui8Data[nIdx] = st.charCodeAt(nIdx) & 0xff;
            }
            if (calldata.rawcontent === true) x.req.responseType = "arraybuffer";
            x.req.send(ui8Data);
        }
        else {
            x.req.open("GET", url, true);
            if (calldata.nocache !== undefined) {
                if (calldata.nocache !== false) {
                    x.req.setRequestHeader("Cache-Control", "no-cache, no-store, max-age=0");
                    x.req.setRequestHeader("Expires", "Tue, 01 Jan 1980 1:00:00 GMT");
                    x.req.setRequestHeader("Pragma", "no-cache");
                }
            }
            if (calldata.cors === true) {
                //x.req.setRequestHeader("Access-Control-Allow-Origin", "*");
            }
            if (calldata.withCredentials === true) {
                x.req.withCredentials = true;
            }
            if (calldata.rawcontent === true) x.req.responseType = "arraybuffer";
            x.req.send(null);
        }
    };

    retval.api_call = function (calldata) {
        var keys, ndata = {};
        var i;
        keys = Object.keys(calldata);
        for (i = 0; i < keys.length; i++) {
            ndata[keys[i]] = calldata[keys[i]];
        }
        core.apiqueue.push(ndata);
    }

    core.apiThread = function () {
        var instance;
        while ((core.apiqueue.length > 0) && (core.apiThreadCount < 6)) {
            instance = {};
            instance.exec = function (me) {
                return function () {
                    var data = core.apiqueue.shift();
                    data.func = function (me, oldfunc) {
                        return function (success, message) {
                            if (oldfunc !== undefined) {
                                if (EncodingClass.type.isFunction(oldfunc)) {
                                    Thread.setTimeout({
                                        func: oldfunc,
                                        args: [success, message]
                                    });
                                }
                            }
                            if (core.apiqueue.length > 0) {
                                me.exec();
                            }
                            else {
                                core.apiThreadCount--;
                            }
                        }
                    } (instance, data.func);
                    core.exec_apicall(data);
                }
            } (instance);
            instance.exec();
            core.apiThreadCount++;
        }
        Thread.setTimeout({
            func: core.apiThread,
            time: 2
        });
    }

    Thread.setTimeout({func: core.apiThread});

    core.unpackZipResponse = Thread.createWorkerPool({
        extcode: EncodingClass.exportCode(),
        modules: {
            unpackSinglePart: function (message, start) {
                var status, slength, content, chksum, t;
                var i;
                if (message.length - start < 43) return {success: false, message: "invalid response"};
                status = EncodingClass.string.fromUint8Array(message, start, 3);
                switch (status) {
                    case "txt":
                    case "bin":
                        t = EncodingClass.base64.decode(EncodingClass.string.fromUint8Array(message, start + 3, 8));
                        slength = EncodingClass.number.fromString("i32", t);
                        chksum = EncodingClass.string.fromUint8Array(message, start + slength + 11, 32);
                        if (EncodingClass.md5.encode(message, start + 11, slength) != chksum) {
                            return {success: false, message: "invalid checksum", value: EncodingClass.string.fromUint8Array(message, start)};
                        }
                        content = EncodingClass.base64.decodeu8(message, start + 11, slength);
                        transferList.push(content.buffer);
                        return {
                            success: true,
                            type: status,
                            value: content,
                            offset: start + slength + 43
                        };
                    case "err":
                    default:
                        return {success: false, message: "invalid status (" + status + ")", value: EncodingClass.string.fromUint8Array(message, start)};
                }
            },
            unpackMultiplePart: function (message) {
                var offset, t, h, l, i, r = [];
                offset = 3;
                while (offset < message.length) {
                    t = unpackSinglePart(message, offset);
                    if (t.success) {
                        r.push({type: t.type, content: t.value});
                        offset = t.offset;
                    }
                    else {
                        transferList = [];
                        return {
                            success: false,
                            message: t.message,
                            value: EncodingClass.string.fromUint8Array(message, offset)
                        };
                    }
                }
                return {
                    success: true,
                    value: r
                };
            }
        },
        func: function (params) {
            var t;
            transferList = [];
            if (EncodingClass.string.fromUint8Array(params.message, 0, 3) == "mtp") {
                t = unpackMultiplePart(params.message);
                if (t.success) return {
                    type: "multiple",
                    value: t.value
                };
            }
            else {
                t = unpackSinglePart(params.message, 0);
                if (t.success) return {
                    type: "single",
                    type: t.type,
                    value: t.value
                }
            }
            return t;
        }
    });

    core.decodebin = Thread.createWorkerPool({
        extcode: EncodingClass.exportCode(),
        func: function (params) {
            var content;
            if (params.ru8 === true) {
                content = EncodingClass.base64.decodeu8(params.content);
                transferList = [content.buffer];
            }
            else {
                content = EncodingClass.base64.decode(params.content);
            }
            return content;
        }
    });

    core.extractSinglePart = function (ru8, data, callbackfunc) {
        var func;
        if (ru8 === true) {
            func = ZipWorkerClass.extractu8;
        }
        else {
            func = ZipWorkerClass.extract;
        }
        func([{content: data}], function (retval) {
            var fname = Object.keys(retval)[0];
            callbackfunc(retval[fname].content);
        }, [data.buffer]);
    }

    core.extractData = function (func, ru8, data) {
        var thost, i;
        if ((data.type == "bin") || (data.type == "txt") || (data.type == "err")) {
            core.extractSinglePart(ru8, data.value, function (retval) {
                var transferList = [];
                if (data.type == "bin") {
                    if (ru8 === true) transferList = [retval.buffer];
                    core.decodebin.call({
                        params: {
                            ru8: ru8,
                            content: retval
                        },
                        transferList: transferList,
                        callbackfunc: function (retval) {
                            Thread.setTimeout({
                                func: func,
                                args: [true, retval]
                            });
                        }
                    });
                    return;
                }
                Thread.setTimeout({
                    func: func,
                    args: [true, retval]
                });
            });
        }
        else {
            thost = {
                queue: [],
                finished: 0,
                total: data.value.length
            };
            for (i = 0; i < data.value.length; i++) {
                thost.queue.push(null);
                core.extractSinglePart(ru8, data.value[i].content, function (index, type) {
                    return function (retval) {
                        var transferList = [];
                        if (type != "bin") {
                            thost.queue[index] = {success: true, content: retval};
                            thost.finished++;
                            if (thost.finished == thost.total) {
                                Thread.setTimeout({
                                    func: func,
                                    args: [true, thost.queue]
                                });
                            }
                            return;
                        }
                        if (ru8 === true) transferList = [retval.buffer];
                        core.decodebin.call({
                            params: {
                                ru8: ru8,
                                content: retval
                            },
                            transferList: transferList,
                            callbackfunc: function (retval) {
                                thost.queue[index] = {success: true, status: true, content: retval};
                                thost.finished++;
                                if (thost.finished == thost.total) {
                                    Thread.setTimeout({
                                        func: func,
                                        args: [true, thost.queue]
                                    });
                                }
                            }
                        });
                    }
                } (i, data.value[i].type));
            }
        }
    }

    retval.zip_call = function (calldata) {

        var host = {func: calldata.func};

        calldata = EncodingClass.string.duplicateObject(calldata);
        calldata.rawcontent = true;

        host.singleResponse = function (host) {
            return function (success, status, content) {
                host.func(success && status, content);
            }
        } (host);

        /*
        host.singlepart = function (host) {
            return function (message, start, callbackfunc) {
                var status, slength, content, chksum, t;
                var i;
                if (message.length < 43) {
                    Thread.setTimeout({
                        func: callbackfunc,
                        args: [false, false, {
                            type: "run-time",
                            message: "invalid response (" + message + ")"
                        }]
                    });
                    return message.length;
                }
                status = EncodingClass.string.fromUint8Array(message, start, 3);
                switch (status) {
                    case "txt":
                    case "bin":
                    case "err":
                        t = EncodingClass.base64.decode(EncodingClass.string.fromUint8Array(message, start + 3, 8));
                        slength = EncodingClass.number.fromString("i32", t);
                        chksum = EncodingClass.string.fromUint8Array(message, start + slength + 11, 32);
                        if (EncodingClass.md5.encode(message, start + 11, slength) != chksum) {
                            Thread.setTimeout({
                                func: callbackfunc,
                                args: [false, false, {
                                    type: "run-time",
                                    message: "invalid checksum (" + EncodingClass.string.fromUint8Array(message, start) + ")"
                                }]
                            });
                            return message.length;
                        }
                        content = EncodingClass.base64.decodeu8(message, start + 11, slength);
                        host.extract(content, function (status, callbackfunc) {
                            return function (content) {
                                if (status == "bin") {
                                    if (calldata.ru8 === true) {
                                        content = EncodingClass.base64.decodeu8(content);
                                    }
                                    else {
                                        content = EncodingClass.base64.decode(content);
                                    }
                                }
                                Thread.setTimeout({
                                    func: callbackfunc,
                                    args: [true, status != "err", content]
                                });
                            }
                        } (status, callbackfunc));
                        return start + slength + 43;
                    default:
                        Thread.setTimeout({
                            func: callbackfunc,
                            args: [false, false, {
                                type: "run-time",
                                message: "invalid status (" + status + ")"
                            }]
                        });
                        return message.length;
                }
            }
        } (host);
        host.multiplepart = function (host) {
            return function () {
                var offset;
                host.finished = 0;
                host.success = true;
                offset = 3;
                while (offset < host.message.length) {
                    offset = host.singlepart(host.message, offset, function (host, index) {
                        return function (success, status, content) {
                            if (!success) host.success = false;
                            host.contents[index] = {
                                status: status,
                                content: content
                            };
                            host.finished++;
                            if (host.finished == host.contents.length) {
                                delete host.message;
                                Thread.setTimeout({
                                    func: host.func,
                                    args: [host.success, host.contents]
                                });
                            }
                        }
                    } (host, host.contents.length));
                    host.contents.push(null);
                }
            }
        } (host);
        */

        calldata.func = function (host) {
            return function (success, message) {
                if (!success) {
                    host.func(
                        false,
                        {
                            type: "system",
                            message: message
                        }
                    );
                    return;
                }
                if (message.length < 3) {
                    host.func(
                        false,
                        {
                            type: "run-time",
                            message: message
                        }
                    );
                    return;
                }
                core.unpackZipResponse.call({
                    params: {
                        message: message
                    },
                    transferList: [message.buffer],
                    callbackfunc: function (retval) {
                        if (retval.success === false) {
                            Thread.setTimeout({
                                func: host.func,
                                args: [false, retval.message]
                            });
                            return;
                        }
                        core.extractData(host.func, calldata.ru8 === true, retval);
                    }
                });
            }
        } (host);

        FormClass.api_call(calldata);
    };

    retval.convertFileToFunctionString = function () {
        var x = DOMElement.input({
            attrs: {
                type: "file",
                multiple: true
            }
        });
        var convertfunc = function (flist, tf) {
            var i, n;
            if (flist.length == 0) return;
            var f = new FileReader();
            var filehandle = flist.shift();
            f.onload = function (flist, tf, filehandle) {
                return function (e) {
                    var st;
                    var i, k, n;
                    n = e.target.result.length;
                    st = "function () {\r\n";
                    st += "var s = \"\";\r\n";
                    for (i = 0; i < n; i = k) {
                        k = i + 96;
                        if (k > n) k = n;
                        st += "s += \"" + EncodingClass.base64.encode(e.target.result.substr(i, k - i)) + "\";\r\n";
                    }
                    st += "return EncodingClass.base64.decode(s);\r\n";
                    st += "}();";
                    FormClass.saveAsText(filehandle.name + ".txt", st);
                    setTimeout(function (flist, tf) {
                        return function () {
                            tf(flist, tf);
                        }
                    } (flist, tf), 100);
                };
            } (flist, tf, filehandle);
            f.readAsBinaryString(filehandle);
        }
        var submitbutton = DOMElement.input({
            attrs: {
                type: "submit",
                value: "Convert",
                onclick: function (inputElement, func) {
                    return function (event, me) {
                        var i, n = inputElement.files.length;
                        var flist = [];
                        if (n == 0) return;
                        for (i = 0; i < n; i++) {
                            flist.push(inputElement.files[i]);
                        }
                        setTimeout(function (func, flist) {
                            return function () {func(flist, func);}
                        } (func, flist), 100);
                        ModalElement.close();
                    }
                } (x, convertfunc)
            },
        });
        ModalElement.showWindow({
            title: "convert file",
            bodycontent: DOMElement.table({
                data: [[
                    x,
                    {style: {width: "20px", height: "28px"}},
                    submitbutton
                ]]
            })
        });
    };

    retval.raw2blob = function (content, contentType, filename) {
        if (contentType === undefined) contentType = "application/octet-binary";
        if (!EncodingClass.type.isString(contentType)) contentType = "application/octet-binary";
        var blob = new Blob(content, {type: contentType});
        blob.lastModifiedDate = new Date();
        blob.lastModified = blob.lastModifiedDate.getTime();
        if (filename !== undefined) {
            if (EncodingClass.type.isString(filename)) {
                blob.name = filename;
            }
        }
        return blob;
    };

    retval.rawText2blob = function (textcontent, contentType, filename) {
        var nBytes = textcontent.length;
        var x = new ArrayBuffer(nBytes);
        var ui8Data = new Uint8Array(x);
        for (var nIdx = 0; nIdx < nBytes; nIdx++) {
            ui8Data[nIdx] = textcontent.charCodeAt(nIdx) & 0xff;
        }
        return FormClass.raw2blob([new DataView(x)], contentType, filename);
    };

    retval.text2blob = function (textcontent, filename) {
        return FormClass.rawText2blob(EncodingClass.utf8.encode(textcontent), "plain/text", filename);
    };

    retval.saveAsRawText = function (filename, textcontent) {
        var nBytes = textcontent.length;
        var x = new ArrayBuffer(nBytes);
        var ui8Data = new Uint8Array(x);
        for (var nIdx = 0; nIdx < nBytes; nIdx++) {
            ui8Data[nIdx] = textcontent.charCodeAt(nIdx) & 0xff;
        }
        return FormClass.saveAsRaw(filename, [new DataView(x)]);
    };

    retval.saveAsText = function (filename, textcontent) {
        return FormClass.saveAsRawText(filename, EncodingClass.utf8.encode(textcontent));
    };

    retval.saveAs = function (filename, content) {
        var nBytes = content.length;
        var x = new ArrayBuffer(nBytes);
        var ui8Data = new Uint8Array(x);
        for (var nIdx = 0; nIdx < nBytes; nIdx++) {
            ui8Data[nIdx] = content[nIdx] & 0xff;
        }
        return FormClass.saveAsRaw(filename, [new DataView(x)]);
    };

    retval.saveAsRaw = function (filename, content) {
        var xurl = window.URL || window.webkitURL;
        if (xurl == null) return false;
        var blob = FormClass.raw2blob(content, "application/octet-binary", filename);
        var element = document.createElement('a');
        if (element == null) return false;
        element.setAttribute('href', xurl.createObjectURL(blob));
        element.setAttribute('download', filename);
        element.style.display = 'none';
        document.body.appendChild(element);
        element.click();
        document.body.removeChild(element);
        return true;
    };

    retval.readFile = function (filehandle, callbackFunc) {
        var f = new FileReader();
        f.onload = function (callbackFunc, filehandle) {
            return function (e) {
                callbackFunc([{
                    name: filehandle.name,
                    type: filehandle.type,
                    size: filehandle.size,
                    lastModified: new Date(filehandle.lastModified),
                    content: e.target.result
                }]);
            };
        } (callbackFunc, filehandle);
        f.readAsBinaryString(filehandle);
    };

    retval.readFileFromInput = function (inputElement, callbackFunc) {
        var rv, i, f;
        if (inputElement.files.length == 0) {
            callbackFunc([]);
            return;
        }
        if (inputElement.files.length == 1) {
            FormClass.readFile(inputElement.files[0], callbackFunc);
        }
        else {
            rv = [];
            for (i = 0; i < inputElement.files.length; i++) {
                rv.push(undefined);
            }
            for (i = 0; i < inputElement.files.length; i++) {
                FormClass.readFile(inputElement.files[i], function (rv, index, callbackFunc) {
                    return function (retval) {
                        var i;
                        rv[index] = retval[0];
                        for (i = 0; i < rv.length; i++) {
                            if (rv[i] === undefined) return;
                        }
                        callbackFunc(rv);
                    }
                } (rv, i, callbackFunc));
            }
        }
    };

    retval.readSingleFile = function (callbackFunc, accept) {
        if (accept === undefined) accept = null;
        var fi = DOMElement.input({
            attrs: {
                type: "file",
                style: {display: "none"},
                accept: accept
            }
        });
        var x = function (element, callbackFunc) {
            return function (retval) {
                DOMElement.bodyElement.removeChild(element);
                return callbackFunc(retval);
            }
        } (fi, callbackFunc);
        fi.onchange = function (callbackFunc) {
            return function (event) {
                FormClass.readFileFromInput(this, callbackFunc);
            }
        } (x);
        DOMElement.bodyElement.appendChild(fi);
        fi.click();
    };

    retval.readMultipleFiles = function (callbackFunc, accept) {
        if (accept === undefined) accept = null;
        var fi = DOMElement.input({
            attrs: {
                type: "file",
                style: {display: "none"},
                accept: accept,
                multiple: true
            }
        });
        var x = function (element, callbackFunc) {
            return function (retval) {
                DOMElement.bodyElement.removeChild(element);
                return callbackFunc(retval);
            }
        } (fi, callbackFunc);
        fi.onchange = function (callbackFunc) {
            return function (event) {
                FormClass.readFileFromInput(this, callbackFunc);
            }
        } (x);
        DOMElement.bodyElement.appendChild(fi);
        fi.click();
    };

    retval.injectJS = function (iframeElement, content) {
        var iFrameHead = iframeElement.contentWindow.document.getElementsByTagName("head")[0];

        var myscript = iframeElement.contentWindow.document.createElement("script");
        //myscript.type = 'text/javascript';
        //myscript.src = 'myscript.js'; // replace this with your SCRIPT
        myscript.append(content);
        iFrameHead.appendChild(myscript);
    };

    return retval;
} ();

if (window.ModuleManagerClass !== undefined) {
    ModuleManagerClass.register({
        name: "FormClass",
        prerequisites: ["EncodingClass"]
    });
}

VaKeR 2022