(function($){

  function isDigit (c)
           {return ((c >= "0") && (c <= "9"));}

  function isValidDigit (s)
    {
    	for (var i = 0; i < s.length; i++){
    		var c = s.charAt(i);
            if (!isDigit(c)) 
            	return false;
        }
                return true;
    }	
	
  function checkMail(str){
  	var filter=/^([\w-]+(?:\.[\w-]+)*)@((?:[\w-]+\.)*\w[\w-]{0,66})\.([a-z]{2,6}(?:\.[a-z]{2})?)$/i
  	if (filter.test(str))
  	{
     	return true;
  	}
    else
    {  
 		return false;
    }
} 
	
 $.fn.validate = function(options) {
      
  var radios = this.filter(":radio");
  var checkbox = this.filter(":checkbox");
  var campos = this.not(":image,:submit,:radio,:checkbox,:hidden");   
  var form = campos.eq(0).parents("form");
    
      
  var settings = jQuery.extend({
     num: $().eq(-1),
     card: $().eq(-1),
     email: $().eq(-1),
     movistar: $().eq(-1),
     usarTitle: true,
     classError : "error"     
  }, options);
      
  
  if (!settings.movistar[0])
  {
  	settings.num = settings.num.add(settings.movistar.area).add(settings.movistar.local);
  }
  else
  {
  	$.each(settings.movistar, function(){
  		settings.num = settings.num.add(this.area).add(this.local);
  	});  	
  }   
          	  	 
  
  var onSubmit = function(){ 
    
    var flag = true;
    
    campos.each(function() {
        
        if (!$(this).val())
        {
            $(this).addClass(settings.classError);
            flag = false;
        }
        else
        {                                       
            $(this).removeClass(settings.classError);           
        }
        
    });
    
    radios.each(function(){
            
        var name = this.name;
        if (!$(":radio[name='"+name+"']:checked").length)
        {
            $(this).addClass(settings.classError);
            flag = false;
        }
        else
        {
            $(this).removeClass(settings.classError);
        }
        
    });
    
    checkbox.each(function(){
            
        var name = this.name;
        if (!$(this).is(":checked"))
        {
            $(this).addClass(settings.classError);          
            flag = false;
        }
        else
        {
            $(this).removeClass(settings.classError);
        }
        
    });
    
    
    if (!flag)
    {       
        var input = campos.add(radios).add(checkbox).filter("." + settings.classError).get(0);      
        $(input).focus();
        if ($(input).attr("title") && settings.usarTitle)
        {
            alert($(input).attr("title"));          
        }
        else
        {           
                if (input.type == "radio")
                {
                    alert(option);
                }
                else
                {
                    alert(missing);
                }           
        }
    }
    else
    {                                       
        campos.each(function() {
            
        if ($.inArray(this, settings.email.get()) > -1)
            {
                if(!checkMail(this.value))
                {
                    $(this).addClass(settings.classError);
                    flag = false;
                    alert(email);
                    this.focus();
                    this.select();
                    return false;                   
                }
            }
        else if ($.inArray(this,settings.num.get()) > -1)
            {
                if (!isValidDigit(this.value))
                {
                    $(this).addClass(settings.classError);
                    flag = false;
                    alert(numeric);
                    this.focus();
                    this.select();
                    return false;
                }
            }           
        if ($.inArray(this,settings.card.get()) > -1)
            {            
                if (this.value.length != 16)
                {
                    $(this).addClass(settings.classError);
                    flag = false;
                    alert("Card must have 16 numbers");
                    this.focus();
                    this.select();
                    return false;
                }
            }
        });
        
        if (flag) {
            
            campos.each(function(){
                
                var obj = this;
                var unico = true;
                var movIndex = -1;
                
                if (settings.movistar[0] == null)
                {
                    try {                   
                    movIndex = $.inArray(this,settings.movistar.area.get());
                    }
                    catch (e) {};                   
                }
                else
                {                   
                    unico = false;                  
                    $.each(settings.movistar, function(i,val){                      
                        movIndex = $.inArray(obj, settings.movistar[i].area.get());
                        arrIndex = i;                       
                        return movIndex == -1;                          
                    });                                                                                                                 
                }
                
                
                if (movIndex > -1)
                {
                    var area = this.value;
                    if (unico)
                    {                       
                        objMovistar = settings.movistar;
                    }
                    else
                    {
                        objMovistar = settings.movistar[arrIndex];
                    }
                    var local = objMovistar.local.val();
                    var numero = area + local;
                    if (numero.length != 10)
                    {
                        alert("El número movistar debe ser de 10 cifras.");
                        flag = false;
                        $(this).add(objMovistar.local).addClass(settings.classError).select();                  
                        return false;
                    }
                }
                
            });
        }
            
   }
    if(settings.email.length == 2 && flag) {
      if (settings.email.eq(0).val() != settings.email.eq(1).val()) {
        alert(diffMails);
        settings.email.eq(1).focus().select();
        return false;
      }   
    }
    
    if ($("#ninos").length) {
        if ($("#ninos").get(0).checked) {
            if (!$("#cirEnfantsAge").val() && flag) {
                alert($("#cirEnfantsAge").attr("title"));
                return false;
            }
        }
    }
          
    return flag;
    
  }
  
  form.bind('submit', onSubmit); 
  $("#submitForm").click(function(){      
     form.submit();
  });
    
 };
 
})(jQuery);

