# modules/fileloading.js

    /**
     * @license
     * jsPDF fileloading PlugIn
     * Copyright (c) 2018 Aras Abbasi (aras.abbasi@gmail.com)
     *
     * Licensed under the MIT License.
     * http://opensource.org/licenses/mit-license
     */

    import { jsPDF } from "../jspdf.js";

    /**
     * @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) {
        // @if MODULE_FORMAT!='cjs'
        return browserRequest(url, sync, callback);
        // @endif

        // @if MODULE_FORMAT='cjs'
        // eslint-disable-next-line no-unreachable
        return nodeReadFile(url, sync, callback);
        // @endif
      };

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

      function browserRequest(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;
      }

      function nodeReadFile(url, sync, callback) {
        sync = sync === false ? false : true;
        var result = undefined;

        var fs = require("fs");
        var path = require("path");

        url = path.resolve(url);
        if (sync) {
          try {
            result = fs.readFileSync(url, { encoding: "latin1" });
          } catch (e) {
            return undefined;
          }
        } else {
          fs.readFile(url, { encoding: "latin1" }, function(err, data) {
            if (!callback) {
              return;
            }
            if (err) {
              callback(undefined);
            }
            callback(data);
          });
        }

        return result;
      }
    })(jsPDF.API);