/*********************************SOMAI TOOL-KIT***********************************/


/**********************************************************************************/
/***                            OBTEM ELEMENTO PELO ID                          ***/
/**********************************************************************************/
var $ID = function (id) { return document.getElementById(id) }


/**********************************************************************************/
/***     VARRE A ARVORE XHTML A PARTIR DO [node] PASSADO, EXECUTANDO [func]     ***/ 
/***     E PASSANDO O NODE ATUAL COMO ARGUMENTO PARA CADA NODE ENCONTRADO       ***/
/**********************************************************************************/
var passeandoPeloDOM = function (node, func) {
	func(node);
	node = node.firstChild;
	while(node) {
		this.passeandoPeloDOM(node, func);
		node = node.nextSibling;
	}
}

/**********************************************************************************/
/***     RETORNA TODOS OS ELEMENTOS COM UMA ESPECIFICA CLASSE EM UMA ARRAY		***/
/***     				( REQUER [passeandoPeloDOM()] )							***/
/***     AUTOR : RAFAEL CORREIA											        ***/
/***     rafael.ja.tinha@gmail.com										        ***/
/**********************************************************************************/
/***	 UI:																	***/
/***	 $CLASS("class",[elementoRaiz : opcional])								***/
/***	 																		***/
/***	 Se o elementoRaiz for omitido, a funcao comecara a varrer a arvore		***/
/***	 a partir do [document.body	]											***/
/**********************************************************************************/
var $CLASS = function (classe, node) {
	var classe = classe,
		node = node || document.body,
		result = [];
	this.passeandoPeloDOM (node, function (node) {
		var classes = node.className,
			c,
			i;
		if (classes) {
			c = classes.split(' ');
			for (i = 0; i < c.length; i += 1) {
				if (classe === c[i]) {
					result.push(node);
					break;
				}
			}
		}
	});
	
	return result;
}

/**********************************************************************************/
/***     ADICIONA UM EVENTO USANDO O METODO W3C, PARA FUNCIONAR EM TODOS        ***/
/***     OS NAVEGADORES DA MESMA FORMA									        ***/
/**********************************************************************************/
/***	 UI:																	***/
/***	 addEvent(objeto, string: Evento, funcao)								***/
/***	 remonveEvent(objeto, string: Evento, funcao)							***/
/**********************************************************************************/
function addEvent(obj, sEvt, func, bCapt) {
	window.attachEvent ? 
		obj.attachEvent("on"+sEvt, func) 
	:
		obj.addEventListener(sEvt, func, bCapt || false);
}

function removeEvent(obj, sEvt, func, bCapt) {
	window.attachEvent ? 
		obj.detachEvent("on"+sEvt, func)
	:
		obj.removeEventListener(sEvt, func, bCapt || false);
}


/**********************************************************************************/
/***     CRIA UM OBJETO [XHR], PARA FUNCIONAR EM TODOS 					        ***/
/***     OS NAVEGADORES DA MESMA FORMA									        ***/
/**********************************************************************************/
/***	 UI:																	***/
/***	 var req = new 	XMLHTTPRequest()										***/
/***     PROPRIEDADES E METODOS:												***/
/***	 req.open (string : TIPO DE CGI, string : URL, boolean : true)			***/
/***	 req.send(null)															***/
/***	 req.readyState (vai de 1 a 4, sendo 1 = "conectando" e 4 = "recebido")	***/
/***	 req.responseText (valor retornado pelo endereco)						***/
/**********************************************************************************/
function XMLHTTPRequest() {
  try {
        return new XMLHttpRequest(); // FF, Safari, Konqueror, Opera, ...
  } catch(ee) {
        try {
          return new ActiveXObject("Msxml2.XMLHTTP"); // activeX (IE5.5+/MSXML2+)
        } catch(e) {
          try {
                return new ActiveXObject("Microsoft.XMLHTTP"); // activeX (IE5+/MSXML1)
          } catch(E) {
                return false; // doesn't support
          }
        }
  }
}


/**********************************************************************************/
/***     								FADE FX									***/
/***     APLICA O EFEITO FADE NO OBJETO PASSADO (cross-browser)					***/
/***     AUTOR : RAFAEL CORREIA											        ***/
/***     rafael.ja.tinha@gmail.com										        ***/
/**********************************************************************************/
/***	 UI:																	***/
/***	 $FADE([obj], [string : direcao("in"/"out")], [number : duracao])		***/
/**********************************************************************************/

var $FADE = function (obj, direcao, time) {
	var obj = obj, delay = Math.ceil(time / 25), countIni, countFim, algorit, add, visibility;
	
	if(direcao == 'in') {
		countIni = 0; countFim = 100; add = 5; visib = 'visible';
	}
	else {
		countIni = 100; countFim = 0; add = -5;  visib = 'hidden';
	}
	
	function setFinalStatus() {
		obj.style.visibility = visib;
		obj.style.opacity = 1;
		obj.style.filter = 'alpha(opacity=100)';
	}
	
	function fade () {
		var opacidade = countIni ;
		obj.style.opacity = (opacidade * .01);
		obj.style.filter = 'alpha(opacity=' + opacidade + ')';
		if (countIni == countFim) {
			setFinalStatus();
		}
		else {
			countIni += add;
			window.setTimeout(fade, delay);
		}
	}
	window.setTimeout(fade, delay);
}


/**********************************************************************************/
/***                        FUNÇÂO TRIM (Igual a do PHP)                        ***/
/**********************************************************************************/
function trim(str, chars) {
	return ltrim(rtrim(str, chars), chars);
}
 
function ltrim(str, chars) {
	chars = chars || "\\s";
	return str.replace(new RegExp("^[" + chars + "]+", "g"), "");
}
 
function rtrim(str, chars) {
	chars = chars || "\\s";
	return str.replace(new RegExp("[" + chars + "]+$", "g"), "");
}


/**********************************************************************************/
/***                                POP-UP 					        			***/
/**********************************************************************************/
/***	 UI:																	***/
/***	 popUp(Elemento, Largura, Altura, top, left, [Url])						***/
/**********************************************************************************/

function popUp(node, x, y, top, left, url) {
	var url = node.href || url,
		x = x,
		y = y,
		top = top,
		left = left;
	node.onclick = function() {
		window.open(
			url,
			"_blank",
			"toolbar=no, location=no, directories=no, status=no, menubar=no, scrollbars=no, resizable=no, copyhistory=no, top="+top+", left="+left+", width="+x+", height="+y
		);
		return false;
	}
}

/******************************************************************************
VALIDA FORMULÁRIO

Utilize na TAG FORM:  onsubmit="return validaForm(this)"
Formate na TAG INPUT/SELECT: class"classe XVLDemail"
******************************************************************************/
function validaForm(f){
	for(var i=0;i<f.length;i++){
	    var c = f.elements[i].className;
		if(c) {
		    var cTipo = c.split(" ");
		    for(var j = 0; j < cTipo.length; j++) {
			    if(!cTipo[j]) continue;
				var x = cTipo[j];
				var y = f.elements[i]; //- input analizado no momento
				var bgcolorred = '#FFE5E5'; //- cor para validaçao certa
				var bgcolorgreen = '#fff'; //- cor para validaçao errada
				switch(x){
					case 'XVLDrequired':
						if (y.value == ''){
							alert("O preenchimeto deste campo é obrigatorio.");
							y.select();
							y.style.backgroundColor = bgcolorred;
							return false;
						}else{
							y.style.backgroundColor = bgcolorgreen;
						}
					break;
					
					case 'XVLDtexto': //- Caso tipo seja TEXTOs, NUMEROS, PONTOS e ESPAÇOS
						var expReg = /^[a-zA-Z0-9ÂÊÔâêôÁÉÍÓÚáéíóúÀÈÌÒÙàèìòùÃÕãõÄËÏÖÜäëïöüçÇ\ \\\/\.\-\_\,\;\:]*$/;
						//var expReg = /^$/;
						if (!y.value.match(expReg)){
							alert("O valor '"+y.value+"' não está corretamente formatado. \r\nUtilize apenas textos e números e/ou os caracteres especificados abaixo: \r\n - virgula\r\n - espaço\r\n - ponto\r\n - hífen\r\n - undeline");
							y.select();
							y.style.backgroundColor = bgcolorred;
							return false;
						}else{
							y.style.backgroundColor = bgcolorgreen;
						}
					break;
					
					case 'XVLDsenha': //- Caso tipo seja SENHA
						var expReg = /^[a-zA-Z0-9.-]+$/;
						if (!y.value.match(expReg)){
							alert("O valor '"+y.value+"' não está corretamente formatado. \r\nUtilize apenas textos, números, pontos e hífens.");
							y.select();
							y.style.backgroundColor = bgcolorred;
							return false;
						}else{
							y.style.backgroundColor = bgcolorgreen;
						}
					break;
					
					case 'XVLDusuario': //- Caso tipo seja TEXTO e/ou NUMEROS em caixa baixa
						var expReg = /^[a-z0-9\.]+$/;
						if (!y.value.match(expReg)){
							alert("O valor '"+y.value+"' não está corretamente formatado. \r\nUtilize apenas textos em caixa baixa, números e ponto[ . ].");
							y.select();
							y.style.backgroundColor = bgcolorred;
							return false;
						}else{
							y.style.backgroundColor = bgcolorgreen;
						}
					break;
					
					case 'XVLDnumdoc': //- Caso tipo seja NUMEOS DE DOCUMENTO (0-9, /, -, .)
						if(y.value != ''){ //- Se estiver vazio passa adiante
							var expReg = /^[0-9\.\-\/\\\s]+$/;
							if (!y.value.match(expReg)){
								alert("O valor '"+y.value+"' não está corretamente formatado. \r\nUtilize apenas números, pontos, barras e hífens.");
								y.select();
								y.style.backgroundColor = bgcolorred;
								return false;
							}else{
								y.style.backgroundColor = bgcolorgreen;
							}
						}
					break;
					
					case 'XVLDtxtnum': //- Caso tipo seja TEXTO e/ou NUMEROS
						var expReg = /^\w+$/;
						if (y.value && !y.value.match(expReg)){
							alert("O valor '"+y.value+"' não está corretamente formatado. \r\nUtilize apenas textos e números.");
							y.select();
							y.style.backgroundColor = bgcolorred;
							return false;
						}else{
							y.style.backgroundColor = bgcolorgreen;
						}
					break;
					
					case 'XVLDnumero': //- Caso tipo seja NUMERO
						var expReg = /^\d+$/;
						if (!y.value.match(expReg)){
							alert("O valor '"+y.value+"' não está corretamente formatado. \r\nUtilize apenas números.");
							y.select();
							y.style.backgroundColor = bgcolorred;
							return false;
						}else{
							y.style.backgroundColor = bgcolorgreen;
						}
					break;
					
					case 'XVLDdata': //- Caso tipo seja DATA 00/00/0000
						var expReg = /^(([0-2]\d|[3][0-1])\/([0]\d|[1][0-2])\/[1-2][0-9]\d{2})$/;
						if (y.value && !y.value.match(expReg)){
							alert("O valor '"+y.value+"' não está corretamente formatado. \r\nUtilize o padrao: \'dd/mm/aaaa\'");
							y.select();
							y.style.backgroundColor = bgcolorred;
							return false;
						}else{
							y.style.backgroundColor = bgcolorgreen;
						}
					break;
					
					case 'XVLDemail': //- Caso tipo seja EMAIL
						var expReg = /^[a-z0-9_\-]+(\.[_a-z0-9\-]+)*@([_a-z0-9\-]+\.)+([a-z]{2}|aero|arpa|biz|com|coop|edu|gov|info|int|jobs|mil|museum|name|nato|net|org|pro|travel)$/;
						if (y.value && !y.value.match(expReg)){
							alert("O valor correspondente ao campo de email não está corretamente formatado. \r\nUtilize o padrao: \'email@servidor.estensão\'");
							y.select();
							y.style.backgroundColor = bgcolorred;
							return false;
						}else{
							y.style.backgroundColor = bgcolorgreen;
						}
					break;
					
					case 'XVLDurl': //- Caso tipo seja URL
						var expReg = /^((https?|ftp|news):\/\/)?([a-z]([a-z0-9\-]*\.)+([a-z]{2}|aero|arpa|biz|com|coop|edu|gov|info|int|jobs|mil|museum|name|nato|net|org|pro|travel)|(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5]))(\/[a-z0-9_\-\.~]+)*(\/([a-z0-9_\-\.]*)(\?[a-z0-9+_\-\.%=&amp;]*)?)?(#[a-z][a-z0-9_]*)?$/;
						if (y.value && !y.value.match(expReg)){
							alert("O valor '"+y.value+"' não está corretamente formatado. \r\nUtilize o padrao: \'http:\/\/nomedosite'");
							y.select();
							y.style.backgroundColor = bgcolorred;
							return false;
						}else{
							y.style.backgroundColor = bgcolorgreen;
						}
					break;
					
					case 'XVLDcep': //- Caso tipo seja CEP
						//var expReg = /^[0-9]{2}\.[0-9]{3}-[0-9]{3}$/;
						var expReg = /^[0-9]{5}-[0-9]{3}$/;
						if (y.value && !y.value.match(expReg)){
							alert("O valor '"+y.value+"' não está corretamente formatado. \r\nUtilize o padrao: \'99999-999\'");
							y.select();
							y.style.backgroundColor = bgcolorred;
							return false;
						}else{
							y.style.backgroundColor = bgcolorgreen;
						}
					break;
					
					case 'XVLDtelefone': //- Caso tipo seja TELEFONE
						//var expReg = /^[0-9]{2}\.[0-9]{3}-[0-9]{3}$/;
						var expReg = /^\([0-9]{2}\)[\s]*[0-9]{4}-[0-9]{4}$/;
						if (y.value && !y.value.match(expReg)){
							alert("O valor '"+y.value+"' não está corretamente formatado. \r\nUtilize o padrao: \'(99)9999-9999\'");
							y.select();
							y.style.backgroundColor = bgcolorred;
							return false;
						}else{
							y.style.backgroundColor = bgcolorgreen;
						}
					break;
					
					case 'XVLDselect': //- Caso tipo seja SELECT
						if (y.selectedIndex == 0){
							alert("Nenhuma das opçoes foram selecionadas.");
							y.focus();
							y.style.backgroundColor = bgcolorred;
							return false;
						}else{
							y.style.backgroundColor = bgcolorgreen;
						}
					break;
					
					case 'XVLDselectMult': //- Caso tipo seja SELECT Multiple
						if (y.selectedIndex == -1){
							alert("Nenhuma das opçoes foram selecionadas.");
							y.focus();
							y.style.backgroundColor = bgcolorred;
							return false;
						}else{
							y.style.backgroundColor = bgcolorgreen;
						}
					break;
					
					default: return true;
				}
			}
		}
	}
}
