// JavaScript Document
//v 1.0
(function($) {
	$.fn.Rnd_Validation = function(customOptions) {
		//var base_url = 'http://www.render.com.br/';
		base_url = 'http://192.168.11.151/render/respostas2/';
		var options = {
						 'prefix_block_msg': 			'msg_valitade_to_'
						 ,'base_path':					 base_url
						 ,'link_remember_pass':			 base_url+'lembrar_senha'
						 ,'link_verify_email_in_use':	 base_url+'cadastro/verify_email_in_use/'
						 ,'class_style_msg_required':	'render_validate_msg_required'
						 ,'language':					'portuguese'
						 ,'use_debug':					false
						 ,'type_submit':				'submit'
						 ,'prefix_button_class_submit':	'submit_form_'
						 ,'class_scape_validate':		'no_validate_now' // classe para que o elemento não entre na rotina de validação em determinado momento
						 ,'class_scape_validate_empty':	'no_validate_empty' // classe para que o elemento não entre na rotina de validação em determinado momento se estiver vazio
						 ,'js_exec_before_try_submit':	''
					}
		var $messages = {
						'portuguese' 	: 	{
											'nome' 					: 'Nome'
											,'sobrenome' 			: 'Sobrenome'
											,'selecione'			: '- Selecione -'
											,'campo_obrigatorio'	: 'Campo obrigatório'
											,'confirmacao_senha'	: 'A <b>Confirmação de Senha</b> deve ser igual ao campo <b>Senha'
											,'email_invalido'		: 'Email inválido'
											,'email_ja_registrado'	: 'Este e-mail já está registrado'
											,'esqueceu_sua_senha'	: 'Esqueceu sua senha?'
											}
						,'english' 		: 	{
											}
						,'spanish' 		: 	{
											}
						}
		$.extend(options, customOptions); 
		
		
		return this.each(function(index) {
			var $element_Form = $(this);
			log('class Rnd_Validation started');
			$('.'+options.prefix_button_class_submit+$element_Form.attr('id')).bind('click', function(){
																				
														 if(validate_form_to_submit()){
														 	//document.formLogin.submit();
															$element_Form.trigger(options.type_submit);
														 }else{
															var a = $(".block_validate_tooltip");
															$('html,body').animate({scrollTop: ($(a[0]).offset().top-150)+'px'}, 500);
														 }
													 });
			/*
			*	função de inicialização
			*/
			function init() {
			
				if($($element_Form).is('input') || $($element_Form).is('select') || $($element_Form).is('radio') || $($element_Form).is('checkbox')){
					
					apply_validation($($element_Form));
				}else{
					$($element_Form).contents().find(':text,:password,:radio,:checkbox,:select').each(function(index){
																		apply_validation(this)
																		 });
				}
			}
			
			/************************************************************************************************/
			/*										AÇÕES
			/************************************************************************************************/
			function validate_form_to_submit(){
				if(options.js_exec_before_try_submit != ''){
					try{
						eval(options.js_exec_before_submit);
					}catch(err){
						alert('Ops, problema ao concluir a requisição - Code: '+err);
					}
				}
				$('.block_validate_tooltip').remove();
				if($($element_Form).is('input') || $($element_Form).is('select') || $($element_Form).is('radio') || $($element_Form).is('checkbox')){
					$($element_Form).trigger('blur');
				}else{
					/*
					$($element_Form).contents().find(':text,:password,:radio,:checkbox,:select').each(function(index){
																			$(this).trigger('blur');
																		 });
					*/
					$('.valid_required, .valid_required_radio, .valid_required_checkbox, .valid_email, .valid_email_register, .valid_required_passwd, .valid_onlyNumber, .valid_least_one_selected, .valid_first_letter_upper_words').trigger('blur');
					
				}
				
				
				
				if($('.block_validate_tooltip:visible').length < 1){
					return true;
				}else{
					return false;
				}
			}
			
			function apply_validation(obj){
				 if($(obj).hasClass("valid_required")){
					if($(obj).is(':radio')){
						valid_required_radio(obj);
					}else if($(obj).is(':checkbox')){
						valid_required_checkbox(obj);
					}else{
						valid_required(obj);
					}
				 }
				 if($(obj).hasClass("valid_email")){
					 valid_email(obj);
				 }
				 if($(obj).hasClass("valid_email_register")){
					 valid_email_register(obj);					 
				 }
				 if($(obj).hasClass("valid_required_passwd")){
					 valid_required_passwd(obj);					 
				 }
				 if($(obj).hasClass("valid_onlyNumber")){
					 valid_onlyNumber(obj);					 
				 }
				 if($(obj).hasClass("valid_least_one_selected")){
					 valid_least_one_selected(obj);					 
				 }
				 if($(obj).hasClass("valid_first_letter_upper_words")){
					 valid_first_letter_upper_words(obj);					 
				 }
				 return true;				 
			}
			
			// remove mensagens de validação do html
			function remove_msg_validate(obj){
//				$('#'+options.prefix_block_msg+$(obj).attr('id')).remove();
				$('#'+options.prefix_block_msg+$(obj).attr('id')).css({'display':'none'});
				return true;
			}
			
			function mount_block_validate_msg(element_id, msg, position, type){
				/*
				return "<div class='block_validate_tooltip' id='"+options.prefix_block_msg+element_id+"'><span class='msg_validate_tooltip'><span class='validate_image_"+type+"'></span><span style='display:inline;float:left;' id='msg_"+options.prefix_block_msg+element_id+"'>"+msg+"</span></span><span class='validate_seta_"+position+"'></span></div>";
				*/
				return "<div class='block_validate_tooltip validate_image_"+type+"' id='"+options.prefix_block_msg+element_id+"'><span class='msg_validate_tooltip'><span style='display:inline;float:left;' id='msg_"+options.prefix_block_msg+element_id+"'>"+msg+"</span></span><span class='validate_seta_"+position+"'></span></div>";
				
				
			}
			
			function display_invalid(obj, msg, type){
				
				remove_msg_validate(obj);
				if($(obj).hasClass(options.class_scape_validate)){
					return false;
				}
				if($(obj).hasClass(options.class_scape_validate_empty) && $(obj).val() == ''){
					return false;
				}
				
				var position = get_pos_to_msg(obj);
				
				if($("#"+options.prefix_block_msg+$(obj).attr('id')).length < 1 ){
					// ajuste para IE6 - z-index
					if(position == 'left' || position == 'top'){
						$(obj).before(mount_block_validate_msg($(obj).attr('id'), msg, position, type)); 
					}else{
						$(obj).after(mount_block_validate_msg($(obj).attr('id'), msg, position, type)); 
					}
				}else{
					// workaround para diminuir execução de código
					var _a = /\"/gi;
					if($("#msg_"+options.prefix_block_msg+$(obj).attr('id')).html().replace(_a,"'") !== msg){
						log('display_invalid: replaceWith() msg');
						if(position == 'left' || position == 'top'){
							$("#"+options.prefix_block_msg+$(obj).attr('id')).replaceWith(mount_block_validate_msg($(obj).attr('id'), msg, position, type));
						}else{
							$("#"+options.prefix_block_msg+$(obj).attr('id')).replaceWith(mount_block_validate_msg($(obj).attr('id'), msg, position, type));
						}
					}else{
						log('display_invalid: display error');
						$("#"+options.prefix_block_msg+$(obj).attr('id')).css({'display':'inline'});	
					}
				}
				
				

				//document.body.appendChild(a); 
				
				var $medidas = 	{
								'el_width'			: parseInt($(obj).width()) 							// largura
								,'el_height'		: parseInt($(obj).height())							// altura
								,'el_pos_x'			: parseInt($(obj).position().left) 											// posição x na página
								,'el_pos_y'			: parseInt($(obj).position().top) 											// posição y na página
								,'width_msg'		: parseInt($("#"+options.prefix_block_msg+$(obj).attr('id')).contents().width())
								,'height_msg'		: parseInt($("#"+options.prefix_block_msg+$(obj).attr('id')).contents().height())
								};
				

				// calcular posição
				var x = 0;
				var y = 0;
				if(isNaN($medidas.width_msg)){
					$medidas.width_msg = 150;
				}
				if(isNaN($medidas.height_msg)){
					$medidas.height_msg = 20;
				}
				if(isNaN($medidas.el_pos_x)){
					$medidas.el_pos_x = 0;
				}
				if(isNaN($medidas.el_pos_y)){
					$medidas.el_pos_y = 0;
				}
				switch (position){
					case 'left':
						x = $medidas.el_pos_x - 10 - ($medidas.width_msg);
						y = (el_height / 2 ) + el_pos_y - (height_msg / 2);
						break;
					case 'right':
						x = $medidas.el_pos_x + 10 + ($medidas.el_width);
						y = ($medidas.el_height / 2 ) + $medidas.el_pos_y - ($medidas.height_msg / 2);
						break;
					case 'top':
						x = $medidas.el_pos_x + ($medidas.el_width / 2) - ($medidas.width_msg /2) ;
						y = $medidas.el_pos_y - 10 - ($medidas.height_msg);
						break;
					case 'bottom':
						x = $medidas.el_pos_x + ($medidas.el_width / 2) - ($medidas.width_msg /2) ;
						y = $medidas.el_pos_y + 10 + $medidas.el_height;
						break;
				}
				
				$('#'+options.prefix_block_msg+$(obj).attr('id')).css({'left': x+'px', 'top': y+'px'});
				//alert("{'left': +"+x+"+'px', 'top': "+y+"+'px'}'");
				//alert("$medidas.el_width = "+$medidas.el_width+" | $medidas.el_height = "+$medidas.el_height+" | $medidas.el_pos_x = "+$medidas.el_pos_x+" | $medidas.el_pos_y = "+$medidas.el_pos_y+" | $medidas.width_msg = "+$medidas.width_msg+" | $medidas.height_msg = |"+$medidas.height_msg)
				return false;
			}
			
			function return_msg(obj, msg_item){
				if($(obj).hasClass("use_alt_tag")){
					return "<span style='float:left;width:165px;'>"+$(obj).attr('alt')+"</span>";
				}else{
					return $messages[options.language][msg_item];
				}
			}
			/************************************************************************************************/
			/*										VALIDAÇÕES
			/************************************************************************************************/
			
			// VALIDA CAMPO PARA NÃO ACEITAR VAZIO
			// funções que precisam verificar o conteúdo do campo passam por aqui e já não são executadas caso o valor seja vazio
			function valid_required(obj){
				$(obj).bind('blur', function () {
					//log('exec valid_required');
					if($(obj).hasClass(options.class_scape_validate)){
						remove_msg_validate(obj);
						return;
					}
					if($(this).val() == '' || $(this).val() == null || $(this).val() == $messages[options.language].nome || $(this).val() == $messages[options.language].sobrenome || $(this).val() == $messages[options.language].selecione){
						var msg = "<span class='"+options.class_style_msg_required+" "+options.prefix_block_msg+this.id+"'>"+return_msg(obj,'campo_obrigatorio')+"</span>";
				
						display_invalid(obj, msg, 'alert');
					}
				}).bind('focus', function () {
					  remove_msg_validate(obj);
				});
				return true;
			}
			
			
			function valid_first_letter_upper(obj){
				$(obj).bind('blur', function(){
					$(obj).val($(obj).val().substr(0, 1).toUpperCase() + $(obj).val().substr(1));
				});
				return true;
			}
			function valid_first_letter_upper_words(obj){
				$(obj).bind('blur', function(){
					var sp = $(obj).val().split(' ');
					var wl=0;
					var f ,r;
					var word = new Array();
					for (i = 0 ; i < sp.length ; i ++ ) {
					f = sp[i].substring(0,1).toUpperCase();
					r = sp[i].substring(1);
					word[i] = f+r;
					}
					$(obj).val(word.join(' '));
				});
				return true;
			}
			// validação de radio buttons, para que tenha pelo menos um marcado
			// somente um dos radios do mesmo nome podem estar com a tag de validação para ativar a validação, e de preferencia o ultimo da lista
			function valid_required_radio(obj){
				$(":radio[name='"+$(obj).attr('name')+"']").bind('blur', function () {
					if($(obj).hasClass(options.class_scape_validate)){
						remove_msg_validate(obj);
						return;
					}
					if($(":radio[name='"+$(obj).attr('name')+"'][checked]").length <=0){
						var msg = "<span class='"+options.class_style_msg_required+" "+options.prefix_block_msg+this.id+"'>"+return_msg(obj,'campo_obrigatorio')+"</span>";
						display_invalid(obj, msg, 'alert');
					}
				}).bind('focus', function () {
					  remove_msg_validate(obj);
				});
				return true;
			}
			
			function valid_required_checkbox(obj){
				$(obj).bind('blur', function () {
					if($(obj).hasClass(options.class_scape_validate)){
						remove_msg_validate(obj);
						return;
					}
					
					if($(":checkbox[name='"+$(obj).attr('name')+"'][checked]").length <=0){
						var msg = "<span class='"+options.class_style_msg_required+" "+options.prefix_block_msg+$(obj).attr('id')+"'>"+return_msg(obj,'campo_obrigatorio')+"</span>";
						display_invalid(obj, msg, 'alert');
					}
				}).bind('focus', function () {
					  remove_msg_validate(obj);
				});
				return true;
			}
			
			// compara valor, usado para comparar campos de senha
			// o campo de comparação deve ter o nome do campo principal +'_compare'
			function valid_required_passwd(obj){
				var orig_campo = ($(obj).attr('id')).replace('_compare','');
				$(obj).bind('blur', function() {
					if($(obj).hasClass(options.class_scape_validate)){
						remove_msg_validate(obj);
						return;
					}
					if($(this).val() == ''){
						var msg = "<span class='"+options.class_style_msg_required+" "+options.prefix_block_msg+this.id+"_compare'>"+$messages[options.language].campo_obrigatorio+"</span>";
						display_invalid(obj, msg, 'alert');
					}else if(compare_values($(this).attr('id'), orig_campo)){
						var msg = "<span class='"+options.class_style_msg_required+" "+options.prefix_block_msg+this.id+"_compare'>"+$messages[options.language].confirmacao_senha+"</span>";
						display_invalid(obj, msg, 'error');
					}
				});
				// ativa validação ao dar blur no primeiro campo
				/*
				$('#'+orig_campo).bind('blur', function () {
					$(this).trigger('blur');
				});
				*/
				// remove mensagem se um dois dois campos receber focus
				$('#'+orig_campo+',#'+$(obj).attr('id')).bind('focus', function () {
					  remove_msg_validate(obj);
				});
				/*
				$(this).bind('focus', function () {
					  remove_msg_validate(prefix_block_msg+this.id);
				});
				*/
				return true;
			}
			
			// VALIDA CAMPO PARA NÃO ACEITAR UM VALOR DIFERENTE DE UM EMAIL VÁLIDO
			function valid_email(obj){
				log('function valid_email');
				$(obj).bind('blur', function () {
					if($(obj).hasClass(options.class_scape_validate)){
						remove_msg_validate(obj);
						return;
					}
					if($(this).val() == ''){
						var msg = "<span class='"+options.class_style_msg_required+" "+options.prefix_block_msg+this.id+"'>"+$messages[options.language].campo_obrigatorio+"</span>";
						display_invalid(obj, msg, 'alert');
					}else{
						if(!validate_email($(this).val())){ // SE VALOR FOR INVÁLIDO
							var msg = "<span class='"+options.class_style_msg_required+" "+options.prefix_block_msg+this.id+"'>"+$messages[options.language].email_invalido+"</span>";
							display_invalid(obj, msg,  'error');
						}
					}
				}).bind('focus', function () {
					 remove_msg_validate(obj);
				});
				return true;
			}
			
			// VALIDA CAMPO PARA NÃO ACEITAR UM VALOR DIFERENTE DE UM EMAIL VÁLIDO E QUE NÃO ESTEJA CADASTRADO
			function valid_email_register(obj){
				log('function valid_email_register');
				$(obj).bind('blur', function () {
					if($(obj).hasClass(options.class_scape_validate)){
						remove_msg_validate(obj);
						return;
					}
					if($(this).val() == ''){
						var msg = "<span class='"+options.class_style_msg_required+" "+options.prefix_block_msg+this.id+"'>"+$messages[options.language].campo_obrigatorio+"</span>";
						
						display_invalid(obj, msg, 'alert');
					}else{
						if(validate_email($(this).val())){
							log('function valid_email_register exec');
							var value_test = validate_email_register($(this).val());
							if(value_test == 'in_use'){
								var msg = "<span class='"+options.class_style_msg_required+" "+options.prefix_block_msg+this.id+"'>"+$messages[options.language].email_ja_registrado+"!<br /> <a href='"+options.link_remember_pass+"' target='_blank'>"+$messages[options.language].esqueceu_sua_senha+"</a></span>";
								display_invalid(obj, msg, 'error');
							}else if(value_test == 'null'){
								var msg = "<span class='"+options.class_style_msg_required+" "+options.prefix_block_msg+this.id+"'>"+$messages[options.language].email_invalido+"</span>";
								display_invalid(obj, msg,  'error');
							}
						}else{
							var msg = "<span class='"+options.class_style_msg_required+" "+options.prefix_block_msg+this.id+"'>"+$messages[options.language].email_invalido+"</span>";
							display_invalid(obj, msg,  'error');
						}
					}
				}).bind('focus', function () {
					  remove_msg_validate(obj);
				});
				return true;
			}
			
			// return ok, in_use, null  (null para vazio
			function validate_email_register(email){
				if(validate_email(email)){
					return $.ajax({   url: options.link_verify_email_in_use+email,   async: false  }).responseText;
				}else{
					return false;
				}
			}
			
			// validação de string de email
			// return true or false
			function validate_email(email){
				// http://docs.jquery.com/Plugins/Validation/Methods/email
				// contributed by Scott Gonzalez: http://projects.scottsplayground.com/email_address_validation/
				return /^((([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+(\.([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+)*)|((\x22)((((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(([\x01-\x08\x0b\x0c\x0e-\x1f\x7f]|\x21|[\x23-\x5b]|[\x5d-\x7e]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(\\([\x01-\x09\x0b\x0c\x0d-\x7f]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]))))*(((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(\x22)))@((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?$/i.test(email);
			}
			
			// somente número
			function valid_onlyNumber(obj){
				log('function valid_onlyNumber');
				$(obj).bind('keyup', function(e){
					if($(obj).hasClass(options.class_scape_validate)){
						remove_msg_validate(obj);
						return;
					}
					var a = $(this).val();
					if(a.length > 0){
						var num = /\D/gi;
						$(this).val(a.replace(num, ''));					
					}
					log('function valid_onlyNumber: '+a.replace(num, ''));
				  }).bind('blur', function (){ $(obj).trigger('keyup');});
			}
			
			
			// DETECTA QUAL POSIÇÃO DEVE EXIBIR A MENSAGEM DE ERRO
			// DEVE EXISTIR UMA CLASSO DE ACORDO COM O NOME DA POSIÇÃO QUE DESEJA SER EXIBIDO
			// CLASSES:
			// -> valid_on_rigth = default caso não tenha nenhum dos outros parâmetros. Não é necessário definir esta variável caso deseja que seja exibido na lateral direita a mensagem de validação
			// -> valid_on_left
			// -> valid_on_top
			// -> valid_on_bottom
			function get_pos_to_msg(obj){
				var position = 'right';
				if($(obj).hasClass("valid_on_bottom")){
					position = 'bottom';
				}else if($(obj).hasClass("valid_on_top")){
					position = 'top';
				}else if($(obj).hasClass("valid_on_left")){
					position = 'left';
				}else if($(obj).hasClass("valid_on_right")){
					position = 'right';
				}
				return position;
			}
			
			
			// compara valores de dois campos
			// usado para comparar campos de senha
			function compare_values(El_id_value, El_id_value_compare){
				log('function compare_values: '+El_id_value+'|'+El_id_value_compare);
				if($('#'+El_id_value).val() == $('#'+El_id_value_compare).val()){
					return false;
				}else{
					return true;
				}
			}

			/************************************************************************************************/
			/*										SETA CONFIGS 
			/************************************************************************************************/
			
			
			/*
			*	seta valor na variável de configuração
			*/
			function set_config_item(key, value){
				try {
					options[key] = value;
				}
				catch(exception) {
					log(exception);
				}
				return true;
			}
			
			
			
			/************************************************************************************************/
			
			
			
			/*
			* debug
			*/			
			function log(message) {
				if(options.use_debug === true){
					message = 'Log: '  + message;
					if(window.console) {
						console.debug(message);
					} else {
						alert(message);
					}
				}
				return true;
			};

			init();
		});
	}
})(jQuery);


// $('#seta_teste').Rnd_Tooltip({'html_content':'<h3>teste</h3>'})
