/*
 * nhJax DHTML bibliotecas Re-Utilizavies
 *
 * <pre>
 * Copyright (c) 2006 NHSOFT Tecnologia.
 * </pre>
 * @author: Paulo Ferreira Nhaia
 * @author Loe Antonio de Souza Lobo
*/


/*
 * Load de arquivos js
 */

if (typeof nhJax == 'undefined') {
  /**
   * Namespace definition.
   * @constructor
   */
  nhJax = {};
}

/**
 * @constructor
 */
nhJax.Utils = {};

// Debug : Habilita todos os alerts de execoes nas funcoes nos blocos de try-catch
nhJax.debug = false;
// detect Opera browser
nhJax.is_opera = /opera/i.test(navigator.userAgent);
// detect a special case of "web browser"
nhJax.is_ie = ( /msie/i.test(navigator.userAgent) && !nhJax.is_opera );
// detect IE5.0/Win
nhJax.is_ie5 = ( nhJax.is_ie && /msie 5\.0/i.test(navigator.userAgent) );
// detect IE for Macintosh
nhJax.is_mac_ie = ( /msie.*mac/i.test(navigator.userAgent) && !nhJax.is_opera );
// detect KHTML-based browsers
nhJax.is_khtml = /Konqueror|Safari|KHTML/i.test(navigator.userAgent);
// detect Konqueror
nhJax.is_konqueror = /Konqueror/i.test(navigator.userAgent);
// detect Gecko
nhJax.is_gecko = /Gecko/i.test(navigator.userAgent);
// variavel de path para requisicoes em ajax
nhJax.pathURL = document.location;

/**
  * Cria um elemento de algum tipo(HTML) usando document.createElement(). 
  * Esta funcao criar um elemento do tipo dado e ajustar-lhe-? determinadas 
  * propriedades de :unselectable para o IE, e o CSS ?- moz-user-selecionar? 
  * para o Gecko de, a fim fazer o elemento unselectable nestes browsers. 
  * Opcionalmente, se o segundo argumento for passado, appendChild () o elemento 
  * recentemente criado de a seu pai.
  * 
  * @param type [string] Nome da Tag html a ser criado.
  * @param parent [HTMLElement, Opcional] o parent para o novo elemento.
  * @param selectable [boolean] A flag para indicar o element a ser selectable.
  * @return [HTMLElement] Referencia para o novo elemento.
  */
nhJax.Utils.createElement = function(type, parent, selectable) {
	var el = null;
	if (window.self.document.createElementNS)
		el = window.self.document.createElementNS("http://www.w3.org/1999/xhtml", type);
	else
		el = window.self.document.createElement(type);
	if (typeof parent != "undefined" &&parent != null)
		parent.appendChild(el);
	/*if (!selectable) {
		if (nhJax.is_ie)
			el.setAttribute("unselectable", true);
		if (nhJax.is_gecko)
			el.style.setProperty("-moz-user-select", "none", "");
	}*/
	return el;
};
/**
 * Monta String Form HttpRequest.
 * Proposito desta funcao e montar de forma automatica a string para
 * o JSON interpretar.
 * A funcao faz uma varredura em todos elementos do form menos elementos
 * do tipo file.
 *
 * @param {Form} Form
 * @return [string] Retorna uma String montando o name do input e seu value.
 */
nhJax.Utils.createStrContent = function(objForm) {

	var strContent;
	var els = objForm.elements; 
	for(i=0; i<els.length; i++){
		try{
			if(els[i].type != 'undefined'){
				if( els[i].type != "file" && els[i].type != 'radio' && els[i].type != 'checkbox'){
					strContent = ((i>0)? strContent+"&"+els[i].name+"="+this.replaceStr(els[i].value) : els[i].name+"="+this.replaceStr(els[i].value) );
				}else if(els[i].type == 'radio' &&  els[i].checked || els[i].type == 'checkbox' && els[i].checked ){
					strContent = ((i>0)? strContent+"&"+els[i].name+"="+this.replaceStr(els[i].value) : els[i].name+"="+this.replaceStr(els[i].value) );
				}
			}
		}catch(e){  }		
	}
	return strContent;
};

/**
 *
 * Efetua o replace de string incompativeis com o post via Ajax
 *
 * @param {String} String a ser convertida
 * @return [string] Retorna a nova string
 *
*/
nhJax.Utils.replaceStr = function(newString){

	var chars = new Array ('&','\\+');
	var hex = new Array ('%26','%2B');

	for (var i = 0; i < chars.length; i++)
	{
		myRegExp = new RegExp();
		myRegExp.compile(chars[i],'g')
		newString = newString.replace (myRegExp, hex[i]);
	}
	return newString
};
/**
 * checkAll
 * Marca todos o checks com mesmo nome.
 * @param {Form} Elemento form.
 * @param {Element} O Elemento.
 *
**/ 
nhJax.Utils.checkAll = function (form,field)
{
	fields = form[field.name];
	for (i = 0; i < fields.length; i++){
		if(fields[i].checked){
			if(field.id != fields[i].id){
				if(!field.checked){
					fields[i].checked = false;
				}
			}
		}else{
			if(field.id != fields[i].id){
				if(field.checked){
					fields[i].checked = true;
				}
			}	
		}
	}
}
/**
 * htmlEntities
 *
 * Converte todos os caracteres para HTML entities 
 *
 * @param {String} String a ser convertida
 * @return [string] Retorna a nova string
 */

nhJax.Utils.htmlEntities = function(newString)
{
 var chars = new Array ('&','à','a','â','ã','ä','å','æ','ç','è','é',
                         'ê','ë','ì','í','î','ï','ð','ñ','ò','ó','ô',
                         'õ','ö','ø','ù','ú','û','ü','ý','þ','ÿ','À',
                         'Á','Â','Ã','Ä','Å','Æ','Ç','È','É','Ê','Ë',
                         'Ì','Í','Î','Ï','Ð','Ñ','Ò','Ó','Ô','Õ','Ö',
                         'Ø','Ù','Ú','Û','Ü','Ý','Þ','\"','ß','<',
                         '>','¢','£','¤','¥','¦','§','¨','©','ª','«',
                         '¬','­','®','¯','°','±','²','³','´','µ','¶',
                         '·','¸','¹','º','»','¼','½','¾');



  var entities = new Array ('amp','agrave','aacute','acirc','atilde','auml','aring',
                            'aelig','ccedil','egrave','eacute','ecirc','euml','igrave',
                            'iacute','icirc','iuml','eth','ntilde','ograve','oacute',
                            'ocirc','otilde','ouml','oslash','ugrave','uacute','ucirc',
                            'uuml','yacute','thorn','yuml','Agrave','Aacute','Acirc',
                            'Atilde','Auml','Aring','AElig','Ccedil','Egrave','Eacute',
                            'Ecirc','Euml','Igrave','Iacute','Icirc','Iuml','ETH','Ntilde',
                            'Ograve','Oacute','Ocirc','Otilde','Ouml','Oslash','Ugrave',
                            'Uacute','Ucirc','Uuml','Yacute','THORN','quot','szlig',
                            'lt','gt','cent','pound','curren','yen','brvbar','sect','uml',
                            'copy','ordf','laquo','not','shy','reg','macr','deg','plusmn',
                            'sup2','sup3','acute','micro','para','middot','cedil','sup1',
                            'ordm','raquo','frac14','frac12','frac34');

  if(newString != undefined && newString!=""){
	  for (var i = 0; i < chars.length; i++)
	  {
	    myRegExp = new RegExp();
	    myRegExp.compile(chars[i],'g')
	    newString = newString.replace (myRegExp, '&' + entities[i] + ';');
	  }
  }	  
  return newString;
}
/**
 * Valida o Formulario.
 * Proposito desta funcao e validar o formulario
 *
 * @param {objValidator} objValidator
 * objValidator = {};
 * objValidator.MsgsStyle = Object
 * 	objMsgsStyle:
 * 		divErro string Define o id do elemento a receber a mensagem de erro
 * 		allErrors numeric Define se serão exibidos todos os erros de um campo, ou se no primeiro 
 * 		erro o tratamento para e retorna apenas esse
 * objValidator.Form = object;
 * 	objForm:
 * 		element element Elemento do fomulario form
 * 		submit numeric Tipo de envio - 0 não submete; 1 submete via get; 2 submete via post
 * 		ajax numeric Define se sera enviado o formulario via Ajax ou Não
 *		returnHTML:	define se o retorno vai ser html	
 *		busyShadown: define load com shadow
 *		busyImage:  define a image de loading
 *		busyCloseOnClick: define o fechamento do shadow com click
 *		busyWaitRedirect: define se vai ter redirecionamento quando concluido a execucao.
 * 		onLoad function Define a funcao de retorno a tratar a validacao do campo (nameFunc)
 *		action string Que Define a action a ser executada
 * ObjCampos:
 * 		id string ID do campo
 *		must numeric Define se deve ou não ser validado (0-1)
 *		type string Define o tipo do campo: alfa, numeric (alfa-num)
 *		minL numeric Define o tamanho mínimo de caracteres do valor do campo
 *		maxL numeric Define o tamanho maximo de caracteres do valor do campo
 *		mask string Define o tipo de mascara do campo
 *		ajax numeric Define qual sera o tipo da validacao (0-1), 
 *		async:false Define se é assincrono ou sincrono(Default true)
 *		func string Funcao alternativa para personalizacao
 *		minV numeric Define o tamanho mínimo de um campo do tipo number
 *		mazV numeric Define o tamanho maximo de um campo do tipo number
 *		method string Define como vai ser submitido ('post'-'get')
 *		onLoad function Define a funcao de retorno a tratar a validacao do campo (nameFunc),
 *		action string Que Define a action a ser executada
 *		returnHTML:	define se o retorno vai ser html	
 *		busyShadown: define load com shadow
 *		busyImage:  define a image de loading
 *		busyCloseOnClick: define o fechamento do shadow com click
 *		busyWaitRedirect: define se vai ter redirecionamento quando concluido a execucao.
 * objValidator.ObjCampos = new Object(
 *	[
 *		{id:'id',must:1,minL:0,maxL:1,mask:'cnpj',ajax:1,func:'cnpj',minV:1,maxV:10},
 *		{id:'cnpj',must:1,mask:'cnpj',ajax:1,method:'post',mod:'x',action:'y',onLoad:retorno,busyContainer:'imagem',func:'isInteger',type:'num'},
 *		{id:'data',must:0,minL:6,maxL:6,mask:'data',ajax:0,func:'dataValida',minV:1,maxV:10}
 *	]
 * );
 * nhJax.Utils.validaForm(objValidator);
 */
nhJax.Utils.validaForm = function(objValidator)
{
	/*desabilitando os buttons da pagina*/
	$$('input[type=button]').each(function(input){
		input.disabled = true;
	});
	objValidator.MsgValidacao;//contem mensagem de erro na validacao.
	objValidator.MsgsStyle;//contem informacoes para exibir o erro como div.
    if(typeof(objValidator.Form.element) == 'string'){
    	objValidator.Form.element = $(objValidator.Form.element);
    }
    
    /**
     * Navegando em todos os elementos a serem validados
    **/ 
    ObjectError = new Array();//Array de objectos que possuem erros na validacao
    for(var i=0;i<objValidator.ObjCampos.length;i++){
    	//passando o campo para validacao
   		var classErrorField = '';
   		if(typeof(objValidator.ObjCampos[i].classErrorField) != 'undefined'){
   			classErrorField = objValidator.ObjCampos[i].classErrorField;
   		}else{
   			if(typeof(objValidator.MsgsStyle.classErrorField) != 'undefined'){
   				classErrorField = objValidator.MsgsStyle.classErrorField;
   			} 
   		}
    	if( typeof($(objValidator.ObjCampos[i].id)) == 'object'){
    		if($(objValidator.ObjCampos[i].id) != null && $(objValidator.ObjCampos[i].id).hasClassName(classErrorField)){
    			$(objValidator.ObjCampos[i].id).removeClassName(classErrorField);
    		}
    	}
    	//primeiro parametro verifica se ele é obrigatório parametro must == 1
    	if(typeof(objValidator.ObjCampos[i].must) != 'undefined' && typeof(objValidator.ObjCampos[i].id) != 'undefined' && objValidator.ObjCampos[i].must != 0 ){
    		objValidator.ObjCampos[i].classErrorField = classErrorField;
    		errosCampo = nhJax.Utils.validaCampo(objValidator.ObjCampos[i],objValidator.MsgsStyle.allErrors,objValidator.Form);
    		if(errosCampo.length > 0){
		    	ObjectError[ObjectError.length] = new Object({objCampo:objValidator.ObjCampos[i],errors:errosCampo});
		    }	
    	}else if(typeof(objValidator.ObjCampos[i].id) != 'undefined' && typeof(objValidator.ObjCampos[i].func) != 'undefined'){
    		if( $(objValidator.ObjCampos[i].id).value != ''){
    			var valid = true;
	    		if(typeof(objValidator.ObjCampos[i].mask) != 'undefined'){
	    			var buffer = new String();
	    			for(var j=0;j<(objValidator.ObjCampos[i].mask.length);j++){
						if(objValidator.ObjCampos[i].mask.charAt(j)=='#' || objValidator.ObjCampos[i].mask.charAt(j)=='!' || objValidator.ObjCampos[i].mask.charAt(j)=='?'){
							buffer+='_';
						}else{
							buffer+=objValidator.ObjCampos[i].mask.charAt(j);
						}					
					}
					if( $(objValidator.ObjCampos[i].id).value == buffer){
	    		   		valid = false;
			    	}
			    }
			    if(valid){
			    	objValidator.ObjCampos[i].classErrorField = classErrorField;
    				errosCampo = nhJax.Utils.validaCampo(objValidator.ObjCampos[i],objValidator.MsgsStyle.allErrors,objValidator.Form);
    				if(errosCampo.length > 0){
		    			ObjectError[ObjectError.length] = new Object({objCampo:objValidator.ObjCampos[i],errors:errosCampo});
		    		}
			    }
			}
    	}
    }
	    
    /**
     * Verificando se houve algum erro na validacao para exibicao das mensagens para o usuario.
     * Limpando o div container de erro.
    **/
	if(typeof(objValidator.MsgsStyle.divErro) != 'undefined'){
    	var errorDiv = this.gE(objValidator.MsgsStyle.divErro);
    	errorDiv.style.display = 'none';
    	errorDiv.innerHTML='';
	}
    if(ObjectError.length >= 1){
    	/*habilitando os buttons da pagina*/
    	$$('input[type=button]').each(function(input){
			input.disabled = false;
		});
    	this.showMsgs(objValidator,ObjectError);    	
    }else{
    	if(typeof(objValidator.Form.submit) != 'undefined' && objValidator.Form.submit != 0 && typeof(objValidator.Form.element) != 'undefined' ){
	    	//Submit tradicional e Submit via Ajax
	    	if(typeof(objValidator.Form.ajax) != 'undefined' && objValidator.Form.ajax == 1){
	    		try{
	    			//Definindo uma funcao de retorno de erro padrão para validacao em ajax
					function definedErroField(obJson){
						/*habilitando os buttons da pagina*/
						$$('input[type=button]').each(function(input){
							input.disabled = false;
						});
						if(typeof(objValidator.Form.onLoad) != 'undefined'){
							return objValidator.Form.onLoad(obJson);
						}
						// se for true e pq ocorreu o erro
						if(obJson){
							try{
								nhJax.Transport.removeBusy();
								if(obJson.retorno != 1){
									var alertRet = obJson.retorno == 3 ? true : false;
									nhJax.Utils.showMsgsForm(objValidator,obJson.msg_error,alertRet);				
								}else{
									if(obJson.url_destino != 'undefined' && obJson.url_destino != ''){
										if( typeof(obJson.url_destino) != 'undefined'){
											window.location = obJson.url_destino;
										}
									}
								}								
							}catch(e){
								if(nhJax.debug){
									alert('Erro::validaForm::definedErroField::\nErro::'+e);
								}
							}	
						}
					}
	    			// Sempre que houver a requisicao ajax para o campo vai ter que ter uma funcao para tratar o retorno
					// definida através da propriedade onLoad não passar como string.
					// Ex: onLoad: funcaoRetorno,
					nhJax.Transport.fetchJsonObj({
					    url: 			((typeof(objValidator.Form.action) != 'undefined')? nhJax.pathURL+objValidator.Form.action : objValidator.Form.element.action ),
					    method: 	    ((objValidator.Form.element.submit == 3)? 'GET' : ((objValidator.Form.element.submit == 4)? 'POST' : 'POST')),
					    content:	    nhJax.Utils.createStrContent(objValidator.Form.element),
					    onLoad: 	   definedErroField,
					    returnHTML:	(typeof(objValidator.Form.returnHTML) != 'undefined')? objValidator.Form.returnHTML : false,	
					    busyShadown: (typeof(objValidator.Form.busyShadown) != 'undefined')? objValidator.Form.busyShadown :'',
					    busyImage:  (typeof(objValidator.Form.busyImage) != 'undefined')? objValidator.Form.busyImage :'',
						busyCloseOnClick: (typeof(objValidator.Form.busyCloseOnClick) != 'undefined')? objValidator.Form.busyCloseOnClick :'',
						busyWaitRedirect: (typeof(objValidator.Form.busyWaitRedirect) != 'undefined')? objValidator.Form.busyWaitRedirect :''
					});
				}catch(e){
					if(nhJax.debug){
						alert('Erro::validaForm::\nErro::'+e);
					}
				}	
		    }else{
			    objValidator.Form.method =  ((objValidator.Form.submit == 1)? 'GET' : ((objValidator.Form.submit == 2)? 'POST' : 'POST'));
		    	objValidator.Form.element.submit();
		    }
	    }else{
	    	/*habilitando os buttons da pagina*/
			$$('input[type=button]').each(function(input){
				input.disabled = false;
			});
			return true;
		}
    }
}

/**
 * Funcao para exibicao das mensagens de confirmacao e alert.
 * <pre>
 * 		Copyright (c) 2006 NHSOFT Tecnologia.
 * </pre>
 * @author: Paulo Ferreira Nhaia
 *
 * @param {typeMsgModal} string (alert||confirm)
 * @param {strRefMsg} string: 'referencia da mensagem na nhMsgs'
 * @param {objectTarget} string: 'href destino'
 * @param {id_modal_update} string: 'id do elemento a ser atualizado no modal corrente'
 */ 
var NH_current_modal = '';//variavel utilizada para armazenar o modal anterior 
nhJax.Utils.showModalMsgs = function(typeMsgModal,strRefMsg,objectTarget,buttonFechar)
{
	try{
			/*link de abertura do modal*/
			var aModalRef   = this.createElement('a');
			aModalRef.setAttribute('href','#showModalMsgs');
			aModalRef.setAttribute('id','aModalRef');
			aModalRef.setAttribute('name','aModalRef');
			/*div container */
			var divModalMsg = this.createElement('div');
			divModalMsg.setAttribute('id','showModalMsgs');
			divModalMsg.style.display = 'none';
			/*div interno lightbox container*/
			var divModalL   = this.createElement('div');
			if(typeMsgModal == 'alert'){ 
				divModalL.setAttribute('class','lightbox '+nhMsgs.getMsgStyle().classBoxModalAlert);
			}else{	
				divModalL.setAttribute('class','lightbox '+nhMsgs.getMsgStyle().classBoxModalConfirm);
			}	
			/*div interno headerbox container*/
			var divModalH   = this.createElement('div');
			divModalH.setAttribute('class','headerbox');
			/*h2 interno headerbox container*/
			var h2Modal     = this.createElement('h2');
			/*span interno h2 headerbox container*/
			var spanModal   = this.createElement('span');
			if(typeMsgModal == 'alert'){ 
				spanModal.innerHTML = nhMsgs.getMsgStyle().H2BoxModalAlert; 
			}else{ 
				spanModal.innerHTML = nhMsgs.getMsgStyle().H2BoxModalConfirm; 
			}
			h2Modal.appendChild(spanModal);
			divModalH.appendChild(h2Modal);
			
			if(buttonFechar != 'false') {
				/*a interno headerbox container*/
				var aModal		= this.createElement('a');
				aModal.setAttribute('href','javascript: void(0);');
				aModal.setAttribute('onclick','javascript: new Effect.Fade(\'modal_container\',{ afterFinish: function(){ if(NH_current_modal != \'\'){ Control.Modal.current.update(NH_current_modal); }else{ Control.Modal.current.close(); }$(\'aModalRef\').remove(); }});');
				aModal.setAttribute('title','Fechar a Janela');
				/*span interno a headerbox container*/
				var spanAModal   = this.createElement('span');
				spanAModal.innerHTML = 'Fechar';
				aModal.appendChild(spanAModal);
				divModalH.appendChild(aModal);
				divModalL.appendChild(divModalH);
			}
			/*div interno lightbox container*/
			var divModalC   = this.createElement('div');
			divModalC.setAttribute('class','contentbox');
			var pModalC   = this.createElement('p');
			if(strRefMsg.indexOf(' ') != -1) {
				var msgTxt = strRefMsg;
				strRefMsg = 'H2BoxModalAlert';
			} else {
				var msgTxt = '';
			}
			pModalC.innerHTML = (( msgTxt == '') ? eval('nhMsgs.getMsgStyle().'+strRefMsg) : msgTxt );
			divModalC.appendChild(pModalC);
			if(typeMsgModal == 'confirm'){
				var divbModalC	= this.createElement('div');
				divbModalC.setAttribute('class','buttons');
				var aYesModal	= this.createElement('a');
				aYesModal.setAttribute('class','btSim');

				try{
					if( objectTarget.indexOf('javascript:') != -1){
						aYesModal.setAttribute('href','javascript:void(0)');
						aYesModal.setAttribute('onclick', objectTarget+'();Control.Modal.current.close();$(\'aModalRef\').remove();' );
					}else{
						aYesModal.setAttribute('href',objectTarget);
					}
				}catch(e){
					if(typeof objectTarget == 'string'){
						aYesModal.setAttribute('href',objectTarget);
					}
				}	

				aYesModal.innerHTML = 'Sim';
				var aNoModal	= this.createElement('a');

				aNoModal.setAttribute('class','btNao');
				aNoModal.innerHTML = 'Não';

				aNoModal.setAttribute('onclick','Control.Modal.current.close();$(\'aModalRef\').remove();');

				divbModalC.appendChild(aYesModal);
				divbModalC.appendChild(aNoModal);
				divModalC.appendChild(divbModalC);
			}			
			divModalL.appendChild(divModalC);
			divModalMsg.appendChild(divModalL);
			/*attach body*/
			document.body.appendChild(aModalRef);
			document.body.appendChild(divModalMsg);
			/*open modal mensagem*/
			if(Control.Modal.current){
              $('roundedCornersTopNH').remove();
              $('roundedCornersBottonNH').remove();
              NH_current_modal = $('modal_container').innerHTML;
              Control.Modal.current.update($('showModalMsgs').innerHTML);
            }else{			
				var showModalMsgs = new Control.Modal('aModalRef',{width:400,height:170});
				showModalMsgs.open();
			}	
	}catch(e){}
}

/**
 * Funcao para exibicao das mensagens de erro da validacao.
 * @param {objMsgsStyle} object
 * @param {objErrors} object
 * @param {alertRet} boolean que define se a classe a ser utilizada nas mensagem vai ser alert ou error.
**/ 
nhJax.Utils.showMsgsForm = function(objValidator,msgErrors,alertRet)
{
	MsgsStyle = objValidator.MsgsStyle;
	var contentMsg;
	if(typeof(MsgsStyle.divErro) != 'undefined'){
    	contentMsg = this.gE(MsgsStyle.divErro);    	    	    			
	}else{
		contentMsg = '';
	}	
	divError = this.createElement('div');
	msgRetorno = 'objValidator.objMessages.'+msgErrors;
	
	h3Error = this.createElement('h3');
	
	if(alertRet){
		h3Error.innerHTML = MsgsStyle.alertH3;
		pError = this.createElement('p');
		pError.innerHTML = eval(msgRetorno);
	}else{
		h3Error.innerHTML = MsgsStyle.errorH3;
		pError = this.createElement('p');
		pError.innerHTML = MsgsStyle.errorP;
		ulError = this.createElement('ul');
		liError = this.createElement('li');
		liError.innerHTML = MsgsStyle.errorLI_0;
		liError.innerHTML += MsgsStyle.errorLI_1+eval(msgRetorno);
		ulError.appendChild(liError);
	}
	if(typeof(objValidator.MsgsStyle.divErro) != 'undefined'){
		divError.className=contentMsg.className.replace(contentMsg.className,'');
		divError.appendChild(h3Error);
		if(alertRet){
			divError.appendChild(pError);
			divError.className = MsgsStyle.classAlert;		
		}else{
			divError.appendChild(pError);
			divError.appendChild(ulError);
			divError.className = MsgsStyle.classErro;
		}
		contentMsg.appendChild(divError);
		$(contentMsg.id).hide();
		if(!Control.Modal.current){/*quando modal estiver aberto nao executa o scrollTo*/
			//$(contentMsg.id).scrollTo();aqui
		}	
		
		Effect.BlindDown(contentMsg.id,{duration:0.5,afterFinish: function(){ $(contentMsg.id).scrollTo(); } });
		//Effect.BlindDown(contentMsg.id,{duration:0.5,afterUpdate: function(){ $(contentMsg.id).scrollTo(); } });
	}
}
/**
 * Funcao para exibicao das mensagens de erro da validacao.
 * @param {objMsgsStyle} object
 * @param {objErrors} object
**/ 
nhJax.Utils.showMsgs = function(objValidator,objErrors)
{
	
	var MsgsStyle = objValidator.MsgsStyle;
	if(typeof(MsgsStyle.divErro) != 'undefined'){
    	contentMsg = this.gE(MsgsStyle.divErro); 
    	contentMsg.style.display = 'none';   	    	    			
	}else{
		contentMsg = '';
	}	
	h3Error = this.createElement('h3');
	var totalErros = 0;
	for(var i=0;i<objErrors.length;i++){
		//Quando houver mais de um erro no campo
		 if(MsgsStyle.allErrors == 1){
		 	if(objErrors[i].errors.length>0){
				totalErros += objErrors[i].errors.length;
			}
		}else{
			totalErros += 1;
		}		
	}
	h3Error.innerHTML = totalErros+' '+MsgsStyle.errorH3;
	pError = this.createElement('p');
	pError.innerHTML = MsgsStyle.errorP;
	ulError = this.createElement('ul');
	strMsg = "";
	firstElementError='';
	for(var i=0;i<objErrors.length;i++){
		elem = this.gE(objErrors[i].objCampo.id);
		if(typeof(objErrors[i].objCampo.classErrorField) != 'undefined'){
			elem.addClassName(objErrors[i].objCampo.classErrorField);			
		}
		if(i==0){
			firstElementError = elem;
		}
		var funcFocus = '';
		funcFocus = '';//'$(\''+elem.id+'\').focus()';
		//Quando houver mais de um erro no campo
		if(MsgsStyle.allErrors == 1){
		 	if(objErrors[i].errors.length>0){
				for(j=0;j<objErrors[i].errors.length;j++){
                    liError = this.createElement('li');
                    strongError = '<a href="#" onclick="javascript:new Effect.ScrollTo(\''+elem.id+'\',{duration:2});'+funcFocus+';return false;">'+elem.title+'</a>';                    
                    errorM = 'objValidator.objMessages.'+objErrors[i].errors[j];
					if(typeof(objValidator.MsgsStyle.divErro) != 'undefined'){
						liError.innerHTML = MsgsStyle.errorLI_0;
						liError.innerHTML += strongError;
						liError.innerHTML += MsgsStyle.errorLI_1+eval(errorM);
					}else{
						strMsg += MsgsStyle.errorLI_0+elem.title+MsgsStyle.errorLI_1+eval(errorM)+'\n';
					}
                    ulError.appendChild(liError);
                }
            }else{
                liError = this.createElement('li');
                strongError = '<a href="#" onclick="javascript:new Effect.ScrollTo(\''+elem.id+'\',{duration:2});'+funcFocus+';return false;">'+elem.title+'</a>';
                errorM = 'objValidator.objMessages.'+objErrors[i].errors[j];
				if(typeof(objValidator.MsgsStyle.divErro) != 'undefined'){
					liError.innerHTML = MsgsStyle.errorLI_0;
					liError.innerHTML += strongError;
					liError.innerHTML += MsgsStyle.errorLI_1+eval(errorM);
				}else{
					strMsg += MsgsStyle.errorLI_0+elem.title+MsgsStyle.errorLI_1+eval(errorM)+'\n';
				}
				ulError.appendChild(liError);
            }
        }else{
        	liError = this.createElement('li');
            strongError = '<a href="#" onclick="javascript:new Effect.ScrollTo(\''+elem.id+'\',{duration:2});'+funcFocus+';return false;">'+elem.title+'</a>';
			errorM = 'objValidator.objMessages.'+objErrors[i].errors;
			if(typeof(objValidator.MsgsStyle.divErro) != 'undefined'){
				liError.innerHTML = MsgsStyle.errorLI_0;
				liError.innerHTML += strongError;
				liError.innerHTML += MsgsStyle.errorLI_1+eval(errorM);
			}else{
				strMsg += MsgsStyle.errorLI_0+elem.title+MsgsStyle.errorLI_1+eval(errorM)+'\n';
			}
            ulError.appendChild(liError);
        }
	}
	divError = this.createElement('div');
	if(typeof(objValidator.MsgsStyle.divErro) != 'undefined'){
		if(contentMsg.style.display == ''){
			divError.appendChild(h3Error);
			divError.appendChild(pError);
			divError.appendChild(ulError);
			divError.className=contentMsg.className.replace(contentMsg.className,'');
			divError.className = MsgsStyle.classErro;
			contentMsg.appendChild(divError);
			$(contentMsg.id).hide();
			Effect.BlindDown(contentMsg.id,{duration:0.5,afterFinish: function(){ $(contentMsg.id).scrollTo(); } });
			//Effect.BlindDown(contentMsg.id,{duration:0.5,afterUpdate: function(){ $(contentMsg.id).scrollTo(); } });
		}else{
			divError.appendChild(h3Error);
			divError.appendChild(pError);
			divError.appendChild(ulError);
			divError.className=contentMsg.className.replace(contentMsg.className,'');
			divError.className = MsgsStyle.classErro;
			contentMsg.appendChild(divError);
			$(contentMsg.id).hide();
			Effect.BlindDown(contentMsg.id,{duration:0.5,afterFinish: function(){ $(contentMsg.id).scrollTo(); } });
			//Effect.BlindDown(contentMsg.id,{duration:0.5,afterUpdate: function(){ $(contentMsg.id).scrollTo(); } });
		}
	}else{
		alert(strMsg);
	}
	/*
	 * Jogando o focu no primeiro elemento do form com erro
	 */
	/*if(firstElementError.type == "checkbox" || firstElementError.type == "select-one" ){
		setTimeout("firstElementError.focus()",100);
	}else{
		setTimeout("firstElementError.select()",100);
	}*/
	return false;
}
/**
 * Testa o campo
 * E retorna os campos que contem erro e quais erro foram encontrados.
 * @param {objValidator} object
 * @param {field} object
 * @return {objMsgsError} object
**/
nhJax.Utils.testField = function(objValidator,field){
	/*desabilitando os buttons da pagina*/
	
	$$('input[type=button]').each(function(input){
		input.disabled = true;
	});
    if(typeof(objValidator.Form.element) == 'string'){
    	objValidator.Form.element = $(objValidator.Form.element);
    }
    /**
     * Navegando em todos os elementos a serem validados
    **/ 
    var ObjectError = new Array();//Array de objectos que possuem erros na validacao
    for(var i=0;i<objValidator.ObjCampos.length;i++){
    	if(field.id == objValidator.ObjCampos[i].id){
	    	if(typeof(objValidator.ObjCampos[i].must) != 'undefined' && typeof(objValidator.ObjCampos[i].id) != 'undefined' && objValidator.ObjCampos[i].must != 0 ){
	    		//passando o campo para validacao
	    		var classErrorField = '';
	    		if(typeof(objValidator.ObjCampos[i].classErrorField) != 'undefined'){
	    			classErrorField = objValidator.ObjCampos[i].classErrorField;
	    		}else{
	    			if(typeof(objValidator.MsgsStyle.classErrorField) != 'undefined'){
	    				classErrorField = objValidator.MsgsStyle.classErrorField;
	    			} 
	    		}
	    		objValidator.ObjCampos[i].classErrorField = classErrorField;
	    		errosCampo = nhJax.Utils.validaCampo(objValidator.ObjCampos[i],objValidator.MsgsStyle.allErrors,objValidator.Form);
	    		if(errosCampo.length > 0){
			    	ObjectError[ObjectError.length] = new Object({objCampo:objValidator.ObjCampos[i],errors:errosCampo});
			    }	
	    	}
	    	break;
	    }
    }
    /**
     * Verificando se houve algum erro na validacao para exibicao das mensagens para o usuario.
     * Limpando o div container de erro.
    **/
	if(typeof(objValidator.MsgsStyle.divErro) != 'undefined'){
    	var errorDiv = this.gE(objValidator.MsgsStyle.divErro);
    	errorDiv.style.display = 'none';
    	errorDiv.innerHTML='';
	}
	/*habilitando os buttons da pagina*/
   	$$('input[type=button]').each(function(input){
		input.disabled = false;
	});
    if(ObjectError.length >= 1){
    	this.showMsgs(objValidator,ObjectError);
    }else{
    	return true;
    }
}

/**
 * Valida o campo
 * E retorna um array com os campos que contem erro e quais erro foram encontrados.
 * @param {objCampos} object
 * @return {objMsgsError} object
**/ 
nhJax.Utils.validaCampo = function(objCampo,allErrors,objForm)
{
	/**
	 * INICIO replace.
	 * Faz o replace do className do elemento quando houver.
	**/
	try{ 
		nhJax.Utils.EventHasClassError = Class.create();
		nhJax.Utils.EventHasClassError.prototype = {
			initialize: function(field) {
			    this.fieldName = $(field.id);
			    this.className = field.classErrorField;
			    /*OLD FUNCTIONS*/
				this.onclick	= this.fieldName.onclick;
				this.onfocus	= this.fieldName.onfocus;       
				this.onkeypress	= this.fieldName.onkeypress;
				/*NEW FUNCTIONS*/
			    this.fieldName.onclick		= this.replaceClassName.bind(this);
				this.fieldName.onfocus		= this.replaceClassName.bind(this);        
				this.fieldName.onkeypress	= this.replaceClassName.bind(this);				
			},
			replaceClassName: function(evt) {
				if(this.fieldName.hasClassName(this.className)){
					this.fieldName.removeClassName(this.className);
				}
				/*re-aplicando funcoes*/
				this.fieldName.onclick = this.onclick;
				this.fieldName.onfocus = this.onfocus;        
				this.fieldName.onkeypress = this.onkeypress;
			}		
		};	
		new nhJax.Utils.EventHasClassError(objCampo);
	}catch(e){ /*execoes quando tem checkbox */ }
	/**
	 * FIM replace.
	**/ 	
	campoError = new Array();
	
	/**
	 * Tratamento para checkbox 
	 */
	var is_checkbox = false;
	var check_empty = true;
	
	for(var i = 0; i < objForm.element.elements.length; i++) {
	    if (objForm.element.elements[i].type == "checkbox" || objForm.element.elements[i].type == "radio") {
			if(objForm.element.elements[i].name == objCampo.id){
				is_checkbox = true;
				if(objForm.element.elements[i].checked){
					check_empty = false;
					break;			
				}
			}
	    }
	}
	// valida o checkbox
	if(is_checkbox && check_empty){
		if(allErrors != 1){
			return 'empty';
		}else{
			campoError[campoError.length] = 'empty';
			//tratamento de erro attach event para remover class error	
			try{
				for(var i = 0; i < objForm.element.elements.length; i++) {
				    if (objForm.element.elements[i].type == "checkbox" || objForm.element.elements[i].type == "radio") {
						if(objForm.element.elements[i].name == objCampo.id){
							objForm.element.elements[i].addClassName(objCampo.classErrorField);
							objForm.element.elements[i].observe('click', function(evt) {
								for(var i = 0; i < objForm.element.elements.length; i++) {
				    				if (objForm.element.elements[i].type == "checkbox" || objForm.element.elements[i].type == "radio") {
										if(objForm.element.elements[i].name == objCampo.id){
											$(objForm.element.elements[i].id).removeClassName(objCampo.classErrorField);
										}
									}
								}						
							},objForm,objCampo);
						}
					}
				}
			}catch(e){ }
		}
	}
	// O campos esta vazio
	if(!is_checkbox && typeof(objCampo.mask) != 'undefined'){
		strMask = '';
		strMask = objCampo.mask;
		strMask = strMask.replace(/#/gi,"_");
		strMask = strMask.replace(/!/gi,"_");
		strMask = strMask.replace(/\?/gi,"_");
		strMask = strMask.replace(/\*/gi,"_");
		if(this.gE(objCampo.id).value == '' || this.gE(objCampo.id).value == strMask){
			if(allErrors != 1){
				return 'empty';
			}else{
				campoError[campoError.length] = 'empty';
			}
		}
	}	
	if(!is_checkbox && this.gE(objCampo.id).value == ''){
		if(allErrors != 1)
			return 'empty';
		else
			campoError[campoError.length] = 'empty';
	}
	// O campos é numerico
	if(!is_checkbox && typeof(objCampo.type) != 'undefined' && objCampo.type == 'num' && !this.isInteger(this.gE(objCampo.id).value) ){
		if(allErrors != 1)
			return 'num';
		else
			campoError[campoError.length] = 'num';
	}
	// Tamanho mínimo do campo
	if(!is_checkbox && typeof(objCampo.minL) != 'undefined' && this.gE(objCampo.id).value.length < objCampo.minL){
		if(allErrors != 1)
			return 'minL';
		else
			campoError[campoError.length] = 'minL';
	}
	// Tamanho maximo do campo
	if(!is_checkbox && typeof(objCampo.maxL) != 'undefined' && this.gE(objCampo.id).value.length > objCampo.maxL){
		if(allErrors != 1)
			return 'maxL';
		else
			campoError[campoError.length] = 'maxL';
	}
	// Valor mínimo do campo
	if(!is_checkbox && typeof(objCampo.minV) != 'undefined' && this.gE(objCampo.id).value < objCampo.minV){
		if(allErrors != 1)
			return 'minV';
		else
			campoError[campoError.length] = 'minV';
	}
	// Valor maximo do campo
	if(!is_checkbox && typeof(objCampo.maxV) != 'undefined' && this.gE(objCampo.id).value > objCampo.maxL){
		if(allErrors != 1)
			return 'maxV';
		else
			campoError[campoError.length] = 'maxV';
	}
	// Validando o campo no banco de dados via ajax
	if(typeof(objCampo.ajax) != 'undefined' && objCampo.ajax == 1){
		try{
			var exeAjax = false;
			//Definindo uma funcao de retorno de erro padrão para validacao em ajax
			function definedErroField(obJson){
				// se for false e pq ocorreu o erro
				if(!obJson){
					if(allErrors != 1)
						return 'ajax';
					else
						campoError[campoError.length] = 'ajax_'+objCampo.id;
					nhJax.Transport.removeBusy(objCampo);
				}
				exeAjax = true;
			}
			// Sempre que houver a requisicao ajax para o campo vai ter que ter uma funcao para tratar o retorno
			// definida através da propriedade onLoad não passar como string.
			// Ex: onLoad: funcaoRetorno,
			nhJax.Transport.fetchJsonObj({
				//Obs: url como o sistema vai partir da index.php é o mesmo diretorio do ajax.php
				//     pode ser definida a chamada da url direto quando for chamado de outro lugar
				//     tem que definir o caminho completo 
			    url: 			((typeof(objCampo.action) != 'undefined')? nhJax.pathURL+objCampo.action : objValidator.Form.element.action ),
			    method: 	    ((objCampo.method == 3)? 'GET' : ((objCampo.method == 4)? 'POST' : 'POST')),
			    content:	    nhJax.Utils.createStrContent(objForm.element),
			    async:			(typeof(objCampo.async) != 'undefined')? objCampo.async :false ,
			    onLoad: 	    (typeof(objCampo.onLoad) != 'undefined')? objCampo.onLoad : definedErroField ,
			    returnHTML:	(typeof(objCampo.returnHTML) != 'undefined')? objCampo.returnHTML : false,
			    busyShadown: (typeof(objCampo.busyShadown) != 'undefined')? objCampo.busyShadown :'',
			    busyImage:  (typeof(objCampo.busyImage) != 'undefined')? objCampo.busyImage :'',
				busyCloseOnClick: (typeof(objCampo.busyCloseOnClick) != 'undefined')? objCampo.busyCloseOnClick :'',
				busyWaitRedirect: (typeof(objCampo.busyWaitRedirect) != 'undefined')? objCampo.busyWaitRedirect :''
			});
			
		}catch(e){
			if(nhJax.debug){
				alert('Erro::validaCampo::ajax::\nErro::'+e);
			}
		}
	}
	if(typeof(objCampo.func) != 'undefined' && !this.montaFuncaoCustom(objCampo,campoError,false)){
		if(allErrors != 1)
			return objCampo.func;
		else
			campoError[campoError.length] = objCampo.func;
	}
	return campoError;
}
/**
 * Funcao executa requisicao ajax.
 * @param {url} 
 * @param {onload}
 */
 
nhJax.Utils.executeAjax = function (url,onload){
	new Ajax.Request(url,{	
			method:	'get',
			onCreate: function() {
			   nhJax.Transport.showBusy({busyShadown:'',busyImage:'',busyCloseOnClick:'',busyWaitRedirect:''});
			}, 
			onComplete: function(retorno)  {
  				nhJax.Transport.removeBusy();
  				onload(nhJax.Transport.parseJsonStr(retorno.responseText));
    		}
	});
}
/**
 * Monta a funcao customizada e a executa, retornando true ou false se foi bem ou mal sucedida.
 * @param {object} 
 * @param {boolean}
 */
nhJax.Utils.montaFuncaoCustom = function (objCampo,boolMsgCampo){
	if(typeof(objCampo.func) != 'undefined'){
		// Validacao usando uma funcao customizada definida no array de validacao
		functionStr = (( typeof(objCampo.ini) != 'undefined' && typeof(objCampo.fim) != 'undefined' )? 'this.'+objCampo.func+'("'+this.gE(objCampo.id).value+'","'+this.gE(objCampo.fim).value+'")' : 'this.'+objCampo.func+'("'+this.gE(objCampo.id).value+'")' );
			try{
				if(!eval(functionStr)){
					if(boolMsgCampo){
						nhJax.Utils.showMsgsField(objCampo);
					}else{
						return false;
					}
				}else{
					return true;
				}
			}catch(e){
				if(nhJax.debug){
					alert('Erro::validaCampo::N&atilde;o foi poss&iacute;vel  executar a fun&ccedil;&atilde;o de valida&ccedil;&atilde;o para o campo '+ objCampo.id +'! \nErro::'+e);
				}
			}
	}		
}
/**
 * Funcao para exibicao das mensagens de erro da validacao para o campo.
 * @param {objCampo} object
**/ 
nhJax.Utils.showMsgsField = function(objCampo)
{
	elementField = this.gE(objCampo.id);
	if( typeof(objCampo.classErrorField) != 'undefined' ){ 
		elementField.parentNode.firstChild.className = objCampo.classErrorField;
	}else{
		/*
		//codigo retirado por interferir na navegacao..
		if(elementField.type == "checkbox" || elementField.type == "select-one" || elementField.type == "select" ){
			setTimeout("elementField.focus()",100);
		}else{
			setTimeout("elementField.select()",100);
		}
		alert(eval('objMessages.'+objCampo.func));
		*/
	}
}
/**
 * Retorna o elemento html
 * Passa a string id do elemento ou o name
 * Quando for o name a funcao vai retorno o primeiro elemento com o name encontrado.
 * @param {string id} element html
**/ 
nhJax.Utils.gE = function (id_or_name){
	try{
		return ((document.getElementById(id_or_name) != null)? document.getElementById(id_or_name): document.getElementsByName(id_or_name)[0] );
	}catch(e){
		if(nhJax.debug){
			alert('Erro::gE::\nErro::'+e);
		}
	}	
}
/**
 * Jogando o focu no primeiro elemento do form
 * @param {element form} element form
**/ 
nhJax.Utils.focusForm = function (objForm){
	if( objForm!=null) {
		var i;
		var max = objForm.length;
		for( i = 0; i < max; i++ ) {
			if( objForm.elements[ i ].type != "hidden" && !objForm.elements[ i ].disabled && !objForm.elements[ i ].readOnly ) {
				if(objForm.elements[ i ].type == 'text' || objForm.elements[ i ].type == 'password' || objForm.elements[ i ].type == 'checkbox' || objForm.elements[ i ].type == 'radio' ||
						objForm.elements[ i ].type == 'submit' || objForm.elements[ i ].type == 'file' || objForm.elements[ i ].type == 'button' || objForm.elements[ i ].type == "select-one" || objForm.elements[ i ].type == "select" ){
						if(objForm.elements[ i ].value == ''){
							objForm.elements[ i ].focus();
							break;
						}
				}
				
			}
		}
	}
}

/**
 * Formata o campo valor
 * Como usar: onkeyup="nhJax.Utils.formataValor(this);"
 * @param {object Field}
 */
nhJax.Utils.formataValor = function (campo) {
	campo.value = this.filtraCampo(campo);
	vr = campo.value;
	tam = vr.length;
	if ( tam <= 2 ){
		campo.value = vr ; 
	}
	if ( (tam > 2) && (tam <= 5) ){
		campo.value = vr.substr( 0, tam - 2 ) + ',' + vr.substr( tam - 2, tam ) ; 
	}
    if ( (tam >= 6) && (tam <= 8) ){
		campo.value = vr.substr( 0, tam - 5 ) + '.' + vr.substr( tam - 5, 3 ) + ',' + vr.substr( tam - 2, tam ) ; 
	}
	if ( (tam >= 9) && (tam <= 11) ){
        campo.value = vr.substr( 0, tam - 8 ) + '.' + vr.substr( tam - 8, 3 ) + '.' + vr.substr( tam - 5, 3 ) + ',' + vr.substr( tam - 2, tam ) ; 
	}
	if ( (tam >= 12) && (tam <= 14) ){
		campo.value = vr.substr( 0, tam - 11 ) + '.' + vr.substr( tam - 11, 3 ) + '.' + vr.substr( tam - 8, 3 ) + '.' + vr.substr( tam - 5, 3 ) + ',' + vr.substr( tam - 2, tam ) ; 
	}
	if ( (tam >= 15) && (tam <= 18) ){
		campo.value = vr.substr( 0, tam - 14 ) + '.' + vr.substr( tam - 14, 3 ) + '.' + vr.substr( tam - 11, 3 ) + '.' + vr.substr( tam - 8, 3 ) + '.' + vr.substr( tam - 5, 3 ) + ',' + vr.substr( tam - 2, tam ) ;
	}
}
/**
 * Formata o campo valor
 * @param {object Field}
 */
nhJax.Utils.formataNumerico = function (campo) {
	campo.value = this.filtraCampo(campo);
    vr = campo.value;
    tam = vr.length;
}
/**
 * Limpa todos os caracteres especiais do campo solicitado
 * @param {object Field}
 */
nhJax.Utils.filtraCampo = function (campo){
    var s = "";
    var cp = "";
    vr = campo.value;
    tam = vr.length;
    for (i = 0; i < tam ; i++) {                  
		if (vr.substring(i,i + 1) != "/" && vr.substring(i,i + 1) != "-" && vr.substring(i,i + 1) != "."  && vr.substring(i,i + 1) != "," ){
			s = s + vr.substring(i,i + 1);
		}
	}
    campo.value = s;
    return cp = campo.value
}

/**
 * Ira atribuir as mascaras e as validacoes aos elementos
 * @param {object} Objeto contendo os elementos e suas propriedades
 */
nhJax.Utils.formatarElementos = function (objElementos){
	try{
		var firstFocus = false;
		for(var i = 0; i < objElementos.ObjCampos.length; i++){
			if(typeof objElementos.ObjCampos[i] == 'object'){
				if(objElementos.ObjCampos[i].mask != 'undefined' && typeof objElementos.ObjCampos[i].mask != 'undefined'){
					/*
					 * Adiciona o objeto 
					 */
					// Corrigido BUG na assinatura do metodo
					new NHMaskedInput(objElementos.ObjCampos[i]);
				}
			}						
		}
		/*
		 * Jogando o focu no primeiro elemento do form
		 */
		// nhJax.Utils.focusForm(objElementos.Form.element);
	}catch(e){
		if(nhJax.debug){
			alert('Erro::formatarElementos::\nErro::'+e);
		}
	}
}

/**
 * Valida um campo do tipo CNPJ dado seu objeto
 * Retorna true ou false conforme valido ou invalido
 */
nhJax.Utils.validaCNPJ = function (CNPJ) {
	erro = new String;
	if (CNPJ.length < 18) erro += "E' necessarios preencher corretamente o numero do CNPJ! \n\n";
	if ((CNPJ.charAt(2) != ".") || (CNPJ.charAt(6) != ".") || (CNPJ.charAt(10) != "/") || (CNPJ.charAt(15) != "-")){
		if (erro.length == 0) erro += "E' necessarios preencher corretamente o numero do CNPJ! \n\n";
	}
	//substituir os caracteres que nao sao numeros
	if(document.layers && parseInt(navigator.appVersion) == 4){
		x = CNPJ.substring(0,2);
		x += CNPJ.substring(3,6);
		x += CNPJ.substring(7,10);
		x += CNPJ.substring(11,15);
		x += CNPJ.substring(16,18);
		CNPJ = x;	
	} else {
		CNPJ = CNPJ.replace(".","");
		CNPJ = CNPJ.replace(".","");
		CNPJ = CNPJ.replace("-","");
		CNPJ = CNPJ.replace("/","");
	}
	var nonNumbers = /\D/;
	if (nonNumbers.test(CNPJ)) erro += "A verificacao de CNPJ suporta apenas numeros! \n\n";	
	var a = [];
	var b = new Number;
	var c = [6,5,4,3,2,9,8,7,6,5,4,3,2];
	for (i=0; i<12; i++){
		a[i] = CNPJ.charAt(i);
		b += a[i] * c[i+1];
	}
	if ((x = b % 11) < 2) { a[12] = 0 } else { a[12] = 11-x }
	b = 0;
	for (y=0; y<13; y++) {
		b += (a[y] * c[y]); 
	}
	if ((x = b % 11) < 2) { a[13] = 0; } else { a[13] = 11-x; }
	if ((CNPJ.charAt(12) != a[12]) || (CNPJ.charAt(13) != a[13])){
		erro +="Digito verificador com problema!";
	}
	if (erro.length > 0){
		return false;
	} else {
		return true;
	}
	return true;
}
/**
 * Valida um campo do tipo CPF dado seu objeto (campo) 
 * o valor tem que possuir a maskara ex: 000.000.000-00
 * retorna true ou false conforme valido ou invalido
 */
nhJax.Utils.validaCPF = function (valor){
	try {
		var strcpf;
		strcpf = valor.substring(0,3);
		strcpf += valor.substring(4,7);
		strcpf += valor.substring(8,11);
		strcpf += valor.substring(12,14);
		s = strcpf;
	
		if (isNaN(s))
			return false;
		
		var i;
		var c = s.substr(0,9);
		var dv = s.substr(9,2);
		var d1 = 0;
		for (i = 0; i < 9; i++)
			d1 += c.charAt(i)*(10-i);
		if (d1 == 0)
			return false;
	    d1 = 11 - (d1 % 11);
	    if (d1 > 9) d1 = 0;         
		if (dv.charAt(0) != d1)
			return false;         
		d1 *= 2;
		for (i = 0; i < 9; i++)
			d1 += c.charAt(i)*(11-i);
		d1 = 11 - (d1 % 11);
		if (d1 > 9) d1 = 0;
		if (dv.charAt(1) != d1 || strcpf == '11111111111' || strcpf == '22222222222' || strcpf == '33333333333' || strcpf == '44444444444' || strcpf == '55555555555' || strcpf == '66666666666' || strcpf == '77777777777' || strcpf == '88888888888' || strcpf == '99999999999')
			return false;
	    return true;
	} catch (e) {
		if(nhJax.debug){
			alert('Erro::validaCPF::\n\nErro::'+e);
		}
	}
}

/**
 * Valida um campo do tipo data - wrapper para a funcao original isDate
 * dado o objeto (campo), retorna true ou false conforme valida ou invalida.
 * Verifica por anos bissextos, valores de dias e meses, etc.
 * E nao permite a inclusao de datas superiores a atual
 */
nhJax.Utils.validaDataAtual = function (valor){
	var yrLen = (valor.length == 8) ? 2 : 4;
	if( this.isDate(valor, yrLen ) ){
		hoje = new Date();
		barras = valor.split("/");
		if (barras.length == 3){
			dia = barras[0];
			mes = barras[1];
			mes = (new Number(mes)-1);//CORRECAO JS OBJETO DATE EM JAVASCRIPT NO MES E DE 0-11
			ano = barras[2];
			if( hoje.getFullYear() > new Number(ano) ){
				return true;
			}else if( hoje.getFullYear() == new Number(ano) &&  hoje.getMonth()  > new Number(mes) ){
				return true;
			}else if( hoje.getFullYear() == new Number(ano) &&  hoje.getMonth() == new Number(mes) && hoje.getDate() > new Number(dia) ){
				return true;
			}else if( hoje.getFullYear() == new Number(ano) &&  hoje.getMonth() == new Number(mes) && hoje.getDate() == new Number(dia) ){
				return true;
			}else{
				return false;
			}			
		}else{
			return false;
		}
	}else{
		return false;
	}
}
/**
 * Valida um campo do tipo data - wrapper para a funcao original isDate
 * dado o objeto (campo), retorna true ou false conforme valida ou invalida.
 * Verifica por anos bissextos, valores de dias e meses, etc.
 */
nhJax.Utils.validaData = function (valor){
	var yrLen = (valor.length == 8) ? 2 : 4;
	return this.isDate(valor, yrLen);
}
/**
 * DHTML date validation script for dd/mm/yyyy. Courtesy of SmartWebby.com (http://www.smartwebby.com/dhtml/)
 * Funcao auxiliar para a funcao isDate
 * Check that character is number.
**/ 
nhJax.Utils.isInteger = function (s){
    var i;
    for (i = 0; i < s.length; i++){   
        // Check that current character is number.
        var c = s.charAt(i);
        if (((c < "0") || (c > "9"))) return false;
    }
    // All characters are numbers.
    return true;
}
/**
 * DHTML date validation script for dd/mm/yyyy. Courtesy of SmartWebby.com (http://www.smartwebby.com/dhtml/)
 * Funcao auxiliar para a funcao isDate
 * Search through string's characters one by one.
**/ 
nhJax.Utils.stripCharsInBag = function (s, bag){
    var i;
    var returnString = "";
    // Search through string's characters one by one.
    // If character is not in bag, append to returnString.
    for (i = 0; i < s.length; i++){   
        var c = s.charAt(i);
        if (bag.indexOf(c) == -1) returnString += c;
    }
    return returnString;
}
/**
 * DHTML date validation script for dd/mm/yyyy. Courtesy of SmartWebby.com (http://www.smartwebby.com/dhtml/)
 * Funcao auxiliar para a funcao isDate
 * February has 29 days in any year evenly divisible by four,
 * EXCEPT for centurial years which are not also divisible by 400.
**/ 
nhJax.Utils.daysInFebruary = function (year){
    return (((year % 4 == 0) && ( (!(year % 100 == 0)) || (year % 400 == 0))) ? 29 : 28 );
}
/**
 * DHTML date validation script for dd/mm/yyyy. Courtesy of SmartWebby.com (http://www.smartwebby.com/dhtml/)
 * Funcao auxiliar para a funcao isDate
 * Dias em um array 
**/ 
nhJax.Utils.DaysArray = function (n) {
    for (var i = 1; i <= n; i++) {
        this[i] = 31
        if (i==4 || i==6 || i==9 || i==11) {this[i] = 30}
        if (i==2) {this[i] = 29}
   } 
   return this
}
/**
 * DHTML date validation script for dd/mm/yyyy. Courtesy of SmartWebby.com (http://www.smartwebby.com/dhtml/)
 * Valida a data
**/ 
nhJax.Utils.isDate = function (dtStr, yrLen){
	// Declaring valid date character, minimum year and maximum year
	var dtCh= "/";
	var minYear=1900;
	var maxYear=2100;

	var daysInMonth = this.DaysArray(12)
	var pos1=dtStr.indexOf(dtCh)
	var pos2=dtStr.indexOf(dtCh,pos1+1)
	var strDay=dtStr.substring(0,pos1)
	var strMonth=dtStr.substring(pos1+1,pos2)
	var strYear=dtStr.substring(pos2+1)
	strYr=strYear
	if(yrLen == 2){
		minYear = 0;
		maxYear = 99;
	}
	if (strDay.charAt(0)=="0" && strDay.length>1) strDay=strDay.substring(1)
	if (strMonth.charAt(0)=="0" && strMonth.length>1) strMonth=strMonth.substring(1)
	for (var i = 1; i <= 3; i++) {
		if (strYr.charAt(0)=="0" && strYr.length>1) strYr=strYr.substring(1)
	}
	month=parseInt(strMonth)
	day=parseInt(strDay)
	year=parseInt(strYr)
	if (pos1==-1 || pos2==-1){
		return false
	}
	if (strMonth.length<1 || month<1 || month>12){
		return false
	}
	if (strDay.length<1 || day<1 || day>31 || (month==2 && day>this.daysInFebruary(year)) || day > daysInMonth[month]){
		return false
	}
	if (strYear.length != yrLen || year==0 || year<minYear || year>maxYear){
		return false
	}
	if (dtStr.indexOf(dtCh,pos2+1)!=-1 || this.isInteger(this.stripCharsInBag(dtStr, dtCh))==false){
		return false
	}
	return true
}
/**
 * Conta os caracteres de um campo textarea e exibe a contagem em um elemento html
 * o id do input deve ser obj.id+'_COUNT'
 */
nhJax.Utils.countChars = function (obj,max){
    try {
        counter=$(obj.id + '_COUNT');
        if (obj.value.length > max){
        	obj.value = obj.value.substring(0,max);
        }else{
			counter.value = max - obj.value.length;
		}
    } catch (e) {
	    if(nhJax.debug){
			alert('Erro::countChars::\n\nErro::'+e);
		}
    }
} 
/**
 * Valida um campo do tipo hora dado o objeto (campo)
 * retorna true ou false conforme valido ou invalido
 */
nhJax.Utils.validaHora = function (valor){ 
	try {
		vlr = valor;
		if (vlr == "") {
			return false; 
		}else{
			space = vlr.indexOf(" ");
			if (space != -1)
				vlr = vlr.substring(space+1);
			hrs = (vlr.substring(0,2));
			minutos = (vlr.substring(3,5));

			if (vlr.length > 5) {
				segundos = (vlr.substring(6,8));
				if ( isNaN(segundos) || ( segundos < 00) || ( segundos > 59))
					return false;
			}

			if ( isNaN(hrs) || isNaN(minutos) ||  (hrs < 00 ) || (hrs > 23) || ( minutos < 00) || ( minutos > 59))
				return false;
		}
		return true;
	} catch (e) {
		if(nhJax.debug){
			alert('Erro::validaHora::\n\nErro::'+e);
		}
	}
}
/**
 * Valida um campo do tipo tipo email dado seu objeto
 * retorna true ou false conforme valido ou invalido
 */
nhJax.Utils.validaEmail = function (valor) {
	try {
		mail = valor;
		var er = new RegExp(/^[A-Za-z0-9_\-\.]+@[A-Za-z0-9_\-\.]{2,}\.[A-Za-z0-9]{2,}(\.[A-Za-z0-9])?/);
	    if(typeof(mail) == "string"){
	        if(er.test(mail)){ return true; }
	    }else if(typeof(mail) == "object"){
	        if(er.test(mail.value)){
	                    return true;
	                }
    	}else{
        	return false;
        }	
	} catch (e) {
		if(nhJax.debug){
			alert('Erro::validaEmail::\n\nErro::'+e);
		}
	}
}
/**
 * Valida um campo do tipo url (links) dado seu objeto
 * retorna true ou false conforme valido ou invalido
 */
nhJax.Utils.validaUrl = function (valor) {
	try {
		er = /^((http\:\/\/|https\:\/\/|ftp\:\/\/)|(www.))+(([a-zA-Z0-9\.-]+\.[a-zA-Z]{2,4})|([0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}))(\/[a-zA-Z0-9%:\/-_\?\.'~]*)?$/;
		if (!er.test(valor))
			return false;
		return true;
	} catch (e) {
		if(nhJax.debug){
			alert('Erro::validaUrl::\n\nErro::'+e);
		}
	}
}
/**
 * Verifica se a data de início é anterior à data final 
 */
nhJax.Utils.comparaDatas = function (ini, fim) {
	try {
		ini = ini.toArray("/");
		fim = fim.toArray("/");
		dtIni = new Date(ini[2], ini[1], ini[0]);
		dtFim = new Date(fim[2], fim[1], fim[0]);
		if (dtIni > dtFim)
			return false;
		return true;
	} catch (e) {
		if(nhJax.debug){
			alert('Erro::comparaDatas::\n\nErro::'+e);
		}
	}
}

/**
 * Verifica se a data de início é anterior à data final 
 */
nhJax.Utils.comparaDatasBrasil = function (ini, fim) {
	try {
		ini = ini.split("/");
		fim = fim.split("/");
		dtIni = new Date(ini[2], ini[1], ini[0]);
		dtFim = new Date(fim[2], fim[1], fim[0]);
		if (dtIni > dtFim)
			return false;
		return true;
	} catch (e) {
		if(nhJax.debug){
			alert('Erro::comparaDatas::\n\nErro::'+e);
		}
	}
}

/**
 * Verifica a que foi digitado se é numerico passando o evento
 */
nhJax.Utils.retTecla = function (e) {
	try {
		if(typeof(e)=='undefined')
			var e=window.event
		nTecla = e.keyCode;
	    var obj			= e.target?e.target:e.srcElement;
	    var BACKSPACE	= 8;
	    var DELETE		= 46;
	    var TAB			= 9;
	    var FRENTE		= 39;
	    var TRAS		= 37;
	    var teste		= (e.keyCode ? "keyCode" : e.which ? "which" : "charCode");
	    var tecla		= (e.which ? e.which : e.keyCode ? e.keyCode : e.charCode);
	    if (teste == "keyCode" && ((tecla == BACKSPACE )||(tecla == TAB)||(tecla == FRENTE)||(tecla == TRAS)||(tecla == DELETE)) && navigator.userAgent.indexOf("MSIE") == -1 ) {
	        return true;
	    }
	    if ( tecla == 13 )
	        return false;
	    if ((tecla<48)||(tecla>57)){
	        e.returnValue = false;
	        return false;
	    }
	    return true;
	} catch (e) {
		if(nhJax.debug){
			alert('Erro::retTecla::\n\nErro::'+e);
		}	
	}
}
/**
 * Verifica a que foi digitado se é numerico passando o elemento
 */
nhJax.Utils.checkNumber = function(val) {
  var strPass = val.value;
  var strLength = strPass.length;
  var lchar = val.value.charAt((strLength) - 1);
  var character = lchar.substring(0,1);
  var code = lchar.charCodeAt(0);
  var cCode = code;

  /* Check if the keyed in character is a number
     do you want alphabetic UPPERCASE only ?
     or lower case only just check their respective
     codes and replace the 48 and 57 */

  if (cCode < 48 || cCode > 57 ) {
    var myNumber = val.value.substring(0, (strLength) - 1);
    val.value = myNumber;
  }
  return false;
}
/*
 * Funcionalidade de mascara e validacao via JS
 * As funcoes abaixo tem dependencia da prototype.js  
 */
var NHMaskedInput = Class.create();
//Helper Functions for Caret positioning
NHMaskedInput.getCaretPosition=function(ctl){
	var res = {begin: 0, end: 0 };
	if (ctl.setSelectionRange){
		res.begin = ctl.selectionStart;
		res.end = ctl.selectionEnd;
	}else if (document.selection && document.selection.createRange){
		var range = document.selection.createRange();
		var rTemp = range.duplicate();
		res.begin = 0 - rTemp.moveStart('character', -100000);
		res.end = res.begin + range.text.length;
	}
	return res;
};
NHMaskedInput.setCaretPosition=function(ctl, pos){
	if(ctl.setSelectionRange){
		ctl.focus();
		ctl.setSelectionRange(pos,pos);
	}else if (ctl.createTextRange){
		var range = ctl.createTextRange();
		range.collapse(true);
		range.moveEnd('character', pos);
		range.moveStart('character', pos);
		range.select();
	}
};
//Main Method
Object.extend(NHMaskedInput.prototype, {
	//Helper function for regex building
	initialize: function(obj) {
		this.placeholder="_";
		this.mask=obj.mask;
		this.field=$(obj.id);
		this.obj=obj;
		//Build Regex for format validation
		//This Regex could be seriously optimized
		var reString="^";	
		for(var i=0;i<this.mask.length;i++){
			reString+=(this.getRegexForPosition(i) || ("\\"+this.mask.charAt(i)));
		}					
		reString+="$";
		this.re = new RegExp(reString);
		this.buffer=new Array(this.mask.length);
		this.locked=new Array(this.mask.length);		

		//Build buffer layour from mask
		for(var i=0;i<this.mask.length;i++){
			if(this.mask.charAt(i)!='#' && this.mask.charAt(i)!='!' && this.mask.charAt(i)!='?'){
				this.buffer[i]=this.mask.charAt(i);
				this.locked[i]=true;
			}else{
				this.buffer[i]=this.placeholder;
				this.locked[i]=false;
			}					
		}
		this.field.onfocus 	= this.focusEvent.bind(this);
		this.field.onblur	= this.checkVal.bind(this);
		this.field.onkeydown	= this.keydownEvent.bind(this);
		this.field.onkeypress	= this.keypressEvent.bind(this);
		var classNH = this;
		if( Prototype.Browser.IE ) {
			this.field.onpaste = this.checkVal.bind(this);
		}else{
			this.field.addEventListener('input', function(e){ classNH.checkVal(); },false);
		}
		this.checkVal();
		this.ignore=false;  //Variable for ignoring control keys
	},
	getRegexForPosition: function(pos){
		switch(this.mask.charAt(pos)){
			case '#':	return "[0-9]";			
			case '!':	return "[A-Za-z]";
			case '?':	return "[A-Za-z0-9]";
			default:	return null;
		}
	}, 
	writeBuffer: function(){
		var s="";
		for(var i=0;i<this.mask.length;i++){
			s+=this.buffer[i];
		}
		this.field.value = s;
	},
	checkVal: function(){
		if(!this.field.value.match(this.re)){
			//try to place charcters where they belong
			var field_val=this.field.value;
			var pos=0;
			for(var i=0;i<this.mask.length;i++){
				if(!this.locked[i]){
					while(pos++<field_val.length){
						//Regex Test each char here.
						var reChar=new RegExp(this.getRegexForPosition(i));
						if(field_val.charAt(pos-1).match(reChar)){
							this.buffer[i]=field_val.charAt(pos-1);
							break;
						}
					}
				}
			}
			this.writeBuffer();
		}
	},
	keypressEvent: function(e){
		if(this.ignore){
			this.ignore=false;
			return;
		}
		e=e||window.event;
		var k=e.charCode||e.keyCode||e.which;

		var pos=NHMaskedInput.getCaretPosition(this.field);
		var caretPos=pos.begin;	
		
		if(e.ctrlKey || e.altKey){//Ignore
			return true;
		}else if ((k>=41 && k<=122) ||k==32 || k>186){//typeable characters
			while(pos.begin<this.mask.length){	
				var reString=this.getRegexForPosition(pos.begin);
				var match;
				if(reString){
					var reChar=new RegExp(reString);
					match=String.fromCharCode(k).match(reChar);
				}else{//we're on a mask char, go forward and try again
					pos.begin+=1;
					pos.end=pos.begin;
					caretPos+=1;
					continue;
				}
				if(match){
					this.buffer[pos.begin]=String.fromCharCode(k);
				}else{
					return false;//reject char
				}
				while(++caretPos<this.mask.length){//seek forward to next typable position
					if(!this.locked[caretPos]){
						break;
					}
				}
				break;
			}
		}else{
			return false;
		}
		this.writeBuffer();
		NHMaskedInput.setCaretPosition(this.field,caretPos);
		return false;
	},
	keydownEvent: function(e){
		var pos=NHMaskedInput.getCaretPosition(this.field);
		if((pos.begin-pos.end)!=0){//delete selection before proceeding
			for(var i=pos.begin;i<=pos.end;i++){
				if(!this.locked[i])
					this.buffer[i]=this.placeholder;
			}	
		}
		e=e||window.event;
		var k=e.charCode||e.keyCode||e.which;
		//backspace and delete get special treatment
		if(k==8){//backspace
			while(pos.begin-->0){
				if(!this.locked[pos.begin]){
					this.buffer[pos.begin]=this.placeholder;
					this.writeBuffer();
					NHMaskedInput.setCaretPosition(this.field,pos.begin);
					return false;
				}
			}
		}else if(k==46){//delete
			for(var i=pos.begin;i<=pos.end;i++){
				if(!this.locked[i])
					this.buffer[i]=this.placeholder;
			}
			this.writeBuffer();
			NHMaskedInput.setCaretPosition(this.field,pos.begin);
			return false;
		}
		this.ignore=(k < 16 || (k > 16 && k < 32) || (k > 32 && k < 41));
	},
	focusEvent: function(){
		this.checkVal();
		NHMaskedInput.setCaretPosition(this.field,0);
	}
});	
/**
 * toggleWizard
 * Exibe o item seleciondado no wizard e oculta se houver outro aberto.
 * @author: Paulo Ferreira Nhaia
 * @param {int-num} Numero atual do elemento selecionado.
 * @param {int-numelems} Quantidade total de elementos.
 *
**/ 
nhJax.Utils.toggleWizard = function (num,numelems){
	for (var i=1;i<=numelems;i++){
		var tempc = 'wizard_'+i;
		var c = $(tempc);
		if(c != null && c.style.display != 'none'){
			Effect.toggle('wizard_'+i,'APPEAR',{duration:0.5});
	    }
	}
	Effect.toggle('wizard_'+num,'APPEAR',{ queue:{scope:'menus', position:'end', limit: 3}});
}