/**** 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
}

/**** VALIDAR E-MAIL *************************************************************************************************************/
function isEmail(str) {
	return (str.search(/^\w+((-\w+)|(\.\w+))*\@[A-Za-z0-9]+((\.|-)[A-Za-z0-9]+)*\.[A-Za-z0-9]+$/) != -1);
}
/*******************************************************************************************************************************/

/*** 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 o código HTML de carregamento será exibido.];
oAjax.htmlCarregando = [armazena o código HTML que será exibido enquanto a página é processada, se a propriedade exibeLoad for igual a true.];
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 */
	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 _htmlCarregando = '<div><img src="/atendimento/images/ajax-loader.gif" width="16" height="16" />Aguarde, processando...</div>'; //"<div>Aguarde, processando...</div>";
	var _assincrono = true;
	var _retornoHTML = "";
	var _element = {tagname:null, id:null, name:null, value:null, text:null};
	var _oXmlDom;
	var _metodo = "GET";
	
	/* DECLARAÇÃO DE PROPRIEDADES */
	this.eSituacao = _eSituacao;
	this.eTipoRetorno = _eTipoRetorno;
	this.url = "";
	this.tagid_repositorio = "";
	this.exibeLoad = _exibeLoad;
	this.htmlCarregando = _htmlCarregando;
	this.tipo_retorno = _eTipoRetorno.BODY;
	this.assincrono = _assincrono;
	this.metodo = _metodo;
	
	/* DECLARAÇÃO DE MÉTODOS: procedimentos e/ou funções, públicas e/ou privadas*/
	//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;
	}

	//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){}
					
					//alert(_retornoHTML);
					
					//Trata o retorno
					_retornoHTML = tratarRetorno(_retornoHTML);
					
					//alert(_retornoHTML);
					
					if(_tagid_repositorio != ""){
						document.getElementById(_tagid_repositorio).innerHTML = _retornoHTML;
					}
					_status = _eSituacao.COMPLETA;
					r = true;
				}
			}
			oXmlHttp.open(_metodo,_url,_assincrono);
			oXmlHttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8")
			oXmlHttp.send(null);
		}
		return r;
	}
	
	//"Executa" tudo
	this.executar = function(){
		try{
			_url = this.url;
			_tagid_repositorio = this.tagid_repositorio;
			_tipo_retorno = this.tipo_retorno;
			_assincrono = this.assincrono;
			_exibeLoad = this.exibeLoad;
			_htmlCarregando = this.htmlCarregando;
			_metodo = this.metodo;
			
			if(_tagid_repositorio != "" && _exibeLoad){
				document.getElementById(_tagid_repositorio).innerHTML = _htmlCarregando;
			}
			
			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;
		}
	}
}
/*******************************************************************************************************************************/
/*** IMPLEMENTAÇÃO DE JANELA DINÂMICA ******************************************************************************************/
/*** COMO UTILIZAR **************************************************************************************************************
var oWin = WindowObject([titulo], [conteudo]);
// Cria e insere uma janela (DIV) na página atual com título e conteúdo, onde:
   - titulo: texto exibido no topo da "janela"
	 - conteudo: url da página que será carregada na janela. Neste caso será utilizado um iframe para exibir a página
********************************************************************************************************************************/
function WindowObject(titulo, conteudo){
	var d = new Date();
	var id = "Win"+d.getHours()+d.getMinutes()+d.getSeconds()+d.getMilliseconds();
	var oDiv = document.createElement("div");
	var strHtmlWin = "";
	
	oDiv.className = "effectDialog";
	oDiv.id = "div"+id;
	strHtmlWin = '<div id="'+oDiv.id+'" class="clsWindowCustom" style="display: block;">';
	strHtmlWin += '<div id="divTitulo"><div style="float:left; height: 100%; vertical-align: middle;">'+titulo+'</div><div id="divFechar" onclick="javascript: document.getElementById(\''+oDiv.id+'\').style.display=\'none\';"></div></div>';
	strHtmlWin += '<iframe allowtransparency="yes" frameborder="0" id="fra'+id+'" name="fra'+id+'" scrolling="auto" src="'+conteudo+'" style="width: 100%; height: 100%;">Aguarde carregando...</iframe>';
	strHtmlWin += '</div>';
	oDiv.innerHTML = strHtmlWin;
	document.body.appendChild(oDiv);
	
	return oDiv;
}
/*******************************************************************************************************************************/
/*******************************************************************************************************************************/
/*** IMPLEMENTAÇÃO GERAL DE OBJETO ***************************************************************************************************/
/*** COMO UTILIZAR **************************************************************************************************************
ocultarexibirElemento([ID],[ID_FOCUS]);
// Manipula a propriedade de estilo chamada "display" para exibir ou não um objeto
// [ID] = ID do objeto a ser manipulado
// [ID_FOCUS] = ID do objeto que receberá o foco 
********************************************************************************************************************************/
function ocultarexibirElemento(id_elemento, id_focus){
	try{
		var _element = document.getElementById(id_elemento);
		_element.style.display = (_element.style.display == "none")? "block": "none";
		var _element_focus = document.getElementById(id_focus);
		if(_element_focus){_element_focus.focus();}
	}catch(e){}
}
/*******************************************************************************************************************************/
/*** IMPLEMENTAÇÃO VALIDAÇÃO DE FORMULÁRIO *************************************************************************************/
/*** COMO UTILIZAR **************************************************************************************************************
	??????????????????
********************************************************************************************************************************/
function validarForm(idfrm){
	var n = 0, ctrl, retorno = true, msg = "";
	var frm = document.getElementById(idfrm);

	for(n = 0; n < frm.length; n++){
		ctrl = frm.elements[n];
		if(ctrl.id != undefined){
			var req = (ctrl.getAttribute('requerido') ? ctrl.getAttribute('requerido').toLowerCase() : 'false');
			var tipo = (ctrl.getAttribute('tipo') ? ctrl.getAttribute('tipo').toLowerCase() : ctrl.getAttribute('type').toLowerCase());
			var nome = (ctrl.getAttribute('title') ? ctrl.getAttribute('title').toString() : ctrl.getAttribute('name').toString());
			var invalidValue = (ctrl.getAttribute('invalidvalue') ? ctrl.getAttribute('invalidvalue').toString() : '');
			var qtdeSelCheck = (ctrl.getAttribute('qtdeselcheck') ? ctrl.getAttribute('qtdeselcheck').toString() : '1');
			var vlrMin = (ctrl.getAttribute('vlrmin') ? ctrl.getAttribute('vlrmin') : null);
			var vlrMax = (ctrl.getAttribute('vlrmax') ? ctrl.getAttribute('vlrmax') : null);
			
			if(req=="true"){
				//alert("id="+ctrl.id+"\ntipo="+tipo+"\ntype="+ctrl.type);
				switch(tipo){
					case "textarea":
						vlrCtrl = ctrl.value;
						if(vlrCtrl=="") vlrCtrl = ctrl.innerHTML;
						if(vlrCtrl==""){msg = "O campo '"+nome+"' é requerido!";}
						//alert(vlrCtrl);
						break;
					case "text":
					case "texto":
						if(ctrl.value==""){msg = "O campo '"+nome+"' é requerido!";}
						break;
					case "select-one":
						if(ctrl.options[ctrl.selectedIndex].value==invalidValue){msg = "O campo '"+nome+"' é requerido!";}
						break;
					case "num":
						vlrMin = (isNaN(vlrMin)||(vlrMin==null) ? null : parseFloat(vlrMin));
						vlrMax = (isNaN(vlrMax)||(vlrMax==null) ? null : parseFloat(vlrMax));
						vlrCtrl = (isNaN(ctrl.value) ? null : parseFloat(ctrl.value));
						if(vlrCtrl==null || ctrl.value==""){
							msg = "Digite um valor válido para o campo '"+nome+"'!";
						}else{
							if(vlrMin != null && vlrMax != null){
								if(!(vlrCtrl >= vlrMin && vlrCtrl<=vlrMax)){
									msg = "Digite um valor entre "+vlrMin.toString().replace(".",",")+" e "+vlrMax.toString().replace(".",",")+" para o campo '"+nome+"'!";
								}
							}else if(vlrMin != null){
								if(!(vlrCtrl >= vlrMin)){
									msg = "Digite um valor maior ou igual a "+vlrMin.toString().replace(".",",")+" para o campo '"+nome+"'!";
								}
							}else if(vlrMax != null){
								if(!(vlrCtrl <= vlrMin)){
									msg = "Digite um valor menor ou igual a "+vlrMax.toString().replace(".",",")+" para o campo '"+nome+"'!";
								}
							}
						}
						break;
					case "checkbox":
						qtdeSelCheck = (isNaN(qtdeSelCheck) ? 1 : parseInt(qtdeSelCheck));
						qchk = 1;
						for(ochk in ctrl){
							if(ochk.checked){qchk += 1;}
						}
						if(qchk < qtdeSelCheck){
							msg = "Você deve selecionar pelo menos "+qtdeSelCheck+" item do campo '"+nome+"'!";
						}
						break;
					case "radio":
						chk = false;
						for(ochk in ctrl){if(ochk.checked){chk = true;}}
						if(!chk){msg = "O campo '"+nome+"' é requerido!";}
						break;
					case "email":
						if(!isEmail(ctrl.value)){msg = "O campo '"+nome+"' deve ter um e-mail!";}
						break;
					case "datetime":
						if(!isDate(ctrl.value)){msg = "Digite uma data válida no campo '"+nome+"'!";}
						break;
				}
				if(msg!=""){
					alert(msg);
					ctrl.focus();
					retorno = false;
					break;
				}
			}
		}
	}
	//alert("retorno="+retorno);
	return retorno;
	//return false;
}
/*******************************************************************************************************************************/
/*** MONTA UMA QUERY STRING DOS CAMPOS DE UM FORMULARIO AUXILIANDO NO POST DO MESMO VIA AJAX ***********************************/
/*** COMO UTILIZAR **************************************************************************************************************
	??????????????????
********************************************************************************************************************************/
function FormToQueryString(frm) {
	var getstr = "", fld, type, cbo;
	for(i = 0; i < frm.length; i++){
		fld = frm.elements[i];
		type = fld.getAttribute('type').toLowerCase();
		
		switch(type){
			case "textarea":
			case "text":
				getstr += fld.name + "=" + fld.value + "&";
				break;
			case "checkbox":
			case "radio":
				if (fld.checked) {
					getstr += fld.name + "=" + fld.value + "&";
				} else if (type == "checkbox") {
					getstr += fld.name + "=Não&";
				}
				break;
			case "select-one":
				getstr += fld.name + "=" + fld.options[fld.selectedIndex].value + "&";
				break;
		}
	}
	//alert(getstr.replace(/&/ig,'&\n'));
	return getstr.substring(0, (getstr.length - 1));
}
/*******************************************************************************************************************************/
