webshims-rails 1.10.11 → 1.11.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +8 -8
- data/lib/webshims-rails/version.rb +2 -2
- data/readme.textile +14 -1
- data/vendor/assets/javascripts/webshims/polyfiller.js +2 -1
- data/vendor/assets/javascripts/webshims/shims/combos/1.js +12 -63
- data/vendor/assets/javascripts/webshims/shims/combos/10.js +17 -7
- data/vendor/assets/javascripts/webshims/shims/combos/11.js +17 -3
- data/vendor/assets/javascripts/webshims/shims/combos/12.js +11 -12
- data/vendor/assets/javascripts/webshims/shims/combos/13.js +11 -12
- data/vendor/assets/javascripts/webshims/shims/combos/14.js +0 -4
- data/vendor/assets/javascripts/webshims/shims/combos/15.js +10 -59
- data/vendor/assets/javascripts/webshims/shims/combos/16.js +21 -71
- data/vendor/assets/javascripts/webshims/shims/combos/17.js +17 -3
- data/vendor/assets/javascripts/webshims/shims/combos/18.js +17 -3
- data/vendor/assets/javascripts/webshims/shims/combos/19.js +58 -19
- data/vendor/assets/javascripts/webshims/shims/combos/2.js +12 -67
- data/vendor/assets/javascripts/webshims/shims/combos/20.js +58 -19
- data/vendor/assets/javascripts/webshims/shims/combos/21.js +47 -3
- data/vendor/assets/javascripts/webshims/shims/combos/23.js +11 -12
- data/vendor/assets/javascripts/webshims/shims/combos/24.js +324 -79
- data/vendor/assets/javascripts/webshims/shims/combos/25.js +63 -21
- data/vendor/assets/javascripts/webshims/shims/combos/26.js +5 -6
- data/vendor/assets/javascripts/webshims/shims/combos/27.js +5 -2
- data/vendor/assets/javascripts/webshims/shims/combos/28.js +47 -7
- data/vendor/assets/javascripts/webshims/shims/combos/3.js +1 -55
- data/vendor/assets/javascripts/webshims/shims/combos/30.js +1 -55
- data/vendor/assets/javascripts/webshims/shims/combos/31.js +1 -55
- data/vendor/assets/javascripts/webshims/shims/combos/4.js +0 -4
- data/vendor/assets/javascripts/webshims/shims/combos/5.js +17 -3
- data/vendor/assets/javascripts/webshims/shims/combos/6.js +17 -3
- data/vendor/assets/javascripts/webshims/shims/combos/7.js +12 -67
- data/vendor/assets/javascripts/webshims/shims/combos/8.js +12 -67
- data/vendor/assets/javascripts/webshims/shims/combos/9.js +17 -7
- data/vendor/assets/javascripts/webshims/shims/dom-extend.js +0 -4
- data/vendor/assets/javascripts/webshims/shims/filereader.js +5 -2
- data/vendor/assets/javascripts/webshims/shims/form-core.js +1 -51
- data/vendor/assets/javascripts/webshims/shims/form-datalist-lazy.js +24 -15
- data/vendor/assets/javascripts/webshims/shims/form-number-date-ui.js +6 -2
- data/vendor/assets/javascripts/webshims/shims/form-shim-extend.js +9 -4
- data/vendor/assets/javascripts/webshims/shims/form-validation.js +135 -24
- data/vendor/assets/javascripts/webshims/shims/form-validators.js +189 -55
- data/vendor/assets/javascripts/webshims/shims/forms-picker.js +4 -1
- data/vendor/assets/javascripts/webshims/shims/jpicker/jpicker.css +3 -1
- data/vendor/assets/javascripts/webshims/shims/mediaelement-core.js +11 -12
- data/vendor/assets/javascripts/webshims/shims/mediaelement-jaris.js +47 -3
- data/vendor/assets/javascripts/webshims/shims/mediaelement-yt.js +28 -8
- data/vendor/assets/javascripts/webshims/shims/mediagroup.js +29 -0
- data/vendor/assets/javascripts/webshims/shims/range-ui.js +11 -1
- data/vendor/assets/javascripts/webshims/shims/styles/scss/shim.scss +17 -4
- data/vendor/assets/javascripts/webshims/shims/styles/shim.css +17 -6
- data/vendor/assets/javascripts/webshims/shims/swf/JarisFLVPlayer.swf +0 -0
- metadata +3 -3
- data/vendor/assets/javascripts/webshims/shims/swf/jwwebshims.swf +0 -0
@@ -476,6 +476,7 @@ var swfmini = function() {
|
|
476
476
|
if(hasNative){
|
477
477
|
var videoElem = document.createElement('video');
|
478
478
|
Modernizr.videoBuffered = ('buffered' in videoElem);
|
479
|
+
Modernizr.mediaDefaultMuted = ('defaultMuted' in videoElem);
|
479
480
|
supportsLoop = ('loop' in videoElem);
|
480
481
|
|
481
482
|
webshims.capturingEvents(['play', 'playing', 'waiting', 'paused', 'ended', 'durationchange', 'loadedmetadata', 'canplay', 'volumechange']);
|
@@ -489,20 +490,15 @@ var swfmini = function() {
|
|
489
490
|
|
490
491
|
if(!options.preferFlash){
|
491
492
|
var noSwitch = {
|
492
|
-
1: 1
|
493
|
-
2: 1
|
493
|
+
1: 1
|
494
494
|
};
|
495
495
|
var switchOptions = function(e){
|
496
496
|
var media, error, parent;
|
497
497
|
if(!options.preferFlash &&
|
498
498
|
($(e.target).is('audio, video') || ((parent = e.target.parentNode) && $('source:last', parent)[0] == e.target)) &&
|
499
|
-
(media = $(e.target).closest('audio, video')) &&
|
499
|
+
(media = $(e.target).closest('audio, video')) && (error = media.prop('error')) && !noSwitch[error.code]
|
500
500
|
){
|
501
|
-
|
502
|
-
webshims.warn("There was an unspecified error on a mediaelement");
|
503
|
-
return;
|
504
|
-
|
505
|
-
}
|
501
|
+
|
506
502
|
$(function(){
|
507
503
|
if(hasSwf && !options.preferFlash){
|
508
504
|
loadSwf();
|
@@ -514,7 +510,7 @@ var swfmini = function() {
|
|
514
510
|
$('audio, video').each(function(){
|
515
511
|
webshims.mediaelement.selectSource(this);
|
516
512
|
});
|
517
|
-
webshims.error("switching mediaelements option to 'preferFlash', due to an error with native player: "+e.target.src+" Mediaerror: "+ media.prop('error'));
|
513
|
+
webshims.error("switching mediaelements option to 'preferFlash', due to an error with native player: "+e.target.src+" Mediaerror: "+ media.prop('error')+ 'first error: '+ error);
|
518
514
|
}
|
519
515
|
}, 9);
|
520
516
|
});
|
@@ -720,7 +716,7 @@ webshims.register('mediaelement-core', function($, webshims, window, document, u
|
|
720
716
|
if(src.indexOf('rtmp') === 0){
|
721
717
|
return nodeName+'/rtmp';
|
722
718
|
}
|
723
|
-
src = src.split('?')[0].split('.');
|
719
|
+
src = src.split('?')[0].split('#')[0].split('.');
|
724
720
|
src = src[src.length - 1];
|
725
721
|
var mt;
|
726
722
|
|
@@ -839,7 +835,7 @@ webshims.register('mediaelement-core', function($, webshims, window, document, u
|
|
839
835
|
webshims.error('mediaelementError: '+ message);
|
840
836
|
setTimeout(function(){
|
841
837
|
if($(elem).data('mediaerror')){
|
842
|
-
$(elem).trigger('mediaerror');
|
838
|
+
$(elem).addClass('media-error').trigger('mediaerror');
|
843
839
|
}
|
844
840
|
}, 1);
|
845
841
|
}
|
@@ -903,6 +899,7 @@ webshims.register('mediaelement-core', function($, webshims, window, document, u
|
|
903
899
|
var parent = elem.parentNode;
|
904
900
|
|
905
901
|
clearTimeout(baseData.loadTimer);
|
902
|
+
$(elem).removeClass('media-error');
|
906
903
|
$.data(elem, 'mediaerror', false);
|
907
904
|
|
908
905
|
if(!_srces.length || !parent || parent.nodeType != 1 || stopParent.test(parent.nodeName || '')){return;}
|
@@ -930,7 +927,9 @@ webshims.register('mediaelement-core', function($, webshims, window, document, u
|
|
930
927
|
var testFixMedia = function(){
|
931
928
|
if(webshims.implement(this, 'mediaelement')){
|
932
929
|
selectSource(this);
|
933
|
-
|
930
|
+
if(!Modernizr.mediaDefaultMuted && $.attr(this, 'muted') != null){
|
931
|
+
$.prop(this, 'muted', true);
|
932
|
+
}
|
934
933
|
//fixes for FF 12 and IE9/10 || does not hurt, if run in other browsers
|
935
934
|
if(hasNative && (!supportsLoop || ('ActiveXObject' in window))){
|
936
935
|
var bufferTimer;
|
@@ -4,6 +4,10 @@ webshims.register('form-validation', function($, webshims, window, document, und
|
|
4
4
|
var webkitVersion = chromeBugs && parseFloat((navigator.userAgent.match(/Safari\/([\d\.]+)/) || ['', '999999'])[1], 10);
|
5
5
|
var invalidClass = options.iVal.errorClass || 'user-error';
|
6
6
|
var validClass = options.iVal.successClass || 'user-success';
|
7
|
+
|
8
|
+
var invalidWrapperClass = options.iVal.errorWrapperClass || 'ws-invalid';
|
9
|
+
var successWrapperClass = options.iVal.successWrapperClass || 'ws-success';
|
10
|
+
var errorBoxClass = options.iVal.errorBoxClass || 'ws-errorbox';
|
7
11
|
var checkTypes = {checkbox: 1, radio: 1};
|
8
12
|
|
9
13
|
var emptyJ = $([]);
|
@@ -93,13 +97,18 @@ webshims.register('form-validation', function($, webshims, window, document, und
|
|
93
97
|
){
|
94
98
|
return;
|
95
99
|
}
|
100
|
+
if(webshims.refreshCustomValidityRules){
|
101
|
+
if(webshims.refreshCustomValidityRules(elem) == 'async'){
|
102
|
+
$(elem).one('refreshvalidityui', switchValidityClass);
|
103
|
+
return;
|
104
|
+
}
|
105
|
+
}
|
106
|
+
|
96
107
|
var validity = $.prop(elem, 'validity');
|
97
108
|
|
98
109
|
var addClass, removeClass, trigger, generaltrigger, validityCause;
|
99
110
|
|
100
|
-
|
101
|
-
webshims.refreshCustomValidityRules(elem);
|
102
|
-
}
|
111
|
+
|
103
112
|
|
104
113
|
if(validity.valid){
|
105
114
|
if(!shadowElem.hasClass(validClass)){
|
@@ -457,10 +466,10 @@ webshims.register('form-validation', function($, webshims, window, document, und
|
|
457
466
|
if(!fieldWrapper){
|
458
467
|
fieldWrapper = this.getFieldWrapper(elem);
|
459
468
|
}
|
460
|
-
var errorBox = $('div.
|
469
|
+
var errorBox = $('div.'+errorBoxClass, fieldWrapper);
|
461
470
|
|
462
471
|
if(!errorBox.length){
|
463
|
-
errorBox = $('<div class="
|
472
|
+
errorBox = $('<div class="'+ errorBoxClass +'" hidden="hidden">');
|
464
473
|
fieldWrapper.append(errorBox);
|
465
474
|
}
|
466
475
|
|
@@ -481,6 +490,48 @@ webshims.register('form-validation', function($, webshims, window, document, und
|
|
481
490
|
}
|
482
491
|
return fieldWrapper;
|
483
492
|
},
|
493
|
+
_createContentMessage: (function(){
|
494
|
+
var fields = {};
|
495
|
+
var getErrorName = function(elem){
|
496
|
+
var ret = $(elem).data('errortype');
|
497
|
+
if(!ret){
|
498
|
+
$.each(fields, function(errorName, cNames){
|
499
|
+
if($(elem).is(cNames)){
|
500
|
+
ret = errorName;
|
501
|
+
return false;
|
502
|
+
}
|
503
|
+
});
|
504
|
+
}
|
505
|
+
return ret || 'defaultMessage';
|
506
|
+
};
|
507
|
+
$(function(){
|
508
|
+
$.each($('<input />').prop('validity'), function(name){
|
509
|
+
if(name != 'valid'){
|
510
|
+
var cName = name.replace(/[A-Z]/, function(c){
|
511
|
+
return '-'+(c).toLowerCase();
|
512
|
+
});
|
513
|
+
fields[name] = '.'+cName+', .'+name+', .'+(name).toLowerCase()+', [data-errortype="'+ name +'"]';
|
514
|
+
}
|
515
|
+
});
|
516
|
+
});
|
517
|
+
return function(elem, errorBox){
|
518
|
+
var extended = false;
|
519
|
+
var errorMessages = $(elem).data('errormessage') || {};
|
520
|
+
if(typeof errorMessages == 'string'){
|
521
|
+
errorMessages = {defaultMessage: errorMessages};
|
522
|
+
}
|
523
|
+
$('> *', errorBox).each(function(){
|
524
|
+
var name = getErrorName(this);
|
525
|
+
if(!errorMessages[name]){
|
526
|
+
extended = true;
|
527
|
+
errorMessages[name] = $(this).html();
|
528
|
+
}
|
529
|
+
});
|
530
|
+
if(extended){
|
531
|
+
$(elem).data('errormessage', errorMessages);
|
532
|
+
}
|
533
|
+
};
|
534
|
+
})(),
|
484
535
|
get: function(elem, fieldWrapper){
|
485
536
|
if(!fieldWrapper){
|
486
537
|
fieldWrapper = this.getFieldWrapper(elem);
|
@@ -488,9 +539,11 @@ webshims.register('form-validation', function($, webshims, window, document, und
|
|
488
539
|
var errorBox = fieldWrapper.data('errorbox');
|
489
540
|
if(!errorBox){
|
490
541
|
errorBox = this.create(elem, fieldWrapper);
|
542
|
+
this._createContentMessage(elem, errorBox);
|
491
543
|
} else if(typeof errorBox == 'string'){
|
492
544
|
errorBox = $('#'+errorBox);
|
493
545
|
fieldWrapper.data('errorbox', errorBox);
|
546
|
+
this._createContentMessage(elem, errorBox);
|
494
547
|
}
|
495
548
|
return errorBox;
|
496
549
|
},
|
@@ -498,7 +551,7 @@ webshims.register('form-validation', function($, webshims, window, document, und
|
|
498
551
|
var type = $.prop(elem, 'type');
|
499
552
|
var check = function(){
|
500
553
|
var hasVal = checkTypes[type] ? $.prop(elem, 'checked') : $(elem).val();
|
501
|
-
fieldWrapper[hasVal ? 'addClass' : 'removeClass'](
|
554
|
+
fieldWrapper[hasVal ? 'addClass' : 'removeClass'](successWrapperClass);
|
502
555
|
};
|
503
556
|
var evt = changeTypes[type] ? 'change' : 'blur';
|
504
557
|
|
@@ -507,13 +560,13 @@ webshims.register('form-validation', function($, webshims, window, document, und
|
|
507
560
|
},
|
508
561
|
hideError: function(elem, reset){
|
509
562
|
var fieldWrapper = this.getFieldWrapper(elem);
|
510
|
-
var errorBox = fieldWrapper.data('errorbox');
|
563
|
+
var errorBox = fieldWrapper.hasClass(invalidWrapperClass) ? this.get(elem, fieldWrapper) : fieldWrapper.data('errorbox');
|
511
564
|
|
512
565
|
if(errorBox && errorBox.jquery){
|
513
|
-
fieldWrapper.removeClass(
|
566
|
+
fieldWrapper.removeClass(invalidWrapperClass);
|
514
567
|
errorBox.message = '';
|
515
568
|
$(elem).filter('input').off('.recheckinvalid');
|
516
|
-
errorBox.
|
569
|
+
errorBox[fx[options.iVal.fx].hide](function(){
|
517
570
|
$(this).attr({hidden: 'hidden'});
|
518
571
|
});
|
519
572
|
}
|
@@ -528,21 +581,28 @@ webshims.register('form-validation', function($, webshims, window, document, und
|
|
528
581
|
var throttle = function(){
|
529
582
|
switchValidityClass({type: 'input', target: input});
|
530
583
|
};
|
531
|
-
$(input)
|
532
|
-
|
533
|
-
|
534
|
-
|
584
|
+
$(input)
|
585
|
+
.filter('input:not([type="checkbox"], [type="radio"])')
|
586
|
+
.off('.recheckinvalid')
|
587
|
+
.on('input.recheckinvalid', function(){
|
588
|
+
clearTimeout(timer);
|
589
|
+
timer = setTimeout(throttle, options.iVal.recheckDelay);
|
590
|
+
})
|
591
|
+
.on('focusout.recheckinvalid', function(){
|
592
|
+
clearTimeout(timer);
|
593
|
+
})
|
594
|
+
;
|
535
595
|
}
|
536
596
|
},
|
537
|
-
showError: function(elem
|
597
|
+
showError: function(elem){
|
538
598
|
var fieldWrapper = this.getFieldWrapper(elem);
|
539
599
|
var box = this.get(elem, fieldWrapper);
|
540
|
-
|
600
|
+
var message = $(elem).getErrorMessage();
|
541
601
|
if(box.message != message){
|
542
602
|
box.stop(true, true).html('<p>'+ message +'</p>');
|
543
603
|
box.message = message;
|
544
|
-
fieldWrapper.addClass(
|
545
|
-
if(box.is('[hidden]')){
|
604
|
+
fieldWrapper.addClass(invalidWrapperClass).removeClass(successWrapperClass);
|
605
|
+
if(box.is('[hidden]') || box.css('display') == 'none'){
|
546
606
|
this.recheckInvalidInput(elem);
|
547
607
|
box
|
548
608
|
.css({display: 'none'})
|
@@ -551,20 +611,19 @@ webshims.register('form-validation', function($, webshims, window, document, und
|
|
551
611
|
;
|
552
612
|
}
|
553
613
|
}
|
554
|
-
fieldWrapper.removeClass(
|
614
|
+
fieldWrapper.removeClass(successWrapperClass);
|
555
615
|
$(elem).off('.recheckvalid');
|
556
616
|
|
557
617
|
return fieldWrapper;
|
558
618
|
},
|
559
619
|
reset: function(elem){
|
560
|
-
this.hideError(elem, true).removeClass(
|
620
|
+
this.hideError(elem, true).removeClass(successWrapperClass);
|
561
621
|
},
|
562
622
|
toggle: function(elem){
|
563
|
-
|
564
|
-
|
565
|
-
this.showError(elem, message);
|
623
|
+
if($(elem).is(':invalid')){
|
624
|
+
this.showError(elem);
|
566
625
|
} else {
|
567
|
-
this.hideError(elem
|
626
|
+
this.hideError(elem);
|
568
627
|
}
|
569
628
|
}
|
570
629
|
};
|
@@ -599,7 +658,7 @@ webshims.register('form-validation', function($, webshims, window, document, und
|
|
599
658
|
}
|
600
659
|
},
|
601
660
|
submit: function(e){
|
602
|
-
if(options.iVal.sel &&
|
661
|
+
if(options.iVal.sel && !options.iVal.noSubmitCheck &&$(e.target).is(options.iVal.sel) && $.prop(e.target, 'noValidate') && !$(e.target).checkValidity()){
|
603
662
|
e.stopImmediatePropagation();
|
604
663
|
return false;
|
605
664
|
}
|
@@ -609,6 +668,58 @@ webshims.register('form-validation', function($, webshims, window, document, und
|
|
609
668
|
|
610
669
|
webshims.modules["form-core"].getGroupElements = getGroupElements;
|
611
670
|
|
671
|
+
|
672
|
+
if(options.replaceValidationUI){
|
673
|
+
webshims.ready('DOM forms', function(){
|
674
|
+
$(document).on('firstinvalid', function(e){
|
675
|
+
if(!e.isInvalidUIPrevented()){
|
676
|
+
e.preventDefault();
|
677
|
+
webshims.validityAlert.showFor( e.target );
|
678
|
+
}
|
679
|
+
});
|
680
|
+
});
|
681
|
+
}
|
682
|
+
|
683
|
+
/* extension, but also used to fix native implementation workaround/bugfixes */
|
684
|
+
(function(){
|
685
|
+
var firstEvent,
|
686
|
+
invalids = [],
|
687
|
+
stopSubmitTimer,
|
688
|
+
form
|
689
|
+
;
|
690
|
+
|
691
|
+
$(document).on('invalid', function(e){
|
692
|
+
if(e.wrongWebkitInvalid){return;}
|
693
|
+
var jElm = $(e.target);
|
694
|
+
|
695
|
+
|
696
|
+
if(!firstEvent){
|
697
|
+
//trigger firstinvalid
|
698
|
+
firstEvent = $.Event('firstinvalid');
|
699
|
+
firstEvent.isInvalidUIPrevented = e.isDefaultPrevented;
|
700
|
+
var firstSystemInvalid = $.Event('firstinvalidsystem');
|
701
|
+
$(document).triggerHandler(firstSystemInvalid, {element: e.target, form: e.target.form, isInvalidUIPrevented: e.isDefaultPrevented});
|
702
|
+
jElm.trigger(firstEvent);
|
703
|
+
}
|
704
|
+
|
705
|
+
//if firstinvalid was prevented all invalids will be also prevented
|
706
|
+
if( firstEvent && firstEvent.isDefaultPrevented() ){
|
707
|
+
e.preventDefault();
|
708
|
+
}
|
709
|
+
invalids.push(e.target);
|
710
|
+
e.extraData = 'fix';
|
711
|
+
clearTimeout(stopSubmitTimer);
|
712
|
+
stopSubmitTimer = setTimeout(function(){
|
713
|
+
var lastEvent = {type: 'lastinvalid', cancelable: false, invalidlist: $(invalids)};
|
714
|
+
//reset firstinvalid
|
715
|
+
firstEvent = false;
|
716
|
+
invalids = [];
|
717
|
+
$(e.target).trigger(lastEvent, [lastEvent]);
|
718
|
+
}, 9);
|
719
|
+
jElm = null;
|
720
|
+
});
|
721
|
+
})();
|
722
|
+
|
612
723
|
//see: https://bugs.webkit.org/show_bug.cgi?id=113377
|
613
724
|
if (chromeBugs && webkitVersion < 540) {
|
614
725
|
(function(){
|
@@ -649,7 +760,16 @@ webshims.register('form-validators', function($, webshims, window, document, und
|
|
649
760
|
var onEventTest = function(e){
|
650
761
|
webshims.refreshCustomValidityRules(e.target);
|
651
762
|
};
|
652
|
-
|
763
|
+
var noValidate = function(){
|
764
|
+
return !noValidate.types[this.type];
|
765
|
+
};
|
766
|
+
noValidate.types = {
|
767
|
+
hidden: 1,
|
768
|
+
image: 1,
|
769
|
+
button: 1,
|
770
|
+
reset: 1,
|
771
|
+
submit: 1
|
772
|
+
};
|
653
773
|
|
654
774
|
webshims.customErrorMessages = {};
|
655
775
|
webshims.addCustomValidityRule = function(name, test, defaultMessage){
|
@@ -658,68 +778,78 @@ webshims.register('form-validators', function($, webshims, window, document, und
|
|
658
778
|
webshims.customErrorMessages[name] = [];
|
659
779
|
webshims.customErrorMessages[name][''] = defaultMessage || name;
|
660
780
|
}
|
661
|
-
if(
|
662
|
-
$('input, select, textarea')
|
663
|
-
|
664
|
-
|
781
|
+
if(formReady){
|
782
|
+
$('input, select, textarea')
|
783
|
+
.filter(noValidate)
|
784
|
+
.each(function(){
|
785
|
+
testValidityRules(this);
|
786
|
+
})
|
787
|
+
;
|
665
788
|
}
|
666
789
|
};
|
667
790
|
webshims.refreshCustomValidityRules = function(elem){
|
668
|
-
if(!
|
669
|
-
|
670
|
-
var
|
791
|
+
if(!initTest){return;}
|
792
|
+
|
793
|
+
var data = $(elem).data() || $.data(elem, {});
|
794
|
+
var customMismatchedRule = data.customMismatchedRule;
|
671
795
|
var validity = $.prop(elem, 'validity') || {};
|
672
796
|
var message = '';
|
673
|
-
|
797
|
+
var setMessage = function(message, errorType){
|
798
|
+
blockCustom = true;
|
799
|
+
data.customMismatchedRule = message ? errorType : '';
|
800
|
+
|
801
|
+
if(typeof message != 'string'){
|
802
|
+
message = $(elem).data('errormessage') || elem.getAttribute('x-moz-errormessage') || webshims.customErrorMessages[errorType][webshims.activeLang()] || webshims.customErrorMessages[errorType][''];
|
803
|
+
}
|
804
|
+
|
805
|
+
if(typeof message == 'object'){
|
806
|
+
message = message[errorType] || message.customError || message.defaultMessage;
|
807
|
+
}
|
808
|
+
$(elem).setCustomValidity(message);
|
809
|
+
blockCustom = false;
|
810
|
+
};
|
811
|
+
if(customMismatchedRule || validity.valid || (data.dependentValidation && !data.dependentValidation._init)){
|
674
812
|
var val = $(elem).val();
|
675
813
|
$.each(customValidityRules, function(name, test){
|
676
|
-
message = test(elem, val) || '';
|
814
|
+
message = test(elem, val, data, setMessage) || '';
|
677
815
|
customMismatchedRule = name;
|
678
816
|
if(message){
|
679
|
-
|
680
|
-
if(typeof message != 'string'){
|
681
|
-
message = $(elem).data('errormessage') || elem.getAttribute('x-moz-errormessage') || webshims.customErrorMessages[name][webshims.activeLang()] || webshims.customErrorMessages[name][''];
|
682
|
-
}
|
683
|
-
|
684
|
-
if(typeof message == 'object'){
|
685
|
-
message = message[name] || message.customError || message.defaultMessage;
|
686
|
-
}
|
687
817
|
return false;
|
688
818
|
}
|
689
819
|
});
|
690
|
-
|
691
|
-
|
692
|
-
$.data(elem, 'customMismatchedRule', customMismatchedRule);
|
820
|
+
if(message != 'async'){
|
821
|
+
setMessage(message, customMismatchedRule);
|
693
822
|
}
|
694
|
-
$(elem).setCustomValidity(message);
|
695
823
|
}
|
696
|
-
|
824
|
+
return message;
|
697
825
|
};
|
698
826
|
var testValidityRules = webshims.refreshCustomValidityRules;
|
699
827
|
|
700
828
|
webshims.ready('forms form-validation', function(){
|
701
829
|
|
702
|
-
|
703
|
-
|
704
|
-
|
705
|
-
|
706
|
-
|
707
|
-
|
708
|
-
this.data('customMismatchedRule', '');
|
830
|
+
$.propHooks.setCustomValidity = {
|
831
|
+
get: function(elem){
|
832
|
+
if(!blockCustom){
|
833
|
+
$.data(elem, 'customMismatchedRule', '');
|
834
|
+
}
|
835
|
+
return null;
|
709
836
|
}
|
710
|
-
return oldCustomValidity.apply(this, arguments);
|
711
837
|
};
|
712
838
|
|
839
|
+
|
713
840
|
setTimeout(function(){
|
714
841
|
webshims.addReady(function(context, selfElement){
|
715
842
|
initTest = true;
|
716
|
-
$('input, select, textarea', context).add(selfElement.filter('input, select, textarea'))
|
717
|
-
|
718
|
-
|
719
|
-
|
843
|
+
$('input, select, textarea', context).add(selfElement.filter('input, select, textarea'))
|
844
|
+
.filter(noValidate)
|
845
|
+
.each(function(){
|
846
|
+
testValidityRules(this);
|
847
|
+
})
|
848
|
+
;
|
849
|
+
|
720
850
|
formReady = true;
|
721
851
|
});
|
722
|
-
$(document).on('refreshCustomValidityRules
|
852
|
+
$(document).on('refreshCustomValidityRules', onEventTest);
|
723
853
|
}, 9);
|
724
854
|
|
725
855
|
});
|
@@ -737,17 +867,20 @@ webshims.register('form-validators', function($, webshims, window, document, und
|
|
737
867
|
*/
|
738
868
|
(function(){
|
739
869
|
|
740
|
-
var addCustomValidityRule =
|
741
|
-
|
742
|
-
|
743
|
-
|
744
|
-
|
870
|
+
var addCustomValidityRule = webshims.addCustomValidityRule;
|
871
|
+
var getId = function(name){
|
872
|
+
return document.getElementById(name);
|
873
|
+
};
|
874
|
+
addCustomValidityRule('partialPattern', function(elem, val, pattern){
|
875
|
+
pattern = pattern.partialPattern;
|
876
|
+
if(!val || !pattern){return;}
|
745
877
|
return !(new RegExp('(' + pattern + ')', 'i').test(val));
|
746
878
|
}, 'This format is not allowed here.');
|
747
879
|
|
748
|
-
|
749
|
-
|
750
|
-
|
880
|
+
|
881
|
+
addCustomValidityRule('tooShort', function(elem, val, data){
|
882
|
+
if(!val || !data.minlength){return;}
|
883
|
+
return data.minlength > val.length;
|
751
884
|
}, 'Entered value is too short.');
|
752
885
|
|
753
886
|
var groupTimer = {};
|
@@ -765,7 +898,7 @@ webshims.register('form-validators', function($, webshims, window, document, und
|
|
765
898
|
.unbind('click.groupRequired')
|
766
899
|
.bind('click.groupRequired', function(){
|
767
900
|
checkboxes.filter('.group-required').each(function(){
|
768
|
-
|
901
|
+
webshims.refreshCustomValidityRules(this);
|
769
902
|
});
|
770
903
|
})
|
771
904
|
;
|
@@ -804,19 +937,16 @@ webshims.register('form-validators', function($, webshims, window, document, und
|
|
804
937
|
var getGroupElements = function(elem) {
|
805
938
|
return $(elem.form[elem.name]).filter('[type="radio"]');
|
806
939
|
};
|
807
|
-
|
808
|
-
if(
|
809
|
-
getGroupElements =
|
940
|
+
webshims.ready('form-validation', function(){
|
941
|
+
if(webshims.modules){
|
942
|
+
getGroupElements = webshims.modules["form-core"].getGroupElements || getGroupElements;
|
810
943
|
}
|
811
944
|
});
|
812
945
|
|
813
|
-
addCustomValidityRule('dependent', function(elem, val){
|
814
|
-
|
815
|
-
if( !
|
816
|
-
|
817
|
-
var data = $(elem).data('dependentValidation');
|
946
|
+
addCustomValidityRule('dependent', function(elem, val, data){
|
947
|
+
data = data.dependentValidation;
|
948
|
+
if( !data ){return;}
|
818
949
|
var specialVal;
|
819
|
-
if(!data){return;}
|
820
950
|
var depFn = function(e){
|
821
951
|
var val = $.prop(data.masterElement, data["from-prop"]);
|
822
952
|
if(specialVal){
|
@@ -865,7 +995,7 @@ webshims.register('form-validators', function($, webshims, window, document, und
|
|
865
995
|
$(data.masterElement.type === 'radio' && getGroupElements(data.masterElement) || data.masterElement).bind('change', depFn);
|
866
996
|
} else {
|
867
997
|
$(data.masterElement).bind('change', function(){
|
868
|
-
|
998
|
+
webshims.refreshCustomValidityRules(elem);
|
869
999
|
$(elem).getShadowElement().filter('.user-error, .user-success').trigger('refreshvalidityui');
|
870
1000
|
});
|
871
1001
|
}
|
@@ -879,6 +1009,121 @@ webshims.register('form-validators', function($, webshims, window, document, und
|
|
879
1009
|
}
|
880
1010
|
|
881
1011
|
}, 'The value of this field does not repeat the value of the other field');
|
1012
|
+
|
1013
|
+
|
1014
|
+
if(window.JSON){
|
1015
|
+
addCustomValidityRule('ajaxvalidate', function(elem, val, data){
|
1016
|
+
if(!val || !data.ajaxvalidate){return;}
|
1017
|
+
var opts;
|
1018
|
+
if(!data.remoteValidate){
|
1019
|
+
if(typeof data.ajaxvalidate == 'string'){
|
1020
|
+
data.ajaxvalidate = {url: data.ajaxvalidate, depends: $([])};
|
1021
|
+
} else {
|
1022
|
+
data.ajaxvalidate.depends = data.ajaxvalidate.depends ? $(data.ajaxvalidate.depends).map(getId) : $([]);
|
1023
|
+
}
|
1024
|
+
|
1025
|
+
data.ajaxvalidate.depends.on('refreshCustomValidityRules', function(){
|
1026
|
+
webshims.refreshCustomValidityRules(elem);
|
1027
|
+
});
|
1028
|
+
|
1029
|
+
opts = data.ajaxvalidate;
|
1030
|
+
|
1031
|
+
var remoteValidate = {
|
1032
|
+
ajaxLoading: false,
|
1033
|
+
restartAjax: false,
|
1034
|
+
message: 'async',
|
1035
|
+
cache: {},
|
1036
|
+
update: function(remoteData){
|
1037
|
+
if(this.ajaxLoading){
|
1038
|
+
this.restartAjax = remoteData;
|
1039
|
+
} else {
|
1040
|
+
this.restartAjax = false;
|
1041
|
+
this.ajaxLoading = true;
|
1042
|
+
$.ajax(
|
1043
|
+
$.extend({}, opts, {
|
1044
|
+
url: opts.url,
|
1045
|
+
dataType: 'json',
|
1046
|
+
depData: remoteData,
|
1047
|
+
data: opts.fullForm ?
|
1048
|
+
$(elem).jProp('form').serializeArray() :
|
1049
|
+
remoteData,
|
1050
|
+
success: this.getResponse,
|
1051
|
+
complete: this._complete
|
1052
|
+
})
|
1053
|
+
);
|
1054
|
+
}
|
1055
|
+
},
|
1056
|
+
_complete: function(){
|
1057
|
+
remoteValidate.ajaxLoading = false;
|
1058
|
+
if(remoteValidate.restartAjax){
|
1059
|
+
this.update(remoteValidate.restartAjax);
|
1060
|
+
}
|
1061
|
+
remoteValidate.restartAjax = false;
|
1062
|
+
},
|
1063
|
+
getResponse: function(data){
|
1064
|
+
var old = webshims.refreshCustomValidityRules;
|
1065
|
+
if(!data){
|
1066
|
+
data = {message: '', valid: true};
|
1067
|
+
} else if(typeof data == 'string'){
|
1068
|
+
data = JSON.parse(data);
|
1069
|
+
}
|
1070
|
+
|
1071
|
+
remoteValidate.message = ('message' in data) ? data.message : !data.valid;
|
1072
|
+
remoteValidate.lastMessage = remoteValidate.message;
|
1073
|
+
remoteValidate.blockUpdate = true;
|
1074
|
+
$(elem).triggerHandler('refreshvalidityui');
|
1075
|
+
remoteValidate.message = 'async';
|
1076
|
+
remoteValidate.blockUpdate = false;
|
1077
|
+
},
|
1078
|
+
getData: function(){
|
1079
|
+
var data;
|
1080
|
+
data = {};
|
1081
|
+
data[$.prop(elem, 'name') || $.prop(elem, 'id')] = $(elem).val();
|
1082
|
+
opts.depends.each(function(){
|
1083
|
+
if($(this).is(':invalid')){
|
1084
|
+
data = false;
|
1085
|
+
return false;
|
1086
|
+
}
|
1087
|
+
data[$.prop(this, 'name') || $.prop(this, 'id')] = $(this).val();
|
1088
|
+
});
|
1089
|
+
return data;
|
1090
|
+
},
|
1091
|
+
getTempMessage: function(){
|
1092
|
+
var message = 'async';
|
1093
|
+
var remoteData, dataStr;
|
1094
|
+
if(!data.remoteValidate.blockUpdate){
|
1095
|
+
remoteData = this.getData();
|
1096
|
+
if(!remoteData){
|
1097
|
+
message = '';
|
1098
|
+
} else {
|
1099
|
+
try {
|
1100
|
+
dataStr = JSON.stringify(remoteData);
|
1101
|
+
} catch(er){}
|
1102
|
+
|
1103
|
+
if(dataStr === this.lastString){
|
1104
|
+
message = this.ajaxLoading ? 'async' : this.lastMessage;
|
1105
|
+
} else {
|
1106
|
+
this.lastString = dataStr;
|
1107
|
+
this.lastMessage = 'async';
|
1108
|
+
clearTimeout(data.remoteValidate.timer);
|
1109
|
+
data.remoteValidate.timer = setTimeout(function(){
|
1110
|
+
data.remoteValidate.update(remoteData);
|
1111
|
+
}, 9);
|
1112
|
+
}
|
1113
|
+
|
1114
|
+
}
|
1115
|
+
} else {
|
1116
|
+
message = remoteValidate.message;
|
1117
|
+
}
|
1118
|
+
return message;
|
1119
|
+
}
|
1120
|
+
};
|
1121
|
+
data.remoteValidate = remoteValidate;
|
1122
|
+
}
|
1123
|
+
|
1124
|
+
return data.remoteValidate.getTempMessage();
|
1125
|
+
}, 'remote error');
|
1126
|
+
}
|
882
1127
|
})();
|
883
1128
|
|
884
1129
|
});
|