in src/Clients/Web/winjs/js/winjs.js [75088:75208]
_keyDownHandler: function NavBarContainer_keyDownHandler(ev) {
var keyCode = ev.keyCode;
if (!ev.altKey && (keyCode === Key.pageUp || keyCode === Key.pageDown)) {
var srcElement = ev.target;
if (_ElementUtilities._matchesSelector(srcElement, ".win-interactive, .win-interactive *")) {
return;
}
var index = this._keyboardBehavior.currentIndex;
this._measure();
var sizes = this._sizes;
var page = Math.floor(index / (sizes.columnsPerPage * sizes.rowsPerPage));
var scrollPositionTarget = null;
if (keyCode === Key.pageUp) {
if (this.layout === _UI.Orientation.horizontal) {
var indexOfFirstItemOnPage = page * sizes.columnsPerPage * sizes.rowsPerPage;
if (index === indexOfFirstItemOnPage && this._surfaceEl.children[index].winControl._buttonEl === _Global.document.activeElement) {
// First item on page so go back 1 page.
index = index - sizes.columnsPerPage * sizes.rowsPerPage;
} else {
// Not first item on page so go to the first item on page.
index = indexOfFirstItemOnPage;
}
} else {
var currentItem = this._surfaceEl.children[index];
var top = currentItem.offsetTop;
var bottom = top + currentItem.offsetHeight;
var scrollPosition = this._zooming ? this._zoomPosition : this._scrollPosition;
if (top >= scrollPosition && bottom < scrollPosition + sizes.viewportOffsetHeight) {
// current item is fully on screen.
while (index > 0 &&
this._surfaceEl.children[index - 1].offsetTop > scrollPosition) {
index--;
}
}
if (this._keyboardBehavior.currentIndex === index) {
var scrollPositionForOnePageAboveItem = bottom - sizes.viewportOffsetHeight;
index = Math.max(0, index - 1);
while (index > 0 &&
this._surfaceEl.children[index - 1].offsetTop > scrollPositionForOnePageAboveItem) {
index--;
}
if (index > 0) {
scrollPositionTarget = this._surfaceEl.children[index].offsetTop - this._sizes.itemMarginTop;
} else {
scrollPositionTarget = 0;
}
}
}
index = Math.max(index, 0);
this._keyboardBehavior.currentIndex = index;
var element = this._surfaceEl.children[index].winControl._buttonEl;
if (scrollPositionTarget !== null) {
this._scrollTo(scrollPositionTarget);
}
_ElementUtilities._setActive(element, this._viewportEl);
} else {
if (this.layout === _UI.Orientation.horizontal) {
var indexOfLastItemOnPage = (page + 1) * sizes.columnsPerPage * sizes.rowsPerPage - 1;
if (index === indexOfLastItemOnPage) {
// Last item on page so go forward 1 page.
index = index + sizes.columnsPerPage * sizes.rowsPerPage;
} else {
// Not Last item on page so go to last item on page.
index = indexOfLastItemOnPage;
}
} else {
var currentItem = this._surfaceEl.children[this._keyboardBehavior.currentIndex];
var top = currentItem.offsetTop;
var bottom = top + currentItem.offsetHeight;
var scrollPosition = this._zooming ? this._zoomPosition : this._scrollPosition;
if (top >= scrollPosition && bottom < scrollPosition + sizes.viewportOffsetHeight) {
// current item is fully on screen.
while (index < this._surfaceEl.children.length - 1 &&
this._surfaceEl.children[index + 1].offsetTop + this._surfaceEl.children[index + 1].offsetHeight < scrollPosition + sizes.viewportOffsetHeight) {
index++;
}
}
if (index === this._keyboardBehavior.currentIndex) {
var scrollPositionForOnePageBelowItem = top + sizes.viewportOffsetHeight;
index = Math.min(this._surfaceEl.children.length - 1, index + 1);
while (index < this._surfaceEl.children.length - 1 &&
this._surfaceEl.children[index + 1].offsetTop + this._surfaceEl.children[index + 1].offsetHeight < scrollPositionForOnePageBelowItem) {
index++;
}
if (index < this._surfaceEl.children.length - 1) {
scrollPositionTarget = this._surfaceEl.children[index + 1].offsetTop - this._sizes.viewportOffsetHeight;
} else {
scrollPositionTarget = this._scrollLength - this._sizes.viewportOffsetHeight;
}
}
}
index = Math.min(index, this._surfaceEl.children.length - 1);
this._keyboardBehavior.currentIndex = index;
var element = this._surfaceEl.children[index].winControl._buttonEl;
if (scrollPositionTarget !== null) {
this._scrollTo(scrollPositionTarget);
}
try {
_ElementUtilities._setActive(element, this._viewportEl);
} catch (e) {
}
}
}
},