/************************************************************************************************
*					Javascript Ajax Management class for Waver 1.0		   						* 
*  																								*
*																								*
*  call like: Waver_ajaxRequest(url, success_func, error_func, xmlMode, method, data)			*
*  																								*
*  where:																						*
*  url='http://www.domain.com/app.php' or url='apps/app.php' - the url your calling				*
*  success_fun='my_success_function("a string", true, 12)'   - function to execute on success	*
*  error_func='alert("Error: "+Waver_xmlhttp.responseText)'  - function to execute on error		*
*  xmlMode=true/false										 - true= xml on						*
*  method="GET" or "POST"									 - url call method					*
*  data="var1=value1&var2=value2&var3=value3"				 - data string to send				*
************************************************************************************************/

var Waver_xmlhttp=null; //objecto de request
var Waver_ajaxState=null; //verificacao de estado do request
var Waver_ajaxResponse=null;  //resposta final para utilizacao nas funcoes externas
var Waver_ajaxRequestList = new Array(); //lista de pedidos dinamica
var Waver_currentRequest = new Array(); //detalhes do pedido actual

//Executa requests
function Waver_ajaxRequest(){
	Waver_ajaxRequestList.push(Waver_getAjaxArray(arguments));
}
//Redirecciona requests
function Waver_ajaxRedirect(){
	Waver_currentRequest=Waver_getAjaxArray(arguments);
	//alert(Waver_currentRequest);
	Waver_loadXMLDoc();
}
//'Arranja' array de request
function Waver_getAjaxArray(array){
	args=new Array();
	for(i=0; i<array.length && i<6; i++){
		args[i]=array[i];
	}
	
	reTxt = new RegExp('(.*?)\\?(.*?)');
	randomNum=Math.floor(Math.random()*100000);
	if(args[0].match(reTxt)){
		args[0].replace(reTxt, '$1?Waver_randNum='+randomNum+'&$2');
	} else {
		args[0]=args[0]+'?Waver_randNum='+randomNum;
	}
	//alert(args[0]);
	if (i<3){ 
		alert('Missing Waver_ajaxRequest() arguments. "arguments.lenght='+array.length)
		return;
	} 
	if (i<4)
		args[3]=false; //xmlMode Off (default)
	if (i<5)
		args[4]="GET"; //method GET (default)
	if (i<6)
		args[5]=null; //post_data null (default)
		
	return args;
}


//initialization & update functions
function Waver_initializeAjax(){		
	setInterval('Waver_manageAjax()', 500);
}
//funcao de update
function Waver_manageAjax(){
	if (Waver_ajaxState==false){
		return;
	} else if(Waver_ajaxState==null && Waver_xmlhttp==null){
		if (Waver_ajaxRequestList.length!=0){
			Waver_currentRequest=Waver_ajaxRequestList.shift();
			Waver_ajaxResponse=null;
			Waver_loadXMLDoc();
			//cria novo request
		} 
	} else if (Waver_ajaxState==true){
		
		//verifica erros
		reTxt = new RegExp('^ *Waver_ajaxError::"(.*?)" *$');
		error=Waver_xmlhttp.responseText.replace(reTxt, "$1");
		if(error!='' && error!=Waver_xmlhttp.responseText){
			//executa funcao de erro
			Waver_ajaxResponse=error;
			eval(Waver_currentRequest[2]);
		} else {
			//verifica redirects
			reTxt = new RegExp('^ *Waver_ajaxRedirect::"(.*?)" *$');
			redirect=Waver_xmlhttp.responseText.replace(reTxt, "$1");
			if(redirect!='' && redirect!=Waver_xmlhttp.responseText){
				//cria novo request
				//alert('redirecting');
				Waver_ajaxState=false;
				eval('Waver_ajaxRedirect('+redirect+')');
				return;
			}
			
			Waver_ajaxResponse=Waver_currentRequest[3]?Waver_xmlhttp.responseXML:Waver_xmlhttp.responseText;
			eval(Waver_currentRequest[1]);
		}
		Waver_currentRequest=new Array();
		Waver_xmlhttp=null;
		Waver_ajaxState=null;
	}
}

//funcoes do objecto de request	
function Waver_loadXMLDoc(){
	Waver_xmlhttp=null;
	Waver_ajaxState=false;
	var msxmlhttp = new Array(
				'Msxml2.XMLHTTP.5.0',
				'Msxml2.XMLHTTP.4.0',
				'Msxml2.XMLHTTP.3.0',
				'Msxml2.XMLHTTP',
				'Microsoft.XMLHTTP');
	for (var i = 0; i < msxmlhttp.length; i++) {
		try {
			Waver_xmlhttp = new ActiveXObject(msxmlhttp[i]);
		} catch (e) {
			Waver_xmlhttp = null;
		}
	}
 			
	if(!Waver_xmlhttp && typeof XMLHttpRequest != "undefined")
		Waver_xmlhttp = new XMLHttpRequest();
	
	if (!Waver_xmlhttp){
		Waver_xmlhttp=new function(){
			this.responseText='Waver_ajaxError::"Could not load Ajax Request Object"';
		}
	}
	Waver_xmlhttp.onreadystatechange=Waver_xmlhttp_state_Change;
	Waver_xmlhttp.open(Waver_currentRequest[4], Waver_currentRequest[0], true);
	if (Waver_currentRequest[4] == "POST") {
		Waver_xmlhttp.setRequestHeader("Method", "POST " + Waver_currentRequest[0] + " HTTP/1.1");
		Waver_xmlhttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
	}
	Waver_xmlhttp.setRequestHeader('If-Modified-Since', 'Wed, 15 Nov 1995 00:00:00 GMT');
	Waver_xmlhttp.send(Waver_currentRequest[5]);
}
//mudanca de estado
function Waver_xmlhttp_state_Change(){
	if (Waver_xmlhttp.readyState != 4 && Waver_xmlhttp.readyState!="complete"){
		return;
	}
	if (Waver_xmlhttp.status!=200){
		if(Waver_xmlhttp.statusText=='OK'){
			text='File \''+Waver_currentRequest[0]+'\' File Not Found';
		} else {
			text=Waver_xmlhttp.statusText;
		}
		Waver_xmlhttp=new function(){
			this.responseText='Waver_ajaxError::"Request Failed: '+text+'"';
		}
	}
	Waver_ajaxState=true;
}
Waver_addOnLoad(Waver_initializeAjax);