function ajax_basics() {
	var container, url, canvas, data, loading, callback, request, response;

	this.setContainer = function(value) {
  		container = value;
 		};
 	
	this.setUrl = function(value) {
  		url = value;
 		};
 
 	this.setCanvas = function(value) {
  		canvas = value;
	 	};
 
 	this.setLoading = function(value) {
  		loading = value;
 		};
 
 	this.setCallback = function(value) {
  		callback = value;
 		};

/* a function to pass data already capture instead of relying on the captureData function to gather it */
	this.setData = function(data_array) {
		var query = '';
		for(d in data_array) {
			query += d + '=' + escape(data_array[d]) + '&';
			}
		data = query;
		return !start();
		};
	
 	this.captureData = function() {
  		if (container.nodeName.toLowerCase() == "form") {
   			container.onsubmit = function() {
			    var query = "";
    			for (var i=0; i<this.elements.length; i++) {
     				query+= this.elements[i].name;
     				query+= "=";
     				query+= escape(this.elements[i].value);
     				query+= "&";
    				}
    			data = query;
    			return !start();
   				};
  			} 
		else {
			var links = container.getElementsByTagName("a");
			for (var i=0; i<links.length; i++) {
				links[i].onclick = function() {
					var query = this.getAttribute("href").split("?")[1];
					url+= "?"+query;
					return !start();
					};
				}
			links = null;
			}	
	
		};

	this.forwardResponse = function() {
		//response array is two elements, the first tells whether the response is xml = 'xml' or
		//text = 'text', the second is the actual response
		if(request.responseXML) {
			response_array = new Array('xml', request.responseXML);
			}
		else if(request.responseText) {
			response_array = new Array('text', request.responseText);
			}
		else
			return false;
		return response_array;
		}
	
	var start = function() {
	  	request = getHTTPObject();
	  	if (!request || !url) {
	  		return false;
	  		} 
		else {
	   		initiateRequest();
	   		return true;
	  		}
		};
	
	var getHTTPObject = function() {
	 	var xmlhttp = false;
	  	if (window.XMLHttpRequest) {
	   		xmlhttp = new XMLHttpRequest();
	  		} 
		else if(window.ActiveXObject) {
	   		try {
				xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
	   			} 
			catch (e) {
				try {
		 			xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
					} 
				catch (e) {
		 			xmlhttp = false;
					}
	   			}	
	  		}
	  	return xmlhttp;
		};
	
	var initiateRequest = function() {
	  	if (loading) {
	   		loading();
	  		}
	  	request.onreadystatechange = completeRequest;
	  	if (data) {
	   		request.open("POST", url, true);
	   		request.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
	   		request.send(data);
	  		} 
		else {
	   		request.open("GET", url, true);
	   		request.send(null);
	  		}
		};
	
	var completeRequest = function() {
		if (request.readyState == 4) {
	   		if (request.status == 200 || request.status == 304) {
				if (canvas) {
		 			if(request.responseText)	{
						canvas.innerHTML = request.responseText;
						}
					else if(response.responseXML && response.responseXML.getElementsByTagName('error').length > 0 ) {
						errors = request.responseXML.getElementsByTagName('error');
						alert(errors.length + ' errors found');
						}
					}
				if (callback) {
		 			callback();
					}
	   			}
	  		}		
		};
}

// takes a document node and returns the value of that node
function getOneValue(el, tag) {
	var tag_array = el.getElementsByTagName(tag);
	if(tag_array && tag_array.length > 0)
		var tag_value = tag_array[0].lastChild.nodeValue;
	else
		var tag_value = false;
	return tag_value;
	}

function toggleElement(el) {
	if(el.className.indexOf('hidden') != -1)
		hideElement(el);
	else
		showElement(el);
	}

// simple function to hide an element when passed a reference to the element
// separating this out lets you change how you want to hide them without finding each
function hideElement(el) {
	//el.className += ' hidden';
	el.style.display = "none";
	}

function showElement(el) {
	//el.className = el.className.replace('hidden', '');
	el.style.display = "block";
	}