formvalidation-rails 0.7.0 → 0.7.1

Sign up to get free protection for your applications and to get access to all the features.
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 || {},