/*
 * @class   Validation
 * @author  EtienneLem
 * @company Hatem+D
 */

// Static
$(document).ready(function(){
  window.Validation = new Validation(null)
});

//  Class
var Validation = function() { this.initialize.apply(this, arguments) };
Validation.prototype = (function() { var pro = {};
  
  //  Contants
  var REGEX_EMAIL			  = /^[A-z0-9._-]+@[A-z0-9.-]+\.[A-z]{2,4}$/,
      REGEX_TEXT 			  = /[A-Za-z]/,
		  REGEX_NUMBER 		  = /[0-9]/,
		  REGEX_TELEPHONE		= /^[0-9]{3}(-|\ )?[0-9]{3}(-|\ )?[0-9]{4}$/,
		  REGEX_POSTALCODE	= /(^[a-zA-Z][0-9][a-zA-Z]\s?[0-9][a-zA-Z][0-9]$)|(^\d{5}(-\d{4})?$)/;
  
  //  Variables
  var errors        = [],
		  verifiedGroup = [];
  
  //  public
  pro.initialize = function(opts) {
      initialize(); 
  };
  
  pro.validate = function ( form ) { return validate(form); };
  
  //  private
  var initialize = function()
  {
      var children = $('form').find('*');
      children.each(function(){
        var elem = $(this);
        if ( elem.data('validate') ) {
          elem.bind('blur', function ( e ) {
            if ( validateElem(elem) ) elem.parent('.error').removeClass('error');
          });
        }
      });
  }
  
  //	Validation management
  var validate = function ( form )
  {
      var children  = form.find('*'),
          valid 		= true;

    		// Removes all errors
    		errors 			  = [];
    		verifiedGroup = [];
    		$('form .error').removeClass('error');

    		// Fetch child with "data-validate" attribute.
    		children.each(function(){
          var elem = $(this);
          if ( elem.data('validate') ) {
            if ( validateElem(elem) === false ) valid = false;
          }
        });
      
    		return valid;
  	};

  var validateElem = function ( elem )
  {
      var type 	= elem.data('validate'),
  			  valid	= undefined;

  		switch ( type ) {
        case 'text' :
  				valid = validateText(elem);
  			break;
  			case 'number' :
  				valid = validateNumber(elem);
  			break;
  			case 'email' :
  				valid = validateEmail(elem);
  			break;
  			case 'postalcode' :
  				valid = validatePostalcode(elem);
  			break;
  			case 'tel' :
  				valid = validateTelephone(elem);
  			break;
  			case 'tel-divided' :
  				valid = validateDividedTelephone(elem);
  			break;
  			case 'radio' :
  				var group = elem.attr('name');
  				if ( verifiedGroup.indexOf(group) == -1 ) {
  					verifiedGroup.push(group);
  					valid = validateRadio(elem, group);
  				}
  			break;
  			case 'checked' :
  				valid = validateChecked(elem);
  			break;
  		}

  		if ( valid === false ) elem.parents('div').first().addClass('error');
  		return valid;
  };

  //	Text validation
  var validateText = function ( elem ) {
      return REGEX_TEXT.test(elem.val());
  };
  
  //	Number validation
  var validateNumber = function ( elem ) {
  		return REGEX_NUMBER.test(elem.val());
  };
  
  //	Email validation
  var validateEmail = function ( elem ) {
  		return REGEX_EMAIL.test(elem.val());
  };
  
  //	Postal code validation
  var validatePostalcode = function ( elem ) {
  		return REGEX_POSTALCODE.test(elem.val());
  };
  
  //	Telephone validation
  var validateTelephone = function ( elem ) {
  		return REGEX_TELEPHONE.test(elem.val());
  };
  
  var validateDividedTelephone = function ( elem )
  {
      var input = document.createElement('input'),
          elems = elem.parent().children('input');
          
      elems.each(function(i){
        var elem = $(this);
        if ( elem.data('optional') != true ) input.value += elem.val();
      });
      
      return validateTelephone($(input));
  };
  
  //	Radio validation
  var validateRadio = function ( elem, group )
  {
  		var radios 	= $('input[name='+group+']'),
  			  valid 	= false;
      
  		radios.each(function(){
  			var radio = $(this);
  			if ( radio.attr("checked") ) valid = true;
  		});

  		return valid;
  };
  
  //	Checked validation
  var validateChecked = function ( elem ) {
  		return elem.attr('checked');
  };
  
  
return pro })();
