formvalidation-rails 0.7.0 → 0.7.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.
Files changed (56) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +1 -1
  3. data/lib/formvalidation-rails/version.rb +2 -2
  4. data/vendor/assets/javascripts/formvalidation.js +174 -52
  5. data/vendor/assets/javascripts/formvalidation.min.js +6 -6
  6. data/vendor/assets/javascripts/formvalidation/framework/bootstrap.js +2 -2
  7. data/vendor/assets/javascripts/formvalidation/framework/bootstrap.min.js +2 -2
  8. data/vendor/assets/javascripts/formvalidation/framework/foundation.js +2 -2
  9. data/vendor/assets/javascripts/formvalidation/framework/foundation.min.js +2 -2
  10. data/vendor/assets/javascripts/formvalidation/framework/pure.js +2 -2
  11. data/vendor/assets/javascripts/formvalidation/framework/pure.min.js +2 -2
  12. data/vendor/assets/javascripts/formvalidation/framework/semantic.js +2 -2
  13. data/vendor/assets/javascripts/formvalidation/framework/semantic.min.js +2 -2
  14. data/vendor/assets/javascripts/formvalidation/framework/uikit.js +13 -7
  15. data/vendor/assets/javascripts/formvalidation/framework/uikit.min.js +3 -3
  16. data/vendor/assets/javascripts/formvalidation/language/ar_MA.js +1 -0
  17. data/vendor/assets/javascripts/formvalidation/language/bg_BG.js +1 -0
  18. data/vendor/assets/javascripts/formvalidation/language/ca_ES.js +1 -0
  19. data/vendor/assets/javascripts/formvalidation/language/cs_CZ.js +1 -0
  20. data/vendor/assets/javascripts/formvalidation/language/da_DK.js +1 -0
  21. data/vendor/assets/javascripts/formvalidation/language/de_DE.js +2 -1
  22. data/vendor/assets/javascripts/formvalidation/language/el_GR.js +1 -0
  23. data/vendor/assets/javascripts/formvalidation/language/en_US.js +1 -0
  24. data/vendor/assets/javascripts/formvalidation/language/es_CL.js +1 -0
  25. data/vendor/assets/javascripts/formvalidation/language/es_ES.js +1 -0
  26. data/vendor/assets/javascripts/formvalidation/language/eu_ES.js +1 -0
  27. data/vendor/assets/javascripts/formvalidation/language/fa_IR.js +1 -0
  28. data/vendor/assets/javascripts/formvalidation/language/fi_FI.js +1 -0
  29. data/vendor/assets/javascripts/formvalidation/language/fr_BE.js +1 -0
  30. data/vendor/assets/javascripts/formvalidation/language/fr_FR.js +1 -0
  31. data/vendor/assets/javascripts/formvalidation/language/he_IL.js +1 -0
  32. data/vendor/assets/javascripts/formvalidation/language/hi_IN.js +1 -0
  33. data/vendor/assets/javascripts/formvalidation/language/hu_HU.js +1 -0
  34. data/vendor/assets/javascripts/formvalidation/language/id_ID.js +1 -0
  35. data/vendor/assets/javascripts/formvalidation/language/it_IT.js +1 -0
  36. data/vendor/assets/javascripts/formvalidation/language/ja_JP.js +1 -0
  37. data/vendor/assets/javascripts/formvalidation/language/nl_BE.js +1 -0
  38. data/vendor/assets/javascripts/formvalidation/language/nl_NL.js +1 -0
  39. data/vendor/assets/javascripts/formvalidation/language/no_NO.js +1 -0
  40. data/vendor/assets/javascripts/formvalidation/language/pl_PL.js +1 -0
  41. data/vendor/assets/javascripts/formvalidation/language/pt_BR.js +1 -0
  42. data/vendor/assets/javascripts/formvalidation/language/pt_PT.js +1 -0
  43. data/vendor/assets/javascripts/formvalidation/language/ro_RO.js +1 -0
  44. data/vendor/assets/javascripts/formvalidation/language/ru_RU.js +1 -0
  45. data/vendor/assets/javascripts/formvalidation/language/sk_SK.js +1 -0
  46. data/vendor/assets/javascripts/formvalidation/language/sq_AL.js +1 -0
  47. data/vendor/assets/javascripts/formvalidation/language/sr_RS.js +1 -0
  48. data/vendor/assets/javascripts/formvalidation/language/sv_SE.js +1 -0
  49. data/vendor/assets/javascripts/formvalidation/language/th_TH.js +1 -0
  50. data/vendor/assets/javascripts/formvalidation/language/tr_TR.js +1 -0
  51. data/vendor/assets/javascripts/formvalidation/language/ua_UA.js +1 -0
  52. data/vendor/assets/javascripts/formvalidation/language/vi_VN.js +1 -0
  53. data/vendor/assets/javascripts/formvalidation/language/zh_CN.js +1 -0
  54. data/vendor/assets/javascripts/formvalidation/language/zh_TW.js +1 -0
  55. data/vendor/assets/stylesheets/formvalidation.css +1 -1
  56. metadata +3 -3
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 508aa888c54567ee1fd53cc373fbc8f262d4e010
4
- data.tar.gz: 7069f66c31732f68cf2654189eedc3c0502b18be
3
+ metadata.gz: f4f643c7c8429cffdf0628d33755863c29f3c6b2
4
+ data.tar.gz: aea79b0e8185f264e9bcd2ccc1658fc6d80476fc
5
5
  SHA512:
6
- metadata.gz: 64da37953d0636a8648bbb1ed5a2fee7747112c0e88347a908c15393165fc65c13b3b9480c96141301f89d238b37a148d4f1f12e0bf387d4cc49be307507b4a9
7
- data.tar.gz: 6e476090b60cdb2320d86e1cac3f998f1e74b837702c10bdd07c5e3b110249113565c948c4c91e577831a9d0fb63b959ed4740369da29512cea00b53319bc2c3
6
+ metadata.gz: 8d55c2bc37e8dfa8e03c4ffb8a3b74b1a7d7c343884a880fe2a643cd108abbae095dea7a2f66da70108b92e211939dec5dbb2bd64ea4838dd65f8722f6c4f1ce
7
+ data.tar.gz: 9e5fb088a18450cc1e97113dc2f65a544ce870026a3ec170062369e9d83a356a6b0490e2228d57c28c85166d626cd9a620121fe75010ea03aea6a50526024e65
data/README.md CHANGED
@@ -1,4 +1,4 @@
1
- formvalidation-rails (0.7.0)
1
+ formvalidation-rails (0.7.1)
2
2
  =================================
3
3
 
4
4
  Provides client side validations for forms with the http://formvalidation.io/ library.
@@ -1,6 +1,6 @@
1
1
  module FormvalidationRails
2
2
  module Rails
3
- VERSION = '0.7.0'
4
- SOURCE_VERSION = '0.7.0'
3
+ VERSION = '0.7.1'
4
+ SOURCE_VERSION = '0.7.1'
5
5
  end
6
6
  end
@@ -2,9 +2,9 @@
2
2
  * FormValidation (http://formvalidation.io)
3
3
  * The best jQuery plugin to validate form fields. Support Bootstrap, Foundation, Pure, SemanticUI, UIKit and custom frameworks
4
4
  *
5
- * @version v0.7.0, built on 2015-08-01 4:57:16 PM
5
+ * @version v0.7.1, built on 2016-02-01 12:00:57 AM
6
6
  * @author https://twitter.com/formvalidation
7
- * @copyright (c) 2013 - 2015 Nguyen Huu Phuoc
7
+ * @copyright (c) 2013 - 2016 Nguyen Huu Phuoc
8
8
  * @license http://formvalidation.io/license/
9
9
  */
10
10
  // Register the namespace
@@ -125,11 +125,13 @@ if (typeof jQuery === 'undefined') {
125
125
  formInit: this.$form.attr('data-' + ns + '-events-form-init'),
126
126
  formPreValidate: this.$form.attr('data-' + ns + '-events-form-prevalidate'),
127
127
  formError: this.$form.attr('data-' + ns + '-events-form-error'),
128
+ formReset: this.$form.attr('data-' + ns + '-events-form-reset'),
128
129
  formSuccess: this.$form.attr('data-' + ns + '-events-form-success'),
129
130
  fieldAdded: this.$form.attr('data-' + ns + '-events-field-added'),
130
131
  fieldRemoved: this.$form.attr('data-' + ns + '-events-field-removed'),
131
132
  fieldInit: this.$form.attr('data-' + ns + '-events-field-init'),
132
133
  fieldError: this.$form.attr('data-' + ns + '-events-field-error'),
134
+ fieldReset: this.$form.attr('data-' + ns + '-events-field-reset'),
133
135
  fieldSuccess: this.$form.attr('data-' + ns + '-events-field-success'),
134
136
  fieldStatus: this.$form.attr('data-' + ns + '-events-field-status'),
135
137
  localeChanged: this.$form.attr('data-' + ns + '-events-locale-changed'),
@@ -149,6 +151,7 @@ if (typeof jQuery === 'undefined') {
149
151
  message: this.$form.attr('data-' + ns + '-message'),
150
152
  onPreValidate: this.$form.attr('data-' + ns + '-onprevalidate'),
151
153
  onError: this.$form.attr('data-' + ns + '-onerror'),
154
+ onReset: this.$form.attr('data-' + ns + '-onreset'),
152
155
  onSuccess: this.$form.attr('data-' + ns + '-onsuccess'),
153
156
  row: {
154
157
  selector: this.$form.attr('data-' + ns + '-row-selector') || this.$form.attr('data-' + ns + '-group'), // Support backward
@@ -285,6 +288,11 @@ if (typeof jQuery === 'undefined') {
285
288
  FormValidation.Helper.call(that.options.onError, [e]);
286
289
  });
287
290
  }
291
+ if (this.options.onReset) {
292
+ this.$form.on(this.options.events.formReset, function(e) {
293
+ FormValidation.Helper.call(that.options.onReset, [e]);
294
+ });
295
+ }
288
296
  },
289
297
 
290
298
  /**
@@ -335,6 +343,7 @@ if (typeof jQuery === 'undefined') {
335
343
  type = fields.attr('type'),
336
344
  updateAll = (total === 1) || ('radio' === type) || ('checkbox' === type),
337
345
  trigger = this._getFieldTrigger(fields.eq(0)),
346
+ clazz = this.options.err.clazz.split(' ').join('.'),
338
347
  events = $.map(trigger, function(item) {
339
348
  return item + '.update.' + ns;
340
349
  }).join(' ');
@@ -355,7 +364,7 @@ if (typeof jQuery === 'undefined') {
355
364
  }
356
365
 
357
366
  // Remove all error messages and feedback icons
358
- $message.find('.' + this.options.err.clazz.split(' ').join('.') + '[data-' + ns + '-validator][data-' + ns + '-for="' + field + '"]').remove();
367
+ $message.find('.' + clazz + '[data-' + ns + '-validator][data-' + ns + '-for="' + field + '"]').remove();
359
368
  $parent.find('i[data-' + ns + '-icon-for="' + field + '"]').remove();
360
369
 
361
370
  // Whenever the user change the field value, mark it as not validated yet
@@ -434,8 +443,27 @@ if (typeof jQuery === 'undefined') {
434
443
  }
435
444
  }
436
445
 
446
+ // Sort the validators by priority
447
+ var sortedByPriority = [];
448
+ for (validatorName in validators) {
449
+ alias = validators[validatorName].alias || validatorName;
450
+
451
+ // Determine the priority
452
+ validators[validatorName].priority = parseInt(validators[validatorName].priority
453
+ || FormValidation.Validator[alias].priority
454
+ || 1, 10);
455
+ sortedByPriority.push({
456
+ validator: validatorName,
457
+ priority: validators[validatorName].priority
458
+ });
459
+ }
460
+ sortedByPriority = sortedByPriority.sort(function(a, b) {
461
+ return a.priority - b.priority;
462
+ });
463
+
437
464
  // Prepare the events
438
465
  fields
466
+ .data(ns + '.validators', sortedByPriority)
439
467
  .on(this.options.events.fieldSuccess, function(e, data) {
440
468
  var onSuccess = that.getOptions(data.field, null, 'onSuccess');
441
469
  if (onSuccess) {
@@ -448,6 +476,12 @@ if (typeof jQuery === 'undefined') {
448
476
  FormValidation.Helper.call(onError, [e, data]);
449
477
  }
450
478
  })
479
+ .on(this.options.events.fieldReset, function(e, data) {
480
+ var onReset = that.getOptions(data.field, null, 'onReset');
481
+ if (onReset) {
482
+ FormValidation.Helper.call(onReset, [e, data]);
483
+ }
484
+ })
451
485
  .on(this.options.events.fieldStatus, function(e, data) {
452
486
  var onStatus = that.getOptions(data.field, null, 'onStatus');
453
487
  if (onStatus) {
@@ -717,7 +751,9 @@ if (typeof jQuery === 'undefined') {
717
751
  validator.html5Attributes = $.extend({}, {
718
752
  message: 'message',
719
753
  onerror: 'onError',
754
+ onreset: 'onReset',
720
755
  onsuccess: 'onSuccess',
756
+ priority: 'priority',
721
757
  transformer: 'transformer'
722
758
  }, validator.html5Attributes);
723
759
  validators[v] = $.extend({}, html5AttrMap === true ? {} : html5AttrMap, validators[v]);
@@ -749,6 +785,7 @@ if (typeof jQuery === 'undefined') {
749
785
  icon: $field.attr('data-' + ns + '-icon') || $field.attr('data-' + ns + '-feedbackicons') || (this.options.fields && this.options.fields[field] ? this.options.fields[field].feedbackIcons : null), // Support backward
750
786
  message: $field.attr('data-' + ns + '-message'),
751
787
  onError: $field.attr('data-' + ns + '-onerror'),
788
+ onReset: $field.attr('data-' + ns + '-onreset'),
752
789
  onStatus: $field.attr('data-' + ns + '-onstatus'),
753
790
  onSuccess: $field.attr('data-' + ns + '-onsuccess'),
754
791
  row: $field.attr('data-' + ns + '-row') || $field.attr('data-' + ns + '-group') || (this.options.fields && this.options.fields[field] ? this.options.fields[field].group : null), // Support backward
@@ -1200,12 +1237,13 @@ if (typeof jQuery === 'undefined') {
1200
1237
  }
1201
1238
  });
1202
1239
 
1203
- var total = fields.length;
1240
+ var total = fields.length,
1241
+ clazz = this.options.err.clazz.split(' ').join('.');
1204
1242
  for (var i = 0; i < total; i++) {
1205
1243
  var $f = fields[i],
1206
1244
  field = $f.attr('data-' + ns + '-field'),
1207
1245
  $errors = $f.data(ns + '.messages')
1208
- .find('.' + this.options.err.clazz.split(' ').join('.') + '[data-' + ns + '-validator][data-' + ns + '-for="' + field + '"]');
1246
+ .find('.' + clazz + '[data-' + ns + '-validator][data-' + ns + '-for="' + field + '"]');
1209
1247
 
1210
1248
  if (this.options.fields && this.options.fields[field]
1211
1249
  && (this.options.fields[field].enabled === 'false' || this.options.fields[field].enabled === false))
@@ -1351,8 +1389,7 @@ if (typeof jQuery === 'undefined') {
1351
1389
  * @returns {FormValidation.Base}
1352
1390
  */
1353
1391
  updateMessage: function(field, validator, message) {
1354
- var that = this,
1355
- ns = this._namespace,
1392
+ var ns = this._namespace,
1356
1393
  $fields = $([]);
1357
1394
  switch (typeof field) {
1358
1395
  case 'object':
@@ -1366,10 +1403,11 @@ if (typeof jQuery === 'undefined') {
1366
1403
  break;
1367
1404
  }
1368
1405
 
1406
+ var clazz = this.options.err.clazz.split(' ').join('.');
1369
1407
  $fields.each(function() {
1370
1408
  $(this)
1371
1409
  .data(ns + '.messages')
1372
- .find('.' + that.options.err.clazz + '[data-' + ns + '-validator="' + validator + '"][data-' + ns + '-for="' + field + '"]').html(message);
1410
+ .find('.' + clazz + '[data-' + ns + '-validator="' + validator + '"][data-' + ns + '-for="' + field + '"]').html(message);
1373
1411
  });
1374
1412
 
1375
1413
  return this;
@@ -1411,7 +1449,8 @@ if (typeof jQuery === 'undefined') {
1411
1449
  var that = this,
1412
1450
  type = fields.attr('type'),
1413
1451
  row = this.options.fields[field].row || this.options.row.selector,
1414
- total = ('radio' === type || 'checkbox' === type) ? 1 : fields.length;
1452
+ total = ('radio' === type || 'checkbox' === type) ? 1 : fields.length,
1453
+ clazz = this.options.err.clazz.split(' ').join('.');
1415
1454
 
1416
1455
  for (var i = 0; i < total; i++) {
1417
1456
  var $field = fields.eq(i);
@@ -1421,7 +1460,7 @@ if (typeof jQuery === 'undefined') {
1421
1460
 
1422
1461
  var $parent = $field.closest(row),
1423
1462
  $message = $field.data(ns + '.messages'),
1424
- $allErrors = $message.find('.' + this.options.err.clazz.split(' ').join('.') + '[data-' + ns + '-validator][data-' + ns + '-for="' + field + '"]'),
1463
+ $allErrors = $message.find('.' + clazz + '[data-' + ns + '-validator][data-' + ns + '-for="' + field + '"]'),
1425
1464
  $errors = validatorName ? $allErrors.filter('[data-' + ns + '-validator="' + validatorName + '"]') : $allErrors,
1426
1465
  $icon = $field.data(ns + '.icon'),
1427
1466
  // Support backward
@@ -1614,8 +1653,12 @@ if (typeof jQuery === 'undefined') {
1614
1653
  continue;
1615
1654
  }
1616
1655
 
1617
- var stop = false;
1618
- for (validatorName in validators) {
1656
+ var stop = false,
1657
+ sortedByPriority = $field.data(ns + '.validators'),
1658
+ numValidators = sortedByPriority.length;
1659
+
1660
+ for (var j = 0; j < numValidators; j++) {
1661
+ validatorName = sortedByPriority[j].validator;
1619
1662
  if ($field.data(ns + '.dfs.' + validatorName)) {
1620
1663
  $field.data(ns + '.dfs.' + validatorName).reject();
1621
1664
  }
@@ -1788,6 +1831,7 @@ if (typeof jQuery === 'undefined') {
1788
1831
  }
1789
1832
 
1790
1833
  // Remove messages and icons
1834
+ var clazz = this.options.err.clazz.split(' ').join('.');
1791
1835
  for (field in this.options.fields) {
1792
1836
  fields = this.getFieldElements(field);
1793
1837
  row = this.options.fields[field].row || this.options.row.selector;
@@ -1796,9 +1840,10 @@ if (typeof jQuery === 'undefined') {
1796
1840
  $field
1797
1841
  // Remove all error messages
1798
1842
  .data(ns + '.messages')
1799
- .find('.' + this.options.err.clazz.split(' ').join('.') + '[data-' + ns + '-validator][data-' + ns + '-for="' + field + '"]').remove().end()
1843
+ .find('.' + clazz + '[data-' + ns + '-validator][data-' + ns + '-for="' + field + '"]').remove().end()
1800
1844
  .end()
1801
1845
  .removeData(ns + '.messages')
1846
+ .removeData(ns + '.validators')
1802
1847
  // Remove feedback classes
1803
1848
  .closest(row)
1804
1849
  .removeClass(this.options.row.valid)
@@ -1981,12 +2026,13 @@ if (typeof jQuery === 'undefined') {
1981
2026
  break;
1982
2027
  }
1983
2028
 
1984
- var filter = validator ? '[data-' + ns + '-validator="' + validator + '"]' : '';
2029
+ var filter = validator ? '[data-' + ns + '-validator="' + validator + '"]' : '',
2030
+ clazz = this.options.err.clazz.split(' ').join('.');
1985
2031
  $fields.each(function() {
1986
2032
  messages = messages.concat(
1987
2033
  $(this)
1988
2034
  .data(ns + '.messages')
1989
- .find('.' + that.options.err.clazz + '[data-' + ns + '-for="' + $(this).attr('data-' + ns + '-field') + '"][data-' + ns + '-result="' + that.STATUS_INVALID + '"]' + filter)
2035
+ .find('.' + clazz + '[data-' + ns + '-for="' + $(this).attr('data-' + ns + '-field') + '"][data-' + ns + '-result="' + that.STATUS_INVALID + '"]' + filter)
1990
2036
  .map(function() {
1991
2037
  var v = $(this).attr('data-' + ns + '-validator'),
1992
2038
  f = $(this).attr('data-' + ns + '-for');
@@ -2086,9 +2132,10 @@ if (typeof jQuery === 'undefined') {
2086
2132
  break;
2087
2133
  }
2088
2134
 
2089
- var total = $fields.length;
2135
+ var i = 0,
2136
+ total = $fields.length;
2090
2137
  if (this.options.fields[field]) {
2091
- for (var i = 0; i < total; i++) {
2138
+ for (i = 0; i < total; i++) {
2092
2139
  for (var validator in this.options.fields[field].validators) {
2093
2140
  $fields.eq(i).removeData(ns + '.dfs.' + validator);
2094
2141
  }
@@ -2103,6 +2150,15 @@ if (typeof jQuery === 'undefined') {
2103
2150
  // Mark field as not validated yet
2104
2151
  this.updateStatus(field, this.STATUS_NOT_VALIDATED);
2105
2152
 
2153
+ for (i = 0; i < total; i++) {
2154
+ $fields.eq(i).trigger($.Event(this.options.events.fieldReset), {
2155
+ fv: this,
2156
+ field: field,
2157
+ element: $fields.eq(i),
2158
+ resetValue: resetValue
2159
+ });
2160
+ }
2161
+
2106
2162
  return this;
2107
2163
  },
2108
2164
 
@@ -2123,6 +2179,11 @@ if (typeof jQuery === 'undefined') {
2123
2179
  // Enable submit buttons
2124
2180
  this.disableSubmitButtons(false);
2125
2181
 
2182
+ this.$form.trigger($.Event(this.options.events.formReset), {
2183
+ fv: this,
2184
+ resetValue: resetValue
2185
+ });
2186
+
2126
2187
  return this;
2127
2188
  },
2128
2189
 
@@ -2262,11 +2323,13 @@ if (typeof jQuery === 'undefined') {
2262
2323
  formInit: 'init.form.fv',
2263
2324
  formPreValidate: 'prevalidate.form.fv',
2264
2325
  formError: 'err.form.fv',
2326
+ formReset: 'rst.form.fv',
2265
2327
  formSuccess: 'success.form.fv',
2266
2328
  fieldAdded: 'added.field.fv',
2267
2329
  fieldRemoved: 'removed.field.fv',
2268
2330
  fieldInit: 'init.field.fv',
2269
2331
  fieldError: 'err.field.fv',
2332
+ fieldReset: 'rst.field.fv',
2270
2333
  fieldSuccess: 'success.field.fv',
2271
2334
  fieldStatus: 'status.field.fv',
2272
2335
  localeChanged: 'changed.locale.fv',
@@ -2716,6 +2779,8 @@ if (typeof jQuery === 'undefined') {
2716
2779
  });
2717
2780
 
2718
2781
  FormValidation.Validator.callback = {
2782
+ priority: 999,
2783
+
2719
2784
  html5Attributes: {
2720
2785
  message: 'message',
2721
2786
  callback: 'callback'
@@ -3478,30 +3543,29 @@ if (typeof jQuery === 'undefined') {
3478
3543
 
3479
3544
  // Validate day, month, and year
3480
3545
  var valid = FormValidation.Helper.date(year, month, day),
3481
- // declare the date, min and max objects
3482
3546
  min = null,
3483
3547
  max = null,
3484
3548
  minOption = options.min,
3485
3549
  maxOption = options.max;
3486
3550
 
3487
3551
  if (minOption) {
3488
- if (isNaN(Date.parse(minOption))) {
3489
- minOption = validator.getDynamicOption($field, minOption);
3490
- }
3552
+ min = (minOption instanceof Date)
3553
+ ? minOption
3554
+ : (this._parseDate(minOption, dateFormat, separator) ||
3555
+ this._parseDate(validator.getDynamicOption($field, minOption), dateFormat, separator));
3491
3556
 
3492
- min = minOption instanceof Date ? minOption : this._parseDate(minOption, dateFormat, separator);
3493
3557
  // In order to avoid displaying a date string like "Mon Dec 08 2014 19:14:12 GMT+0000 (WET)"
3494
- minOption = minOption instanceof Date ? this._formatDate(minOption, options.format) : minOption;
3558
+ minOption = this._formatDate(min, options.format);
3495
3559
  }
3496
3560
 
3497
3561
  if (maxOption) {
3498
- if (isNaN(Date.parse(maxOption))) {
3499
- maxOption = validator.getDynamicOption($field, maxOption);
3500
- }
3562
+ max = (maxOption instanceof Date)
3563
+ ? maxOption
3564
+ : (this._parseDate(maxOption, dateFormat, separator) ||
3565
+ this._parseDate(validator.getDynamicOption($field, maxOption), dateFormat, separator));
3501
3566
 
3502
- max = maxOption instanceof Date ? maxOption : this._parseDate(maxOption, dateFormat, separator);
3503
3567
  // In order to avoid displaying a date string like "Mon Dec 08 2014 19:14:12 GMT+0000 (WET)"
3504
- maxOption = maxOption instanceof Date ? this._formatDate(maxOption, options.format) : maxOption;
3568
+ maxOption = this._formatDate(max, options.format);
3505
3569
  }
3506
3570
 
3507
3571
  date = new Date(year, month -1, day, hours, minutes, seconds);
@@ -3536,7 +3600,7 @@ if (typeof jQuery === 'undefined') {
3536
3600
  /**
3537
3601
  * Return a date object after parsing the date string
3538
3602
  *
3539
- * @param {String} date The date string to parse
3603
+ * @param {Date|String} date The date string to parse
3540
3604
  * @param {String} format The date format
3541
3605
  * The format can be:
3542
3606
  * - date: Consist of DD, MM, YYYY parts which are separated by the separator option
@@ -3546,23 +3610,37 @@ if (typeof jQuery === 'undefined') {
3546
3610
  * @returns {Date}
3547
3611
  */
3548
3612
  _parseDate: function(date, format, separator) {
3613
+ if (date instanceof Date) {
3614
+ return date;
3615
+ }
3616
+ if (typeof date !== 'string') {
3617
+ return null;
3618
+ }
3619
+
3620
+ // Ensure that the format must consist of year, month and day patterns
3621
+ var yearIndex = $.inArray('YYYY', format),
3622
+ monthIndex = $.inArray('MM', format),
3623
+ dayIndex = $.inArray('DD', format);
3624
+ if (yearIndex === -1 || monthIndex === -1 || dayIndex === -1) {
3625
+ return null;
3626
+ }
3627
+
3549
3628
  var minutes = 0, hours = 0, seconds = 0,
3550
3629
  sections = date.split(' '),
3551
- dateSection = sections[0],
3552
- timeSection = (sections.length > 1) ? sections[1] : null;
3630
+ dateSection = sections[0].split(separator);
3631
+ if (dateSection.length < 3) {
3632
+ return null;
3633
+ }
3553
3634
 
3554
- dateSection = dateSection.split(separator);
3555
- var year = dateSection[$.inArray('YYYY', format)],
3556
- month = dateSection[$.inArray('MM', format)],
3557
- day = dateSection[$.inArray('DD', format)];
3558
- if (timeSection) {
3559
- timeSection = timeSection.split(':');
3560
- hours = timeSection.length > 0 ? timeSection[0] : null;
3561
- minutes = timeSection.length > 1 ? timeSection[1] : null;
3562
- seconds = timeSection.length > 2 ? timeSection[2] : null;
3635
+ if (sections.length > 1) {
3636
+ var timeSection = sections[1].split(':');
3637
+ hours = timeSection.length > 0 ? timeSection[0] : null;
3638
+ minutes = timeSection.length > 1 ? timeSection[1] : null;
3639
+ seconds = timeSection.length > 2 ? timeSection[2] : null;
3563
3640
  }
3564
3641
 
3565
- return new Date(year, month -1, day, hours, minutes, seconds);
3642
+ return new Date(dateSection[yearIndex], dateSection[monthIndex] - 1, dateSection[dayIndex],
3643
+ hours, minutes, seconds);
3566
3644
  },
3567
3645
 
3568
3646
  /**
@@ -3680,7 +3758,7 @@ if (typeof jQuery === 'undefined') {
3680
3758
  init: function(validator, $field, options, validatorName) {
3681
3759
  var fields = options.field.split(',');
3682
3760
  for (var i = 0; i < fields.length; i++) {
3683
- var compareWith = validator.getFieldElements(fields[i]);
3761
+ var compareWith = validator.getFieldElements($.trim(fields[i]));
3684
3762
  validator.onLiveChange(compareWith, 'live_' + validatorName, function() {
3685
3763
  var status = validator.getStatus($field, validatorName);
3686
3764
  if (status !== validator.STATUS_NOT_VALIDATED) {
@@ -3701,7 +3779,7 @@ if (typeof jQuery === 'undefined') {
3701
3779
  destroy: function(validator, $field, options, validatorName) {
3702
3780
  var fields = options.field.split(',');
3703
3781
  for (var i = 0; i < fields.length; i++) {
3704
- var compareWith = validator.getFieldElements(fields[i]);
3782
+ var compareWith = validator.getFieldElements($.trim(fields[i]));
3705
3783
  validator.offLiveChange(compareWith, 'live_' + validatorName);
3706
3784
  }
3707
3785
  },
@@ -3726,7 +3804,7 @@ if (typeof jQuery === 'undefined') {
3726
3804
  isValid = true;
3727
3805
 
3728
3806
  for (var i = 0; i < fields.length; i++) {
3729
- var compareWith = validator.getFieldElements(fields[i]);
3807
+ var compareWith = validator.getFieldElements($.trim(fields[i]));
3730
3808
  if (compareWith == null || compareWith.length === 0) {
3731
3809
  continue;
3732
3810
  }
@@ -3835,8 +3913,8 @@ if (typeof jQuery === 'undefined') {
3835
3913
  KANSAS_CITY: ['40', '44'],
3836
3914
  MEMPHIS: ['94', '95'],
3837
3915
  OGDEN: ['80', '90'],
3838
- PHILADELPHIA: ['33', '39', '41', '42', '43', '46', '48', '62', '63', '64', '66', '68', '71', '72', '73', '74', '75', '76', '77', '81', '82', '83', '84', '85', '86', '87', '88', '91', '92', '93', '98', '99'],
3839
- INTERNET: ['20', '26', '27', '45', '46'],
3916
+ PHILADELPHIA: ['33', '39', '41', '42', '43', '48', '62', '63', '64', '66', '68', '71', '72', '73', '74', '75', '76', '77', '81', '82', '83', '84', '85', '86', '87', '88', '91', '92', '93', '98', '99'],
3917
+ INTERNET: ['20', '26', '27', '45', '46', '47'],
3840
3918
  SMALL_BUSINESS_ADMINISTRATION: ['31']
3841
3919
  },
3842
3920
 
@@ -4503,6 +4581,7 @@ if (typeof jQuery === 'undefined') {
4503
4581
  SK: 'Slovakia',
4504
4582
  SM: 'San Marino',
4505
4583
  TH: 'Thailand',
4584
+ TR: 'Turkey',
4506
4585
  ZA: 'South Africa'
4507
4586
  }
4508
4587
  }
@@ -4518,7 +4597,7 @@ if (typeof jQuery === 'undefined') {
4518
4597
  // Supported country codes
4519
4598
  COUNTRY_CODES: [
4520
4599
  'BA', 'BG', 'BR', 'CH', 'CL', 'CN', 'CZ', 'DK', 'EE', 'ES', 'FI', 'HR', 'IE', 'IS', 'LT', 'LV', 'ME', 'MK', 'NL',
4521
- 'PL', 'RO', 'RS', 'SE', 'SI', 'SK', 'SM', 'TH', 'ZA'
4600
+ 'PL', 'RO', 'RS', 'SE', 'SI', 'SK', 'SM', 'TH', 'TR', 'ZA'
4522
4601
  ],
4523
4602
 
4524
4603
  /**
@@ -5852,6 +5931,26 @@ if (typeof jQuery === 'undefined') {
5852
5931
  return (11 - sum % 11) % 10 === parseInt(value.charAt(12), 10);
5853
5932
  },
5854
5933
 
5934
+ /**
5935
+ * Validate Turkish Identification Number
5936
+ *
5937
+ * @see https://en.wikipedia.org/wiki/Turkish_Identification_Number
5938
+ * @param {String} value The ID
5939
+ * @returns {Boolean}
5940
+ */
5941
+ _tr: function(value) {
5942
+ if (value.length !== 11) {
5943
+ return false;
5944
+ }
5945
+
5946
+ var sum = 0;
5947
+ for (var i = 0; i < 10; i++) {
5948
+ sum += parseInt(value.charAt(i), 10);
5949
+ }
5950
+
5951
+ return (sum % 10) === parseInt(value.charAt(10), 10);
5952
+ },
5953
+
5855
5954
  /**
5856
5955
  * Validate South African ID
5857
5956
  *
@@ -6532,7 +6631,7 @@ if (typeof jQuery === 'undefined') {
6532
6631
  return true;
6533
6632
  }
6534
6633
 
6535
- return /^([0-9A-F]{2}[:-]){5}([0-9A-F]{2})$/.test(value);
6634
+ return /^([0-9A-Fa-f]{2}[:-]){5}([0-9A-Fa-f]{2})$/.test(value) || /^([0-9A-Fa-f]{4}\.){2}([0-9A-Fa-f]{4})$/.test(value);
6536
6635
  }
6537
6636
  };
6538
6637
  }(jQuery));
@@ -6704,10 +6803,19 @@ if (typeof jQuery === 'undefined') {
6704
6803
  if (value === '') {
6705
6804
  return true;
6706
6805
  }
6806
+
6707
6807
  var decimalSeparator = options.separator || options.decimalSeparator || '.',
6708
6808
  thousandsSeparator = options.thousandsSeparator || '';
6709
- decimalSeparator = (decimalSeparator === '.') ? '\\.' : decimalSeparator;
6710
- thousandsSeparator = (thousandsSeparator === '.') ? '\\.' : thousandsSeparator;
6809
+
6810
+ // Support preceding zero numbers such as .5, -.5
6811
+ if (value.substr(0, 1) === decimalSeparator) {
6812
+ value = '0' + decimalSeparator + value.substr(1);
6813
+ } else if (value.substr(0, 2) === '-' + decimalSeparator) {
6814
+ value = '-0' + decimalSeparator + value.substr(2);
6815
+ }
6816
+
6817
+ decimalSeparator = (decimalSeparator === '.') ? '\\.' : decimalSeparator;
6818
+ thousandsSeparator = (thousandsSeparator === '.') ? '\\.' : thousandsSeparator;
6711
6819
 
6712
6820
  var testRegexp = new RegExp('^-?[0-9]{1,3}(' + thousandsSeparator + '[0-9]{3})*(' + decimalSeparator + '[0-9]+)?$'),
6713
6821
  thousandsReplacer = new RegExp(thousandsSeparator, 'g');
@@ -6938,7 +7046,7 @@ if (typeof jQuery === 'undefined') {
6938
7046
  // May start with 1, +1, or 1-; should discard
6939
7047
  // Area code may be delimited with (), & sections may be delimited with . or -
6940
7048
  // http://regexr.com/38mqi
6941
- isValid = (/^(?:(1\-?)|(\+1 ?))?\(?(\d{3})[\)\-\.]?(\d{3})[\-\.]?(\d{4})$/).test(value);
7049
+ isValid = (/^(?:(1\-?)|(\+1 ?))?\(?\d{3}\)?\s?[\-\.]?\d{3}[\-\.]?\d{4}$/).test(value);
6942
7050
  break;
6943
7051
  }
6944
7052
 
@@ -6959,6 +7067,8 @@ if (typeof jQuery === 'undefined') {
6959
7067
  });
6960
7068
 
6961
7069
  FormValidation.Validator.promise = {
7070
+ priority: 999,
7071
+
6962
7072
  html5Attributes: {
6963
7073
  message: 'message',
6964
7074
  promise: 'promise'
@@ -7029,6 +7139,7 @@ if (typeof jQuery === 'undefined') {
7029
7139
  FormValidation.Validator.regexp = {
7030
7140
  html5Attributes: {
7031
7141
  message: 'message',
7142
+ flags: 'flags',
7032
7143
  regexp: 'regexp'
7033
7144
  },
7034
7145
 
@@ -7050,6 +7161,10 @@ if (typeof jQuery === 'undefined') {
7050
7161
  * @param {jQuery} $field Field element
7051
7162
  * @param {Object} options Consists of the following key:
7052
7163
  * - regexp: The regular expression you need to check
7164
+ * - flags: If specified, flags can have any combination of Javascript regular expression flags such as:
7165
+ * g: global match
7166
+ * i: ignore case
7167
+ * m: multiple line
7053
7168
  * @returns {Boolean}
7054
7169
  */
7055
7170
  validate: function(validator, $field, options, validatorName) {
@@ -7058,7 +7173,9 @@ if (typeof jQuery === 'undefined') {
7058
7173
  return true;
7059
7174
  }
7060
7175
 
7061
- var regexp = ('string' === typeof options.regexp) ? new RegExp(options.regexp) : options.regexp;
7176
+ var regexp = ('string' === typeof options.regexp)
7177
+ ? (options.flags ? new RegExp(options.regexp, options.flags) : new RegExp(options.regexp))
7178
+ : options.regexp;
7062
7179
  return regexp.test(value);
7063
7180
  }
7064
7181
  };
@@ -7073,7 +7190,10 @@ if (typeof jQuery === 'undefined') {
7073
7190
  });
7074
7191
 
7075
7192
  FormValidation.Validator.remote = {
7193
+ priority: 1000,
7194
+
7076
7195
  html5Attributes: {
7196
+ async: 'async',
7077
7197
  crossdomain: 'crossDomain',
7078
7198
  data: 'data',
7079
7199
  datatype: 'dataType',
@@ -7103,6 +7223,7 @@ if (typeof jQuery === 'undefined') {
7103
7223
  * @param {FormValidation.Base} validator Plugin instance
7104
7224
  * @param {jQuery} $field Field element
7105
7225
  * @param {Object} options Can consist of the following keys:
7226
+ * - async {Boolean} [optional] Indicate the Ajax request will be asynchronous or not. It's true by default
7106
7227
  * - crossDomain {Boolean} [optional]
7107
7228
  * - data {Object|Function} [optional]: By default, it will take the value
7108
7229
  * {
@@ -7151,6 +7272,7 @@ if (typeof jQuery === 'undefined') {
7151
7272
  data[options.name || name] = value;
7152
7273
 
7153
7274
  var ajaxOptions = {
7275
+ async: options.async === null || options.async === true || options.async === 'true',
7154
7276
  data: data,
7155
7277
  dataType: options.dataType || 'json',
7156
7278
  headers: options.headers || {},