/**
 * Plugin de validacion de jQuery desarrollado para proyectos anteriores
 * reutilizado para proyecto de la bolsa de trabajo. las validaciones se colocan
 * como funciones de jquery con prefijo 'validate' y despues el nombre de una
 * clase css. Aprovechando que se pueden utilizar multiples clases de css para
 * cada etiqueta html, se dividen las validaciones en las clases de css, de esta
 * forma si se necesita validar un email que es requerido, para validar esta
 * condicion ademas del formato se puede crear el tag input de la siguiente
 * manera:
 * 
 * <input name="email" class="required email"/>
 * 
 * despues de validar el formulario, el plugin se encarga de hacer el resto por
 * ejemplo:
 * 
 * $('#formId').validate(['input.required', 'input.email', 'input.rfc'])
 * $('#formId').submit( function() { return
 * $(this).formValidation(['input.required', 'input.email', 'input.rfc']); });
 * 
 * Este plugin aun puede mejorarse, por ejemplo puede suprimirse la necesidad de
 * pasar 2 veces los selectores en el metodo validate y el metodo
 * formValidation. Otra mejora es que se validen solo los selectores que se
 * pasan. Actualmente el plugin hace todas las validaciones que localice en las
 * clases del tag
 * 
 * Utiliza las siguientes clases que deben contener imagenes y formato adecuado
 * a la funcion:
 * 
 * validateok - provee feedback al usuario respecto a la correcta validacion del
 * campo validateerror - provee feedback al usuario respecto a la incorrecta
 * validacion del campo highlighted - indica si un input o una serie de inputs
 * que representan un valor, tienen en su conjunto un error
 * 
 * 
 * Las clases validateok y validateerror se colocan en un em que se coloca en el
 * elemento 'padre' de los tags validados la clase highlited hace referencia al
 * tag validado o al conjunto de tags validados
 * 
 */
(function($) {
   String.prototype.trim = function() {return this.replace(/^\s*|\s*$/g, '');};
   String.prototype.trimLeadingZero = function () {return
this.replace(/^0+/, '')};
   // Funcion de logging
       var _start = new Date().getTime();
   $.fn.log = function (_log_) {
       if($("#logging").length == 0){
               $logging = "<div id='logging' style='position: fixed; overflow: auto; top: 0; left: 0; right: 0; background-color: #CCC; filter: alpha(opacity=70) height: 300px;'>&nbsp;</div>";
               $('body').append($logging);
       }

       if($("span", $('#logging')).length >= 20){
               // Remove directo no funcionaba correctamente
           setTimeout(function(){$("span", $('#logging')).eq(0).remove();}, 0);
       }

       $('#logging')
       .append(["<span style='display: block; line-height: 1'>", "[",
                new Date().getTime() - _start, "]", _log_,"</span>"].join(''));
   }

   $.fn.appendParentError = function (_error_) {
     $(".validateok, .validateerror", $(this).parent()).remove();
     $(this).parent().append(["<em class='validateerror'>",
     ,_error_
     ,"</em>"].join(''));
     
   }

   $.fn.parentAsertion = function () {
       if($(".validateok", $(this).parent()).length == 0) {
               $(this).parent().append("<em class='validateok'>&nbsp;</em>");
       }
   }
   
   $.fn.parentError = function () {
       if($(".validateerror", $(this).parent()).length == 0) {
               $(this).parent().append("<em class='validateerror'>&nbsp;</em>");
       }
   }
   
   $.fn.clean = function () {
	   $(this).val("");
	   $(this).rmhighlight();
	   $(this).removeParentError();
	   $(this).css("visibility", "hidden");
   }
   
   $.fn.cleanCheck = function () {
	   $(this).attr('checked', false);
	   $(this).css("visibility", "hidden");
   }
   
   $.fn.validatenumeros = function () {
	   var regExPattern = /^[0-9]+$/;    
	   var mensajeError = 'Debe ingresar solo números.';
	   var $_val = $(this).val().trim();
	   if (!$_val.match(regExPattern) && $_val != '') {
		   $(this).highlight();
		   $(this).removeParentAsertion();
		   $(this).parentError();
		   alert(mensajeError);
	   } else {
		   $(this).rmhighlight();
		   $(this).removeParentError();
	   }
   }
   
   $.fn.validatealfanumerico = function () {
	   var regExPattern = /^[a-zA-Z0-9]+$/;   
	   var mensajeError = 'Debe ingresar solo números y letras.';
	   var $_val = $(this).val().trim();
	   if (!$_val.match(regExPattern) && $_val != '') {
		   $(this).highlight();
		   $(this).removeParentAsertion();
		   $(this).parentError();
	   } else {
		   $(this).rmhighlight();
		   $(this).removeParentError();
		   return "";
	   }
   }
   
   $.fn.validatecodp = function () {
	   var regExPattern = /^[a-zA-Z0-9]+$/;   
	   var $_val = $(this).val().trim();
	   if (!$_val.match(regExPattern) && $_val != '') {
		   return "Ingresar solo números y letras.";
	   }
	   return "";
   }
   
   $.fn.validateexperiencia = function () {
	   var regExPattern = /^[0-9]+$/;  
	   var $_val = $(this).val().trim();
	   if($_val == null || $_val == '') {
		   $(this).highlight();
		   $(this).parentError();
	   } else if(parseInt($_val) != null && parseInt($_val) == 0) {
		   $(this).highlight();
		   $(this).parentError();
	   } else if (!$_val.match(regExPattern) && $_val != '') {
		   $(this).highlight();
		   $(this).removeParentAsertion();
		   $(this).parentError();
	   } else {
		   $(this).rmhighlight();
		   $(this).removeParentError();
		   return "";
	   }
   }
   
   $.fn.validateultimouso = function () {
	   var regExPattern = /^[0-9]+$/; 
	   var $_val = $(this).val().trim();
	   if($_val == null || $_val == '') {
		   $(this).highlight();
		   $(this).parentError();
	   } else if (!$_val.match(regExPattern) && $_val != '') {
		   $(this).highlight();
		   $(this).removeParentAsertion();
		   $(this).parentError();
	   } else {
		   $(this).rmhighlight();
		   $(this).removeParentError();
		   return "";
	   }
   }

   $.fn.removeParentError = function() {
     $(".validateerror", $(this).parent()).remove();
   }
   
   $.fn.removeParentAsertion = function() {
	 $(".validateok", $(this).parent()).remove();
   }

   $.fn.highlight = function () {
       $(this).addClass('highlighted');
   };

   $.fn.rmhighlight = function () {
       $(this).removeClass('highlighted');
   };

   $.fn.validaterfc = function () {
       if(!(/^[A-Z]{3,4}[0-9]{6}([0-9A-Z]{3})?$/).test($(this).val().trim().toUpperCase())
            && $(this).val() != "") {
           return "RFC inv&aacute;lido";
       }
       return "";
   };

   $.fn.validatenums = function () {
       if (/\D/.test($(this).val().trim())) {
           return "Ingresar solo n&uacute;meros.";
       }
       return "";
   }

   $.fn.validateemail = function () {
       if($(this).val() != ""
               && !(/^[a-z][a-z0-9_]*([.-]?[a-z0-9_])*@[a-z0-9]+?(-?[a-z0-9_])*?(\.[a-z0-9]{2,})+$/).test($(this).val().trim())) {
           return "e-mail inv&aacute;lido";
       }
       return "";
   };

   $.fn.validatesexo = function () {
       var $_inputs =$('input', $(this))
       if (!$_inputs.eq(0).attr('checked') && !$_inputs.eq(1).attr('checked')) {
           return "Campo requerido";
       }
       return "";
   }

   $.fn.bindsexovalidation = function () {
       var $_inputs = $('input', $(this));
       var $span = $(this);
       $_inputs.blur(function() {
           $span.blur();
       });
   }

   $.fn.validateemails = function() {
       var $_inputs = $('input', $(this));
       var emailResult = [$_inputs.eq(0).validateemail()];
       if ("" == $_inputs.eq(0).val().trim()) {
           return "Campo requerido";
       }
       else if ("" != emailResult[0]) {
           return emailResult
       }
       else if ($_inputs.eq(0).val().trim() != $_inputs.eq(1).val().trim()) {
           return "E-mails no coinciden";
       }
       return "";
   }

   $.fn.validatepasswords = function () {
       var $_inputs = $('input', $(this));
       if ("" == $_inputs.eq(0).val().trim()) {
           return "Campo requerido";
       }
       else if ($_inputs.eq(0).val().trim() != $_inputs.eq(1).val().trim()) {
           return "Confirmaci&oacute;n de password no coincide";
       } else if($_inputs.eq(0).val().trim().length < 6 ) {
           return "Longitud m&iacute;nima de 6 caracteres";
       }
       return null;

   }

   $.fn.validatetel = function () {
       $_inputs = $("input", $(this));
       $_telephone = [$_inputs.eq(0).val(), $_inputs.eq(1).val()].join('-');

       if((/^$|^-$/).test($_telephone.trim())) {
           return "Campo requerido";
       }

       if(!(/^((55|81|33)-[0-9]|[0-9]{3}-)[0-9]{7}$/).test($_telephone)) {
           return "Tel&eacute;fono inv&aacute;lido"
       }

       return "";
   }

   $.fn.validatereq = function () {
       if($(this).val() == null || $(this).val().trim() == "") {
           return "Campo requerido";
       }
       return "";
   };

   $.fn.validatecp = function () {
       if(!/^$/.test($(this).val().trim()) &&!/^\d{5}$/.test($(this).val().trim())) {
               return "C&oacute;digo postal Inv&aacute;lido";
       }
       return "";
   }



   // valida fechas entre 1930 y 2019
   $.fn.validatedate = function () {
      var valdate1 = /^(0[1-9]|10|[12][1-9]|20|[12][1-9]|3[01])\/(0[13578]|1[02])\/(19[3-9][0-9]|20[01][0-9])$/; // Meses
																									// de
																									// 31
																									// dias
      var valdate2 = /^(0[1-9]|10|[12][1-9]|20|[12][1-9]|30)\/(0[469]|11)\/(19[3-9][0-9]|20[01][0-9])$/; // Meses
																							// de
																							// 30
																							// dias
      var valdate3 = /^(0[1-9]|10|[12][0-8]|20|[12][1-9]|19)\/02\/(19[3-9][0-9]|20[01][0-9])$/; // febrero
      var valdate4 = /^29\/02\/(19[3579][26]|19[468][048]|20(0[048]|1[26]|20))$/; // 29
																					// de
																					// febrero
																					// annio
																					// biciesto
      if (valdate1.test($(this).val())
              || valdate2.test($(this).val())
              || valdate3.test($(this).val())
              || valdate4.test($(this).val())) {
          return ""
      }
       return "Fecha inv&aacute;lida";
   }



   $.fn.validations = function () {
       $_this = $(this);
       $_classes = $_this.attr("class").split(' ');
       var __results__ = [];
       for($_class in $_classes) {
           if($_this[['validate', $_classes[$_class]].join('')]) {
               var __result__ = $_this[['validate', $_classes[$_class]].join('')]();
               if(__result__ != null && __result__.length > 0) {
                   __results__.push(__result__);
                   break;
               }
           }
       }
       return __results__;
   };

   $.fn.bindpasswordsvalidation = function () {
        var $_inputs = $('input', $(this));
        var _passwordsdiv = $(this)
        _passwordsdiv.unbind('keyup');

        var blurfn = function() {
            $_inputs.eq(0).unbind('blur').blur(blurfn);
            var _results_ = _passwordsdiv.validations();
            if(_results_.length > 0) {
                $('input', _passwordsdiv).highlight();
                $(_passwordsdiv).removeParentError();
                $(_passwordsdiv).appendParentError(_results_.join(''));
            } else {
                $('input', _passwordsdiv).rmhighlight();
            }
        }

         _passwordsdiv.keyup(function(){
            var _passresults = $(this).validations();
            if (_passresults.length == 0) {
                $('input', _passwordsdiv).rmhighlight();
                _passwordsdiv.removeParentError();
            }
        });
        $_inputs.eq(1).blur(blurfn);
        $_inputs.keyup(function() {
            _passwordsdiv.keyup();
        });
   }

   /* bind para validar dos e-mails */
   $.fn.bindemailsvalidation = function() {
        var $_inputs = $('input', $(this));

        var emailsdiv = $(this);
        emailsdiv.unbind('keyup'); // keyup se maneja distinto de inputs
									// 'text''
        var blurfn = function() {
            $_inputs.eq(0).unbind('blur').blur(blurfn);
            var _results_ = emailsdiv.validations();
            if(_results_.length > 0) {
                $('input', emailsdiv).highlight();
                emailsdiv.removeParentError();
                emailsdiv.appendParentError(_results_.join(''));
            } else {
                $('input', emailsdiv).rmhighlight();
            }
        }

        emailsdiv.keyup(function(){
            var _emailsresults = $(this).validations();
            if (_emailsresults.length == 0) {
                $('input', emailsdiv).rmhighlight();
                emailsdiv.removeParentError();
            }
        });
        
        $_inputs.eq(1).blur(blurfn);

        $_inputs.keyup(function() {
            emailsdiv.keyup();
        });
   }

   $.fn.bindtelvalidation = function() {// No se utiliza en la bolsa de trabajo
       // para validar un telefono debe haber 2 campos de captura de datos
       var $_inputs = $('input', $(this));

       // Evento blur solo para el segundo input
       $_inputs.eq(1).blur(function(){
           $($(this).parent()).removeParentError();
           var _results_ = $($(this).parent()).validations();
           if(_results_.length > 0){
               $($(this).parent()).appendParentError(_results_.join(''));
               $($(this).parent()).highlight();
           } else {
               $($(this).parent()).rmhighlight();
           }
       });

       // Evento keyup para los dos inputs
       $_inputs.keyup(function() {
           $($(this).parent()).keyup();
       });

    }

    $.fn.validatemesannio = function () {
        if (/^(0[1-9]|1[012])\/(19[789][0-9]|20[01][0-9])$/.test($(this).val())) {
            return "";
        }
        return "&nbsp;";
    }

   $.fn.validate = function ($_selectors) {
       $($_selectors.join(', '), $(this)).blur(function() {
         $_this = $(this)
         $_this.removeParentError();
         var __results__ = $_this.validations();
         if (__results__.length > 0) {
             if ($(this).attr('tagName') == 'SPAN') {
                 $('input', $(this)).eq(0).appendParentError(__results__.join());
             } else {
                 $_this.appendParentError(__results__.join(''));
                 $_this.highlight();
             }
         } else {
             $_this.rmhighlight();
             if ($_this.attr('tagName') != 'INPUT'
                || $_this.val().trim() != '') {
                 $_this.parentAsertion();
            }
         }
      });

      $($_selectors.join(', '), $(this)).keyup(function(){
         if($(this).validations().length == 0
                && ($(this).attr('tagName') != 'INPUT' || $(this).val().trim() != '')){
             $(this).rmhighlight();
             $(this).removeParentError();
             $(this).parentAsertion();
          }
       });

       $($_selectors.join(', '), $(this)).each(function(){
           // Funcion para hacer bind a los eventos correctos:
          bindfunction = $(this)[['bind',$(this).attr('class').replace(/\s/g,''),'validation'].join('')];
           if($(this).attr('tagName') != "INPUT"
               && bindfunction){
               // tags que no son input solo pueden usar una clase
               // Ejecucion de funcion de binds
               ($(this)[['bind',$(this).attr('class').replace(/\s/g,''),'validation'].join('')])();
           }
       });

    $.fn.formValidation = function($_selectors){
        var __allresults__ = [];
        var $_controls = $($_selectors.join(', '), $(this));
        for(var f_index=0; f_index < $_controls.length; f_index++) {
            var __result__ = $($_controls[f_index]).validations();
            if(__result__.length > 0) {
                __allresults__.push(__result__);
                // Muestra errores en el tag en caso de que existan
                $($_controls[f_index]).blur();
            }
        }
        if(__allresults__.length > 0){
            return false;
        }
        return true;
   };};

})(jQuery)

