module('Mouse Navigation 2012', {

setup: function(){
    /*
        Tests start with picker on March 31, 2012.  Fun facts:

        * February 1, 2012 was on a Wednesday
        * February 29, 2012 was on a Wednesday
        * March 1, 2012 was on a Thursday
        * March 31, 2012 was on a Saturday
    */
    this.input = $('<input type="text" value="31-03-2012">')
                    .appendTo('#qunit-fixture')
                    .datepicker({format: "dd-mm-yyyy"})
                    .focus(); // Activate for visibility checks
    this.dp = this.input.data('datepicker');
    this.picker = this.dp.picker;
},
teardown: function(){
    this.picker.remove();
}

});

test('Selecting date resets viewDate and date', function(){

var target;

// Rendered correctly
equal(this.dp.viewMode, 0);
target = this.picker.find('.datepicker-days tbody td:nth(7)');
equal(target.text(), '4'); // Should be Mar 4

// Updated internally on click
target.click();
datesEqual(this.dp.viewDate, UTCDate(2012, 2, 4));
datesEqual(this.dp.dates.get(-1), UTCDate(2012, 2, 4));

// Re-rendered on click
target = this.picker.find('.datepicker-days tbody td:first');
equal(target.text(), '26'); // Should be Feb 29

});

test('Navigating next/prev by month', function(){

var target;

equal(this.dp.viewMode, 0);
target = this.picker.find('.datepicker-days thead th.prev');
ok(target.is(':visible'), 'Month:prev nav is visible');

// Updated internally on click
target.click();
// Should handle month-length changes gracefully
datesEqual(this.dp.viewDate, UTCDate(2012, 1, 29));
datesEqual(this.dp.dates.get(-1), UTCDate(2012, 2, 31));

// Re-rendered on click
target = this.picker.find('.datepicker-days tbody td:first');
equal(target.text(), '29'); // Should be Jan 29

target = this.picker.find('.datepicker-days thead th.next');
ok(target.is(':visible'), 'Month:next nav is visible');

// Updated internally on click
target.click().click();
// Graceful moonth-end handling carries over
datesEqual(this.dp.viewDate, UTCDate(2012, 3, 29));
datesEqual(this.dp.dates.get(-1), UTCDate(2012, 2, 31));

// Re-rendered on click
target = this.picker.find('.datepicker-days tbody td:first');
equal(target.text(), '25'); // Should be Mar 25
// (includes "old" days at start of month, even if that's all the first week-row consists of)

});

test('Navigating to/from year view', function(){

var target;

equal(this.dp.viewMode, 0);
target = this.picker.find('.datepicker-days thead th.datepicker-switch');
ok(target.is(':visible'), 'View switcher is visible');

target.click();
ok(this.picker.find('.datepicker-months').is(':visible'), 'Month picker is visible');
equal(this.dp.viewMode, 1);
// Not modified when switching modes
datesEqual(this.dp.viewDate, UTCDate(2012, 2, 31));
datesEqual(this.dp.dates.get(-1), UTCDate(2012, 2, 31));

// Change months to test internal state
target = this.picker.find('.datepicker-months tbody span:contains(Apr)');
target.click();
equal(this.dp.viewMode, 0);
// Only viewDate modified
datesEqual(this.dp.viewDate, UTCDate(2012, 3, 1)); // Apr 30
datesEqual(this.dp.dates.get(-1), UTCDate(2012, 2, 31));

});

test('Navigating to/from decade view', function(){

var target;

equal(this.dp.viewMode, 0);
target = this.picker.find('.datepicker-days thead th.datepicker-switch');
ok(target.is(':visible'), 'View switcher is visible');

target.click();
ok(this.picker.find('.datepicker-months').is(':visible'), 'Month picker is visible');
equal(this.dp.viewMode, 1);
// Not modified when switching modes
datesEqual(this.dp.viewDate, UTCDate(2012, 2, 31));
datesEqual(this.dp.dates.get(-1), UTCDate(2012, 2, 31));

target = this.picker.find('.datepicker-months thead th.datepicker-switch');
ok(target.is(':visible'), 'View switcher is visible');

target.click();
ok(this.picker.find('.datepicker-years').is(':visible'), 'Year picker is visible');
equal(this.dp.viewMode, 2);
// Not modified when switching modes
datesEqual(this.dp.viewDate, UTCDate(2012, 2, 31));
datesEqual(this.dp.dates.get(-1), UTCDate(2012, 2, 31));

// Change years to test internal state changes
target = this.picker.find('.datepicker-years tbody span:contains(2011)');
target.click();
equal(this.dp.viewMode, 1);
// Only viewDate modified
datesEqual(this.dp.viewDate, UTCDate(2011, 2, 1));
datesEqual(this.dp.dates.get(-1), UTCDate(2012, 2, 31));

target = this.picker.find('.datepicker-months tbody span:contains(Apr)');
target.click();
equal(this.dp.viewMode, 0);
// Only viewDate modified
datesEqual(this.dp.viewDate, UTCDate(2011, 3, 1));
datesEqual(this.dp.dates.get(-1), UTCDate(2012, 2, 31));

});

test('Navigating prev/next in year view', function(){

var target;

equal(this.dp.viewMode, 0);
target = this.picker.find('.datepicker-days thead th.datepicker-switch');
ok(target.is(':visible'), 'View switcher is visible');

target.click();
ok(this.picker.find('.datepicker-months').is(':visible'), 'Month picker is visible');
equal(this.dp.viewMode, 1);
equal(this.picker.find('.datepicker-months thead th.datepicker-switch').text(), '2012');
// Not modified when switching modes
datesEqual(this.dp.viewDate, UTCDate(2012, 2, 31));
datesEqual(this.dp.dates.get(-1), UTCDate(2012, 2, 31));

// Go to next year (2013)
target = this.picker.find('.datepicker-months thead th.next');
target.click();
equal(this.picker.find('.datepicker-months thead th.datepicker-switch').text(), '2013');
// Only viewDate modified
datesEqual(this.dp.viewDate, UTCDate(2013, 2, 31));
datesEqual(this.dp.dates.get(-1), UTCDate(2012, 2, 31));

// Go to prev year (x2 == 2011)
target = this.picker.find('.datepicker-months thead th.prev');
target.click().click();
equal(this.picker.find('.datepicker-months thead th.datepicker-switch').text(), '2011');
// Only viewDate modified
datesEqual(this.dp.viewDate, UTCDate(2011, 2, 31));
datesEqual(this.dp.dates.get(-1), UTCDate(2012, 2, 31));

});

test('Navigating prev/next in decade view', function(){

var target;

equal(this.dp.viewMode, 0);
target = this.picker.find('.datepicker-days thead th.datepicker-switch');
ok(target.is(':visible'), 'View switcher is visible');

target.click();
ok(this.picker.find('.datepicker-months').is(':visible'), 'Month picker is visible');
equal(this.dp.viewMode, 1);
// Not modified when switching modes
datesEqual(this.dp.viewDate, UTCDate(2012, 2, 31));
datesEqual(this.dp.dates.get(-1), UTCDate(2012, 2, 31));

target = this.picker.find('.datepicker-months thead th.datepicker-switch');
ok(target.is(':visible'), 'View switcher is visible');

target.click();
ok(this.picker.find('.datepicker-years').is(':visible'), 'Year picker is visible');
equal(this.dp.viewMode, 2);
equal(this.picker.find('.datepicker-years thead th.datepicker-switch').text(), '2010-2019');
// Not modified when switching modes
datesEqual(this.dp.viewDate, UTCDate(2012, 2, 31));
datesEqual(this.dp.dates.get(-1), UTCDate(2012, 2, 31));

// Go to next decade (2020-29)
target = this.picker.find('.datepicker-years thead th.next');
target.click();
equal(this.picker.find('.datepicker-years thead th.datepicker-switch').text(), '2020-2029');
// Only viewDate modified
datesEqual(this.dp.viewDate, UTCDate(2022, 2, 31));
datesEqual(this.dp.dates.get(-1), UTCDate(2012, 2, 31));

// Go to prev year (x2 == 2000-09)
target = this.picker.find('.datepicker-years thead th.prev');
target.click().click();
equal(this.picker.find('.datepicker-years thead th.datepicker-switch').text(), '2000-2009');
// Only viewDate modified
datesEqual(this.dp.viewDate, UTCDate(2002, 2, 31));
datesEqual(this.dp.dates.get(-1), UTCDate(2012, 2, 31));

});

test('Selecting date from previous month resets viewDate and date, changing month displayed', function(){

var target;

// Rendered correctly
equal(this.dp.viewMode, 0);
target = this.picker.find('.datepicker-days tbody td:first');
equal(target.text(), '26'); // Should be Feb 26
equal(this.picker.find('.datepicker-days thead th.datepicker-switch').text(), 'March 2012');

// Updated internally on click
target.click();
equal(this.picker.find('.datepicker-days thead th.datepicker-switch').text(), 'February 2012');
datesEqual(this.dp.viewDate, UTCDate(2012, 1, 26));
datesEqual(this.dp.dates.get(-1), UTCDate(2012, 1, 26));

// Re-rendered on click
target = this.picker.find('.datepicker-days tbody td:first');
equal(target.text(), '29'); // Should be Jan 29

});

test('Selecting date from next month resets viewDate and date, changing month displayed', function(){

var target;

this.input.val('01-04-2012');
this.dp.update();

// Rendered correctly
equal(this.dp.viewMode, 0);
target = this.picker.find('.datepicker-days tbody td:last');
equal(target.text(), '5'); // Should be May 5
equal(this.picker.find('.datepicker-days thead th.datepicker-switch').text(), 'April 2012');

// Updated internally on click
target.click();
equal(this.picker.find('.datepicker-days thead th.datepicker-switch').text(), 'May 2012');
datesEqual(this.dp.viewDate, UTCDate(2012, 4, 5));
datesEqual(this.dp.dates.get(-1), UTCDate(2012, 4, 5));

// Re-rendered on click
target = this.picker.find('.datepicker-days tbody td:first');
equal(target.text(), '29'); // Should be Apr 29

});

test('Selecting today from next month', patch_date(function(Date){

var target;
this.dp.o.todayHighlight = true;
Date.now = new Date(2012, 2, 3); // Mar 3
this.input.val('01-02-2012');    // Feb 1
this.dp.update();

// Click the today button
target = this.picker.find('.datepicker-days tbody td.today');
equal(target.text(), '3'); // Should be Mar 3
target.click();

datesEqual(this.dp.viewDate, UTCDate(2012, 2, 3));

}));