New: both horizontal zooming and vertical zoom work with the same points

Long story short is that this makes the non-primary widthLeftOfPages/heightAbovePages mirror pageTop/LeftOffsets, but I'll fix this in a later commit.

-Added pageBefore/AfterViewport functions that automatically determine which is correct to use

-gotoPageTop preps values for new implementation of gotoPage correctly

-gotoPage treats both dimensions as "primary" - values passed to gotoPage must be the amount of pixels into the page desired to be the centre of the Diva viewport.

-changed heightAbove/widthLeftOfPages as described in first line of message

-handleZoom matches above math as well

-moved x/y hashparam parsing to a different location so an if/else could be chained off it to prep the initial load correctly
Fixed: scrolling offset position is maintained when toggling between grid/fullscreen and regular view

-added spaces to meet DDMAL formatting

-vertical/horizontal offset is saved after every scroll event

-does not work in horizontal scrolling mode, however - will be fixed in later commit
Fixed: reverted last change; full screen mode toggling now retains scroll position

-settings.oldZoomLevel is now initialized in loadDocument - I wanted to do it earlier but it is used to see if this is the first page load

-reverted changes from last commit as they were only for a very specific use case. returning from grid view now returns to the left-most grid page regardless; added lines in 1194-1197 serve to make sure the page is top-justified rather than venter-justified.

-handleModeChange (fullscreen toggle) now saves position and loads it correctly into the fullscreen viewer; same for returning.
Fixed: toggling between grid to horizontal offset maintains display correctly

-top/leftScrollSoFar manually set in gotoRow to make sure isVerticallyInViewport is calculated correctly

-made settings.inGrid simulate verticallyOriented == true when verticallyOriented == false