function showElement(id) {
    document.getElementById(id).style.display = 'block';
}

function hideElement(id) {
    document.getElementById(id).style.display = 'none';
}

function setInnerHTML(id, html) {
    document.getElementById(id).innerHTML = html;
}

function addElement(id, element) {
    document.getElementById(id).appendChild(element);
}

function getHTTPObject() {
    if (window.XMLHttpRequest) {
        return new XMLHttpRequest();
    } else if (window.ActiveXObject) {
        try { return new ActiveXObject('Msxml2.XMLHTTP.6.0') } catch(e) {}
        try { return new ActiveXObject('Msxml2.XMLHTTP.3.0') } catch(e) {}
        try { return new ActiveXObject('Msxml2.XMLHTTP') } catch(e) {}
        return new ActiveXObject('Microsoft.XMLHTTP');
    }
}

function json(url, params, func, funcErr) {
    var http = null;
    try {
        http = new getHTTPObject();
    } catch (e) {
        funcErr(-1, 'Error instanting new XmlHttpRequest');
    }
    
    try {
        http.open('POST', url, true);
    } catch (e) {
        funcErr(-1, 'Error opening request');
    }

    for (var i = 0; i < params.length; ++i) {
        var param = params[i];
        for (var j = 0; j < 2; ++j) {
            param[j] = encodeURIComponent(param[j]);
        }
    }
    for (var i = 0; i < params.length; ++i) {
        params[i] = params[i][0] + '=' + params[i][1];
    }
    var paramsStr = '';
    if (params.length > 0) {
        paramsStr = params[0];
        for (var i = 1; i < params.length; ++i) {
            paramsStr += '&' + params[i];
        }
    }
    params = paramsStr;

    http.setRequestHeader('Method', 'POST ' + escape(url) + ' HTTP/1.1');
    http.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');
    http.setRequestHeader('Content-length', params.length);
    // http.setRequestHeader('Connection', 'close');

    http.onreadystatechange = function() {
        if (http.readyState == 4) {
            var status = 0;
            try {
                status = http.status;
            } catch (e) {
                funcErr(-1, 'Error evaluating http status');
            }
            if (status == 200) {
                var response = null;
                try {
                    response = eval('(' + http.responseText + ')');
                } catch (e) {
                    funcErr(-1, 'Error parsing server response');
                }
                func(response);
            } else {
                funcErr(http.status, http.statusText);
            }
        }
    }

    try {
        http.send(params);
    } catch (e) {
        funcErr(-1, 'Error sending request');
    }
}
