/js/jquery.ui.datepicker.validation.js

https://bitbucket.org/ciesadesign/puremichigan_dev_dist_20120830 · JavaScript · 200 lines · 149 code · 17 blank · 34 comment · 35 complexity · a6237394e2e509855e9be79411901a47 MD5 · raw file

  1. /* Datepicker Validation 1.0.1 for jQuery UI Datepicker 1.8.6.
  2. Requires Jörn Zaefferer's Validation plugin (http://plugins.jquery.com/project/validate).
  3. Written by Keith Wood (kbwood{at}iinet.com.au).
  4. Dual licensed under the GPL (http://dev.jquery.com/browser/trunk/jquery/GPL-LICENSE.txt) and
  5. MIT (http://dev.jquery.com/browser/trunk/jquery/MIT-LICENSE.txt) licenses.
  6. Please attribute the author if you use it. */
  7. (function($) { // Hide the namespace
  8. /* Add validation methods if validation plugin available. */
  9. if ($.fn.validate) {
  10. $.datepicker._selectDate2 = $.datepicker._selectDate;
  11. $.extend($.datepicker.regional[''], {
  12. validateDate: 'Please enter a valid date',
  13. validateDateMin: 'Please enter a date on or after {0}',
  14. validateDateMax: 'Please enter a date on or before {0}',
  15. validateDateMinMax: 'Please enter a date between {0} and {1}',
  16. validateDateCompare: 'Please enter a date {0} {1}',
  17. validateDateToday: 'today',
  18. validateDateOther: 'the other date',
  19. validateDateEQ: 'equal to',
  20. validateDateNE: 'not equal to',
  21. validateDateLT: 'before',
  22. validateDateGT: 'after',
  23. validateDateLE: 'not after',
  24. validateDateGE: 'not before'
  25. });
  26. $.extend($.datepicker._defaults, $.datepicker.regional['']);
  27. $.extend($.datepicker, {
  28. /* Trigger a validation after updating the input field with the selected date.
  29. @param id (string) the ID of the target field
  30. @param dateStr (string) the chosen date */
  31. _selectDate: function(id, dateStr) {
  32. this._selectDate2(id, dateStr);
  33. var input = $(id);
  34. var inst = this._getInst(input[0]);
  35. if (!inst.inline && $.fn.validate)
  36. input.parents('form').validate().element(input);
  37. },
  38. /* Correct error placement for validation errors - after (before if R-T-L) any trigger.
  39. @param error (jQuery) the error message
  40. @param element (jQuery) the field in error */
  41. errorPlacement: function(error, element) {
  42. var trigger = element.next('.' + $.datepicker._triggerClass);
  43. var before = false;
  44. if (trigger.length == 0) {
  45. trigger = element.prev('.' + $.datepicker._triggerClass);
  46. before = (trigger.length > 0);
  47. }
  48. error[before ? 'insertBefore' : 'insertAfter'](trigger.length > 0 ? trigger : element);
  49. },
  50. /* Format a validation error message involving dates.
  51. @param message (string) the error message
  52. @param params (Date[]) the dates
  53. @return (string) the formatted message */
  54. errorFormat: function(inst, message, params) {
  55. var format = $.datepicker._get(inst, 'dateFormat');
  56. $.each(params, function(i, v) {
  57. message = message.replace(new RegExp('\\{' + i + '\\}', 'g'),
  58. $.datepicker.formatDate(format, v) || 'nothing');
  59. });
  60. return message;
  61. }
  62. });
  63. var lastElement = null;
  64. /* Validate date field. */
  65. $.validator.addMethod('dpDate', function(value, element, params) {
  66. lastElement = element;
  67. var inst = $.datepicker._getInst(element);
  68. var dateFormat = $.datepicker._get(inst, 'dateFormat');
  69. try {
  70. var date = $.datepicker.parseDate(dateFormat, value, $.datepicker._getFormatConfig(inst));
  71. var minDate = $.datepicker._determineDate(inst, $.datepicker._get(inst, 'minDate'), null);
  72. var maxDate = $.datepicker._determineDate(inst, $.datepicker._get(inst, 'maxDate'), null);
  73. var beforeShowDay = $.datepicker._get(inst, 'beforeShowDay');
  74. return this.optional(element) || !date ||
  75. ((!minDate || date >= minDate) && (!maxDate || date <= maxDate) &&
  76. (!beforeShowDay || beforeShowDay.apply(element, [date])[0]));
  77. }
  78. catch (e) {
  79. return false;
  80. }
  81. }, function(params) {
  82. var inst = $.datepicker._getInst(lastElement);
  83. var minDate = $.datepicker._determineDate(inst, $.datepicker._get(inst, 'minDate'), null);
  84. var maxDate = $.datepicker._determineDate(inst, $.datepicker._get(inst, 'maxDate'), null);
  85. var messages = $.datepicker._defaults;
  86. return (minDate && maxDate ?
  87. $.datepicker.errorFormat(inst, messages.validateDateMinMax, [minDate, maxDate]) :
  88. (minDate ? $.datepicker.errorFormat(inst, messages.validateDateMin, [minDate]) :
  89. (maxDate ? $.datepicker.errorFormat(inst, messages.validateDateMax, [maxDate]) :
  90. messages.validateDate)));
  91. });
  92. /* And allow as a class rule. */
  93. $.validator.addClassRules('dpDate', {dpDate: true});
  94. var comparisons = {equal: 'eq', same: 'eq', notEqual: 'ne', notSame: 'ne',
  95. lessThan: 'lt', before: 'lt', greaterThan: 'gt', after: 'gt',
  96. notLessThan: 'ge', notBefore: 'ge', notGreaterThan: 'le', notAfter: 'le'};
  97. /* Cross-validate date fields.
  98. params should be an array with [0] comparison type eq/ne/lt/gt/le/ge or synonyms,
  99. [1] 'today' or date string or Date or other field selector/element/jQuery OR
  100. an object with one attribute with name eq/ne/lt/gt/le/ge or synonyms
  101. and value 'today' or date string or Date or other field selector/element/jQuery OR
  102. a string with eq/ne/lt/gt/le/ge or synonyms followed by 'today' or date string or jQuery selector */
  103. $.validator.addMethod('dpCompareDate', function(value, element, params) {
  104. if (this.optional(element)) {
  105. return true;
  106. }
  107. params = normaliseParams(params);
  108. var thisDate = $(element).datepicker('getDate');
  109. var thatDate = extractOtherDate(element, params[1]);
  110. if (!thisDate || !thatDate) {
  111. return true;
  112. }
  113. lastElement = element;
  114. var result = true;
  115. switch (comparisons[params[0]] || params[0]) {
  116. case 'eq': result = (thisDate.getTime() == thatDate.getTime()); break;
  117. case 'ne': result = (thisDate.getTime() != thatDate.getTime()); break;
  118. case 'lt': result = (thisDate.getTime() < thatDate.getTime()); break;
  119. case 'gt': result = (thisDate.getTime() > thatDate.getTime()); break;
  120. case 'le': result = (thisDate.getTime() <= thatDate.getTime()); break;
  121. case 'ge': result = (thisDate.getTime() >= thatDate.getTime()); break;
  122. default: result = true;
  123. }
  124. return result;
  125. },
  126. function(params) {
  127. var inst = $.datepicker._getInst(lastElement);
  128. var messages = $.datepicker._defaults;
  129. params = normaliseParams(params);
  130. var thatDate = extractOtherDate(lastElement, params[1], true);
  131. thatDate = (params[1] == 'today' ? messages.validateDateToday : (thatDate ?
  132. $.datepicker.formatDate($.datepicker._get(inst, 'dateFormat'), thatDate,
  133. $.datepicker._getFormatConfig(inst)) : messages.validateDateOther));
  134. return messages.validateDateCompare.replace(/\{0\}/,
  135. messages['validateDate' + (comparisons[params[0]] || params[0]).toUpperCase()]).
  136. replace(/\{1\}/, thatDate);
  137. });
  138. /* Normalise the comparison parameters to an array.
  139. @param params (array or object or string) the original parameters
  140. @return (array) the normalised parameters */
  141. function normaliseParams(params) {
  142. if (typeof params == 'string') {
  143. params = params.split(' ');
  144. }
  145. else if (!$.isArray(params)) {
  146. var opts = [];
  147. for (var name in params) {
  148. opts[0] = name;
  149. opts[1] = params[name];
  150. }
  151. params = opts;
  152. }
  153. return params;
  154. }
  155. /* Determine the comparison date.
  156. @param element (element) the current datepicker element
  157. @param source (string or Date or jQuery or element) the source of the other date
  158. @param noOther (boolean) true to not get the date from another field
  159. @return (Date) the date for comparison */
  160. function extractOtherDate(element, source, noOther) {
  161. if (source.constructor == Date) {
  162. return source;
  163. }
  164. var inst = $.datepicker._getInst(element);
  165. var thatDate = null;
  166. try {
  167. if (typeof source == 'string' && source != 'today') {
  168. thatDate = $.datepicker.parseDate($.datepicker._get(inst, 'dateFormat'),
  169. source, $.datepicker._getFormatConfig(inst));
  170. }
  171. }
  172. catch (e) {
  173. // Ignore
  174. }
  175. thatDate = (thatDate ? thatDate : (source == 'today' ? new Date() :
  176. (noOther ? null : $(source).datepicker('getDate'))));
  177. if (thatDate) {
  178. thatDate.setHours(0, 0, 0, 0);
  179. }
  180. return thatDate;
  181. }
  182. }
  183. })(jQuery);