/*
 * Assynchronous JavaScript And XML - JavaScript Code Part
 *
 * Author: Guilherme Blanco - guilhermeblanco NOSPAM at gmail dot com
 * Copyright: Copyright(r) 2005, PontUKom Corp.
 */


pAJAX.debugMode = false;
pAJAX.requestType = "POST";
pAJAX.Sync = false;
pAJAX.Assync = true;
pAJAX.debug = function (str) {
	if (pAJAX.debugMode) 
		alert("AJAX Debug Mode Console:\n\n" + str);
}


function pAJAX() {
	this._data = null;
	this.readyState = null;
	this.status = null;
	
	if (typeof this.onInit == "function")
		this.onInit();
}


var _p = pAJAX.prototype;

_p.create = function () {
	pAJAX.debug("Init() Method called");
	
	return this._getXmlHttp();
}


_p.prepare = function (sFuncName, sRequestType) {
	return new pAJAXRequest(this, sFuncName, sRequestType);
}


_p.getData = function () {
	return eval('(' + this._data + ')');
}


_p.toString = function () {
	return "[object pAJAX]";
}


_p._getXmlHttp = function () {
	var req;
		
	try {
		if (window.XMLHttpRequest) {			
			req = new XMLHttpRequest();

			if (req.readyState == null) {
				req.readyState = 1;
				
				req.addEventListener("load", function () {
					req.readyState = 4;

					if (typeof req.onreadystatechange == "function")
						req.onreadystatechange();
				}, false);
			}

			return req;
		}

		if (window.ActiveXObject) {
			var prefixes = ["MSXML2", "Microsoft", "MSXML", "MSXML3"];
				for (var i = 0; i < prefixes.length; i++) {
				try {
					req = new ActiveXObject(prefixes[i] + ".XmlHttp");
					return req;
				} catch (ex) {};
			}
		}
	} catch (ex) {}

	pAJAX.debug("XmlHttp Objects not supported by client browser");
}


pAJAXRequest.GET = "GET";
pAJAXRequest.POST = "POST";


function pAJAXRequest(oAJAX, sFuncName, sRequestType) {
	pAJAX.requestType = sRequestType.toUpperCase();

	this.AJAX = oAJAX;
	this.funcName = escape(sFuncName);
	this.params = [];
}


var _p = pAJAXRequest.prototype;


_p.setParam = function (sParamName, sParamValue) {
	this.params[encodeURIComponent(sParamName)] = encodeURIComponent(sParamValue);
}


_p.compileParams = function() {
	var str = "";
	
	for (var item in this.params) {
		str += "&" + item + "=" + this.params[item];
	}
	
	return str;
}


_p.execute = function (bSync) {
	//alert(URIVarPHP);
	var URI = URIVarPHP;
	var oXmlHttp = this.AJAX.create();	
	var postData;
	
	if (typeof this.AJAX.onCreate == "function")
		this.AJAX.onCreate();
	
	if (pAJAX.requestType == "GET") {
		URI += ((URI.indexOf("?") == -1) ? "?" : "&") + "function=" + this.funcName;
		URI += this.compileParams() + "&rnd=" + (new Date()).getTime();
		postData = null;
	} else {
		postData = "function=" + this.funcName + this.compileParams();
	}
	
	if (bSync == null && bSync != false) bSync = pAJAX.Assync;
	
	pAJAX.debug("Using " + ((bSync) ? "Assynchronous" : "Synchronous") + " call");
	
	oXmlHttp.open(pAJAX.requestType, URI, bSync);
	
	if (pAJAX.requestType == "POST")	{
		oXmlHttp.setRequestHeader("Method", "POST " + URI + " HTTP/1.1");
		oXmlHttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
	}
	
	var self = this;
	oXmlHttp.onreadystatechange = function () {
		self.AJAX.readyState = oXmlHttp.readyState;
		
		if (typeof self.AJAX.onChange == "function")
			self.AJAX.onChange();
		
		if (oXmlHttp.readyState == 4 && oXmlHttp.status == 200) {
			pAJAX.debug("Recieved: " + oXmlHttp.responseText);
			
			self.AJAX._data = oXmlHttp.responseText;
			
			if (!self.AJAX._data)
				pAJAX.debug("Undefined error in AJAX");
				
			if (typeof self.AJAX.onLoad == "function")
				self.AJAX.onLoad();
			
			delete oXmlHttp;
			oXmlHttp = null;
		}
	}
	
	oXmlHttp.send(postData);
	
	pAJAX.debug(this.funcName + " URI: " + URI + "/POST=" + postData);
}


_p.toString = function () {
	return "[object pAJAXRequest]";
}
