﻿function AjaxThread() {

    // timeout - максимальный таймаут на запрос, после генериться errorThread(e)
    // asyncstate - признак асинхронной работы
    // applycookies - применение выходных куки запроса браузеру
    this.globals = {
        timeout: 60000,
        isasync: true,
        applycookies: true
    };


    this._F_xmlHttp = null;
    this._F_getParams = [];
    this._F_postParams = [];
    this._F_header = null;
    this._F_url = null;
    this._F_args = null;

    this._F_intervalTimerID = null;
    this._F_timeoutTimerID = null;

    this._F_autoRefill = false;
    this._F_refillCount = 0;

    // Добавление пост параметра, параметр игнорируется в случае, если значение парамерта, либо пустая строка, либо undefined или null
    this.addPostParameter = function(name, value) {
        if ((value == "") || (value == null) || (value == undefined)) { return false; }
        this._F_postParams.push(name + "=" + value);
    }

    this.addPostParameterEx = function(name, value) {
        this._F_postParams.push(name + "=" + value);
    }


    this.returnParameters = function(arrayParams) {
        var resultString = "";
        var tempParameter = null;
        var args_length = arrayParams.length;
        for (var i = 0; i < args_length; i++) {
            tempParameter = arrayParams[i];
            if (tempParameter) {
                if (resultString.length > 0) { resultString += "&"; }
                resultString += tempParameter;
            }
        }
        return resultString;
    }
    // Добавление гет параметра, параметр игнорируется в случае, если значение парамерта, либо пустая строка, либо undefined или null
    this.addGetParameter = function(name, value) {
        if ((value == null) || (value == undefined)) return;
        var strValue = value.toString();
        if (strValue.length > 0) {
            this._F_getParams.push(name + "=" + strValue);
        }
    }

    // Запуск запроса
    //  params - { timeout,url,header,isasync,applycookies,args }
    //  url - запрос-страница
    this.startThread = function(params, args) {
        var G = this.globals;
        this.setAjaxParams(params);
        this._F_args = args;
        this._F_beginThread();
    }

    this._F_beginThread = function() {
        this._F_intervalTimerID = null;
        this._F_timeoutTimerID = null;


        var G = this.globals;
        var getparams = this.returnParameters(this._F_getParams);
        var postparams = this.returnParameters(this._F_postParams);
        var query_url = this._F_url;
        var query_post = postparams;

        if (getparams.length > 0) { query_url += "?" + getparams; }
        if (query_post.length == 0) { query_post = ""; }

        this._F_createXmlObject();
        if ((this._F_xmlHttp == null) || (this._F_xmlHttp == undefined)) {
            this.errorThread("Error creating XMLHTTP object");
        }

        this._F_xmlHttp.open("POST", query_url, G.isasync);
        if ((this._F_header) && (this._F_header.length > 0)) {
            this._F_xmlHttp.setRequestHeader("Content-Type", this._F_header);
        }
        if (this.globals.isasync == true) {
            this._F_startCompleteTimer(this, this._F_args);
        }
        var clength = 0;
        if (query_post) { clength = query_post.length; }
        this._F_xmlHttp.setRequestHeader('Content-length', clength);
        this._F_xmlHttp.send(query_post);
    }

    this.endThread = function(text, xml, args) { }
    this._F_receivedResponseUser = function(userinfo) { }


    this.callbackEndThread = function(text, xml, args) {
        var now = new Date();
        now.setTime(now.getTime() + 20 * 60 * 1000);
        var retVal = this.endThread(text, xml, args);
        if (retVal == false) {
            if (this._F_refillCount >= 5) {
                return;
            }
            this._F_beginThread();
            this._F_refillCount++;
        }
    }


    this._F_startCompleteTimer = function(ajax_loader, args) {
        var timerFunction = function() {
            if (ajax_loader._F_xmlHttp.readyState == 4) {
                clearInterval(ajax_loader._F_intervalTimerID);
                clearTimeout(ajax_loader._F_timeoutTimerID);
                ajax_loader.callbackEndThread(ajax_loader._F_xmlHttp.responseText, ajax_loader._F_xmlHttp.responseXML, args);
            }
        }
        var timeoutFunction = function() {
            clearInterval(ajax_loader._F_intervalTimerID);
            clearTimeout(ajax_loader._F_timeoutTimerID);
            if (ajax_loader._F_xmlHttp.readyState == 4) {
                ajax_loader.callbackEndThread(ajax_loader._F_xmlHttp.responseText, ajax_loader._F_xmlHttp.responseXML, args);
            } else {
                if (ajax_loader.errorThread) {
                    ajax_loader.errorThread("Don't received data.Timeout experid");
                }
            }
        }
        this._F_intervalTimerID = setInterval(timerFunction, 50);
        this._F_timeoutTimerID = setTimeout(timeoutFunction, this.globals.timeout);
    }



    // Ошибка исполнения запроса
    this.errorThread = function(msg) { }


    //Применение параметров запроса
    this.setAjaxParams = function(params) {
        var G = this.globals;
        G.timeout = params.timeout ? params.timeout : G.timeout;
        G.isasync = params.isasync ? params.isasync : G.isasync;
        G.applycookies = params.applycookies ? params.applycookies : G.applycookies;
        this._F_url = params.url;
        this._F_header = params.header ? params.header : this._F_header;
    }

    // Принцип работы Sync,Async, по умолчанию синхронный
    this.setAsyncState = function(state) {
        this.globals.isasync = state;
    }
    // Применение куки запроса браузеру
    this.setApplyQueryCookies = function(apply) {
        this.globals.applycookies = apply;
    }
    this.setRequestHeader = function(header) {
        this._F_header = header;
    }

    this._F_createXmlObject = function() {
        var httpRequestObj = new (window.XMLHttpRequest || ActiveXObject)("Msxml2.XMLHTTP");
        this._F_xmlHttp = httpRequestObj;
    }

}

