/******************************************************
Arquivo para funções javascript que tenham como objetivo a navegação
e postagem de dados para o servidor.

Lista de funções:
  - addScript: Utilizado para fazer o ajax interpretar códigos HTML e Javascript.
  - deleteNode: Utilizado para remover elementos filhos de um pai.
  - postar: Posta os dados do formulário especificado.
  - postarAjax: Posta os dados do formulário especificado, através de AJAX. 

TODO:
  - Implementar fila na utilização do ajax  
******************************************************/


/******************************************************
Variável global para acesso XML
******************************************************/
var kXML = null;
if (kXML==null) {
  try {
    kXML = new ActiveXObject("Msxml2.XMLHTTP")}
  catch(e) {
    try { kXML = new ActiveXObject("Microsoft.XMLHTTP"); } 
    catch(sc) { kXML = null; }
  }
  if (!kXML && typeof XMLHttpRequest != "undefined") kXML = new XMLHttpRequest();
}
if (kXML==null)  alert(msg.errNaoSuportaXML);


/******************************************************
addScript(script: String): void 
Para utilização deste, é necessário que o elemento BODY tenha
o id "body1".
Utilizado para fazer o ajax interpretar códigos HTML e Javascript.
Sempre utilizado pela função postarAjax.
  - script: Código javascript
******************************************************/
function addScript(script){    
  deleteNode('body1');
  var codigo = ""+script.match(/([a-zA-Z0-9./_-]*.js)/g); 
  var arquivos = codigo.split(",");
  for(i=0;i<arquivos.length;i++) {
    elemento = document.createElement("script");
    elemento.setAttribute('type','text/javascript');
    elemento.setAttribute('src',arquivos[i]);
    document.body.appendChild(elemento);
  }
  extraiScript(script);
}

/******************************************************
extraiScript(texto: String): void 
Utilizado para fazer o ajax interpretar códigos Javascript
dentro de templates HTML.
Sempre utilizado pela função postarAjax.
  - texto: Texto retornado do ajax
******************************************************/
function extraiScript(texto){
  var ini = 0;
  while (ini!=-1){
    ini = texto.indexOf('<script>', ini);
    if (ini >=0){
      ini = texto.indexOf('>', ini) + 1;
      var fim = texto.indexOf('</script>', ini);
      codigo = texto.substring(ini,fim);
      novo = document.createElement("script")
      novo.text = codigo;
      document.body.appendChild(novo);
    }
  }
}

/******************************************************
deleteNode(element: String): void 
Utilizado para remover todos os elementos do tipo scritp abaixo da tag
especificada.
Sempre utilizado pela função postarAjax.
  - element: Elemento pai
******************************************************/
function deleteNode(element){
  var label=document.getElementById(element); 
  for(i=0;i<label.childNodes.length;i++) {
    if(label.childNodes.item(i).nodeName=='SCRIPT') label.removeChild(label.childNodes.item(i));
  }
}

/******************************************************
postar(frm: String, action: String, target: String, mod: String, smod: String, acao: String, cpo: String, vlr: String, popup: Boolean, width: Integer, height: Integer): void 
Posta os dados do formulário especificado. Dentro do formulário é necessário 
que se tenha 3 campos hiddens (modulo, submodulo, acao). 
  - frm: Formulário (Caso não exista, ele cria o elemento form especificado
  - action: Arquivo de destino do post
  - target: Janela de destino (padrão deve ser "_self")
  - mod: Módulo do sistema
  - smod: Submódulo do sistema
  - acao: Ação que deverá ser executada
  - cpo: Campo do formuláro
  - vlr: Valor do campo especificado no parâmetro "cpo"
  - popup: <true|false> Se o alvo da ação deve ser um Pop-Up
  - width: largura do Pop-Up
  - height: altura do Pop-Up
  - ret: <true|false> Se true, ajax não sera contado na sessão de retorno  
******************************************************/
function postar(frm,action,target,mod,smod,acao,cpo,vlr,popup,width,height,ret){
  if(popup) {
    var WindowObjectReference = null;
    if(WindowObjectReference == null || WindowObjectReference.closed) {
      WindowObjectReference = window.open('',target,'resizable=yes,width='+width+',height='+height+',status=no,scrollbars=no');
      if (WindowObjectReference.window.screen) WindowObjectReference.window.moveTo(0,0);
    } else {
      WindowObjectReference.focus();
    }    
  }
	// Caso não exista o form especificado e o browser seja IE, cria o form
  if(!document.forms[frm] && navigator.appName=="Microsoft Internet Explorer") {
  
	  var form = document.createElement('<form name="'+frm+'"></form>');	  
	  document.body.appendChild(form);

	  var input = document.createElement('<input type="hidden" name="modulo">');
	  form.appendChild(input);
	  var input = document.createElement('<input type="hidden" name="submodulo">');
	  form.appendChild(input);
	  var input = document.createElement('<input type="hidden" name="acao">');
	  form.appendChild(input);
	  
		if(cpo) {
		  var input = document.createElement('<input type="hidden" name="'+cpo+'">');
		  form.appendChild(input);
		} 
	  
  } 
  // Caso não exista o form especificado e o browser seja Mozilla/Netscape, cria o form
  else if(!document.forms[frm] && navigator.appName=="Netscape") {
  
	  var form = document.createElement('form');
	  form.setAttribute('name',frm);	  
	  document.body.appendChild(form);

	  var input = document.createElement('input');
	  input.setAttribute('type','hidden');	  
	  input.setAttribute('name','modulo');	  
	  form.appendChild(input);
	  
	  var input = document.createElement('input');
	  input.setAttribute('type','hidden');	  
	  input.setAttribute('name','submodulo');	  
	  form.appendChild(input);
	  
	  var input = document.createElement('input');
	  input.setAttribute('type','hidden');	  
	  input.setAttribute('name','acao');	  
	  form.appendChild(input);
	  
		if(cpo) {
		  var input = document.createElement('input');
		  input.setAttribute('type','hidden');	  
		  input.setAttribute('name',cpo);	  
		  form.appendChild(input);
		} 

	}

  // Quando retorno for especificado e igual a 1 ele não adiciona o post na sessão de historico de navegacao  	
  if(ret==true){ 
	  // criou o element tanto no ie 7 quanto no firefox
	  var input = document.createElement('input');
	  input.setAttribute('type','hidden');	  
	  input.setAttribute('name','retorno');	  
	  input.setAttribute('value','1');
	  document.forms[frm].appendChild(input);
 	}		

  document.forms[frm].method = 'post';
  document.forms[frm].action = action;
  document.forms[frm].target = target;
  document.forms[frm].modulo.value = mod;
  document.forms[frm].submodulo.value = smod;
  document.forms[frm].acao.value = acao;
	if(cpo)	eval("document[frm]."+cpo+".value="+vlr);  
  document[frm].submit();
}

/******************************************************
postarAjax(frm: String, action: String, local: String, mod: String, smod: String, acao: String, , cpo: String, vlr: String): void 
Posta os dados do formulário especificado, através de AJAX. 
  - frm: Formulário
  - action: Arquivo de destino do post
  - local: Local (elemento) aonde será colocado retorno. Se valor for
            vazio, significa que retorno é código js.
  - mod: Módulo do sistema
  - smod: Submódulo do sistema
  - acao: Ação que deverá ser executada
  - cpo: Campo do formuláro
  - vlr: Valor do campo especificado no parâmetro "cpo"
  - ret: <true|false> Se true, ajax não sera contado na sessão de retorno
******************************************************/
function postarAjax(frm,action,local,mod,smod,acao,cpo,vlr,ret){  
  document.frmSistema.modulo.value = mod;
  document.frmSistema.submodulo.value = smod;
  document.frmSistema.acao.value = acao;
  document.getElementById('loading').innerHTML = '<img src="images/loading.gif" border="0" align="absmiddle" width="15" height="15"> &nbsp; &nbsp; Carregando';
  document.body.style.cursor = 'wait';
  var kDados = 'modulo='+mod+'&submodulo='+smod+'&acao='+acao;
  if(ret) kDados+= '&retorno=1'; // Quando retorno for especificado e igual a 1 ele não adiciona o post na sessão de historico de navegacao
  if(cpo) kDados+= '&'+cpo+'='+vlr; 
  try {
    if (frm) {
      frm = document[frm];
      // Para cada um dos elementos do formulário
      for (var i=0;i<frm.elements.length;i++) {
        if (((frm.elements[i].type=="radio") || (frm.elements[i].type=="checkbox")) && (frm.elements[i].checked)) {
          kDados += "&"+frm.elements[i].name+"="+escape(frm.elements[i].value);
        } else if ((frm.elements[i].type!="radio") && (frm.elements[i].type!="checkbox") && (frm.elements[i].type!="button") && (frm.elements[i].type!="undefined")) {
          // Se for múltipla seleção
          if (frm.elements[i].type=="select-multiple") {
            for (var z=0;z<frm.elements[i].options.length;z++){
              if ((frm.elements[i].options[z].selected) && (frm.elements[i].options[z].value.trim()!="Null")) kDados += "&"+frm.elements[i].name+"="+frm.elements[i].options[z].value;
            }
          } else {
            if (frm.elements[i].name!='modulo' && frm.elements[i].name!='submodulo' && frm.elements[i].name!='acao' && frm.elements[i].name!=cpo) kDados += "&"+frm.elements[i].name+"="+escape(frm.elements[i].value);
          }
        }
      }
    }       
    kXML.open('post',action,true);
    kXML.onreadystatechange = function() {
	   	if (kXML.readyState==4) {
				var xHTML = kXML.responseText;
				//alert(xHTML);
        if(local=='') eval(xHTML);        
        else {
          var html = xHTML;
          var pHTML = html.replace("'","\'");
          var spanElement = document.getElementById(local);
          try {
          	spanElement.innerHTML = pHTML;
	      }
	      catch (e) {
	        // IE fails unless we wrap the string in another element.
	        spanElement.innerHTML = '';
	        var wrappingElement = document.createElement('div');
	        wrappingElement.innerHTML = pHTML;
	        spanElement.appendChild(wrappingElement);
	      }
          //document.getElementById(local).innerHTML = pHTML;
          addScript(xHTML);
        }
        document.getElementById('loading').innerHTML = '';
        document.body.style.cursor = 'default';
				return;
			}
		}
		kXML.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
		kXML.send(kDados);
  } catch (e) {	  
	postarAjax('', 'index.ajax.php', 'app_conteudo', '01_publica', '01.home', 'Home');    
  }  
}