// JavaScript Document

Tutu.require("Tutu.json");
Tutu.require("Tutu.forms");
Tutu.require("Tutu.util");

if(!this.Tutu) Tutu = function() {}

	Tutu.xhr = function (objParameters)	{
		
		var defaults = {
			method: "GET",			
			type: "html",
			cache: false,
			async: true,
			scripts: true,
			htmlContainer: null
		}
			
			function __loadResponse(page_request,objParameters){
			var error = null;
			var responseT = null;
			var i;
				try{
			if (page_request.readyState == 4 && (page_request.status==200 || window.location.href.indexOf("http")==-1)){
					responseT = page_request.responseText;					
					
					switch(objParameters.type){
						case "html":
							var div = objParameters.htmlContainer;
							
							if(div){								
							div.innerHTML = responseT;
							/* truco para asegurar q exista un elemento html en la respuesta antes q 
							 * un elemento script puesto q IE no interpreta si no es de esa forma, y si script no tiene 
							 * el attributo defer .. tampoco (IE sucks !)
							 */							
							var pHtml = responseT;
							pHtml = pHtml.replace(/<\s*script/g,"<script defer"); 
							var div_t = document.createElement("div");
							div_t.innerHTML = "x "+pHtml;						
							// parse Scripts
							if (objParameters.scripts) {

								var scripts = div_t.getElementsByTagName("script");
								if (scripts.length > 0) {
									
									for (i = 0; i < scripts.length; i++) {
										if(scripts[i].src!=""){
										document.getElementsByTagName("head")[0].appendChild(scripts[i]);
										}else eval(scripts[i].text);
									}
								}
							}
							}												
						break;
						case "json":
						   try{
							responseT = Tutu.json.parse(responseT); 
							}catch(e){
							error ={code: "",text: "JSON bad syntaxis ["+e+"]"};
							 }
							break;
						case "xml":
						   try{
						   	var xml;
						   	if (this.DOMParser) 
								xml = (new DOMParser()).parseFromString(responseT, "text/xml");
							else {
								xml = new ActiveXObject("Microsoft.XMLDOM");
								xml.loadXML(responseT);								
							}
							responseT = xml;
						   }catch(e){
							error ={code: "",text: "XML bad syntaxis ["+e+"]"};
						   }
						break;	
						default: break;
					}					
					}else	{				
				
					if(page_request.readyState == 4 &&(page_request.status!=200)){
					       error = {code: page_request.status,text: page_request.statusText};					        
					}
					}
					}catch(ex){ error = {code:"",text:"Imposible comunicarse con el Servidor: "+ex.message};}

							
					if(error != null){
						if(objParameters.onerror){objParameters.onerror(error);}
						else throw error.text;
					}else{	
						if(responseT!=null){	
						if(objParameters.onload){objParameters.onload(responseT);}else{return responseT;}
						}else{
						;
						}
					}
			}
		
		
		
		
			/* MAIN */
		
			var contentType = "application/x-www-form-urlencoded; charset=UTF-8";
			var page_request = false
			
			// defaults			
			objParameters = Tutu.util.setDefaults(objParameters,defaults);			
			if (typeof(objParameters.sync) != "undefined") objParameters.async = !objParameters.sync;
			
			// xhttpRequest Object			
			if (window.XMLHttpRequest) // if Mozilla, Safari etc
			page_request = new XMLHttpRequest()
			else
			if (window.ActiveXObject) { // if IE
			try {page_request = new ActiveXObject("Msxml4.XMLHTTP");} catch (e) {
			try {page_request = new ActiveXObject("Microsoft.XMLHTTP");} catch (e) {} }	}
			else throw "No xhttpRequest Object Available";			
			
			if(objParameters.async)			
			page_request.onreadystatechange = function(){__loadResponse(page_request,objParameters);}
			
			
			
			// procesar la URL
			var url = "";
			var params = "";
			if (objParameters.url) {
				url = objParameters.url;
				var indice = url.indexOf('?');
				if (indice > 0) {
					params = url.substring(indice + 1, url.length);
					url = url.substring(0, indice);
				}
			}
			
			// formulario
			var urlForm = "";
			if (objParameters.form) {
				
				lform = objParameters.form;
				var s = "";
				if(lform.method){
					if(lform.method.toLowerCase()=="post") 
 						objParameters.method = "POST";		
				}
				urlForm = Tutu.forms.QueryStr({form:lform});
				if (urlForm != "") {				
				if (params != "") params += "&";
				params += urlForm;
				}
				if((lform.action)&&(url==""))  url = lform.action;
				}			
				
			if(!objParameters.cache){	
			  if(params!="") params += "&";
 			  params += "ttnc="+Math.random().toString().replace(/\./g,"");
			}	
			
			// preparar el container si es el caso
			if (objParameters.htmlContainer) {
				if (typeof(objParameters.htmlContainer.innerHTML)=="undefined") {
					var el = objParameters.htmlContainer;
					var n = el.childNodes.length;
					var i;
					for (i = 0; i < n; i++) el.removeChild(el.childNodes[0]);
					var div = document.createElement("div");
					el.appendChild(div);
					objParameters.htmlContainer = div;
				}
				//lanzar el preloader
				if (objParameters.preloadHTML) 
					objParameters.htmlContainer.innerHTML = objParameters.preloadHTML;				
				}
				if(objParameters.onpreload){
					objParameters.onpreload(this,objParameters.htmlContainer);
				}						
			
			// Lanzar el Request		
			if(objParameters.oninit){objParameters.oninit();}
			
			if (objParameters.method == "GET") {
						if(params!="")	url = url + "?" + params;
						page_request.open("GET", url, objParameters.async);
						page_request.send(null);}			
			if(objParameters.method=="POST"){
						page_request.open("POST", url, objParameters.async);
						page_request.setRequestHeader("Content-Type", contentType);
				        page_request.send(params);	}			
						
			if(!objParameters.async) return __loadResponse(page_request,objParameters);
			
			
			
				
			}  
    
  
    
			
			
			


