// Provides base functions for using AJAX
// ajax folder
var ajaxRelativePrefix = '/ajax/';

// Cross browser compatible creation of XmlHttpRequest object
function createRequest() {
	var request;

	// IE
	try {
		request = new ActiveXObject("Msxml2.XMLHTTP");
	}
	catch(e) {
		try {
			request = new ActiveXObject("Microsoft.XMLHTTP");
		} 
		catch(oc) {
			request = null;
		}
	}
	
	// Mozilla
	if(!request && typeof XMLHttpRequest != "undefined") {
		request = new XMLHttpRequest();
	}
	
	return request;
}

// Fires a callback, sending data to page, with the response handled by handler
function submitCallback(data, page, handler) {
	var request = createRequest();
	if(request) {
		if(typeof ajaxRelativePrefix != 'undefined') {
			// prefix page with relative path prefix var that was inserted by MatrixPage
			page = ajaxRelativePrefix + page;

			// prepare request
			request.open('POST', page, true);
			request.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");

			// when the request is answered, relayResponse() will be called
			request.onreadystatechange = function(){ relayResponse(request, handler); }

			// fire off the request
			request.send(data);
		}
		else
		{
			// relative path var not found, cannot correctly set path to AJAX page
			handler(false, 'Relative prefix not found (be sure to use Page.HasAjax).');
		}	
	}
	else
	{
		// request object wasn't instantiated
		handler(false, 'Unable to create request object.');
	}
}

// Passes response data from a callback to the handler function
function relayResponse(request, handler) {
	if(request.readyState == 4)
	{
		if(request.status == 200){
			var responseText = request.responseText;
			
			// ugly hack for international pages adding extra HTML
			var index = responseText.indexOf("<!DOCTYPE");
			if(index != -1)
			{
				responseText = responseText.substring(0, index);
			}
			
			// success, give response text to handler function
			handler(true, responseText);
		}
		else
		{
			// page returned error code (such as 404)
			handler(false, 'Ajax page returned error code ' + request.status + '.');
		}
	}
}

// helper functions used by Ajax scripts
// not directly AJAX functions

// find X coordinate of an element
function findX(element){
	var curleft = 0;
	if(element.offsetParent){
		while(element.offsetParent){
			curleft += element.offsetLeft
			element = element.offsetParent;
		}
	}
	else if(element.x){
		curleft += element.x;
	}
	return curleft;
}

// find Y coordinate of an element
function findY(element){
	var curtop = 0;
	if(element.offsetParent){
		while(element.offsetParent){
			curtop += element.offsetTop
			element = element.offsetParent;
		}
	}
	else if(element.y){
		curtop += element.y;
	}
	return curtop;
}
