function xmlhttp(method, url, content, onsuccess, indicator_id)
{
    var req = null;

    if (window.XMLHttpRequest)
        req = new XMLHttpRequest();
    else if (window.ActiveXObject)
        req = new ActiveXObject("Microsoft.XMLHTTP");
    else
    {
	alert('Sorry, this browser is not supported');
        return false;
    }

    var indicator = indicator_id ? document.getElementById(indicator_id) : false;

    if (indicator)
        indicator.style.visibility = "visible";

    req.open(method, url, true);

    if (method == 'POST')
        req.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');

    req.onreadystatechange = function()
    {
        if (indicator)
            indicator.style.visibility = "hidden";

        if (req.readyState == 4)
        {
            if (req.status == 200)
            {
                //alert('xmlhttp: success: ' + req.responseText);

                if (!onsuccess)
                {
                    var result = decode_as_json(req.responseText);
                    if (result == null)
                        alert(req.responseText);
                    else
                    {
                        if (result.error != undefined)
                            alert(result.error);

                        if (result.page != undefined)
                            window.location.href = result.page;
                        else if (result.reload != undefined)
                            window.location.reload(true);
                    }
                }
                else if (onsuccess instanceof Function)
                {
                    onsuccess(req.responseText);
                }
                else
                {
                    onsuccess.innerHTML = req.responseText;
                }
            }
            else
            {
                //alert('xmlhttp: failed');
            }
        }
    }

    req.send(content ? content : '');

    return false;
}

function xmlhttp_submit_form(form, url, content, onsuccess, indicator_id)
{
    if (!content)
        content = '';

    for (i = 0; i < form.elements.length; i++)
    {
        //alert(form.elements[i].type);
        if (form.elements[i].type == "text" || form.elements[i].type == "password" || form.elements[i].type == "textarea" || form.elements[i].type == "hidden")
            content += "&" + form.elements[i].name + "=" + encodeURIComponent(trim(form.elements[i].value));
        else if (form.elements[i].type == "select-one" || form.elements[i].type == "")  // thanks IE
        {
            idx = form.elements[i].selectedIndex < 0 ? 0 : form.elements[i].selectedIndex;
            value = form.elements[i].options[idx].value || form.elements[i].options[idx].text;
            content += "&" + form.elements[i].name + "=" + encodeURIComponent(value);
        }
	else if (form.elements[i].type == "checkbox")
            content += "&" + form.elements[i].name + "=" + (form.elements[i].checked ? 1 : 0);
	else if (form.elements[i].type == "radio")
        {
            if (form.elements[i].checked)
                content += "&" + form.elements[i].name + "=" + encodeURIComponent(form.elements[i].value);
        }
    }

    xmlhttp('POST', url, content, onsuccess, indicator_id);

    return false;
}

function xmlhttp_sync(method, url, content)
{
    var req = null;

    if (window.XMLHttpRequest)
        req = new XMLHttpRequest();
    else if (window.ActiveXObject)
        req = new ActiveXObject("Microsoft.XMLHTTP");
    else
    {
	alert('Sorry, this browser is not supported');
        return null;
    }

    req.open(method, url, false);

    if (method == 'POST')
        req.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');

    req.send(content);

    return req.status == 200 ? req.responseText : null;
}

function track(pid, kind)
{
    if (typeof(global_listings_directory) == "undefined") global_listings_directory = '';

    errstr = xmlhttp_sync('GET', global_listings_directory + 'track.php?kind=' + kind + '&pid=' + pid, null);
    if (errstr != '')
    {
        alert(errstr);

        if (window.event != undefined)      // IE bug workaround
            window.event.returnValue = false;

        return false;
    }
    else
        return true;
}

function decode_as_json(str)
{
    try
    {
        return eval('(' + str + ')');
    }
    catch (e)
    {
        return null;
    }
}

function trim(stringToTrim)
{
    return stringToTrim.replace(/^\s+|\s+$/g,"");
}

function createCookie(name, value, days)
{
    if (days)
    {
        var date = new Date();
        date.setTime(date.getTime() + (days * 24 * 60 * 60 * 1000));
        var expires = "; expires=" + date.toGMTString();
    }
    else
        var expires = "";

    document.cookie = name + "=" + value + expires + "; path=/";
}

function deleteCookie(name)
{
    document.cookie = name + "=; expires=Fri, 21 Dec 1976 04:31:24 GMT; path=/";
}

function show_help_topic(topic)
{
    w = window.open('help.php?topic=' + topic, "_help_", 'resizable=yes,scrollbars=yes,width=800,height=600,top=50,left=50');

    if (window.event != undefined)      // IE bug workaround
        window.event.returnValue = false;

    return false;
}

function form_is_dirty(form)
{
    for (var i = 0; i < form.elements.length; i++)
    {
        var el = form.elements[i];

        if (typeof form_is_dirty_check_element_name == 'function' && !form_is_dirty_check_element_name(el.name))
            continue;

        var type = el.type;

        if (type == "checkbox" || type == "radio")
        {
            if (el.checked != el.defaultChecked)
                return true;
        }
        else if (type == "text" || type == "textarea")
        {
            if (el.value != el.defaultValue)
                return true;
        }
        else if (type == "select-one" || type == "")
        {
            for (var n = 0; n < el.options.length; n++)
                if (el.options[n].selected != el.options[n].defaultSelected)
                    return true;
        }
    }

    return false;
}
