//////////////////////////////////////////
//Copyright: Juan Pablo Stange
//3 CLAUSE BSD LICENSE
//www.yaguajax.com.ar
//////////////////////////////////////////

	var yaguajax = function () {

			var Vars      = [];
			var req       = null;
			var retObj    = null;
			this.jsCall   = null;
			this.jsMethod = null;

			this.simpleRequest = function (url,method,callJsFunc,jsM) {

					req     = this.startXhr();

					if (!req) {
						alert('Cannot create XMLHTTP instance');
						return false;
					} 

					this.jsCall   = callJsFunc;
					this.jsMethod = jsM;

					req.open(method,url,true);
					req.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
					req.setRequestHeader('Connection', 'close');

					var params = this.parseVars(Vars)+'&nocache='+Math.random();

					req.onreadystatechange = function(c) {return function() {c.checkStateSimple()}}(this);

					req.send(params);

			},

			this.doRequest = function (url,method,callFunc,callJSFunc,jsM) {

					req     = this.startXhr();

					if (!req) {
						alert('Cannot create XMLHTTP instance');
						return false;
					} 
	
					this.jsCall   = callJSFunc;
					this.jsMethod = jsM;

					req.open(method,url,true);
					req.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
					req.setRequestHeader('Connection', 'close');

					var params = 'fncall='+callFunc+'&'+this.parseVars(Vars)+'&nocache='+Math.random();

					req.onreadystatechange = function(c) {return function() {c.checkState()}}(this);

					//req.addEventListener ('load',testIt(this),false);
					//req.addEventListener ('error',this.test,false);
					//setTimeout (function(){req.send(params)},0);

					req.send(params);
			
		},


		this.testing = function () {
			alert (req.responseText);
		},

		this.checkState = function () {

			if (req.readyState != 4)
				return;

			if (req.status == 200||req.status == 304) {
					  //  alert (this.jsCall);

				if (typeof(this.jsCall)=='function')
					return this.jsCall(this.fetchObject (req.responseText));

				if (typeof(this.jsCall)=='object'){

					var theObj = this.fetchObject (req.responseText);
					
					theObj.construct();

					if(theObj.object==null)
						return;

					return this.jsCall[this.jsMethod](theObj);

				}

				alert ('No object or function to be called');

			}

		},

		this.checkStateSimple = function () {

			if (req.readyState != 4)
				return;

			if (req.status == 200||req.status == 304)
				return this.jsCall[this.jsMethod](req.responseText);

		}

		this.fetchObject = function (objString) {

				var codeArray  = objString.split("\n");
				var finalCode  = new Array();
				var fname      = null;
				var flag       = null;
				var pFName     = null;
				var store      = null;
				var obj        = new Object();

				for (i = 0;i < codeArray.length;i++){

					fname = codeArray[i].substring (0,codeArray[i].indexOf(':'));

					if (!fname)
						continue;

					store = codeArray[i].substring (codeArray[i].indexOf(':')+1);

					finalCode[fname] += store;

				}	

				var str = 'undefined';

				for (a in finalCode)
					  obj[a] = new Function (finalCode[a].substring(str.length));

				return obj;

		},


		this.getObject = function () {

				return (this.retObj);

		},

		this.startXhr =  function () {

			var ua = navigator.userAgent.toLowerCase();

			if (!window.ActiveXObject)
				return (new XMLHttpRequest());

			if (ua.indexOf('msie 5') == -1)
				return (new ActiveXObject("Msxml2.XMLHTTP"));

			return (new ActiveXObject("Microsoft.XMLHTTP"));

		},


		this.parseVars = function (sendUs) {

			var send = new String();

			for ( i in sendUs )
				send += i  + '=' + sendUs[i] + '&';

			send = send.substring (send.lastIndexOf('&'),-1);

			return send;

		},
		
		this.addVar =  function (variable,value) {

			Vars[variable]=value;

		}

	}


