/*************************
 * XMLHttpRequest Wrapper
 * Written by sk89q
 *
 * (C) Copyright 2005 sk89q
 *************************
 */

/*@cc_on @*/

function newXMLHttpRequest()
{	    
	/*@if (@_jscript_version >= 5)
		try
		{
			return new ActiveXObject("Msxml2.XMLHTTP")
		}
		catch(e)
		{
			try
			{
				return new ActiveXObject("Microsoft.XMLHTTP")
			}
			catch(E)
			{
			}
		}
	@else
		return false
	@end @*/

	try
	{
		return new XMLHttpRequest();
	}
	catch(e)
	{
		return false;
	}
}

try
{
    if (window.XMLHttpRequest)
    {
        var xmlhttpreqEnabled = true;
    }
    else if (window.ActiveXObject)
    {
        var xmlhttpreqEnabled = true;
    }
    else
    {
        var xmlhttpreqEnabled = false;
    }
}
catch(e)
{
    var xmlhttpreqEnabled = false;
}

function XMLRequest()
{
    this.thread = null;
    this.onSuccessfulData = function(){};
    this.onError = function(message){};
    this.onFail = function(){};
}

XMLRequest.prototype.fixURL = function(url)
{
	var uriSep = url.indexOf('?') > - 1 ? '&' : '?';
	var dateNow = Date();
    
	return url+uriSep+'__='+dateNow.getTime();
}

XMLRequest.onData = function(e)
{
    var thread = XMLRequest.thread;
	try
	{
		if(thread.readyState == 4)
		{
			if(thread.status == 200)
			{
                if(thread.responseXML)
                {
                    if(thread.responseXML.documentElement != null && thread.responseXML.documentElement.nodeName == 'error')
                    {
                    
                        for(var i = 0; i < thread.responseXML.documentElement.childNodes.length; i++)
                        {
                            var node = thread.responseXML.documentElement.childNodes[i];
                            if(node.nodeType != 1)
                                continue;
                                
                            switch(node.nodeName)
                            {
                                case 'message':
                                    var msg = node.childNodes.length > 2 ? node.childNodes[1].nodeValue : node.firstChild.nodeValue
                                    XMLRequest.onError(msg);
                                    break;
                            }
                        }
                    }
                    else
                    {
                        XMLRequest.onSuccessfulData();
                    }
                }
				else
				{
                    XMLRequest.onSuccessfulData();
				}
			}
			else
			{
                XMLRequest.onFail();
			}
		}
	}
	catch(e)
	{
        XMLRequest.onFail();
	}
}

XMLRequest.prototype.loadXML = function(url, method, data)
{
    var postString = '';
    
    for(var key in data)
    {
        try
        {
            var value = encodeURIComponent(data[key]);
        }
        catch(e)
        {
            var value = escape(data[key]);
        }
        postString += key+'='+value+'&';
    }
    
	XMLRequest.thread = newXMLHttpRequest();
    XMLRequest.thread.onreadystatechange = XMLRequest.onData;
	
	var usePOST = true;
    try
    {
        if(window.opera)
            if(!XMLRequest.thread.setRequestHeader)
                var usePOST = false;
    }
    catch(e)
    {
    }
    
    if(method == 'GET') usePost = false;
	
	if(usePOST)
	{
		XMLRequest.thread.open('POST', url, true);
		XMLRequest.thread.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
		XMLRequest.thread.send(postString);
	}
	else
	{
        // Just ugly... ugly!
		XMLRequest.thread.open('GET', XMLRequest.fixURL(url), true);
	}
}