
var sai = {
    _turl: "sai",
    _lurl: "sai",
    _gui: "box",
    _sessionid: new Date().getTime() + "" + Math.floor(9000 * Math.random() + 1000),
    _sessionOptions: {},
    _requestTimeout: null,
    _activeRequests: new Array(),
    _onProcessingStart : null,
    _onProcessingFinish : null,
    _onError : function(request) { alert(request.getErrorMessage()); },
    _maxTranslatedWords : null,

    translateText: function(text, languagePair, onComplete) {
        return sai.sendRequest(text, languagePair, "translate", onComplete);
	},
	
	lookup: function(text, languagePair, onComplete, subService) {
        var options = {};
        options["gui"] = sai._gui;
        options["lp"] = languagePair;
        options["format"] = "html";
        return sai.sendGenericRequest(sai._lurl, "lookup" + (subService ? "_" + subService : ""), options, text, onComplete);
	},

    sendRequest: function(text, languagePair, service, onComplete) {
        var options = {};
        options["gui"] = sai._gui;
        options["lp"] = languagePair;
        if(window.richText)
            options["LEMMA_ALTMEANING"] = "1";
        if(sai._maxTranslatedWords)
            options["MAX_TRANSLATED_WORDS"] = sai._maxTranslatedWords;
        return sai.sendGenericRequest((service == "lookup" ? sai._lurl : sai._turl), service, options, text, onComplete);
    },

    sendGenericRequest: function(url, service, options, data, onComplete) {
        var xmlReq;
        if(window.XMLHttpRequest) {
            xmlReq = new XMLHttpRequest();
        }
        else if(window.ActiveXObject) {
            xmlReq = new ActiveXObject("Microsoft.XMLHTTP");
        }
        options["sessionid"] = sai._sessionid;
        var query = "?";
        if(sai._sessionOptions) {
            for(var name in sai._sessionOptions) {
                if(sai._sessionOptions.hasOwnProperty(name)) {
                    query += name + "=" + sai._sessionOptions[name] + "&";
                }
            }
        }
        for(var name in options) {
            if(options.hasOwnProperty(name)) {
                query += name + "=" + options[name] + "&";
            }
        }
        query += "service=" + service;
        xmlReq.open("POST", url + query, true);
        xmlReq.setRequestHeader("Content-type", "application/x-www-form-urlencoded; charset=UTF-8");
        xmlReq.send(data);
        var request = new WebServiceRequest(xmlReq, service, onComplete);
        sai._activeRequests.push(request);
        if(sai._requestTimeout == null) {
            if(sai._onProcessingStart) {
                sai._onProcessingStart(request);
            }
            sai._requestTimeout = setTimeout(sai.checkRequests, 200);
        }
        return request;
    },

    checkRequests: function() {
        var request = sai._activeRequests[0];
        if(request.isComplete()) {
            sai._activeRequests.shift();
            try {
                if(!request.isSuccess() && sai._onError) {
                    sai._onError(request);
                }
                request.onComplete();
            }
            catch(ex) {}
        }
        if(sai._activeRequests.length > 0) {
            sai._requestTimeout = setTimeout(sai.checkRequests, 200);
        }
        else {
            sai._requestTimeout = null;
            if(sai._onProcessingFinish) {
                sai._onProcessingFinish(request);
            }
        }
    }
};

function WebServiceRequest(xmlReq, resultType, onComplete) {
	this._xmlReq = xmlReq;
    this._parsedResponse = null;
    this._resultType = resultType;
    this._onComplete = onComplete;

    this.isComplete = function() {
        return this._xmlReq.readyState == 4;
	};
	
	this.isSuccess = function() {
        if(this.isComplete()) {
            if(this._xmlReq.status == 200) {
                return this.getParsedResponse().error == "";
            }
            else {
                return false;
            }
        }
        else {
            return false;
        }
	};

    this.getResultType = function() {
        return this._resultType;
    };

    this.getOutput = function () {
        return this.getParsedResponse().body;
	};
	
	this.getErrorMessage = function() {
        if(this._xmlReq.status == 200) {
            return this.getParsedResponse().error;
        }
        else {
            return "HTTP Error " + this._xmlReq.status + ": " + this._xmlReq.statusText;
        }
	};
	
	this.cancel = function() {
        if(!this.isComplete()) {
            this._xmlReq.abort();
        }
    };

    this.getParsedResponse = function() {
        if(this._parsedResponse == null) {
            this._parsedResponse = new SAIResponse(this._xmlReq.responseText);
        }
        return this._parsedResponse;
    };

    this.onComplete = function() {
        if(this._onComplete) {
            this._onComplete(this);
        }
    };
}

function SAIResponse(txtResponse) {
    this.body = "";
    this.error = "";
    this.options = {};

    this._init = function(txtResponse) {
        var stIndex = 0;
        var eqIndex = 0;
        var nlIndex;

        while(stIndex < txtResponse.length && eqIndex != -1) {
            eqIndex = txtResponse.indexOf("=", stIndex);
            if (eqIndex != -1) {
                var optionName = txtResponse.substring(stIndex, eqIndex);
                if(optionName == "body") {
                    nlIndex = txtResponse.indexOf("\n", eqIndex);
                    this.body = txtResponse.substring(nlIndex + 1);
                    stIndex = txtResponse.length;
                }
                else {
                    nlIndex = txtResponse.indexOf("\n", eqIndex);
                    var optionValue = txtResponse.substring(eqIndex + 1, nlIndex);
                    this.options[optionName] = optionValue;
                    if(optionName == "error") {
                        this.error = optionValue;
                    }
                    stIndex = nlIndex + 1;
                }
            }
        }
    };

    this._init(txtResponse);
}

