/// <reference path="ITransport.ts" />
/// <reference path="../Request.ts" />
/// <reference path="../Response.ts" />
var econda;
(function (econda) {
    var ajax;
    (function (ajax) {
        var transport;
        (function (transport) {
            var Response = econda.ajax.Response;
            /**
             * Implements get transport for requests
             * @class econda.ajax.transport.Get
             */
            var Get = (function () {
                function Get() {
                    /**
                     * @property {Boolean} _initialized
                     * @private
                     */
                    this._initialized = false;
                    this._allHeaders = {};
                }
                /**
                 * @method setRequest
                 * Set request object
                 */
                Get.prototype.setRequest = function (request) {
                    this._request = request;
                };
                /**
                 * @method getRequest
                 * Get request object
                 */
                Get.prototype.getRequest = function () {
                    return this._request;
                };
                /**
                 * True if request can be send
                 * @returns {Boolean}
                 */
                Get.prototype.isSupportedRequest = function () {
                    return true;
                };
                Get.prototype.hasHeaders = function () {
                    if (Object.keys) {
                        return (Object.keys(this._allHeaders).length > 0);
                    }
                    else {
                        var keys = [], k;
                        for (k in this._allHeaders) {
                            if (Object.prototype.hasOwnProperty.call(this._allHeaders, k)) {
                                keys.push(k);
                            }
                        }
                        return keys.length > 0;
                    }
                };
                /**
                 * Send request
                 */
                Get.prototype.init = function () {
                    var cmp = this;
                    this._xhr = this.createXmlHttpRequestInstance();
                    this._xhr.onreadystatechange = function () {
                        cmp.onReadyStateChange.apply(cmp, arguments);
                    };
                    this._xhr.open("GET", this.getRequestUriWithParams(), true);
                    this.appendHeaders();
                    this._initialized = true;
                };
                /**
                 * Add headers from request and writer to XMLHttpRequest object.
                 * @private
                 */
                Get.prototype.appendHeaders = function () {
                    var headers = {
                        "Content-Type": "text/plain"
                    };
                    if (this._request.isXDomainRequest() == false) {
                        // only for local requests, it would cause x-domain requests to be "not so simple requests"
                        // and so this would cause a prefly options request
                        headers["X-Requested-With"] = "XMLHttpRequest";
                    }
                    // add headers from request object
                    var headersFromRequest = this._request.getHeaders();
                    if (headersFromRequest) {
                        for (var name in headersFromRequest) {
                            headers[name] = headersFromRequest[name];
                        }
                    }
                    this._allHeaders = headers;
                    // append to xhr object (not possible on XDomainRequest objects, <= IE10)
                    if (typeof this._xhr.setRequestHeader != 'undefined') {
                        for (var name in headers) {
                            this._xhr.setRequestHeader(name, headers[name]);
                        }
                    }
                    return this;
                };
                /**
                 * Send request
                 * @param {econda.ajax.Request} request
                 */
                Get.prototype.send = function (request) {
                    var cmp = this;
                    if (typeof request != 'undefined') {
                        this.setRequest(request);
                    }
                    if (!this._initialized) {
                        this.init();
                    }
                    setTimeout(function () {
                        cmp._xhr.send();
                    }, 20);
                };
                /**
                 * Create and return instance of XmlHttpRequest object for all browsers.
                 * @private
                 * @returns {XMLHttpRequest}
                 */
                Get.prototype.createXmlHttpRequestInstance = function () {
                    var xhr = null;
                    if (typeof XMLHttpRequest != 'undefined') {
                        xhr = new XMLHttpRequest();
                    }
                    else {
                        xhr = new ActiveXObject('Microsoft.XMLHTTP');
                    }
                    return xhr;
                };
                /**
                 * Get uri from request object with parameters appended
                 * @param {String} url
                 * @param {Object} params
                 * @returns {String} request uri incl. parameters
                 * @private
                 */
                Get.prototype.getRequestUriWithParams = function () {
                    var uri = this._request.getUri();
                    var params = this._request.getParams();
                    return uri.clone().appendParams(params).toString();
                };
                /**
                 * Callback for xhr onreadystatechange. Must inform the request when it's done.
                 * @private
                 */
                Get.prototype.onReadyStateChange = function () {
                    var xhr = this._xhr; // XmlHttpRequest
                    var request = this._request; // econda.ajax.IRequest
                    if (xhr.readyState == 4) {
                        var result = new Response();
                        result.responseText = xhr.responseText;
                        result.status = xhr.status;
                        result.isError = (xhr.status != 200);
                        request.handleResponse(result);
                    }
                };
                return Get;
            }());
            transport.Get = Get; // end of class
        })(transport = ajax.transport || (ajax.transport = {}));
    })(ajax = econda.ajax || (econda.ajax = {}));
})(econda || (econda = {})); // end of module