
    var xmlhttp;

    function newxmlhttpobj()
    {
        try {
            xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
        } catch (e) {
            try {
                xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
            } catch (e) {
                xmlhttp = false;
            }
        }
        if (!xmlhttp && typeof XMLHttpRequest != 'undefined') {
            try {
                xmlhttp = new XMLHttpRequest();
            } catch (e) {
                xmlhttp = false;
            }
        }
        if (!xmlhttp && window.createRequest) {
            try {
                xmlhttp = window.createRequest();
            } catch (e) {
                xmlhttp = false;
            }
        }
        return xmlhttp;
    }

    var receivingElementId = '';

    function retrieve_data (url, receiver)
    {
        newxmlhttpobj();
        if (!xmlhttp) return false;
        receivingElementId = receiver;
        xmlhttp.onreadystatechange = retrieve_data_callback;
        try {
            // only do this if translator_maxlc is defined
            url = url + (/\?/.exec (url) ? '&' : '?') + 'maxlc=' + translator_maxlc;
        } catch (e) {
        }
        xmlhttp.open ("GET", url, true);
        try {
            xmlhttp.send (null);
        } catch (e) {
            return false;
        }
        return true;
    }

    function retrieve_data_callback()
    {
        if ((xmlhttp.readyState == 4) && receivingElementId)
            setElementContents (receivingElementId, (xmlhttp.status == 200) ? xmlhttp.responseText : [ '<b>Error retrieving information from the server: ' + xmlhttp.status + '</b>', [ ] ]);
    }

    function make_hidden (p, name)
    {
        if (document.getElementById ('translator_' + name))
            return;

        var e = document.createElement ('INPUT');
        e.type = 'hidden';
        e.name = name;
        e.id = 'translator_' + name;
        e.value = '';
        p.appendChild (e);
    }

    function setElementContents (elemid, contents)
    {
        var c;
        try {
            c = eval ('(' + contents + ')');
        } catch (e) {
            c = [ contents, '', '' ];
        }
        var o = document.getElementById (elemid);
        if (o) o.innerHTML = c[0];
        var p = document.getElementById ('translatorsubmitforminside');
        if (p && c[1]) {
            for (var i = 0; i < c[1].length; i++) {
                make_hidden (p, 'trans_' + c[1][i]);
                make_hidden (p, 'do_' + c[1][i]);
                make_hidden (p, 'att_' + c[1][i]);
            }
        }
        try {
            if (c[2]) {
                for (var j in c[2]) {
                    for (var k in c[2][j]) {
                        if (translator_lcmap[j])
                            translator_lcmap[j].push (c[2][j][k]);
                        else
                            translator_lcmap[j] = [c[2][j][k]];
                        if (translator_maxlc < c[2][j][k])
                            translator_maxlc = c[2][j][k];
                    }
                }
            }
        } catch (e) {
        }
    }

    // ### PROTECTING PAGES FROM CLOSING WHEN CONTAINING UNSAVED DATA
    // (doesn't work in Opera unfortunately)

    function protect_unload(obj)
    {
        window.onbeforeunload = unload_warning;
    }

    function unprotect_unload(obj)
    {
        window.onbeforeunload = null;
    }

    function unload_warning(evt)
    {
        var message = "You have unsaved text in a textbox on this page.";
        if (typeof evt == 'undefined') {
            evt = window.event;
        }
        if (evt) {
            evt.returnValue = message;
        }
        return message;
    }


