1
0
mirror of https://github.com/kidoman/embd synced 2025-02-11 13:13:18 +01:00
embd/bower_components/gumby/js/libs/ui/jquery.validation.js
2014-03-31 06:33:08 +05:30

143 lines
3.1 KiB
JavaScript

/**
* Gumby jQuery Validation Plugin
*/
!function($) {
'use strict';
function Validation($this, req) {
if(Gumby) {
Gumby.debug('Initializing Validation', $this);
}
// input and holder .field
this.$this = $this;
this.$field = this.$this.parents('.field');
// supplied validation function with default length check
this.req = req || function() {
return !!this.$this.val().length;
};
// reference to this class
var scope = this;
// checkboxes and radio buttons use gumby.onChange event to validate
if(this.$this.is('[type=checkbox], [type=radio]')) {
this.$field = this.$this.parent('label');
this.$field.on('gumby.onChange', function() {
scope.validate();
});
// selects validate on change
} else if(this.$this.is('select')) {
this.$field = this.$this.parents('.picker');
this.$field.on('change', function() {
scope.validate();
});
// others (text input, textarea) use blur
} else {
this.$this.on('blur', function(e) {
// ignore tab
if(e.which !== 9) {
scope.validate();
}
});
}
}
// validate field
Validation.prototype.validate = function() {
var result = this.req(this.$this);
// failed
if(!result) {
this.$field.removeClass('success').addClass('danger');
// passed
} else {
//} else if(this.$field.hasClass('danger')) {
this.$field.removeClass('danger').addClass('success');
}
return result;
};
// jQuery plugin definition
$.fn.validation = function(options) {
var // extend params with defaults
settings = $.extend({
submit : false,
fail: false,
required : []
}, options),
// store validation objects
validations = [];
// init each form plugin is called on
return this.each(function() {
// no required fields so plugin is pointless
if(!settings.required.length) {
return false;
}
var $this = $(this),
reqLength = settings.required.length,
i;
// loop round each required field and instantiate new validation object
for(i = 0; i < reqLength; i++) {
validations.push(new Validation(
$this.find('[name="'+settings.required[i].name+'"]'),
settings.required[i].validate || false
));
}
// hijack submit event
$this.on('submit', function(e) {
// reference to whole form pass/fail
var failed = false;
// if no passed attribute found we should halt form submit
if(!$this.data('passed')) {
e.preventDefault();
// loop round validation objects and validate each
var reqLength = validations.length, i;
for(i = 0; i < reqLength; i++) {
if(!validations[i].validate()) {
failed = true;
}
}
// passed
if(!failed) {
// if submit method present call that otherwise submit form
if(settings.submit && typeof settings.submit === 'function') {
settings.submit($this.serializeArray());
return;
}
// store passed bool and re-submit
$this.data('passed', true).submit();
// failed
} else {
// call fail method if present
if(settings.fail && typeof settings.fail === 'function') {
settings.fail();
return;
}
}
}
});
});
};
}(jQuery);