/*
 * The Bespoke Ajax Handler
 * by mark@thebespokepixel.com
 * Version 1.0 (October 2007)
 */
AJAX_DEBUG_MODE = false;
if(AJAX_DEBUG_MODE && !utilitiesLoaded) alert("Please include utilities.js");

if(typeof theBespoke == "undefined") var theBespoke = new Object();

/*
 * Ajax Connection Manager
 */
theBespoke.AjaxConnector = function() {
	this.ajaxTracker = new Array();
}

theBespoke.AjaxConnector.prototype = {
	startRequest: function(url, requestObject) {
		if(this.ajaxTracker[url]) {
			if (this.ajaxTracker[url].requestHandler.readyState < 4) {
				this.ajaxTracker[url].requestHandler.abort();
			}
		}
		this.ajaxTracker[url] = requestObject;
		return this.ajaxTracker[url];
	},
	completeRequest: function(url) {
		if(this.ajaxTracker[url]) {
			var ajaxObject = this.ajaxTracker[url];
			if (ajaxObject.requestHandler.readyState == 4) {
				if (ajaxObject.requestHandler.status == 200) {
					if(AJAX_DEBUG_MODE) alert(ajaxObject.requestHandler.responseText);
					ajaxObject.onComplete(ajaxObject.requestHandler.responseText);
				} else {
					if(AJAX_DEBUG_MODE) alert('Ajax Loading Error: '+url+"\n\n(HTTP status: "+ajaxObject.requestHandler.status+")");
					ajaxObject.onError(ajaxObject.requestHandler.status);
				}
				delete this.ajaxTracker[url];
			}
		}
	},
	loadToID: function( url, domID, loadingHTML) {
		if(loadingHTML) $(domID).innerHTML = loadingHTML;
		var transaction = this.startRequest(url, new theBespoke.AjaxTransaction(this, "GET", true, url));
		transaction.onComplete=function(response) { $(domID).innerHTML = response; };
		transaction.execute();
	}
};

/*
 * Ajax Transaction
 */
theBespoke.AjaxTransaction = function(objectRef, method, async, url) {
	if (!document.createElement || !document.getElementById) { return; }
	
	this.onComplete = function() { return false; };
	this.onError = function() { return false; };
	
	if (window.XMLHttpRequest) {
		this.requestHandler = new XMLHttpRequest();
	} else if (window.ActiveXObject) {
		try {
			this.requestHandler = new ActiveXObject("Msxml2.XMLHTTP");
		} catch (e) {
			try {
				this.requestHandler = new ActiveXObject("Microsoft.XMLHTTP");
			} catch (e) {}
		}
	}
	
	if(this.requestHandler) {
		this.requestHandler.onreadystatechange = function() { objectRef.completeRequest(url); };
		this.requestHandler.open(method, url, async);
	} else {
		if(AJAX_DEBUG_MODE) alert("No suitable XMLttpRequest object found!");
	}
}

theBespoke.AjaxTransaction.prototype = {
	execute: function(content) {
		if(this.requestHandler) this.requestHandler.send(content);
	}
}
/*
 * Create namespace shortcuts
 */
var AjaxConnector = theBespoke.AjaxConnector;