# modules/fileloading.js

    /* global jsPDF */
    /**
     * jsPDF fileloading PlugIn
     * Copyright (c) 2018 Aras Abbasi (aras.abbasi@gmail.com)
     *
     * Licensed under the MIT License.
     * http://opensource.org/licenses/mit-license
     */
    /**
    * @name fileloading
    * @module
    */
    (function (jsPDFAPI) {
        'use strict';

        /**
        * @name loadFile
        * @function
        * @param {string} url
        * @param {boolean} sync
        * @param {function} callback
        * @returns {string|undefined} result
        */
        jsPDFAPI.loadFile = function (url, sync, callback) {
            sync = (sync === false) ? false : true;
            callback = typeof callback === 'function' ? callback : function () { };
            var result = undefined;

            var xhr = function (url, sync, callback) {
                var request = new XMLHttpRequest();
                var i = 0;

                var sanitizeUnicode = function (data) {
                    var dataLength = data.length;
                    var charArray = [];
                    var StringFromCharCode = String.fromCharCode;

                    //Transform Unicode to ASCII
                    for (i = 0; i < dataLength; i += 1) {
                        charArray.push(StringFromCharCode(data.charCodeAt(i) & 0xff))
                    }
                    return charArray.join('');
                }

                request.open('GET', url, !sync)
                // XHR binary charset opt by Marcus Granado 2006 [http://mgran.blogspot.com]
                request.overrideMimeType('text/plain; charset=x-user-defined');

                if (sync === false) {
                    request.onload = function () {
                        if (request.status === 200) {
                            callback(sanitizeUnicode(this.responseText));
                        } else {
                            callback(undefined);
                        }
                    };
                }
                request.send(null);

                if (sync && request.status === 200) {
                    return sanitizeUnicode(request.responseText);
                }
            }
            try {
                result = xhr(url, sync, callback);
            // eslint-disable-next-line no-empty
            } catch (e) {}
            return result;
        };

        /**
        * @name loadImageFile
        * @function
        * @param {string} path
        * @param {boolean} sync
        * @param {function} callback
        */
        jsPDFAPI.loadImageFile = jsPDFAPI.loadFile;
    })(jsPDF.API);