/*
Copyright Drew Broadley 2007
drew@topshelfmedia.co.nz

Example of Javascript:

search = new Object;

search.writeQuery = function(query)
{
	// Prepare AJAX query
        var url = 'search_ajax?query='+query;

	// Execute AJAX query and run "search.writeQueryHtml" on init 
      	ajax.get(url, 'search.writeQueryHtml');
}

search.writeQueryHtml = function(html)
{        	
	// Checking to see if any HTML has been returned
	// via the 'html' var yet

  	if (!html)        				
	{				
		// Display loading HTML                
		document.getElementById('query').innerHTML = "Loading..";
	}
	else
       	{
		// Load in returned HTML
		document.getElementById('query').innerHTML = html;
	}
}

Example of HTML:
<script defer type="text/javascript" src="pngfix.js"></script>
<a href="javascript:search.writeQuery('query')" >Search</a>
*/

ajax = new Object;

ajax.queue = new Array();

ajax.queue_run = function()
{
	
	var item = ajax.queue.shift();
	//alert(item[0]);
	if (item)
	{
		if (item[0] == "GET")
		{
			ajax.get_run(item[1], item[2]);
		}
		else
		{
			ajax.post_run(item[1], item[2], item[3]);
		}
	}
	else
	{
		ajax.queue_interval();
	}	
}

ajax.queue_interval = function()
{
	setTimeout("ajax.queue_run()", 100);
}

ajax.get = function (url, func)
{
	ajax.queue.push(new Array('GET', url, func));
}

ajax.post = function (url, func, post)
{
	ajax.queue.push(new Array('POST', url, func, post));
}

ajax.get_run = function (url, func)
{
	ajax.url = url;
	
	if (!ajax.req)
	{
		ajax.build();
	}
	
	if (!func)
	{
		ajax.func = 'ajax.donothing';
	}
	else
	{
		ajax.func = func;
	}
	
    ajax.req.open("GET", url, true);
	eval("ajax.req.onreadystatechange =  ajax.gethtml");
    ajax.req.send(""); 

}

ajax.donothing = function()
{
	return null;
}

ajax.post_run = function ( url, func, data)
{
	
	var match;
	
	ajax.url = url;
	
	if (!ajax.req)
	{
		ajax.build();
	}
	
	if (!func)
	{
		ajax.func = 'ajax.donothing';
	}
	else
	{
		ajax.func = func;
	}	

	ajax.req.open('POST', url , true);
	eval("ajax.req.onreadystatechange =  ajax.gethtml");
	var post = new Array();
	for (var key in data)
	{
	
		if (!key.match(/^[^0-9]+$/))
		{
			match = data[key].split(/=/);
			//alert(match[0]+' = '+match[1]);			
			post.push(match[0]+'='+ajax.escape(unescape(match[1])));	
		}
		else
		{
			//alert(key+' = '+data[key]);
			post.push(key+'='+ajax.escape(unescape(data[key])));
		}
	}
	var post_data = post.join("&");
	//alert(post_data);
	
	ajax.req.setRequestHeader("Content-Type","application/x-www-form-urlencoded; charset=UTF-8");
	ajax.req.setRequestHeader("Content-length", post_data.length);
    ajax.req.setRequestHeader("Connection", "close");	
	ajax.req.send(post_data);
	
}


ajax.escape = function(html)
{
	
	html = escape(html);
	return html.replace(/\+/g, "%2B");
	// alert(html);
	//return html;
}

//	function - gethtml()
//
//	Return <html>...</html> content

ajax.gethtml = function()
{
	//alert(ajax.req.readyState + " - " + ajax.req.status + " - " + ajax.req.responseXML);
	if (ajax.req.readyState == 4 && ajax.req.status == 200 && ajax.req.responseXML != null)
	{
	
		var html = '';
		for (var i = 0; i <=(ajax.req.responseXML.getElementsByTagName("html")[0].childNodes.length - 1); i++)
		{
			html += ajax.req.responseXML.getElementsByTagName("html")[0].childNodes[i].data;
		}
		//alert(html);
		
		eval(ajax.func+'(html)');

		if (ajax.req.responseXML.getElementsByTagName("javascript")[0])
		{
			var javascript = '';
			for (var i = 0; i <=(ajax.req.responseXML.getElementsByTagName("javascript")[0].childNodes.length - 1); i++)
			{
				javascript += ajax.req.responseXML.getElementsByTagName("javascript")[0].childNodes[i].data;
			}
			
			if (javascript.match(/[a-z0-9]+/))
			{
				//setTimeout(eval(javascript), 250);
				eval(javascript);
			}
		}
		
		ajax.queue_interval();
		
		//ajax.build();
				
	}	
	else
	{

		//if (dock.debug)
		//{
			//dock.debug("S: "+ajax.req.status+" | ST: "+ajax.req.readyState+" | U: "+ajax.url+" | FUNC: "+ajax.func);
		//}
		eval(ajax.func+'(null)');
	}
}

ajax.build = function ()
{
	ajax.req = false;
	
	// Generally Firefox + compatible browsers
	if(window.XMLHttpRequest) 
	{
		try 
		{
		  ajax.req = new XMLHttpRequest();
		}
		catch(e) 
		{
			ajax.req = false;
		}
	}
	// Internet Explorer and other embedded OLE Browsers	
	else if(window.ActiveXObject)
	{
	    try 
		{
			ajax.req = new ActiveXObject("Msxml2.XMLHTTP");
		} 
		catch(e) 
		{
			try 
		    {
				ajax.req = new ActiveXObject("Microsoft.XMLHTTP");
			} 
			catch(e) 
			{
	      		ajax.req = false;
		    }
		}
	}
	  
	if(ajax.req) 
	{
	  	return ajax.req;
	}
	else
	{
		alert('Error, cannot create XMLObject');
	}
}

ajax.querystring = function () 
{
    return window.top.location.search.substring(1);
}

setTimeout("ajax.queue_run()", 100);
