/**
 * @author Cientista
 */

function Ajax() {
	var xmlhttp = getXmlHttpObject();
	var _this = null;
	
	this.message = null;
	this.APRok = false;
	this.isAPR = false;

	this.getPage = function(page) {
		_this = this;
		xmlhttp.open("GET", page);
		xmlhttp.send(null);
		xmlhttp.onreadystatechange = readyStateChanged;
	}
	
	this.postForm = function(form) {
		_this = this;
		post = serializeForm(form);
		xmlhttp.open("POST", form.action, true);
		setPostHeader(xmlhttp, post);
		xmlhttp.send(post);
		xmlhttp.onreadystatechange = readyStateChanged;
	}
	
	this.onFinish = function() {} // Override
	this.onReturn = function(ajaxI) {} // Override
	
	function readyStateChanged() {
		if (xmlhttp.readyState == 4) {
			_this.message = xmlhttp.responseText;
			parseAPR();
			_this.onFinish();
			_this.onReturn(_this);
		}
	}
	
	function parseAPR() {
		_this.APRok = false;
		_this.isAPR = false;
		var msg = _this.message;
		if (msg.length < 5) return;
		var APRheader = msg.substr(0, 5);
		var APRy = (APRheader == "APRy ");
		var APRn = (APRheader == "APRn ");
		if (APRy || APRn) {
			_this.isAPR = true;
			_this.APRok = APRy;
			_this.message = msg.substr(5);
		}
	}
	
	function setPostHeader(xmlhttp, str) {
		xmlhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
		xmlhttp.setRequestHeader("Content-length", str.length);
		xmlhttp.setRequestHeader("Connection", "close");
	}
	
	function getXmlHttpObject() {
		if (window.XMLHttpRequest) return new XMLHttpRequest(); // code for IE7+, Firefox, Chrome, Opera, Safari
		if (window.ActiveXObject) return new ActiveXObject("Microsoft.XMLHTTP"); // code for IE6, IE5
		alert("Your browser does not support AJAX!\nThis page just won't work properly\nPlease check your browser options (or use Mozilla Firefox)");
		return null;
	}
	
	/**
	 * Serialize a form into a format which can be sent as a GET string or a POST 
	 * content.It correctly ignores disabled fields, maintains order of the fields 
	 * as in the elements[] array. The 'file' input type is not supported, as 
	 * its content is not available to javascript. This method is used internally
	 * by the submit class method.
	 * 
	 * from http://www.ajaxtoolbox.com/request/
	 */
	function serializeForm(theform) {
		var els = theform.elements;
		var len = els.length;
		var queryString = "";
		this.addField = 
			function(name,value) { 
				if (queryString.length>0) { 
					queryString += "&";
				}
				queryString += encodeURIComponent(name) + "=" + encodeURIComponent(value);
			};
		for (var i=0; i<len; i++) {
			var el = els[i];
			if (!el.disabled) {
				switch(el.type) {
					case 'text': case 'password': case 'hidden': case 'textarea': 
						this.addField(el.name,el.value);
						break;
					case 'select-one':
						if (el.selectedIndex>=0) {
							this.addField(el.name,el.options[el.selectedIndex].value);
						}
						break;
					case 'select-multiple':
						for (var j=0; j<el.options.length; j++) {
							if (el.options[j].selected) {
								this.addField(el.name,el.options[j].value);
							}
						}
						break;
					case 'checkbox': case 'radio':
						if (el.checked) {
							this.addField(el.name,el.value);
						}
						break;
				}
			}
		}
		return queryString;
	}	
}