
var isIE = /*@cc_on!@*/false; //vendo se é o IE
/* TESTAR VÁRIOS ERROS HTTP
por pra funcionar styles no IE e flash */


String.prototype.Acento = function (e) {
     var str=this, a=["á","à","ã","â","ä","é","è","ê","ë","í","ì","î","ï","ó","ò","ô","õ","ö","ú","ù","û","ü","ç","Á","À","Ã","Â","Ä","É","È","Ê","Ë","Í","Ì","Î","Ï","Ó","Ò","Ô","Õ","Ö","Ú","Ù","Û","Ü","Ç","'"], b=["#a/#","#a\\#","#a-#","#a>#","#a:#","#e/#","#e\\#","#e>#","#e:#","#i/#","#i\\#","#i>#","#i:#","#o/#","#o\\#","#o>#","#o-#","#o:#","#u/#","#u\\#","#u>#","#u:#","#c,#","#A/#","#A\\#","#A-#","#A>#","#A:#","#E/#","#E\\#","#E>#","#E:#","#I/#","#I\#","#I>#","#I:#","#O/#","#O\\#","#O>#","#O-#","#O:#","#U/#","#U\\#","#U>#","#U:#","#C,#","#|#"],er 
	 if(e=="c"){for (var i=0;i<a.length;i++) {er=new RegExp(a[i],"g"); str = str.replace(er, b[i]);}}
	 if(e=="d"){for (var i=0;i<a.length;i++) {er=new RegExp(b[i],"g"); str = str.replace(er, a[i]);}}	 
	 return str
}


function ajaxGo(param){
/**
* ajaxGo - envia uma solicitação ajax simples ou submete um formulário via ajax
* sintaxe: ajaxGo({ url | form [, elem_return] [, timeout] [, loading] [, callback] [, unescape] [, hide_err]})
* Versão: 1.0 - 28/12/2007
* Autores: Micox - www.elmicox.com - elmicox.blogspot.com
* 		   Klawdyo - José Cláudio
* Licença: Creative Commons - http://creativecommons.org/licenses/by/2.5/br/
* Some Rights Reserved - http://creativecommons.org/licenses/by/2.5/
*

ajaxGo(
  {
    form: 'id_do_form' OU referencia_html_do_form, // url a ser submetida (string ou HTMLobject)
    url: 'arquivo.php', // url a ser submetida. Colocando o form, a url não é obrigatória

    //opcionais:
    timeout: XX, // tempo máximo em segundos para pegar a página
    loading: '<strong>Loading</strong>', // html a ser exibido enquanto carrega caso queira
    elem_return: 'id_do_elemento' OU referencia_html_de_elemento, // o elemento que receberá o retorno ajax caso queira
    callback: function(data){blablalb}, // função que será executada ao final com os dados retornados
    unescape: true OU false, // para desencodar caso o script serverside tenha encodado (boolean)
    hide_err: true OU false // para não exibir os erros caso queira. Padrão=false (boolean)
  }
)


Exemplos que apenas enviam a solicitação mas não trabalham nada com o resultado:
ajaxGo({ form:'meu_form' });
ajaxGo({ url:'arquivo.php' });
ajaxGo({ form:document.getElementById('meu_form') });
ajaxGo({ url:'arquivo.php' , form:this.parentNode.form });
ajaxGo({ url:'arquivo.php' , timeout: 10, loading:'<b>Carregando</b>' });
ajaxGo({ form:this.form , timeout: 10, loading:'Carregando' , unescape:true });


Exemplos que fazem algo com o resultado:
ajaxGo({ form:'meu_form' , elem_return: 'meu_div' });
ajaxGo({ url:'arquivo.php', elem_return: this.nextSibling() });
ajaxGo({ form:this.parentNode , callback: funcao_x }); // funcao_x = function(data){ alert(data);}
ajaxGo({ url:'arquivo.php' , callback: function(data){ if(data=='ok'){alert('sucesso')} } , loading:'Carregando' });
ajaxGo({ url:'arquivo.php' , timeout: 10, callback: function(data){ document.getElementById('meu_div').innerHTML=data } });

Teste: http://www.elmicox.com/wp-content/uploads/2008/03/ajaxvai2.htm
Forum: http://forum.ievolutionweb.com/index.php?showtopic=18264&st=60

**/


    /******** declaracao de variaveis ********/    
    var url, the_form, callback, timeout, html_loading='', elem_return, unescape_, hide_err, acento_, base64_, elem_loading ;  //vars que receberão os parametros da funcao
    var concat, url_orig, msg, timeload, timeout, ajax; //outras variáveis
    var method='GET', query='', loadpos=0, timecounter=0, self=this; //variáveis inicializadas
    var loads = [':::','|::',':|:','::|']; //animacao do loading

    
    /******** pegando os parametros obrigatorios ********/    
    if(!param.url && !param.form){//pelo menos 1 dos 2 argumentos deve ser obrigatório
        alert('Programador, reveja sua chamada ao ajaxGo.\r\nVocê deve informar pelo menos a "url" ou o "form".');
        return false;
    }
    if(param.url){ url = param.url; }
    if(param.form){
        if(param.form.constructor==String){ //id do form passada
            the_form = document.getElementById(param.form);
            
        }else if(typeof(param.form.nodeType)!='undefined'){ //form passado como referencia ao objeto html
            the_form = param.form;
        }
        
        if(the_form && the_form.nodeName.toLowerCase()=='form'){//se o elemento existe e é realmente um form
            if(!url) { url = the_form.action; }
            if(the_form.method) { method = the_form.method.toUpperCase();}
            
        }else{ //form não existe
            alert('Programador, reveja sua chamada ao ajaxGo.\r\nO form "' + url_ou_form + '" informado, nao existe');
            return false;
        }
        
    }
    //pegando os parametros opcionais.
    if(param.acento){acento_=param.acento; }
    if(param.base64){base64_=param.base64; }
    if(param.callback){ callback = param.callback; }
    if(param.timeout){ timeout = param.timeout; }
    if(param.loading){ html_loading = param.loading; }
    if(param.unescape){ unescape_ = param.unescape;}
    if(param.hide_err){ hide_err = param.hide_err;}
    if(param.elem_return){
        if(param.elem_return.constructor==String){
            elem_return = document.getElementById(param.elem_return);
        }else if(typeof(param.elem_return.nodeType)!='undefined'){ //elemento passado como referencia ao objeto html
            elem_return = param.elem_return;
        }
        
        if(!elem_return){
            alert('Programador, reveja sua chamada ao ajaxGo.\r\nO elem_return "' + arguments[1] + ' ( '+param.elem_loading+' ) ' + '" informado, nao existe');
            return false;
        }
    }
    
    if(param.elem_loading) {
     if(param.elem_loading.constructor==String){
            elem_loading = document.getElementById(param.elem_loading);
        }else if(typeof(param.elem_loading.nodeType)!='undefined'){ //elemento passado como referencia ao objeto html
            elem_loading = param.elem_loading;
        }
        
        if(!elem_loading){
            alert('Programador, reveja sua chamada ao ajaxGo.\r\nO elem_loading "' + arguments[1] + ' ( '+param.elem_loading+' ) ' +'" informado, nao existe');
            if(elem_return) elem_loading=elem_return
        }
        
    } else{
      if(elem_return) elem_loading=elem_return
    }
    if (param.debug) alert(elem_return.id+' - '+elem_loading.id)
    
    /******** começando o ajax ********/    
    ajax = getAjax(); //capturando um NOVO objeto xmlHttpRequest

    if(ajax){    
        if(the_form){    
           if (acento_) {
                //codifica o acento
                query = encodeURI((decodeURI(getFieldsForm(the_form, ""))).Acento("c"));
                //alert(query)
           } else if (base64_) {
			   // codigica base64
			    query = getFieldsForm(the_form, "base64")
           } else {
                query = getFieldsForm(the_form, "")
           }
           //alert(query)
         }
        
        //montando a URL
        url_orig = url;
        concat = (url.indexOf('?')>=0) ? "&" : '?';
        //antiga antiCacheRand. Para o problema de cache com ajax do IE
        if(isIE){
            dt = new Date();
            url += concat + encodeURI(dt.getTime());
            concat = '&';
            delete dt;
        }
        
        ajax.onreadystatechange = ajaxOnReady;
        try{
			if(method=='GET'){
				query = query.substr(0,2030); //IE limits http://classicasp.aspfaq.com/forms/what-is-the-limit-on-querystring/get/url-parameters.html
                ajax.open(method, url + concat + query ,true)
				ajax.setRequestHeader("Content-Type", "text/html; charset=utf-8");
				ajax.setRequestHeader("Content-length", query.length);
				query='';
				
			}else{ //POST
				ajax.open(method, url ,true);
				ajax.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
				ajax.setRequestHeader("Content-length", query.length);            
			}
			ajax.setRequestHeader('X-Requested-With', 'ajax'); //dizendo ao servidor que foi pedido via ajax. Recupera-se com $_SERVER['X-Requested-With'] (no php)
			ajax.setRequestHeader("Cache-Control", "no-cache");
			ajax.setRequestHeader("Pragma", "no-cache");
            ajax.send(query);
        }catch(e){
			var e_men = "Programador, verifique se a url "+ url +"  é válida e está em seu domínio."
			if(isIE) { e_men = e.description + "\r\n\r\n" + e_men }
			else{ e_men = e + "\n\n" + e_men }
			alert(e_men)
			return;
		}
        
        //função periódica que verifica o timeout e gera animação
        timeload = setInterval(periodic,250);
        
        return true;
        
    }else{
        return false;
    }


    /******** funções extra que serão chamadas    ****************/
    
    function ajaxOnReady(){ //executada a cada alteração no status http
    
        if(timeout && timecounter/4 > timeout){ //estourou o timeout. O abort() foi feito na funcao periodic()
            clearInterval(timeload); //fim do contador
            msg = "Falha no carregamento. Tempo limite excedido: " + timeout + ' segs.';
            if(!hide_err){ put(msg); }
            window.status = '';
            if(callback){ callback(msg); } //chamando a função de callback

            ajax = null; delete ajax; delete self; 
            return false;
            
        }
        
        /* o readystate=2 status!=200 mata o ajax, mas alguns navegadores ainda chamam o onready sem ter ajax */
        if(!ajax) { return }
                
        if(ajax.readyState==4){ //carregamento (ou não carregamento) completo
            clearInterval(timeload); //fim do contador
            if(ajax.status == 200){ //com sucesso
                var texto=ajax.responseText;
                if(texto.indexOf(" ")<0) texto=texto.replace(/\+/g, " ");
                if(unescape_==true){ //se tiver usado o urlencode no php ou asp
                    texto=unescape(texto);
                }
                put(texto);
                getScripts(texto);
                if(isIE){ getStyles(texto) }
                window.status = '';
                if(callback){ callback(texto); } //chamando a função de callback
            }else{ //com erro
                msg = "Falha no carregamento. " + httpStatus(ajax.status);
                if(!hide_err){
                    if(html_loading){                    
                        put(msg);
                    }else{
                        window.status = msg;
                    }
                }
                if(callback){ callback(msg); } //chamando a função de callback
            }
			ajax = null; delete ajax; delete timeload;
			delete self; return;
            
        }else if(ajax.readyState==2 && typeof(ajax.status)!='unknown'){ //não tava pegando o erro 404 no readystate==4
			if(ajax.status != 200){
				clearInterval(timeload); //fim do contador
				msg = "Falha no carregamento. " + httpStatus(ajax.status);
				if(!hide_err){
					if(html_loading){                    
						put(msg);
					}else{
						window.status = msg;
					}
				}
				if(callback){ callback(msg); } //chamando a função de callback
				ajax = null; delete ajax; delete timeload;
				delete self; return;
             }else{
				window.status = '';
			}
        }else{//para mudar o status de cada carregando
            window.status = '';
        }
    }
    function loadsAnim(){ //faz a animaçãozinha no array loads
        if(html_loading.indexOf('<img')<0){ // 3 dots just if no image
            if(loadpos>loads.length - 1){ loadpos = 0; }
            return loads[loadpos++] + ' ';
        }else{ return '';}        
    }
    function put(valor){ //coloca o valor no elemento de retorno, se houver este
        if(elem_return){
            if(elem_return.nodeName.toLowerCase()=="input"){
                valor = escape(valor).replace(/\%0D\%0A/g, ""); //sumindo com o enter
                elem_return.value = unescape(valor);
            }else if(elem_return.nodeName.toLowerCase()=="select"){
				//if no have options, put in option and strip other tags
				if(valor.indexOf('<option')<0){ valor = '<option>' + valor.replace(/<\/?[^>]+>/gi, '') + '</option>' }
                if(isIE){
                	select_innerHTML(elem_return, valor.replace(/&nbsp;/g,' '));
                }else{
					select_innerHTML(elem_return, valor)
                }
            }else if(elem_return.nodeName){
                elem_return.innerHTML = valor;
            }  
        }
    }
    function periodic(){ //função executada periodicmente pra fazer animação e testar timeout
        //mensagem indicando o carregamento
        if(html_loading && elem_loading){
            elem_loading.innerHTML = html_loading + loadsAnim()
        }else if (html_loading){
            put(html_loading + loadsAnim()  )
        }else if (elem_loading){
            elem_loading.innerHTML = 'Carregando ' + loadsAnim();
        }else{
            window.status = 'Carregando ' + url_orig + loadsAnim();
        }
        
        //fazendo o contador
        timecounter++; //contador que incrementa-se a cada 1/4 de segundo
        if(timecounter/4 > timeout){ //estourou o timeout
            clearInterval(timeload); //fim do contador
            ajax.abort(); //também dispara a ajaxOnReady (no opera não dispara o ajaxonready())
            if(ajax){ ajaxOnReady() } //se o ajaxOnReady não foi chamado no abort() acima, eu chamo na mão
        }

    }
    function getAjax(){ //instancia um novo xmlhttprequest    
        //baseado na getXMLHttpObj que possui muitas cópias na net e eu nao sei quem é o autor original
        if(typeof(XMLHttpRequest)!='undefined'){return new XMLHttpRequest();}
        var axO=['Microsoft.XMLHTTP', 'Msxml2.XMLHTTP','Msxml2.XMLHTTP.6.0','Msxml2.XMLHTTP.4.0','Msxml2.XMLHTTP.3.0'];
        for(var i=0;i<axO.length;i++){ try{ return new ActiveXObject(axO[i]);}catch(e){} }
        return null;
    }
    function httpStatus(stat){ //retorna o texto do erro http
        switch(stat){
            case 0: return "Erro desconhecido de javascript. " + ajax.statusText;
            case 400: return "400: Solicitacao incompreensivel";
            case 403: case 404: return "404: Nao foi encontrada a URL solicitada " + url;
            case 405: return "405: O servidor nao suporta o metodo solicitado";
            case 500: return "Tente novamente.";
			//case 500: return "500: Erro desconhecido do servidor";
            case 503: return "503: Capacidade maxima do servidor alcancada";
            default: return "Erro HTTP " + stat + ': ' + ajax.statusText + ". Informacoes em http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html";
        }
    }
    
}

function select_innerHTML(objeto,innerHTML){
/******
* select_innerHTML - corrige o bug do InnerHTML em selects no IE
* Veja o problema em: http://support.microsoft.com/default.aspx?scid=kb;en-us;276228
* Versão: 2.3 - 04/03/2008 - By Micox - elmicox.blogspot.com
*******/

	if(!isIE){ objeto.innerHTML = innerHTML; return true; } //normal browsers

    var opt, selTemp = document.createElement("micoxselect");    
    objeto.innerHTML = ""; selTemp.id="micoxselect1";
    document.body.appendChild(selTemp);
    selTemp = document.getElementById("micoxselect1");
    selTemp.style.display="none";
    
    if(innerHTML.toLowerCase().indexOf("<option")<0){//se não é option eu converto
        innerHTML = "<option>" + innerHTML + "</option>" }
    
    //innerHTML = innerHTML.toLowerCase().replace(/<option/g,"<span").replace(/<\/option/g,"</span");
	innerHTML = innerHTML.replace(/<option/g,"<span").replace(/<\/option/g,"</span");
    selTemp.innerHTML = innerHTML;
    
    for(var i=0;i<selTemp.childNodes.length;i++){
        var spantemp = selTemp.childNodes[i];
        
        if(spantemp.tagName){    
            opt = document.createElement("OPTION");            
            if(isIE){ objeto.add(opt); }else{ objeto.appendChild(opt);  }      
            
            //getting attributes
            for(var j=0; j<spantemp.attributes.length; j++){
                var attrName = spantemp.attributes[j].nodeName;
                var attrVal = spantemp.attributes[j].nodeValue;
                if(attrVal){ try{
                        opt.setAttribute(attrName,attrVal);
                        opt.setAttributeNode(spantemp.attributes[j].cloneNode(true));
                    }catch(e){}
                }
            }
            //getting styles
            if(spantemp.style){ for(var y in spantemp.style){
                    try{opt.style[y] = spantemp.style[y];} catch(e) {}
            } }
            
            //value and text
            opt.value = spantemp.getAttribute("value");
            opt.text = spantemp.innerHTML;
            opt.selected = spantemp.getAttribute('selected'); //IE
            opt.className = spantemp.className; //IE
        }
    }    
    document.body.removeChild(selTemp); selTemp = null;
}
function getScripts(texto){ //extrai javascripts do texto e executa no documento
//Author: SkyWalker.TO do imasters/forum (pequenas alterações by Micox)
    var ini = 0;
    // loop enquanto achar um script
    while (ini!=-1){
        ini = texto.indexOf('<script', ini);
        if (ini >=0){
            ini = texto.indexOf('>', ini) + 1;
            // procura o final do script
            var fim = texto.indexOf("<\/script>", ini);
            codigo = texto.substring(ini,fim);
            // executa o script - alterado by Micox.
            var novo = document.createElement("script")
            novo.text = codigo; novo.type = 'text/javascript';
			document.body.appendChild(novo);
        }
    }
}

function getStyles(texto){
	//Parse styles on IE. Ver. 1.0 - 25/03/08 - by Micox - elmicox.blogspot.com
    var ini = 0;
    while (ini!=-1){
        ini = texto.indexOf('<style', ini);
        if (ini >=0){
            ini = texto.indexOf('>', ini) + 1;
            var fim = texto.indexOf("<\/style>", ini);
            codigo = texto.substring(ini,fim);
            // executa o style 
			var rules = codigo.split('}')
			var rule, selector, style;
			for(var i=0; i<rules.length-1 ; i++){
				rule = rules[i].split('{')
				selector = rule[0].trim()
				style = rule[1].trim()	
				document.styleSheets[document.styleSheets.length-1].addRule(selector,style)
			}
        }
    }
}

String.prototype.trim = function() {
	return this.replace(/^\s+|\s+$/g,'');
}
function selectDinamico(este_select,select_alvo,url_trata){
	//facilita a criação de selects dinamicos com ajax.
	//by Micox - elmicox.blogspot.com
	select_alvo = document.getElementById(select_alvo)
	var nparam = este_select.name ? este_select.name : este_select.id
	var val = este_select.options[este_select.selectedIndex].value
	var conc = (url_trata.indexOf('?')>=0) ? "&" : '?';
	url_trata = url_trata + conc + encodeURI(nparam) + "=" + encodeURI(val)
	//a função ajax que trata é a ajaxGo mas pode ser alterado
	ajaxGo({ url: url_trata, elem_return: select_alvo, loading: 'Carregando'})
}

function getFieldsForm(fform, fformEncode){ //pega campos do formulário e retorna a querystring correspondente
/* Autor: José Cláudio Medeiros de Lima (pequenas alterações by Micox - 28/12/07)
* url: http://forum.ievolutionweb.com/index.php?showtopic=18264
* Versão: 1.5 - 28/12/2007 - Creative Commons */
    var buff = [];
    for (var i=0; i< fform.length;i++)  {
        var campo = fform.elements[i];
        
        if((campo.type=="checkbox" || campo.type=="radio")){
            if(campo.checked==true && campo.name){
                buff.push(campo.name + "=" + encodeURI(campo.value));
            }
        }else if(campo.name){ //campos que não tenham name não vão.
            if (fformEncode=="base64") {
                buff.push(campo.name + "=" + Base64.encode(campo.value));
            } else {
                buff.push(campo.name + "=" + encodeURI(campo.value));
            }
            
        }
    }
    return buff.join("&");
}

/* Abaixo ativa a configuração via classes e target. 
   É só colocar a classe "micoxajax" nos links e forms que quer submetidos via ajax
   e indicar o alvo no target do mesmo elemento.
   Ex: <a href='site.htm' class='micoxajax' target='mydiv'>  */
function ativaMicoxAjax(){
	var links = document.getElementsByTagName('a')
	for(var i=0; i<links.length ; i++){
		if(links[i].className.search('\\bmcxgo\\b')>-1){
			links[i].onclick = function(ev){
				if(!ev) { ev = window.event }
				var params = getParamsX(this)
				ajaxGo( params )
				params = null; delete params;
				if(ev.preventDefault) { ev.preventDefault()}
				ev.returnValue=false
				return false;
			}
		}
	}
	var formas = document.getElementsByTagName('form')
	for(var i=0; i<formas.length ; i++){
		if(formas[i].className.search('\\bmcxgo\\b')>-1){
			formas[i].onsubmit = function(ev){
				if(!ev) { ev = window.event }
				var paramsf = getParamsX(this)
				ajaxGo( paramsf )
				paramsf = null; delete paramsf;
				ev.preventDefault; ev.returnValue=false
				return false;
			}
		}
	}
	function getParamsX(quem){
		var param_= {} 
		if(quem.href){ param_.url = quem.href }
		if(quem.action){ param_.form = quem }
		if(quem.target){ param_.elem_return = quem.target }
		if(quem.className.search('\\bloading\\b')>-1){ //só mensagem de loading default
			param_.loading = "Carregando"
		}
		if(quem.className.search('\\bloading\\[(.+)\\]')>-1){
			param_.loading = quem.className.match('\\bloading\\[(.+)\\]')[1]
			param_.loading = param_.loading.replace(/_/g,' ')
		}
		return param_;
	}
}
function bodyOnReady(func){
 /* call the function 'func' when DOM loaded
 Version 2.0 - by Micox - 03/03/2008 - based on Jquery bindReady
 elmicox.blogspot.com/2007/11/evento-body-onready-sem-o-uso-de-libs_14.html */
	if(document.addEventListener && navigator.appName.indexOf('Opera')<0){ //FF
		document.addEventListener( "DOMContentLoaded", func, false )
	}else if(navigator.appName.indexOf('Internet Explorer')>=0){ //IE 
		try { // by Diego Perini - http://javascript.nwbox.com/IEContentLoaded/
			document.documentElement.doScroll("left")			
		} catch( error ) {
			window['tmicoxReady'] = setTimeout( function(){ bodyOnReady(func) }, 20 );
			return
		}
		 //chegou aqui sem sair pelo return, executa e limpa timeout
		clearTimeout(window['tmicoxReady'])
		func()
	}else if(navigator.appName.indexOf('Opera')>=0){
		document.addEventListener( "DOMContentLoaded", function () {
			for (var i = 0; i < document.styleSheets.length; i++){
				if (document.styleSheets[i].disabled) {
					window['tmicoxReady'] = setTimeout( function(){ bodyOnReady(func) }, 0 )
					return
				}
			}
			clearTimeout(window['tmicoxReady'])
			func()
		}, false)
	}
}
//chamando
bodyOnReady(ativaMicoxAjax)


// adiciona evento
// ex.: addEvent(window, "load", function() {alert("Documento carregado."); }, false);

var addEvent = function(obj, evType, fn, arg){
  if (obj.addEventListener) obj.addEventListener(evType, fn, true)
  if (obj.attachEvent) obj.attachEvent("on"+evType, fn)
  
}
var objEvent = function(e) {
  if(typeof(e)=='undefined')var e=window.event
  var source=e.target?e.target:e.srcElement
  if(source.nodeType == 3)source = source.parentNode
  return source
}
/*function addEvent(object, evType, func, useCapture)
{
    if(object.addEventListener)
    {
        object.addEventListener(evType, func, useCapture);
    } else
    if(object.attachEvent)
    {
        object.attachEvent("on" + evType, func);
    }
}*/

// by Sandro
var $ = function (e) { return document.getElementById(e) }


/**
*
*  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;
	}

}
/*
String.prototype.Acento = function (e) {
     var str=this, a=["á","à","ã","â","ä","é","è","ê","ë","í","ì","î","ï","ó","ò","ô","õ","ö","ú","ù","û","ü","ç","Á","À","Ã","Â","Ä","É","È","Ê","Ë","Í","Ì","Î","Ï","Ó","Ò","Ô","Õ","Ö","Ú","Ù","Û","Ü","Ç","'"], b=["#a/#","#a\\#","#a-#","#a>#","#a:#","#e/#","#e\\#","#e>#","#e:#","#i/#","#i\\#","#i>#","#i:#","#o/#","#o\\#","#o>#","#o-#","#o:#","#u/#","#u\\#","#u>#","#u:#","#c,#","#A/#","#A\\#","#A-#","#A>#","#A:#","#E/#","#E\\#","#E>#","#E:#","#I/#","#I\#","#I>#","#I:#","#O/#","#O\\#","#O>#","#O-#","#O:#","#U/#","#U\\#","#U>#","#U:#","#C,#","#|#"],er 
	 if(e=="c"){for (var i=0;i<a.length;i++) {er=new RegExp(a[i],"g"); str = str.replace(er, b[i]);}}
	 if(e=="d"){for (var i=0;i<a.length;i++) {er=new RegExp(b[i],"g"); str = str.replace(er, a[i]);}}	 
	 return str
}

codificaAcento = function (str) {
   //if (str!="") { alert(str)
    str = str.replace(/á/g, "#a/#") 
	str = str.replace(/à/g, "#a\\#") 
	str = str.replace(/ã/g, "#a-#") 
	str = str.replace(/â/g, "#a>#") 
	str = str.replace(/ä/g, "#a:#") 
	
	str = str.replace(/é/g, "#e/#") 
	str = str.replace(/è/g, "#e\\#") 
	str = str.replace(/ê/g, "#e>#")
	str = str.replace(/ë/g, "#e:#")
	
	str = str.replace(/í/g, "#i/#")
	str = str.replace(/ì/g, "#i\\#")
	str = str.replace(/î/g, "#i>#")
	str = str.replace(/ï/g, "#i:#")
	
	str = str.replace(/ó/g, "#o/#")
	str = str.replace(/ò/g, "#o\\#")
	str = str.replace(/ô/g, "#o>#")
	str = str.replace(/õ/g, "#o-#")
	str = str.replace(/ö/g, "#o:#")
	
	str = str.replace(/ú/g, "#u/#")
	str = str.replace(/ù/g, "#u\\#")
	str = str.replace(/û/g, "#u>#")
	str = str.replace(/ü/g, "#u:#")
	
	str = str.replace(/ç/g, "#c,#")
   
    str = str.replace(/Á/g, "#A/#") 
	str = str.replace(/À/g, "#A\\#") 
	str = str.replace(/Ã/g, "#A-#") 
	str = str.replace(/Â/g, "#A>#") 
	str = str.replace(/Ä/g, "#A:#") 
	
	str = str.replace(/É/g, "#E/#") 
	str = str.replace(/È/g, "#E\\#") 
	str = str.replace(/Ê/g, "#E>#")
	str = str.replace(/Ë/g, "#E:#")

	
	str = str.replace(/Í/g, "#I/#")
	str = str.replace(/Ì/g, "#I\#")
	str = str.replace(/Î/g, "#I>#")
	str = str.replace(/Ï/g, "#I:#")
	
	str = str.replace(/Ó/g, "#O/#")
	str = str.replace(/Ò/g, "#O\\#")
	str = str.replace(/Ô/g, "#O>#")
	str = str.replace(/Õ/g, "#O-#")
	str = str.replace(/Ö/g, "#O:#")
	
	str = str.replace(/Ú/g, "#U/#")
	str = str.replace(/Ù/g, "#U\\#")
	str = str.replace(/Û/g, "#U>#")
	str = str.replace(/Ü/g, "#U:#")
	
	str = str.replace(/Ç/g, "#C,#")
	str = str.replace(/'/g, "#|#")
   //}
   return str
}

decodificaAcento = function (str) {
  if (str!="") { 
	str = str.replace(/#a\/#/g, "á") 
	str = str.replace(/#a\\#/g, "à") 
	str = str.replace(/#a-#/g, "ã") 
	str = str.replace(/#a>#/g, "â") 
	str = str.replace(/#a:#/g, "ä") 
	
	str = str.replace(/#e\/#/g, "é") 
	str = str.replace(/#e\\#/g, "è") 
	str = str.replace(/#e>#/g, "ê") 
	str = str.replace(/#e:#/g, "ë")
	
	str = str.replace(/#i\/#/g, "í")
	str = str.replace(/#i\\#/g, "ì")
	str = str.replace(/#i>#/g, "î")
	str = str.replace(/#i:#/g, "ï")
	
	str = str.replace(/#o\/#/g, "ó")
	str = str.replace(/#o\\#/g, "ò")
	str = str.replace(/#o>#/g, "ô")
	str = str.replace(/#o-#/g, "õ")
	str = str.replace(/#o:#/g, "ö")
	
	str = str.replace(/#u\/#/g, "ú")
	str = str.replace(/#u\\#/g, "ù")
	str = str.replace(/#u>#/g, "û")
	str = str.replace(/#u:#/g, "ü")
	
	str = str.replace(/#c,#/g, "ç")
	str = str.replace(/#|#/g, "'")
	
	str = str.replace(/#A\/#/g, "Á") 
	str = str.replace(/#A\\#/g, "À") 
	str = str.replace(/#A-#/g, "Ã") 
	str = str.replace(/#A>#/g, "Â") 
	str = str.replace(/#A:#/g, "Ä") 
	
	str = str.replace(/#E\/#/g, "É") 
	str = str.replace(/#E\\#/g, "È") 
	str = str.replace(/#E>#/g, "Ê") 
	str = str.replace(/#E:#/g, "Ë")
	
	str = str.replace(/#I\/#/g, "Í")
	str = str.replace(/#I\\#/g, "Ì")
	str = str.replace(/#I>#/g, "Î")
	str = str.replace(/#I:#/g, "Ï")
	
	str = str.replace(/#O\/#/g, "Ó")
	str = str.replace(/#O\\#/g, "Ò")
	str = str.replace(/#O>#/g, "Ô")
	str = str.replace(/#O-#/g, "Õ")
	str = str.replace(/#O:#/g, "Ö")
	
	str = str.replace(/#U\/#/g, "Ú")
	str = str.replace(/#U\\#/g, "Ù")
	str = str.replace(/#U>#/g, "Û")
	str = str.replace(/#U:#/g, "Ü")
	
	str = str.replace(/#C,#/g, "Ç")
	str = str.replace(/#|#/g, "'")
  }
   return str
}
*/
