(function($)
{
$.fn.cswFormValidator = function(options)
{
// default configuration properties
var defaults =
{
"required":
{
"regex": "none",
"alertText": "* Ce champs est requis"
},
"phone":
{
"regex": /^([\+][0-9]{1,3}[ \.\-])?([\(]{1}[0-9]{2,6}[\)])?([0-9 \.\-\/]{3,20})((x|ext|extension)[ ]?[0-9]{1,4})?$/,
"alertText": "* Numéro de téléphone invalide"
},
"e-mail":
{
"regex": /^((([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,
"alertText": "* Adresse e-mail invalide"
},
"integer":
{
"regex": /^[\-\+]?\d+$/,
"alertText": "* Valeur invalide"
},
"number":
{
"regex": /^[\-\+]?(([0-9]+)([\.,]([0-9]+))?|([\.,]([0-9]+))?)$/,
"alertText": "* Valeur invalide"
},
"date":
{
"regex": /^\d{4}[\/\-](0?[1-9]|1[012])[\/\-](0?[1-9]|[12][0-9]|3[01])$/,
"alertText": "* Date invalide, format YYYY-MM-DD requis"
},
"url":
{
"regex": /^(https?|ftp):\/\/(((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:)*@)?(((\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5]))|((([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])))\.?)(:\d*)?)(\/((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)+(\/(([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)*)*)?)?(\?((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|[\uE000-\uF8FF]|\/|\?)*)?(\#((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|\/|\?)*)?$/i,
"alertText": "* URL invalide"
},
"onlyNumber":
{
"regex": /^[0-9\ ]+$/,
"alertText": "* Seules les chiffres sont acceptées"
},
"onlyLetter":
{
"regex": /^[a-zA-Z\ \']+$/,
"alertText": "* Seules les lettres sont acceptées"
},
"onlyLetterNumber":
{
"regex": /^[0-9a-zA-Z]+$/,
"alertText": "* Aucun caractère spécial n'est accepté"
},
"defaultString": "",
"succesString": "",
"errorString": "",
"errorAlert": "Le formulaire comporte des champs erronés!"
};
var options = $.extend(defaults, options);
return new $.cswFormValidator(options, this);
};
$.cswFormValidator = function(options, element)
{
// properties
this.element = $(element);
this.options = options;
this.fields = new Object();
this.states = new Array();
this.evt = null;
}
$.cswFormValidator.prototype =
{
validate: function()
{
return this.getFields();
},
getFields: function()
{
this.fields = this.element.serializeArray();
this.fields.push(this.element.find('input[type=checkbox], input[type=radio]'));
return this.validateFields();
},
validateFields: function()
{
for(var i in this.fields)
{
var fieldInfos = this.fields[i];
if(fieldInfos.name)
{
var fieldInfos = this.fields[i];
var fieldName = fieldInfos.name;
var fieldValue = fieldInfos.value;
var field = this.element.find('[name="'+fieldName+'"]');
var validations = field.attr('data-validation');
var reg = new RegExp("[\|]+", "g");
var validationTypes = (reg.test(validations)) ? validations.split('|') : new Array(validations);
this.removeClass(field);
if(typeof(validationTypes[0]) != 'undefined')
this.verifyState(fieldName, fieldValue, validationTypes, fieldType);
}
else
{
var fieldLength = fieldInfos.length;
for(var i = 0; i < fieldLength; i++)
{
var field = $(fieldInfos[i]);
var fieldType = field.attr('type');
var fieldName = field.attr('name');
var fieldValue = field.attr('value');
var validations = field.data('validation');
var reg = new RegExp("[\|]+", "g");
var validationTypes = (reg.test(validations)) ? validations.split('|') : new Array(validations);
this.removeClass(field);
if(typeof(validationTypes[0]) != 'undefined')
this.verifyState(fieldName, fieldValue, validationTypes, fieldType);
}
}
}
return this.setStateFields();
},
setStateFields: function()
{
for(var k in this.states)
{
var nod = this.element.find('[name="' + k + '"]').next('.validationForm');
nod.addClass(this.states[k]['state']);
nod.html(this.options[this.states[k]['state'] + 'String']);
}
this.setMessages(nod);
return this.validateForm();
},
setMessages: function(nod)
{
var nod = this.element.find('.validationForm.error');
nod.css('cursor', 'pointer');
for(var i in this.states)
{
var message = '';
var fieldInfos = this.states[i];
if(fieldInfos['state'] == 'error')
{
for(var j in fieldInfos['messages'])
{
message += fieldInfos['messages'][j] + '
';
}
this.element.find('[name="'+i+'"]').next('.validationForm').after('' + message + '');
}
}
nod.live
(
'mouseenter',
function(e)
{
$(this).next('.error_infos').stop().fadeTo(500, 1);
var offset = $(this).offset();
$(this).next('.error_infos').css('top', offset.top - 20);
$(this).next('.error_infos').css('left', offset.left + 50);
}
);
nod.live
(
'mouseleave',
function()
{
$(this).next('.error_infos').stop().fadeTo(500, 0);
}
);
},
verifyState: function(fieldName, fieldValue, validationTypes, fieldType)
{
var messages = new Array();
var required = false;
this.states[fieldName] = new Array();
for(var j in validationTypes)
{
var validation = validationTypes[j];
var fieldLength = fieldValue.length;
if(typeof(validation) != 'undefined')
{
if(fieldLength > 0 && !fieldType)
{
var reg = new RegExp(this.options[validation]['regex']);
this.states[fieldName]['state'] = (reg.test(fieldValue) != true && this.options[validation]['regex'] != 'none') ? 'error' : 'succes';
messages.push(this.options[validation]['alertText']);
}
else
{
if(fieldType)
fieldLength = this.element.find('input[name=' + fieldName + ']:checked').length;
if(validation == 'required') required = true;
this.states[fieldName]['state'] = (fieldLength == 0 && required == true) ? 'error' : 'succes';
messages.push(this.options[validation]['alertText']);
}
}
}
this.states[fieldName]['messages'] = messages;
},
removeClass: function(nod)
{
nod.next('.validationForm').removeClass('succes');
nod.next('.validationForm').removeClass('error');
},
validateForm: function()
{
if(this.element.find('.validationForm.error').length > 0)
{
$('#alert').remove();
$('body').append('