/* 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);
