/**** VALIDAR DATA *************************************************************************************************************/
function isDate(dateStr) {
	var datePat = /^(\d{1,2})(\/|-)(\d{1,2})(\/|-)(\d{4})$/;
	var matchArray = dateStr.match(datePat); // is the format ok?
	
	if (dateStr != '') {
		if (matchArray == null) {
			alert("Data inválida.");    
			return false;
		}
		
		day = matchArray[1]; // parse date into variables
		month = matchArray[3];
		year = matchArray[5];
	
		if (month < 1 || month > 12) { // check month range
			alert("Data inválida.");
			return false;
		}
		
		if (day < 1 || day > 31) {
			alert("Data inválida.");
			return false;
		}
		
		if ((month==4 || month==6 || month==9 || month==11) && day==31) {
			alert("Data inválida.")
			return false;
		}
		
		if (month == 2) { // check for february 29th
			var isleap = (year % 4 == 0 && (year % 100 != 0 || year % 400 == 0));
			if (day > 29 || (day==29 && !isleap)) {
				alert("Data inválida.");
				return false;
			}
		}
	}
	return true; // date is valid
}

/*** IMPLEMENTAÇÃO AJAX ********************************************************************************************************/
/*** COMO UTILIZAR **************************************************************************************************************
var oAjax = new AjaxObject(); //Instanciando o objeto
oAjax.url = [página que se deseja executar no server];
oAjax.tagid_repositorio = [ID do objeto onde se deseja visualizar o resultado];
oAjax.tipo_retorno = [Enumeração: 
											- oAjax.eTipoRetorno.BODY (retorna todo o conteúdo da tag BODY)
											- oAjax.eTipoRetorno.PAGINA (retorna todo o conteúdo da página)
										 ];
oAjax.assincrono = [indica se o envio será assíncrono. Se sim, a página que enviou não aguarda o retorno da página enviada];
oAjax.exibeLoad = [indica se será exibida alguma imagem de carregamento.];
oAjax.executar(); //Envia a página ao servidor com os parâmetros especificados e obtem o retorno
oAjax.retornoHTML(); //Retorna o HTML processado da página enviada ao servidor (Obs.: não esqueça dos parenteses)
oAjax.getElementById([ID]); //Obtem o elemento do retorno de acordo com o ID passado. Funciona similar ao método getElementById() tradicional.
********************************************************************************************************************************/
function AjaxObject() {
	/* DECLARAÇÃO DE ENUMS LOCAIS */
	var _eSituacao = {
		NAO_INICIAL: 0, //A solicitação não foi inicializada ainda
		EM_CONFIG  : 1, //A solicitação está sendo configurada
		ENVIANDO   : 2, //A solicitação está sendo enviada
		EM_PROCESS : 3, //A solicitação está em processo
		COMPLETA   : 4  //A solicitação foi completada
	};
	var _eTipoRetorno = {
		PAGINA: 0, //Retorna a página inteira (não recomendado pois pode embutir a tag BODY na tag BODY)
		BODY  : 1 //Retorna exatamente o conteúdo da tag BODY (recomendado)
	};
	
	/* DECLARAÇÃO DE VARIAVEIS LOCAIS */
	var _prompt_titulo = "AJAX Erro:\n";
	var _url = "";
	var _tagid_repositorio = "";
	var _tipo_retorno = _eTipoRetorno.BODY;
	var _status = _eSituacao.EM_PROCESS;
	var _exibeLoad = true;
	var _assincrono = true;
	var _retornoHTML = "";
	var _element = {tagname:null, id:null, name:null, value:null, text:null};
	var _oXmlDom;
	
	/* DECLARAÇÃO DE PROPRIEDADES */
	this.eSituacao = _eSituacao;
	this.eTipoRetorno = _eTipoRetorno;
	this.url = "";
	this.tagid_repositorio = "";
	this.exibeLoad = _exibeLoad;
	this.tipo_retorno = _eTipoRetorno.BODY;
	this.assincrono = _assincrono;
	//Resgata o retorno
	this.retornoHTML = function(){return _retornoHTML;}
	//Resgata um elemento do retorno de acordo com o seu ID
	this.obterElementoPorId = function(id){
		_element.tagname = null;
		_element.id = null;
		_element.name = null;
		_element.value = null;
		_element.text = null;
		try{
			if (_oXmlDom){
				findIDXmlDomNodes(id, _oXmlDom.getElementsByTagName("body")[0].childNodes);
			}
		}catch(ex){
			alert(_prompt_titulo+"Provavelmente a página de retorno não está preparada para trabalhar com XmlDom.\nAdapte a página de acordo com as regras de um documento XML.\nPro exemplo, verifique se todas as tags estão fechadas.\n\nXMLDOM Erro:\n"+ex.message);
		}
		return _element;
	}
	
	/* DECLARAÇÃO DE MÉTODOS: procedimentos e/ou funções, públicas e/ou privadas*/
	//Itera pelos nós do XmlDom e localiza o elemento pelo seu ID
	var findIDXmlDomNodes = function(id, nodes){
		for(var i=0;i<nodes.length;i++){
			node = nodes[i];
			if(node.nodeType==1){
				if(id==node.getAttribute("id")){
					_element.id = id;
					
					if(node.getAttribute("type")){
						_element.tagname = ""+node.tagName+":"+node.getAttribute("type");
					}else{
						_element.tagname = ""+node.tagName;
					}
					
					if(node.getAttribute("name")){
						_element.name = ""+node.getAttribute("name");
					}else{
						_element.name = ""+node.nodeName;
					}
					
					if(node.getAttribute("value")){
						_element.value = ""+node.getAttribute("value");
					}else{
						_element.value = ""+node.nodeValue;
					}
					
					if(node.text!=null){
						_element.text = ""+node.text;
					}else{
						_element.text = ""+node.textContent;
					}
					
					break;
				}
				if(node.childNodes){
					findIDXmlDomNodes(id, node.childNodes);
				}
			}
		}
	}
	
	//Carrega o retorno para um objeto XMLDOM de manipulação
	var loadXmlDomObject = function(strRetorno){
		_oXmlDom = null;
		try {//Internet Explorer
			_oXmlDom=new ActiveXObject("Microsoft.XMLDOM");
			_oXmlDom.async="false";
			_oXmlDom.loadXML(strRetorno);
		}catch(e){
			try {// Firefox, Mozilla, Opera, etc.
				var parser = new DOMParser();
				_oXmlDom=parser.parseFromString(strRetorno,"text/xml");
			}catch(e){
				alert(_prompt_titulo+"Não foi possível carregar o XMLDOM do retorno. Utilize o método 'retornoHTML' para analisar o resultado.\n\nXMLDOM Erro:\n"+e.message);
			}
		}
	}	
	
	//Trata o retorno do servidor
	var tratarRetorno = function(strRetorno){
		switch (_tipo_retorno){
			case _eTipoRetorno.PAGINA:
				break;
			case _eTipoRetorno.BODY:
				var tag_body_open_pos1 = strRetorno.search(/<body/i);
				var tag_body_open_pos2 = strRetorno.indexOf(">",tag_body_open_pos1)+1;
				var tag_body_close = strRetorno.search(/<\/body>/i)-1;
				strRetorno = strRetorno.substring(tag_body_open_pos2,tag_body_close);
				break;
		}
		return strRetorno;
	}
	
	//"Roda" a página no servidor e retorna o resultado
	var run = function(){
		var r = false;
		
		try{
			// Firefox, Opera 8.0+, Safari
			var oXmlHttp = new XMLHttpRequest();
		}catch (e){
			// Internet Explorer
			try{
				var oXmlHttp = new ActiveXObject("Msxml2.XMLHTTP");
			}catch (e){
				try{
					var oXmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
				}catch (e){
					alert(_prompt_titulo+"Seu browser não suporta esta tecnologia!");
					var oXmlHttp = null;
				}
			}
		}
		
		if(oXmlHttp){
			oXmlHttp.onreadystatechange=function(){
				if(oXmlHttp.readyState==_eSituacao.COMPLETA){
					_retornoHTML = oXmlHttp.responseText;
					//Carrega o XMLDOM do retorno
					try{loadXmlDomObject(_retornoHTML);}catch (e){}
					//Trata o retorno
					_retornoHTML = tratarRetorno(_retornoHTML);
					
					if(_tagid_repositorio != ""){
						document.getElementById(_tagid_repositorio).innerHTML = _retornoHTML;
					}
					_status = _eSituacao.COMPLETA;
					r = true;
				}
			}
			oXmlHttp.open("GET",_url,_assincrono);
			oXmlHttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8")
			oXmlHttp.send(null);
		}
		return r;
	}
	
	this.executar = function(){
		try{
			_url = this.url;
			_tagid_repositorio = this.tagid_repositorio;
			_tipo_retorno = this.tipo_retorno;
			_assincrono = this.assincrono;
			_exibeLoad = this.exibeLoad;
			
			if(_tagid_repositorio != "" && _exibeLoad){
				document.getElementById(_tagid_repositorio).innerHTML = '<img src="/atendimento/images/ajax-loader.gif" width="16" height="16" />';
			}
			
			if(_url==""){
				alert(_prompt_titulo+"Não existe página para processar!");
			}else{
				if(_url.search(/\?/i)==-1){
					_url += "?";
				}else{
					_url += "&";
				}
				var d = new Date();
				_url += "t="+d.getHours()+d.getMinutes()+d.getSeconds()+d.getMilliseconds();
				return run();
			}
		}catch(err){
			alert(_prompt_titulo+"\n"+err.description);
			return null;
		}
	}
}
/*******************************************************************************************************************************/

