/*
Copyright 2006-2007 Wellspring Technologies, LLC
All Rights Reserved
Unauthorized Use Prohibited
*/
var wsAjax = new Object();

//Generic test to see if the page can support XMLHTTPRequests.
//This is useful because some browsers will do javascript but not XMLHTTPRequests
wsAjax.canRequest = function() {
	return (window.XMLHttpRequest || window.ActiveXObject);
}

/*FORM CONVERSION TOOLS
 * Use these to send POST requests
 */
// Replaces form.submit to check for requests
wsAjax.submitForm = function(node, handler) {
	if(!wsAjax.canRequest()) {
		node.submit();
	} else {
		var fauxEvent = new Object();
		fauxEvent.target = node;
		wsAjax.getLink(fauxEvent, handler);
	}
}

// Converts the contents of a form to a POST data structure
wsAjax.parseForm = function(node) {
	var retVal = '';
	for(var i = 0; i < node.elements.length; i ++) {
		var currNode = node.elements[i];
		switch(currNode.nodeName.toLowerCase()) {
			case 'input':
			case 'textarea':
				//Get textareas and inputs that aren't buttons
				if(currNode.nodeName.toLowerCase() != 'input' || currNode.type.toLowerCase() != 'button') {
					//If it's a radio or checkbox, only pass it through if it's checked off
					if(!currNode.type || (currNode.type != 'radio' && currNode.type != 'checkbox') || currNode.checked) {
						if(currNode.value.replace(/\s*/g, '') != '') retVal += currNode.name.replace(/ /g, '%20') + '=' + currNode.value.replace(/ /g, '%20') + '&';
					}
				}
				break;
			case 'select':
				retVal += currNode.name + '=' + currNode.options[currNode.selectedIndex] + '&';
				break;
		}
	}
	return (retVal == '')?retVal:retVal.substr(0, retVal.length - 1);
}

// Main event handler for A tags and form submits
wsAjax.getLink = function(e, handler) {
	if(wsAjax.canRequest()) {
		var target;
		if(!e) e = window.event;
		else if(e.nodeName) target = e;
		else target = (e.srcElement)?e.srcElement:e.target;
		if(target) {
			while(target && target.nodeName 
				&& target.nodeName.toLowerCase() != 'a' 
				&& target.nodeName.toLowerCase() != 'form' 
				&& target.parentNode) target = target.parentNode;
			if(target.nodeName.toLowerCase() == 'a') {
				runRequest(target.href + '&onlyContent=true', resultHandler);
			} else if(target.nodeName.toLowerCase() == 'form') {
				var finalTargetString = target.action;
				finalTargetString += '&onlyContent=true';
				wsAjax.runRequest(finalTargetString, handler,  wsAjax.parseForm(target));
			}
		}
		return false;
	} else {
		return true;
	}
}

function db(msg) {
	document.getElementById('bottomAds').innerHTML += '<span style="font-size:6px;color:lightblue;">' + msg + '</span>';
}

// Primary request code
wsAjax.request = null;
wsAjax.runRequest = function(sURL, handler, sendAsPost) {
	this.request = null;
	if(!this.request) {
		// branch for native XMLHttpRequest object
		if(window.XMLHttpRequest) {
			try {
				this.request  = new XMLHttpRequest();
			} catch(e) {
				this.request  = null;
			}
		// branch for IE<7/Windows ActiveX version
		} else if(window.ActiveXObject) {
			try {
				this.request  = new ActiveXObject("Msxml2.XMLHTTP");
			} catch(e) {
				try {
					this.request  = new ActiveXObject("Microsoft.XMLHTTP");
				} catch(e) {
					this.request  = null;
				}
			}
		}
	}
	if(this.request) {
		var tsDate,ts;
		tsDate = new Date();
		ts = tsDate.getTime();
		if(!handler) handler = wsAjax.resultHandler;
		this.request.onreadystatechange = handler;
		document.body.style.cursor = 'wait';
		var target = sURL + '&ts=' + ts;
		if(sendAsPost) {
			this.request.open('POST', target, true);
			this.request.setRequestHeader("Content-Type","application/x-www-form-urlencoded; charset=UTF-8");
		} else {
			this.request.open('GET', target, true);
		}
		try {
			this.request.send(sendAsPost);
		} catch(e) {
			this.request.send();
		}
	} 
	return this.request;
}

// Default response handler
wsAjax.resultHandler = function() {
	var retVal = -1;
	if(wsAjax.request.readyState == 4) {
		retVal = wsAjax.request.status;
		var newContent;
		if(wsAjax.request.status == 200) {
			newContent = wsAjax.request.responseText;
			document.body.style.cursor = '';
		} else {
			window.status = 'Request failed on ' + wsAjax.request.status;
			document.body.style.cursor = '';
			newContent = '<div class="error">We couldn\'t find the file you requested (' + wsAjax.request.status + ').  Please try your request again.  If you still can\'t get your file, please contact the administrator.</div>';
			newContent = wsAjax.request.responseText;
		}
		var headers = wsAjax.getResponseHeaders(wsAjax.request);
		if(headers['wsResponseTarget'] && headers['wsResponseTarget'].toString() != '') {
			var target = document.getElementById(headers['wsResponseTarget']);
			if(target) {
				var action = 'replace';
				if(headers['wsResponseAction'].toString() != '') {
					action = headers['wsResponseAction'].toString().toLowerCase();
				}
				switch(action) {
					case 'replace':
						target.innerHTML = newContent;
						break;
					case 'append':
						target.innerHTML += newContent;
						break;
					default:
						window.status = 'I don\'t understand a responseAction "' + action + '"';
						break;
				}
				target.scrollTop = 0;
			} else {
				window.status = 'I couldn\'t find a target area "' + headers['wsResponseTarget'] + '"';
			}
		}
	}
	return retVal
}
wsAjax.getResponseHeaders = function(request) {
	//Pull the header out of the request object and parse it into a javascript object
	var sHeaders = request.getAllResponseHeaders();
	var oHeaders = new Object();
	oHeaders.keys = new Array();
	if(sHeaders != '') {
		var headers = sHeaders.split('\n');
		var headerRegExp = new RegExp('([^\:]*)\:(.*)', 'i');
		var prefix, suffix;
		for(var i in headers) {
			prefix = headers[i].replace(headerRegExp, '$1');         
			suffix = headers[i].replace(headerRegExp, '$2');
			if(prefix != '' && suffix != '') {
				suffix = suffix.replace(/^\s+/, '').replace(/\s+$/, '');
				oHeaders[prefix] = suffix;
				oHeaders.keys.push(prefix);
			}
		}
	}
	return oHeaders;
}

