
/*
		data type|[row separator]|[field separator]{DATA}serialised data
		data type : string | array | int
		row separator : the character or the string pattern that split the row matrix
		field separator : the character or the string pattern that split the elements of an array

*/




/*
	dataRequest (url,[method],[async],[formname])
*/

function dataRequest(url){
	if(!url){
		alert("url missing")
		return false;
	}
	
	if(!arguments[1])method = "get"
	else{
		if(arguments[1].toLowerCase() != "get" && arguments[1].toLowerCase() !="post") method = "get"
		else method = arguments[1].toLowerCase()
	} 
	
	if(!arguments[2])async = false //the object is sync 
	else{ 
		if(typeof(arguments[2]) != 'boolean') async = false
		else async = arguments[2]
	}
	
	if(arguments[3]){
		if(arguments[1].toLowerCase() == "get"){
			alert("send method is get.form data will not be sent.")
		}
		form = arguments[3]
	}
	
	var XL=null, axO=['Msxml2.XMLHTTP.6.0','Msxml2.XMLHTTP.5.0','Msxml2.XMLHTTP.4.0','Msxml2.XMLHTTP.3.0','Msxml2.XMLHTTP','Microsoft.XMLHTTP'], i;
	var cc = this;
	try{	// XMLHttpRequest comes first for Firefox and IE7 (hopefully)
		if(typeof(XMLHttpRequest)!='undefined'){
			XL=new XMLHttpRequest();
		}
	}catch(e){
		alert(e.description)
	}

	if(XL==null){	// try all the ActiveX objects in axO
		for(i=0;i<axO.length;i++){
			if(XL==null)
				try{
					XL=new ActiveXObject(axO[i]);
				}catch(e){
					XL=null;
				}
		}
	}

	XL.open(method,url,async);
	XL.onreadystatechange = function(){onReadyStateChange();};
	if(method == "post"){ 
		XL.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
		params = getParams(form)
		XL.send(params);
	}else
		XL.send(null);
	if(typeof XL.oncomplete=='function')XL.oncomplete();


	function getParams(formobj) {
		var sendf=""
		if (XL) {
			var fields = new Array();
			if(formobj){
				var formname = formobj.name;
			}
			//loop through form elements and retrieve field NAMEs and Values
			for (var x = 0; x < formobj.elements.length; x++){
				// join them into a string.
				elem = formobj.elements[x]
				if(elem.type =='radio'){
					if(elem.checked){
						fields.push(elem.name+'='+escape(elem.value));
					}
				}else{
					fields.push(elem.name+'='+escape(elem.value));
				}
			}
			
			//sendf looks like "username=myusername&password=mypass"
			 sendf = fields.join('&')+"&formname="+formobj.name;
		}
		return sendf
	}	



	function onReadyStateChange(){
		if(XL.readyState==4){
			function tError(a, b){
				alert('error')
			}
			switch (XL.status){
				case 200: // good
					break;
				case 408: case 504: // timeout
					tError('A problem occured talking to the server.  Please try again.');
					return;
					break;
				default:
					tError('A problem occured talking to the server.  Please try again later.');
					return;
					break;
			}
		}
	}
		
	return {
		data:function(){
			if(XL.responseText.indexOf('error')>0){
				return false
			}else{
				r = unescape(XL.responseText);
				response = r.split("{DATA}")
				dataConfigStr = response[0]
				dataArrayStr = response[1]
				// process the config part 
				dataConfigArr = dataConfigStr.split("|")
				if (dataConfigArr.length >3 || dataConfigArr.length < 1)return false
				switch(dataConfigArr[0]){
					case "string":
						return dataArrayStr; 
					case "int":
						return dataArrayStr;
					case "array":
						if(dataConfigArr[1])
							dataCols = dataArrayStr.split(dataConfigArr[1])
						else return false	
						if(dataConfigArr[2]){
							matrix = new Array();
							for(var i=0;i<dataCols.length;i++){
								matrixRow = dataCols[i].split(dataConfigArr[2])
								matrix.push(matrixRow)
							}
							return matrix				
						}else return dataCols;
				}
			}
		},
		
		setRequestHeader:      function(a, b){ XL.setRequestHeader(a, b); },
		abort:                 function(){ XL.abort(); },
		responseText:          function(){return  XL.responseText; },
		responseXML:           function(){return  XL.responseXML; },
		readyState:            function(){return  XL.readyState; },
		getAllResponseHeaders: function(){return  XL.getAllResponseHeaders(); },
		getResponseHeader:     function(a){return XL.getResponseHeader(a); },
		status:                function(){return  XL.status; },
		statusText:            function(){return  XL.statusText; },
		oncomplete:            null,
		onerror:               null
	};

		
}

/*gigi = new dataRequest('getInfo.php?id=12')
tab = gigi.data()*/












