<!DOCTYPE html>
<html>
<head>
<script src="../../../resources/js-test.js"></script>
<script src="../../../resources/gesture-util.js"></script>
<script src="../../forms/resources/common.js"></script>
<script src="../../forms/resources/common-wheel-event.js"></script>
<script src="../../forms/resources/picker-common.js"></script>
<script src="resources/suggestion-picker-common.js"></script>
</head>
<body style="background-color: #bbbbbb;">
<p id="description"></p>
<div id="console"></div>
<input type=date id=date value="2012-12-24" list=suggestions>
<datalist id=suggestions>
    <option label="Today">2012-01-01</option>
    <option label="Tomorrow">2012-01-02</option>
    <option>2012-01-03</option>
    <option>2012-01-04</option>
    <option>2012-01-05</option>
    <option>2012-01-06</option>
    <option>2012-01-07</option>
    <option>2012-01-08</option>
    <option>2012-01-09</option>
    <option>2012-01-10</option>
    <option>2012-01-11</option>
    <option>2012-01-12</option>
    <option>2012-01-13</option>
    <option>2012-01-14</option>
    <option>2012-01-15</option>
    <option>2012-01-16</option>
    <option>2012-01-17</option>
    <option>2012-01-18</option>
    <option>2012-01-19</option>
    <option>2012-01-20</option>
    <option label="-">2012-01-21</option>
    <option>2012-01-22</option>
    <option>2012-01-23</option>
    <option>2012-01-24</option>
    <option>2012-01-25</option>
    <option>2012-01-26</option>
    <option>2012-01-27</option>
    <option>2012-01-28</option>
    <option>2012-01-29</option>
    <option>2012-01-30</option>
    <option>2012-01-31</option>
    <option>2012-02-01</option>
    <option>2012-02-02</option>
    <option>2012-02-03</option>
    <option>2012-02-04</option>
    <option>2012-02-05</option>
    <option>2012-02-06</option>
    <option>2012-02-07</option>
    <option>2012-02-08</option>
    <option>2012-02-09</option>
    <option label="-">2012-02-10</option>
    <option>2012-02-11</option>
    <option>2012-02-12</option>
    <option>2012-02-13</option>
    <option>2012-02-14</option>
    <option>2012-02-15</option>
    <option>2012-02-16</option>
    <option>2012-02-17</option>
    <option>2012-02-18</option>
    <option>2012-02-19</option>
    <option>2012-02-20</option>
    <option>2012-02-21</option>
    <option>2012-02-22</option>
    <option>2012-02-23</option>
    <option>2012-02-24</option>
    <option>2012-02-25</option>
    <option>2012-02-26</option>
    <option>2012-02-27</option>
    <option>2012-02-28</option>
    <option>2012-02-29</option>
    <option>2012-03-01</option>
    <option>2012-03-02</option>
    <option>2012-03-03</option>
    <option>2012-03-04</option>
    <option>2012-03-05</option>
    <option>2012-03-06</option>
    <option>2012-03-07</option>
    <option>2012-03-08</option>
    <option>2012-01-00</option> <!--invalid-->
    <option>foo</option> <!--invalid-->
</datalist>
<script>

debug('Check that page popup doesn\'t exist at first.');
shouldBeNull('$("mock-page-popup")');

window.onload = function() {
    if (window.internals)
        internals.settings.setScrollAnimatorEnabled(false);
    openPicker($('date'), test1);
};

function test1() {
    debug('Check that page popup exists.');
    shouldBeEqualToString('popupWindow.pagePopupController.toString()', '[object PagePopupController]');

    debug('Check that hovering over an entry highlights it.');
    hoverOverElement(popupWindow.document.querySelector(".suggestion-list-entry:nth-child(2)"));
    shouldBeEqualToString('highlightedEntry()', '2012-01-02');

    debug('Check that moving the mouse outside the popup de-highlights entries.');
    hoverOverElement(document.getElementById('description'));
    shouldBeNull('highlightedEntry()');

    debug('Check that mouse click closes the popup and sets the value.');
    clickElement(popupWindow.document.querySelector(".suggestion-list-entry:nth-child(3)"));
    waitUntilClosing(test1AfterClosing);
}

function test1AfterClosing() {
    shouldBeNull('$("mock-page-popup")');
    shouldBeEqualToString('document.getElementById("date").value', '2012-01-03');

    openPicker($('date'), test2);
}

var scrollTopBeforeWheelEvent = 0;
var scrollTopAfterWheelEvent = 0;
var suggestionList;

function test2() {
    suggestionList = popupWindow.document.getElementsByClassName("suggestion-list")[0];

    debug('Check that you can scroll using the mouse wheel.');

    function finishTest() {
        popupWindow.focus();
        eventSender.keyDown('Escape');
        waitUntilClosing(test2AfterClosing);
    }

    async function scrollUp() {
        scrollTopBeforeWheelEvent = suggestionList.scrollTop;
        await dispatchWheelEvent(suggestionList, 0, -3);
        await waitFor(() => {
            return scrollTopBeforeWheelEvent > suggestionList.scrollTop});
        shouldBecomeEqual('scrollTopBeforeWheelEvent > suggestionList.scrollTop', 'true', finishTest);
    }

    async function scrollDown() {
        scrollTopBeforeWheelEvent = suggestionList.scrollTop;
        await dispatchWheelEvent(suggestionList, 0, 3);
        await waitFor(() => {
            return scrollTopBeforeWheelEvent < suggestionList.scrollTop});
        shouldBecomeEqual('scrollTopBeforeWheelEvent < suggestionList.scrollTop', 'true', scrollUp);
    }

    scrollDown();
}

function test2AfterClosing() {
    shouldBeNull('$("mock-page-popup")');

    openPicker($('date'), test3);
}

function test3() {
    debug('Check that you can scroll using the scroll bar.');

    var suggestionList = popupWindow.document.getElementsByClassName("suggestion-list")[0];
    var suggestionListOffset = cumulativeOffset(suggestionList);
    var scrollbarCenterX = suggestionListOffset[0] + suggestionList.offsetWidth - popupWindow.getScrollbarWidth() / 2;

    scrollTopBeforeWheelEvent = suggestionList.scrollTop;
    eventSender.mouseMoveTo(scrollbarCenterX, suggestionListOffset[1] + 20); // 20 is the height of the up arrow button plus a few pixels
    eventSender.mouseDown();
    eventSender.mouseMoveTo(scrollbarCenterX, suggestionListOffset[1] + suggestionList.offsetHeight);
    eventSender.mouseUp();
    requestAnimationFrame(function() {
        scrollTopAfterWheelEvent = suggestionList.scrollTop;
        shouldBeTrue('scrollTopBeforeWheelEvent < scrollTopAfterWheelEvent');

        finishJSTest();
    });
}

</script>
</body>
</html>
