annotate src/main/webapp/imageServer/resources/js/vendor/diva-old.js @ 203:719475ad0923 iiif_diva

more work on new diva.js in imageServer
author casties
date Fri, 05 Jul 2019 16:05:57 +0200
parents src/main/webapp/imageServer/resources/js/diva.js@764f47286679
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
7
jurzua
parents:
diff changeset
1 window.divaPlugins = [];
jurzua
parents:
diff changeset
2
jurzua
parents:
diff changeset
3 // this pattern was taken from http://www.virgentech.com/blog/2009/10/building-object-oriented-jquery-plugin.html
jurzua
parents:
diff changeset
4 (function ($)
jurzua
parents:
diff changeset
5 {
jurzua
parents:
diff changeset
6 var Diva = function (element, options)
jurzua
parents:
diff changeset
7 {
jurzua
parents:
diff changeset
8 // These are elements that can be overridden upon instantiation
jurzua
parents:
diff changeset
9 // See https://github.com/DDMAL/diva.js/wiki/Code-documentation for more details
jurzua
parents:
diff changeset
10 var defaults = {
jurzua
parents:
diff changeset
11 adaptivePadding: 0.05, // The ratio of padding to the page dimension
jurzua
parents:
diff changeset
12 blockMobileMove: true, // Prevent moving or scrolling the page on mobile devices
jurzua
parents:
diff changeset
13 contained: false, // Determines the location of the fullscreen icon
jurzua
parents:
diff changeset
14 objectData: '', // URL to the JSON file that provides the object dimension data - *MANDATORY*
jurzua
parents:
diff changeset
15 enableAutoHeight: false, // Automatically adjust height based on the window size
jurzua
parents:
diff changeset
16 enableAutoTitle: true, // Shows the title within a div of id diva-title
jurzua
parents:
diff changeset
17 enableAutoWidth: true, // Automatically adjust width based on the window size
jurzua
parents:
diff changeset
18 enableCanvas: true, // Used for the canvas plugin
jurzua
parents:
diff changeset
19 enableDownload: true, // Used for the download plugin
jurzua
parents:
diff changeset
20 enableFilename: true, // Uses filenames and not page numbers for links (i=bm_001.tif, not p=1)
jurzua
parents:
diff changeset
21 enableFullscreen: true, // Enable or disable fullscreen icon (mode still available)
jurzua
parents:
diff changeset
22 enableGotoPage: true, // A "go to page" jump box
jurzua
parents:
diff changeset
23 enableGridIcon: true, // A grid view of all the pages
jurzua
parents:
diff changeset
24 enableGridSlider: true, // Slider to control the pages per grid row
jurzua
parents:
diff changeset
25 enableKeyScroll: true, // Scrolling using the page up/down keys
jurzua
parents:
diff changeset
26 enableLinkIcon: true, // Controls the visibility of the link icon
jurzua
parents:
diff changeset
27 enableSpaceScroll: false, // Scrolling down by pressing the space key
jurzua
parents:
diff changeset
28 enableToolbar: true, // Enables the toolbar. Note that disabling this means you have to handle all controls yourself.
jurzua
parents:
diff changeset
29 enableZoomSlider: true, // Enable or disable the zoom slider (for zooming in and out)
jurzua
parents:
diff changeset
30 fixedPadding: 10, // Fallback if adaptive padding is set to 0
jurzua
parents:
diff changeset
31 fixedHeightGrid: true, // So each page in grid view has the same height (only widths differ)
jurzua
parents:
diff changeset
32 goDirectlyTo: 0, // Default initial page to show (0-indexed)
jurzua
parents:
diff changeset
33 iipServerURL: '', // The URL to the IIPImage installation, including the `?FIF=` - *MANDATORY*
jurzua
parents:
diff changeset
34 inFullscreen: false, // Set to true to load fullscreen mode initially
jurzua
parents:
diff changeset
35 inGrid: false, // Set to true to load grid view initially
jurzua
parents:
diff changeset
36 imageDir: '', // Image directory, either absolute path or relative to IIP's FILESYSTEM_PREFIX - *MANDATORY*
jurzua
parents:
diff changeset
37 maxPagesPerRow: 8, // Maximum number of pages per row, grid view
jurzua
parents:
diff changeset
38 maxZoomLevel: -1, // Optional; defaults to the max zoom returned in the JSON response
jurzua
parents:
diff changeset
39 minPagesPerRow: 2, // 2 for the spread view. Recommended to leave it
jurzua
parents:
diff changeset
40 minZoomLevel: 0, // Defaults to 0 (the minimum zoom)
jurzua
parents:
diff changeset
41 onDocumentLoaded: null, // Callback function for when the document is fully loaded
jurzua
parents:
diff changeset
42 onModeToggle: null, // Callback for toggling fullscreen mode
jurzua
parents:
diff changeset
43 onViewToggle: null, // Callback for switching between grid and document view
jurzua
parents:
diff changeset
44 onJump: null, // Callback function for jumping to a specific page (using the gotoPage feature)
jurzua
parents:
diff changeset
45 onPageLoad: null, // Callback function for loading pages
jurzua
parents:
diff changeset
46 onPageLoaded: null, // Callback function for after the page has been loaded
jurzua
parents:
diff changeset
47 onReady: null, // Callback function for initial load
jurzua
parents:
diff changeset
48 onScroll: null, // Callback function for scrolling
jurzua
parents:
diff changeset
49 onScrollDown: null, // Callback function for scrolling down, only
jurzua
parents:
diff changeset
50 onScrollUp: null, // Callback function for scrolling up only
jurzua
parents:
diff changeset
51 onSetCurrentPage: null, // Callback function for when the current page is set
jurzua
parents:
diff changeset
52 onZoom: null, // Callback function for zooming in general
jurzua
parents:
diff changeset
53 onZoomIn: null, // Callback function for zooming in only
jurzua
parents:
diff changeset
54 onZoomOut: null, // Callback function for zooming out only
jurzua
parents:
diff changeset
55 pageLoadTimeout: 200, // Number of milliseconds to wait before loading pages
jurzua
parents:
diff changeset
56 pagesPerRow: 5, // The default number of pages per row in grid view
jurzua
parents:
diff changeset
57 rowLoadTimeout: 50, // Number of milliseconds to wait before loading a row
jurzua
parents:
diff changeset
58 throbberTimeout: 100, // Number of milliseconds to wait before showing throbber
jurzua
parents:
diff changeset
59 tileHeight: 256, // The height of each tile, in pixels; usually 256
jurzua
parents:
diff changeset
60 tileWidth: 256, // The width of each tile, in pixels; usually 256
jurzua
parents:
diff changeset
61 toolbarParentSelector: null, // The toolbar parent selector. If null, it defaults to the primary diva element. Must be a jQuery selector (leading '#')
jurzua
parents:
diff changeset
62 viewerHeightPadding: 15, // Vertical padding when resizing the viewer, if enableAutoHeight is set
jurzua
parents:
diff changeset
63 viewerWidthPadding: 30, // Horizontal padding when resizing the viewer, if enableAutoHeight is set
jurzua
parents:
diff changeset
64 viewportMargin: 200, // Pretend tiles +/- 200px away from viewport are in
jurzua
parents:
diff changeset
65 zoomLevel: 2 // The initial zoom level (used to store the current zoom level)
jurzua
parents:
diff changeset
66 };
jurzua
parents:
diff changeset
67
jurzua
parents:
diff changeset
68 // Apply the defaults, or override them with passed-in options.
jurzua
parents:
diff changeset
69 var settings = $.extend({}, defaults, options);
jurzua
parents:
diff changeset
70
jurzua
parents:
diff changeset
71 // Things that cannot be changed because of the way they are used by the script
jurzua
parents:
diff changeset
72 // Many of these are declared with arbitrary values that are changed later on
jurzua
parents:
diff changeset
73 var globals = {
jurzua
parents:
diff changeset
74 allTilesLoaded: [], // A boolean for each page, indicating if all tiles have been loaded
jurzua
parents:
diff changeset
75 averageHeights: [], // The average page height for each zoom level
jurzua
parents:
diff changeset
76 averageWidths: [], // The average page width for each zoom level
jurzua
parents:
diff changeset
77 currentPageIndex: 0, // The current page in the viewport (center-most page)
jurzua
parents:
diff changeset
78 dimAfterZoom: 0, // Used for storing the item dimensions after zooming
jurzua
parents:
diff changeset
79 firstPageLoaded: -1, // The ID of the first page loaded (value set later)
jurzua
parents:
diff changeset
80 firstRowLoaded: -1, // The index of the first row loaded
jurzua
parents:
diff changeset
81 gridPageWidth: 0, // Holds the max width of each row in grid view. Calculated in loadGrid()
jurzua
parents:
diff changeset
82 hashParamSuffix: '', // Used when there are multiple document viewers on a page
jurzua
parents:
diff changeset
83 heightAbovePages: [], // The height above each page at the current zoom level
jurzua
parents:
diff changeset
84 horizontalOffset: 0, // Used in documentScroll for scrolling more precisely
jurzua
parents:
diff changeset
85 horizontalPadding: 0, // Either the fixed padding or adaptive padding
jurzua
parents:
diff changeset
86 ID: null, // The prefix of the IDs of the elements (usually 1-diva-)
jurzua
parents:
diff changeset
87 innerSelector: '', // settings.selector + 'inner', for selecting the .diva-inner element
jurzua
parents:
diff changeset
88 itemTitle: '', // The title of the document
jurzua
parents:
diff changeset
89 lastPageLoaded: -1, // The ID of the last page loaded (value set later)
jurzua
parents:
diff changeset
90 lastRowLoaded: -1, // The index of the last row loaded
jurzua
parents:
diff changeset
91 leftScrollSoFar: 0, // Current scroll from the left edge of the pane
jurzua
parents:
diff changeset
92 loaded: false, // A flag for when everything is loaded and ready to go.
jurzua
parents:
diff changeset
93 maxWidths: [], // The width of the widest page for each zoom level
jurzua
parents:
diff changeset
94 maxRatio: 0, // The max height/width ratio (for grid view)
jurzua
parents:
diff changeset
95 minHeight: 0, // Minimum height of the .diva-outer element, as defined in the CSS
jurzua
parents:
diff changeset
96 minRatio: 0, // The minimum height/width ratio for a page
jurzua
parents:
diff changeset
97 minWidth: 0, // Minimum width of the .diva-outer element, as defined in the CSS
jurzua
parents:
diff changeset
98 mobileWebkit: false, // Checks if the user is on a touch device (iPad/iPod/iPhone/Android)
jurzua
parents:
diff changeset
99 numPages: 0, // Number of pages in the array
jurzua
parents:
diff changeset
100 numRows: 0, // Number of rows
jurzua
parents:
diff changeset
101 oldPagesPerRow: 0, // Holds the previous number of pages per row after it is changed
jurzua
parents:
diff changeset
102 oldZoomLevel: -1, // Holds the previous zoom level after zooming in or out
jurzua
parents:
diff changeset
103 orientationChange: false, // For handling device orientation changes for touch devices
jurzua
parents:
diff changeset
104 originalHeight: 0, // Stores the original height of the .diva-outer element
jurzua
parents:
diff changeset
105 originalWidth: 0, // Stores the original width of the .diva-outer element
jurzua
parents:
diff changeset
106 outerSelector: '', // settings.selector + 'outer', for selecting the .diva-outer element
jurzua
parents:
diff changeset
107 pages: [], // An array containing the data for all the pages
jurzua
parents:
diff changeset
108 pageLeftOffsets: [], // Offset from the left side of the pane to the edge of the page
jurzua
parents:
diff changeset
109 pageTimeouts: [], // Stack to hold the loadPage timeouts
jurzua
parents:
diff changeset
110 pageTools: '', // The string for page tools
jurzua
parents:
diff changeset
111 panelHeight: 0, // Height of the document viewer pane
jurzua
parents:
diff changeset
112 panelWidth: 0, // Width of the document viewer pane
jurzua
parents:
diff changeset
113 plugins: [], // Filled with the enabled plugins from window.divaPlugins
jurzua
parents:
diff changeset
114 previousTopScroll: 0, // Used to determine vertical scroll direction
jurzua
parents:
diff changeset
115 preZoomOffset: null, // Holds the offset prior to zooming when double-clicking
jurzua
parents:
diff changeset
116 realMaxZoom: -1, // To hold the true max zoom level of the document (needed for calculations)
jurzua
parents:
diff changeset
117 resizeTimer: -1, // Holds the ID of the timeout used when resizing the window (for clearing)
jurzua
parents:
diff changeset
118 rowHeight: 0, // Holds the max height of each row in grid view. Calculated in loadGrid()
jurzua
parents:
diff changeset
119 scaleWait: false, // For preventing double-zoom on touch devices (iPad, etc)
jurzua
parents:
diff changeset
120 selector: '', // Uses the generated ID prefix to easily select elements
jurzua
parents:
diff changeset
121 singleClick: false, // Used for catching ctrl+double-click events in Firefox in Mac OS
jurzua
parents:
diff changeset
122 scrollbarWidth: 0, // Set to the actual scrollbar width in init()
jurzua
parents:
diff changeset
123 throbberTimeoutID: -1, // Holds the ID of the throbber loading timeout
jurzua
parents:
diff changeset
124 toolbar: null, // Holds an object with some toolbar-related functions
jurzua
parents:
diff changeset
125 topScrollSoFar: 0, // Holds the number of pixels of vertical scroll
jurzua
parents:
diff changeset
126 totalHeights: [], // The total height of all pages (stacked together) for each zoom level
jurzua
parents:
diff changeset
127 totalHeight: 0, // The total height for the current zoom level (including padding)
jurzua
parents:
diff changeset
128 verticalOffset: 0, // See horizontalOffset
jurzua
parents:
diff changeset
129 verticalPadding: 0, // Either the fixed padding or adaptive padding
jurzua
parents:
diff changeset
130 viewerXOffset: 0, // Distance between left edge of viewer and document left edge
jurzua
parents:
diff changeset
131 viewerYOffset: 0 // Like viewerXOffset but for the top edges
jurzua
parents:
diff changeset
132 };
jurzua
parents:
diff changeset
133
jurzua
parents:
diff changeset
134 $.extend(settings, globals);
jurzua
parents:
diff changeset
135
jurzua
parents:
diff changeset
136 // Executes a callback function with the diva instance set as the context
jurzua
parents:
diff changeset
137 // Can take an unlimited number to arguments to pass to the callback function
jurzua
parents:
diff changeset
138 var self = this;
jurzua
parents:
diff changeset
139
jurzua
parents:
diff changeset
140 var executeCallback = function (callback)
jurzua
parents:
diff changeset
141 {
jurzua
parents:
diff changeset
142 var args, i, length;
jurzua
parents:
diff changeset
143
jurzua
parents:
diff changeset
144 if (typeof callback === "function")
jurzua
parents:
diff changeset
145 {
jurzua
parents:
diff changeset
146 args = [];
jurzua
parents:
diff changeset
147 for (i = 1, length = arguments.length; i < length; i++)
jurzua
parents:
diff changeset
148 {
jurzua
parents:
diff changeset
149 args.push(arguments[i]);
jurzua
parents:
diff changeset
150 }
jurzua
parents:
diff changeset
151
jurzua
parents:
diff changeset
152 callback.apply(self, args);
jurzua
parents:
diff changeset
153
jurzua
parents:
diff changeset
154 return true;
jurzua
parents:
diff changeset
155 }
jurzua
parents:
diff changeset
156
jurzua
parents:
diff changeset
157 return false;
jurzua
parents:
diff changeset
158 };
jurzua
parents:
diff changeset
159
jurzua
parents:
diff changeset
160 var getPageData = function (pageIndex, attribute)
jurzua
parents:
diff changeset
161 {
jurzua
parents:
diff changeset
162 return settings.pages[pageIndex].d[settings.zoomLevel][attribute];
jurzua
parents:
diff changeset
163 };
jurzua
parents:
diff changeset
164
jurzua
parents:
diff changeset
165 // Returns the page index associated with the given filename; must called after settings settings.pages
jurzua
parents:
diff changeset
166 var getPageIndex = function (filename)
jurzua
parents:
diff changeset
167 {
jurzua
parents:
diff changeset
168 var i,
jurzua
parents:
diff changeset
169 np = settings.numPages;
jurzua
parents:
diff changeset
170
jurzua
parents:
diff changeset
171 for (i = 0; i < np; i++)
jurzua
parents:
diff changeset
172 {
jurzua
parents:
diff changeset
173 if (settings.pages[i].f === filename)
jurzua
parents:
diff changeset
174 {
jurzua
parents:
diff changeset
175 return i;
jurzua
parents:
diff changeset
176 }
jurzua
parents:
diff changeset
177 }
jurzua
parents:
diff changeset
178
jurzua
parents:
diff changeset
179 return -1;
jurzua
parents:
diff changeset
180 };
jurzua
parents:
diff changeset
181
jurzua
parents:
diff changeset
182 // Checks if a tile is within the viewport horizontally
jurzua
parents:
diff changeset
183 var isHorizontallyInViewport = function (left, right)
jurzua
parents:
diff changeset
184 {
jurzua
parents:
diff changeset
185 var panelWidth = settings.panelWidth;
jurzua
parents:
diff changeset
186 var leftOfViewport = settings.leftScrollSoFar - settings.viewportMargin;
jurzua
parents:
diff changeset
187 var rightOfViewport = leftOfViewport + panelWidth + settings.viewportMargin * 2;
jurzua
parents:
diff changeset
188
jurzua
parents:
diff changeset
189 var leftVisible = left >= leftOfViewport && left <= rightOfViewport;
jurzua
parents:
diff changeset
190 var rightVisible = right >= leftOfViewport && right <= rightOfViewport;
jurzua
parents:
diff changeset
191 var middleVisible = left <= leftOfViewport && right >= rightOfViewport;
jurzua
parents:
diff changeset
192
jurzua
parents:
diff changeset
193 return (leftVisible || middleVisible || rightVisible);
jurzua
parents:
diff changeset
194 };
jurzua
parents:
diff changeset
195
jurzua
parents:
diff changeset
196 // Checks if a page or tile is within the viewport vertically
jurzua
parents:
diff changeset
197 var isVerticallyInViewport = function (top, bottom)
jurzua
parents:
diff changeset
198 {
jurzua
parents:
diff changeset
199 var panelHeight = settings.panelHeight;
jurzua
parents:
diff changeset
200 var topOfViewport = settings.topScrollSoFar - settings.viewportMargin;
jurzua
parents:
diff changeset
201 var bottomOfViewport = topOfViewport + panelHeight + settings.viewportMargin * 2;
jurzua
parents:
diff changeset
202
jurzua
parents:
diff changeset
203 var topVisible = top >= topOfViewport && top <= bottomOfViewport;
jurzua
parents:
diff changeset
204 var middleVisible = top <= topOfViewport && bottom >= bottomOfViewport;
jurzua
parents:
diff changeset
205 var bottomVisible = bottom >= topOfViewport && bottom <= bottomOfViewport;
jurzua
parents:
diff changeset
206
jurzua
parents:
diff changeset
207 return (topVisible || middleVisible || bottomVisible);
jurzua
parents:
diff changeset
208 };
jurzua
parents:
diff changeset
209
jurzua
parents:
diff changeset
210 // Check if a tile is near the viewport and thus should be loaded
jurzua
parents:
diff changeset
211 var isTileVisible = function (pageIndex, tileRow, tileCol)
jurzua
parents:
diff changeset
212 {
jurzua
parents:
diff changeset
213 var tileTop = settings.heightAbovePages[pageIndex] + (tileRow * settings.tileHeight) + settings.verticalPadding;
jurzua
parents:
diff changeset
214 var tileBottom = tileTop + settings.tileHeight;
jurzua
parents:
diff changeset
215 var tileLeft = settings.pageLeftOffsets[pageIndex] + (tileCol * settings.tileWidth);
jurzua
parents:
diff changeset
216 var tileRight = tileLeft + settings.tileWidth;
jurzua
parents:
diff changeset
217
jurzua
parents:
diff changeset
218 return isVerticallyInViewport(tileTop, tileBottom) && isHorizontallyInViewport(tileLeft, tileRight);
jurzua
parents:
diff changeset
219 };
jurzua
parents:
diff changeset
220
jurzua
parents:
diff changeset
221 // Check if a tile has been appended to the DOM
jurzua
parents:
diff changeset
222 var isTileLoaded = function (pageIndex, tileIndex)
jurzua
parents:
diff changeset
223 {
jurzua
parents:
diff changeset
224 return document.getElementById(settings.ID + 'tile-' + pageIndex + '-' + tileIndex) === false;
jurzua
parents:
diff changeset
225 };
jurzua
parents:
diff changeset
226
jurzua
parents:
diff changeset
227 // Check if a page index is valid
jurzua
parents:
diff changeset
228 var isPageValid = function (pageIndex)
jurzua
parents:
diff changeset
229 {
jurzua
parents:
diff changeset
230 return pageIndex >= 0 && pageIndex < settings.numPages;
jurzua
parents:
diff changeset
231 };
jurzua
parents:
diff changeset
232
jurzua
parents:
diff changeset
233 // Check if a page is in or near the viewport and thus should be loaded
jurzua
parents:
diff changeset
234 var isPageVisible = function (pageIndex)
jurzua
parents:
diff changeset
235 {
jurzua
parents:
diff changeset
236 var topOfPage = settings.heightAbovePages[pageIndex];
jurzua
parents:
diff changeset
237 var bottomOfPage = topOfPage + getPageData(pageIndex, 'h') + settings.verticalPadding;
jurzua
parents:
diff changeset
238
jurzua
parents:
diff changeset
239 return isVerticallyInViewport(topOfPage, bottomOfPage);
jurzua
parents:
diff changeset
240 };
jurzua
parents:
diff changeset
241
jurzua
parents:
diff changeset
242 // Check if a page has been appended to the DOM
jurzua
parents:
diff changeset
243 var isPageLoaded = function (pageIndex)
jurzua
parents:
diff changeset
244 {
jurzua
parents:
diff changeset
245 return $(document.getElementById(settings.ID + 'page-' + pageIndex)).length > 0;
jurzua
parents:
diff changeset
246 };
jurzua
parents:
diff changeset
247
jurzua
parents:
diff changeset
248 // Appends the page directly into the document body, or loads the relevant tiles
jurzua
parents:
diff changeset
249 var loadPage = function (pageIndex)
jurzua
parents:
diff changeset
250 {
jurzua
parents:
diff changeset
251 // If the page and all of its tiles have been loaded, exit
jurzua
parents:
diff changeset
252 if (isPageLoaded(pageIndex) && settings.allTilesLoaded[pageIndex])
jurzua
parents:
diff changeset
253 {
jurzua
parents:
diff changeset
254 return;
jurzua
parents:
diff changeset
255 }
jurzua
parents:
diff changeset
256
jurzua
parents:
diff changeset
257 // Load some data for this page
jurzua
parents:
diff changeset
258 var filename = settings.pages[pageIndex].f;
jurzua
parents:
diff changeset
259 var width = getPageData(pageIndex, 'w');
jurzua
parents:
diff changeset
260 var height = getPageData(pageIndex, 'h');
jurzua
parents:
diff changeset
261 var heightFromTop = settings.heightAbovePages[pageIndex] + settings.verticalPadding;
jurzua
parents:
diff changeset
262 var pageSelector = settings.selector + 'page-' + pageIndex;
jurzua
parents:
diff changeset
263 var plugin;
jurzua
parents:
diff changeset
264
jurzua
parents:
diff changeset
265 // If the page has not been loaded yet, append the div to the DOM
jurzua
parents:
diff changeset
266 if (!isPageLoaded(pageIndex))
jurzua
parents:
diff changeset
267 {
jurzua
parents:
diff changeset
268 $(document.getElementById(settings.ID + "inner")).append('<div id="' + settings.ID + 'page-' + pageIndex + '" style="top: ' + heightFromTop + 'px; width: ' + width + 'px; height: ' + height + 'px;" class="diva-document-page" title="Page ' + (pageIndex + 1) + '" data-index="' + pageIndex + '" data-filename="' + filename + '">' + settings.pageTools + '</div>');
jurzua
parents:
diff changeset
269
jurzua
parents:
diff changeset
270 // Call the callback function
jurzua
parents:
diff changeset
271 executeCallback(settings.onPageLoad, pageIndex, filename, pageSelector);
jurzua
parents:
diff changeset
272 Events.publish("PageHasLoaded", [pageIndex, filename, pageSelector]);
jurzua
parents:
diff changeset
273
jurzua
parents:
diff changeset
274 // @TODO: Replace this with a notification.
jurzua
parents:
diff changeset
275 // Execute the callback functions for any of the enabled plugins
jurzua
parents:
diff changeset
276 for (plugin in settings.plugins) {
jurzua
parents:
diff changeset
277 executeCallback(settings.plugins[plugin].onPageLoad, pageIndex, filename, pageSelector);
jurzua
parents:
diff changeset
278 }
jurzua
parents:
diff changeset
279 }
jurzua
parents:
diff changeset
280
jurzua
parents:
diff changeset
281 // There are still tiles to load, so try to load those (after a delay)
jurzua
parents:
diff changeset
282 settings.pageTimeouts.push(setTimeout(function ()
jurzua
parents:
diff changeset
283 {
jurzua
parents:
diff changeset
284 // If the page is no longer in the viewport, don't load any tiles
jurzua
parents:
diff changeset
285 if (!isPageVisible(pageIndex))
jurzua
parents:
diff changeset
286 {
jurzua
parents:
diff changeset
287 return;
jurzua
parents:
diff changeset
288 }
jurzua
parents:
diff changeset
289
jurzua
parents:
diff changeset
290 var imdir = settings.imageDir + "/";
jurzua
parents:
diff changeset
291 // Load some more data and initialise some variables
jurzua
parents:
diff changeset
292 var rows = getPageData(pageIndex, 'r');
jurzua
parents:
diff changeset
293 var cols = getPageData(pageIndex, 'c');
jurzua
parents:
diff changeset
294 var maxZoom = settings.pages[pageIndex].m;
jurzua
parents:
diff changeset
295 var baseURL = settings.iipServerURL + "?FIF=" + imdir + filename + '&JTL=';
jurzua
parents:
diff changeset
296 var content = [];
jurzua
parents:
diff changeset
297 var allTilesLoaded = true;
jurzua
parents:
diff changeset
298 var tileIndex = 0;
jurzua
parents:
diff changeset
299 var i;
jurzua
parents:
diff changeset
300
jurzua
parents:
diff changeset
301 // Calculate the width and height of outer tiles (non-standard dimensions)
jurzua
parents:
diff changeset
302 var lastHeight = height - (rows - 1) * settings.tileHeight;
jurzua
parents:
diff changeset
303 var lastWidth = width - (cols - 1) * settings.tileWidth;
jurzua
parents:
diff changeset
304
jurzua
parents:
diff changeset
305 // Declare variables used within the loops
jurzua
parents:
diff changeset
306 var row, col, tileHeight, tileWidth, top, left, displayStyle, zoomLevel, imageURL;
jurzua
parents:
diff changeset
307
jurzua
parents:
diff changeset
308 // Adjust the zoom level based on the max zoom level of the page
jurzua
parents:
diff changeset
309 zoomLevel = settings.zoomLevel + maxZoom - settings.realMaxZoom;
jurzua
parents:
diff changeset
310 baseImageURL = baseURL + zoomLevel + ',';
jurzua
parents:
diff changeset
311
jurzua
parents:
diff changeset
312 // Loop through all the tiles in this page
jurzua
parents:
diff changeset
313 row = 0;
jurzua
parents:
diff changeset
314 while (row < rows)
jurzua
parents:
diff changeset
315 {
jurzua
parents:
diff changeset
316 col = 0;
jurzua
parents:
diff changeset
317 while (col < cols)
jurzua
parents:
diff changeset
318 {
jurzua
parents:
diff changeset
319 top = row * settings.tileHeight;
jurzua
parents:
diff changeset
320 left = col * settings.tileWidth;
jurzua
parents:
diff changeset
321
jurzua
parents:
diff changeset
322 // If the tile is in the last row or column, its dimensions will be different
jurzua
parents:
diff changeset
323 tileHeight = (row === rows - 1) ? lastHeight : settings.tileHeight;
jurzua
parents:
diff changeset
324 tileWidth = (col === cols - 1) ? lastWidth : settings.tileWidth;
jurzua
parents:
diff changeset
325
jurzua
parents:
diff changeset
326 imageURL = baseImageURL + tileIndex;
jurzua
parents:
diff changeset
327
jurzua
parents:
diff changeset
328 // this check looks to see if the tile is already loaded, and then if
jurzua
parents:
diff changeset
329 // it isn't, if it should be visible.
jurzua
parents:
diff changeset
330 if (!isTileLoaded(pageIndex, tileIndex)) {
jurzua
parents:
diff changeset
331 if (isTileVisible(pageIndex, row, col)) {
jurzua
parents:
diff changeset
332 content.push('<div id="' + settings.ID + 'tile-' + pageIndex + '-' + tileIndex + '" style="display:inline; position: absolute; top: ' + top + 'px; left: ' + left + 'px; background-image: url(\'' + imageURL + '\'); height: ' + tileHeight + 'px; width: ' + tileWidth + 'px;"></div>');
jurzua
parents:
diff changeset
333 } else {
jurzua
parents:
diff changeset
334 // The tile does not need to be loaded - not all have been loaded
jurzua
parents:
diff changeset
335 allTilesLoaded = false;
jurzua
parents:
diff changeset
336 }
jurzua
parents:
diff changeset
337 }
jurzua
parents:
diff changeset
338 tileIndex++;
jurzua
parents:
diff changeset
339 col++;
jurzua
parents:
diff changeset
340 }
jurzua
parents:
diff changeset
341 row++;
jurzua
parents:
diff changeset
342 }
jurzua
parents:
diff changeset
343
jurzua
parents:
diff changeset
344 settings.allTilesLoaded[pageIndex] = allTilesLoaded;
jurzua
parents:
diff changeset
345 $(document.getElementById(settings.ID + 'page-' + pageIndex)).append(content.join(''));
jurzua
parents:
diff changeset
346
jurzua
parents:
diff changeset
347 executeCallback(settings.onPageLoaded, pageIndex, filename, pageSelector);
jurzua
parents:
diff changeset
348
jurzua
parents:
diff changeset
349 }, settings.pageLoadTimeout));
jurzua
parents:
diff changeset
350 };
jurzua
parents:
diff changeset
351
jurzua
parents:
diff changeset
352 // Delete a page from the DOM; will occur when a page is scrolled out of the viewport
jurzua
parents:
diff changeset
353 var deletePage = function (pageIndex)
jurzua
parents:
diff changeset
354 {
jurzua
parents:
diff changeset
355 $(document.getElementById(settings.ID + 'page-' + pageIndex)).empty().remove();
jurzua
parents:
diff changeset
356 };
jurzua
parents:
diff changeset
357
jurzua
parents:
diff changeset
358 // Check if the bottom of a page is above the top of a viewport (scrolling down)
jurzua
parents:
diff changeset
359 // For when you want to keep looping but don't want to load a specific page
jurzua
parents:
diff changeset
360 var pageAboveViewport = function (pageIndex)
jurzua
parents:
diff changeset
361 {
jurzua
parents:
diff changeset
362 var bottomOfPage = settings.heightAbovePages[pageIndex] + getPageData(pageIndex, 'h') + settings.verticalPadding;
jurzua
parents:
diff changeset
363 var topOfViewport = settings.topScrollSoFar;
jurzua
parents:
diff changeset
364
jurzua
parents:
diff changeset
365 return bottomOfPage < topOfViewport;
jurzua
parents:
diff changeset
366 };
jurzua
parents:
diff changeset
367
jurzua
parents:
diff changeset
368 // Check if the top of a page is below the bottom of a viewport (scrolling up)
jurzua
parents:
diff changeset
369 var pageBelowViewport = function (pageIndex)
jurzua
parents:
diff changeset
370 {
jurzua
parents:
diff changeset
371 var topOfPage = settings.heightAbovePages[pageIndex];
jurzua
parents:
diff changeset
372 var bottomOfViewport = settings.topScrollSoFar + settings.panelHeight;
jurzua
parents:
diff changeset
373
jurzua
parents:
diff changeset
374 return topOfPage > bottomOfViewport;
jurzua
parents:
diff changeset
375 };
jurzua
parents:
diff changeset
376
jurzua
parents:
diff changeset
377 // Called by adjust pages - determine what pages should be visible, and show them
jurzua
parents:
diff changeset
378 var attemptPageShow = function (pageIndex, direction)
jurzua
parents:
diff changeset
379 {
jurzua
parents:
diff changeset
380 if (direction > 0)
jurzua
parents:
diff changeset
381 {
jurzua
parents:
diff changeset
382 // Direction is positive - we're scrolling down
jurzua
parents:
diff changeset
383 if (isPageValid(pageIndex))
jurzua
parents:
diff changeset
384 {
jurzua
parents:
diff changeset
385 // If the page should be visible, then yes, add it
jurzua
parents:
diff changeset
386 if (isPageVisible(pageIndex))
jurzua
parents:
diff changeset
387 {
jurzua
parents:
diff changeset
388 loadPage(pageIndex);
jurzua
parents:
diff changeset
389
jurzua
parents:
diff changeset
390 settings.lastPageLoaded = pageIndex;
jurzua
parents:
diff changeset
391
jurzua
parents:
diff changeset
392 // Recursively call this function until there's nothing to add
jurzua
parents:
diff changeset
393 attemptPageShow(settings.lastPageLoaded + 1, direction);
jurzua
parents:
diff changeset
394 }
jurzua
parents:
diff changeset
395 else if (pageAboveViewport(pageIndex))
jurzua
parents:
diff changeset
396 {
jurzua
parents:
diff changeset
397 // If the page is below the viewport. try to load the next one
jurzua
parents:
diff changeset
398 attemptPageShow(pageIndex + 1, direction);
jurzua
parents:
diff changeset
399 }
jurzua
parents:
diff changeset
400 }
jurzua
parents:
diff changeset
401 }
jurzua
parents:
diff changeset
402 else
jurzua
parents:
diff changeset
403 {
jurzua
parents:
diff changeset
404 // Direction is negative - we're scrolling up
jurzua
parents:
diff changeset
405 if (isPageValid(pageIndex))
jurzua
parents:
diff changeset
406 {
jurzua
parents:
diff changeset
407 // If it's near the viewport, yes, add it
jurzua
parents:
diff changeset
408 if (isPageVisible(pageIndex))
jurzua
parents:
diff changeset
409 {
jurzua
parents:
diff changeset
410 loadPage(pageIndex);
jurzua
parents:
diff changeset
411
jurzua
parents:
diff changeset
412 // Reset the first page loaded to this one
jurzua
parents:
diff changeset
413 settings.firstPageLoaded = pageIndex;
jurzua
parents:
diff changeset
414
jurzua
parents:
diff changeset
415 // Recursively call this function until there's nothing to add
jurzua
parents:
diff changeset
416 attemptPageShow(settings.firstPageLoaded - 1, direction);
jurzua
parents:
diff changeset
417 }
jurzua
parents:
diff changeset
418 else if (pageBelowViewport(pageIndex))
jurzua
parents:
diff changeset
419 {
jurzua
parents:
diff changeset
420 // Attempt to call this on the next page, do not increment anything
jurzua
parents:
diff changeset
421 attemptPageShow(pageIndex - 1, direction);
jurzua
parents:
diff changeset
422 }
jurzua
parents:
diff changeset
423 }
jurzua
parents:
diff changeset
424 }
jurzua
parents:
diff changeset
425 };
jurzua
parents:
diff changeset
426
jurzua
parents:
diff changeset
427 // Called by adjustPages - see what pages need to be hidden, and hide them
jurzua
parents:
diff changeset
428 var attemptPageHide = function (pageIndex, direction)
jurzua
parents:
diff changeset
429 {
jurzua
parents:
diff changeset
430 if (direction > 0)
jurzua
parents:
diff changeset
431 {
jurzua
parents:
diff changeset
432 // Scrolling down - see if this page needs to be deleted from the DOM
jurzua
parents:
diff changeset
433 if (isPageValid(pageIndex) && pageAboveViewport(pageIndex))
jurzua
parents:
diff changeset
434 {
jurzua
parents:
diff changeset
435 // Yes, delete it, reset the first page loaded
jurzua
parents:
diff changeset
436 deletePage(pageIndex);
jurzua
parents:
diff changeset
437 settings.firstPageLoaded = pageIndex + 1;
jurzua
parents:
diff changeset
438
jurzua
parents:
diff changeset
439 // Try to call this function recursively until there's nothing to delete
jurzua
parents:
diff changeset
440 attemptPageHide(settings.firstPageLoaded, direction);
jurzua
parents:
diff changeset
441 }
jurzua
parents:
diff changeset
442 }
jurzua
parents:
diff changeset
443 else
jurzua
parents:
diff changeset
444 {
jurzua
parents:
diff changeset
445 // Direction must be negative (not 0 - see adjustPages), we're scrolling up
jurzua
parents:
diff changeset
446 if (isPageValid(pageIndex) && pageBelowViewport(pageIndex))
jurzua
parents:
diff changeset
447 {
jurzua
parents:
diff changeset
448 // Yes, delete it, reset the last page loaded
jurzua
parents:
diff changeset
449 deletePage(pageIndex);
jurzua
parents:
diff changeset
450 settings.lastPageLoaded = pageIndex - 1;
jurzua
parents:
diff changeset
451
jurzua
parents:
diff changeset
452 // Try to call this function recursively until there's nothing to delete
jurzua
parents:
diff changeset
453 attemptPageHide(settings.lastPageLoaded, direction);
jurzua
parents:
diff changeset
454 }
jurzua
parents:
diff changeset
455 }
jurzua
parents:
diff changeset
456 };
jurzua
parents:
diff changeset
457
jurzua
parents:
diff changeset
458 // Handles showing and hiding pages when the user scrolls
jurzua
parents:
diff changeset
459 var adjustPages = function (direction)
jurzua
parents:
diff changeset
460 {
jurzua
parents:
diff changeset
461 var i;
jurzua
parents:
diff changeset
462
jurzua
parents:
diff changeset
463 // Direction is negative, so we're scrolling up
jurzua
parents:
diff changeset
464 if (direction < 0)
jurzua
parents:
diff changeset
465 {
jurzua
parents:
diff changeset
466 attemptPageShow(settings.firstPageLoaded, direction);
jurzua
parents:
diff changeset
467 setCurrentPage(-1);
jurzua
parents:
diff changeset
468 attemptPageHide(settings.lastPageLoaded, direction);
jurzua
parents:
diff changeset
469 }
jurzua
parents:
diff changeset
470 else if (direction > 0)
jurzua
parents:
diff changeset
471 {
jurzua
parents:
diff changeset
472 // Direction is positive so we're scrolling down
jurzua
parents:
diff changeset
473 attemptPageShow(settings.lastPageLoaded, direction);
jurzua
parents:
diff changeset
474 setCurrentPage(1);
jurzua
parents:
diff changeset
475 attemptPageHide(settings.firstPageLoaded, direction);
jurzua
parents:
diff changeset
476 }
jurzua
parents:
diff changeset
477 else
jurzua
parents:
diff changeset
478 {
jurzua
parents:
diff changeset
479 // Horizontal scroll, check if we need to reveal any tiles
jurzua
parents:
diff changeset
480 var lpl = settings.lastPageLoaded;
jurzua
parents:
diff changeset
481 for (i = Math.max(settings.firstPageLoaded, 0); i <= lpl; i++)
jurzua
parents:
diff changeset
482 {
jurzua
parents:
diff changeset
483 if (isPageVisible(i))
jurzua
parents:
diff changeset
484 {
jurzua
parents:
diff changeset
485 loadPage(i);
jurzua
parents:
diff changeset
486 }
jurzua
parents:
diff changeset
487 }
jurzua
parents:
diff changeset
488 }
jurzua
parents:
diff changeset
489
jurzua
parents:
diff changeset
490 executeCallback(settings.onScroll, settings.topScrollSoFar);
jurzua
parents:
diff changeset
491
jurzua
parents:
diff changeset
492 // If we're scrolling down
jurzua
parents:
diff changeset
493 if (direction > 0)
jurzua
parents:
diff changeset
494 {
jurzua
parents:
diff changeset
495 executeCallback(settings.onScrollDown, settings.topScrollSoFar);
jurzua
parents:
diff changeset
496 }
jurzua
parents:
diff changeset
497 else if (direction < 0)
jurzua
parents:
diff changeset
498 {
jurzua
parents:
diff changeset
499 // We're scrolling up
jurzua
parents:
diff changeset
500 executeCallback(settings.onScrollUp, settings.topScrollSoFar);
jurzua
parents:
diff changeset
501 }
jurzua
parents:
diff changeset
502 };
jurzua
parents:
diff changeset
503
jurzua
parents:
diff changeset
504 // Check if a row index is valid
jurzua
parents:
diff changeset
505 var isRowValid = function (rowIndex)
jurzua
parents:
diff changeset
506 {
jurzua
parents:
diff changeset
507 return rowIndex >= 0 && rowIndex < settings.numRows;
jurzua
parents:
diff changeset
508 };
jurzua
parents:
diff changeset
509
jurzua
parents:
diff changeset
510 // Check if a row should be visible in the viewport
jurzua
parents:
diff changeset
511 var isRowVisible = function (rowIndex)
jurzua
parents:
diff changeset
512 {
jurzua
parents:
diff changeset
513 var topOfRow = settings.rowHeight * rowIndex;
jurzua
parents:
diff changeset
514 var bottomOfRow = topOfRow + settings.rowHeight + settings.fixedPadding;
jurzua
parents:
diff changeset
515
jurzua
parents:
diff changeset
516 return isVerticallyInViewport(topOfRow, bottomOfRow);
jurzua
parents:
diff changeset
517 };
jurzua
parents:
diff changeset
518
jurzua
parents:
diff changeset
519 // Check if a row (in grid view) is present in the DOM
jurzua
parents:
diff changeset
520 var isRowLoaded = function (rowIndex)
jurzua
parents:
diff changeset
521 {
jurzua
parents:
diff changeset
522 return $(settings.selector + 'row-' + rowIndex).length > 0;
jurzua
parents:
diff changeset
523 };
jurzua
parents:
diff changeset
524
jurzua
parents:
diff changeset
525 var loadRow = function (rowIndex)
jurzua
parents:
diff changeset
526 {
jurzua
parents:
diff changeset
527 // If the row has already been loaded, don't attempt to load it again
jurzua
parents:
diff changeset
528 if (isRowLoaded(rowIndex))
jurzua
parents:
diff changeset
529 {
jurzua
parents:
diff changeset
530 return;
jurzua
parents:
diff changeset
531 }
jurzua
parents:
diff changeset
532
jurzua
parents:
diff changeset
533 // Load some data for this and initialise some variables
jurzua
parents:
diff changeset
534 var heightFromTop = (settings.rowHeight * rowIndex) + settings.fixedPadding;
jurzua
parents:
diff changeset
535 var content = [];
jurzua
parents:
diff changeset
536
jurzua
parents:
diff changeset
537 // Create the opening tag for the row div
jurzua
parents:
diff changeset
538 content.push('<div class="diva-row" id="' + settings.ID + 'row-' + rowIndex + '" style="height: ' + settings.rowHeight + '; top: ' + heightFromTop + 'px;">');
jurzua
parents:
diff changeset
539
jurzua
parents:
diff changeset
540 // Declare variables used in the loop
jurzua
parents:
diff changeset
541 var i, pageIndex, filename, realWidth, realHeight, pageWidth, pageHeight, leftOffset, imageURL;
jurzua
parents:
diff changeset
542 var imdir = settings.imageDir + "/";
jurzua
parents:
diff changeset
543
jurzua
parents:
diff changeset
544 // Load each page within that row
jurzua
parents:
diff changeset
545 var ppr = settings.pagesPerRow;
jurzua
parents:
diff changeset
546 for (i = 0; i < ppr; i++)
jurzua
parents:
diff changeset
547 {
jurzua
parents:
diff changeset
548 pageIndex = rowIndex * settings.pagesPerRow + i;
jurzua
parents:
diff changeset
549
jurzua
parents:
diff changeset
550 // If this page is the last row, don't try to load a nonexistent page
jurzua
parents:
diff changeset
551 if (!isPageValid(pageIndex))
jurzua
parents:
diff changeset
552 {
jurzua
parents:
diff changeset
553 break;
jurzua
parents:
diff changeset
554 }
jurzua
parents:
diff changeset
555
jurzua
parents:
diff changeset
556 // Calculate the width, height and horizontal placement of this page
jurzua
parents:
diff changeset
557 filename = settings.pages[pageIndex].f;
jurzua
parents:
diff changeset
558 realWidth = getPageData(pageIndex, 'w');
jurzua
parents:
diff changeset
559 realHeight = getPageData(pageIndex, 'h');
jurzua
parents:
diff changeset
560 pageWidth = (settings.fixedHeightGrid) ? (settings.rowHeight - settings.fixedPadding) * realWidth / realHeight : settings.gridPageWidth;
jurzua
parents:
diff changeset
561 pageHeight = (settings.fixedHeightGrid) ? settings.rowHeight - settings.fixedPadding : pageWidth / realWidth * realHeight;
jurzua
parents:
diff changeset
562 leftOffset = parseInt(i * (settings.fixedPadding + settings.gridPageWidth) + settings.fixedPadding, 10);
jurzua
parents:
diff changeset
563
jurzua
parents:
diff changeset
564 // Make sure they're all integers for nice, round numbers
jurzua
parents:
diff changeset
565 pageWidth = parseInt(pageWidth, 10);
jurzua
parents:
diff changeset
566 pageHeight = parseInt(pageHeight, 10);
jurzua
parents:
diff changeset
567
jurzua
parents:
diff changeset
568 // Center the page if the height is fixed (otherwise, there is no horizontal padding)
jurzua
parents:
diff changeset
569 leftOffset += (settings.fixedHeightGrid) ? (settings.gridPageWidth - pageWidth) / 2 : 0;
jurzua
parents:
diff changeset
570 imageURL = settings.iipServerURL + "?FIF=" + imdir + filename + '&amp;HEI=' + (pageHeight + 2) + '&amp;CVT=JPEG';
jurzua
parents:
diff changeset
571
jurzua
parents:
diff changeset
572 // Append the HTML for this page to the string builder array
jurzua
parents:
diff changeset
573 content.push('<div id="' + settings.ID + 'page-' + pageIndex + '" class="diva-page" style="width: ' + pageWidth + 'px; height: ' + pageHeight + 'px; left: ' + leftOffset + 'px;" title="Page ' + (pageIndex + 1) + '"></div>');
jurzua
parents:
diff changeset
574
jurzua
parents:
diff changeset
575 // Add each image to a queue so that images aren't loaded unnecessarily
jurzua
parents:
diff changeset
576 addPageToQueue(rowIndex, pageIndex, imageURL, pageWidth, pageHeight);
jurzua
parents:
diff changeset
577 }
jurzua
parents:
diff changeset
578
jurzua
parents:
diff changeset
579 // Append this row to the DOM
jurzua
parents:
diff changeset
580 content.push('</div>');
jurzua
parents:
diff changeset
581 $(document.getElementById(settings.ID + "inner")).append(content.join(''));
jurzua
parents:
diff changeset
582 };
jurzua
parents:
diff changeset
583
jurzua
parents:
diff changeset
584 var deleteRow = function (rowIndex)
jurzua
parents:
diff changeset
585 {
jurzua
parents:
diff changeset
586 $(document.getElementById(settings.ID + 'row-' + rowIndex)).empty().remove();
jurzua
parents:
diff changeset
587 };
jurzua
parents:
diff changeset
588
jurzua
parents:
diff changeset
589 // Check if the bottom of a row is above the top of the viewport (scrolling down)
jurzua
parents:
diff changeset
590 var rowAboveViewport = function (rowIndex)
jurzua
parents:
diff changeset
591 {
jurzua
parents:
diff changeset
592 var bottomOfRow = settings.rowHeight * (rowIndex + 1);
jurzua
parents:
diff changeset
593 var topOfViewport = settings.topScrollSoFar;
jurzua
parents:
diff changeset
594
jurzua
parents:
diff changeset
595 return (bottomOfRow < topOfViewport);
jurzua
parents:
diff changeset
596 };
jurzua
parents:
diff changeset
597
jurzua
parents:
diff changeset
598 // Check if the top of a row is below the bottom of the viewport (scrolling up)
jurzua
parents:
diff changeset
599 var rowBelowViewport = function (rowIndex)
jurzua
parents:
diff changeset
600 {
jurzua
parents:
diff changeset
601 var topOfRow = settings.rowHeight * rowIndex;
jurzua
parents:
diff changeset
602 var bottomOfViewport = settings.topScrollSoFar + settings.panelHeight;
jurzua
parents:
diff changeset
603
jurzua
parents:
diff changeset
604 return (topOfRow > bottomOfViewport);
jurzua
parents:
diff changeset
605 };
jurzua
parents:
diff changeset
606
jurzua
parents:
diff changeset
607 // Same thing as attemptPageShow only with rows
jurzua
parents:
diff changeset
608 var attemptRowShow = function (rowIndex, direction)
jurzua
parents:
diff changeset
609 {
jurzua
parents:
diff changeset
610 if (direction > 0)
jurzua
parents:
diff changeset
611 {
jurzua
parents:
diff changeset
612 if (isRowValid(rowIndex))
jurzua
parents:
diff changeset
613 {
jurzua
parents:
diff changeset
614 if (isRowVisible(rowIndex))
jurzua
parents:
diff changeset
615 {
jurzua
parents:
diff changeset
616 loadRow(rowIndex);
jurzua
parents:
diff changeset
617 settings.lastRowLoaded = rowIndex;
jurzua
parents:
diff changeset
618
jurzua
parents:
diff changeset
619 attemptRowShow(settings.lastRowLoaded + 1, direction);
jurzua
parents:
diff changeset
620 }
jurzua
parents:
diff changeset
621 else if (rowAboveViewport(rowIndex))
jurzua
parents:
diff changeset
622 {
jurzua
parents:
diff changeset
623 attemptRowShow(rowIndex + 1, direction);
jurzua
parents:
diff changeset
624 }
jurzua
parents:
diff changeset
625 }
jurzua
parents:
diff changeset
626 }
jurzua
parents:
diff changeset
627 else
jurzua
parents:
diff changeset
628 {
jurzua
parents:
diff changeset
629 if (isRowValid(rowIndex))
jurzua
parents:
diff changeset
630 {
jurzua
parents:
diff changeset
631 if (isRowVisible(rowIndex))
jurzua
parents:
diff changeset
632 {
jurzua
parents:
diff changeset
633 loadRow(rowIndex);
jurzua
parents:
diff changeset
634 settings.firstRowLoaded = rowIndex;
jurzua
parents:
diff changeset
635
jurzua
parents:
diff changeset
636 attemptRowShow(settings.firstRowLoaded - 1, direction);
jurzua
parents:
diff changeset
637 }
jurzua
parents:
diff changeset
638 else if (rowBelowViewport(rowIndex))
jurzua
parents:
diff changeset
639 {
jurzua
parents:
diff changeset
640 attemptRowShow(rowIndex - 1, direction);
jurzua
parents:
diff changeset
641 }
jurzua
parents:
diff changeset
642 }
jurzua
parents:
diff changeset
643 }
jurzua
parents:
diff changeset
644 };
jurzua
parents:
diff changeset
645
jurzua
parents:
diff changeset
646 var attemptRowHide = function (rowIndex, direction)
jurzua
parents:
diff changeset
647 {
jurzua
parents:
diff changeset
648 if (direction > 0)
jurzua
parents:
diff changeset
649 {
jurzua
parents:
diff changeset
650 if (isRowValid(rowIndex) && rowAboveViewport(rowIndex))
jurzua
parents:
diff changeset
651 {
jurzua
parents:
diff changeset
652 deleteRow(rowIndex);
jurzua
parents:
diff changeset
653 settings.firstRowLoaded++;
jurzua
parents:
diff changeset
654
jurzua
parents:
diff changeset
655 attemptRowHide(settings.firstRowLoaded, direction);
jurzua
parents:
diff changeset
656 }
jurzua
parents:
diff changeset
657 }
jurzua
parents:
diff changeset
658 else
jurzua
parents:
diff changeset
659 {
jurzua
parents:
diff changeset
660 if (isRowValid(rowIndex) && rowBelowViewport(rowIndex))
jurzua
parents:
diff changeset
661 {
jurzua
parents:
diff changeset
662 deleteRow(rowIndex);
jurzua
parents:
diff changeset
663 settings.lastRowLoaded--;
jurzua
parents:
diff changeset
664
jurzua
parents:
diff changeset
665 attemptRowHide(settings.lastRowLoaded, direction);
jurzua
parents:
diff changeset
666 }
jurzua
parents:
diff changeset
667 }
jurzua
parents:
diff changeset
668 };
jurzua
parents:
diff changeset
669
jurzua
parents:
diff changeset
670 var adjustRows = function (direction)
jurzua
parents:
diff changeset
671 {
jurzua
parents:
diff changeset
672 if (direction < 0)
jurzua
parents:
diff changeset
673 {
jurzua
parents:
diff changeset
674 attemptRowShow(settings.firstRowLoaded, -1);
jurzua
parents:
diff changeset
675 setCurrentRow(-1);
jurzua
parents:
diff changeset
676 attemptRowHide(settings.lastRowLoaded, -1);
jurzua
parents:
diff changeset
677 }
jurzua
parents:
diff changeset
678 else if (direction > 0)
jurzua
parents:
diff changeset
679 {
jurzua
parents:
diff changeset
680 attemptRowShow(settings.lastRowLoaded, 1);
jurzua
parents:
diff changeset
681 setCurrentRow(1);
jurzua
parents:
diff changeset
682 attemptRowHide(settings.firstRowLoaded, 1);
jurzua
parents:
diff changeset
683 }
jurzua
parents:
diff changeset
684
jurzua
parents:
diff changeset
685 executeCallback(settings.onScroll, settings.topScrollSoFar);
jurzua
parents:
diff changeset
686
jurzua
parents:
diff changeset
687 // If we're scrolling down
jurzua
parents:
diff changeset
688 if (direction > 0)
jurzua
parents:
diff changeset
689 {
jurzua
parents:
diff changeset
690 executeCallback(settings.onScrollDown, settings.topScrollSoFar);
jurzua
parents:
diff changeset
691 }
jurzua
parents:
diff changeset
692 else if (direction < 0)
jurzua
parents:
diff changeset
693 {
jurzua
parents:
diff changeset
694 // We're scrolling up
jurzua
parents:
diff changeset
695 executeCallback(settings.onScrollUp, settings.topScrollSoFar);
jurzua
parents:
diff changeset
696 }
jurzua
parents:
diff changeset
697 };
jurzua
parents:
diff changeset
698
jurzua
parents:
diff changeset
699 // Used to delay loading of page images in grid view to prevent unnecessary loads
jurzua
parents:
diff changeset
700 var addPageToQueue = function (rowIndex, pageIndex, imageURL, pageWidth, pageHeight)
jurzua
parents:
diff changeset
701 {
jurzua
parents:
diff changeset
702 settings.pageTimeouts.push(setTimeout(function ()
jurzua
parents:
diff changeset
703 {
jurzua
parents:
diff changeset
704 if (isRowVisible(rowIndex))
jurzua
parents:
diff changeset
705 {
jurzua
parents:
diff changeset
706 $(settings.selector + 'page-' + pageIndex).html('<img src="' + imageURL + '" style="width: ' + pageWidth + 'px; height: ' + pageHeight + 'px;" />');
jurzua
parents:
diff changeset
707 }
jurzua
parents:
diff changeset
708 }, settings.rowLoadTimeout));
jurzua
parents:
diff changeset
709 };
jurzua
parents:
diff changeset
710
jurzua
parents:
diff changeset
711 // Determines and sets the "current page" (settings.currentPageIndex); called within adjustPages
jurzua
parents:
diff changeset
712 // The "direction" is either 1 (downward scroll) or -1 (upward scroll)
jurzua
parents:
diff changeset
713 var setCurrentPage = function (direction)
jurzua
parents:
diff changeset
714 {
jurzua
parents:
diff changeset
715 var middleOfViewport = settings.topScrollSoFar + (settings.panelHeight / 2);
jurzua
parents:
diff changeset
716 var currentPage = settings.currentPageIndex;
jurzua
parents:
diff changeset
717 var pageToConsider = settings.currentPageIndex + direction;
jurzua
parents:
diff changeset
718 var changeCurrentPage = false;
jurzua
parents:
diff changeset
719 var pageSelector = settings.selector + 'page-' + pageToConsider;
jurzua
parents:
diff changeset
720
jurzua
parents:
diff changeset
721 // When scrolling up:
jurzua
parents:
diff changeset
722 if (direction < 0)
jurzua
parents:
diff changeset
723 {
jurzua
parents:
diff changeset
724 // If the previous page > middle of viewport
jurzua
parents:
diff changeset
725 if (pageToConsider >= 0 && (settings.heightAbovePages[pageToConsider] + getPageData(pageToConsider, 'h') + (settings.verticalPadding) >= middleOfViewport))
jurzua
parents:
diff changeset
726 {
jurzua
parents:
diff changeset
727 changeCurrentPage = true;
jurzua
parents:
diff changeset
728 }
jurzua
parents:
diff changeset
729 }
jurzua
parents:
diff changeset
730 else if (direction > 0)
jurzua
parents:
diff changeset
731 {
jurzua
parents:
diff changeset
732 // When scrolling down:
jurzua
parents:
diff changeset
733 // If this page < middle of viewport
jurzua
parents:
diff changeset
734 if (settings.heightAbovePages[currentPage] + getPageData(currentPage, 'h') + settings.verticalPadding < middleOfViewport)
jurzua
parents:
diff changeset
735 {
jurzua
parents:
diff changeset
736 changeCurrentPage = true;
jurzua
parents:
diff changeset
737 }
jurzua
parents:
diff changeset
738 }
jurzua
parents:
diff changeset
739
jurzua
parents:
diff changeset
740 if (changeCurrentPage)
jurzua
parents:
diff changeset
741 {
jurzua
parents:
diff changeset
742 // Set this to the current page
jurzua
parents:
diff changeset
743 settings.currentPageIndex = pageToConsider;
jurzua
parents:
diff changeset
744 // Now try to change the next page, given that we're not going to a specific page
jurzua
parents:
diff changeset
745 // Calls itself recursively - this way we accurately obtain the current page
jurzua
parents:
diff changeset
746 if (direction !== 0)
jurzua
parents:
diff changeset
747 {
jurzua
parents:
diff changeset
748 if (!setCurrentPage(direction))
jurzua
parents:
diff changeset
749 {
jurzua
parents:
diff changeset
750 var filename = settings.pages[pageToConsider].f;
jurzua
parents:
diff changeset
751 executeCallback(settings.onSetCurrentPage, pageToConsider, filename);
jurzua
parents:
diff changeset
752 Events.publish("VisiblePageDidChange", [pageToConsider, filename]);
jurzua
parents:
diff changeset
753 }
jurzua
parents:
diff changeset
754 }
jurzua
parents:
diff changeset
755 return true;
jurzua
parents:
diff changeset
756 }
jurzua
parents:
diff changeset
757
jurzua
parents:
diff changeset
758 return false;
jurzua
parents:
diff changeset
759 };
jurzua
parents:
diff changeset
760
jurzua
parents:
diff changeset
761 // Sets the current page in grid view
jurzua
parents:
diff changeset
762 var setCurrentRow = function (direction)
jurzua
parents:
diff changeset
763 {
jurzua
parents:
diff changeset
764 var currentRow = Math.floor(settings.currentPageIndex / settings.pagesPerRow);
jurzua
parents:
diff changeset
765 var rowToConsider = currentRow + parseInt(direction, 10);
jurzua
parents:
diff changeset
766 var middleOfViewport = settings.topScrollSoFar + (settings.panelHeight / 2);
jurzua
parents:
diff changeset
767 var changeCurrentRow = false;
jurzua
parents:
diff changeset
768
jurzua
parents:
diff changeset
769 if (direction < 0)
jurzua
parents:
diff changeset
770 {
jurzua
parents:
diff changeset
771 if (rowToConsider >= 0 && (settings.rowHeight * currentRow >= middleOfViewport || settings.rowHeight * rowToConsider >= settings.topScrollSoFar))
jurzua
parents:
diff changeset
772 {
jurzua
parents:
diff changeset
773 changeCurrentRow = true;
jurzua
parents:
diff changeset
774 }
jurzua
parents:
diff changeset
775 }
jurzua
parents:
diff changeset
776 else if (direction > 0)
jurzua
parents:
diff changeset
777 {
jurzua
parents:
diff changeset
778 if ((settings.rowHeight * (currentRow + 1)) < settings.topScrollSoFar && isRowValid(rowToConsider))
jurzua
parents:
diff changeset
779 {
jurzua
parents:
diff changeset
780 changeCurrentRow = true;
jurzua
parents:
diff changeset
781 }
jurzua
parents:
diff changeset
782 }
jurzua
parents:
diff changeset
783
jurzua
parents:
diff changeset
784 if (changeCurrentRow)
jurzua
parents:
diff changeset
785 {
jurzua
parents:
diff changeset
786 settings.currentPageIndex = rowToConsider * settings.pagesPerRow;
jurzua
parents:
diff changeset
787
jurzua
parents:
diff changeset
788 if (direction !== 0)
jurzua
parents:
diff changeset
789 {
jurzua
parents:
diff changeset
790 if (!setCurrentRow(direction))
jurzua
parents:
diff changeset
791 {
jurzua
parents:
diff changeset
792 var pageIndex = settings.currentPageIndex;
jurzua
parents:
diff changeset
793 var filename = settings.pages[pageIndex].f;
jurzua
parents:
diff changeset
794 Events.publish("VisiblePageDidChange", [pageIndex, filename]);
jurzua
parents:
diff changeset
795 }
jurzua
parents:
diff changeset
796 }
jurzua
parents:
diff changeset
797
jurzua
parents:
diff changeset
798 return true;
jurzua
parents:
diff changeset
799 }
jurzua
parents:
diff changeset
800
jurzua
parents:
diff changeset
801 return false;
jurzua
parents:
diff changeset
802 };
jurzua
parents:
diff changeset
803
jurzua
parents:
diff changeset
804 // Helper function for going to a particular page
jurzua
parents:
diff changeset
805 // Vertical offset: from the top of the page (including the top padding)
jurzua
parents:
diff changeset
806 // Horizontal offset: from the center of the page; can be negative if to the left
jurzua
parents:
diff changeset
807 var gotoPage = function (pageIndex, verticalOffset, horizontalOffset)
jurzua
parents:
diff changeset
808 {
jurzua
parents:
diff changeset
809 verticalOffset = (typeof verticalOffset !== 'undefined') ? verticalOffset : 0;
jurzua
parents:
diff changeset
810 horizontalOffset = (typeof horizontalOffset !== 'undefined') ? horizontalOffset: 0;
jurzua
parents:
diff changeset
811 var desiredTop = settings.heightAbovePages[pageIndex] + verticalOffset;
jurzua
parents:
diff changeset
812 var desiredLeft = (settings.maxWidths[settings.zoomLevel] - settings.panelWidth) / 2 + settings.horizontalPadding + horizontalOffset;
jurzua
parents:
diff changeset
813
jurzua
parents:
diff changeset
814 $(settings.outerSelector).scrollTop(desiredTop);
jurzua
parents:
diff changeset
815 $(settings.outerSelector).scrollLeft(desiredLeft);
jurzua
parents:
diff changeset
816
jurzua
parents:
diff changeset
817 // Pretend that this is the current page
jurzua
parents:
diff changeset
818 settings.currentPageIndex = pageIndex;
jurzua
parents:
diff changeset
819 //settings.toolbar.updateCurrentPage();
jurzua
parents:
diff changeset
820 var filename = settings.pages[pageIndex].f;
jurzua
parents:
diff changeset
821
jurzua
parents:
diff changeset
822 Events.publish("VisiblePageDidChange", [pageIndex, filename]);
jurzua
parents:
diff changeset
823 executeCallback(settings.onSetCurrentPage, pageIndex, filename);
jurzua
parents:
diff changeset
824
jurzua
parents:
diff changeset
825 // Execute the onJump callback
jurzua
parents:
diff changeset
826 executeCallback(settings.onJump, pageIndex);
jurzua
parents:
diff changeset
827 };
jurzua
parents:
diff changeset
828
jurzua
parents:
diff changeset
829 // Calculates the desired row, then scrolls there
jurzua
parents:
diff changeset
830 var gotoRow = function (pageIndex)
jurzua
parents:
diff changeset
831 {
jurzua
parents:
diff changeset
832 var desiredRow = Math.floor(pageIndex / settings.pagesPerRow);
jurzua
parents:
diff changeset
833 var desiredTop = desiredRow * settings.rowHeight;
jurzua
parents:
diff changeset
834 $(settings.outerSelector).scrollTop(desiredTop);
jurzua
parents:
diff changeset
835
jurzua
parents:
diff changeset
836 // Pretend that this is the current page (it probably isn't)
jurzua
parents:
diff changeset
837 settings.currentPageIndex = pageIndex;
jurzua
parents:
diff changeset
838 var filename = settings.pages[pageIndex].f;
jurzua
parents:
diff changeset
839 Events.publish("VisiblePageDidChange", [pageIndex, filename]);
jurzua
parents:
diff changeset
840 };
jurzua
parents:
diff changeset
841
jurzua
parents:
diff changeset
842 // Helper function called by loadDocument to scroll to the desired place
jurzua
parents:
diff changeset
843 var documentScroll = function ()
jurzua
parents:
diff changeset
844 {
jurzua
parents:
diff changeset
845 // If settings.preZoomOffset is defined, the zoom was trigged by double-clicking
jurzua
parents:
diff changeset
846 // We then zoom in on a specific region
jurzua
parents:
diff changeset
847 if (settings.preZoomOffset)
jurzua
parents:
diff changeset
848 {
jurzua
parents:
diff changeset
849 var clickedPage = settings.preZoomOffset.i;
jurzua
parents:
diff changeset
850 var heightAbovePage = settings.heightAbovePages[clickedPage] + settings.verticalPadding;
jurzua
parents:
diff changeset
851 var pageLeftOffset = settings.pageLeftOffsets[clickedPage];
jurzua
parents:
diff changeset
852 var zoomRatio = Math.pow(2, settings.zoomLevel - settings.oldZoomLevel);
jurzua
parents:
diff changeset
853
jurzua
parents:
diff changeset
854 var distanceFromViewport = {
jurzua
parents:
diff changeset
855 x: settings.preZoomOffset.originalX - settings.viewerXOffset,
jurzua
parents:
diff changeset
856 y: settings.preZoomOffset.originalY - settings.viewerYOffset
jurzua
parents:
diff changeset
857 };
jurzua
parents:
diff changeset
858
jurzua
parents:
diff changeset
859 var newDistanceToEdge = {
jurzua
parents:
diff changeset
860 x: settings.preZoomOffset.x * zoomRatio,
jurzua
parents:
diff changeset
861 y: settings.preZoomOffset.y * zoomRatio
jurzua
parents:
diff changeset
862 };
jurzua
parents:
diff changeset
863
jurzua
parents:
diff changeset
864 var newScroll = {
jurzua
parents:
diff changeset
865 x: newDistanceToEdge.x - distanceFromViewport.x + pageLeftOffset,
jurzua
parents:
diff changeset
866 y: newDistanceToEdge.y - distanceFromViewport.y + heightAbovePage
jurzua
parents:
diff changeset
867 };
jurzua
parents:
diff changeset
868
jurzua
parents:
diff changeset
869 $(settings.outerSelector).scrollTop(newScroll.y).scrollLeft(newScroll.x);
jurzua
parents:
diff changeset
870
jurzua
parents:
diff changeset
871 settings.preZoomOffset = undefined;
jurzua
parents:
diff changeset
872 }
jurzua
parents:
diff changeset
873 else
jurzua
parents:
diff changeset
874 {
jurzua
parents:
diff changeset
875 // Otherwise, we just scroll to the page saved in settings.goDirectlyTo (must be valid)
jurzua
parents:
diff changeset
876 // Make sure the value for settings.goDirectlyTo is valid
jurzua
parents:
diff changeset
877 if (!isPageValid(settings.goDirectlyTo))
jurzua
parents:
diff changeset
878 {
jurzua
parents:
diff changeset
879 settings.goDirectlyTo = 0;
jurzua
parents:
diff changeset
880 }
jurzua
parents:
diff changeset
881
jurzua
parents:
diff changeset
882 // We use the stored y/x offsets (relative to the top of the page and the center, respectively)
jurzua
parents:
diff changeset
883 gotoPage(settings.goDirectlyTo, settings.verticalOffset, settings.horizontalOffset);
jurzua
parents:
diff changeset
884 settings.horizontalOffset = 0;
jurzua
parents:
diff changeset
885 settings.verticalOffset = 0;
jurzua
parents:
diff changeset
886 }
jurzua
parents:
diff changeset
887 };
jurzua
parents:
diff changeset
888
jurzua
parents:
diff changeset
889 // Don't call this when not in grid mode please
jurzua
parents:
diff changeset
890 // Scrolls to the relevant place when in grid view
jurzua
parents:
diff changeset
891 var gridScroll = function ()
jurzua
parents:
diff changeset
892 {
jurzua
parents:
diff changeset
893 // Figure out and scroll to the row containing the current page
jurzua
parents:
diff changeset
894 gotoRow(settings.goDirectlyTo);
jurzua
parents:
diff changeset
895 };
jurzua
parents:
diff changeset
896
jurzua
parents:
diff changeset
897 // If the given zoom level is valid, returns it; else, returns the min
jurzua
parents:
diff changeset
898 var getValidZoomLevel = function (zoomLevel)
jurzua
parents:
diff changeset
899 {
jurzua
parents:
diff changeset
900 return (zoomLevel >= settings.minZoomLevel && zoomLevel <= settings.maxZoomLevel) ? zoomLevel : settings.minZoomLevel;
jurzua
parents:
diff changeset
901 };
jurzua
parents:
diff changeset
902
jurzua
parents:
diff changeset
903 var getValidPagesPerRow = function (pagesPerRow)
jurzua
parents:
diff changeset
904 {
jurzua
parents:
diff changeset
905 return (pagesPerRow >= settings.minPagesPerRow && pagesPerRow <= settings.maxPagesPerRow) ? pagesPerRow : settings.maxPagesPerRow;
jurzua
parents:
diff changeset
906 };
jurzua
parents:
diff changeset
907
jurzua
parents:
diff changeset
908 // Reset some settings and empty the viewport
jurzua
parents:
diff changeset
909 var clearViewer = function ()
jurzua
parents:
diff changeset
910 {
jurzua
parents:
diff changeset
911 settings.allTilesLoaded = [];
jurzua
parents:
diff changeset
912 $(settings.outerSelector).scrollTop(0);
jurzua
parents:
diff changeset
913 settings.topScrollSoFar = 0;
jurzua
parents:
diff changeset
914 $(settings.innerSelector).empty();
jurzua
parents:
diff changeset
915 settings.firstPageLoaded = 0;
jurzua
parents:
diff changeset
916 settings.firstRowLoaded = -1;
jurzua
parents:
diff changeset
917 settings.previousTopScroll = 0;
jurzua
parents:
diff changeset
918
jurzua
parents:
diff changeset
919 // Clear all the timeouts to prevent undesired pages from loading
jurzua
parents:
diff changeset
920 clearTimeout(settings.resizeTimer);
jurzua
parents:
diff changeset
921
jurzua
parents:
diff changeset
922 while (settings.pageTimeouts.length)
jurzua
parents:
diff changeset
923 {
jurzua
parents:
diff changeset
924 clearTimeout(settings.pageTimeouts.pop());
jurzua
parents:
diff changeset
925 }
jurzua
parents:
diff changeset
926 };
jurzua
parents:
diff changeset
927
jurzua
parents:
diff changeset
928 // Called when we don't necessarily know which view to go into
jurzua
parents:
diff changeset
929 var loadViewer = function ()
jurzua
parents:
diff changeset
930 {
jurzua
parents:
diff changeset
931 if (settings.inGrid)
jurzua
parents:
diff changeset
932 {
jurzua
parents:
diff changeset
933 loadGrid();
jurzua
parents:
diff changeset
934 }
jurzua
parents:
diff changeset
935 else
jurzua
parents:
diff changeset
936 {
jurzua
parents:
diff changeset
937 loadDocument();
jurzua
parents:
diff changeset
938 }
jurzua
parents:
diff changeset
939 };
jurzua
parents:
diff changeset
940
jurzua
parents:
diff changeset
941 // Called every time we need to load document view (after zooming, fullscreen, etc)
jurzua
parents:
diff changeset
942 var loadDocument = function ()
jurzua
parents:
diff changeset
943 {
jurzua
parents:
diff changeset
944 clearViewer();
jurzua
parents:
diff changeset
945
jurzua
parents:
diff changeset
946 // Make sure the zoom level we've been given is valid
jurzua
parents:
diff changeset
947 settings.zoomLevel = getValidZoomLevel(settings.zoomLevel);
jurzua
parents:
diff changeset
948 var z = settings.zoomLevel;
jurzua
parents:
diff changeset
949
jurzua
parents:
diff changeset
950 // Calculate the horizontal and vertical inter-page padding
jurzua
parents:
diff changeset
951 if (settings.adaptivePadding > 0)
jurzua
parents:
diff changeset
952 {
jurzua
parents:
diff changeset
953 settings.horizontalPadding = settings.averageWidths[z] * settings.adaptivePadding;
jurzua
parents:
diff changeset
954 settings.verticalPadding = settings.averageHeights[z] * settings.adaptivePadding;
jurzua
parents:
diff changeset
955 }
jurzua
parents:
diff changeset
956 else
jurzua
parents:
diff changeset
957 {
jurzua
parents:
diff changeset
958 // It's less than or equal to 0; use fixedPadding instead
jurzua
parents:
diff changeset
959 settings.horizontalPadding = settings.fixedPadding;
jurzua
parents:
diff changeset
960 settings.verticalPadding = settings.fixedPadding;
jurzua
parents:
diff changeset
961 }
jurzua
parents:
diff changeset
962
jurzua
parents:
diff changeset
963 // Make sure the vertical padding is at least 40, if plugin icons are enabled
jurzua
parents:
diff changeset
964 if (settings.pageTools.length)
jurzua
parents:
diff changeset
965 {
jurzua
parents:
diff changeset
966 settings.verticalPadding = Math.max(40, settings.horizontalPadding);
jurzua
parents:
diff changeset
967 }
jurzua
parents:
diff changeset
968
jurzua
parents:
diff changeset
969 // Now reset some things that need to be changed after each zoom
jurzua
parents:
diff changeset
970 settings.totalHeight = settings.totalHeights[z] + settings.verticalPadding * (settings.numPages + 1);
jurzua
parents:
diff changeset
971 settings.dimAfterZoom = settings.totalHeight;
jurzua
parents:
diff changeset
972
jurzua
parents:
diff changeset
973 // Determine the width of the inner element (based on the max width)
jurzua
parents:
diff changeset
974 var maxWidthToSet = settings.maxWidths[z] + settings.horizontalPadding * 2;
jurzua
parents:
diff changeset
975 var widthToSet = Math.max(maxWidthToSet, settings.panelWidth);
jurzua
parents:
diff changeset
976
jurzua
parents:
diff changeset
977 // Needed to set settings.heightAbovePages - initially just the top padding
jurzua
parents:
diff changeset
978 var heightSoFar = 0;
jurzua
parents:
diff changeset
979 var i;
jurzua
parents:
diff changeset
980
jurzua
parents:
diff changeset
981 for (i = 0; i < settings.numPages; i++)
jurzua
parents:
diff changeset
982 {
jurzua
parents:
diff changeset
983 // First set the height above that page by adding this height to the previous total
jurzua
parents:
diff changeset
984 // A page includes the padding above it
jurzua
parents:
diff changeset
985 settings.heightAbovePages[i] = heightSoFar;
jurzua
parents:
diff changeset
986
jurzua
parents:
diff changeset
987 // Has to be done this way otherwise you get the height of the page included too
jurzua
parents:
diff changeset
988 heightSoFar = settings.heightAbovePages[i] + getPageData(i, 'h') + settings.verticalPadding;
jurzua
parents:
diff changeset
989
jurzua
parents:
diff changeset
990 // Figure out the pageLeftOffset stuff
jurzua
parents:
diff changeset
991 settings.pageLeftOffsets[i] = (widthToSet - getPageData(i, 'w')) / 2;
jurzua
parents:
diff changeset
992
jurzua
parents:
diff changeset
993 // Now try to load the page ONLY if the page needs to be loaded
jurzua
parents:
diff changeset
994 // Take scrolling into account later, just try this for now
jurzua
parents:
diff changeset
995 if (isPageVisible(i))
jurzua
parents:
diff changeset
996 {
jurzua
parents:
diff changeset
997 loadPage(i);
jurzua
parents:
diff changeset
998 settings.lastPageLoaded = i;
jurzua
parents:
diff changeset
999 }
jurzua
parents:
diff changeset
1000 }
jurzua
parents:
diff changeset
1001
jurzua
parents:
diff changeset
1002 // If this is not the initial load, execute the zoom callbacks
jurzua
parents:
diff changeset
1003 if (settings.oldZoomLevel >= 0)
jurzua
parents:
diff changeset
1004 {
jurzua
parents:
diff changeset
1005 if (settings.oldZoomLevel < settings.zoomLevel)
jurzua
parents:
diff changeset
1006 {
jurzua
parents:
diff changeset
1007 executeCallback(settings.onZoomIn, z);
jurzua
parents:
diff changeset
1008 }
jurzua
parents:
diff changeset
1009 else
jurzua
parents:
diff changeset
1010 {
jurzua
parents:
diff changeset
1011 executeCallback(settings.onZoomOut, z);
jurzua
parents:
diff changeset
1012 }
jurzua
parents:
diff changeset
1013
jurzua
parents:
diff changeset
1014 executeCallback(settings.onZoom, z);
jurzua
parents:
diff changeset
1015 }
jurzua
parents:
diff changeset
1016
jurzua
parents:
diff changeset
1017 // Set the height and width of documentpane (necessary for dragscrollable)
jurzua
parents:
diff changeset
1018 $(settings.innerSelector).height(Math.round(settings.totalHeight));
jurzua
parents:
diff changeset
1019 $(settings.innerSelector).width(Math.round(widthToSet));
jurzua
parents:
diff changeset
1020
jurzua
parents:
diff changeset
1021 // Scroll to the proper place
jurzua
parents:
diff changeset
1022 documentScroll();
jurzua
parents:
diff changeset
1023
jurzua
parents:
diff changeset
1024 // For the iPad - wait until this request finishes before accepting others
jurzua
parents:
diff changeset
1025 if (settings.scaleWait)
jurzua
parents:
diff changeset
1026 {
jurzua
parents:
diff changeset
1027 settings.scaleWait = false;
jurzua
parents:
diff changeset
1028 }
jurzua
parents:
diff changeset
1029
jurzua
parents:
diff changeset
1030 var fileName = settings.pages[settings.currentPageIndex].f;
jurzua
parents:
diff changeset
1031 executeCallback(settings.onDocumentLoaded, settings.lastPageLoaded, fileName);
jurzua
parents:
diff changeset
1032 Events.publish("DocumentHasFinishedLoading", [settings.lastPageLoaded, fileName]);
jurzua
parents:
diff changeset
1033 };
jurzua
parents:
diff changeset
1034
jurzua
parents:
diff changeset
1035 var loadGrid = function ()
jurzua
parents:
diff changeset
1036 {
jurzua
parents:
diff changeset
1037 clearViewer();
jurzua
parents:
diff changeset
1038
jurzua
parents:
diff changeset
1039 // Make sure the pages per row setting is valid
jurzua
parents:
diff changeset
1040 settings.pagesPerRow = getValidPagesPerRow(settings.pagesPerRow);
jurzua
parents:
diff changeset
1041
jurzua
parents:
diff changeset
1042 var horizontalPadding = settings.fixedPadding * (settings.pagesPerRow + 1);
jurzua
parents:
diff changeset
1043 var pageWidth = (settings.panelWidth - horizontalPadding) / settings.pagesPerRow;
jurzua
parents:
diff changeset
1044 settings.gridPageWidth = pageWidth;
jurzua
parents:
diff changeset
1045
jurzua
parents:
diff changeset
1046 // Calculate the row height depending on whether we want to fix the width or the height
jurzua
parents:
diff changeset
1047 settings.rowHeight = (settings.fixedHeightGrid) ? settings.fixedPadding + settings.minRatio * pageWidth : settings.fixedPadding + settings.maxRatio * pageWidth;
jurzua
parents:
diff changeset
1048 settings.numRows = Math.ceil(settings.numPages / settings.pagesPerRow);
jurzua
parents:
diff changeset
1049 settings.totalHeight = settings.numRows * settings.rowHeight + settings.fixedPadding;
jurzua
parents:
diff changeset
1050
jurzua
parents:
diff changeset
1051 $(settings.innerSelector).height(Math.round(settings.totalHeight));
jurzua
parents:
diff changeset
1052 $(settings.innerSelector).width(Math.round(settings.panelWidth));
jurzua
parents:
diff changeset
1053
jurzua
parents:
diff changeset
1054 // First scroll directly to the row containing the current page
jurzua
parents:
diff changeset
1055 gridScroll();
jurzua
parents:
diff changeset
1056
jurzua
parents:
diff changeset
1057 var i, rowIndex;
jurzua
parents:
diff changeset
1058
jurzua
parents:
diff changeset
1059 // Figure out the row each page is in
jurzua
parents:
diff changeset
1060 var np = settings.numPages;
jurzua
parents:
diff changeset
1061 for (i = 0; i < np; i += settings.pagesPerRow)
jurzua
parents:
diff changeset
1062 {
jurzua
parents:
diff changeset
1063 rowIndex = Math.floor(i / settings.pagesPerRow);
jurzua
parents:
diff changeset
1064
jurzua
parents:
diff changeset
1065 if (isRowVisible(rowIndex))
jurzua
parents:
diff changeset
1066 {
jurzua
parents:
diff changeset
1067 settings.firstRowLoaded = (settings.firstRowLoaded < 0) ? rowIndex : settings.firstRowLoaded;
jurzua
parents:
diff changeset
1068 loadRow(rowIndex);
jurzua
parents:
diff changeset
1069 settings.lastRowLoaded = rowIndex;
jurzua
parents:
diff changeset
1070 }
jurzua
parents:
diff changeset
1071 }
jurzua
parents:
diff changeset
1072 };
jurzua
parents:
diff changeset
1073
jurzua
parents:
diff changeset
1074 // Handles switching in and out of fullscreen mode
jurzua
parents:
diff changeset
1075 // Should only be called after changing settings.inFullscreen
jurzua
parents:
diff changeset
1076 var handleModeChange = function (changeView)
jurzua
parents:
diff changeset
1077 {
jurzua
parents:
diff changeset
1078 // Save some offsets (required for scrolling properly), if it's not the initial load
jurzua
parents:
diff changeset
1079 if (settings.oldZoomLevel >= 0)
jurzua
parents:
diff changeset
1080 {
jurzua
parents:
diff changeset
1081 if (!settings.inGrid)
jurzua
parents:
diff changeset
1082 {
jurzua
parents:
diff changeset
1083 var pageOffset = $(settings.selector + 'page-' + settings.currentPageIndex).offset();
jurzua
parents:
diff changeset
1084 var topOffset = -(pageOffset.top - settings.verticalPadding - settings.viewerYOffset);
jurzua
parents:
diff changeset
1085 var expectedLeft = (settings.panelWidth - getPageData(settings.currentPageIndex, 'w')) / 2;
jurzua
parents:
diff changeset
1086 var leftOffset = -(pageOffset.left - settings.viewerXOffset - expectedLeft);
jurzua
parents:
diff changeset
1087 settings.verticalOffset = topOffset;
jurzua
parents:
diff changeset
1088 settings.horizontalOffset = leftOffset;
jurzua
parents:
diff changeset
1089 }
jurzua
parents:
diff changeset
1090 }
jurzua
parents:
diff changeset
1091
jurzua
parents:
diff changeset
1092 // Change the look of the toolbar
jurzua
parents:
diff changeset
1093 Events.publish("ModeDidSwitch", null);
jurzua
parents:
diff changeset
1094
jurzua
parents:
diff changeset
1095 // Toggle the classes
jurzua
parents:
diff changeset
1096 $(settings.selector + 'fullscreen').toggleClass('diva-in-fullscreen');
jurzua
parents:
diff changeset
1097 $(settings.outerSelector).toggleClass('diva-fullscreen');
jurzua
parents:
diff changeset
1098 $('body').toggleClass('diva-hide-scrollbar');
jurzua
parents:
diff changeset
1099 $(settings.parentSelector).toggleClass('diva-full-width');
jurzua
parents:
diff changeset
1100
jurzua
parents:
diff changeset
1101 // Reset the panel dimensions
jurzua
parents:
diff changeset
1102 settings.panelHeight = $(settings.outerSelector).height();
jurzua
parents:
diff changeset
1103 settings.panelWidth = $(settings.outerSelector).width() - settings.scrollbarWidth;
jurzua
parents:
diff changeset
1104 $(settings.innerSelector).width(settings.panelWidth);
jurzua
parents:
diff changeset
1105
jurzua
parents:
diff changeset
1106 // Recalculate the viewer offsets
jurzua
parents:
diff changeset
1107 settings.viewerXOffset = $(settings.outerSelector).offset().left;
jurzua
parents:
diff changeset
1108 settings.viewerYOffset = $(settings.outerSelector).offset().top;
jurzua
parents:
diff changeset
1109
jurzua
parents:
diff changeset
1110 // Used by setState when we need to change the view and the mode
jurzua
parents:
diff changeset
1111 if (changeView)
jurzua
parents:
diff changeset
1112 {
jurzua
parents:
diff changeset
1113 settings.inGrid = !settings.inGrid;
jurzua
parents:
diff changeset
1114 handleViewChange();
jurzua
parents:
diff changeset
1115 }
jurzua
parents:
diff changeset
1116 else
jurzua
parents:
diff changeset
1117 {
jurzua
parents:
diff changeset
1118 loadViewer();
jurzua
parents:
diff changeset
1119 }
jurzua
parents:
diff changeset
1120
jurzua
parents:
diff changeset
1121 // Execute callbacks
jurzua
parents:
diff changeset
1122 executeCallback(settings.onModeToggle, settings.inFullscreen);
jurzua
parents:
diff changeset
1123 Events.publish("ModeHasChanged", [settings.inFullScreen]);
jurzua
parents:
diff changeset
1124 };
jurzua
parents:
diff changeset
1125
jurzua
parents:
diff changeset
1126 // Handles switching in and out of grid view
jurzua
parents:
diff changeset
1127 // Should only be called after changing settings.inGrid
jurzua
parents:
diff changeset
1128 var handleViewChange = function ()
jurzua
parents:
diff changeset
1129 {
jurzua
parents:
diff changeset
1130 // Switch the slider
jurzua
parents:
diff changeset
1131 // Events.publish("ViewDidSwitch", null);
jurzua
parents:
diff changeset
1132
jurzua
parents:
diff changeset
1133 loadViewer();
jurzua
parents:
diff changeset
1134 executeCallback(settings.onViewToggle, settings.inGrid);
jurzua
parents:
diff changeset
1135 Events.publish("ViewDidSwitch", [settings.inGrid]);
jurzua
parents:
diff changeset
1136 };
jurzua
parents:
diff changeset
1137
jurzua
parents:
diff changeset
1138 // Called when the fullscreen icon is clicked
jurzua
parents:
diff changeset
1139 var toggleFullscreen = function ()
jurzua
parents:
diff changeset
1140 {
jurzua
parents:
diff changeset
1141 settings.goDirectlyTo = settings.currentPageIndex;
jurzua
parents:
diff changeset
1142 settings.inFullscreen = !settings.inFullscreen;
jurzua
parents:
diff changeset
1143 handleModeChange(false);
jurzua
parents:
diff changeset
1144 };
jurzua
parents:
diff changeset
1145
jurzua
parents:
diff changeset
1146 // Called when the grid icon is clicked
jurzua
parents:
diff changeset
1147 var toggleGrid = function ()
jurzua
parents:
diff changeset
1148 {
jurzua
parents:
diff changeset
1149 settings.goDirectlyTo = settings.currentPageIndex;
jurzua
parents:
diff changeset
1150 settings.inGrid = !settings.inGrid;
jurzua
parents:
diff changeset
1151 handleViewChange();
jurzua
parents:
diff changeset
1152 };
jurzua
parents:
diff changeset
1153
jurzua
parents:
diff changeset
1154 // Called after double-click or ctrl+double-click events on pages in document view
jurzua
parents:
diff changeset
1155 var handleDocumentDoubleClick = function (event)
jurzua
parents:
diff changeset
1156 {
jurzua
parents:
diff changeset
1157 var pageOffset = $(this).offset();
jurzua
parents:
diff changeset
1158 var offsetX = event.pageX - pageOffset.left;
jurzua
parents:
diff changeset
1159 var offsetY = event.pageY - pageOffset.top;
jurzua
parents:
diff changeset
1160
jurzua
parents:
diff changeset
1161 // Store the offset information so that it can be used in documentScroll()
jurzua
parents:
diff changeset
1162 settings.preZoomOffset = {
jurzua
parents:
diff changeset
1163 x: offsetX,
jurzua
parents:
diff changeset
1164 y: offsetY,
jurzua
parents:
diff changeset
1165 originalX: event.pageX,
jurzua
parents:
diff changeset
1166 originalY: event.pageY,
jurzua
parents:
diff changeset
1167 i: $(this).attr('data-index')
jurzua
parents:
diff changeset
1168 };
jurzua
parents:
diff changeset
1169
jurzua
parents:
diff changeset
1170 // Hold control to zoom out, otherwise, zoom in
jurzua
parents:
diff changeset
1171 var newZoomLevel = (event.ctrlKey) ? settings.zoomLevel - 1 : settings.zoomLevel + 1;
jurzua
parents:
diff changeset
1172
jurzua
parents:
diff changeset
1173 handleZoom(newZoomLevel);
jurzua
parents:
diff changeset
1174 };
jurzua
parents:
diff changeset
1175
jurzua
parents:
diff changeset
1176 // Called after double-clicking on a page in grid view
jurzua
parents:
diff changeset
1177 var handleGridDoubleClick = function (event)
jurzua
parents:
diff changeset
1178 {
jurzua
parents:
diff changeset
1179 // Figure out the page that was clicked, scroll to that page
jurzua
parents:
diff changeset
1180 var sel = document.getElementById(settings.ID + "outer");
jurzua
parents:
diff changeset
1181 var centerX = (event.pageX - settings.viewerXOffset) + sel.scrollLeft;
jurzua
parents:
diff changeset
1182 var centerY = (event.pageY - settings.viewerYOffset) + sel.scrollTop;
jurzua
parents:
diff changeset
1183 var rowIndex = Math.floor(centerY / settings.rowHeight);
jurzua
parents:
diff changeset
1184 var colIndex = Math.floor(centerX / (settings.panelWidth / settings.pagesPerRow));
jurzua
parents:
diff changeset
1185 var pageIndex = rowIndex * settings.pagesPerRow + colIndex;
jurzua
parents:
diff changeset
1186 settings.goDirectlyTo = pageIndex;
jurzua
parents:
diff changeset
1187
jurzua
parents:
diff changeset
1188 // Leave grid view, jump directly to the desired page
jurzua
parents:
diff changeset
1189 settings.inGrid = false;
jurzua
parents:
diff changeset
1190 handleViewChange();
jurzua
parents:
diff changeset
1191 };
jurzua
parents:
diff changeset
1192
jurzua
parents:
diff changeset
1193 // Handles pinch-zooming for mobile devices
jurzua
parents:
diff changeset
1194 var handlePinchZoom = function (event)
jurzua
parents:
diff changeset
1195 {
jurzua
parents:
diff changeset
1196 var newZoomLevel = settings.zoomLevel;
jurzua
parents:
diff changeset
1197
jurzua
parents:
diff changeset
1198 // First figure out the new zoom level:
jurzua
parents:
diff changeset
1199 if (event.scale > 1 && newZoomLevel < settings.maxZoomLevel)
jurzua
parents:
diff changeset
1200 {
jurzua
parents:
diff changeset
1201 newZoomLevel++;
jurzua
parents:
diff changeset
1202 }
jurzua
parents:
diff changeset
1203 else if (event.scale < 1 && newZoomLevel > settings.minZoomLevel)
jurzua
parents:
diff changeset
1204 {
jurzua
parents:
diff changeset
1205 newZoomLevel--;
jurzua
parents:
diff changeset
1206 }
jurzua
parents:
diff changeset
1207 else
jurzua
parents:
diff changeset
1208 {
jurzua
parents:
diff changeset
1209 return;
jurzua
parents:
diff changeset
1210 }
jurzua
parents:
diff changeset
1211
jurzua
parents:
diff changeset
1212 // Set it to true so we have to wait for this one to finish
jurzua
parents:
diff changeset
1213 settings.scaleWait = true;
jurzua
parents:
diff changeset
1214
jurzua
parents:
diff changeset
1215 // Has to call handleZoomSlide so that the coordinates are kept
jurzua
parents:
diff changeset
1216 handleZoom(newZoomLevel);
jurzua
parents:
diff changeset
1217 };
jurzua
parents:
diff changeset
1218
jurzua
parents:
diff changeset
1219 // Called to handle any zoom level
jurzua
parents:
diff changeset
1220 var handleZoom = function (newValue)
jurzua
parents:
diff changeset
1221 {
jurzua
parents:
diff changeset
1222 var newZoomLevel = getValidZoomLevel(newValue);
jurzua
parents:
diff changeset
1223
jurzua
parents:
diff changeset
1224 // If the zoom level provided is invalid, return false
jurzua
parents:
diff changeset
1225 if (newZoomLevel !== newValue)
jurzua
parents:
diff changeset
1226 {
jurzua
parents:
diff changeset
1227 return false;
jurzua
parents:
diff changeset
1228 }
jurzua
parents:
diff changeset
1229
jurzua
parents:
diff changeset
1230 settings.oldZoomLevel = settings.zoomLevel;
jurzua
parents:
diff changeset
1231 settings.zoomLevel = newZoomLevel;
jurzua
parents:
diff changeset
1232
jurzua
parents:
diff changeset
1233 // Update the slider
jurzua
parents:
diff changeset
1234 Events.publish("ZoomLevelDidChange", null);
jurzua
parents:
diff changeset
1235
jurzua
parents:
diff changeset
1236 loadDocument();
jurzua
parents:
diff changeset
1237
jurzua
parents:
diff changeset
1238 return true;
jurzua
parents:
diff changeset
1239 };
jurzua
parents:
diff changeset
1240
jurzua
parents:
diff changeset
1241 // Called to handle changing the pages per row slider
jurzua
parents:
diff changeset
1242 var handleGrid = function (newValue)
jurzua
parents:
diff changeset
1243 {
jurzua
parents:
diff changeset
1244 var newPagesPerRow = getValidPagesPerRow(newValue);
jurzua
parents:
diff changeset
1245
jurzua
parents:
diff changeset
1246 // If the value provided is invalid, return false
jurzua
parents:
diff changeset
1247 if (newPagesPerRow !== newValue)
jurzua
parents:
diff changeset
1248 {
jurzua
parents:
diff changeset
1249 return false;
jurzua
parents:
diff changeset
1250 }
jurzua
parents:
diff changeset
1251
jurzua
parents:
diff changeset
1252 settings.oldPagesPerRow = settings.zoomLevel;
jurzua
parents:
diff changeset
1253 settings.pagesPerRow = newPagesPerRow;
jurzua
parents:
diff changeset
1254
jurzua
parents:
diff changeset
1255 // Update the slider
jurzua
parents:
diff changeset
1256 Events.publish("GridRowNumberDidChange", null);
jurzua
parents:
diff changeset
1257
jurzua
parents:
diff changeset
1258 loadGrid();
jurzua
parents:
diff changeset
1259 };
jurzua
parents:
diff changeset
1260
jurzua
parents:
diff changeset
1261 var getYOffset = function ()
jurzua
parents:
diff changeset
1262 {
jurzua
parents:
diff changeset
1263 var yScroll = document.getElementById(settings.ID + "outer").scrollTop;
jurzua
parents:
diff changeset
1264 var topOfPage = settings.heightAbovePages[settings.currentPageIndex];
jurzua
parents:
diff changeset
1265
jurzua
parents:
diff changeset
1266 return parseInt(yScroll - topOfPage, 10);
jurzua
parents:
diff changeset
1267 };
jurzua
parents:
diff changeset
1268
jurzua
parents:
diff changeset
1269 var getXOffset = function ()
jurzua
parents:
diff changeset
1270 {
jurzua
parents:
diff changeset
1271 var innerWidth = settings.maxWidths[settings.zoomLevel] + settings.horizontalPadding * 2;
jurzua
parents:
diff changeset
1272 var centerX = (innerWidth - settings.panelWidth) / 2;
jurzua
parents:
diff changeset
1273 var xoff = document.getElementById(settings.ID + "outer").scrollLeft - centerX;
jurzua
parents:
diff changeset
1274 return parseInt(xoff, 10);
jurzua
parents:
diff changeset
1275 };
jurzua
parents:
diff changeset
1276
jurzua
parents:
diff changeset
1277 var getState = function ()
jurzua
parents:
diff changeset
1278 {
jurzua
parents:
diff changeset
1279 var state = {
jurzua
parents:
diff changeset
1280 'f': settings.inFullscreen,
jurzua
parents:
diff changeset
1281 'g': settings.inGrid,
jurzua
parents:
diff changeset
1282 'z': settings.zoomLevel,
jurzua
parents:
diff changeset
1283 'n': settings.pagesPerRow,
jurzua
parents:
diff changeset
1284 'i': (settings.enableFilename) ? settings.pages[settings.currentPageIndex].f : false,
jurzua
parents:
diff changeset
1285 'p': (settings.enableFilename) ? false : settings.currentPageIndex + 1,
jurzua
parents:
diff changeset
1286 'y': (settings.inGrid) ? false : getYOffset(),
jurzua
parents:
diff changeset
1287 'x': (settings.inGrid) ? false : getXOffset(),
jurzua
parents:
diff changeset
1288 'h': (settings.inFullscreen) ? false : settings.panelHeight,
jurzua
parents:
diff changeset
1289 'w': (settings.inFullscreen) ? false : $(settings.outerSelector).width()
jurzua
parents:
diff changeset
1290 };
jurzua
parents:
diff changeset
1291
jurzua
parents:
diff changeset
1292 return state;
jurzua
parents:
diff changeset
1293 };
jurzua
parents:
diff changeset
1294
jurzua
parents:
diff changeset
1295 var getURLHash = function ()
jurzua
parents:
diff changeset
1296 {
jurzua
parents:
diff changeset
1297 var hashParams = getState();
jurzua
parents:
diff changeset
1298 var hashStringBuilder = [];
jurzua
parents:
diff changeset
1299 var param;
jurzua
parents:
diff changeset
1300
jurzua
parents:
diff changeset
1301 for (param in hashParams)
jurzua
parents:
diff changeset
1302 {
jurzua
parents:
diff changeset
1303 if (hashParams[param] !== false)
jurzua
parents:
diff changeset
1304 {
jurzua
parents:
diff changeset
1305 hashStringBuilder.push(param + settings.hashParamSuffix + '=' + hashParams[param]);
jurzua
parents:
diff changeset
1306 }
jurzua
parents:
diff changeset
1307 }
jurzua
parents:
diff changeset
1308
jurzua
parents:
diff changeset
1309 return hashStringBuilder.join('&');
jurzua
parents:
diff changeset
1310 };
jurzua
parents:
diff changeset
1311
jurzua
parents:
diff changeset
1312 // Returns the URL to the current state of the document viewer (so it should be an exact replica)
jurzua
parents:
diff changeset
1313 var getCurrentURL = function ()
jurzua
parents:
diff changeset
1314 {
jurzua
parents:
diff changeset
1315 return location.protocol + '//' + location.host + location.pathname + '#' + getURLHash();
jurzua
parents:
diff changeset
1316 };
jurzua
parents:
diff changeset
1317
jurzua
parents:
diff changeset
1318 // Called in init and when the orientation changes
jurzua
parents:
diff changeset
1319 var adjustMobileWebkitDims = function ()
jurzua
parents:
diff changeset
1320 {
jurzua
parents:
diff changeset
1321 var outerOffset = $(settings.outerSelector).offset().top;
jurzua
parents:
diff changeset
1322 settings.panelHeight = window.innerHeight - outerOffset - settings.viewerHeightPadding;
jurzua
parents:
diff changeset
1323 settings.panelWidth = window.innerWidth - settings.viewerWidthPadding;
jurzua
parents:
diff changeset
1324
jurzua
parents:
diff changeset
1325 // $(settings.parentSelector).width(settings.panelWidth);
jurzua
parents:
diff changeset
1326 // document.getElementById(settings.parentSelector.substring(1)).style.width = settings.panelWidth + "px";
jurzua
parents:
diff changeset
1327 settings.parentSelector.style.width = settings.panelWidth + "px";
jurzua
parents:
diff changeset
1328
jurzua
parents:
diff changeset
1329 if (settings.enableAutoHeight)
jurzua
parents:
diff changeset
1330 {
jurzua
parents:
diff changeset
1331 document.getElementById(settings.ID + "outer").style.height = settings.panelHeight + "px";
jurzua
parents:
diff changeset
1332 }
jurzua
parents:
diff changeset
1333
jurzua
parents:
diff changeset
1334 if (settings.enableAutoWidth)
jurzua
parents:
diff changeset
1335 {
jurzua
parents:
diff changeset
1336 document.getElementById(settings.ID + "outer").style.width = settings.panelWidth + "px";
jurzua
parents:
diff changeset
1337 }
jurzua
parents:
diff changeset
1338 };
jurzua
parents:
diff changeset
1339
jurzua
parents:
diff changeset
1340 // Will return true if something has changed, false otherwise
jurzua
parents:
diff changeset
1341 var adjustBrowserDims = function ()
jurzua
parents:
diff changeset
1342 {
jurzua
parents:
diff changeset
1343 // Only resize if the browser viewport is too small
jurzua
parents:
diff changeset
1344 var newHeight = $(settings.outerSelector).height();
jurzua
parents:
diff changeset
1345 var newWidth = $(settings.parentSelector).width() - settings.scrollbarWidth;
jurzua
parents:
diff changeset
1346 var outerOffset = $(settings.outerSelector).offset().top;
jurzua
parents:
diff changeset
1347
jurzua
parents:
diff changeset
1348 var windowHeight = window.innerHeight || document.documentElement.clientHeight;
jurzua
parents:
diff changeset
1349 var windowWidth = window.innerWidth || document.documentElement.clientWidth;
jurzua
parents:
diff changeset
1350 // 2 or 1 pixels for the border
jurzua
parents:
diff changeset
1351 var desiredWidth = windowWidth - settings.viewerWidthPadding - settings.scrollbarWidth - 2;
jurzua
parents:
diff changeset
1352 var desiredHeight = windowHeight - outerOffset - settings.viewerHeightPadding - 1;
jurzua
parents:
diff changeset
1353
jurzua
parents:
diff changeset
1354 if (settings.enableAutoHeight)
jurzua
parents:
diff changeset
1355 {
jurzua
parents:
diff changeset
1356 if (newHeight + outerOffset + 16 > window.innerHeight)
jurzua
parents:
diff changeset
1357 {
jurzua
parents:
diff changeset
1358 newHeight = desiredHeight;
jurzua
parents:
diff changeset
1359 }
jurzua
parents:
diff changeset
1360 else if (newHeight <= settings.originalHeight)
jurzua
parents:
diff changeset
1361 {
jurzua
parents:
diff changeset
1362 newHeight = Math.min(desiredHeight, settings.originalHeight);
jurzua
parents:
diff changeset
1363 }
jurzua
parents:
diff changeset
1364 }
jurzua
parents:
diff changeset
1365
jurzua
parents:
diff changeset
1366 if (settings.enableAutoWidth)
jurzua
parents:
diff changeset
1367 {
jurzua
parents:
diff changeset
1368 if (newWidth + 32 > window.innerWidth)
jurzua
parents:
diff changeset
1369 {
jurzua
parents:
diff changeset
1370 newWidth = desiredWidth;
jurzua
parents:
diff changeset
1371 }
jurzua
parents:
diff changeset
1372 else if (newWidth <= settings.originalWidth)
jurzua
parents:
diff changeset
1373 {
jurzua
parents:
diff changeset
1374 newWidth = Math.min(desiredWidth, settings.originalWidth);
jurzua
parents:
diff changeset
1375 }
jurzua
parents:
diff changeset
1376
jurzua
parents:
diff changeset
1377 settings.parentSelector[0].style.width = newWidth + settings.scrollbarWidth;
jurzua
parents:
diff changeset
1378 }
jurzua
parents:
diff changeset
1379
jurzua
parents:
diff changeset
1380 if (newWidth !== settings.panelWidth || newHeight !== settings.panelHeight)
jurzua
parents:
diff changeset
1381 {
jurzua
parents:
diff changeset
1382 var el = document.getElementById(settings.ID + "outer");
jurzua
parents:
diff changeset
1383 el.style.height = newHeight + "px";
jurzua
parents:
diff changeset
1384 el.style.width = newWidth + settings.scrollbarWidth + "px";
jurzua
parents:
diff changeset
1385 settings.panelWidth = newWidth;
jurzua
parents:
diff changeset
1386 settings.panelHeight = newHeight;
jurzua
parents:
diff changeset
1387 return true;
jurzua
parents:
diff changeset
1388 }
jurzua
parents:
diff changeset
1389
jurzua
parents:
diff changeset
1390 return false;
jurzua
parents:
diff changeset
1391 };
jurzua
parents:
diff changeset
1392
jurzua
parents:
diff changeset
1393 // Update the panelHeight and panelWidth based on the window size
jurzua
parents:
diff changeset
1394 var adjustFullscreenDims = function ()
jurzua
parents:
diff changeset
1395 {
jurzua
parents:
diff changeset
1396 settings.panelWidth = window.innerWidth - settings.scrollbarWidth;
jurzua
parents:
diff changeset
1397 settings.panelHeight = window.innerHeight;
jurzua
parents:
diff changeset
1398
jurzua
parents:
diff changeset
1399 return true;
jurzua
parents:
diff changeset
1400 };
jurzua
parents:
diff changeset
1401
jurzua
parents:
diff changeset
1402 var resizeViewer = function (newWidth, newHeight)
jurzua
parents:
diff changeset
1403 {
jurzua
parents:
diff changeset
1404 if (newWidth >= settings.minWidth)
jurzua
parents:
diff changeset
1405 {
jurzua
parents:
diff changeset
1406 settings.originalWidth = newWidth;
jurzua
parents:
diff changeset
1407 $(settings.outerSelector).width(newWidth);
jurzua
parents:
diff changeset
1408 document.getElementById(settings.ID + "outer").style.width = newWidth + "px";
jurzua
parents:
diff changeset
1409
jurzua
parents:
diff changeset
1410 settings.panelWidth = newWidth - settings.scrollbarWidth;
jurzua
parents:
diff changeset
1411
jurzua
parents:
diff changeset
1412 // Should also change the width of the container
jurzua
parents:
diff changeset
1413 settings.parentSelector[0].style.width = newWidth + "px";
jurzua
parents:
diff changeset
1414 }
jurzua
parents:
diff changeset
1415
jurzua
parents:
diff changeset
1416 if (newHeight >= settings.minHeight)
jurzua
parents:
diff changeset
1417 {
jurzua
parents:
diff changeset
1418 settings.originalHeight = newHeight;
jurzua
parents:
diff changeset
1419 document.getElementById(settings.ID + "outer").style.height = newHeight + "px";
jurzua
parents:
diff changeset
1420
jurzua
parents:
diff changeset
1421 settings.panelHeight = newHeight;
jurzua
parents:
diff changeset
1422 }
jurzua
parents:
diff changeset
1423 };
jurzua
parents:
diff changeset
1424
jurzua
parents:
diff changeset
1425 // Binds most of the event handlers (some more in createToolbar)
jurzua
parents:
diff changeset
1426 var handleEvents = function ()
jurzua
parents:
diff changeset
1427 {
jurzua
parents:
diff changeset
1428 // Create the fullscreen toggle icon if fullscreen is enabled
jurzua
parents:
diff changeset
1429 if (settings.enableFullscreen)
jurzua
parents:
diff changeset
1430 {
jurzua
parents:
diff changeset
1431 // Event handler for fullscreen toggling
jurzua
parents:
diff changeset
1432 $(settings.selector + 'fullscreen').click(function ()
jurzua
parents:
diff changeset
1433 {
jurzua
parents:
diff changeset
1434 toggleFullscreen();
jurzua
parents:
diff changeset
1435 });
jurzua
parents:
diff changeset
1436 }
jurzua
parents:
diff changeset
1437
jurzua
parents:
diff changeset
1438 // Change the cursor for dragging
jurzua
parents:
diff changeset
1439 $(settings.innerSelector).mouseover(function ()
jurzua
parents:
diff changeset
1440 {
jurzua
parents:
diff changeset
1441 $(this).removeClass('diva-grabbing').addClass('diva-grab');
jurzua
parents:
diff changeset
1442 });
jurzua
parents:
diff changeset
1443
jurzua
parents:
diff changeset
1444 $(settings.innerSelector).mouseout(function ()
jurzua
parents:
diff changeset
1445 {
jurzua
parents:
diff changeset
1446 $(this).removeClass('diva-grab');
jurzua
parents:
diff changeset
1447 });
jurzua
parents:
diff changeset
1448
jurzua
parents:
diff changeset
1449 $(settings.innerSelector).mousedown(function ()
jurzua
parents:
diff changeset
1450 {
jurzua
parents:
diff changeset
1451 $(this).removeClass('diva-grab').addClass('diva-grabbing');
jurzua
parents:
diff changeset
1452 });
jurzua
parents:
diff changeset
1453
jurzua
parents:
diff changeset
1454 $(settings.innerSelector).mouseup(function ()
jurzua
parents:
diff changeset
1455 {
jurzua
parents:
diff changeset
1456 $(this).removeClass('diva-grabbing').addClass('diva-grab');
jurzua
parents:
diff changeset
1457 });
jurzua
parents:
diff changeset
1458
jurzua
parents:
diff changeset
1459 // Set drag scroll on first descendant of class dragger on both selected elements
jurzua
parents:
diff changeset
1460 $(settings.outerSelector + ', ' + settings.innerSelector).dragscrollable({dragSelector: '.diva-dragger', acceptPropagatedEvent: true});
jurzua
parents:
diff changeset
1461
jurzua
parents:
diff changeset
1462 // Handle the scroll
jurzua
parents:
diff changeset
1463 $(settings.outerSelector).scroll(function ()
jurzua
parents:
diff changeset
1464 {
jurzua
parents:
diff changeset
1465 settings.topScrollSoFar = document.getElementById(settings.ID + "outer").scrollTop;
jurzua
parents:
diff changeset
1466 var direction = settings.topScrollSoFar - settings.previousTopScroll;
jurzua
parents:
diff changeset
1467
jurzua
parents:
diff changeset
1468 if (settings.inGrid)
jurzua
parents:
diff changeset
1469 {
jurzua
parents:
diff changeset
1470 adjustRows(direction);
jurzua
parents:
diff changeset
1471 }
jurzua
parents:
diff changeset
1472 else
jurzua
parents:
diff changeset
1473 {
jurzua
parents:
diff changeset
1474 adjustPages(direction);
jurzua
parents:
diff changeset
1475 settings.leftScrollSoFar = $(this).scrollLeft();
jurzua
parents:
diff changeset
1476 }
jurzua
parents:
diff changeset
1477
jurzua
parents:
diff changeset
1478 settings.previousTopScroll = settings.topScrollSoFar;
jurzua
parents:
diff changeset
1479 });
jurzua
parents:
diff changeset
1480
jurzua
parents:
diff changeset
1481 // Double-click to zoom
jurzua
parents:
diff changeset
1482 $(settings.outerSelector).on('dblclick', '.diva-document-page', function (event)
jurzua
parents:
diff changeset
1483 {
jurzua
parents:
diff changeset
1484 handleDocumentDoubleClick.call(this, event);
jurzua
parents:
diff changeset
1485 });
jurzua
parents:
diff changeset
1486
jurzua
parents:
diff changeset
1487 // Handle the control key for macs (in conjunction with double-clicking)
jurzua
parents:
diff changeset
1488 $(settings.outerSelector).on('contextmenu', '.diva-document-page', function (event)
jurzua
parents:
diff changeset
1489 {
jurzua
parents:
diff changeset
1490 if (event.ctrlKey)
jurzua
parents:
diff changeset
1491 {
jurzua
parents:
diff changeset
1492 // In Firefox, this doesn't trigger a double-click, so we apply one manually
jurzua
parents:
diff changeset
1493 clearTimeout(settings.singleClickTimeout);
jurzua
parents:
diff changeset
1494
jurzua
parents:
diff changeset
1495 if (settings.singleClick)
jurzua
parents:
diff changeset
1496 {
jurzua
parents:
diff changeset
1497 handleDocumentDoubleClick.call(this, event);
jurzua
parents:
diff changeset
1498 settings.singleClick = false;
jurzua
parents:
diff changeset
1499 }
jurzua
parents:
diff changeset
1500 else
jurzua
parents:
diff changeset
1501 {
jurzua
parents:
diff changeset
1502 settings.singleClick = true;
jurzua
parents:
diff changeset
1503
jurzua
parents:
diff changeset
1504 // Set it to false again after 500 milliseconds (standard double-click timeout)
jurzua
parents:
diff changeset
1505 settings.singleClickTimeout = setTimeout(function ()
jurzua
parents:
diff changeset
1506 {
jurzua
parents:
diff changeset
1507 settings.singleClick = false;
jurzua
parents:
diff changeset
1508 }, 500);
jurzua
parents:
diff changeset
1509 }
jurzua
parents:
diff changeset
1510
jurzua
parents:
diff changeset
1511 return false;
jurzua
parents:
diff changeset
1512 }
jurzua
parents:
diff changeset
1513 });
jurzua
parents:
diff changeset
1514
jurzua
parents:
diff changeset
1515 $(settings.outerSelector).on('dblclick', '.diva-row', function (event)
jurzua
parents:
diff changeset
1516 {
jurzua
parents:
diff changeset
1517 handleGridDoubleClick.call(this, event);
jurzua
parents:
diff changeset
1518 });
jurzua
parents:
diff changeset
1519
jurzua
parents:
diff changeset
1520 // Check if the user is on a iPhone or iPod touch or iPad
jurzua
parents:
diff changeset
1521 if (settings.mobileWebkit)
jurzua
parents:
diff changeset
1522 {
jurzua
parents:
diff changeset
1523 // Prevent resizing (below from http://matt.might.net/articles/how-to-native-iphone-ipad-apps-in-javascript/)
jurzua
parents:
diff changeset
1524 var toAppend = [];
jurzua
parents:
diff changeset
1525 toAppend.push('<meta name="viewport" content="user-scalable=no, width=device-width, initial-scale=1, maximum-scale=1" />');
jurzua
parents:
diff changeset
1526
jurzua
parents:
diff changeset
1527 // Eliminate URL and button bars if added to home screen
jurzua
parents:
diff changeset
1528 toAppend.push('<meta name="apple-mobile-web-app-capable" content="yes" />');
jurzua
parents:
diff changeset
1529
jurzua
parents:
diff changeset
1530 // Choose how to handle the phone status bar
jurzua
parents:
diff changeset
1531 toAppend.push('<meta name="apple-mobile-web-app-status-bar-style" content="black" />');
jurzua
parents:
diff changeset
1532 $('head').append(toAppend.join('\n'));
jurzua
parents:
diff changeset
1533
jurzua
parents:
diff changeset
1534 // Block the user from moving the window only if it's not integrated
jurzua
parents:
diff changeset
1535 if (settings.blockMobileMove)
jurzua
parents:
diff changeset
1536 {
jurzua
parents:
diff changeset
1537 $('body').bind('touchmove', function (event)
jurzua
parents:
diff changeset
1538 {
jurzua
parents:
diff changeset
1539 var e = event.originalEvent;
jurzua
parents:
diff changeset
1540 e.preventDefault();
jurzua
parents:
diff changeset
1541
jurzua
parents:
diff changeset
1542 return false;
jurzua
parents:
diff changeset
1543 });
jurzua
parents:
diff changeset
1544 }
jurzua
parents:
diff changeset
1545
jurzua
parents:
diff changeset
1546 // Allow pinch-zooming
jurzua
parents:
diff changeset
1547 $('body').bind('gestureend', function (event)
jurzua
parents:
diff changeset
1548 {
jurzua
parents:
diff changeset
1549 var e = event.originalEvent;
jurzua
parents:
diff changeset
1550
jurzua
parents:
diff changeset
1551 if (!settings.scaleWait)
jurzua
parents:
diff changeset
1552 {
jurzua
parents:
diff changeset
1553 // Save the page we're currently on so we scroll there
jurzua
parents:
diff changeset
1554 settings.goDirectlyTo = settings.currentPageIndex;
jurzua
parents:
diff changeset
1555
jurzua
parents:
diff changeset
1556 if (settings.inGrid)
jurzua
parents:
diff changeset
1557 {
jurzua
parents:
diff changeset
1558 settings.inGrid = false;
jurzua
parents:
diff changeset
1559
jurzua
parents:
diff changeset
1560 handleViewChange();
jurzua
parents:
diff changeset
1561 }
jurzua
parents:
diff changeset
1562 else
jurzua
parents:
diff changeset
1563 {
jurzua
parents:
diff changeset
1564 handlePinchZoom(e);
jurzua
parents:
diff changeset
1565 }
jurzua
parents:
diff changeset
1566 }
jurzua
parents:
diff changeset
1567 return false;
jurzua
parents:
diff changeset
1568 });
jurzua
parents:
diff changeset
1569
jurzua
parents:
diff changeset
1570 // Listen to orientation change event
jurzua
parents:
diff changeset
1571 $(window).bind('orientationchange', function (event)
jurzua
parents:
diff changeset
1572 {
jurzua
parents:
diff changeset
1573 settings.orientationChange = true;
jurzua
parents:
diff changeset
1574 adjustMobileWebkitDims();
jurzua
parents:
diff changeset
1575
jurzua
parents:
diff changeset
1576 // Reload the viewer to account for the resized viewport
jurzua
parents:
diff changeset
1577 settings.goDirectlyTo = settings.currentPageIndex;
jurzua
parents:
diff changeset
1578 loadViewer();
jurzua
parents:
diff changeset
1579 });
jurzua
parents:
diff changeset
1580
jurzua
parents:
diff changeset
1581 // Inertial scrolling
jurzua
parents:
diff changeset
1582 $(settings.outerSelector).kinetic();
jurzua
parents:
diff changeset
1583 }
jurzua
parents:
diff changeset
1584
jurzua
parents:
diff changeset
1585 // Only check if either scrollBySpace or scrollByKeys is enabled
jurzua
parents:
diff changeset
1586 if (settings.enableSpaceScroll || settings.enableKeyScroll)
jurzua
parents:
diff changeset
1587 {
jurzua
parents:
diff changeset
1588 var spaceKey = $.ui.keyCode.SPACE;
jurzua
parents:
diff changeset
1589 var pageUpKey = $.ui.keyCode.PAGE_UP;
jurzua
parents:
diff changeset
1590 var pageDownKey = $.ui.keyCode.PAGE_DOWN;
jurzua
parents:
diff changeset
1591 var homeKey = $.ui.keyCode.HOME;
jurzua
parents:
diff changeset
1592 var endKey = $.ui.keyCode.END;
jurzua
parents:
diff changeset
1593
jurzua
parents:
diff changeset
1594 // Catch the key presses in document
jurzua
parents:
diff changeset
1595 $(document).keydown(function (event)
jurzua
parents:
diff changeset
1596 {
jurzua
parents:
diff changeset
1597 // Space or page down - go to the next page
jurzua
parents:
diff changeset
1598 if ((settings.enableSpaceScroll && event.keyCode === spaceKey) || (settings.enableKeyScroll && event.keyCode === pageDownKey))
jurzua
parents:
diff changeset
1599 {
jurzua
parents:
diff changeset
1600 $(settings.outerSelector).scrollTop(settings.topScrollSoFar + settings.panelHeight);
jurzua
parents:
diff changeset
1601 return false;
jurzua
parents:
diff changeset
1602 }
jurzua
parents:
diff changeset
1603
jurzua
parents:
diff changeset
1604 // Page up - go to the previous page
jurzua
parents:
diff changeset
1605 if (settings.enableKeyScroll && event.keyCode === pageUpKey)
jurzua
parents:
diff changeset
1606 {
jurzua
parents:
diff changeset
1607 $(settings.outerSelector).scrollTop(settings.topScrollSoFar - settings.panelHeight);
jurzua
parents:
diff changeset
1608 return false;
jurzua
parents:
diff changeset
1609 }
jurzua
parents:
diff changeset
1610
jurzua
parents:
diff changeset
1611 // Home key - go to the beginning of the document
jurzua
parents:
diff changeset
1612 if (settings.enableKeyScroll && event.keyCode === homeKey)
jurzua
parents:
diff changeset
1613 {
jurzua
parents:
diff changeset
1614 $(settings.outerSelector).scrollTop(0);
jurzua
parents:
diff changeset
1615 return false;
jurzua
parents:
diff changeset
1616 }
jurzua
parents:
diff changeset
1617
jurzua
parents:
diff changeset
1618 // End key - go to the end of the document
jurzua
parents:
diff changeset
1619 if (settings.enableKeyScroll && event.keyCode === endKey)
jurzua
parents:
diff changeset
1620 {
jurzua
parents:
diff changeset
1621 $(settings.outerSelector).scrollTop(settings.totalHeight);
jurzua
parents:
diff changeset
1622 return false;
jurzua
parents:
diff changeset
1623 }
jurzua
parents:
diff changeset
1624 });
jurzua
parents:
diff changeset
1625
jurzua
parents:
diff changeset
1626 // Handle window resizing events
jurzua
parents:
diff changeset
1627 if (!settings.mobileWebkit)
jurzua
parents:
diff changeset
1628 {
jurzua
parents:
diff changeset
1629 $(window).resize(function ()
jurzua
parents:
diff changeset
1630 {
jurzua
parents:
diff changeset
1631 var adjustSuccess = (settings.inFullscreen) ? adjustFullscreenDims() : adjustBrowserDims();
jurzua
parents:
diff changeset
1632
jurzua
parents:
diff changeset
1633 if (adjustSuccess)
jurzua
parents:
diff changeset
1634 {
jurzua
parents:
diff changeset
1635 // Cancel any previously-set resize timeouts
jurzua
parents:
diff changeset
1636 clearTimeout(settings.resizeTimer);
jurzua
parents:
diff changeset
1637
jurzua
parents:
diff changeset
1638 settings.resizeTimer = setTimeout(function ()
jurzua
parents:
diff changeset
1639 {
jurzua
parents:
diff changeset
1640 settings.goDirectlyTo = settings.currentPageIndex;
jurzua
parents:
diff changeset
1641 loadViewer();
jurzua
parents:
diff changeset
1642 }, 200);
jurzua
parents:
diff changeset
1643 }
jurzua
parents:
diff changeset
1644 });
jurzua
parents:
diff changeset
1645 }
jurzua
parents:
diff changeset
1646 }
jurzua
parents:
diff changeset
1647 };
jurzua
parents:
diff changeset
1648
jurzua
parents:
diff changeset
1649 // Handles all status updating etc (both fullscreen and not)
jurzua
parents:
diff changeset
1650 var createToolbar = function () {
jurzua
parents:
diff changeset
1651 // Prepare the HTML for the various components
jurzua
parents:
diff changeset
1652 var gridIconHTML = (settings.enableGridIcon) ? '<div class="diva-grid-icon' + (settings.inGrid ? ' diva-in-grid' : '') + '" id="' + settings.ID + 'grid-icon" title="Toggle grid view"></div>' : '';
jurzua
parents:
diff changeset
1653 var linkIconHTML = (settings.enableLinkIcon) ? '<div class="diva-link-icon" id="' + settings.ID + 'link-icon" style="' + (settings.enableGridIcon ? 'border-left: 0px' : '') + '" title="Link to this page"></div>' : '';
jurzua
parents:
diff changeset
1654 var zoomSliderHTML = (settings.enableZoomSlider) ? '<div id="' + settings.ID + 'zoom-slider"></div>' : '';
jurzua
parents:
diff changeset
1655 var gridSliderHTML = (settings.enableGridSlider) ? '<div id="' + settings.ID + 'grid-slider"></div>' : '';
jurzua
parents:
diff changeset
1656 var gotoPageHTML = (settings.enableGotoPage) ? '<form id="' + settings.ID + 'goto-page" class="diva-goto-form"><input type="text" id="' + settings.ID + 'goto-page-input" / class="diva-input"> <input type="submit" value="Go" style="margin-top: 0px;" /></form>' : '';
jurzua
parents:
diff changeset
1657 var zoomSliderLabelHTML = (settings.enableZoomSlider) ? '<div id="' + settings.ID + 'zoom-slider-label" class="diva-slider-label">Zoom level: <span id="' + settings.ID + 'zoom-level">' + settings.zoomLevel + '</span></div>' : '';
jurzua
parents:
diff changeset
1658 var gridSliderLabelHTML = (settings.enableGridSlider) ? '<div id="' + settings.ID + 'grid-slider-label" class="diva-slider-label">Pages per row: <span id="' + settings.ID + 'pages-per-row">' + settings.pagesPerRow + '</span></div>' : '';
jurzua
parents:
diff changeset
1659 var pageNumberHTML = '<div class="diva-page-label">Page <span id="' + settings.ID + 'current-page">1</span> of <span id="' + settings.ID + 'num-pages">' + settings.numPages + '</span></div>';
jurzua
parents:
diff changeset
1660
jurzua
parents:
diff changeset
1661 // If the viewer is specified to be "contained", we make room for the fullscreen icon
jurzua
parents:
diff changeset
1662 var otherToolbarClass = '';
jurzua
parents:
diff changeset
1663
jurzua
parents:
diff changeset
1664 if (settings.contained)
jurzua
parents:
diff changeset
1665 {
jurzua
parents:
diff changeset
1666 // Make sure the container element does not have a static position
jurzua
parents:
diff changeset
1667 // (Needed for the fullscreen icon to be contained)
jurzua
parents:
diff changeset
1668 if ($(settings.parentSelector).css('position') === 'static')
jurzua
parents:
diff changeset
1669 {
jurzua
parents:
diff changeset
1670 $(settings.parentSelector).addClass('diva-relative-position');
jurzua
parents:
diff changeset
1671 }
jurzua
parents:
diff changeset
1672
jurzua
parents:
diff changeset
1673 otherToolbarClass = ' diva-fullscreen-space';
jurzua
parents:
diff changeset
1674
jurzua
parents:
diff changeset
1675 // If enableAutoTitle is set to TRUE, move it down
jurzua
parents:
diff changeset
1676 if (settings.enableAutoTitle)
jurzua
parents:
diff changeset
1677 {
jurzua
parents:
diff changeset
1678 $(settings.selector + 'fullscreen').addClass('diva-contained');
jurzua
parents:
diff changeset
1679 }
jurzua
parents:
diff changeset
1680 }
jurzua
parents:
diff changeset
1681
jurzua
parents:
diff changeset
1682 var toolbarHTML = '<div id="' + settings.ID + 'tools-left" class="diva-tools-left' + otherToolbarClass + '">' + zoomSliderHTML + gridSliderHTML + zoomSliderLabelHTML + gridSliderLabelHTML + '</div><div id="' + settings.ID + 'tools-right" class="diva-tools-right">' + linkIconHTML + gridIconHTML + '<div class="diva-page-nav">' + gotoPageHTML + pageNumberHTML + '</div></div>';
jurzua
parents:
diff changeset
1683
jurzua
parents:
diff changeset
1684 if (settings.toolbarParentSelector)
jurzua
parents:
diff changeset
1685 {
jurzua
parents:
diff changeset
1686 $(settings.toolbarParentSelector).prepend('<div id="' + settings.ID + 'tools" class="diva-tools">' + toolbarHTML + '</div>');
jurzua
parents:
diff changeset
1687 }
jurzua
parents:
diff changeset
1688 else
jurzua
parents:
diff changeset
1689 {
jurzua
parents:
diff changeset
1690 $(settings.parentSelector).prepend('<div id="' + settings.ID + 'tools" class="diva-tools">' + toolbarHTML + '</div>');
jurzua
parents:
diff changeset
1691 }
jurzua
parents:
diff changeset
1692
jurzua
parents:
diff changeset
1693 // Create the zoom slider
jurzua
parents:
diff changeset
1694 $(settings.selector + 'zoom-slider').slider({
jurzua
parents:
diff changeset
1695 value: settings.zoomLevel,
jurzua
parents:
diff changeset
1696 min: settings.minZoomLevel,
jurzua
parents:
diff changeset
1697 max: settings.maxZoomLevel,
jurzua
parents:
diff changeset
1698 step: 1,
jurzua
parents:
diff changeset
1699 slide: function (event, ui)
jurzua
parents:
diff changeset
1700 {
jurzua
parents:
diff changeset
1701 var i = settings.currentPageIndex;
jurzua
parents:
diff changeset
1702 settings.goDirectlyTo = i;
jurzua
parents:
diff changeset
1703
jurzua
parents:
diff changeset
1704 // Figure out the horizontal and vertical offsets
jurzua
parents:
diff changeset
1705 // (Try to zoom in on the current center)
jurzua
parents:
diff changeset
1706 var zoomRatio = Math.pow(2, ui.value - settings.zoomLevel);
jurzua
parents:
diff changeset
1707 var innerWidth = settings.maxWidths[settings.zoomLevel] + settings.horizontalPadding * 2;
jurzua
parents:
diff changeset
1708 var centerX = $(settings.outerSelector).scrollLeft() - (innerWidth - settings.panelWidth) / 2;
jurzua
parents:
diff changeset
1709 settings.horizontalOffset = (innerWidth > settings.panelWidth) ? centerX * zoomRatio : 0;
jurzua
parents:
diff changeset
1710 settings.verticalOffset = zoomRatio * ($(settings.outerSelector).scrollTop() - settings.heightAbovePages[i]);
jurzua
parents:
diff changeset
1711
jurzua
parents:
diff changeset
1712 handleZoom(ui.value);
jurzua
parents:
diff changeset
1713 },
jurzua
parents:
diff changeset
1714 change: function (event, ui)
jurzua
parents:
diff changeset
1715 {
jurzua
parents:
diff changeset
1716 if (ui.value !== settings.zoomLevel)
jurzua
parents:
diff changeset
1717 {
jurzua
parents:
diff changeset
1718 handleZoom(ui.value);
jurzua
parents:
diff changeset
1719 }
jurzua
parents:
diff changeset
1720 }
jurzua
parents:
diff changeset
1721 });
jurzua
parents:
diff changeset
1722
jurzua
parents:
diff changeset
1723 // Create the grid slider
jurzua
parents:
diff changeset
1724 $(settings.selector + 'grid-slider').slider(
jurzua
parents:
diff changeset
1725 {
jurzua
parents:
diff changeset
1726 value: settings.pagesPerRow,
jurzua
parents:
diff changeset
1727 min: settings.minPagesPerRow,
jurzua
parents:
diff changeset
1728 max: settings.maxPagesPerRow,
jurzua
parents:
diff changeset
1729 step: 1,
jurzua
parents:
diff changeset
1730 slide: function (event, ui)
jurzua
parents:
diff changeset
1731 {
jurzua
parents:
diff changeset
1732 handleGrid(ui.value);
jurzua
parents:
diff changeset
1733 },
jurzua
parents:
diff changeset
1734 change: function (event, ui)
jurzua
parents:
diff changeset
1735 {
jurzua
parents:
diff changeset
1736 if (ui.value !== settings.pagesPerRow)
jurzua
parents:
diff changeset
1737 {
jurzua
parents:
diff changeset
1738 handleGrid(ui.value);
jurzua
parents:
diff changeset
1739 }
jurzua
parents:
diff changeset
1740 }
jurzua
parents:
diff changeset
1741 });
jurzua
parents:
diff changeset
1742
jurzua
parents:
diff changeset
1743 // Handle clicking of the grid icon
jurzua
parents:
diff changeset
1744 $(settings.selector + 'grid-icon').click(function ()
jurzua
parents:
diff changeset
1745 {
jurzua
parents:
diff changeset
1746 toggleGrid();
jurzua
parents:
diff changeset
1747 });
jurzua
parents:
diff changeset
1748
jurzua
parents:
diff changeset
1749 // Handle going to a specific page using the input box
jurzua
parents:
diff changeset
1750 $(settings.selector + 'goto-page').submit(function ()
jurzua
parents:
diff changeset
1751 {
jurzua
parents:
diff changeset
1752 var desiredPage = parseInt($(settings.selector + 'goto-page-input').val(), 10);
jurzua
parents:
diff changeset
1753 var pageIndex = desiredPage - 1;
jurzua
parents:
diff changeset
1754
jurzua
parents:
diff changeset
1755 if (!isPageValid(pageIndex))
jurzua
parents:
diff changeset
1756 {
jurzua
parents:
diff changeset
1757 alert("Invalid page number");
jurzua
parents:
diff changeset
1758 }
jurzua
parents:
diff changeset
1759 else
jurzua
parents:
diff changeset
1760 {
jurzua
parents:
diff changeset
1761 if (settings.inGrid)
jurzua
parents:
diff changeset
1762 {
jurzua
parents:
diff changeset
1763 gotoRow(pageIndex);
jurzua
parents:
diff changeset
1764 }
jurzua
parents:
diff changeset
1765 else
jurzua
parents:
diff changeset
1766 {
jurzua
parents:
diff changeset
1767 gotoPage(pageIndex, 0, 0);
jurzua
parents:
diff changeset
1768 }
jurzua
parents:
diff changeset
1769 }
jurzua
parents:
diff changeset
1770
jurzua
parents:
diff changeset
1771 // Prevent the default action of reloading the page
jurzua
parents:
diff changeset
1772 return false;
jurzua
parents:
diff changeset
1773 });
jurzua
parents:
diff changeset
1774
jurzua
parents:
diff changeset
1775 // Handle the creation of the link popup box
jurzua
parents:
diff changeset
1776 $(settings.selector + 'link-icon').click(function ()
jurzua
parents:
diff changeset
1777 {
jurzua
parents:
diff changeset
1778 $('body').prepend('<div id="' + settings.ID + 'link-popup" class="diva-link-popup"><input id="' + settings.ID + 'link-popup-input" class="diva-input" type="text" value="' + getCurrentURL() + '"/></div>');
jurzua
parents:
diff changeset
1779
jurzua
parents:
diff changeset
1780 if (settings.inFullscreen)
jurzua
parents:
diff changeset
1781 {
jurzua
parents:
diff changeset
1782 $(settings.selector + 'link-popup').addClass('in-fullscreen');
jurzua
parents:
diff changeset
1783 }
jurzua
parents:
diff changeset
1784 else
jurzua
parents:
diff changeset
1785 {
jurzua
parents:
diff changeset
1786 // Calculate the left and top offsets
jurzua
parents:
diff changeset
1787 // Compensate for border, popup width
jurzua
parents:
diff changeset
1788 var leftOffset = $(settings.outerSelector).offset().left + settings.panelWidth;
jurzua
parents:
diff changeset
1789 leftOffset += settings.scrollbarWidth - 240 - 1;
jurzua
parents:
diff changeset
1790 var topOffset = $(settings.outerSelector).offset().top + 1;
jurzua
parents:
diff changeset
1791
jurzua
parents:
diff changeset
1792 $(settings.selector + 'link-popup').removeClass('in-fullscreen').css(
jurzua
parents:
diff changeset
1793 {
jurzua
parents:
diff changeset
1794 'top': topOffset + 'px',
jurzua
parents:
diff changeset
1795 'left': leftOffset + 'px'
jurzua
parents:
diff changeset
1796 });
jurzua
parents:
diff changeset
1797 }
jurzua
parents:
diff changeset
1798
jurzua
parents:
diff changeset
1799 // Catch onmouseup events outside of this div
jurzua
parents:
diff changeset
1800 $('body').mouseup(function (event)
jurzua
parents:
diff changeset
1801 {
jurzua
parents:
diff changeset
1802 var targetID = event.target.id;
jurzua
parents:
diff changeset
1803
jurzua
parents:
diff changeset
1804 if (targetID !== settings.ID + 'link-popup' && targetID !== settings.ID + 'link-popup-input')
jurzua
parents:
diff changeset
1805 {
jurzua
parents:
diff changeset
1806 $(settings.selector + 'link-popup').remove();
jurzua
parents:
diff changeset
1807 }
jurzua
parents:
diff changeset
1808 });
jurzua
parents:
diff changeset
1809
jurzua
parents:
diff changeset
1810 // Also delete it upon scroll and page up/down key events
jurzua
parents:
diff changeset
1811 $(settings.outerSelector).scroll(function ()
jurzua
parents:
diff changeset
1812 {
jurzua
parents:
diff changeset
1813 $(settings.selector + 'link-popup').remove();
jurzua
parents:
diff changeset
1814 });
jurzua
parents:
diff changeset
1815 $(settings.selector + 'link-popup input').click(function ()
jurzua
parents:
diff changeset
1816 {
jurzua
parents:
diff changeset
1817 $(this).focus().select();
jurzua
parents:
diff changeset
1818 });
jurzua
parents:
diff changeset
1819 return false;
jurzua
parents:
diff changeset
1820 });
jurzua
parents:
diff changeset
1821
jurzua
parents:
diff changeset
1822 // Show the relevant slider
jurzua
parents:
diff changeset
1823 var currentSlider = (settings.inGrid) ? 'grid' : 'zoom';
jurzua
parents:
diff changeset
1824 $(settings.selector + currentSlider + '-slider').show();
jurzua
parents:
diff changeset
1825 $(settings.selector + currentSlider + '-slider-label').show();
jurzua
parents:
diff changeset
1826
jurzua
parents:
diff changeset
1827 var switchMode = function ()
jurzua
parents:
diff changeset
1828 {
jurzua
parents:
diff changeset
1829 // Switch from fullscreen to not
jurzua
parents:
diff changeset
1830 $(settings.selector + 'tools').toggleClass('diva-fullscreen-tools');
jurzua
parents:
diff changeset
1831
jurzua
parents:
diff changeset
1832 if (!settings.inFullscreen)
jurzua
parents:
diff changeset
1833 {
jurzua
parents:
diff changeset
1834 // Leaving fullscreen
jurzua
parents:
diff changeset
1835 $(settings.selector + 'tools-left').after($(settings.selector + 'tools-right'));
jurzua
parents:
diff changeset
1836 $(settings.selector + 'tools-left').removeClass('in-fullscreen');
jurzua
parents:
diff changeset
1837 }
jurzua
parents:
diff changeset
1838 else
jurzua
parents:
diff changeset
1839 {
jurzua
parents:
diff changeset
1840 // Entering fullscreen
jurzua
parents:
diff changeset
1841 $(settings.selector + 'tools-right').after($(settings.selector + 'tools-left'));
jurzua
parents:
diff changeset
1842 $(settings.selector + 'tools-left').addClass('in-fullscreen');
jurzua
parents:
diff changeset
1843 }
jurzua
parents:
diff changeset
1844 };
jurzua
parents:
diff changeset
1845
jurzua
parents:
diff changeset
1846 var switchView = function ()
jurzua
parents:
diff changeset
1847 {
jurzua
parents:
diff changeset
1848 // Switch from grid to document view etc
jurzua
parents:
diff changeset
1849 $(settings.selector + currentSlider + '-slider').hide();
jurzua
parents:
diff changeset
1850 $(settings.selector + currentSlider + '-slider-label').hide();
jurzua
parents:
diff changeset
1851 currentSlider = (settings.inGrid) ? 'grid' : 'zoom';
jurzua
parents:
diff changeset
1852 $(settings.selector + currentSlider + '-slider').show();
jurzua
parents:
diff changeset
1853 $(settings.selector + currentSlider + '-slider-label').show();
jurzua
parents:
diff changeset
1854
jurzua
parents:
diff changeset
1855 // Also change the image for the grid icon
jurzua
parents:
diff changeset
1856 $(settings.selector + 'grid-icon').toggleClass('diva-in-grid');
jurzua
parents:
diff changeset
1857 };
jurzua
parents:
diff changeset
1858
jurzua
parents:
diff changeset
1859 var toolbar =
jurzua
parents:
diff changeset
1860 {
jurzua
parents:
diff changeset
1861 updateCurrentPage: function ()
jurzua
parents:
diff changeset
1862 {
jurzua
parents:
diff changeset
1863 $(settings.selector + 'current-page').text(settings.currentPageIndex + 1);
jurzua
parents:
diff changeset
1864 },
jurzua
parents:
diff changeset
1865 setNumPages: function (newNumber)
jurzua
parents:
diff changeset
1866 {
jurzua
parents:
diff changeset
1867 $(settings.selector + 'num-pages').text(newNumber);
jurzua
parents:
diff changeset
1868 },
jurzua
parents:
diff changeset
1869 updateZoomSlider: function ()
jurzua
parents:
diff changeset
1870 {
jurzua
parents:
diff changeset
1871 // Update the position of the handle within the slider
jurzua
parents:
diff changeset
1872 if (settings.zoomLevel !== $(settings.selector + 'zoom-slider').slider('value'))
jurzua
parents:
diff changeset
1873 {
jurzua
parents:
diff changeset
1874 $(settings.selector + 'zoom-slider').slider(
jurzua
parents:
diff changeset
1875 {
jurzua
parents:
diff changeset
1876 value: settings.zoomLevel
jurzua
parents:
diff changeset
1877 });
jurzua
parents:
diff changeset
1878 }
jurzua
parents:
diff changeset
1879
jurzua
parents:
diff changeset
1880 // Update the slider label
jurzua
parents:
diff changeset
1881 $(settings.selector + 'zoom-level').text(settings.zoomLevel);
jurzua
parents:
diff changeset
1882 },
jurzua
parents:
diff changeset
1883 updateGridSlider: function ()
jurzua
parents:
diff changeset
1884 {
jurzua
parents:
diff changeset
1885 // Update the position of the handle within the slider
jurzua
parents:
diff changeset
1886 if (settings.pagesPerRow !== $(settings.selector + 'grid-slider').slider('value'))
jurzua
parents:
diff changeset
1887 {
jurzua
parents:
diff changeset
1888 $(settings.selector + 'grid-slider').slider(
jurzua
parents:
diff changeset
1889 {
jurzua
parents:
diff changeset
1890 value: settings.pagesPerRow
jurzua
parents:
diff changeset
1891 });
jurzua
parents:
diff changeset
1892 }
jurzua
parents:
diff changeset
1893
jurzua
parents:
diff changeset
1894 // Update the slider label
jurzua
parents:
diff changeset
1895 $(settings.selector + 'pages-per-row').text(settings.pagesPerRow);
jurzua
parents:
diff changeset
1896 },
jurzua
parents:
diff changeset
1897 switchView: switchView,
jurzua
parents:
diff changeset
1898 switchMode: switchMode
jurzua
parents:
diff changeset
1899 };
jurzua
parents:
diff changeset
1900 return toolbar;
jurzua
parents:
diff changeset
1901 };
jurzua
parents:
diff changeset
1902
jurzua
parents:
diff changeset
1903 var initPlugins = function ()
jurzua
parents:
diff changeset
1904 {
jurzua
parents:
diff changeset
1905 if (window.divaPlugins)
jurzua
parents:
diff changeset
1906 {
jurzua
parents:
diff changeset
1907 var pageTools = [];
jurzua
parents:
diff changeset
1908
jurzua
parents:
diff changeset
1909 // Add all the plugins that have not been explicitly disabled to settings.plugins
jurzua
parents:
diff changeset
1910 $.each(window.divaPlugins, function (index, plugin)
jurzua
parents:
diff changeset
1911 {
jurzua
parents:
diff changeset
1912 var pluginProperName = plugin.pluginName[0].toUpperCase() + plugin.pluginName.substring(1);
jurzua
parents:
diff changeset
1913
jurzua
parents:
diff changeset
1914 if (settings['enable' + pluginProperName])
jurzua
parents:
diff changeset
1915 {
jurzua
parents:
diff changeset
1916 // Call the init function and check return value
jurzua
parents:
diff changeset
1917 var enablePlugin = plugin.init(settings, self);
jurzua
parents:
diff changeset
1918
jurzua
parents:
diff changeset
1919 // If int returns false, consider the plugin disabled
jurzua
parents:
diff changeset
1920 if (!enablePlugin)
jurzua
parents:
diff changeset
1921 {
jurzua
parents:
diff changeset
1922 return;
jurzua
parents:
diff changeset
1923 }
jurzua
parents:
diff changeset
1924
jurzua
parents:
diff changeset
1925 // If the title text is undefined, use the name of the plugin
jurzua
parents:
diff changeset
1926 var titleText = plugin.titleText || pluginProperName + " plugin";
jurzua
parents:
diff changeset
1927
jurzua
parents:
diff changeset
1928 // Create the pageTools bar if handleClick is set to a function
jurzua
parents:
diff changeset
1929 if (typeof plugin.handleClick === 'function')
jurzua
parents:
diff changeset
1930 {
jurzua
parents:
diff changeset
1931 pageTools.push('<div class="diva-' + plugin.pluginName + '-icon" title="' + titleText + '"></div>');
jurzua
parents:
diff changeset
1932
jurzua
parents:
diff changeset
1933 // Delegate the click event - pass it the settings
jurzua
parents:
diff changeset
1934 $(settings.outerSelector).delegate('.diva-' + plugin.pluginName + '-icon', 'click', function (event)
jurzua
parents:
diff changeset
1935 {
jurzua
parents:
diff changeset
1936 plugin.handleClick.call(this, event, settings);
jurzua
parents:
diff changeset
1937 });
jurzua
parents:
diff changeset
1938 }
jurzua
parents:
diff changeset
1939
jurzua
parents:
diff changeset
1940 // Add it to settings.plugins so it can be used later
jurzua
parents:
diff changeset
1941 settings.plugins.push(plugin);
jurzua
parents:
diff changeset
1942 }
jurzua
parents:
diff changeset
1943 });
jurzua
parents:
diff changeset
1944
jurzua
parents:
diff changeset
1945 // Save the page tools bar so it can be added for each page
jurzua
parents:
diff changeset
1946 if (pageTools.length)
jurzua
parents:
diff changeset
1947 {
jurzua
parents:
diff changeset
1948 settings.pageTools = '<div class="diva-page-tools">' + pageTools.join('') + '</div>';
jurzua
parents:
diff changeset
1949 }
jurzua
parents:
diff changeset
1950 }
jurzua
parents:
diff changeset
1951 };
jurzua
parents:
diff changeset
1952
jurzua
parents:
diff changeset
1953 var hideThrobber = function ()
jurzua
parents:
diff changeset
1954 {
jurzua
parents:
diff changeset
1955 // Clear the timeout, if it hasn't executed yet
jurzua
parents:
diff changeset
1956 clearTimeout(settings.throbberTimeoutID);
jurzua
parents:
diff changeset
1957
jurzua
parents:
diff changeset
1958 // Hide the throbber if it has already executed
jurzua
parents:
diff changeset
1959 $(settings.selector + 'throbber').hide();
jurzua
parents:
diff changeset
1960 };
jurzua
parents:
diff changeset
1961
jurzua
parents:
diff changeset
1962 var setupViewer = function ()
jurzua
parents:
diff changeset
1963 {
jurzua
parents:
diff changeset
1964 // Create the throbber element
jurzua
parents:
diff changeset
1965 var throbberHTML = '<div id="' + settings.ID + 'throbber" class="diva-throbber"></div>';
jurzua
parents:
diff changeset
1966 $(settings.outerSelector).append(throbberHTML);
jurzua
parents:
diff changeset
1967
jurzua
parents:
diff changeset
1968 // If the request hasn't completed after a specified time, show it
jurzua
parents:
diff changeset
1969 settings.throbberTimeoutID = setTimeout(function ()
jurzua
parents:
diff changeset
1970 {
jurzua
parents:
diff changeset
1971 $(settings.selector + 'throbber').show();
jurzua
parents:
diff changeset
1972 }, settings.throbberTimeout);
jurzua
parents:
diff changeset
1973
jurzua
parents:
diff changeset
1974 $.ajax({
jurzua
parents:
diff changeset
1975 url: settings.objectData,
jurzua
parents:
diff changeset
1976 cache: true,
jurzua
parents:
diff changeset
1977 dataType: 'json',
jurzua
parents:
diff changeset
1978 error: function (jqxhr, status, error)
jurzua
parents:
diff changeset
1979 {
jurzua
parents:
diff changeset
1980 hideThrobber();
jurzua
parents:
diff changeset
1981
jurzua
parents:
diff changeset
1982 // Show a basic error message within the document viewer pane
jurzua
parents:
diff changeset
1983 $(settings.outerSelector).text("Invalid URL. Error code: " + status + " " + error);
jurzua
parents:
diff changeset
1984 },
jurzua
parents:
diff changeset
1985 success: function (data, status, jqxhr)
jurzua
parents:
diff changeset
1986 {
jurzua
parents:
diff changeset
1987 hideThrobber();
jurzua
parents:
diff changeset
1988
jurzua
parents:
diff changeset
1989 // Save all the data we need
jurzua
parents:
diff changeset
1990 settings.pages = data.pgs;
jurzua
parents:
diff changeset
1991 settings.maxRatio = data.dims.max_ratio;
jurzua
parents:
diff changeset
1992 settings.minRatio = data.dims.min_ratio;
jurzua
parents:
diff changeset
1993 settings.itemTitle = data.item_title;
jurzua
parents:
diff changeset
1994 settings.numPages = data.pgs.length;
jurzua
parents:
diff changeset
1995
jurzua
parents:
diff changeset
1996 // These are arrays, the index corresponding to the zoom level
jurzua
parents:
diff changeset
1997 settings.maxWidths = data.dims.max_w;
jurzua
parents:
diff changeset
1998 settings.averageWidths = data.dims.a_wid;
jurzua
parents:
diff changeset
1999 settings.averageHeights = data.dims.a_hei;
jurzua
parents:
diff changeset
2000 settings.totalHeights = data.dims.t_hei;
jurzua
parents:
diff changeset
2001
jurzua
parents:
diff changeset
2002 // Make sure the set max and min values are valid
jurzua
parents:
diff changeset
2003 settings.realMaxZoom = data.max_zoom;
jurzua
parents:
diff changeset
2004 settings.maxZoomLevel = (settings.maxZoomLevel >= 0 && settings.maxZoomLevel <= data.max_zoom) ? settings.maxZoomLevel : data.max_zoom;
jurzua
parents:
diff changeset
2005 settings.minZoomLevel = (settings.minZoomLevel >= 0 && settings.minZoomLevel <= settings.maxZoomLevel) ? settings.minZoomLevel : 0;
jurzua
parents:
diff changeset
2006 settings.minPagesPerRow = Math.max(2, settings.minPagesPerRow);
jurzua
parents:
diff changeset
2007 settings.maxPagesPerRow = Math.max(settings.minPagesPerRow, settings.maxPagesPerRow);
jurzua
parents:
diff changeset
2008
jurzua
parents:
diff changeset
2009 // Check that the desired page is in range
jurzua
parents:
diff changeset
2010 if (settings.enableFilename)
jurzua
parents:
diff changeset
2011 {
jurzua
parents:
diff changeset
2012 var iParam = $.getHashParam('i' + settings.hashParamSuffix);
jurzua
parents:
diff changeset
2013 var iParamPage = getPageIndex(iParam);
jurzua
parents:
diff changeset
2014
jurzua
parents:
diff changeset
2015 if (isPageValid(iParamPage))
jurzua
parents:
diff changeset
2016 {
jurzua
parents:
diff changeset
2017 settings.goDirectlyTo = iParamPage;
jurzua
parents:
diff changeset
2018 }
jurzua
parents:
diff changeset
2019 }
jurzua
parents:
diff changeset
2020 else
jurzua
parents:
diff changeset
2021 {
jurzua
parents:
diff changeset
2022 // Not using the i parameter, check the p parameter
jurzua
parents:
diff changeset
2023 // Subtract 1 to get the page index
jurzua
parents:
diff changeset
2024 var pParam = parseInt($.getHashParam('p' + settings.hashParamSuffix), 10) - 1;
jurzua
parents:
diff changeset
2025
jurzua
parents:
diff changeset
2026 if (isPageValid(pParam))
jurzua
parents:
diff changeset
2027 {
jurzua
parents:
diff changeset
2028 settings.goDirectlyTo = pParam;
jurzua
parents:
diff changeset
2029 }
jurzua
parents:
diff changeset
2030 }
jurzua
parents:
diff changeset
2031
jurzua
parents:
diff changeset
2032 // Execute the setup hook for each plugin (if defined)
jurzua
parents:
diff changeset
2033 $.each(settings.plugins, function (index, plugin)
jurzua
parents:
diff changeset
2034 {
jurzua
parents:
diff changeset
2035 executeCallback(plugin.setupHook, settings);
jurzua
parents:
diff changeset
2036 });
jurzua
parents:
diff changeset
2037
jurzua
parents:
diff changeset
2038 // Create the toolbar and display the title + total number of pages
jurzua
parents:
diff changeset
2039 if (settings.enableToolbar)
jurzua
parents:
diff changeset
2040 {
jurzua
parents:
diff changeset
2041 settings.toolbar = createToolbar();
jurzua
parents:
diff changeset
2042 Events.subscribe("VisiblePageDidChange", settings.toolbar.updateCurrentPage);
jurzua
parents:
diff changeset
2043 Events.subscribe("ModeDidSwitch", settings.toolbar.switchMode);
jurzua
parents:
diff changeset
2044 Events.subscribe("ViewDidSwitch", settings.toolbar.switchView);
jurzua
parents:
diff changeset
2045 Events.subscribe("ZoomLevelDidChange", settings.toolbar.updateZoomSlider);
jurzua
parents:
diff changeset
2046 Events.subscribe("GridRowNumberDidChange", settings.toolbar.updateGridSlider);
jurzua
parents:
diff changeset
2047 }
jurzua
parents:
diff changeset
2048
jurzua
parents:
diff changeset
2049 $(settings.selector + 'current label').text(settings.numPages);
jurzua
parents:
diff changeset
2050
jurzua
parents:
diff changeset
2051 if (settings.enableAutoTitle)
jurzua
parents:
diff changeset
2052 {
jurzua
parents:
diff changeset
2053 $(settings.parentSelector).prepend('<div id="' + settings.ID + 'title" class="diva-title">' + settings.itemTitle + '</div>');
jurzua
parents:
diff changeset
2054 }
jurzua
parents:
diff changeset
2055
jurzua
parents:
diff changeset
2056 // Adjust the document panel dimensions for touch devices
jurzua
parents:
diff changeset
2057 if (settings.mobileWebkit)
jurzua
parents:
diff changeset
2058 {
jurzua
parents:
diff changeset
2059 adjustMobileWebkitDims();
jurzua
parents:
diff changeset
2060 }
jurzua
parents:
diff changeset
2061 else
jurzua
parents:
diff changeset
2062 {
jurzua
parents:
diff changeset
2063 settings.originalWidth = $(settings.parentSelector).width() - settings.scrollbarWidth;
jurzua
parents:
diff changeset
2064 settings.originalHeight = $(settings.outerSelector).height();
jurzua
parents:
diff changeset
2065 adjustBrowserDims();
jurzua
parents:
diff changeset
2066 }
jurzua
parents:
diff changeset
2067
jurzua
parents:
diff changeset
2068 // Calculate the viewer x and y offsets
jurzua
parents:
diff changeset
2069 var viewerOffset = $(settings.outerSelector).offset();
jurzua
parents:
diff changeset
2070 settings.viewerXOffset = viewerOffset.left;
jurzua
parents:
diff changeset
2071 settings.viewerYOffset = viewerOffset.top;
jurzua
parents:
diff changeset
2072
jurzua
parents:
diff changeset
2073 if (settings.inFullscreen)
jurzua
parents:
diff changeset
2074 {
jurzua
parents:
diff changeset
2075 handleModeChange(false);
jurzua
parents:
diff changeset
2076 }
jurzua
parents:
diff changeset
2077 else
jurzua
parents:
diff changeset
2078 {
jurzua
parents:
diff changeset
2079 loadViewer();
jurzua
parents:
diff changeset
2080 }
jurzua
parents:
diff changeset
2081
jurzua
parents:
diff changeset
2082 // Execute the callback
jurzua
parents:
diff changeset
2083 executeCallback(settings.onReady, settings);
jurzua
parents:
diff changeset
2084 Events.publish("ViewerHasFinishedLoading", [settings]);
jurzua
parents:
diff changeset
2085
jurzua
parents:
diff changeset
2086 // signal that everything should be set up and ready to go.
jurzua
parents:
diff changeset
2087 settings.loaded = true;
jurzua
parents:
diff changeset
2088 }
jurzua
parents:
diff changeset
2089 });
jurzua
parents:
diff changeset
2090 };
jurzua
parents:
diff changeset
2091
jurzua
parents:
diff changeset
2092 var checkLoaded = function()
jurzua
parents:
diff changeset
2093 {
jurzua
parents:
diff changeset
2094 if (!settings.loaded)
jurzua
parents:
diff changeset
2095 {
jurzua
parents:
diff changeset
2096 console.warn("The viewer is not completely initialized. This is likely because it is still downloading data. To fix this, only call this function if the isReady() method returns true.");
jurzua
parents:
diff changeset
2097 return false;
jurzua
parents:
diff changeset
2098 }
jurzua
parents:
diff changeset
2099 return true;
jurzua
parents:
diff changeset
2100 };
jurzua
parents:
diff changeset
2101
jurzua
parents:
diff changeset
2102 var init = function ()
jurzua
parents:
diff changeset
2103 {
jurzua
parents:
diff changeset
2104 // First figure out the width of the scrollbar in this browser
jurzua
parents:
diff changeset
2105 settings.scrollbarWidth = $.getScrollbarWidth();
jurzua
parents:
diff changeset
2106
jurzua
parents:
diff changeset
2107 // If window.orientation is defined, then it's probably mobileWebkit
jurzua
parents:
diff changeset
2108 settings.mobileWebkit = window.orientation !== undefined;
jurzua
parents:
diff changeset
2109
jurzua
parents:
diff changeset
2110 // Generate an ID that can be used as a prefix for all the other IDs
jurzua
parents:
diff changeset
2111 settings.ID = $.generateId('diva-');
jurzua
parents:
diff changeset
2112 settings.selector = '#' + settings.ID;
jurzua
parents:
diff changeset
2113
jurzua
parents:
diff changeset
2114 // Figure out the hashParamSuffix from the ID
jurzua
parents:
diff changeset
2115 var divaNumber = parseInt(settings.ID, 10);
jurzua
parents:
diff changeset
2116
jurzua
parents:
diff changeset
2117 if (divaNumber > 1)
jurzua
parents:
diff changeset
2118 {
jurzua
parents:
diff changeset
2119 // If this is document viewer #1, don't use a suffix; otherwise, use the document viewer number
jurzua
parents:
diff changeset
2120 settings.hashParamSuffix = divaNumber;
jurzua
parents:
diff changeset
2121 }
jurzua
parents:
diff changeset
2122
jurzua
parents:
diff changeset
2123 // Since we need to reference these two a lot
jurzua
parents:
diff changeset
2124 settings.outerSelector = settings.selector + 'outer';
jurzua
parents:
diff changeset
2125 settings.innerSelector = settings.selector + 'inner';
jurzua
parents:
diff changeset
2126
jurzua
parents:
diff changeset
2127 // Create the inner and outer panels
jurzua
parents:
diff changeset
2128 $(settings.parentSelector).append('<div id="' + settings.ID + 'outer" class="diva-outer"></div>');
jurzua
parents:
diff changeset
2129 $(settings.outerSelector).append('<div id="' + settings.ID + 'inner" class="diva-inner diva-dragger"></div>');
jurzua
parents:
diff changeset
2130
jurzua
parents:
diff changeset
2131 // Create the fullscreen icon
jurzua
parents:
diff changeset
2132 if (settings.enableFullscreen)
jurzua
parents:
diff changeset
2133 {
jurzua
parents:
diff changeset
2134 $(settings.parentSelector).prepend('<div id="' + settings.ID + 'fullscreen" class="diva-fullscreen-icon" title="Toggle fullscreen mode"></div>');
jurzua
parents:
diff changeset
2135 }
jurzua
parents:
diff changeset
2136
jurzua
parents:
diff changeset
2137 // First, n - check if it's in range
jurzua
parents:
diff changeset
2138 var nParam = parseInt($.getHashParam('n' + settings.hashParamSuffix), 10);
jurzua
parents:
diff changeset
2139
jurzua
parents:
diff changeset
2140 if (nParam >= settings.minPagesPerRow && nParam <= settings.maxPagesPerRow)
jurzua
parents:
diff changeset
2141 {
jurzua
parents:
diff changeset
2142 settings.pagesPerRow = nParam;
jurzua
parents:
diff changeset
2143 }
jurzua
parents:
diff changeset
2144
jurzua
parents:
diff changeset
2145 // Now z - check that it's in range
jurzua
parents:
diff changeset
2146 var zParam = $.getHashParam('z' + settings.hashParamSuffix);
jurzua
parents:
diff changeset
2147
jurzua
parents:
diff changeset
2148 if (zParam !== '')
jurzua
parents:
diff changeset
2149 {
jurzua
parents:
diff changeset
2150 // If it's empty, we don't want to change the default zoom level
jurzua
parents:
diff changeset
2151 zParam = parseInt(zParam, 10);
jurzua
parents:
diff changeset
2152
jurzua
parents:
diff changeset
2153 // Can't check if it exceeds the max zoom level or not because that data is not available yet ...
jurzua
parents:
diff changeset
2154 if (zParam >= settings.minZoomLevel)
jurzua
parents:
diff changeset
2155 {
jurzua
parents:
diff changeset
2156 settings.zoomLevel = zParam;
jurzua
parents:
diff changeset
2157 }
jurzua
parents:
diff changeset
2158 }
jurzua
parents:
diff changeset
2159
jurzua
parents:
diff changeset
2160 // y - vertical offset from the top of the relevant page
jurzua
parents:
diff changeset
2161 var yParam = parseInt($.getHashParam('y' + settings.hashParamSuffix), 10);
jurzua
parents:
diff changeset
2162
jurzua
parents:
diff changeset
2163 if (!isNaN(yParam))
jurzua
parents:
diff changeset
2164 {
jurzua
parents:
diff changeset
2165 settings.verticalOffset = yParam;
jurzua
parents:
diff changeset
2166 }
jurzua
parents:
diff changeset
2167
jurzua
parents:
diff changeset
2168 // x - horizontal offset from the center of the page
jurzua
parents:
diff changeset
2169 var xParam = parseInt($.getHashParam('x' + settings.hashParamSuffix), 10);
jurzua
parents:
diff changeset
2170
jurzua
parents:
diff changeset
2171 if (!isNaN(xParam))
jurzua
parents:
diff changeset
2172 {
jurzua
parents:
diff changeset
2173 settings.horizontalOffset = xParam;
jurzua
parents:
diff changeset
2174 }
jurzua
parents:
diff changeset
2175
jurzua
parents:
diff changeset
2176 // If the "fullscreen" hash param is true, go to fullscreen initially
jurzua
parents:
diff changeset
2177 // If the grid hash param is true, go to grid view initially
jurzua
parents:
diff changeset
2178 var gridParam = $.getHashParam('g' + settings.hashParamSuffix);
jurzua
parents:
diff changeset
2179 var goIntoGrid = gridParam === 'true';
jurzua
parents:
diff changeset
2180 var fullscreenParam = $.getHashParam('f' + settings.hashParamSuffix);
jurzua
parents:
diff changeset
2181 var goIntoFullscreen = fullscreenParam === 'true';
jurzua
parents:
diff changeset
2182
jurzua
parents:
diff changeset
2183 settings.inGrid = (settings.inGrid && gridParam !== 'false') || goIntoGrid;
jurzua
parents:
diff changeset
2184 settings.inFullscreen = (settings.inFullscreen && fullscreenParam !== 'false') || goIntoFullscreen;
jurzua
parents:
diff changeset
2185
jurzua
parents:
diff changeset
2186 // Store the height and width of the viewer (the outer div), if present
jurzua
parents:
diff changeset
2187 var desiredHeight = parseInt($.getHashParam('h' + settings.hashParamSuffix), 10);
jurzua
parents:
diff changeset
2188 var desiredWidth = parseInt($.getHashParam('w' + settings.hashParamSuffix), 10);
jurzua
parents:
diff changeset
2189
jurzua
parents:
diff changeset
2190 // Store the minimum and maximum height too
jurzua
parents:
diff changeset
2191 settings.minHeight = parseInt($(settings.outerSelector).css('min-height'), 10);
jurzua
parents:
diff changeset
2192 settings.minWidth = parseInt($(settings.outerSelector).css('min-width'), 10);
jurzua
parents:
diff changeset
2193
jurzua
parents:
diff changeset
2194 // Just call resize, it'll take care of bounds-checking etc
jurzua
parents:
diff changeset
2195 if (desiredHeight > 0 || desiredWidth > 0)
jurzua
parents:
diff changeset
2196 {
jurzua
parents:
diff changeset
2197 resizeViewer(desiredWidth, desiredHeight);
jurzua
parents:
diff changeset
2198 }
jurzua
parents:
diff changeset
2199
jurzua
parents:
diff changeset
2200 // Do the initial AJAX request and viewer loading
jurzua
parents:
diff changeset
2201 setupViewer();
jurzua
parents:
diff changeset
2202
jurzua
parents:
diff changeset
2203 // Do all the plugin initialisation
jurzua
parents:
diff changeset
2204 initPlugins();
jurzua
parents:
diff changeset
2205
jurzua
parents:
diff changeset
2206 handleEvents();
jurzua
parents:
diff changeset
2207 };
jurzua
parents:
diff changeset
2208
jurzua
parents:
diff changeset
2209 // Call the init function when this object is created.
jurzua
parents:
diff changeset
2210 init();
jurzua
parents:
diff changeset
2211
jurzua
parents:
diff changeset
2212 /* PUBLIC FUNCTIONS
jurzua
parents:
diff changeset
2213 ===============================================
jurzua
parents:
diff changeset
2214 */
jurzua
parents:
diff changeset
2215
jurzua
parents:
diff changeset
2216 // Returns the title of the document, based on the directory name
jurzua
parents:
diff changeset
2217 this.getItemTitle = function ()
jurzua
parents:
diff changeset
2218 {
jurzua
parents:
diff changeset
2219 return settings.itemTitle;
jurzua
parents:
diff changeset
2220 };
jurzua
parents:
diff changeset
2221
jurzua
parents:
diff changeset
2222 // Go to a particular page by its page number (with indexing starting at 1)
jurzua
parents:
diff changeset
2223 // returns True if the page number passed is valid; false if it is not.
jurzua
parents:
diff changeset
2224 this.gotoPageByNumber = function (pageNumber)
jurzua
parents:
diff changeset
2225 {
jurzua
parents:
diff changeset
2226 var pageIndex = pageNumber - 1;
jurzua
parents:
diff changeset
2227 if (isPageValid(pageIndex))
jurzua
parents:
diff changeset
2228 {
jurzua
parents:
diff changeset
2229 gotoPage(pageIndex, 0, 0);
jurzua
parents:
diff changeset
2230 return true;
jurzua
parents:
diff changeset
2231 }
jurzua
parents:
diff changeset
2232 return false;
jurzua
parents:
diff changeset
2233 };
jurzua
parents:
diff changeset
2234
jurzua
parents:
diff changeset
2235 // Go to a particular page (with indexing starting at 0)
jurzua
parents:
diff changeset
2236 // returns True if the page index is valid; false if it is not.
jurzua
parents:
diff changeset
2237 this.gotoPageByIndex = function (pageIndex)
jurzua
parents:
diff changeset
2238 {
jurzua
parents:
diff changeset
2239 if (isPageValid(pageIndex))
jurzua
parents:
diff changeset
2240 {
jurzua
parents:
diff changeset
2241 gotoPage(pageIndex, 0, 0);
jurzua
parents:
diff changeset
2242 return true;
jurzua
parents:
diff changeset
2243 }
jurzua
parents:
diff changeset
2244 return false;
jurzua
parents:
diff changeset
2245 };
jurzua
parents:
diff changeset
2246
jurzua
parents:
diff changeset
2247 // Returns the page index (with indexing starting at 0)
jurzua
parents:
diff changeset
2248 this.getCurrentPage = function ()
jurzua
parents:
diff changeset
2249 {
jurzua
parents:
diff changeset
2250 console.warn("Deprecated. Use getCurrentPageIndex instead.");
jurzua
parents:
diff changeset
2251 return settings.currentPageIndex;
jurzua
parents:
diff changeset
2252 };
jurzua
parents:
diff changeset
2253
jurzua
parents:
diff changeset
2254 this.getNumberOfPages = function()
jurzua
parents:
diff changeset
2255 {
jurzua
parents:
diff changeset
2256 if (!checkLoaded())
jurzua
parents:
diff changeset
2257 {
jurzua
parents:
diff changeset
2258 return false;
jurzua
parents:
diff changeset
2259 }
jurzua
parents:
diff changeset
2260
jurzua
parents:
diff changeset
2261 return settings.numPages;
jurzua
parents:
diff changeset
2262 }
jurzua
parents:
diff changeset
2263
jurzua
parents:
diff changeset
2264 // Returns the dimensions of a given page index at a given zoom level
jurzua
parents:
diff changeset
2265 this.getPageDimensionsAtZoomLevel = function(pageIdx, zoomLevel)
jurzua
parents:
diff changeset
2266 {
jurzua
parents:
diff changeset
2267 if (!checkLoaded())
jurzua
parents:
diff changeset
2268 {
jurzua
parents:
diff changeset
2269 return false;
jurzua
parents:
diff changeset
2270 }
jurzua
parents:
diff changeset
2271
jurzua
parents:
diff changeset
2272 var zoomLevel = zoomLevel - 1; // zoom levels are 1-based, but our array is 0-based;
jurzua
parents:
diff changeset
2273 var pg = settings.pages[pageIdx];
jurzua
parents:
diff changeset
2274 var pgAtZoom = pg.d[parseInt(zoomLevel, 10)];
jurzua
parents:
diff changeset
2275 return {'width': pgAtZoom.w, 'height': pgAtZoom.h}
jurzua
parents:
diff changeset
2276 };
jurzua
parents:
diff changeset
2277
jurzua
parents:
diff changeset
2278 // Returns the dimensions of the current page at the current zoom level
jurzua
parents:
diff changeset
2279 this.getCurrentPageDimensionsAtCurrentZoomLevel = function()
jurzua
parents:
diff changeset
2280 {
jurzua
parents:
diff changeset
2281 return this.getPageDimensionsAtZoomLevel(settings.currentPageIndex, settings.zoomLevel);
jurzua
parents:
diff changeset
2282 };
jurzua
parents:
diff changeset
2283
jurzua
parents:
diff changeset
2284 this.isReady = function()
jurzua
parents:
diff changeset
2285 {
jurzua
parents:
diff changeset
2286 return settings.loaded;
jurzua
parents:
diff changeset
2287 };
jurzua
parents:
diff changeset
2288
jurzua
parents:
diff changeset
2289 this.getCurrentPageIndex = function ()
jurzua
parents:
diff changeset
2290 {
jurzua
parents:
diff changeset
2291 return settings.currentPageIndex;
jurzua
parents:
diff changeset
2292 };
jurzua
parents:
diff changeset
2293
jurzua
parents:
diff changeset
2294 this.getCurrentPageFilename = function ()
jurzua
parents:
diff changeset
2295 {
jurzua
parents:
diff changeset
2296 return settings.pages[settings.currentPageIndex].f;
jurzua
parents:
diff changeset
2297 };
jurzua
parents:
diff changeset
2298
jurzua
parents:
diff changeset
2299 this.getCurrentPageNumber = function ()
jurzua
parents:
diff changeset
2300 {
jurzua
parents:
diff changeset
2301 return settings.currentPageIndex + 1;
jurzua
parents:
diff changeset
2302 };
jurzua
parents:
diff changeset
2303
jurzua
parents:
diff changeset
2304 // Returns the current zoom level
jurzua
parents:
diff changeset
2305 this.getZoomLevel = function ()
jurzua
parents:
diff changeset
2306 {
jurzua
parents:
diff changeset
2307 return settings.zoomLevel;
jurzua
parents:
diff changeset
2308 };
jurzua
parents:
diff changeset
2309
jurzua
parents:
diff changeset
2310 // gets the maximum zoom level for the entire document
jurzua
parents:
diff changeset
2311 this.getMaxZoomLevel = function ()
jurzua
parents:
diff changeset
2312 {
jurzua
parents:
diff changeset
2313 return settings.maxZoomLevel;
jurzua
parents:
diff changeset
2314 };
jurzua
parents:
diff changeset
2315
jurzua
parents:
diff changeset
2316 // gets the max zoom level for a given page
jurzua
parents:
diff changeset
2317 this.getMaxZoomLevelForPage = function(pageIdx)
jurzua
parents:
diff changeset
2318 {
jurzua
parents:
diff changeset
2319 if (!checkLoaded)
jurzua
parents:
diff changeset
2320 {
jurzua
parents:
diff changeset
2321 return false;
jurzua
parents:
diff changeset
2322 }
jurzua
parents:
diff changeset
2323
jurzua
parents:
diff changeset
2324 return settings.pages[pageIdx].m;
jurzua
parents:
diff changeset
2325 }
jurzua
parents:
diff changeset
2326
jurzua
parents:
diff changeset
2327 this.getMinZoomLevel = function ()
jurzua
parents:
diff changeset
2328 {
jurzua
parents:
diff changeset
2329 return settings.minZoomLevel;
jurzua
parents:
diff changeset
2330 };
jurzua
parents:
diff changeset
2331
jurzua
parents:
diff changeset
2332 // Use the provided zoom level (will check for validity first)
jurzua
parents:
diff changeset
2333 // Returns false if the zoom level is invalid, true otherwise
jurzua
parents:
diff changeset
2334 this.setZoomLevel = function (zoomLevel)
jurzua
parents:
diff changeset
2335 {
jurzua
parents:
diff changeset
2336 if (settings.inGrid)
jurzua
parents:
diff changeset
2337 {
jurzua
parents:
diff changeset
2338 toggleGrid();
jurzua
parents:
diff changeset
2339 }
jurzua
parents:
diff changeset
2340
jurzua
parents:
diff changeset
2341 return handleZoom(zoomLevel);
jurzua
parents:
diff changeset
2342 };
jurzua
parents:
diff changeset
2343
jurzua
parents:
diff changeset
2344 // Zoom in. Will return false if it's at the maximum zoom
jurzua
parents:
diff changeset
2345 this.zoomIn = function ()
jurzua
parents:
diff changeset
2346 {
jurzua
parents:
diff changeset
2347 return this.setZoomLevel(settings.zoomLevel + 1);
jurzua
parents:
diff changeset
2348 };
jurzua
parents:
diff changeset
2349
jurzua
parents:
diff changeset
2350 // Zoom out. Will return false if it's at the minimum zoom
jurzua
parents:
diff changeset
2351 this.zoomOut = function ()
jurzua
parents:
diff changeset
2352 {
jurzua
parents:
diff changeset
2353 return this.setZoomLevel(settings.zoomLevel - 1);
jurzua
parents:
diff changeset
2354 };
jurzua
parents:
diff changeset
2355
jurzua
parents:
diff changeset
2356 // Uses the isVerticallyInViewport() function, but relative to a page
jurzua
parents:
diff changeset
2357 // Check if something (e.g. a highlight box on a particular page) is visible
jurzua
parents:
diff changeset
2358 this.inViewport = function (pageNumber, topOffset, height)
jurzua
parents:
diff changeset
2359 {
jurzua
parents:
diff changeset
2360 var pageIndex = pageNumber - 1;
jurzua
parents:
diff changeset
2361 var top = settings.heightAbovePages[pageIndex] + topOffset;
jurzua
parents:
diff changeset
2362 var bottom = top + height;
jurzua
parents:
diff changeset
2363
jurzua
parents:
diff changeset
2364 return isVerticallyInViewport(top, bottom);
jurzua
parents:
diff changeset
2365 };
jurzua
parents:
diff changeset
2366
jurzua
parents:
diff changeset
2367 // Toggle fullscreen mode
jurzua
parents:
diff changeset
2368 this.toggleFullscreenMode = function ()
jurzua
parents:
diff changeset
2369 {
jurzua
parents:
diff changeset
2370 toggleFullscreen();
jurzua
parents:
diff changeset
2371 };
jurzua
parents:
diff changeset
2372
jurzua
parents:
diff changeset
2373 // Enter fullscreen mode if currently not in fullscreen mode
jurzua
parents:
diff changeset
2374 // Returns false if in fullscreen mode initially, true otherwise
jurzua
parents:
diff changeset
2375 // This function will work even if enableFullscreen is set to false
jurzua
parents:
diff changeset
2376 this.enterFullscreenMode = function ()
jurzua
parents:
diff changeset
2377 {
jurzua
parents:
diff changeset
2378 if (!settings.inFullscreen)
jurzua
parents:
diff changeset
2379 {
jurzua
parents:
diff changeset
2380 toggleFullscreen();
jurzua
parents:
diff changeset
2381 return true;
jurzua
parents:
diff changeset
2382 }
jurzua
parents:
diff changeset
2383
jurzua
parents:
diff changeset
2384 return false;
jurzua
parents:
diff changeset
2385 };
jurzua
parents:
diff changeset
2386
jurzua
parents:
diff changeset
2387 // Leave fullscreen mode if currently in fullscreen mode
jurzua
parents:
diff changeset
2388 // Returns true if in fullscreen mode intitially, false otherwise
jurzua
parents:
diff changeset
2389 this.leaveFullscreenMode = function ()
jurzua
parents:
diff changeset
2390 {
jurzua
parents:
diff changeset
2391 if (settings.inFullscreen)
jurzua
parents:
diff changeset
2392 {
jurzua
parents:
diff changeset
2393 toggleFullscreen();
jurzua
parents:
diff changeset
2394 return true;
jurzua
parents:
diff changeset
2395 }
jurzua
parents:
diff changeset
2396
jurzua
parents:
diff changeset
2397 return false;
jurzua
parents:
diff changeset
2398 };
jurzua
parents:
diff changeset
2399
jurzua
parents:
diff changeset
2400 // Toggle grid view
jurzua
parents:
diff changeset
2401 this.toggleGridView = function ()
jurzua
parents:
diff changeset
2402 {
jurzua
parents:
diff changeset
2403 toggleGrid();
jurzua
parents:
diff changeset
2404 };
jurzua
parents:
diff changeset
2405
jurzua
parents:
diff changeset
2406 // Enter grid view if currently not in grid view
jurzua
parents:
diff changeset
2407 // Returns false if in grid view initially, true otherwise
jurzua
parents:
diff changeset
2408 this.enterGridView = function ()
jurzua
parents:
diff changeset
2409 {
jurzua
parents:
diff changeset
2410 if (!settings.inGrid) {
jurzua
parents:
diff changeset
2411 toggleGrid();
jurzua
parents:
diff changeset
2412 return true;
jurzua
parents:
diff changeset
2413 }
jurzua
parents:
diff changeset
2414
jurzua
parents:
diff changeset
2415 return false;
jurzua
parents:
diff changeset
2416 };
jurzua
parents:
diff changeset
2417
jurzua
parents:
diff changeset
2418 // Leave grid view if currently in grid view
jurzua
parents:
diff changeset
2419 // Returns true if in grid view initially, false otherwise
jurzua
parents:
diff changeset
2420 this.leaveGridView = function ()
jurzua
parents:
diff changeset
2421 {
jurzua
parents:
diff changeset
2422 if (settings.inGrid)
jurzua
parents:
diff changeset
2423 {
jurzua
parents:
diff changeset
2424 toggleGrid();
jurzua
parents:
diff changeset
2425 return true;
jurzua
parents:
diff changeset
2426 }
jurzua
parents:
diff changeset
2427
jurzua
parents:
diff changeset
2428 return false;
jurzua
parents:
diff changeset
2429 };
jurzua
parents:
diff changeset
2430
jurzua
parents:
diff changeset
2431 // Jump to a page based on its filename
jurzua
parents:
diff changeset
2432 // Returns true if successful and false if the filename is invalid
jurzua
parents:
diff changeset
2433 this.gotoPageByName = function (filename)
jurzua
parents:
diff changeset
2434 {
jurzua
parents:
diff changeset
2435 var pageIndex = getPageIndex(filename);
jurzua
parents:
diff changeset
2436 if (isPageValid(pageIndex))
jurzua
parents:
diff changeset
2437 {
jurzua
parents:
diff changeset
2438 gotoPage(pageIndex, 0, 0);
jurzua
parents:
diff changeset
2439 return true;
jurzua
parents:
diff changeset
2440 }
jurzua
parents:
diff changeset
2441
jurzua
parents:
diff changeset
2442 return false;
jurzua
parents:
diff changeset
2443 };
jurzua
parents:
diff changeset
2444
jurzua
parents:
diff changeset
2445 // Get the page index (0-based) corresponding to a given filename
jurzua
parents:
diff changeset
2446 // If the page index doesn't exist, this will return -1
jurzua
parents:
diff changeset
2447 this.getPageIndex = function (filename)
jurzua
parents:
diff changeset
2448 {
jurzua
parents:
diff changeset
2449 return getPageIndex(filename);
jurzua
parents:
diff changeset
2450 };
jurzua
parents:
diff changeset
2451
jurzua
parents:
diff changeset
2452 // Get the current URL (exposes the private method)
jurzua
parents:
diff changeset
2453 this.getCurrentURL = function ()
jurzua
parents:
diff changeset
2454 {
jurzua
parents:
diff changeset
2455 return getCurrentURL();
jurzua
parents:
diff changeset
2456 };
jurzua
parents:
diff changeset
2457
jurzua
parents:
diff changeset
2458 // Get the hash part only of the current URL (without the leading #)
jurzua
parents:
diff changeset
2459 this.getURLHash = function ()
jurzua
parents:
diff changeset
2460 {
jurzua
parents:
diff changeset
2461 return getURLHash();
jurzua
parents:
diff changeset
2462 };
jurzua
parents:
diff changeset
2463
jurzua
parents:
diff changeset
2464 // Get an object representing the state of this diva instance (for setState)
jurzua
parents:
diff changeset
2465 this.getState = function ()
jurzua
parents:
diff changeset
2466 {
jurzua
parents:
diff changeset
2467 return getState();
jurzua
parents:
diff changeset
2468 };
jurzua
parents:
diff changeset
2469
jurzua
parents:
diff changeset
2470 // Get the instance selector for this instance, since it's auto-generated.
jurzua
parents:
diff changeset
2471 this.getInstanceSelector = function ()
jurzua
parents:
diff changeset
2472 {
jurzua
parents:
diff changeset
2473 return settings.selector;
jurzua
parents:
diff changeset
2474 };
jurzua
parents:
diff changeset
2475
jurzua
parents:
diff changeset
2476 // Get the instance ID -- essentially the selector without the leading '#'.
jurzua
parents:
diff changeset
2477 this.getInstanceId = function()
jurzua
parents:
diff changeset
2478 {
jurzua
parents:
diff changeset
2479 return settings.ID;
jurzua
parents:
diff changeset
2480 };
jurzua
parents:
diff changeset
2481
jurzua
parents:
diff changeset
2482 this.getSettings = function()
jurzua
parents:
diff changeset
2483 {
jurzua
parents:
diff changeset
2484 return settings;
jurzua
parents:
diff changeset
2485 };
jurzua
parents:
diff changeset
2486
jurzua
parents:
diff changeset
2487 // Align this diva instance with a state object (as returned by getState)
jurzua
parents:
diff changeset
2488 this.setState = function (state)
jurzua
parents:
diff changeset
2489 {
jurzua
parents:
diff changeset
2490 var pageIndex;
jurzua
parents:
diff changeset
2491
jurzua
parents:
diff changeset
2492 // If we need to resize the viewer, do that first
jurzua
parents:
diff changeset
2493 resizeViewer(state.w, state.h);
jurzua
parents:
diff changeset
2494
jurzua
parents:
diff changeset
2495 // Only change settings.goDirectlyTo if state.i or state.p is valid
jurzua
parents:
diff changeset
2496 pageIndex = getPageIndex(state.i);
jurzua
parents:
diff changeset
2497
jurzua
parents:
diff changeset
2498 if (isPageValid(pageIndex))
jurzua
parents:
diff changeset
2499 {
jurzua
parents:
diff changeset
2500 settings.goDirectlyTo = pageIndex;
jurzua
parents:
diff changeset
2501 }
jurzua
parents:
diff changeset
2502 else if (isPageValid(state.p))
jurzua
parents:
diff changeset
2503 {
jurzua
parents:
diff changeset
2504 settings.goDirectlyTo = state.p;
jurzua
parents:
diff changeset
2505 }
jurzua
parents:
diff changeset
2506
jurzua
parents:
diff changeset
2507 settings.horizontalOffset = parseInt(state.x, 10);
jurzua
parents:
diff changeset
2508 settings.verticalOffset = parseInt(state.y, 10);
jurzua
parents:
diff changeset
2509
jurzua
parents:
diff changeset
2510 // Only change the zoom if state.z is valid
jurzua
parents:
diff changeset
2511 if (state.z >= settings.minZoomLevel && state.z <= settings.maxZoomLevel)
jurzua
parents:
diff changeset
2512 {
jurzua
parents:
diff changeset
2513 settings.zoomLevel = state.z;
jurzua
parents:
diff changeset
2514 }
jurzua
parents:
diff changeset
2515
jurzua
parents:
diff changeset
2516 // Only change the pages per row setting if state.n is valid
jurzua
parents:
diff changeset
2517 if (state.n >= settings.minPagesPerRow && state.n <= settings.maxPagesPerRow)
jurzua
parents:
diff changeset
2518 {
jurzua
parents:
diff changeset
2519 settings.pagesPerRow = state.n;
jurzua
parents:
diff changeset
2520 }
jurzua
parents:
diff changeset
2521
jurzua
parents:
diff changeset
2522 if (settings.inFullscreen !== state.f)
jurzua
parents:
diff changeset
2523 {
jurzua
parents:
diff changeset
2524 // The parameter determines if we need to change the view as well
jurzua
parents:
diff changeset
2525 settings.inFullscreen = state.f;
jurzua
parents:
diff changeset
2526 handleModeChange(settings.inGrid !== state.g);
jurzua
parents:
diff changeset
2527 }
jurzua
parents:
diff changeset
2528 else
jurzua
parents:
diff changeset
2529 {
jurzua
parents:
diff changeset
2530 // Don't need to change the mode, may need to change view
jurzua
parents:
diff changeset
2531 if (settings.inGrid !== state.g)
jurzua
parents:
diff changeset
2532 {
jurzua
parents:
diff changeset
2533 settings.inGrid = state.g;
jurzua
parents:
diff changeset
2534 handleViewChange();
jurzua
parents:
diff changeset
2535 }
jurzua
parents:
diff changeset
2536 else
jurzua
parents:
diff changeset
2537 {
jurzua
parents:
diff changeset
2538 // Reload the viewer, just in case
jurzua
parents:
diff changeset
2539 loadViewer();
jurzua
parents:
diff changeset
2540 }
jurzua
parents:
diff changeset
2541 }
jurzua
parents:
diff changeset
2542 };
jurzua
parents:
diff changeset
2543
jurzua
parents:
diff changeset
2544 // Resizes the outer div to the specified width and height
jurzua
parents:
diff changeset
2545 this.resize = function (newWidth, newHeight)
jurzua
parents:
diff changeset
2546 {
jurzua
parents:
diff changeset
2547 resizeViewer(newWidth, newHeight);
jurzua
parents:
diff changeset
2548 loadViewer();
jurzua
parents:
diff changeset
2549 };
jurzua
parents:
diff changeset
2550
jurzua
parents:
diff changeset
2551 // Destroys this instance, tells plugins to do the same (for testing)
jurzua
parents:
diff changeset
2552 this.destroy = function ()
jurzua
parents:
diff changeset
2553 {
jurzua
parents:
diff changeset
2554 // Removes the hide-scrollbar class from the body
jurzua
parents:
diff changeset
2555 $('body').removeClass('diva-hide-scrollbar');
jurzua
parents:
diff changeset
2556
jurzua
parents:
diff changeset
2557 // Empty the parent container and remove any diva-related data
jurzua
parents:
diff changeset
2558 $(settings.parentSelector).empty().removeData('diva');
jurzua
parents:
diff changeset
2559
jurzua
parents:
diff changeset
2560 // Call the destroy function for all the enabled plugins (if it exists)
jurzua
parents:
diff changeset
2561 $.each(settings.plugins, function (index, plugin)
jurzua
parents:
diff changeset
2562 {
jurzua
parents:
diff changeset
2563 executeCallback(plugin.destroy);
jurzua
parents:
diff changeset
2564 });
jurzua
parents:
diff changeset
2565
jurzua
parents:
diff changeset
2566 // Remove any additional styling on the parent element
jurzua
parents:
diff changeset
2567 $(settings.parentSelector).removeAttr('style').removeAttr('class');
jurzua
parents:
diff changeset
2568 };
jurzua
parents:
diff changeset
2569 };
jurzua
parents:
diff changeset
2570
jurzua
parents:
diff changeset
2571 $.fn.diva = function (options)
jurzua
parents:
diff changeset
2572 {
jurzua
parents:
diff changeset
2573 return this.each(function ()
jurzua
parents:
diff changeset
2574 {
jurzua
parents:
diff changeset
2575 var element = $(this);
jurzua
parents:
diff changeset
2576
jurzua
parents:
diff changeset
2577 // Return early if this element already has a plugin instance
jurzua
parents:
diff changeset
2578 if (element.data('diva'))
jurzua
parents:
diff changeset
2579 {
jurzua
parents:
diff changeset
2580 return;
jurzua
parents:
diff changeset
2581 }
jurzua
parents:
diff changeset
2582
jurzua
parents:
diff changeset
2583 // Save the reference to the container element
jurzua
parents:
diff changeset
2584 options.parentSelector = element;
jurzua
parents:
diff changeset
2585
jurzua
parents:
diff changeset
2586 // Otherwise, instantiate the document viewer
jurzua
parents:
diff changeset
2587 var diva = new Diva(this, options);
jurzua
parents:
diff changeset
2588 element.data('diva', diva);
jurzua
parents:
diff changeset
2589 });
jurzua
parents:
diff changeset
2590 };
jurzua
parents:
diff changeset
2591
jurzua
parents:
diff changeset
2592 })(jQuery);