/*
 *  jQuery Form Validator v. 1.1
 *  Author: Daniele Di Bernardo
 *  http://www.marzapower.com/
 *  
 *  This plugin is a modified version from this plugin:
 *      http://marcgrabanski.com/code/clean-form-validation
 *  by Marc Grabanski
 *
 *
 *  The jQuery Form Validator plugin is licensed under a Creative Commons License and is copyrighted (C)2008-2009 by Daniele Di Bernardo.
 *  The license page can be found at: http://creativecommons.org/licenses/by-nc-sa/2.5/it/
 * 
 */
 
/**
 * More detailed info can be found at the web page http://www.marzapower.com/blog/show/250 or
 * in the README.txt file that you should have received with this script.
 *
 */
    
 
var ValidatorClass = function() {};

ValidatorClass.prototype = {

init: function (settings) 
{
  var mySettings = settings;

  if (settings['requiredFieldMsg'] == undefined)  mySettings['requiredFieldMsg']   = 'Red fields are required';
  if (settings['emailFieldMsg'] == undefined)     mySettings['emailFieldMsg']      = 'Yellow fields must contain valid emails';
  if (settings['numericFieldMsg'] == undefined)   mySettings['numericFieldMsg']    = 'Green fields must contain numbers';
  if (settings['integerFieldMsg'] == undefined)   mySettings['integerFieldMsg']    = 'Blue fields must contain integer values';
  if (settings['bindEvent'] == undefined)         mySettings['bindEvent']          = 'click';
  if (settings['allowNullNumbers'] == undefined 
      || settings['allowNullNumbers'] != true)    mySettings['allowNullNumbers']   = false;

  if (settings['errorColors'] == undefined)
mySettings['errorColors'] = {
isRequired: '#FDD',
isEmail:    '#FFA',
isNumeric:  '#DFD',
isInteger:  '#CCE',
hasRegex:   '#CCC'
};

  this.settings = mySettings;
  this.form = $(this.settings["form"]);  
  this.setElementsBinding();

  },

reset: function() {
  var _this = this;
  
  if(this.settings) {
    $(this.settings['bindElement']).each( function(index, element) {
        $(element).unbind(_this.settings['bindEvent']);
    });
    this.settings = null;
  }
},
    
setElementsBinding : function() {
  var _this = this;
  
  if (this.isArray(this.settings['bindElement'])) {
      $.each(this.settings['bindElement'], function(i, el) {
          _this.bindElement(_this.settings['bindElement'][i], _this.settings['callback'][i]);
      });
  } else {
      this.bindElement(this.settings['bindElement'], this.settings['callback']);
  }
},

bindElement: function (element, callback) {
  var _this = this;

  $(element).bind(this.settings['bindEvent'], function() {
      error = _this.validate();

      if (_this.isEmpty(error)) {
          callback();
      } else {
          alert(error);
          $('#error_div').html(error);
          return false;
      }
  });

},

validate: function () {
  error = '';
  validationTypes = new Array("isRequired", "isEmail", "isNumeric", "isInteger", "hasRegex");
  
  for (var n = 0; n < validationTypes.length; ++n) {    
var x = this.settings[validationTypes[n]];
var alreadyAlerted = false;

if (x != null) {
for(var i = 0; i < x.length; ++i)  {
  var inputField;
  var inputType;
  var regex;
  var message;
  var name;
  
  if (validationTypes[n] != 'hasRegex') {
      name = x[i];   
  } else {
  name = x[i][0];
  regex = x[i][1];
  message = x[i][2];
  }
  
  var split = name.split('@');
  if (split.length == 2) {
  name = split[0];
  inputType = split[1];
  } else {
      inputType = 'input';
  }
  
  inputField = $(this.form).find(inputType + '[name=' + name + ']');
  if ($(inputField).size() == 0) {
  message = "Could not find a field with name '" + name + "' and type '" + inputType + "'!";
  return message;
  }
  
  switch (validationTypes[n]) {
case "isRequired" :
  valid = !this.isEmpty($(inputField).val());
  errorMsg = this.settings["requiredFieldMsg"];
  break;
case "isEmail" :
  valid = this.isEmail($(inputField).val());
  errorMsg = this.settings["emailFieldMsg"];
  break;
case "isNumeric" :
  valid = this.isNumeric($(inputField).val());
  errorMsg = this.settings["numericFieldMsg"];
  break;
case "isInteger" :
  valid = this.isInteger($(inputField).val());
  errorMsg = this.settings["integerFieldMsg"];
  break;
case "hasRegex" :
  valid = this.testRegex($(inputField).val(), regex);
  errorMsg = message;
  break;
  }
  
  if(!valid) {
    if (!alreadyAlerted || validationTypes[n] == 'hasRegex') {
        error += errorMsg + "\n";
        alreadyAlerted = true;
    }
    $(inputField).css('border', '2px solid '+this.settings["errorColors"][validationTypes[n]]);
  } else {
      $(inputField).css('border', '');
  }
}
}
}
  
  return error;
},

isEmpty: function (str) {
  return (str == null) || (str == undefined) || (str.length == 0) || /^\s.$/.test(str) ;
},

isEmail: function (str) {
  if(this.isEmpty(str)) return false;
  var re = /^[^\s()<>@,;:\/]+@\w[\w\.-]+\.[a-z]{2,}$/i
  return re.test(str);
},

isNumeric: function (str) {
  if(this.isEmpty(str) && !this.settings['allowNullNumbers']) return false;
  if (isNaN(str)) return false;
  return true;
},

isInteger: function (str) {
  if (this.isEmpty(str) && !this.settings['allowNullNumbers']) return false;
  if (!str.match(/^[-]?\d+$/)) return false;
  return true;
},

isArray: function (obj) {
  return obj.constructor == Array;
},

testRegex : function (str, regex) {
  return regex.test(str);
}

};