/**
 * some HTTP/1.1 status codes (RFC 2616)
 */
HTTP_STATUS_OK = 200;
HTTP_STATUS_BAD_REQUEST = 400;
HTTP_STATUS_UNAUTHORIZED = 401;
HTTP_STATUS_FORBIDDEN    = 403;

// Only client errors (4xx)
HTTP_STATUS_CLIENT_ERROR = new Array();
HTTP_STATUS_CLIENT_ERROR.addRange(400, 417);

// Only server errors (5xx)
HTTP_STATUS_SERVER_ERROR = new Array();
HTTP_STATUS_SERVER_ERROR.addRange(500, 505);

// Server & client errors
HTTP_STATUS_COMMON_ERROR = new Array();
HTTP_STATUS_COMMON_ERROR = HTTP_STATUS_CLIENT_ERROR.concat(HTTP_STATUS_SERVER_ERROR);

/**
 * readyState constants
 */
READY_STATE_UNINITIALIZED = 0;
READY_STATE_LOADING       = 1;
READY_STATE_LOADED        = 2;
READY_STATE_INTERACTIVE   = 3;
READY_STATE_COMPLETE      = 4;

ajaxRequest = function (url) {
	
	var self = this;
	this.req = null;
	this.onRequestStarted = emptyFunc;
	this.onRequestFailed  = emptyFunc;
	this.onComplete       = emptyFunc;
	
	this.URL = url;
	this.method = 'GET';
	this.params = null;
	
	if (arguments.length > 1) {
		var requestOptions = arguments[1];
		for (var i in requestOptions) {
			this[i] = requestOptions[i];
		}
	}
	
	if (window.ActiveXObject) {
		this.req = new ActiveXObject("Microsoft.XMLHTTP");
	} else if (window.XMLHttpRequest) {
		this.req = new XMLHttpRequest();
	} else {
		throw "This browser couldn't support AJAX";
	}
	
	var params = null;
	if (this.method == 'GET' && this.params) {
		url += '?' + this.params;
	} else {
		params = this.params;
	}
	
	this.req.onreadystatechange = function () {
		if (self.req.readyState == READY_STATE_COMPLETE) {
			if (self.req.status == HTTP_STATUS_OK) {
				self.onComplete(self.req.responseText);
			} else if (HTTP_STATUS_COMMON_ERROR.own(self.req.status)) {
				self.onRequestFailed(self.req.status);
			}
		} 
	}
	this.req.open(this.method, url, true);
	this.req.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
	if (this.method == 'POST') {
		this.req.setRequestHeader("Content-length", this.params.length);
	}
	this.req.setRequestHeader("Connection", "close");
	this.onRequestStarted();
	this.req.send(params);
	
	this.kill = function () {
		if (this.req && this.req.readyStaty != READY_STATE_UNINITIALIZED) {
			this.req.abort();
			this.req = null;
			return true;
		} else {
			return false;
		}
	}
	
	
}


AJAX = {

	
	/**
	 * static
	 */
	fetchFormFields : function (form_obj) {
		var params = [];
		for (var i = 0; i < form_obj.elements.length; i++) {
			var element = form_obj.elements[i];
			if (!element.name) {
				continue;
			}
			var type = element.type.toLowerCase();
			if ((type == 'radio' || type == 'checkbox') && !element.checked) {
				continue;
			} else {
				params.push(element.name + '=' + element.value);
			}
		}
		alert( params.join('&amp;') );
	}
	
	
};