﻿// Daniel Mota - Conexion AJAX / http://icebeat.bitacoras.com

var ajax = {
	XMLHttpRequest: function() {
  		try { return new XMLHttpRequest(); }
 		catch (e) { try { return new ActiveXObject('Msxml2.XMLHTTP'); }
  		catch (e) { try { return new ActiveXObject('Microsoft.XMLHTTP'); }
  		catch (e) { return false; }}}
  		return false;
	},
	get: function(sFile,oParams,fnDone,that) {
		return this.request('GET',sFile,oParams,fnDone,that);
	},
	post: function(sFile,oParams,fnDone,that) {
		return this.request('POST',sFile,oParams,fnDone,that);
	},
	request: function(sMethod,sFileName,oParams,fnDone,that) {
		var oRequest = this.XMLHttpRequest();
		if (!oRequest) return false;
		var sParams = '';
		var sFile = sFileName.split('#');
		if(sMethod == 'GET') {
			oRequest.open('GET', sFile[0]+this.params(oParams,'?'), true);
		} else {
			sParams = this.params(oParams,'');
			oRequest.open('POST', sFile[0], true);
        	oRequest.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
		}
        oRequest.setRequestHeader('Referer',window.location);
        oRequest.onreadystatechange = function() {
        	if (oRequest.readyState == 4 && oRequest.status == 200) {
        		if(fnDone)
					fnDone(oRequest,that);
        		if(sFile[1])
        			ajax.action(oRequest,sFile[1]);
			}
        };
        oRequest.send(sParams);
		return false;
	},
	params: function(oParams,before) {
		var sParams = '';
		for(i in oParams) {
			if(sParams.length>0) sParams += '&';
			sParams += encodeURIComponent(i)+'='+encodeURIComponent(oParams[i]);
		}
		return before+sParams;
	},
	action: function(oRequest,container) {
        switch(container[0]) {
        	case '^': 
        		container = container.replace(/^\^/,'');
        		if(!document.getElementById(container)) return false;
        		var update = document.getElementById(container).innerHTML;
        		document.getElementById(container).innerHTML = oRequest.responseText + update;
        		break;
        	case '+': 
        		container = container.replace(/^\+/,'');
        		if(!document.getElementById(container)) return false;
        		document.getElementById(container).innerHTML += oRequest.responseText;
        		break;
        	default: 
	        	if(!document.getElementById(container)) return false;
				document.getElementById(container).innerHTML = oRequest.responseText;
        }
	}
};

//global helper functions

function buildUri(name, value) {
	return "&" + encodeURIComponent(name) + "=" + encodeURIComponent(value);
}

function AjaxError(req) {
	ShowHtmlMsg("Error loading "+this.url+" status: "+this.req.status+" "+this.req.statusText,'',true,false,null,null,null);
}

function getChildNode(node, name) {
	for (var i=0;i<node.childNodes.length;i++) {
		if (node.childNodes[i].nodeName == name) {
			return node.childNodes[i];
		}
	}
	throw "Node "+name+" is not a child node of "+node.nodeName;
}

function getNodeText(node, name) {
	return getInnerText(getChildNode(node,name));
}
function getInnerText (node) {
	if (node.textContent) {
		return node.textContent;
	} else if (node.text) {
		return node.text;
	} else if (node.innerText) {
		return stripcdata(node.innerText);
	} else {
		switch (node.nodeType) {
		case 3:
		case 4:
			return "nodeValue"+node.nodeValue;
			//break;
		case 1:
		case 11:
			var innerText = '';
			for (var i = 0; i < node.childNodes.length; i++) {
				innerText += getInnerText(node.childNodes[i]);
			}
			return innerText;
			//break;
		default:
			return '';
		}
	}
}

function stripcdata(str) {
	if (str.substr(0,9) == "<![CDATA[") {
		return str.substr(9,str.length-12);
	} else {
		return str;
	}
}


function buildFromForm(f) {
	var enc="";
		
	for (var i=0; i<f.elements.length; i++) {
		if (f.elements[i].name) {
			enc += "&" + encodeURIComponent(f.elements[i].name) + "=" + encodeURIComponent(f.elements[i].value);
		}
	}
	return enc.substr(1);
}

function getRootNode(req) {
	if (req.readyState == 4) { //4=complete
		if ((req.status == 200 || req.status == 304) && req.responseXML.documentElement) {
			//OK (and valid XML document) ?
			return req.responseXML.documentElement;
		}
	}		
	return null;		
}

function getResponseText(req) {
	if (req.readyState == 4) { //4=complete
		if (req.status == 200 || req.status == 304) {
			//OK (and valid XML document) ?
			return req.responseText;
		}
	}		
	return null;		
}

function getParamValue(p, name)
{
	var re = new RegExp("(^|&)" + name + "=([^&]*?)($|&)", "ig");
	if(p.match(re)!=null)
	{
		return RegExp.$2;
	}
	return null;
}

