// --------------------------------------------------------
// Front End para o component XMLDoc
// Copyright Undratec 2007
//
// Autor:  Allyson Francisco de Paula
// Versao: 1.1

var req				 = new Array();
var ended			 = new Array();
var instances		 = 0;
var container        = new Array(); // Objeto HTML default que receberá a resposta.
var virtualHistory   = new Array();
var virtualTarget    = new Array();

var messages         = new Array();

messages[0] = '<img src="/images/LoadingProgressBar.gif" width="65" height="13" border="0" align="absmiddle">';
messages[1] = "Houve um erro ao processar sua requisição:\n";
messages[3] = "Objeto não encontrado";
messages[4] = "Por favor atualize o seu browser, a sua versão não é suportado por essa página";

/**
 * Carrega um novo documento XML da url especificada no innerHTML de
 * container.
 * @param string url, function callback
 */
function loadXMLDoc(url, callback, method, vars)  
{ 
	if ((method != 'GET') && (method != 'POST')) {
		method = 'GET';
	}
	
	req[instances] = null;
	
	if (!callback) {
		callback = processReqChange;
	}

    // branch for native XMLHttpRequest object
    if(window.XMLHttpRequest) {
    	try {
			req[instances] = new XMLHttpRequest();
        } catch(e) {
			req[instances] = false;
        }
    // branch for IE/Windows ActiveX version
    } else if(window.ActiveXObject) {
       	try {
        	req[instances] = new ActiveXObject("Msxml2.XMLHTTP");
      	} catch(e) {
        	try {
          		req[instances] = new ActiveXObject("Microsoft.XMLHTTP");
        	} catch(e) {
          		req[instances] = false;
        	}
	}
    }


	if(req[instances]) {

		//alert(req);
		//alert(callback);
		
		req[instances].onreadystatechange = callback;
		req[instances].open(method, url, true);
		//req[instances].target = 'teste';
       		//req.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded; charset=ISO-8859-1');
			
			//alert(url);

			req[instances].setRequestHeader("Cache-Control", "no-store, no-cache, must-revalidate");
			req[instances].setRequestHeader("Cache-Control", "post-check=0, pre-check=0");
			req[instances].setRequestHeader("Pragma", "no-cache");
       		req[instances].setRequestHeader('Content-Type', 'application/x-www-form-urlencoded; charset=iso-8859-1');

		if (method == 'POST') {
			req[instances].setRequestHeader("Method", "POST " + url + "HTTP/1.1");
			req[instances].send(vars);
		} else {
			req[instances].send(null);
		}
	} else {
		alert(messages[4]);
	}
	
	instances++;

} 

/**
 * Slot para o tratamento de eventos do componente XMLDoc. Pega
 * os estados de conexao e faz seu devido tratamento (como escrever
 * o resultado da transferencia no seu respectivo alvo.
 * @param void
 * @return void
 */

function findState(state)
{
	for (_tmp = 0; _tmp < req.length; _tmp++) {
		if (req[_tmp] != undefined) {
			if ((req[_tmp].readyState == state) && (!ended[_tmp])) {
				return _tmp;
			}
		}
	}	
	return -1;
}

function processReqChange() 
{ 
    // apenas quando o estado for "completado" 
	_idx = findState(4);
    if (_idx != -1) { 
        // apenas se o servidor retornar "OK" 
        if ((req[_idx].status == 200) || (req[_idx].status == 0)) { 
            // procura pela div id="news" e insere o conteudo 
            // retornado nela, como texto HTML 
			ended[_idx] = true;
            Ref(container[_idx], req[_idx].responseText);
			
			jsCodePattern = new RegExp("<script[^>]*>(.*?)</script>", "mig");
			
			jsDataCode    = stripExtendedWhitespace(req[_idx].responseText);
			
			results = jsDataCode.match(jsCodePattern);

			if (results) {
			
				var response = new String();
				for(var i =0; i < results.length; i++) {
					response += results[i];
				}
				
				//alert(stripJsTags(response));
				eval(stripJsTags(response));
			
			}
			//document.write(req.responseText);
			//eval(req.responseText);
			req[_idx] = null;
			ended[_idx] = null;
        } else if (req[_idx].statusText != '') { 
            alert(messages[1] + req[_idx].statusText); 
        } 
    } 
} 

/**
 * @nota Precisa-se melhorar a expressao regular de busca dos blocos
 * de código javascript
 */
function stripJsTags(str)
{
	//while(str != str.replace(/(<script[^>]*>|<\/script>)+/, ' ')) {
		str = str.replace(/(<script[^>]*>|<\/script>)+/g, ' ');
	//}
	//while(str != str.replace(/(<SCRIPT[^>]*>|<\/SCRIPT>)+/, ' ')) {
		str = str.replace(/(<SCRIPT[^>]*>|<\/SCRIPT>)+/g, ' ');
	//}
    return str;
}

function stripExtendedWhitespace(str)
{
	//while(str != str.replace(/(\r\n|\n|\r)+/, ' ')) {
		str = str.replace(/(\r\n|\n|\r)+/g, ' ');
	//}
    return str;
}


function load(param, target, method, vars)
{

	if ((method != 'GET') && (method != 'POST')) {
		method = 'GET';
	}

	// Historico de navegacao
	//var i;
	//for (i = 5; i; i--) {
	//	virtualHistory[i] = virtualHistory[i - 1];
	//} 
	virtualHistory.push(param);
	virtualTarget.push(target);

	Ref(target, messages[0]);
	
	
	if (!target)
		container.push('container');
	else
		container.push(target);
		
		//alert(param);
		//alert(target);
		//alert(method);
		//alert(vars);
	
    loadXMLDoc(param, processReqChange, method, vars);

}

/**
 * Emulacao do back history para o flash e componente XMLDoc 
 * @param void
 * @return void
 */
function virtualBack()
{
	// Dropa da pilha do historico a pagina atual carregada por load
	virtualTarget.pop();
	virtualHistory.pop();

	// Pega a pagina anterior, item do topo da pilha
	param = virtualHistory.pop();

    if (param) {

		//container = ;
	
        load(param, virtualTarget.pop());

		/*

		for (i = 0; i < 5; i++) {
			virtualHistory[i] = virtualHistory[i + 1];
			//historico_fLoad[i] = historico_fLoad[i + 1];
		} 
		for (i = 0; i < 5; i++) {
			virtualHistory[i] = virtualHistory[i + 1];
			//historico_fLoad[i] = historico_fLoad[i + 1];
		} 
		virtualHistory[5] = false;
		//historico_fLoad[5] = false;
		*/
	} //else {
	//	load('index', true);
	//}
}

/**
 *
 */
function getXML(header, field)
{
	obj = document.getElementsByName(field);
	xml = new String();

	if (obj) {
		for (i = 0; i < obj.length; i++) {
			if (obj[i].type == "checkbox") {
				if (obj[i].status) {
					xml += '<'+field.replace('[]', '')+'>'+EscapeText(obj[i].value,'text')+'</'+field.replace('[]', '')+'>';
				} else {
					xml += '<'+field.replace('[]', '')+'>0</'+field.replace('[]', '')+'>';				
				}
			} else {
				xml += '<'+field.replace('[]', '')+'>'+EscapeText(obj[i].value,'text')+'</'+field.replace('[]', '')+'>';
			}
		}
	} 

	return '<'+header+'>'+xml+'</'+header+'>';

}

function getFormData(form_id) {
	var Form = document.getElementById(form_id);
	var data = new Array();
	for(i = 0; i < Form.elements.length; i++) {
		if (checkObjData(Form.elements[i])) {
			data[data.length] = checkObjData(Form.elements[i]);
		}
	}
	return data.join('&');
}

function checkObjData(obj)
{
	switch(obj.type) {
		case 'radio':
			if (obj.checked) 
				return obj.name+'='+encodeURIComponent(obj.value);
			else 
				return '';

		case 'checkbox':
			if (obj.checked)
				return obj.name+'='+encodeURIComponent(obj.value);
			else
				return '';

		default:
			return obj.name+'='+encodeURIComponent(obj.value);
	}
}

