function sack(file){this.xmlhttp=null;this.resetData=function(){this.method="POST";this.queryStringSeparator="?";this.argumentSeparator="&";this.URLString="";this.encodeURIString=true;this.execute=false;this.element=null;this.elementObj=null;this.requestFile=file;this.vars=new Object();this.responseStatus=new Array(2);};this.resetFunctions=function(){this.onLoading=function(){};this.onLoaded=function(){};this.onInteractive=function(){};this.onCompletion=function(){};this.onError=function(){};this.onFail=function(){};};this.reset=function(){this.resetFunctions();this.resetData();};this.createAJAX=function(){try{this.xmlhttp=new ActiveXObject("Msxml2.XMLHTTP");}catch(e1){try{this.xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");}catch(e2){this.xmlhttp=null;}}
if(!this.xmlhttp){if(typeof XMLHttpRequest!="undefined"){this.xmlhttp=new XMLHttpRequest();}else{this.failed=true;}}};this.setVar=function(name,value){this.vars[name]=Array(value,false);};this.encVar=function(name,value,returnvars){if(true==returnvars){return Array(encodeURIComponent(name),encodeURIComponent(value));}else{this.vars[encodeURIComponent(name)]=Array(encodeURIComponent(value),true);}}
this.processURLString=function(string,encode){encoded=encodeURIComponent(this.argumentSeparator);regexp=new RegExp(this.argumentSeparator+"|"+encoded);varArray=string.split(regexp);for(i=0;i<varArray.length;i++){urlVars=varArray[i].split("=");if(true==encode){this.encVar(urlVars[0],urlVars[1]);}else{this.setVar(urlVars[0],urlVars[1]);}}}
this.createURLString=function(urlstring){if(this.encodeURIString&&this.URLString.length){this.processURLString(this.URLString,true);}
if(urlstring){if(this.URLString.length){this.URLString+=this.argumentSeparator+urlstring;}else{this.URLString=urlstring;}}
this.setVar("rndval",new Date().getTime());urlstringtemp=new Array();for(key in this.vars){if(false==this.vars[key][1]&&true==this.encodeURIString){encoded=this.encVar(key,this.vars[key][0],true);delete this.vars[key];this.vars[encoded[0]]=Array(encoded[1],true);key=encoded[0];}
urlstringtemp[urlstringtemp.length]=key+"="+this.vars[key][0];}
if(urlstring){this.URLString+=this.argumentSeparator+urlstringtemp.join(this.argumentSeparator);}else{this.URLString+=urlstringtemp.join(this.argumentSeparator);}}
this.runResponse=function(){eval(this.response);}
this.runAJAX=function(urlstring){if(this.failed){this.onFail();}else{this.createURLString(urlstring);if(this.element){this.elementObj=document.getElementById(this.element);}
if(this.xmlhttp){var self=this;if(this.method=="GET"){totalurlstring=this.requestFile+this.queryStringSeparator+this.URLString;this.xmlhttp.open(this.method,totalurlstring,true);}else{this.xmlhttp.open(this.method,this.requestFile,true);try{this.xmlhttp.setRequestHeader("Content-Type","application/x-www-form-urlencoded")}catch(e){}}
this.xmlhttp.onreadystatechange=function(){switch(self.xmlhttp.readyState){case 1:self.onLoading();break;case 2:self.onLoaded();break;case 3:self.onInteractive();break;case 4:self.response=self.xmlhttp.responseText;self.responseXML=self.xmlhttp.responseXML;self.responseStatus[0]=self.xmlhttp.status;self.responseStatus[1]=self.xmlhttp.statusText;if(self.execute){self.runResponse();}
if(self.elementObj){elemNodeName=self.elementObj.nodeName;elemNodeName=elemNodeName.toLowerCase();if(elemNodeName=="input"||elemNodeName=="select"||elemNodeName=="option"||elemNodeName=="textarea"){self.elementObj.value=self.response;}else{self.elementObj.innerHTML=self.response;}}
if(self.responseStatus[0]=="200"){self.onCompletion();}else{self.onError();}
self.URLString="";delete self.xmlhttp['onreadystatechange'];self.xmlhttp=null;self.responseStatus=null;self.response=null;self.responseXML=null;break;}};this.xmlhttp.send(this.URLString);}}};this.reset();this.createAJAX();}
function GetXmlHttpObject()
{var xmlHttp=null;try
{xmlHttp=new XMLHttpRequest();}
catch(e)
{try
{xmlHttp=new ActiveXObject("Msxml2.XMLHTTP");}
catch(e)
{xmlHttp=new ActiveXObject("Microsoft.XMLHTTP");}}
return xmlHttp;}

function GetXmlHttpObject()
{
    var xmlHttp=null;
    try
    {
        // Firefox, Opera 8.0+, Safari
        xmlHttp=new XMLHttpRequest();
    }
    catch (e)
    {
        // Internet Explorer
        try
        {
            xmlHttp=new ActiveXObject("Msxml2.XMLHTTP");
        }
        catch (e)
        {
            xmlHttp=new ActiveXObject("Microsoft.XMLHTTP");
        }
    }

    return xmlHttp;
}

function createAjaxObject(){
    return GetXmlHttpObject();
}

function postFormData(form, onReadyFunc){
    var formData="";
    for(i=0; i < form.elements.length; i++){
        formData = formData + form.elements[i].name + "=" + encodeURI(form.elements[i].value) + "&";
    }

    formData = formData +"sid="+Math.random();

    ajax=GetXmlHttpObject();
    ajax.onreadystatechange=onReadyFunc;
    ajax.open(form.method, form.action,true);
    ajax.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
    ajax.setRequestHeader("Content-length", formData.length);
    ajax.setRequestHeader("Connection", "Keep-Alive");
    ajax.send(formData);

    return ajax;

}

function sendAjaxRequest(form){
    var formData="";
    for(i=0; i < form.elements.length; i++){
        if(form.elements[i].type == 'checkbox'){
            if(form.elements[i].checked){
                formData = formData + form.elements[i].name + "=" + encodeURI(form.elements[i].value) + "&";
            }
        } else {
            formData = formData + form.elements[i].name + "=" + encodeURI(form.elements[i].value) + "&";
        }
    }

    formData = formData +"sid="+Math.random();

    xmlHttpObj=GetXmlHttpObject();
    xmlHttpObj.onreadystatechange=function(){
        if (xmlHttpObj.readyState==4){
            if (xmlHttpObj.status == 200) {
                var xmlDoc=xmlHttpObj.responseXML.documentElement;
                var version="";
                var type="";
                var code="";
                var target="";
                var content="";
                if(xmlDoc.getElementsByTagName("version")[0].childNodes.length>0)
                    version=xmlDoc.getElementsByTagName("version")[0].childNodes[0].nodeValue;
                if(xmlDoc.getElementsByTagName("type")[0].childNodes.length>0)
                    type=xmlDoc.getElementsByTagName("type")[0].childNodes[0].nodeValue;
                if(xmlDoc.getElementsByTagName("code")[0].childNodes.length>0)
                    code=xmlDoc.getElementsByTagName("code")[0].childNodes[0].nodeValue;
                if(xmlDoc.getElementsByTagName("target")[0].childNodes.length>0)
                    target=xmlDoc.getElementsByTagName("target")[0].childNodes[0].nodeValue;
                if(xmlDoc.getElementsByTagName("content")[0].childNodes.length>0){    
                    for(pos=0; pos < xmlDoc.getElementsByTagName("content")[0].childNodes.length; pos++){
                        content = content + xmlDoc.getElementsByTagName("content")[0].childNodes[pos].nodeValue;
                    }
                }

            /*
                    alert("version:" + version + "\n" +
                        "type:" + type + "\n" +
                        "code:" + code + "\n" +
                        "target:" + target + "\n" +
                        "content:" + content
                        );
              */
                if(code!=""){
                    //alert(code);
                    eval(code);
                }
                else if(type=="content" && target!="" && content!=""){
                   if(code!="")
                        eval(code);
                    document.getElementById(target).innerHTML=Base64.decode(content);
                    //document.getElementById(target).innerHTML=content;
                    //alert(Base64.decode(content));
                }


            } else {
        //alert('Hubo un problema con la peticion');
        }

        }
    };
    xmlHttpObj.open(form.method, form.action,true);
    xmlHttpObj.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
    xmlHttpObj.setRequestHeader("Content-length", formData.length);
    xmlHttpObj.setRequestHeader("Connection", "Keep-Alive");
    xmlHttpObj.send(formData);


}

/**
*
*  Base64 encode / decode
*  http://www.webtoolkit.info/
*
**/
 
var Base64 = {
 
	// private property
	_keyStr : "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",
 
	// public method for encoding
	encode : function (input) {
		var output = "";
		var chr1, chr2, chr3, enc1, enc2, enc3, enc4;
		var i = 0;
 
		input = Base64._utf8_encode(input);
 
		while (i < input.length) {
 
			chr1 = input.charCodeAt(i++);
			chr2 = input.charCodeAt(i++);
			chr3 = input.charCodeAt(i++);
 
			enc1 = chr1 >> 2;
			enc2 = ((chr1 & 3) << 4) | (chr2 >> 4);
			enc3 = ((chr2 & 15) << 2) | (chr3 >> 6);
			enc4 = chr3 & 63;
 
			if (isNaN(chr2)) {
				enc3 = enc4 = 64;
			} else if (isNaN(chr3)) {
				enc4 = 64;
			}
 
			output = output +
			this._keyStr.charAt(enc1) + this._keyStr.charAt(enc2) +
			this._keyStr.charAt(enc3) + this._keyStr.charAt(enc4);
 
		}
 
		return output;
	},
 
	// public method for decoding
	decode : function (input) {
		var output = "";
		var chr1, chr2, chr3;
		var enc1, enc2, enc3, enc4;
		var i = 0;
 
		input = input.replace(/[^A-Za-z0-9\+\/\=]/g, "");
 
		while (i < input.length) {
 
			enc1 = this._keyStr.indexOf(input.charAt(i++));
			enc2 = this._keyStr.indexOf(input.charAt(i++));
			enc3 = this._keyStr.indexOf(input.charAt(i++));
			enc4 = this._keyStr.indexOf(input.charAt(i++));
 
			chr1 = (enc1 << 2) | (enc2 >> 4);
			chr2 = ((enc2 & 15) << 4) | (enc3 >> 2);
			chr3 = ((enc3 & 3) << 6) | enc4;
 
			output = output + String.fromCharCode(chr1);
 
			if (enc3 != 64) {
				output = output + String.fromCharCode(chr2);
			}
			if (enc4 != 64) {
				output = output + String.fromCharCode(chr3);
			}
 
		}
 
		output = Base64._utf8_decode(output);
 
		return output;
 
	},
 
	// private method for UTF-8 encoding
	_utf8_encode : function (string) {
		string = string.replace(/\r\n/g,"\n");
		var utftext = "";
 
		for (var n = 0; n < string.length; n++) {
 
			var c = string.charCodeAt(n);
 
			if (c < 128) {
				utftext += String.fromCharCode(c);
			}
			else if((c > 127) && (c < 2048)) {
				utftext += String.fromCharCode((c >> 6) | 192);
				utftext += String.fromCharCode((c & 63) | 128);
			}
			else {
				utftext += String.fromCharCode((c >> 12) | 224);
				utftext += String.fromCharCode(((c >> 6) & 63) | 128);
				utftext += String.fromCharCode((c & 63) | 128);
			}
 
		}
 
		return utftext;
	},
 
	// private method for UTF-8 decoding
	_utf8_decode : function (utftext) {
		var string = "";
		var i = 0;
		var c = c1 = c2 = 0;
 
		while ( i < utftext.length ) {
 
			c = utftext.charCodeAt(i);
 
			if (c < 128) {
				string += String.fromCharCode(c);
				i++;
			}
			else if((c > 191) && (c < 224)) {
				c2 = utftext.charCodeAt(i+1);
				string += String.fromCharCode(((c & 31) << 6) | (c2 & 63));
				i += 2;
			}
			else {
				c2 = utftext.charCodeAt(i+1);
				c3 = utftext.charCodeAt(i+2);
				string += String.fromCharCode(((c & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63));
				i += 3;
			}
 
		}
 
		return string;
	}
 
}

//solo con Mozilla
function getNodesAsText(allNodes)
{

        //Initialize new XMLSerializer
        var xmlSer = new XMLSerializer();

        var nodesText = "";
        // Convert each node into text
        for(var i = 0; i < allNodes.length; i++)
        {
                nodesText += xmlSer.serializeToString(allNodes[i]);
        }

        return nodesText;
}

function sendGetAjaxRequest(formData){

    formData = formData +"&sid="+Math.random();
    
    var xmlHttpObj=GetXmlHttpObject();

    xmlHttpObj.open("GET", formData,true);
    
    xmlHttpObj.onreadystatechange=function(){
        if (xmlHttpObj.readyState==4){
            if (xmlHttpObj.status == 200) {
                var xmlDoc=xmlHttpObj.responseXML.documentElement;
                var version="";
                var type="";
                var code="";
                var target="";
                var content="";
                if(xmlDoc.getElementsByTagName("version")[0].childNodes.length>0)
                    version=xmlDoc.getElementsByTagName("version")[0].childNodes[0].nodeValue;
                if(xmlDoc.getElementsByTagName("type")[0].childNodes.length>0)
                    type=xmlDoc.getElementsByTagName("type")[0].childNodes[0].nodeValue;
                if(xmlDoc.getElementsByTagName("code")[0].childNodes.length>0)
                    code=xmlDoc.getElementsByTagName("code")[0].childNodes[0].nodeValue;
                if(xmlDoc.getElementsByTagName("target")[0].childNodes.length>0)
                    target=xmlDoc.getElementsByTagName("target")[0].childNodes[0].nodeValue;
                if(xmlDoc.getElementsByTagName("content")[0].childNodes.length>0)
                    content=xmlDoc.getElementsByTagName("content")[0].childNodes[0].value

                if(type=="code" && code!=""){
                    eval(code);
                }
                else if(type=="content" && target!="" && content!=""){
                   if(code!="")
                        eval(code);
                    document.getElementById(target).innerHTML=Base64.decode(content);
                }
                

            } else {
        //alert('Hubo un problema con la peticion');
        }

        }
    };
        
    xmlHttpObj.send(null);
}


var enableCache=true;var jsCache=new Array();var dynamicContent_ajaxObjects=new Array();function ajax_showContent(divId,ajaxIndex,url,callbackOnComplete)
{var targetObj=document.getElementById(divId);targetObj.innerHTML=dynamicContent_ajaxObjects[ajaxIndex].response;if(enableCache){jsCache[url]=dynamicContent_ajaxObjects[ajaxIndex].response;}
dynamicContent_ajaxObjects[ajaxIndex]=false;ajax_parseJs(targetObj);if(callbackOnComplete){executeCallback(callbackOnComplete);}}
function executeCallback(callbackString){if(callbackString.indexOf('(')==-1){callbackString=callbackString+'()';}
try{eval(callbackString);}catch(e){}}
function ajax_loadContent(divId,url,path,callbackOnComplete)
{if(enableCache&&jsCache[url]){document.getElementById(divId).innerHTML=jsCache[url];ajax_parseJs(document.getElementById(divId))
evaluateCss(document.getElementById(divId))
if(callbackOnComplete){executeCallback(callbackOnComplete);}
return;}
var ajaxIndex=dynamicContent_ajaxObjects.length;document.getElementById(divId).innerHTML='<img src="'+path+'/imgs/20-0.gif" alt="..." />';dynamicContent_ajaxObjects[ajaxIndex]=new sack();if(url.indexOf('?')>=0){dynamicContent_ajaxObjects[ajaxIndex].method='GET';var string=url.substring(url.indexOf('?'));url=url.replace(string,'');string=string.replace('?','');var items=string.split(/&/g);for(var no=0;no<items.length;no++){var tokens=items[no].split('=');if(tokens.length==2){dynamicContent_ajaxObjects[ajaxIndex].setVar(tokens[0],tokens[1]);}}
url=url.replace(string,'');}
dynamicContent_ajaxObjects[ajaxIndex].requestFile=url;dynamicContent_ajaxObjects[ajaxIndex].onCompletion=function(){ajax_showContent(divId,ajaxIndex,url,callbackOnComplete);};dynamicContent_ajaxObjects[ajaxIndex].runAJAX();}
function ajax_parseJs(obj)
{var scriptTags=obj.getElementsByTagName('SCRIPT');var string='';var jsCode='';for(var no=0;no<scriptTags.length;no++){if(scriptTags[no].src){var head=document.getElementsByTagName("head")[0];var scriptObj=document.createElement("script");scriptObj.setAttribute("type","text/javascript");scriptObj.setAttribute("src",scriptTags[no].src);}else{if(navigator.userAgent.toLowerCase().indexOf('opera')>=0){jsCode=jsCode+scriptTags[no].text+'\n';}
else
jsCode=jsCode+scriptTags[no].innerHTML;}}
if(jsCode)ajax_installScript(jsCode);}
function ajax_installScript(script)
{if(!script)
return;if(window.execScript){window.execScript(script)}else if(window.jQuery&&jQuery.browser.safari){window.setTimeout(script,0);}else{window.setTimeout(script,0);}}
function evaluateCss(obj)
{var cssTags=obj.getElementsByTagName('STYLE');var head=document.getElementsByTagName('HEAD')[0];for(var no=0;no<cssTags.length;no++){head.appendChild(cssTags[no]);}}
