Engine.WebRequest = class
{

    constructor()
    {
        this.data = {};
        this.responseText = "";
        this.callback = null;
        this.xhr = null;

        this.onProgress = null;
    }

    makeRequest(url, callback)
    {
        this.callback = callback;
        this.url = url;
        this.xhr = new XMLHttpRequest();

        // set the request type and url
        this.xhr.open('GET', this.url, true);
        this.xhr.responseType = "text";

        this.xhr.addEventListener('error', (event) => { this.onError(event) }, false);
        this.xhr.addEventListener('abort', (event) => { this.onAbort(event) }, false);
        this.xhr.addEventListener('progress', (event) => { this.onProgressEvent(event) }, false);
        this.xhr.addEventListener('load', (event) => { this.onLoad(event) }, false);

        this.xhr.send();
    }

    makePostRequest(url, params, callback)
    {
        this.callback = callback;

        this.xhr = new XMLHttpRequest();
        this.xhr.open("POST", url, true);

        //Send the proper header information along with the request
        this.xhr.setRequestHeader("Content-type", "application/x-www-form-urlencoded");

        this.xhr.responseType = "text";

        this.xhr.addEventListener('error', (event) => { this.onError(event) }, false);
        this.xhr.addEventListener('abort', (event) => { this.onAbort(event) }, false);
        this.xhr.addEventListener('progress', (event) => { this.onProgressEvent(event) }, false);
        this.xhr.addEventListener('load', (event) => { this.onLoad(event) }, false);

        this.xhr.send(params);
    }

    onError(event)
    {
        Debug.LogError("Error with request");
    }

    onAbort(event)
    {
        Debug.LogError("Request aborted!");
    }

    onProgressEvent(event) 
    {
        if (this.onProgress != null) this.onProgress(this, event.loaded, event.total);
    }

    onLoad(event)
    {
        Debug.Log("Request completed!");

        var status = typeof this.xhr.status === 'undefined' ? 200 : this.xhr.status;

        if (status == 200)
        {
            this.responseText = this.xhr.responseText;
            try {
                this.data = JSON.parse(this.responseText);
            } catch (e) {

            }
        }

        if (this.callback) this.callback();
    }

    abort()
    {
        this.xhr.abort();
    }
}