var xmlHttp = null;
var delimItem  = "^^";
var delimItem2 = "~~";
var delimLine  = "@!";

function openUrl(url, querys, callback, returnParsedResults)
{
	if (null == xmlHttp)
		xmlHttp = getXmlHttp();
	
	var random = "&random="+getRandom();
	if (null != querys)
	{
	    if ("?" != querys.charAt(0))
	    	url += "?"+querys;
	    else
	        url += querys;
	}
	
	url += random;
	
	if (null != callback)
	{
		xmlHttp.onreadystatechange = callback;
		xmlHttp.open("GET", url, true);
		sendXml();
	}
	else
	{
		xmlHttp.open("GET", url, false);
		sendXml();
		
		if (true == returnParsedResults)
		    return prepareResults(xmlHttp.responseText);
		
		return xmlHttp.responseText;
	}
}

function getXmlHttp()
{
	var ret = null;
	if (window.XMLHttpRequest)
    {
    	try
    	{
			ret = new XMLHttpRequest();
        }
        catch(e)
        {
          	ret = null;
        }
    }
    else if (window.ActiveXObject)
    {
        try
        {
            ret = new ActiveXObject("Msxml2.XMLHTTP");
      	}
        catch(e)
        {
            try
            {
          		ret = new ActiveXObject("Microsoft.XMLHTTP");
        	}
            catch(e)
            {
          		ret = null;
        	}
		}
    }
    
	return ret;
}

function closeUrl()
{ 
	if (null != xmlHttp)
		xmlHttp = null;
}

function sendXml()
{ 
	if (document.all)
		xmlHttp.send();
	else
		xmlHttp.send(null);
}

function getRandom()
{
	var t = "" + Math.random();
	
	if (t.length > 0)
		return t.substring(2);
	else
		return "0";
}

function validResult(res)
{
	return null != res && res.length > 0;
}

function getResultKeys(res, itemPos)
{
    if (null == itemPos)
        itemPos = 0;
    
    var keys = null;
	for (i=0; i<res.length; ++i)
	{
	    if (itemPos == i)
	    {
	        var len = res[i].length;
	        if (0 == len)
	            return null;

	        keys = new Array(res[i].length);
	        var j=0;
	        for (j=0; j<res[i].length; ++j)
	            keys[j] = res[i][j][0];
	    }
	}
	
	return keys;
}

function getResultItem(res, name, itemPos)
{
    if (null == itemPos)
        itemPos = 0;
        
	for (i=0; i<res.length; ++i)
	{
	    if (itemPos == i)
	    {
	        var j=0;
	        for (j=0; j<res[i].length; ++j)
	        {
	            if (res[i][j][0] == name)
	                return res[i][j][1];
	        }
	    }
	}
	
	return null;
}

function prepareResults(results)
{
    if (null == results)
        return;
        
    //since we are not using XML at the time, remove the <?xml tag at the beginning of the result set
    var xmlTagIndex = results.indexOf("?>");
    if (xmlTagIndex > 0)
        results = results.substring(xmlTagIndex+2);
        
    var ret = new Array();
	var res = results.split(delimLine);
	var i=0;
	for (i=0; i<res.length; ++i)
	{
	    if (null == res[i] || TrimString(res[i]) == '')
	        continue;
	        
	    ret[i] = new Array();
	    var items = res[i].split(delimItem2);
	    
	    var j=0;
	    for (j=0; j<items.length; ++j)
	    {
	        var vals = items[j].split(delimItem);
	        vals[0] = TrimString(vals[0]);
	        if (vals.length >= 2)
	        {
	            ret[i][j] = new Array(2);
	            ret[i][j][0] = vals[0];
	            ret[i][j][1] = TrimString(vals[1]);
	        }
	    }
	}
	
	return ret;
}