1+function($){'use strict';var Validator=function(element,options){this.$element=$(element) 2this.options=options 3this.$element.attr('novalidate',!0) 4this.toggleSubmit() 5this.$element.on('input.bs.validator change.bs.validator focusout.bs.validator',$.proxy(this.validateInput,this)) 6this.$element.on('submit.bs.validator',$.proxy(this.onSubmit,this)) 7this.$element.find('[data-match]').each(function(){var $this=$(this) 8var target=$this.data('match') 9$(target).on('input.bs.validator',function(e){$this.val()&&$this.trigger('input')})})} 10Validator.DEFAULTS={delay:500,html:!1,disable:!0,errors:{match:'Does not match',minlength:'Not long enough'}} 11Validator.VALIDATORS={native:function($el){var el=$el[0] 12return el.checkValidity?el.checkValidity():!0},match:function($el){var target=$el.data('match') 13return!$el.val()||$el.val()===$(target).val()},minlength:function($el){var minlength=$el.data('minlength') 14return!$el.val()||$el.val().length>=minlength}} 15Validator.prototype.validateInput=function(e){var $el=$(e.target) 16var prevErrors=$el.data('bs.validator.errors') 17var errors 18if($el.is('[type="radio"]'))$el=this.$element.find('input[name="'+$el.attr('name')+'"]') 19this.$element.trigger(e=$.Event('validate.bs.validator',{relatedTarget:$el[0]})) 20if(e.isDefaultPrevented())return 21var self=this 22this.runValidators($el).done(function(errors){$el.data('bs.validator.errors',errors) 23errors.length?self.showErrors($el):self.clearErrors($el) 24if(!prevErrors||errors.toString()!==prevErrors.toString()){e=errors.length?$.Event('invalid.bs.validator',{relatedTarget:$el[0],detail:errors}):$.Event('valid.bs.validator',{relatedTarget:$el[0],detail:prevErrors}) 25self.$element.trigger(e)} 26self.toggleSubmit() 27self.$element.trigger($.Event('validated.bs.validator',{relatedTarget:$el[0]}))})} 28Validator.prototype.runValidators=function($el){var errors=[] 29var validators=[Validator.VALIDATORS.native] 30var deferred=$.Deferred() 31var options=this.options 32$el.data('bs.validator.deferred')&&$el.data('bs.validator.deferred').reject() 33$el.data('bs.validator.deferred',deferred) 34function getErrorMessage(key){return $el.data(key+'-error')||$el.data('error')||key=='native'&&$el[0].validationMessage||options.errors[key]} 35$.each(Validator.VALIDATORS,$.proxy(function(key,validator){if(($el.data(key)||key=='native')&&!validator.call(this,$el)){var error=getErrorMessage(key) 36!~errors.indexOf(error)&&errors.push(error)}},this)) 37if(!errors.length&&$el.val()&&$el.data('remote')){this.defer($el,function(){$.get($el.data('remote'),[$el.attr('name'),$el.val()].join('=')).fail(function(jqXHR,textStatus,error){errors.push(getErrorMessage('remote')||error)}).always(function(){deferred.resolve(errors)})})}else deferred.resolve(errors) 38return deferred.promise()} 39Validator.prototype.validate=function(){var delay=this.options.delay 40this.options.delay=0 41this.$element.find(':input').trigger('input') 42this.options.delay=delay 43return this} 44Validator.prototype.showErrors=function($el){var method=this.options.html?'html':'text' 45this.defer($el,function(){var $group=$el.closest('.form-group') 46var $block=$group.find('.help-block.with-errors') 47var errors=$el.data('bs.validator.errors') 48if(!errors.length)return 49errors=$('<ul/>').addClass('list-unstyled').append($.map(errors,function(error){return $('<li/>')[method](error)})) 50$block.data('bs.validator.originalContent')===undefined&&$block.data('bs.validator.originalContent',$block.html()) 51$block.empty().append(errors) 52$group.addClass('has-error')})} 53Validator.prototype.clearErrors=function($el){var $group=$el.closest('.form-group') 54var $block=$group.find('.help-block.with-errors') 55$block.html($block.data('bs.validator.originalContent')) 56$group.removeClass('has-error')} 57Validator.prototype.hasErrors=function(){function fieldErrors(){return!!($(this).data('bs.validator.errors')||[]).length} 58return!!this.$element.find(':input:enabled').filter(fieldErrors).length} 59Validator.prototype.isIncomplete=function(){function fieldIncomplete(){return this.type==='checkbox'?!this.checked:this.type==='radio'?!$('[name="'+this.name+'"]:checked').length:$.trim(this.value)===''} 60return!!this.$element.find(':input[required]:enabled').filter(fieldIncomplete).length} 61Validator.prototype.onSubmit=function(e){this.validate() 62if(this.isIncomplete()||this.hasErrors())e.preventDefault()} 63Validator.prototype.toggleSubmit=function(){if(!this.options.disable)return 64var $btn=this.$element.find('input[type="submit"], button[type="submit"]') 65$btn.toggleClass('disabled',this.isIncomplete()||this.hasErrors()).css({'pointer-events':'all','cursor':'pointer'})} 66Validator.prototype.defer=function($el,callback){if(!this.options.delay)return callback() 67window.clearTimeout($el.data('bs.validator.timeout')) 68$el.data('bs.validator.timeout',window.setTimeout(callback,this.options.delay))} 69Validator.prototype.destroy=function(){this.$element.removeAttr('novalidate').removeData('bs.validator').off('.bs.validator') 70this.$element.find(':input').removeData(['bs.validator.errors','bs.validator.deferred','bs.validator.timeout']).off('.bs.validator') 71this.$element.find('.help-block.with-errors').each(function(){var $this=$(this) 72var originalContent=$this.data('bs.validator.originalContent') 73$this.removeData('bs.validator.originalContent').html(originalContent)}) 74this.$element.find('input[type="submit"], button[type="submit"]').removeClass('disabled') 75this.$element.find('.has-error').removeClass('has-error') 76return this} 77function Plugin(option){return this.each(function(){var $this=$(this) 78var options=$.extend({},Validator.DEFAULTS,$this.data(),typeof option=='object'&&option) 79var data=$this.data('bs.validator') 80if(!data&&option=='destroy')return 81if(!data)$this.data('bs.validator',(data=new Validator(this,options))) 82if(typeof option=='string')data[option]()})} 83var old=$.fn.validator 84$.fn.validator=Plugin 85$.fn.validator.Constructor=Validator 86$.fn.validator.noConflict=function(){$.fn.validator=old 87return this} 88$(window).on('load',function(){$('form[data-toggle="validator"]').each(function(){var $form=$(this) 89Plugin.call($form,$form.data())})})}(jQuery)
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.