[ Index ]

PHP Cross Reference of Drupal 6 (gatewave)

title

Body

[close]

/sites/all/modules/jquery_ui/jquery.ui.old/tests/ -> datepicker.js (source)

   1  /*

   2   * datepicker unit tests

   3   */
   4  (function($) {
   5  
   6  module('datepicker');
   7  
   8  function equalsDate(d1, d2, message) {
   9      if (!d1 || !d2) {
  10          ok(false, message + ' - missing date');
  11          return;
  12      }
  13      d1 = new Date(d1.getFullYear(), d1.getMonth(), d1.getDate());
  14      d2 = new Date(d2.getFullYear(), d2.getMonth(), d2.getDate());
  15      equals(d1.toString(), d2.toString(), message);
  16  }
  17  
  18  function equalsDateArray(a1, a2, message) {
  19      if (!a1 || !a2) {
  20          ok(false, message + ' - missing dates');
  21          return;
  22      }
  23      a1[0] = (a1[0] ? new Date(a1[0].getFullYear(), a1[0].getMonth(), a1[0].getDate()) : '');
  24      a1[1] = (a1[1] ? new Date(a1[1].getFullYear(), a1[1].getMonth(), a1[1].getDate()) : '');
  25      a2[0] = (a2[0] ? new Date(a2[0].getFullYear(), a2[0].getMonth(), a2[0].getDate()) : '');
  26      a2[1] = (a2[1] ? new Date(a2[1].getFullYear(), a2[1].getMonth(), a2[1].getDate()) : '');
  27      same(a1, a2, message);
  28  }
  29  
  30  function init(id, options) {
  31      $.datepicker.setDefaults($.datepicker.regional['']);
  32      var inp = $(id);
  33      inp.datepicker($.extend({duration: ''}, options || {}));
  34      return inp;
  35  }
  36  
  37  var PROP_NAME = 'datepicker';
  38  
  39  test('setDefaults', function() {
  40      var inp = init('#inp');
  41      var dp = $('#ui-datepicker-div');
  42      ok(!dp.is(':visible'), 'Initially invisible');
  43      ok(inp.is('.hasDatepicker'), 'Marker class set');
  44      ok($($.datepicker.dpDiv).html() == '', 'Content empty');
  45      inp.datepicker('show');
  46      ok($($.datepicker.dpDiv).html() != '', 'Content present');
  47      inp.datepicker('hide');
  48      equals($.datepicker._defaults.showOn, 'focus', 'Initial showOn');
  49      $.datepicker.setDefaults({showOn: 'button'});
  50      equals($.datepicker._defaults.showOn, 'button', 'Change default showOn');
  51      $.datepicker.setDefaults({showOn: 'focus'});
  52      equals($.datepicker._defaults.showOn, 'focus', 'Restore showOn');
  53  });
  54  
  55  test('destroy', function() {
  56      var inp = init('#inp');
  57      ok(inp.is('.hasDatepicker'), 'Default - marker class set');
  58      ok($.data(inp[0], PROP_NAME), 'Default - instance present');
  59      ok(inp.next().is('#alt'), 'Default - button absent');
  60      inp.datepicker('destroy');
  61      inp = $('#inp');
  62      ok(!inp.is('.hasDatepicker'), 'Default - marker class cleared');
  63      ok(!$.data(inp[0], PROP_NAME), 'Default - instance absent');
  64      ok(inp.next().is('#alt'), 'Default - button absent');
  65      // With button

  66      inp= init('#inp', {showOn: 'both'});
  67      ok(inp.is('.hasDatepicker'), 'Button - marker class set');
  68      ok($.data(inp[0], PROP_NAME), 'Button - instance present');
  69      ok(inp.next().text() == '...', 'Button - button added');
  70      inp.datepicker('destroy');
  71      inp = $('#inp');
  72      ok(!inp.is('.hasDatepicker'), 'Button - marker class cleared');
  73      ok(!$.data(inp[0], PROP_NAME), 'Button - instance absent');
  74      ok(inp.next().is('#alt'), 'Button - button removed');
  75      // With append text

  76      inp = init('#inp', {appendText: 'Testing'});
  77      ok(inp.is('.hasDatepicker'), 'Append - marker class set');
  78      ok($.data(inp[0], PROP_NAME), 'Append - instance present');
  79      ok(inp.next().text() == 'Testing', 'Append - append text added');
  80      inp.datepicker('destroy');
  81      inp = $('#inp');
  82      ok(!inp.is('.hasDatepicker'), 'Append - marker class cleared');
  83      ok(!$.data(inp[0], PROP_NAME), 'Append - instance absent');
  84      ok(inp.next().is('#alt'), 'Append - append text removed');
  85      // With both

  86      inp= init('#inp', {showOn: 'both', buttonImageOnly: true,
  87          buttonImage: 'img/calendar.gif', appendText: 'Testing'});
  88      ok(inp.is('.hasDatepicker'), 'Both - marker class set');
  89      ok($.data(inp[0], PROP_NAME), 'Both - instance present');
  90      ok(inp.next()[0].nodeName.toLowerCase() == 'img', 'Both - button added');
  91      ok(inp.next().next().text() == 'Testing', 'Both - append text added');
  92      inp.datepicker('destroy');
  93      inp = $('#inp');
  94      ok(!inp.is('.hasDatepicker'), 'Both - marker class cleared');
  95      ok(!$.data(inp[0], PROP_NAME), 'Both - instance absent');
  96      ok(inp.next().is('#alt'), 'Both - button and append text absent');
  97      // Inline

  98      var inl = init('#inl');
  99      ok(inl.is('.hasDatepicker'), 'Inline - marker class set');
 100      ok(inl.html() != '', 'Inline - datepicker present');
 101      ok($.data(inl[0], PROP_NAME), 'Inline - instance present');
 102      ok(inl.next().length == 0 || inl.next().is('p'), 'Inline - button absent');
 103      inl.datepicker('destroy');
 104      inl = $('#inl');
 105      ok(!inl.is('.hasDatepicker'), 'Inline - marker class cleared');
 106      ok(inl.html() == '', 'Inline - datepicker absent');
 107      ok(!$.data(inl[0], PROP_NAME), 'Inline - instance absent');
 108      ok(inl.next().length == 0 || inl.next().is('p'), 'Inline - button absent');
 109  });
 110  
 111  test('option', function() {
 112      var inp = init('#inp');
 113      var inst = $.data(inp[0], PROP_NAME);
 114      equals(inst.settings.showOn, null, 'Initial setting showOn');
 115      equals($.datepicker._get(inst, 'showOn'), 'focus', 'Initial instance showOn');
 116      equals($.datepicker._defaults.showOn, 'focus', 'Initial default showOn');
 117      inp.datepicker('option', 'showOn', 'button');
 118      equals(inst.settings.showOn, 'button', 'Change setting showOn');
 119      equals($.datepicker._get(inst, 'showOn'), 'button', 'Change instance showOn');
 120      equals($.datepicker._defaults.showOn, 'focus', 'Retain default showOn');
 121      inp.datepicker('option', {showOn: 'both'});
 122      equals(inst.settings.showOn, 'both', 'Change setting showOn');
 123      equals($.datepicker._get(inst, 'showOn'), 'both', 'Change instance showOn');
 124      equals($.datepicker._defaults.showOn, 'focus', 'Retain default showOn');
 125      inp.datepicker('option', 'showOn', undefined);
 126      equals(inst.settings.showOn, null, 'Clear setting showOn');
 127      equals($.datepicker._get(inst, 'showOn'), 'focus', 'Restore instance showOn');
 128      equals($.datepicker._defaults.showOn, 'focus', 'Retain default showOn');
 129  });
 130  
 131  test('change', function() {
 132      var inp = init('#inp');
 133      var inst = $.data(inp[0], PROP_NAME);
 134      equals(inst.settings.showOn, null, 'Initial setting showOn');
 135      equals($.datepicker._get(inst, 'showOn'), 'focus', 'Initial instance showOn');
 136      equals($.datepicker._defaults.showOn, 'focus', 'Initial default showOn');
 137      inp.datepicker('change', 'showOn', 'button');
 138      equals(inst.settings.showOn, 'button', 'Change setting showOn');
 139      equals($.datepicker._get(inst, 'showOn'), 'button', 'Change instance showOn');
 140      equals($.datepicker._defaults.showOn, 'focus', 'Retain default showOn');
 141      inp.datepicker('change', {showOn: 'both'});
 142      equals(inst.settings.showOn, 'both', 'Change setting showOn');
 143      equals($.datepicker._get(inst, 'showOn'), 'both', 'Change instance showOn');
 144      equals($.datepicker._defaults.showOn, 'focus', 'Retain default showOn');
 145      inp.datepicker('change', 'showOn', undefined);
 146      equals(inst.settings.showOn, null, 'Clear setting showOn');
 147      equals($.datepicker._get(inst, 'showOn'), 'focus', 'Restore instance showOn');
 148      equals($.datepicker._defaults.showOn, 'focus', 'Retain default showOn');
 149  });
 150  
 151  test('invocation', function() {
 152      var inp = init('#inp');
 153      var dp = $('#ui-datepicker-div');
 154      var body = $('body');
 155      // On focus

 156      var button = inp.siblings('button');
 157      ok(button.length == 0, 'Focus - button absent');
 158      var image = inp.siblings('img');
 159      ok(image.length == 0, 'Focus - image absent');
 160      inp.focus();
 161      ok(dp.is(':visible'), 'Focus - rendered on focus');
 162      inp.simulate('keydown', {keyCode: $.simulate.VK_ESC});
 163      ok(!dp.is(':visible'), 'Focus - hidden on exit');
 164      inp.focus();
 165      ok(dp.is(':visible'), 'Focus - rendered on focus');
 166      body.simulate('mousedown', {});
 167      ok(!dp.is(':visible'), 'Focus - hidden on external click');
 168      inp.datepicker('hide').datepicker('destroy');
 169      // On button

 170      inp = init('#inp', {showOn: 'button', buttonText: 'Popup'});
 171      ok(!dp.is(':visible'), 'Button - initially hidden');
 172      button = inp.siblings('button');
 173      image = inp.siblings('img');
 174      ok(button.length == 1, 'Button - button present');
 175      ok(image.length == 0, 'Button - image absent');
 176      equals(button.text(), 'Popup', 'Button - button text');
 177      inp.focus();
 178      ok(!dp.is(':visible'), 'Button - not rendered on focus');
 179      button.click();
 180      ok(dp.is(':visible'), 'Button - rendered on button click');
 181      button.click();
 182      ok(!dp.is(':visible'), 'Button - hidden on second button click');
 183      inp.datepicker('hide').datepicker('destroy');
 184      // On image button

 185      inp = init('#inp', {showOn: 'button', buttonImageOnly: true,
 186          buttonImage: 'img/calendar.gif', buttonText: 'Cal'});
 187      ok(!dp.is(':visible'), 'Image button - initially hidden');
 188      button = inp.siblings('button');
 189      ok(button.length == 0, 'Image button - button absent');
 190      image = inp.siblings('img');
 191      ok(image.length == 1, 'Image button - image present');
 192      equals(image.attr('src'), 'img/calendar.gif', 'Image button - image source');
 193      equals(image.attr('title'), 'Cal', 'Image button - image text');
 194      inp.focus();
 195      ok(!dp.is(':visible'), 'Image button - not rendered on focus');
 196      image.click();
 197      ok(dp.is(':visible'), 'Image button - rendered on image click');
 198      image.click();
 199      ok(!dp.is(':visible'), 'Image button - hidden on second image click');
 200      inp.datepicker('hide').datepicker('destroy');
 201      // On both

 202      inp = init('#inp', {showOn: 'both', buttonImage: 'img/calendar.gif'});
 203      ok(!dp.is(':visible'), 'Both - initially hidden');
 204      button = inp.siblings('button');
 205      ok(button.length == 1, 'Both - button present');
 206      image = inp.siblings('img');
 207      ok(image.length == 0, 'Both - image absent');
 208      image = button.children('img');
 209      ok(image.length == 1, 'Both - button image present');
 210      inp.focus();
 211      ok(dp.is(':visible'), 'Both - rendered on focus');
 212      body.simulate('mousedown', {});
 213      ok(!dp.is(':visible'), 'Both - hidden on external click');
 214      button.click();
 215      ok(dp.is(':visible'), 'Both - rendered on button click');
 216      button.click();
 217      ok(!dp.is(':visible'), 'Both - hidden on second button click');
 218      inp.datepicker('hide').datepicker('destroy');
 219  });
 220  
 221  test('baseStructure', function() {
 222      var dp = $('#ui-datepicker-div');
 223      var inp = init('#inp');
 224      inp.focus();
 225      var iframe = ($.browser.msie && parseInt($.browser.version) < 7);
 226      ok(dp.is(':visible'), 'Structure - datepicker visible');
 227      ok(!dp.is('.ui-datepicker-rtl'), 'Structure - not right-to-left');
 228      ok(!dp.is('.ui-datepicker-multi'), 'Structure - not multi-month');
 229      equals(dp.children().length, 4 + (iframe ? 1 : 0), 'Structure - child count');
 230      var control = dp.children(':first');
 231      ok(control.is('div.ui-datepicker-control'), 'Structure - control division');
 232      equals(control.children().length, 2, 'Structure - control child count');
 233      ok(control.children(':first').is('div.ui-datepicker-clear'),
 234          'Structure - clear division');
 235      ok(control.children(':last').is('div.ui-datepicker-close'),
 236          'Structure - close division');
 237      var links = dp.children(':eq(1)');
 238      ok(links.is('div.ui-datepicker-links'), 'Structure - links division');
 239      equals(links.children().length, 3, 'Structure - links child count');
 240      ok(links.children(':first').is('div.ui-datepicker-prev') &&
 241          links.children(':first').html() != '',
 242          'Structure - prev division');
 243      ok(links.children(':eq(1)').is('div.ui-datepicker-current') &&
 244          links.children(':eq(1)').html() != '',
 245          'Structure - current division');
 246      ok(links.children(':last').is('div.ui-datepicker-next') &&
 247          links.children(':last').html() != '',
 248          'Structure - next division');
 249      var month = dp.children(':eq(2)');
 250      ok(month.is('div.ui-datepicker-one-month') && month.is('div.ui-datepicker-new-row'),
 251          'Structure - month division');
 252      var header = month.children(':first');
 253      ok(header.is('div.ui-datepicker-header'), 'Structure - month header division');
 254      equals(header.children().length, 2, 'Structure - month header child count');
 255      ok(header.children(':first').is('select.ui-datepicker-new-month'),
 256          'Structure - new month select');
 257      ok(header.children(':last').is('select.ui-datepicker-new-year'),
 258          'Structure - new year select');
 259      var table = month.children(':eq(1)');
 260      ok(table.is('table.ui-datepicker'), 'Structure - month table');
 261      ok(table.children(':first').is('thead'), 'Structure - month table thead');
 262      var titles = table.children(':first').children(':first');
 263      ok(titles.is('tr.ui-datepicker-title-row'), 'Structure - month table title row');
 264      equals(titles.find('a').length, 7, 'Structure - month table title links');
 265      ok(table.children(':eq(1)').is('tbody'), 'Structure - month table body');
 266      ok(table.children(':eq(1)').children('tr').length >= 4,
 267          'Structure - month table week count');
 268      var week = table.children(':eq(1)').children(':first');
 269      ok(week.is('tr.ui-datepicker-days-row'), 'Structure - month table week row');
 270      equals(week.children().length, 7, 'Structure - week child count');
 271      ok(week.children(':first').is('td.ui-datepicker-days-cell') &&
 272          week.children(':first').is('.ui-datepicker-week-end-cell') &&
 273          !week.children(':first').is('.ui-datepicker-week-col'),
 274          'Structure - month table first day cell');
 275      ok(week.children(':eq(1)').is('td.ui-datepicker-days-cell') &&
 276          !week.children(':eq(1)').is('.ui-datepicker-week-end-cell'),
 277          'Structure - month table second day cell');
 278      ok(dp.children('.ui-datepicker-status').length == 0, 'Structure - status');
 279      ok(dp.children('iframe').length == (iframe ? 1 : 0), 'Structure - iframe');
 280      inp.datepicker('hide').datepicker('destroy');
 281      // Multi-month 2

 282      inp = init('#inp', {numberOfMonths: 2});
 283      inp.focus();
 284      ok(dp.is('.ui-datepicker-multi'), 'Structure multi - multi-month');
 285      equals(dp.children().length, 5 + (iframe ? 1 : 0), 'Structure multi - child count');
 286      month = dp.children(':eq(2)');
 287      ok(month.is('div.ui-datepicker-one-month') && month.is('div.ui-datepicker-new-row'),
 288          'Structure multi - first month division');
 289      month = dp.children(':eq(3)');
 290      ok(month.is('div.ui-datepicker-one-month') && !month.is('div.ui-datepicker-new-row'),
 291          'Structure multi - second month division');
 292      inp.datepicker('hide').datepicker('destroy');
 293      // Multi-month [2, 2]

 294      inp = init('#inp', {numberOfMonths: [2, 2]});
 295      inp.focus();
 296      ok(dp.is('.ui-datepicker-multi'), 'Structure multi - multi-month');
 297      equals(dp.children().length, 7 + (iframe ? 1 : 0), 'Structure multi - child count');
 298      month = dp.children(':eq(2)');
 299      ok(month.is('div.ui-datepicker-one-month') && month.is('div.ui-datepicker-new-row'),
 300          'Structure multi - first month division');
 301      month = dp.children(':eq(3)');
 302      ok(month.is('div.ui-datepicker-one-month') && !month.is('div.ui-datepicker-new-row'),
 303          'Structure multi - second month division');
 304      month = dp.children(':eq(4)');
 305      ok(month.is('div.ui-datepicker-one-month') && month.is('div.ui-datepicker-new-row'),
 306          'Structure multi - third month division');
 307      month = dp.children(':eq(5)');
 308      ok(month.is('div.ui-datepicker-one-month') && !month.is('div.ui-datepicker-new-row'),
 309          'Structure multi - fourth month division');
 310      inp.datepicker('hide').datepicker('destroy');
 311      // Inline

 312      var inl = init('#inl');
 313      dp = inl.children();
 314      ok(dp.is('.ui-datepicker-inline'), 'Structure inline - main div');
 315      ok(!dp.is('.ui-datepicker-rtl'), 'Structure inline - not right-to-left');
 316      ok(!dp.is('.ui-datepicker-multi'), 'Structure inline - not multi-month');
 317      equals(dp.children().length, 3, 'Structure inline - child count');
 318      var links = dp.children(':first');
 319      ok(links.is('div.ui-datepicker-links'), 'Structure inline - links division');
 320      equals(links.children().length, 3, 'Structure inline - links child count');
 321      var month = dp.children(':eq(1)');
 322      ok(month.is('div.ui-datepicker-one-month') && month.is('div.ui-datepicker-new-row'),
 323          'Structure inline - month division');
 324      var header = month.children(':first');
 325      ok(header.is('div.ui-datepicker-header'), 'Structure inline - month header division');
 326      equals(header.children().length, 2, 'Structure inline - month header child count');
 327      var table = month.children(':eq(1)');
 328      ok(table.is('table.ui-datepicker'), 'Structure inline - month table');
 329      ok(table.children(':first').is('thead'), 'Structure inline - month table thead');
 330      ok(table.children(':eq(1)').is('tbody'), 'Structure inline - month table body');
 331      ok(dp.children('.ui-datepicker-status').length == 0, 'Structure inline - status');
 332      inl.datepicker('destroy');
 333      // Inline multi-month

 334      inl = init('#inl', {numberOfMonths: 2});
 335      dp = inl.children();
 336      ok(dp.is('.ui-datepicker-inline'), 'Structure inline multi - main div');
 337      ok(dp.is('.ui-datepicker-multi'), 'Structure inline multi - not multi-month');
 338      equals(dp.children().length, 4, 'Structure inline multi - child count');
 339      var links = dp.children(':first');
 340      ok(links.is('div.ui-datepicker-links'), 'Structure inline multi - links division');
 341      equals(links.children().length, 3, 'Structure inline multi - links child count');
 342      var month = dp.children(':eq(1)');
 343      ok(month.is('div.ui-datepicker-one-month') && month.is('div.ui-datepicker-new-row'),
 344          'Structure inline multi - first month division');
 345      month = dp.children(':eq(2)');
 346      ok(month.is('div.ui-datepicker-one-month') && !month.is('div.ui-datepicker-new-row'),
 347          'Structure inline multi - second month division');
 348      inl.datepicker('destroy');
 349  });
 350  
 351  test('customStructure', function() {
 352      var dp = $('#ui-datepicker-div');
 353      // Check right-to-left localisation

 354      var inp = init('#inp', $.datepicker.regional['he']);
 355      inp.focus();
 356      var iframe = ($.browser.msie && parseInt($.browser.version) < 7);
 357      ok(dp.is('.ui-datepicker-rtl'), 'Structure RTL - right-to-left');
 358      var links = dp.children(':eq(1)');
 359      ok(links.is('div.ui-datepicker-links'), 'Structure - links division');
 360      equals(links.children().length, 3, 'Structure - links child count');
 361      ok(links.children(':first').is('div.ui-datepicker-next'),
 362          'Structure - next division');
 363      ok(links.children(':eq(1)').is('div.ui-datepicker-current'),
 364          'Structure - current division');
 365      ok(links.children(':last').is('div.ui-datepicker-prev'),
 366          'Structure - prev division');
 367      inp.datepicker('hide').datepicker('destroy');
 368      // Close at bottom

 369      inp = init('#inp', {closeAtTop: false});
 370      inp.focus();
 371      equals(dp.children().length, 4 + (iframe ? 1 : 0),
 372          'Structure close at bottom - child count');
 373      ok(dp.children(':first').is('div.ui-datepicker-links'),
 374          'Structure close at bottom - links division');
 375      ok(dp.children(':last').prev().is('div.ui-datepicker-control'),
 376          'Structure close at bottom - control division');
 377      inp.datepicker('hide').datepicker('destroy');
 378      // Mandatory

 379      inp = init('#inp', {mandatory: true});
 380      inp.focus();
 381      var control = dp.children(':first');
 382      ok(control.is('div.ui-datepicker-control'),
 383          'Structure mandatory - control division');
 384      equals(control.children().length, 1, 'Structure mandatory - control child count');
 385      ok(control.children(':first').is('div.ui-datepicker-close'),
 386          'Structure mandatory - close division');
 387      inp.datepicker('hide').datepicker('destroy');
 388      // Hide prev/next

 389      inp = init('#inp', {hideIfNoPrevNext: true,
 390          minDate: new Date(2008, 2 - 1, 4), maxDate: new Date(2008, 2 - 1, 14)});
 391      inp.val('02/10/2008').focus();
 392      var links = dp.children(':eq(1)');
 393      ok(links.is('div.ui-datepicker-links'),
 394          'Structure hide prev/next - links division');
 395      equals(links.children().length, 2, 'Structure hide prev/next - links child count');
 396      ok(links.children(':first').is('div.ui-datepicker-prev') &&
 397          links.children(':first').html() == '',
 398          'Structure hide prev/next - prev division');
 399      ok(links.children(':last').is('div.ui-datepicker-next') &&
 400          links.children(':last').html() == '',
 401          'Structure hide prev/next - next division');
 402      inp.datepicker('hide').datepicker('destroy');
 403      // Can't change month

 404      inp = init('#inp', {changeMonth: false});
 405      inp.focus();
 406      var header = dp.children(':eq(2)').children(':first');
 407      equals(header.children().length, 1, 'Structure change month - header child count');
 408      ok(header.children(':last').is('select.ui-datepicker-new-year'),
 409          'Structure change month - new year select');
 410      inp.datepicker('hide').datepicker('destroy');
 411      // Can't change year

 412      inp = init('#inp', {changeYear: false});
 413      inp.focus();
 414      var header = dp.children(':eq(2)').children(':first');
 415      equals(header.children().length, 1, 'Structure change year - header child count');
 416      ok(header.children(':first').is('select.ui-datepicker-new-month'),
 417          'Structure change year - new month select');
 418      inp.datepicker('hide').datepicker('destroy');
 419      // Can't change first day of week

 420      inp = init('#inp', {changeFirstDay: false});
 421      inp.focus();
 422      var titles = dp.find('.ui-datepicker-title-row');
 423      equals(titles.children().length, 7, 'Structure change first day - titles child count');
 424      equals(titles.find('a').length, 0, 'Structure change first day - titles links count');
 425      inp.datepicker('hide').datepicker('destroy');
 426      // Show weeks

 427      inp = init('#inp', {showWeeks: true});
 428      inp.focus();
 429      titles = dp.find('.ui-datepicker-title-row');
 430      equals(titles.children().length, 8, 'Structure show weeks - titles child count');
 431      var week = dp.find('.ui-datepicker-days-row:first');
 432      equals(week.children().length, 8, 'Structure show weeks - week child count');
 433      ok(week.children(':first').is('td.ui-datepicker-week-col'),
 434          'Structure show weeks - week column');
 435      inp.datepicker('hide').datepicker('destroy');
 436      // Show status

 437      inp = init('#inp', {showStatus: true});
 438      inp.focus();
 439      equals(dp.children().length, 6 + (iframe ? 1 : 0),
 440          'Structure show status - datepicker child count');
 441      ok(dp.children(':last').prev().is('div.ui-datepicker-status'),
 442          'Structure show status - status division');
 443      inp.datepicker('hide').datepicker('destroy');
 444      // Inline

 445      var inl = init('#inl', {showStatus: true, hideIfNoPrevNext: true,
 446          minDate: new Date(2008, 2 - 1, 4), maxDate: new Date(2008, 2 - 1, 14)});
 447      dp = inl.children();
 448      ok(dp.is('.ui-datepicker-inline'), 'Structure inline - main div');
 449      ok(!dp.is('.ui-datepicker-rtl'), 'Structure inline - not right-to-left');
 450      ok(!dp.is('.ui-datepicker-multi'), 'Structure inline - not multi-month');
 451      equals(dp.children().length, 5, 'Structure inline - child count');
 452      var links = dp.children(':first');
 453      ok(links.is('div.ui-datepicker-links'), 'Structure inline - links division');
 454      equals(links.children().children().length, 0, 'Structure inline - links child count');
 455      var month = dp.children(':eq(1)');
 456      ok(month.is('div.ui-datepicker-one-month') && month.is('div.ui-datepicker-new-row'),
 457          'Structure inline - month division');
 458      ok(dp.children(':last').prev().is('div.ui-datepicker-status'),
 459          'Structure inline - status');
 460      inl.datepicker('destroy');
 461  });
 462  
 463  test('enableDisable', function() {
 464      var inp = init('#inp');
 465      ok(!inp.datepicker('isDisabled'), 'Enable/disable - initially marked as enabled');
 466      ok(!inp[0].disabled, 'Enable/disable - field initially enabled');
 467      inp.datepicker('disable');
 468      ok(inp.datepicker('isDisabled'), 'Enable/disable - now marked as disabled');
 469      ok(inp[0].disabled, 'Enable/disable - field now disabled');
 470      inp.datepicker('enable');
 471      ok(!inp.datepicker('isDisabled'), 'Enable/disable - now marked as enabled');
 472      ok(!inp[0].disabled, 'Enable/disable - field now enabled');
 473      inp.datepicker('destroy');
 474      // With a button

 475      inp = init('#inp', {showOn: 'button'});
 476      ok(!inp.datepicker('isDisabled'), 'Enable/disable button - initially marked as enabled');
 477      ok(!inp[0].disabled, 'Enable/disable button - field initially enabled');
 478      ok(!inp.next('button')[0].disabled, 'Enable/disable button - button initially enabled');
 479      inp.datepicker('disable');
 480      ok(inp.datepicker('isDisabled'), 'Enable/disable button - now marked as disabled');
 481      ok(inp[0].disabled, 'Enable/disable button - field now disabled');
 482      ok(inp.next('button')[0].disabled, 'Enable/disable button - button now disabled');
 483      inp.datepicker('enable');
 484      ok(!inp.datepicker('isDisabled'), 'Enable/disable button - now marked as enabled');
 485      ok(!inp[0].disabled, 'Enable/disable button - field now enabled');
 486      ok(!inp.next('button')[0].disabled, 'Enable/disable button - button now enabled');
 487      inp.datepicker('destroy');
 488      // With an image button

 489      inp = init('#inp', {showOn: 'button', buttonImageOnly: true,
 490          buttonImage: 'img/calendar.gif'});
 491      ok(!inp.datepicker('isDisabled'), 'Enable/disable image - initially marked as enabled');
 492      ok(!inp[0].disabled, 'Enable/disable image - field initially enabled');
 493      ok(inp.next('img').css('opacity') == 1, 'Enable/disable image - image initially enabled');
 494      inp.datepicker('disable');
 495      ok(inp.datepicker('isDisabled'), 'Enable/disable image - now marked as disabled');
 496      ok(inp[0].disabled, 'Enable/disable image - field now disabled');
 497      ok(inp.next('img').css('opacity') != 1, 'Enable/disable image - image now disabled');
 498      inp.datepicker('enable');
 499      ok(!inp.datepicker('isDisabled'), 'Enable/disable image - now marked as enabled');
 500      ok(!inp[0].disabled, 'Enable/disable image - field now enabled');
 501      ok(inp.next('img').css('opacity') == 1, 'Enable/disable image - image now enabled');
 502      inp.datepicker('destroy');
 503      // Inline

 504      var inl = init('#inl');
 505      ok(!inl.datepicker('isDisabled'), 'Enable/disable inline - initially marked as enabled');
 506      ok($('.ui-datepicker-disabled', inl).length == 0, 'Enable/disable inline - cover initially absent');
 507      inl.datepicker('disable');
 508      ok(inl.datepicker('isDisabled'), 'Enable/disable inline - now marked as disabled');
 509      var disabled = $('.ui-datepicker-disabled', inl);
 510      var dp = $('.ui-datepicker-inline', inl);
 511      ok(disabled.length == 1, 'Enable/disable inline - cover now present');
 512      ok(disabled.offset().top == dp.offset().top && disabled.offset().left == dp.offset().left,
 513          'Enable/disable inline - cover positioning');
 514      ok(disabled.width() == dp.width() && disabled.height() == dp.height(),
 515          'Enable/disable inline - cover sizing');
 516      inl.datepicker('enable');
 517      ok(!inl.datepicker('isDisabled'), 'Enable/disable inline - now marked as enabled');
 518      ok($('.ui-datepicker-disabled', inl).length == 0, 'Enable/disable inline - cover now absent');
 519      inl.datepicker('destroy');
 520  });
 521  
 522  test('keystrokes', function() {
 523      var inp = init('#inp');
 524      var date = new Date();
 525      inp.val('').datepicker('show').
 526          simulate('keydown', {keyCode: $.simulate.VK_ENTER});
 527      equalsDate(inp.datepicker('getDate'), date, 'Keystroke enter');
 528      inp.val('02/04/2008').datepicker('show').
 529          simulate('keydown', {keyCode: $.simulate.VK_ENTER});
 530      equalsDate(inp.datepicker('getDate'), new Date(2008, 2 - 1, 4),
 531          'Keystroke enter - preset');
 532      inp.val('02/04/2008').datepicker('show').
 533          simulate('keydown', {ctrlKey: true, keyCode: $.simulate.VK_HOME}).
 534          simulate('keydown', {keyCode: $.simulate.VK_ENTER});
 535      equalsDate(inp.datepicker('getDate'), date, 'Keystroke ctrl+home');
 536      inp.val('02/04/2008').datepicker('show').
 537          simulate('keydown', {ctrlKey: true, keyCode: $.simulate.VK_END});
 538      ok(inp.datepicker('getDate') == null, 'Keystroke ctrl+end');
 539      inp.val('').datepicker('show').
 540          simulate('keydown', {keyCode: $.simulate.VK_ESC});
 541      ok(inp.datepicker('getDate') == null, 'Keystroke esc');
 542      inp.val('02/04/2008').datepicker('show').
 543          simulate('keydown', {keyCode: $.simulate.VK_ESC});
 544      equalsDate(inp.datepicker('getDate'), new Date(2008, 2 - 1, 4),
 545          'Keystroke esc - preset');
 546      inp.val('02/04/2008').datepicker('show').
 547          simulate('keydown', {ctrlKey: true, keyCode: $.simulate.VK_PGUP}).
 548          simulate('keydown', {keyCode: $.simulate.VK_ESC});
 549      equalsDate(inp.datepicker('getDate'), new Date(2008, 2 - 1, 4),
 550          'Keystroke esc - abandoned');
 551      // Moving by day or week

 552      inp.val('').datepicker('show').
 553          simulate('keydown', {ctrlKey: true, keyCode: $.simulate.VK_LEFT}).
 554          simulate('keydown', {keyCode: $.simulate.VK_ENTER});
 555      date.setDate(date.getDate() - 1);
 556      equalsDate(inp.datepicker('getDate'), date, 'Keystroke ctrl+left');
 557      inp.val('').datepicker('show').
 558          simulate('keydown', {keyCode: $.simulate.VK_LEFT}).
 559          simulate('keydown', {keyCode: $.simulate.VK_ENTER});
 560      date.setDate(date.getDate() + 1);
 561      equalsDate(inp.datepicker('getDate'), date, 'Keystroke left');
 562      inp.val('').datepicker('show').
 563          simulate('keydown', {ctrlKey: true, keyCode: $.simulate.VK_RIGHT}).
 564          simulate('keydown', {keyCode: $.simulate.VK_ENTER});
 565      date.setDate(date.getDate() + 1);
 566      equalsDate(inp.datepicker('getDate'), date, 'Keystroke ctrl+right');
 567      inp.val('').datepicker('show').
 568          simulate('keydown', {keyCode: $.simulate.VK_RIGHT}).
 569          simulate('keydown', {keyCode: $.simulate.VK_ENTER});
 570      date.setDate(date.getDate() - 1);
 571      equalsDate(inp.datepicker('getDate'), date, 'Keystroke right');
 572      inp.val('').datepicker('show').
 573          simulate('keydown', {ctrlKey: true, keyCode: $.simulate.VK_UP}).
 574          simulate('keydown', {keyCode: $.simulate.VK_ENTER});
 575      date.setDate(date.getDate() - 7);
 576      equalsDate(inp.datepicker('getDate'), date, 'Keystroke ctrl+up');
 577      inp.val('').datepicker('show').
 578          simulate('keydown', {keyCode: $.simulate.VK_UP}).
 579          simulate('keydown', {keyCode: $.simulate.VK_ENTER});
 580      date.setDate(date.getDate() + 7);
 581      equalsDate(inp.datepicker('getDate'), date, 'Keystroke up');
 582      inp.val('').datepicker('show').
 583          simulate('keydown', {ctrlKey: true, keyCode: $.simulate.VK_DOWN}).
 584          simulate('keydown', {keyCode: $.simulate.VK_ENTER});
 585      date.setDate(date.getDate() + 7);
 586      equalsDate(inp.datepicker('getDate'), date, 'Keystroke ctrl+down');
 587      inp.val('').datepicker('show').
 588          simulate('keydown', {keyCode: $.simulate.VK_DOWN}).
 589          simulate('keydown', {keyCode: $.simulate.VK_ENTER});
 590      date.setDate(date.getDate() - 7);
 591      equalsDate(inp.datepicker('getDate'), date, 'Keystroke down');
 592      // Moving by month or year

 593      inp.val('02/04/2008').datepicker('show').
 594          simulate('keydown', {keyCode: $.simulate.VK_PGUP}).
 595          simulate('keydown', {keyCode: $.simulate.VK_ENTER});
 596      equalsDate(inp.datepicker('getDate'), new Date(2008, 1 - 1, 4),
 597          'Keystroke pgup');
 598      inp.val('02/04/2008').datepicker('show').
 599          simulate('keydown', {keyCode: $.simulate.VK_PGDN}).
 600          simulate('keydown', {keyCode: $.simulate.VK_ENTER});
 601      equalsDate(inp.datepicker('getDate'), new Date(2008, 3 - 1, 4),
 602          'Keystroke pgdn');
 603      inp.val('02/04/2008').datepicker('show').
 604          simulate('keydown', {ctrlKey: true, keyCode: $.simulate.VK_PGUP}).
 605          simulate('keydown', {keyCode: $.simulate.VK_ENTER});
 606      equalsDate(inp.datepicker('getDate'), new Date(2007, 2 - 1, 4),
 607          'Keystroke ctrl+pgup');
 608      inp.val('02/04/2008').datepicker('show').
 609          simulate('keydown', {ctrlKey: true, keyCode: $.simulate.VK_PGDN}).
 610          simulate('keydown', {keyCode: $.simulate.VK_ENTER});
 611      equalsDate(inp.datepicker('getDate'), new Date(2009, 2 - 1, 4),
 612          'Keystroke ctrl+pgdn');
 613      // Check for moving to short months

 614      inp.val('03/31/2008').datepicker('show').
 615          simulate('keydown', {keyCode: $.simulate.VK_PGUP}).
 616          simulate('keydown', {keyCode: $.simulate.VK_ENTER});
 617      equalsDate(inp.datepicker('getDate'), new Date(2008, 2 - 1, 29),
 618          'Keystroke pgup - Feb');
 619      inp.val('01/30/2008').datepicker('show').
 620          simulate('keydown', {keyCode: $.simulate.VK_PGDN}).
 621          simulate('keydown', {keyCode: $.simulate.VK_ENTER});
 622      equalsDate(inp.datepicker('getDate'), new Date(2008, 2 - 1, 29), 
 623          'Keystroke pgdn - Feb');
 624      inp.val('02/29/2008').datepicker('show').
 625          simulate('keydown', {ctrlKey: true, keyCode: $.simulate.VK_PGUP}).
 626          simulate('keydown', {keyCode: $.simulate.VK_ENTER});
 627      equalsDate(inp.datepicker('getDate'), new Date(2007, 2 - 1, 28),
 628          'Keystroke ctrl+pgup - Feb');
 629      inp.val('02/29/2008').datepicker('show').
 630          simulate('keydown', {ctrlKey: true, keyCode: $.simulate.VK_PGDN}).
 631          simulate('keydown', {keyCode: $.simulate.VK_ENTER});
 632      equalsDate(inp.datepicker('getDate'), new Date(2009, 2 - 1, 28),
 633          'Keystroke ctrl+pgdn - Feb');
 634      // Goto current

 635      inp.datepicker('option', {gotoCurrent: true}).
 636          datepicker('hide').val('02/04/2008').datepicker('show').
 637          simulate('keydown', {keyCode: $.simulate.VK_PGDN}).
 638          simulate('keydown', {ctrlKey: true, keyCode: $.simulate.VK_HOME}).
 639          simulate('keydown', {keyCode: $.simulate.VK_ENTER});
 640      equalsDate(inp.datepicker('getDate'), new Date(2008, 2 - 1, 4),
 641          'Keystroke ctrl+home');
 642      // Change steps

 643      inp.datepicker('option', {stepMonths: 2, stepBigMonths: 6, gotoCurrent: false}).
 644          datepicker('hide').val('02/04/2008').datepicker('show').
 645          simulate('keydown', {keyCode: $.simulate.VK_PGUP}).
 646          simulate('keydown', {keyCode: $.simulate.VK_ENTER});
 647      equalsDate(inp.datepicker('getDate'), new Date(2007, 12 - 1, 4),
 648          'Keystroke pgup step 2');
 649      inp.val('02/04/2008').datepicker('show').
 650          simulate('keydown', {keyCode: $.simulate.VK_PGDN}).
 651          simulate('keydown', {keyCode: $.simulate.VK_ENTER});
 652      equalsDate(inp.datepicker('getDate'), new Date(2008, 4 - 1, 4),
 653          'Keystroke pgdn step 2');
 654      inp.val('02/04/2008').datepicker('show').
 655          simulate('keydown', {ctrlKey: true, keyCode: $.simulate.VK_PGUP}).
 656          simulate('keydown', {keyCode: $.simulate.VK_ENTER});
 657      equalsDate(inp.datepicker('getDate'), new Date(2007, 8 - 1, 4),
 658          'Keystroke ctrl+pgup step 6');
 659      inp.val('02/04/2008').datepicker('show').
 660          simulate('keydown', {ctrlKey: true, keyCode: $.simulate.VK_PGDN}).
 661          simulate('keydown', {keyCode: $.simulate.VK_ENTER});
 662      equalsDate(inp.datepicker('getDate'), new Date(2008, 8 - 1, 4),
 663          'Keystroke ctrl+pgdn step 6');
 664  });
 665  
 666  test('mouse', function() {
 667      var inp = init('#inp');
 668      var dp = $('#ui-datepicker-div');
 669      var date = new Date();
 670      inp.val('').datepicker('show');
 671      $('.ui-datepicker tbody a:contains(10)', dp).simulate('click', {});
 672      date.setDate(10);
 673      equalsDate(inp.datepicker('getDate'), date, 'Mouse click');
 674      inp.val('02/04/2008').datepicker('show');
 675      $('.ui-datepicker tbody a:contains(12)', dp).simulate('click', {});
 676      equalsDate(inp.datepicker('getDate'), new Date(2008, 2 - 1, 12),
 677          'Mouse click - preset');
 678      inp.val('02/04/2008').datepicker('show');
 679      $('.ui-datepicker-clear a', dp).simulate('click', {});
 680      ok(inp.datepicker('getDate') == null, 'Mouse click - clear');
 681      inp.val('').datepicker('show');
 682      $('.ui-datepicker-close a', dp).simulate('click', {});
 683      ok(inp.datepicker('getDate') == null, 'Mouse click - close');
 684      inp.val('02/04/2008').datepicker('show');
 685      $('.ui-datepicker-close a', dp).simulate('click', {});
 686      equalsDate(inp.datepicker('getDate'), new Date(2008, 2 - 1, 4),
 687          'Mouse click - close + preset');
 688      inp.val('02/04/2008').datepicker('show');
 689      $('.ui-datepicker-prev a', dp).simulate('click', {});
 690      $('.ui-datepicker-close a', dp).simulate('click', {});
 691      equalsDate(inp.datepicker('getDate'), new Date(2008, 2 - 1, 4),
 692          'Mouse click - abandoned');
 693      // Current/previous/next

 694      inp.val('02/04/2008').datepicker('show');
 695      $('.ui-datepicker-current a', dp).simulate('click', {});
 696      $('.ui-datepicker tbody a:contains(14)', dp).simulate('click', {});
 697      date.setDate(14);
 698      equalsDate(inp.datepicker('getDate'), date, 'Mouse click - current');
 699      inp.val('02/04/2008').datepicker('show');
 700      $('.ui-datepicker-prev a', dp).simulate('click', {});
 701      $('.ui-datepicker tbody a:contains(16)', dp).simulate('click', {});
 702      equalsDate(inp.datepicker('getDate'), new Date(2008, 1 - 1, 16),
 703          'Mouse click - previous');
 704      inp.val('02/04/2008').datepicker('show');
 705      $('.ui-datepicker-next a', dp).simulate('click', {});
 706      $('.ui-datepicker tbody a:contains(18)', dp).simulate('click', {});
 707      equalsDate(inp.datepicker('getDate'), new Date(2008, 3 - 1, 18),
 708          'Mouse click - next');
 709      // Previous/next with minimum/maximum

 710      inp.datepicker('option', {minDate: new Date(2008, 2 - 1, 2),
 711          maxDate: new Date(2008, 2 - 1, 26)}).val('02/04/2008').datepicker('show');
 712      $('.ui-datepicker-prev a', dp).simulate('click', {});
 713      $('.ui-datepicker tbody a:contains(16)', dp).simulate('click', {});
 714      equalsDate(inp.datepicker('getDate'), new Date(2008, 2 - 1, 16),
 715          'Mouse click - previous + min/max');
 716      inp.val('02/04/2008').datepicker('show');
 717      $('.ui-datepicker-next a', dp).simulate('click', {});
 718      $('.ui-datepicker tbody a:contains(18)', dp).simulate('click', {});
 719      equalsDate(inp.datepicker('getDate'), new Date(2008, 2 - 1, 18),
 720          'Mouse click - next + min/max');
 721      // Change day of week

 722      inp.val('02/04/2008').datepicker('show');
 723      equals($('.ui-datepicker-title-row td:first', dp).text(), 'Su',
 724          'Mouse click - initial day of week');
 725      $('.ui-datepicker-title-row td:last a', dp).simulate('click', {});
 726      equals($('.ui-datepicker-title-row td:first', dp).text(), 'Sa',
 727          'Mouse click - day of week');
 728      // Highlight week

 729      inp.datepicker('option', {highlightWeek: true}).
 730          datepicker('hide').val('02/04/2008').datepicker('show');
 731      ok(!$('.ui-datepicker tr:eq(2)', dp).is('.ui-datepicker-week-over'),
 732          'Mouse over - no week highlight');
 733      $('.ui-datepicker tr:eq(2) td:first', dp).simulate('mouseover', {});
 734      ok($('.ui-datepicker tr:eq(2)', dp).is('.ui-datepicker-week-over'),
 735          'Mouse over - week highlight');
 736      // Inline

 737      var inl = init('#inl');
 738      var dp = $('.ui-datepicker-inline', inl);
 739      var date = new Date();
 740      inl.datepicker('setDate', date);
 741      $('.ui-datepicker tbody a:contains(10)', dp).simulate('click', {});
 742      date.setDate(10);
 743      equalsDate(inl.datepicker('getDate'), date, 'Mouse click inline');
 744      inl.datepicker('setDate', new Date(2008, 2 - 1, 4));
 745      $('.ui-datepicker tbody a:contains(12)', dp).simulate('click', {});
 746      equalsDate(inl.datepicker('getDate'), new Date(2008, 2 - 1, 12),
 747          'Mouse click inline - preset');
 748      $('.ui-datepicker-current a', dp).simulate('click', {});
 749      $('.ui-datepicker tbody a:contains(14)', dp).simulate('click', {});
 750      date.setDate(14);
 751      equalsDate(inl.datepicker('getDate'), date, 'Mouse click inline - current');
 752      inl.datepicker('setDate', new Date(2008, 2 - 1, 4));
 753      $('.ui-datepicker-prev a', dp).simulate('click', {});
 754      $('.ui-datepicker tbody a:contains(16)', dp).simulate('click', {});
 755      equalsDate(inl.datepicker('getDate'), new Date(2008, 1 - 1, 16),
 756          'Mouse click inline - previous');
 757      inl.datepicker('setDate', new Date(2008, 2 - 1, 4));
 758      $('.ui-datepicker-next a', dp).simulate('click', {});
 759      $('.ui-datepicker tbody a:contains(18)', dp).simulate('click', {});
 760      equalsDate(inl.datepicker('getDate'), new Date(2008, 3 - 1, 18),
 761          'Mouse click inline - next');
 762  });
 763  
 764  test('defaultDate', function() {
 765      var inp = init('#inp');
 766      var date = new Date();
 767      inp.val('').datepicker('show').
 768          simulate('keydown', {keyCode: $.simulate.VK_ENTER});
 769      equalsDate(inp.datepicker('getDate'), date, 'Default date null');
 770      // numeric values

 771      inp.datepicker('option', {defaultDate: -2}).
 772          datepicker('hide').val('').datepicker('show').
 773          simulate('keydown', {keyCode: $.simulate.VK_ENTER});
 774      date.setDate(date.getDate() - 2);
 775      equalsDate(inp.datepicker('getDate'), date, 'Default date -2');
 776      inp.datepicker('option', {defaultDate: 3}).
 777          datepicker('hide').val('').datepicker('show').
 778          simulate('keydown', {keyCode: $.simulate.VK_ENTER});
 779      date.setDate(date.getDate() + 5);
 780      equalsDate(inp.datepicker('getDate'), date, 'Default date 3');
 781      inp.datepicker('option', {defaultDate: 1 / 0}).
 782          datepicker('hide').val('').datepicker('show').
 783          simulate('keydown', {keyCode: $.simulate.VK_ENTER});
 784      date.setDate(date.getDate() - 3);
 785      equalsDate(inp.datepicker('getDate'), date, 'Default date Infinity');
 786      inp.datepicker('option', {defaultDate: 1 / 'a'}).
 787          datepicker('hide').val('').datepicker('show').
 788          simulate('keydown', {keyCode: $.simulate.VK_ENTER});
 789      equalsDate(inp.datepicker('getDate'), date, 'Default date NaN');
 790      // string values

 791      inp.datepicker('option', {defaultDate: '-1d'}).
 792          datepicker('hide').val('').datepicker('show').
 793          simulate('keydown', {keyCode: $.simulate.VK_ENTER});
 794      date.setDate(date.getDate() - 1);
 795      equalsDate(inp.datepicker('getDate'), date, 'Default date -1d');
 796      inp.datepicker('option', {defaultDate: '+3D'}).
 797          datepicker('hide').val('').datepicker('show').
 798          simulate('keydown', {keyCode: $.simulate.VK_ENTER});
 799      date.setDate(date.getDate() + 4);
 800      equalsDate(inp.datepicker('getDate'), date, 'Default date +3D');
 801      inp.datepicker('option', {defaultDate: ' -2 w '}).
 802          datepicker('hide').val('').datepicker('show').
 803          simulate('keydown', {keyCode: $.simulate.VK_ENTER});
 804      date = new Date();
 805      date.setDate(date.getDate() - 14);
 806      equalsDate(inp.datepicker('getDate'), date, 'Default date -2 w');
 807      inp.datepicker('option', {defaultDate: '+1 W'}).
 808          datepicker('hide').val('').datepicker('show').
 809          simulate('keydown', {keyCode: $.simulate.VK_ENTER});
 810      date.setDate(date.getDate() + 21);
 811      equalsDate(inp.datepicker('getDate'), date, 'Default date +1 W');
 812      inp.datepicker('option', {defaultDate: ' -1 m '}).
 813          datepicker('hide').val('').datepicker('show').
 814          simulate('keydown', {keyCode: $.simulate.VK_ENTER});
 815      date = new Date();
 816      date.setMonth(date.getMonth() - 1);
 817      equalsDate(inp.datepicker('getDate'), date, 'Default date -1 m');
 818      inp.datepicker('option', {defaultDate: '+2M'}).
 819          datepicker('hide').val('').datepicker('show').
 820          simulate('keydown', {keyCode: $.simulate.VK_ENTER});
 821      date.setMonth(date.getMonth() + 3);
 822      equalsDate(inp.datepicker('getDate'), date, 'Default date +2M');
 823      inp.datepicker('option', {defaultDate: '-2y'}).
 824          datepicker('hide').val('').datepicker('show').
 825          simulate('keydown', {keyCode: $.simulate.VK_ENTER});
 826      date = new Date();
 827      date.setFullYear(date.getFullYear() - 2);
 828      equalsDate(inp.datepicker('getDate'), date, 'Default date -2y');
 829      inp.datepicker('option', {defaultDate: '+1 Y '}).
 830          datepicker('hide').val('').datepicker('show').
 831          simulate('keydown', {keyCode: $.simulate.VK_ENTER});
 832      date.setFullYear(date.getFullYear() + 3);
 833      equalsDate(inp.datepicker('getDate'), date, 'Default date +1 Y');
 834      inp.datepicker('option', {defaultDate: '+1M +10d'}).
 835          datepicker('hide').val('').datepicker('show').
 836          simulate('keydown', {keyCode: $.simulate.VK_ENTER});
 837      date = new Date();
 838      date.setMonth(date.getMonth() + 1);
 839      date.setDate(date.getDate() + 10);
 840      equalsDate(inp.datepicker('getDate'), date, 'Default date +1M +10d');
 841      date = new Date(2007, 1 - 1, 26);
 842      inp.datepicker('option', {defaultDate: date}).
 843          datepicker('hide').val('').datepicker('show').
 844          simulate('keydown', {keyCode: $.simulate.VK_ENTER});
 845      equalsDate(inp.datepicker('getDate'), date, 'Default date 01/26/2007');
 846  });
 847  
 848  test('miscellaneous', function() {
 849      var dp = $('#ui-datepicker-div');
 850      var inp = init('#inp');
 851      // Year range

 852      inp.val('02/04/2008').datepicker('show');
 853      equals(dp.find('.ui-datepicker-new-year').text(),
 854          '199819992000200120022003200420052006200720082009201020112012201320142015201620172018',
 855          'Year range - default');
 856      inp.datepicker('hide').datepicker('option', {yearRange: '-6:+2'}).datepicker('show');
 857      equals(dp.find('.ui-datepicker-new-year').text(),
 858          '200220032004200520062007200820092010', 'Year range - -6:+2');
 859      inp.datepicker('hide').datepicker('option', {yearRange: '2000:2010'}).datepicker('show');
 860      equals(dp.find('.ui-datepicker-new-year').text(),
 861          '20002001200220032004200520062007200820092010', 'Year range - 2000:2010');
 862      // Navigation as date format

 863      equals(dp.find('.ui-datepicker-prev').text(),
 864          '<Prev', 'Navigation prev - default');
 865      equals(dp.find('.ui-datepicker-current').text(),
 866          'Today', 'Navigation current - default');
 867      equals(dp.find('.ui-datepicker-next').text(),
 868          'Next>', 'Navigation next - default');
 869      inp.datepicker('hide').datepicker('option', {navigationAsDateFormat: true,
 870          prevText: '< M', currentText: 'MM', nextText: 'M >'}).
 871          val('02/04/2008').datepicker('show');
 872      var longNames = $.datepicker.regional[''].monthNames;
 873      var shortNames = $.datepicker.regional[''].monthNamesShort;
 874      var date = new Date();
 875      equals(dp.find('.ui-datepicker-prev').text(),
 876          '< ' + shortNames[0], 'Navigation prev - as date format');
 877      equals(dp.find('.ui-datepicker-current').text(),
 878          longNames[date.getMonth()], 'Navigation current - as date format');
 879      equals(dp.find('.ui-datepicker-next').text(),
 880          shortNames[2] + ' >', 'Navigation next - as date format');
 881      inp.simulate('keydown', {keyCode: $.simulate.VK_PGDN});
 882      equals(dp.find('.ui-datepicker-prev').text(),
 883          '< ' + shortNames[1], 'Navigation prev - as date format + pgdn');
 884      equals(dp.find('.ui-datepicker-current').text(),
 885          longNames[date.getMonth()], 'Navigation current - as date format + pgdn');
 886      equals(dp.find('.ui-datepicker-next').text(),
 887          shortNames[3] + ' >', 'Navigation next - as date format + pgdn');
 888      inp.datepicker('hide').datepicker('option', {gotoCurrent: true}).
 889          val('02/04/2008').datepicker('show');
 890      equals(dp.find('.ui-datepicker-prev').text(),
 891          '< ' + shortNames[0], 'Navigation prev - as date format + goto current');
 892      equals(dp.find('.ui-datepicker-current').text(),
 893          longNames[1], 'Navigation current - as date format + goto current');
 894      equals(dp.find('.ui-datepicker-next').text(),
 895          shortNames[2] + ' >', 'Navigation next - as date format + goto current');
 896  });
 897  
 898  test('minMax', function() {
 899      var inp = init('#inp');
 900      var lastYear = new Date(2007, 6 - 1, 4);
 901      var nextYear = new Date(2009, 6 - 1, 4);
 902      var minDate = new Date(2008, 2 - 1, 29);
 903      var maxDate = new Date(2008, 12 - 1, 7);
 904      inp.val('06/04/2008').datepicker('show');
 905      inp.simulate('keydown', {ctrlKey: true, keyCode: $.simulate.VK_PGUP}).
 906          simulate('keydown', {keyCode: $.simulate.VK_ENTER});
 907      equalsDate(inp.datepicker('getDate'), lastYear,
 908          'Min/max - null, null - ctrl+pgup');
 909      inp.val('06/04/2008').datepicker('show');
 910      inp.simulate('keydown', {ctrlKey: true, keyCode: $.simulate.VK_PGDN}).
 911          simulate('keydown', {keyCode: $.simulate.VK_ENTER});
 912      equalsDate(inp.datepicker('getDate'), nextYear,
 913          'Min/max - null, null - ctrl+pgdn');
 914      inp.datepicker('option', {minDate: minDate}).
 915          datepicker('hide').val('06/04/2008').datepicker('show');
 916      inp.simulate('keydown', {ctrlKey: true, keyCode: $.simulate.VK_PGUP}).
 917          simulate('keydown', {keyCode: $.simulate.VK_ENTER});
 918      equalsDate(inp.datepicker('getDate'), minDate,
 919          'Min/max - 02/29/2008, null - ctrl+pgup');
 920      inp.val('06/04/2008').datepicker('show');
 921      inp.simulate('keydown', {ctrlKey: true, keyCode: $.simulate.VK_PGDN}).
 922          simulate('keydown', {keyCode: $.simulate.VK_ENTER});
 923      equalsDate(inp.datepicker('getDate'), nextYear,
 924          'Min/max - 02/29/2008, null - ctrl+pgdn');
 925      inp.datepicker('option', {maxDate: maxDate}).
 926          datepicker('hide').val('06/04/2008').datepicker('show');
 927      inp.simulate('keydown', {ctrlKey: true, keyCode: $.simulate.VK_PGUP}).
 928          simulate('keydown', {keyCode: $.simulate.VK_ENTER});
 929      equalsDate(inp.datepicker('getDate'), minDate,
 930          'Min/max - 02/29/2008, 12/07/2008 - ctrl+pgup');
 931      inp.val('06/04/2008').datepicker('show');
 932      inp.simulate('keydown', {ctrlKey: true, keyCode: $.simulate.VK_PGDN}).
 933          simulate('keydown', {keyCode: $.simulate.VK_ENTER});
 934      equalsDate(inp.datepicker('getDate'), maxDate,
 935          'Min/max - 02/29/2008, 12/07/2008 - ctrl+pgdn');
 936      inp.datepicker('option', {minDate: null}).
 937          datepicker('hide').val('06/04/2008').datepicker('show');
 938      inp.simulate('keydown', {ctrlKey: true, keyCode: $.simulate.VK_PGUP}).
 939          simulate('keydown', {keyCode: $.simulate.VK_ENTER});
 940      equalsDate(inp.datepicker('getDate'), lastYear,
 941          'Min/max - null, 12/07/2008 - ctrl+pgup');
 942      inp.val('06/04/2008').datepicker('show');
 943      inp.simulate('keydown', {ctrlKey: true, keyCode: $.simulate.VK_PGDN}).
 944          simulate('keydown', {keyCode: $.simulate.VK_ENTER});
 945      equalsDate(inp.datepicker('getDate'), maxDate,
 946          'Min/max - null, 12/07/2008 - ctrl+pgdn');
 947      // Relative dates

 948      var date = new Date();
 949      date.setDate(date.getDate() - 7);
 950      inp.datepicker('option', {minDate: '-1w', maxDate: '+1 M +10 D '}).
 951          datepicker('hide').val('').datepicker('show');
 952      inp.simulate('keydown', {ctrlKey: true, keyCode: $.simulate.VK_PGUP}).
 953          simulate('keydown', {keyCode: $.simulate.VK_ENTER});
 954      equalsDate(inp.datepicker('getDate'), date,
 955          'Min/max - -1w, +1 M +10 D - ctrl+pgup');
 956      date = new Date();
 957      date.setMonth(date.getMonth() + 1);
 958      date.setDate(date.getDate() + 10);
 959      inp.val('').datepicker('show');
 960      inp.simulate('keydown', {ctrlKey: true, keyCode: $.simulate.VK_PGDN}).
 961          simulate('keydown', {keyCode: $.simulate.VK_ENTER});
 962      equalsDate(inp.datepicker('getDate'), date,
 963          'Min/max - -1w, +1 M +10 D - ctrl+pgdn');
 964  });
 965  
 966  test('setDate', function() {
 967      var inp = init('#inp');
 968      var date1 = new Date(2008, 6 - 1, 4);
 969      var date2 = new Date();
 970      ok(inp.datepicker('getDate') == null, 'Set date - default');
 971      inp.datepicker('setDate', date1);
 972      equalsDate(inp.datepicker('getDate'), date1, 'Set date - 2008-06-04');
 973      date1 = new Date();
 974      date1.setDate(date1.getDate() + 7);
 975      inp.datepicker('setDate', +7);
 976      equalsDate(inp.datepicker('getDate'), date1, 'Set date - +7');
 977      date2.setFullYear(date2.getFullYear() + 2);
 978      inp.datepicker('setDate', '+2y');
 979      equalsDate(inp.datepicker('getDate'), date2, 'Set date - +2y');
 980      inp.datepicker('setDate', date1, date2);
 981      equalsDate(inp.datepicker('getDate'), date1, 'Set date - two dates');
 982      inp.datepicker('setDate');
 983      ok(inp.datepicker('getDate') == null, 'Set date - null');
 984      // Ranges

 985      date1 = new Date(2008, 6 - 1, 4);
 986      date2 = new Date(2009, 7 - 1, 5);
 987      inp.datepicker('option', {rangeSelect: true});
 988      inp.datepicker('setDate', date1, date2);
 989      equalsDateArray(inp.datepicker('getDate'), [date1, date2],
 990          'Set date range - 2008-06-04 - 2009-07-05');
 991      inp.datepicker('setDate', date1);
 992      equalsDateArray(inp.datepicker('getDate'), [date1, date1],
 993          'Set date range - 2008-06-04');
 994      date1 = new Date();
 995      date1.setDate(date1.getDate() - 10);
 996      date2 = new Date();
 997      date2.setDate(date2.getDate() + 10);
 998      inp.datepicker('setDate', -10, +10);
 999      equalsDateArray(inp.datepicker('getDate'), [date1, date2],
1000          'Set date range - -10 - +10');
1001      inp.datepicker('setDate', -10);
1002      equalsDateArray(inp.datepicker('getDate'), [date1, date1],
1003          'Set date range - -10');
1004      date1 = new Date();
1005      date1.setDate(date1.getDate() - 14);
1006      date2 = new Date();
1007      date2.setFullYear(date2.getFullYear() + 1);
1008      inp.datepicker('setDate', '-2w', '+1Y');
1009      equalsDateArray(inp.datepicker('getDate'), [date1, date2],
1010          'Set date range - -2w - +1Y');
1011      inp.datepicker('setDate', '-2w');
1012      equalsDateArray(inp.datepicker('getDate'), [date1, date1],
1013          'Set date range - -2w');
1014      inp.datepicker('setDate');
1015      isObj(inp.datepicker('getDate'), [null, null], 'Set date range - null');
1016      // Inline

1017      var inl = init('#inl');
1018      date1 = new Date(2008, 6 - 1, 4);
1019      date2 = new Date();
1020      equalsDate(inl.datepicker('getDate'), date2, 'Set date inline - default');
1021      inl.datepicker('setDate', date1);
1022      equalsDate(inl.datepicker('getDate'), date1, 'Set date inline - 2008-06-04');
1023      date1 = new Date();
1024      date1.setDate(date1.getDate() + 7);
1025      inl.datepicker('setDate', +7);
1026      equalsDate(inl.datepicker('getDate'), date1, 'Set date inline - +7');
1027      date2.setFullYear(date2.getFullYear() + 2);
1028      inl.datepicker('setDate', '+2y');
1029      equalsDate(inl.datepicker('getDate'), date2, 'Set date inline - +2y');
1030      inl.datepicker('setDate', date1, date2);
1031      equalsDate(inl.datepicker('getDate'), date1, 'Set date inline - two dates');
1032      inl.datepicker('setDate');
1033      ok(inl.datepicker('getDate') == null, 'Set date inline - null');
1034      // Alternate field

1035      var alt = $('#alt');
1036      inp.datepicker('option', {altField: '#alt', altFormat: 'yy-mm-dd'});
1037      date1 = new Date(2008, 6 - 1, 4);
1038      date2 = new Date(2009, 7 - 1, 5);
1039      inp.datepicker('setDate', date1, date2);
1040      equals(inp.val(), '06/04/2008 - 07/05/2009',
1041          'Set date alternate - 06/04/2008 - 07/05/2009');
1042      equals(alt.val(), '2008-06-04 - 2009-07-05',
1043          'Set date alternate - 2008-06-04 - 2009-07-05');
1044      inp.datepicker('option', {rangeSelect: false}).datepicker('setDate', date1);
1045      equals(inp.val(), '06/04/2008', 'Set date alternate - 06/04/2008');
1046      equals(alt.val(), '2008-06-04', 'Set date alternate - 2008-06-04');
1047  });
1048  
1049  test('ranges', function() {
1050      var inp = init('#inp', {rangeSelect: true});
1051      var date1 = new Date();
1052      var date2 = new Date();
1053      // Select today - today

1054      inp.val('').datepicker('show').
1055          simulate('keydown', {keyCode: $.simulate.VK_ENTER}).
1056          simulate('keydown', {keyCode: $.simulate.VK_ENTER});
1057      equalsDateArray(inp.datepicker('getDate'), [date1, date1],
1058          'Range - enter/enter');
1059      // Can't select prior to start date

1060      inp.val('').datepicker('show').
1061          simulate('keydown', {keyCode: $.simulate.VK_ENTER}).
1062          simulate('keydown', {ctrlKey: true, keyCode: $.simulate.VK_UP}).
1063          simulate('keydown', {keyCode: $.simulate.VK_ENTER});
1064      equalsDateArray(inp.datepicker('getDate'), [date1, date1],
1065          'Range - enter/ctrl+up/enter');
1066      // Can select after start date

1067      inp.val('').datepicker('show').
1068          simulate('keydown', {keyCode: $.simulate.VK_ENTER}).
1069          simulate('keydown', {ctrlKey: true, keyCode: $.simulate.VK_DOWN}).
1070          simulate('keydown', {keyCode: $.simulate.VK_ENTER});
1071      date2.setDate(date2.getDate() + 7);
1072      equalsDateArray(inp.datepicker('getDate'), [date1, date2],
1073          'Range - enter/ctrl+down/enter');
1074      equals(inp.val(), $.datepicker.formatDate('mm/dd/yy', date1) + ' - ' +
1075          $.datepicker.formatDate('mm/dd/yy', date2), 'Range - value');
1076      // Select then cancel defaults to first date

1077      inp.val('').datepicker('show').
1078          simulate('keydown', {keyCode: $.simulate.VK_ENTER}).
1079          simulate('keydown', {ctrlKey: true, keyCode: $.simulate.VK_DOWN}).
1080          simulate('keydown', {keyCode: $.simulate.VK_ESC});
1081      equalsDateArray(inp.datepicker('getDate'), [date1, date1],
1082          'Range - enter/ctrl+down/esc');
1083      // Separator

1084      inp.datepicker('option', {rangeSeparator: ' to '}).
1085          datepicker('hide').val('06/04/2008').datepicker('show').
1086          simulate('keydown', {keyCode: $.simulate.VK_ENTER}).
1087          simulate('keydown', {ctrlKey: true, keyCode: $.simulate.VK_DOWN}).
1088          simulate('keydown', {keyCode: $.simulate.VK_ENTER});
1089      equalsDateArray(inp.datepicker('getDate'),
1090          [new Date(2008, 6 - 1, 4), new Date(2008, 6 - 1, 11)],
1091          'Range separator - enter/ctrl+down/enter');
1092      equals(inp.val(), '06/04/2008 to 06/11/2008',
1093          'Range separator - value');
1094      // Callbacks

1095      inp.datepicker('option', {onSelect: callback, rangeSeparator: ' - '}).
1096          datepicker('hide').val('06/04/2008').datepicker('show').
1097          simulate('keydown', {keyCode: $.simulate.VK_ENTER}).
1098          simulate('keydown', {ctrlKey: true, keyCode: $.simulate.VK_DOWN}).
1099          simulate('keydown', {keyCode: $.simulate.VK_ENTER});
1100      equals(selectedDate, '06/04/2008 - 06/11/2008',
1101          'Range onSelect - enter/ctrl+down/enter');
1102      inp.datepicker('option', {onChangeMonthYear: callback2, onSelect: null}).
1103          datepicker('hide').val('05/04/2008').datepicker('show').
1104          simulate('keydown', {keyCode: $.simulate.VK_PGUP}).
1105          simulate('keydown', {keyCode: $.simulate.VK_ENTER}).
1106          simulate('keydown', {ctrlKey: true, keyCode: $.simulate.VK_DOWN}).
1107          simulate('keydown', {keyCode: $.simulate.VK_ENTER});
1108      equals(selectedDate, '2008/4',
1109          'Range onChangeMonthYear - enter/ctrl+down/enter');
1110      inp.datepicker('option', {onClose: callback, onChangeMonthYear: null}).
1111          datepicker('hide').val('03/04/2008').datepicker('show').
1112          simulate('keydown', {keyCode: $.simulate.VK_ENTER}).
1113          simulate('keydown', {ctrlKey: true, keyCode: $.simulate.VK_DOWN}).
1114          simulate('keydown', {keyCode: $.simulate.VK_ENTER});
1115      equals(selectedDate, '03/04/2008 - 03/11/2008',
1116          'Range onClose - enter/ctrl+down/enter');
1117      // Minimum/maximum

1118      date1 = new Date(2008, 5 - 1, 20);
1119      date2 = new Date(2008, 7 - 1, 2);
1120      inp.datepicker('option', {minDate: date1, maxDate: date2, onClose: null}).
1121          datepicker('hide').val('06/04/2008').datepicker('show').
1122          simulate('keydown', {keyCode: $.simulate.VK_PGUP}).
1123          simulate('keydown', {keyCode: $.simulate.VK_ENTER}).
1124          simulate('keydown', {keyCode: $.simulate.VK_PGDN}).
1125          simulate('keydown', {keyCode: $.simulate.VK_PGDN}).
1126          simulate('keydown', {keyCode: $.simulate.VK_ENTER});
1127      equalsDateArray(inp.datepicker('getDate'), [date1, date2],
1128          'Range min/max - pgup/enter/pgdn/pgdn/enter');
1129      inp.val('06/04/2008').datepicker('show').
1130          simulate('keydown', {ctrlKey: true, keyCode: $.simulate.VK_UP}).
1131          simulate('keydown', {keyCode: $.simulate.VK_ENTER}).
1132          simulate('keydown', {ctrlKey: true, keyCode: $.simulate.VK_DOWN}).
1133          simulate('keydown', {ctrlKey: true, keyCode: $.simulate.VK_DOWN}).
1134          simulate('keydown', {keyCode: $.simulate.VK_ENTER});
1135      equalsDateArray(inp.datepicker('getDate'),
1136          [new Date(2008, 5 - 1, 28), new Date(2008, 6 - 1, 11)],
1137          'Range min/max - ctrl+up/enter/ctrl+down/ctrl+down/enter');
1138      // Inline

1139      var inl = init('#inl', {rangeSelect: true});
1140      var dp = $('.ui-datepicker-inline', inl);
1141      date1 = new Date();
1142      date1.setDate(12);
1143      date2 = new Date();
1144      date2.setDate(19);
1145      $('.ui-datepicker tbody a:contains(12)', dp).simulate('click', {});
1146      $('.ui-datepicker tbody a:contains(12)', dp).simulate('click', {});
1147      equalsDateArray(inl.datepicker('getDate'), [date1, date1],
1148          'Range inline - same day');
1149      $('.ui-datepicker tbody a:contains(12)', dp).simulate('click', {});
1150      $('.ui-datepicker tbody a:contains(10)', dp).simulate('click', {}); // Doesn't select

1151      equalsDateArray(inl.datepicker('getDate'), [date1, date1],
1152          'Range inline - prev');
1153      $('.ui-datepicker tbody a:contains(12)', dp).simulate('click', {}); // Selects

1154      inl.datepicker('setDate', date1);
1155      $('.ui-datepicker tbody a:contains(12)', dp).simulate('click', {});
1156      $('.ui-datepicker tbody a:contains(19)', dp).simulate('click', {});
1157      equalsDateArray(inl.datepicker('getDate'), [date1, date2],
1158          'Range inline - next');
1159  });
1160  
1161  test('altField', function() {
1162      var inp = init('#inp');
1163      var alt = $('#alt');
1164      // No alternate field set

1165      alt.val('');
1166      inp.val('06/04/2008').datepicker('show');
1167      inp.simulate('keydown', {keyCode: $.simulate.VK_ENTER});
1168      equals(inp.val(), '06/04/2008', 'Alt field - dp - enter');
1169      equals(alt.val(), '', 'Alt field - alt not set');
1170      // Alternate field set

1171      alt.val('');
1172      inp.datepicker('option', {altField: '#alt', altFormat: 'yy-mm-dd'}).
1173          val('06/04/2008').datepicker('show');
1174      inp.simulate('keydown', {keyCode: $.simulate.VK_ENTER});
1175      equals(inp.val(), '06/04/2008', 'Alt field - dp - enter');
1176      equals(alt.val(), '2008-06-04', 'Alt field - alt - enter');
1177      // Move from initial date

1178      alt.val('');
1179      inp.val('06/04/2008').datepicker('show');
1180      inp.simulate('keydown', {keyCode: $.simulate.VK_PGDN}).
1181          simulate('keydown', {keyCode: $.simulate.VK_ENTER});
1182      equals(inp.val(), '07/04/2008', 'Alt field - dp - pgdn');
1183      equals(alt.val(), '2008-07-04', 'Alt field - alt - pgdn');
1184      // Alternate field set - closed

1185      alt.val('');
1186      inp.val('06/04/2008').datepicker('show');
1187      inp.simulate('keydown', {keyCode: $.simulate.VK_PGDN}).
1188          simulate('keydown', {keyCode: $.simulate.VK_ESC});
1189      equals(inp.val(), '06/04/2008', 'Alt field - dp - pgdn/esc');
1190      equals(alt.val(), '', 'Alt field - alt - pgdn/esc');
1191      // Clear date and alternate

1192      alt.val('');
1193      inp.val('06/04/2008').datepicker('show');
1194      inp.simulate('keydown', {ctrlKey: true, keyCode: $.simulate.VK_END});
1195      equals(inp.val(), '', 'Alt field - dp - ctrl+end');
1196      equals(alt.val(), '', 'Alt field - alt - ctrl+end');
1197      // Range select no alternate field set

1198      alt.val('');
1199      inp.datepicker('option', {rangeSelect: true, altField: '', altFormat: ''}).
1200          datepicker('hide').val('06/04/2008 - 07/14/2008').datepicker('show');
1201      inp.simulate('keydown', {keyCode: $.simulate.VK_ENTER}).
1202          simulate('keydown', {keyCode: $.simulate.VK_ENTER});
1203      equals(inp.val(), '06/04/2008 - 06/04/2008', 'Alt field range - dp - enter');
1204      equals(alt.val(), '', 'Alt field range - alt not set');
1205      // Range select no movement

1206      alt.val('');
1207      inp.datepicker('option', {altField: '#alt', altFormat: 'yy-mm-dd'}).
1208          datepicker('hide').val('06/04/2008 - 07/14/2008').datepicker('show');
1209      inp.simulate('keydown', {keyCode: $.simulate.VK_ENTER}).
1210          simulate('keydown', {keyCode: $.simulate.VK_ENTER});
1211      equals(inp.val(), '06/04/2008 - 06/04/2008', 'Alt field range - dp - enter');
1212      equals(alt.val(), '2008-06-04 - 2008-06-04', 'Alt field range - alt - enter');
1213      // Range select next month

1214      alt.val('');
1215      inp.val('06/04/2008 - 07/14/2008').datepicker('show');
1216      inp.simulate('keydown', {keyCode: $.simulate.VK_ENTER}).
1217          simulate('keydown', {keyCode: $.simulate.VK_PGDN}).
1218          simulate('keydown', {keyCode: $.simulate.VK_ENTER});
1219      equals(inp.val(), '06/04/2008 - 07/04/2008',
1220          'Alt field range - dp - enter/pgdn/enter');
1221      equals(alt.val(), '2008-06-04 - 2008-07-04',
1222          'Alt field range - alt - enter/pgdn/enter');
1223      // Range select escape

1224      alt.val('');
1225      inp.val('06/04/2008 - 07/14/2008').datepicker('show');
1226      inp.simulate('keydown', {keyCode: $.simulate.VK_ENTER}).
1227          simulate('keydown', {keyCode: $.simulate.VK_PGDN}).
1228          simulate('keydown', {keyCode: $.simulate.VK_ESC});
1229      equals(inp.val(), '06/04/2008 - 06/04/2008',
1230          'Alt field range - dp - enter/pgdn/esc');
1231      equals(alt.val(), '2008-06-04 - 2008-06-04',
1232          'Alt field range - alt - enter/pgdn/esc');
1233      // Range select clear

1234      alt.val('');
1235      inp.val('06/04/2008 - 07/14/2008').datepicker('show');
1236      inp.simulate('keydown', {keyCode: $.simulate.VK_ENTER}).
1237          simulate('keydown', {keyCode: $.simulate.VK_PGDN}).
1238          simulate('keydown', {ctrlKey: true, keyCode: $.simulate.VK_END});
1239      equals(inp.val(), '', 'Alt field range - dp - enter/pgdn/ctrl+end');
1240      equals(alt.val(), '', 'Alt field range - alt - enter/pgdn/ctrl+end');
1241  });
1242  
1243  test('daylightSaving', function() {
1244      var inp = init('#inp');
1245      var dp = $('#ui-datepicker-div');
1246      ok(true, 'Daylight saving - ' + new Date());
1247      // Australia, Sydney - AM change, southern hemisphere

1248      inp.val('04/01/2008').datepicker('show');
1249      $('.ui-datepicker td:eq(13)', dp).simulate('click', {});
1250      equals(inp.val(), '04/05/2008', 'Daylight saving - Australia 04/05/2008');
1251      inp.val('04/01/2008').datepicker('show');
1252      $('.ui-datepicker td:eq(14)', dp).simulate('click', {});
1253      equals(inp.val(), '04/06/2008', 'Daylight saving - Australia 04/06/2008');
1254      inp.val('04/01/2008').datepicker('show');
1255      $('.ui-datepicker td:eq(15)', dp).simulate('click', {});
1256      equals(inp.val(), '04/07/2008', 'Daylight saving - Australia 04/07/2008');
1257      inp.val('10/01/2008').datepicker('show');
1258      $('.ui-datepicker td:eq(13)', dp).simulate('click', {});
1259      equals(inp.val(), '10/04/2008', 'Daylight saving - Australia 10/04/2008');
1260      inp.val('10/01/2008').datepicker('show');
1261      $('.ui-datepicker td:eq(14)', dp).simulate('click', {});
1262      equals(inp.val(), '10/05/2008', 'Daylight saving - Australia 10/05/2008');
1263      inp.val('10/01/2008').datepicker('show');
1264      $('.ui-datepicker td:eq(15)', dp).simulate('click', {});
1265      equals(inp.val(), '10/06/2008', 'Daylight saving - Australia 10/06/2008');
1266      // Brasil, Brasilia - midnight change, southern hemisphere

1267      inp.val('02/01/2008').datepicker('show');
1268      $('.ui-datepicker td:eq(27)', dp).simulate('click', {});
1269      equals(inp.val(), '02/16/2008', 'Daylight saving - Brasil 02/16/2008');
1270      inp.val('02/01/2008').datepicker('show');
1271      $('.ui-datepicker td:eq(28)', dp).simulate('click', {});
1272      equals(inp.val(), '02/17/2008', 'Daylight saving - Brasil 02/17/2008');
1273      inp.val('02/01/2008').datepicker('show');
1274      $('.ui-datepicker td:eq(29)', dp).simulate('click', {});
1275      equals(inp.val(), '02/18/2008', 'Daylight saving - Brasil 02/18/2008');
1276      inp.val('10/01/2008').datepicker('show');
1277      $('.ui-datepicker td:eq(20)', dp).simulate('click', {});
1278      equals(inp.val(), '10/11/2008', 'Daylight saving - Brasil 10/11/2008');
1279      inp.val('10/01/2008').datepicker('show');
1280      $('.ui-datepicker td:eq(21)', dp).simulate('click', {});
1281      equals(inp.val(), '10/12/2008', 'Daylight saving - Brasil 10/12/2008');
1282      inp.val('10/01/2008').datepicker('show');
1283      $('.ui-datepicker td:eq(22)', dp).simulate('click', {});
1284      equals(inp.val(), '10/13/2008', 'Daylight saving - Brasil 10/13/2008');
1285      // Lebanon, Beirut - midnight change, northern hemisphere

1286      inp.val('03/01/2008').datepicker('show');
1287      $('.ui-datepicker td:eq(41)', dp).simulate('click', {});
1288      equals(inp.val(), '03/29/2008', 'Daylight saving - Lebanon 03/29/2008');
1289      inp.val('03/01/2008').datepicker('show');
1290      $('.ui-datepicker td:eq(42)', dp).simulate('click', {});
1291      equals(inp.val(), '03/30/2008', 'Daylight saving - Lebanon 03/30/2008');
1292      inp.val('03/01/2008').datepicker('show');
1293      $('.ui-datepicker td:eq(43)', dp).simulate('click', {});
1294      equals(inp.val(), '03/31/2008', 'Daylight saving - Lebanon 03/31/2008');
1295      inp.val('10/01/2008').datepicker('show');
1296      $('.ui-datepicker td:eq(34)', dp).simulate('click', {});
1297      equals(inp.val(), '10/25/2008', 'Daylight saving - Lebanon 10/25/2008');
1298      inp.val('10/01/2008').datepicker('show');
1299      $('.ui-datepicker td:eq(35)', dp).simulate('click', {});
1300      equals(inp.val(), '10/26/2008', 'Daylight saving - Lebanon 10/26/2008');
1301      inp.val('10/01/2008').datepicker('show');
1302      $('.ui-datepicker td:eq(36)', dp).simulate('click', {});
1303      equals(inp.val(), '10/27/2008', 'Daylight saving - Lebanon 10/27/2008');
1304      // US, Eastern - AM change, northern hemisphere

1305      inp.val('03/01/2008').datepicker('show');
1306      $('.ui-datepicker td:eq(20)', dp).simulate('click', {});
1307      equals(inp.val(), '03/08/2008', 'Daylight saving - US 03/08/2008');
1308      inp.val('03/01/2008').datepicker('show');
1309      $('.ui-datepicker td:eq(21)', dp).simulate('click', {});
1310      equals(inp.val(), '03/09/2008', 'Daylight saving - US 03/09/2008');
1311      inp.val('03/01/2008').datepicker('show');
1312      $('.ui-datepicker td:eq(22)', dp).simulate('click', {});
1313      equals(inp.val(), '03/10/2008', 'Daylight saving - US 03/10/2008');
1314      inp.val('11/01/2008').datepicker('show');
1315      $('.ui-datepicker td:eq(13)', dp).simulate('click', {});
1316      equals(inp.val(), '11/01/2008', 'Daylight saving - US 11/01/2008');
1317      inp.val('11/01/2008').datepicker('show');
1318      $('.ui-datepicker td:eq(14)', dp).simulate('click', {});
1319      equals(inp.val(), '11/02/2008', 'Daylight saving - US 11/02/2008');
1320      inp.val('11/01/2008').datepicker('show');
1321      $('.ui-datepicker td:eq(15)', dp).simulate('click', {});
1322      equals(inp.val(), '11/03/2008', 'Daylight saving - US 11/03/2008');
1323  });
1324  
1325  var beforeShowThis = null;
1326  var beforeShowInput = null;
1327  var beforeShowInst = null;
1328  
1329  function beforeAll(input, inst) {
1330      beforeShowThis = this;
1331      beforeShowInput = input;
1332      beforeShowInst = inst;
1333      return {currentText: 'Current'};
1334  }
1335  
1336  var beforeShowDayThis = null;
1337  var beforeShowDayOK = true;
1338  
1339  function beforeDay(date) {
1340      beforeShowDayThis = this;
1341      beforeShowDayOK &= (date > new Date(2008, 1 - 1, 26) &&
1342          date < new Date(2008, 3 - 1, 6));
1343      return [(date.getDate() % 2 == 0), (date.getDate() % 10 == 0 ? 'day10' : ''),
1344          (date.getDate() % 3 == 0 ? 'Divisble by 3' : '')];
1345  }
1346  
1347  function calcWeek(date) {
1348      var doy = date.getDate() + 6;
1349      for (var m = date.getMonth() - 1; m >= 0; m--)
1350          doy += $.datepicker._getDaysInMonth(date.getFullYear(), m);
1351      // Simple count from 01/01 starting at week 1

1352      return Math.floor(doy / 7);
1353  }
1354  
1355  test('callbacks', function() {
1356      // Before show

1357      var inp = init('#inp', {beforeShow: beforeAll});
1358      var inst = $.data(inp[0], 'datepicker');
1359      equals($.datepicker._get(inst, 'currentText'), 'Today', 'Before show - initial');
1360      inp.val('02/04/2008').datepicker('show');
1361      equals($.datepicker._get(inst, 'currentText'), 'Current', 'Before show - changed');
1362      ok(beforeShowThis.id == inp[0].id, 'Before show - this OK');
1363      ok(beforeShowInput.id == inp[0].id, 'Before show - input OK');
1364      isObj(beforeShowInst, inst, 'Before show - inst OK');
1365      inp.datepicker('hide').datepicker('destroy');
1366      // Before show day

1367      inp = init('#inp', {beforeShowDay: beforeDay});
1368      var dp = $('#ui-datepicker-div');
1369      inp.val('02/04/2008').datepicker('show');
1370      ok(beforeShowDayThis.id == inp[0].id, 'Before show day - this OK');
1371      ok(beforeShowDayOK, 'Before show day - dates OK');
1372      var day20 = dp.find('.ui-datepicker td:contains("20")');
1373      var day21 = dp.find('.ui-datepicker td:contains("21")');
1374      ok(!day20.is('.ui-datepicker-unselectable'), 'Before show day - unselectable 20');
1375      ok(day21.is('.ui-datepicker-unselectable'), 'Before show day - unselectable 21');
1376      ok(day20.is('.day10'), 'Before show day - CSS 20');
1377      ok(!day21.is('.day10'), 'Before show day - CSS 21');
1378      ok(day20.attr('title') == '', 'Before show day - title 20');
1379      ok(day21.attr('title') == 'Divisble by 3', 'Before show day - title 21');
1380      inp.datepicker('hide').datepicker('destroy');
1381      // Calculate week

1382      inp = init('#inp', {showWeeks: true, calculateWeek: calcWeek});
1383      inp.val('02/04/2008').datepicker('show');
1384      equals($('.ui-datepicker-week-col:first').text(), 4, 'Calculate week');
1385      equals($('.ui-datepicker-week-col:last').text(), 8, 'Calculate week');
1386      // Make Tuesday first

1387      $('.ui-datepicker-title-row a:contains("Tu")', dp).simulate('click', {});
1388      equals($('.ui-datepicker-week-col:first').text(), 5, 'Calculate week');
1389      equals($('.ui-datepicker-week-col:last').text(), 9, 'Calculate week');
1390      inp.datepicker('hide').datepicker('destroy');
1391  });
1392  
1393  var selectedThis = null;
1394  var selectedDate = null;
1395  var selectedInst = null;
1396  
1397  function callback(date, inst) {
1398      selectedThis = this;
1399      selectedDate = date;
1400      selectedInst = inst;
1401  }
1402  
1403  function callback2(year, month, inst) {
1404      selectedThis = this;
1405      selectedDate = year + '/' + month;
1406      selectedInst = inst;
1407  }
1408  
1409  test('events', function() {
1410      var inp = init('#inp', {onSelect: callback});
1411      var date = new Date();
1412      // onSelect

1413      inp.val('').datepicker('show').
1414          simulate('keydown', {keyCode: $.simulate.VK_ENTER});
1415      equals(selectedThis, inp[0], 'Callback selected this');
1416      equals(selectedInst, $.data(inp[0], PROP_NAME), 'Callback selected inst');
1417      equals(selectedDate, $.datepicker.formatDate('mm/dd/yy', date),
1418          'Callback selected date');
1419      inp.val('').datepicker('show').
1420          simulate('keydown', {ctrlKey: true, keyCode: $.simulate.VK_DOWN}).
1421          simulate('keydown', {keyCode: $.simulate.VK_ENTER});
1422      date.setDate(date.getDate() + 7);
1423      equals(selectedDate, $.datepicker.formatDate('mm/dd/yy', date),
1424          'Callback selected date - ctrl+down');
1425      inp.val('').datepicker('show').
1426          simulate('keydown', {keyCode: $.simulate.VK_ESC});
1427      equals(selectedDate, $.datepicker.formatDate('mm/dd/yy', date),
1428          'Callback selected date - esc');
1429      // onChangeMonthYear

1430      inp.datepicker('option', {onChangeMonthYear: callback2, onSelect: null}).
1431          val('').datepicker('show');
1432      var newMonthYear = function(date) {
1433          return date.getFullYear() + '/' + (date.getMonth() + 1);
1434      };
1435      date = new Date();
1436      date.setDate(1);
1437      inp.simulate('keydown', {keyCode: $.simulate.VK_PGUP});
1438      date.setMonth(date.getMonth() - 1);
1439      equals(selectedThis, inp[0], 'Callback change month/year this');
1440      equals(selectedInst, $.data(inp[0], PROP_NAME), 'Callback change month/year inst');
1441      equals(selectedDate, newMonthYear(date),
1442          'Callback change month/year date - pgup');
1443      inp.simulate('keydown', {keyCode: $.simulate.VK_PGDN});
1444      date.setMonth(date.getMonth() + 1);
1445      equals(selectedDate, newMonthYear(date),
1446          'Callback change month/year date - pgdn');
1447      inp.simulate('keydown', {ctrlKey: true, keyCode: $.simulate.VK_PGUP});
1448      date.setFullYear(date.getFullYear() - 1);
1449      equals(selectedDate, newMonthYear(date),
1450          'Callback change month/year date - ctrl+pgup');
1451      inp.simulate('keydown', {ctrlKey: true, keyCode: $.simulate.VK_HOME});
1452      date.setFullYear(date.getFullYear() + 1);
1453      equals(selectedDate, newMonthYear(date),
1454          'Callback change month/year date - ctrl+home');
1455      inp.simulate('keydown', {ctrlKey: true, keyCode: $.simulate.VK_PGDN});
1456      date.setFullYear(date.getFullYear() + 1);
1457      equals(selectedDate, newMonthYear(date),
1458          'Callback change month/year date - ctrl+pgdn');
1459      inp.datepicker('setDate', new Date(2007, 1 - 1, 26));
1460      equals(selectedDate, '2007/1', 'Callback change month/year date - setDate');
1461      selectedDate = null;
1462      inp.datepicker('setDate', new Date(2007, 1 - 1, 12));
1463      ok(selectedDate == null, 'Callback change month/year date - setDate no change');
1464      // onChangeMonthYear step by 2

1465      inp.datepicker('option', {stepMonths: 2}).
1466          datepicker('hide').val('').datepicker('show').
1467          simulate('keydown', {keyCode: $.simulate.VK_PGUP});
1468      date.setMonth(date.getMonth() - 14);
1469      equals(selectedDate, newMonthYear(date),
1470          'Callback change month/year by 2 date - pgup');
1471      inp.simulate('keydown', {ctrlKey: true, keyCode: $.simulate.VK_PGUP});
1472      date.setMonth(date.getMonth() - 12);
1473      equals(selectedDate, newMonthYear(date),
1474          'Callback change month/year by 2 date - ctrl+pgup');
1475      inp.simulate('keydown', {keyCode: $.simulate.VK_PGDN});
1476      date.setMonth(date.getMonth() + 2);
1477      equals(selectedDate, newMonthYear(date),
1478          'Callback change month/year by 2 date - pgdn');
1479      inp.simulate('keydown', {ctrlKey: true, keyCode: $.simulate.VK_PGDN});
1480      date.setMonth(date.getMonth() + 12);
1481      equals(selectedDate, newMonthYear(date),
1482          'Callback change month/year by 2 date - ctrl+pgdn');
1483      // onClose

1484      inp.datepicker('option', {onClose: callback, onChangeMonthYear: null, stepMonths: 1}).
1485          val('').datepicker('show').
1486          simulate('keydown', {keyCode: $.simulate.VK_ESC});
1487      equals(selectedThis, inp[0], 'Callback close this');
1488      equals(selectedInst, $.data(inp[0], PROP_NAME), 'Callback close inst');
1489      equals(selectedDate, '', 'Callback close date - esc');
1490      inp.val('').datepicker('show').
1491          simulate('keydown', {keyCode: $.simulate.VK_ENTER});
1492      equals(selectedDate, $.datepicker.formatDate('mm/dd/yy', new Date()),
1493          'Callback close date - enter');
1494      inp.val('02/04/2008').datepicker('show').
1495          simulate('keydown', {keyCode: $.simulate.VK_ESC});
1496      equals(selectedDate, '02/04/2008', 'Callback close date - preset');
1497      inp.val('02/04/2008').datepicker('show').
1498          simulate('keydown', {ctrlKey: true, keyCode: $.simulate.VK_END});
1499      equals(selectedDate, '', 'Callback close date - ctrl+end');
1500  });
1501  
1502  function highlight20(date, inst) {
1503      return (date.getDate() == 20 ? '*** 20 ***' : $.datepicker.dateStatus(date, inst));
1504  }
1505  
1506  test('status', function() {
1507      var dp = $('#ui-datepicker-div');
1508      var inp = init('#inp', {showStatus: true, statusForDate: highlight20, showWeeks: true});
1509      inp.val('').datepicker('show');
1510      var status = $('.ui-datepicker-status', dp);
1511      ok(status.length == 1, 'Status - present');
1512      equals(status.text(), 'Select a date', 'Status - default');
1513      $('.ui-datepicker-clear a', dp).simulate('mouseover');
1514      equals(status.text(), 'Erase the current date', 'Status - clear');
1515      $('.ui-datepicker-close a', dp).simulate('mouseover');
1516      equals(status.text(), 'Close without change', 'Status - close');
1517      $('.ui-datepicker-prev a', dp).simulate('mouseover');
1518      equals(status.text(), 'Show the previous month', 'Status - previous');
1519      $('.ui-datepicker-current a', dp).simulate('mouseover');
1520      equals(status.text(), 'Show the current month', 'Status - current');
1521      $('.ui-datepicker-next a', dp).simulate('mouseover');
1522      equals(status.text(), 'Show the next month', 'Status - next');
1523      $('.ui-datepicker-new-month', dp).simulate('mouseover');
1524      equals(status.text(), 'Show a different month', 'Status - new month');
1525      $('.ui-datepicker-new-year', dp).simulate('mouseover');
1526      equals(status.text(), 'Show a different year', 'Status - new year');
1527      $('.ui-datepicker-title-row td:first', dp).simulate('mouseover');
1528      equals(status.text(), 'Week of the year', 'Status - week header');
1529      var day = 0;
1530      $('.ui-datepicker-title-row a', dp).each(function() {
1531          $(this).simulate('mouseover');
1532          equals(status.text(), 'Set ' + $.datepicker.regional[''].dayNames[day] +
1533              ' as first week day', 'Status - day ' + day);
1534          day++;
1535      });
1536      $('.ui-datepicker-days-row:eq(1) td:first', dp).simulate('mouseover');
1537      equals(status.text(), 'Week of the year', 'Status - week column');
1538      day = 0;
1539      var month = $.datepicker.regional[''].monthNamesShort[new Date().getMonth()];
1540      $('.ui-datepicker-days-row:eq(1) a', dp).each(function() {
1541          $(this).simulate('mouseover');
1542          equals(status.text(), 'Select ' + $.datepicker.regional[''].dayNames[day] +
1543              ', ' + month + ' ' + $(this).text(), 'Status - dates');
1544          day++;
1545      });
1546      $('.ui-datepicker-days-row a:contains("20")', dp).each(function() {
1547          $(this).simulate('mouseover');
1548          equals(status.text(), '*** 20 ***', 'Status - dates');
1549      });
1550      inp.datepicker('hide').datepicker('destroy');
1551  });
1552  
1553  test('localisation', function() {
1554      var inp = init('#inp', $.datepicker.regional['fr']);
1555      inp.datepicker('option', {dateFormat: 'DD, d MM yy', showStatus: true, showWeeks: true}).
1556          val('').datepicker('show');
1557      var dp = $('#ui-datepicker-div');
1558      var status = $('.ui-datepicker-status', dp);
1559      equals($('.ui-datepicker-clear', dp).text(), 'Effacer', 'Localisation - clear');
1560      equals($('.ui-datepicker-close', dp).text(), 'Fermer', 'Localisation - close');
1561      $('.ui-datepicker-close a', dp).simulate('mouseover');
1562      equals(status.text(), 'Fermer sans modifier', 'Localisation - status');
1563      equals($('.ui-datepicker-prev', dp).text(), '<Préc', 'Localisation - previous');
1564      equals($('.ui-datepicker-current', dp).text(), 'Courant', 'Localisation - current');
1565      equals($('.ui-datepicker-next', dp).text(), 'Suiv>', 'Localisation - next');
1566      equals($('.ui-datepicker-current', dp).text(), 'Courant', 'Localisation - current');
1567      var month = 0;
1568      $('.ui-datepicker-new-month option', dp).each(function() {
1569          equals($(this).text(), $.datepicker.regional['fr'].monthNames[month],
1570              'Localisation - month ' + month);
1571          month++;
1572      });
1573      equals($('.ui-datepicker-title-row td:first', dp).text(),
1574          $.datepicker.regional['fr'].weekHeader, 'Localisation - week header');
1575      var day = 1;
1576      $('.ui-datepicker-title-row a', dp).each(function() {
1577          equals($(this).text(), $.datepicker.regional['fr'].dayNamesMin[day],
1578              'Localisation - day ' + day);
1579          day = (day + 1) % 7;
1580      });
1581      inp.simulate('keydown', {keyCode: $.simulate.VK_ENTER});
1582      var date = new Date();
1583      equals(inp.val(), $.datepicker.regional['fr'].dayNames[date.getDay()] + ', ' +
1584          date.getDate() + ' ' + $.datepicker.regional['fr'].monthNames[date.getMonth()] +
1585          ' ' + date.getFullYear(), 'Localisation - formatting');
1586  });
1587  
1588  test('noWeekends', function() {
1589      for (var i = 1; i <= 31; i++) {
1590          var date = new Date(2001, 1 - 1, i);
1591          isSet($.datepicker.noWeekends(date), [(i + 1) % 7 >= 2, ''],
1592              'No weekends ' + date);
1593      }
1594  });
1595  
1596  test('iso8601Week', function() {
1597      var date = new Date(2000, 12 - 1, 31);
1598      equals($.datepicker.iso8601Week(date), 52, 'ISO 8601 week ' + date);
1599      date = new Date(2001, 1 - 1, 1);
1600      equals($.datepicker.iso8601Week(date), 1, 'ISO 8601 week ' + date);
1601      date = new Date(2001, 1 - 1, 7);
1602      equals($.datepicker.iso8601Week(date), 1, 'ISO 8601 week ' + date);
1603      date = new Date(2001, 1 - 1, 8);
1604      equals($.datepicker.iso8601Week(date), 2, 'ISO 8601 week ' + date);
1605      date = new Date(2003, 12 - 1, 28);
1606      equals($.datepicker.iso8601Week(date), 52, 'ISO 8601 week ' + date);
1607      date = new Date(2003, 12 - 1, 29);
1608      equals($.datepicker.iso8601Week(date), 1, 'ISO 8601 week ' + date);
1609      date = new Date(2004, 1 - 1, 4);
1610      equals($.datepicker.iso8601Week(date), 1, 'ISO 8601 week ' + date);
1611      date = new Date(2004, 1 - 1, 5);
1612      equals($.datepicker.iso8601Week(date), 2, 'ISO 8601 week ' + date);
1613      date = new Date(2009, 12 - 1, 28);
1614      equals($.datepicker.iso8601Week(date), 53, 'ISO 8601 week ' + date);
1615      date = new Date(2010, 1 - 1, 3);
1616      equals($.datepicker.iso8601Week(date), 53, 'ISO 8601 week ' + date);
1617      date = new Date(2010, 1 - 1, 4);
1618      equals($.datepicker.iso8601Week(date), 1, 'ISO 8601 week ' + date);
1619      date = new Date(2010, 1 - 1, 10);
1620      equals($.datepicker.iso8601Week(date), 1, 'ISO 8601 week ' + date);
1621  });
1622  
1623  test('parseDate', function() {
1624      init('#inp');
1625      ok($.datepicker.parseDate('d m y', '') == null, 'Parse date empty');
1626      equalsDate($.datepicker.parseDate('d m y', '3 2 01'),
1627          new Date(2001, 2 - 1, 3), 'Parse date d m y');
1628      equalsDate($.datepicker.parseDate('dd mm yy', '03 02 2001'),
1629          new Date(2001, 2 - 1, 3), 'Parse date dd mm yy');
1630      equalsDate($.datepicker.parseDate('d m y', '13 12 01'),
1631          new Date(2001, 12 - 1, 13), 'Parse date d m y');
1632      equalsDate($.datepicker.parseDate('dd mm yy', '13 12 2001'),
1633          new Date(2001, 12 - 1, 13), 'Parse date dd mm yy');
1634      equalsDate($.datepicker.parseDate('y-o', '2001-34'),
1635          new Date(2001, 2 - 1, 3), 'Parse date y-o');
1636      equalsDate($.datepicker.parseDate('yy-oo', '2001-347'),
1637          new Date(2001, 12 - 1, 13), 'Parse date yy oo');
1638      equalsDate($.datepicker.parseDate('oo yy', '348 2004'),
1639          new Date(2004, 12 - 1, 13), 'Parse date oo-yy');
1640      equalsDate($.datepicker.parseDate('D d M y', 'Sat 3 Feb 01'),
1641          new Date(2001, 2 - 1, 3), 'Parse date D d M y');
1642      equalsDate($.datepicker.parseDate('d MM DD yy', '3 February Saturday 2001'),
1643          new Date(2001, 2 - 1, 3), 'Parse date dd MM DD yy');
1644      equalsDate($.datepicker.parseDate('DD, MM d, yy', 'Saturday, February 3, 2001'),
1645          new Date(2001, 2 - 1, 3), 'Parse date DD, MM d, yy');
1646      equalsDate($.datepicker.parseDate('\'day\' d \'of\' MM (\'\'DD\'\'), yy',
1647          'day 3 of February (\'Saturday\'), 2001'), new Date(2001, 2 - 1, 3),
1648          'Parse date \'day\' d \'of\' MM (\'\'DD\'\'), yy');
1649      equalsDate($.datepicker.parseDate('y-m-d', '01-02-03'),
1650          new Date(2001, 2 - 1, 3), 'Parse date y-m-d - default cutoff');
1651      equalsDate($.datepicker.parseDate('y-m-d', '51-02-03'),
1652          new Date(1951, 2 - 1, 3), 'Parse date y-m-d - default cutoff');
1653      equalsDate($.datepicker.parseDate('y-m-d', '51-02-03', {shortYearCutoff: 80}),
1654          new Date(2051, 2 - 1, 3), 'Parse date y-m-d - cutoff 80');
1655      equalsDate($.datepicker.parseDate('y-m-d', '51-02-03', {shortYearCutoff: '+60'}),
1656          new Date(2051, 2 - 1, 3), 'Parse date y-m-d - cutoff +60');
1657      var fr = $.datepicker.regional['fr'];
1658      var settings = {dayNamesShort: fr.dayNamesShort, dayNames: fr.dayNames,
1659          monthNamesShort: fr.monthNamesShort, monthNames: fr.monthNames};
1660      equalsDate($.datepicker.parseDate('D d M y', 'Lun 9 Avr 01', settings),
1661          new Date(2001, 4 - 1, 9), 'Parse date D M y with settings');
1662      equalsDate($.datepicker.parseDate('d MM DD yy', '9 Avril Lundi 2001', settings),
1663          new Date(2001, 4 - 1, 9), 'Parse date d MM DD yy with settings');
1664      equalsDate($.datepicker.parseDate('DD, MM d, yy', 'Lundi, Avril 9, 2001', settings),
1665          new Date(2001, 4 - 1, 9), 'Parse date DD, MM d, yy with settings');
1666      equalsDate($.datepicker.parseDate('\'jour\' d \'de\' MM (\'\'DD\'\'), yy',
1667          'jour 9 de Avril (\'Lundi\'), 2001', settings), new Date(2001, 4 - 1, 9),
1668          'Parse date \'jour\' d \'de\' MM (\'\'DD\'\'), yy with settings');
1669  });
1670  
1671  test('parseDateErrors', function() {
1672      init('#inp');
1673      var expectError = function(expr, value, error) {
1674          try {
1675              expr();
1676              ok(false, 'Parsed error ' + value);
1677          }
1678          catch (e) {
1679              equals(e, error, 'Parsed error ' + value);
1680          }
1681      };
1682      expectError(function() { $.datepicker.parseDate(null, 'Sat 2 01'); },
1683          'Sat 2 01', 'Invalid arguments');
1684      expectError(function() { $.datepicker.parseDate('d m y', null); },
1685          'null', 'Invalid arguments');
1686      expectError(function() { $.datepicker.parseDate('d m y', 'Sat 2 01'); },
1687          'Sat 2 01 - d m y', 'Missing number at position 0');
1688      expectError(function() { $.datepicker.parseDate('dd mm yy', 'Sat 2 01'); },
1689          'Sat 2 01 - dd mm yy', 'Missing number at position 0');
1690      expectError(function() { $.datepicker.parseDate('d m y', '3 Feb 01'); },
1691          '3 Feb 01 - d m y', 'Missing number at position 2');
1692      expectError(function() { $.datepicker.parseDate('dd mm yy', '3 Feb 01'); },
1693          '3 Feb 01 - dd mm yy', 'Missing number at position 2');
1694      expectError(function() { $.datepicker.parseDate('d m y', '3 2 AD01'); },
1695          '3 2 AD01 - d m y', 'Missing number at position 4');
1696      expectError(function() { $.datepicker.parseDate('d m yy', '3 2 AD01'); },
1697          '3 2 AD01 - dd mm yy', 'Missing number at position 4');
1698      expectError(function() { $.datepicker.parseDate('y-o', '2001-D01'); },
1699          '2001-D01 - y-o', 'Missing number at position 5');
1700      expectError(function() { $.datepicker.parseDate('yy-oo', '2001-D01'); },
1701          '2001-D01 - yy-oo', 'Missing number at position 5');
1702      expectError(function() { $.datepicker.parseDate('D d M y', 'D7 3 Feb 01'); },
1703          'D7 3 Feb 01 - D d M y', 'Unknown name at position 0');
1704      expectError(function() { $.datepicker.parseDate('D d M y', 'Sat 3 M2 01'); },
1705          'Sat 3 M2 01 - D d M y', 'Unknown name at position 6');
1706      expectError(function() { $.datepicker.parseDate('DD, MM d, yy', 'Saturday- Feb 3, 2001'); },
1707          'Saturday- Feb 3, 2001 - DD, MM d, yy', 'Unexpected literal at position 8');
1708      expectError(function() { $.datepicker.parseDate('\'day\' d \'of\' MM (\'\'DD\'\'), yy',
1709          'day 3 of February ("Saturday"), 2001'); },
1710          'day 3 of Mon2 ("Day7"), 2001', 'Unexpected literal at position 19');
1711      expectError(function() { $.datepicker.parseDate('d m y', '29 2 01'); },
1712          '29 2 01 - d m y', 'Invalid date');
1713      var fr = $.datepicker.regional['fr'];
1714      var settings = {dayNamesShort: fr.dayNamesShort, dayNames: fr.dayNames,
1715          monthNamesShort: fr.monthNamesShort, monthNames: fr.monthNames};
1716      expectError(function() { $.datepicker.parseDate('D d M y', 'Mon 9 Avr 01', settings); },
1717          'Mon 9 Avr 01 - D d M y', 'Unknown name at position 0');
1718      expectError(function() { $.datepicker.parseDate('D d M y', 'Lun 9 Apr 01', settings); },
1719          'Lun 9 Apr 01 - D d M y', 'Unknown name at position 6');
1720  });
1721  
1722  test('formatDate', function() {
1723      init('#inp');
1724      equals($.datepicker.formatDate('d m y', new Date(2001, 2 - 1, 3)),
1725          '3 2 01', 'Format date d m y');
1726      equals($.datepicker.formatDate('dd mm yy', new Date(2001, 2 - 1, 3)),
1727          '03 02 2001', 'Format date dd mm yy');
1728      equals($.datepicker.formatDate('d m y', new Date(2001, 12 - 1, 13)),
1729          '13 12 01', 'Format date d m y');
1730      equals($.datepicker.formatDate('dd mm yy', new Date(2001, 12 - 1, 13)),
1731          '13 12 2001', 'Format date dd mm yy');
1732      equals($.datepicker.formatDate('yy-o', new Date(2001, 2 - 1, 3)),
1733          '2001-34', 'Format date yy-o');
1734      equals($.datepicker.formatDate('yy-oo', new Date(2001, 2 - 1, 3)),
1735          '2001-034', 'Format date yy-oo');
1736      equals($.datepicker.formatDate('D M y', new Date(2001, 2 - 1, 3)),
1737          'Sat Feb 01', 'Format date D M y');
1738      equals($.datepicker.formatDate('DD MM yy', new Date(2001, 2 - 1, 3)),
1739          'Saturday February 2001', 'Format date DD MM yy');
1740      equals($.datepicker.formatDate('DD, MM d, yy', new Date(2001, 2 - 1, 3)),
1741          'Saturday, February 3, 2001', 'Format date DD, MM d, yy');
1742      equals($.datepicker.formatDate('\'day\' d \'of\' MM (\'\'DD\'\'), yy',
1743          new Date(2001, 2 - 1, 3)), 'day 3 of February (\'Saturday\'), 2001',
1744          'Format date \'day\' d \'of\' MM (\'\'DD\'\'), yy');
1745      var fr = $.datepicker.regional['fr'];
1746      var settings = {dayNamesShort: fr.dayNamesShort, dayNames: fr.dayNames,
1747          monthNamesShort: fr.monthNamesShort, monthNames: fr.monthNames};
1748      equals($.datepicker.formatDate('D M y', new Date(2001, 4 - 1, 9), settings),
1749          'Lun Avr 01', 'Format date D M y with settings');
1750      equals($.datepicker.formatDate('DD MM yy', new Date(2001, 4 - 1, 9), settings),
1751          'Lundi Avril 2001', 'Format date DD MM yy with settings');
1752      equals($.datepicker.formatDate('DD, MM d, yy', new Date(2001, 4 - 1, 9), settings),
1753          'Lundi, Avril 9, 2001', 'Format date DD, MM d, yy with settings');
1754      equals($.datepicker.formatDate('\'jour\' d \'de\' MM (\'\'DD\'\'), yy',
1755          new Date(2001, 4 - 1, 9), settings), 'jour 9 de Avril (\'Lundi\'), 2001',
1756          'Format date \'jour\' d \'de\' MM (\'\'DD\'\'), yy with settings');
1757  });
1758  
1759  })(jQuery);


Generated: Thu Mar 24 11:18:33 2011 Cross-referenced by PHPXref 0.7