2015-01-09 00:22:23 +03:00
|
|
|
/* globals $, App */
|
|
|
|
|
|
|
|
(function() {
|
|
|
|
// ----------
|
|
|
|
window.App = {
|
|
|
|
// ----------
|
|
|
|
init: function() {
|
|
|
|
var self = this;
|
|
|
|
|
2015-01-10 02:46:57 +03:00
|
|
|
var count = 70;
|
2015-01-09 00:22:23 +03:00
|
|
|
|
|
|
|
this.mode = 'none';
|
|
|
|
this.pageBuffer = 0.05;
|
2015-01-10 00:53:48 +03:00
|
|
|
this.bigBuffer = 0.2;
|
2015-01-09 00:22:23 +03:00
|
|
|
this.page = 0;
|
|
|
|
this.modeNames = [
|
|
|
|
'thumbs',
|
|
|
|
'scroll',
|
|
|
|
'book',
|
|
|
|
'page'
|
|
|
|
];
|
|
|
|
|
|
|
|
this.viewer = OpenSeadragon({
|
|
|
|
id: "contentDiv",
|
|
|
|
prefixUrl: "../../../build/openseadragon/images/",
|
2015-01-09 22:45:53 +03:00
|
|
|
autoResize: false,
|
2015-01-14 02:33:03 +03:00
|
|
|
showHomeControl: false,
|
2015-01-09 22:45:53 +03:00
|
|
|
// animationTime: 10,
|
|
|
|
// springStiffness: 2,
|
2015-01-10 02:46:57 +03:00
|
|
|
tileSources: this.tileSources.slice(0, count)
|
2015-01-09 00:22:23 +03:00
|
|
|
});
|
|
|
|
|
|
|
|
this.viewer.addHandler('open', function() {
|
2015-01-09 22:45:53 +03:00
|
|
|
self.$el = $(self.viewer.element);
|
2015-01-09 00:22:23 +03:00
|
|
|
self.setMode('thumbs');
|
|
|
|
});
|
|
|
|
|
2015-01-09 01:04:31 +03:00
|
|
|
this.viewer.addHandler('canvas-click', function(event) {
|
2015-01-09 22:45:53 +03:00
|
|
|
if (self.mode !== 'thumbs' || !event.quick) {
|
2015-01-09 01:04:31 +03:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
var pos = self.viewer.viewport.pointFromPixel(event.position);
|
2015-01-10 02:11:11 +03:00
|
|
|
var result = self.hitTest(pos);
|
|
|
|
if (result) {
|
|
|
|
self.setMode('page', result.index);
|
|
|
|
}
|
|
|
|
});
|
|
|
|
|
2015-01-10 02:46:57 +03:00
|
|
|
this.viewer.addHandler('canvas-drag', function() {
|
2015-01-14 02:33:03 +03:00
|
|
|
if (self.mode === 'thumbs') {
|
2015-01-10 02:11:11 +03:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2015-01-14 02:33:03 +03:00
|
|
|
if (self.panBounds) {
|
|
|
|
var center = self.viewer.viewport.getCenter();
|
2015-01-14 02:49:53 +03:00
|
|
|
var currentCenter = self.viewer.viewport.getCenter(true);
|
|
|
|
var viewBounds = self.viewer.viewport.getBounds();
|
2015-01-14 02:33:03 +03:00
|
|
|
var bounds = self.panBounds.clone();
|
2015-01-14 02:49:53 +03:00
|
|
|
var left = Math.min(currentCenter.x, bounds.x + (viewBounds.width / 2));
|
|
|
|
var top = Math.min(currentCenter.y, bounds.y + (viewBounds.height / 2));
|
|
|
|
var right = Math.max(currentCenter.x, (bounds.x + bounds.width) - (viewBounds.width / 2));
|
|
|
|
var bottom = Math.max(currentCenter.y, (bounds.y + bounds.height) - (viewBounds.height / 2));
|
2015-01-14 02:33:03 +03:00
|
|
|
|
|
|
|
var x;
|
|
|
|
if (left <= right) {
|
|
|
|
x = Math.max(left, Math.min(right, center.x));
|
|
|
|
} else {
|
|
|
|
x = bounds.x + (bounds.width / 2);
|
|
|
|
}
|
|
|
|
|
|
|
|
var y;
|
|
|
|
if (top <= bottom) {
|
|
|
|
y = Math.max(top, Math.min(bottom, center.y));
|
|
|
|
} else {
|
|
|
|
y = bounds.y + (bounds.height / 2);
|
|
|
|
}
|
|
|
|
|
|
|
|
if (x !== center.x || y !== center.y) {
|
|
|
|
self.viewer.viewport.panTo(new OpenSeadragon.Point(x, y));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if (self.mode === 'scroll') {
|
|
|
|
var result = self.hitTest(self.viewer.viewport.getCenter());
|
|
|
|
if (result) {
|
|
|
|
self.page = result.index;
|
|
|
|
}
|
2015-01-09 01:04:31 +03:00
|
|
|
}
|
|
|
|
});
|
|
|
|
|
2015-01-09 00:22:23 +03:00
|
|
|
$.each(this.modeNames, function(i, v) {
|
|
|
|
$('.' + v).click(function() {
|
|
|
|
self.setMode(v);
|
|
|
|
});
|
|
|
|
});
|
|
|
|
|
|
|
|
$('.next').click(function() {
|
2015-01-10 02:11:11 +03:00
|
|
|
self.next();
|
2015-01-09 00:22:23 +03:00
|
|
|
});
|
|
|
|
|
|
|
|
$('.previous').click(function() {
|
2015-01-10 02:11:11 +03:00
|
|
|
self.previous();
|
|
|
|
});
|
|
|
|
|
|
|
|
$(window).keyup(function(event) {
|
|
|
|
if (self.mode === 'thumbs') {
|
|
|
|
return;
|
2015-01-09 00:22:23 +03:00
|
|
|
}
|
|
|
|
|
2015-01-10 02:11:11 +03:00
|
|
|
if (event.which === 39) { // Right arrow
|
|
|
|
self.next();
|
|
|
|
} else if (event.which === 37) { // Left arrow
|
|
|
|
self.previous();
|
|
|
|
}
|
2015-01-09 00:22:23 +03:00
|
|
|
});
|
|
|
|
|
|
|
|
this.update();
|
|
|
|
},
|
|
|
|
|
2015-01-10 02:11:11 +03:00
|
|
|
// ----------
|
|
|
|
next: function() {
|
|
|
|
var page = this.page + (this.mode === 'book' ? 2 : 1);
|
|
|
|
if (this.mode === 'book' && page % 2 === 0 && page !== 0) {
|
|
|
|
page --;
|
|
|
|
}
|
|
|
|
|
|
|
|
this.goToPage(page);
|
|
|
|
},
|
|
|
|
|
|
|
|
// ----------
|
|
|
|
previous: function() {
|
|
|
|
var page = this.page - (this.mode === 'book' ? 2 : 1);
|
|
|
|
if (this.mode === 'book' && page % 2 === 0 && page !== 0) {
|
|
|
|
page --;
|
|
|
|
}
|
|
|
|
|
|
|
|
this.goToPage(page);
|
|
|
|
},
|
|
|
|
|
|
|
|
// ----------
|
|
|
|
hitTest: function(pos) {
|
|
|
|
var count = this.viewer.world.getItemCount();
|
|
|
|
var item, box;
|
|
|
|
|
|
|
|
for (var i = 0; i < count; i++) {
|
|
|
|
item = this.viewer.world.getItemAt(i);
|
|
|
|
box = item.getBounds();
|
|
|
|
if (pos.x > box.x && pos.y > box.y && pos.x < box.x + box.width &&
|
|
|
|
pos.y < box.y + box.height) {
|
|
|
|
return {
|
|
|
|
item: item,
|
|
|
|
index: i
|
|
|
|
};
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return null;
|
|
|
|
},
|
|
|
|
|
2015-01-09 00:22:23 +03:00
|
|
|
// ----------
|
|
|
|
update: function() {
|
|
|
|
var self = this;
|
|
|
|
|
2015-01-10 02:11:11 +03:00
|
|
|
$('.nav').toggle(this.mode === 'scroll' || this.mode === 'book' || this.mode === 'page');
|
2015-01-09 00:22:23 +03:00
|
|
|
$('.previous').toggleClass('hidden', this.page <= 0);
|
|
|
|
$('.next').toggleClass('hidden', this.page >= this.viewer.world.getItemCount() - 1);
|
|
|
|
|
|
|
|
$.each(this.modeNames, function(i, v) {
|
|
|
|
$('.' + v).toggleClass('active', v === self.mode);
|
|
|
|
});
|
|
|
|
},
|
|
|
|
|
|
|
|
// ----------
|
2015-01-09 01:04:31 +03:00
|
|
|
setMode: function(mode, page) {
|
2015-01-09 22:45:53 +03:00
|
|
|
var self = this;
|
|
|
|
|
2015-01-09 00:22:23 +03:00
|
|
|
if (this.mode === mode) {
|
2015-01-09 01:04:31 +03:00
|
|
|
if (page !== undefined) {
|
|
|
|
this.goToPage(page);
|
|
|
|
}
|
|
|
|
|
2015-01-09 00:22:23 +03:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
this.mode = mode;
|
|
|
|
|
2015-01-09 01:04:31 +03:00
|
|
|
if (page !== undefined) {
|
|
|
|
this.page = page; // Need to do this before layout
|
|
|
|
}
|
|
|
|
|
2015-01-10 00:53:48 +03:00
|
|
|
var layout = this.createLayout();
|
|
|
|
|
2015-01-09 22:45:53 +03:00
|
|
|
var oldSize = new OpenSeadragon.Point(this.$el.width(), this.$el.height());
|
|
|
|
var oldBounds = this.viewer.viewport.getBounds();
|
|
|
|
var scrollTop = $(window).scrollTop();
|
|
|
|
var scrollMax = $(document).height() - $(window).height();
|
|
|
|
var scrollFactor = (scrollMax > 0 ? scrollTop / scrollMax : 0);
|
|
|
|
|
|
|
|
if (this.mode === 'thumbs') {
|
|
|
|
this.viewer.gestureSettingsMouse.scrollToZoom = false;
|
|
|
|
this.viewer.zoomPerClick = 1;
|
2015-01-14 02:33:03 +03:00
|
|
|
this.viewer.panHorizontal = false;
|
|
|
|
this.viewer.panVertical = false;
|
2015-01-10 00:53:48 +03:00
|
|
|
var viewerWidth = this.$el.width();
|
|
|
|
var width = layout.bounds.width + (this.bigBuffer * 2);
|
|
|
|
var height = layout.bounds.height + (this.bigBuffer * 2);
|
|
|
|
var newHeight = viewerWidth * (height / width);
|
|
|
|
this.$el
|
2015-01-09 22:45:53 +03:00
|
|
|
.addClass('thumbs')
|
|
|
|
.removeClass('full')
|
|
|
|
.css({
|
2015-01-10 00:53:48 +03:00
|
|
|
height: newHeight
|
2015-01-09 22:45:53 +03:00
|
|
|
});
|
|
|
|
} else {
|
|
|
|
this.viewer.gestureSettingsMouse.scrollToZoom = true;
|
|
|
|
this.viewer.zoomPerClick = 2;
|
2015-01-14 02:33:03 +03:00
|
|
|
this.viewer.panHorizontal = true;
|
|
|
|
this.viewer.panVertical = true;
|
2015-01-10 00:53:48 +03:00
|
|
|
this.$el
|
2015-01-09 22:45:53 +03:00
|
|
|
.addClass('full')
|
|
|
|
.removeClass('thumbs')
|
|
|
|
.css({
|
|
|
|
height: 'auto'
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
var newSize = new OpenSeadragon.Point(this.$el.width(), this.$el.height());
|
|
|
|
if (oldSize.x !== newSize.x || oldSize.y !== newSize.y) {
|
|
|
|
this.viewer.viewport.resize(newSize, false);
|
|
|
|
var newBounds = this.viewer.viewport.getBounds();
|
|
|
|
var box = oldBounds.clone();
|
|
|
|
box.height = box.width * (newBounds.height / newBounds.width);
|
|
|
|
|
|
|
|
var boxMax = oldBounds.height - box.height;
|
|
|
|
box.y += boxMax * scrollFactor;
|
|
|
|
this.viewer.viewport.fitBounds(box, true);
|
|
|
|
this.viewer.viewport.update();
|
|
|
|
}
|
|
|
|
|
2015-01-10 00:53:48 +03:00
|
|
|
this.setLayout(layout);
|
2015-01-09 00:22:23 +03:00
|
|
|
|
2015-01-09 01:04:31 +03:00
|
|
|
if (page !== undefined) {
|
|
|
|
this.goToPage(page); // Need to do this after layout; does the zoom/pan
|
2015-01-10 00:53:48 +03:00
|
|
|
} else {
|
|
|
|
this.goHome();
|
2015-01-09 01:04:31 +03:00
|
|
|
}
|
|
|
|
|
2015-01-14 02:33:03 +03:00
|
|
|
this.viewer.viewport.minZoomLevel = this.viewer.viewport.getZoom();
|
|
|
|
|
2015-01-09 00:22:23 +03:00
|
|
|
this.update();
|
|
|
|
},
|
|
|
|
|
|
|
|
// ----------
|
|
|
|
goToPage: function(page) {
|
2015-01-14 02:33:03 +03:00
|
|
|
var itemCount = this.viewer.world.getItemCount();
|
|
|
|
page = Math.max(0, Math.min(itemCount - 1, page));
|
2015-01-09 00:22:23 +03:00
|
|
|
this.page = page;
|
|
|
|
|
2015-01-10 01:04:45 +03:00
|
|
|
var viewerWidth = this.$el.width();
|
|
|
|
var viewerHeight = this.$el.height();
|
2015-01-09 00:22:23 +03:00
|
|
|
var bounds = this.viewer.world.getItemAt(this.page).getBounds();
|
|
|
|
var x = bounds.x;
|
|
|
|
var y = bounds.y;
|
|
|
|
var width = bounds.width;
|
|
|
|
var height = bounds.height;
|
2015-01-14 02:33:03 +03:00
|
|
|
var box;
|
2015-01-09 00:22:23 +03:00
|
|
|
|
|
|
|
if (this.mode === 'book') {
|
|
|
|
var item;
|
|
|
|
if (this.page % 2) { // First in a pair
|
|
|
|
item = this.viewer.world.getItemAt(this.page + 1);
|
|
|
|
if (item) {
|
|
|
|
width += item.getBounds().width;
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
item = this.viewer.world.getItemAt(this.page - 1);
|
|
|
|
if (item) {
|
2015-01-14 02:33:03 +03:00
|
|
|
box = item.getBounds();
|
2015-01-09 00:22:23 +03:00
|
|
|
x -= width;
|
|
|
|
width += box.width;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
x -= this.pageBuffer;
|
|
|
|
y -= this.pageBuffer;
|
|
|
|
width += (this.pageBuffer * 2);
|
|
|
|
height += (this.pageBuffer * 2);
|
2015-01-10 01:04:45 +03:00
|
|
|
|
|
|
|
if (this.mode === 'scroll') {
|
|
|
|
if (this.page === 0) {
|
2015-01-10 02:11:11 +03:00
|
|
|
x = bounds.x - this.pageBuffer;
|
2015-01-10 01:04:45 +03:00
|
|
|
width = height * (viewerWidth / viewerHeight);
|
|
|
|
} else if (this.page === this.viewer.world.getItemCount() - 1) {
|
|
|
|
width = height * (viewerWidth / viewerHeight);
|
|
|
|
x = (bounds.x + bounds.width + this.pageBuffer) - width;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2015-01-14 02:33:03 +03:00
|
|
|
box = new OpenSeadragon.Rect(x, y, width, height);
|
|
|
|
this.viewer.viewport.fitBounds(box);
|
|
|
|
|
|
|
|
if (this.mode === 'page' || this.mode === 'book') {
|
|
|
|
this.panBounds = box;
|
|
|
|
} else if (this.mode === 'scroll') {
|
|
|
|
this.panBounds = this.viewer.world.getItemAt(0).getBounds()
|
|
|
|
.union(this.viewer.world.getItemAt(itemCount - 1).getBounds());
|
|
|
|
|
|
|
|
this.panBounds.x -= this.pageBuffer;
|
|
|
|
this.panBounds.y -= this.pageBuffer;
|
|
|
|
this.panBounds.width += (this.pageBuffer * 2);
|
|
|
|
this.panBounds.height += (this.pageBuffer * 2);
|
|
|
|
}
|
|
|
|
|
|
|
|
this.viewer.viewport.minZoomLevel = this.viewer.viewport.getZoom();
|
2015-01-09 00:22:23 +03:00
|
|
|
|
|
|
|
this.update();
|
|
|
|
},
|
|
|
|
|
|
|
|
// ----------
|
2015-01-10 00:53:48 +03:00
|
|
|
createLayout: function() {
|
|
|
|
var viewerWidth = this.$el.width();
|
|
|
|
var viewerHeight = this.$el.height();
|
|
|
|
var layoutConfig = {};
|
|
|
|
|
|
|
|
if (this.mode === 'thumbs') {
|
|
|
|
layoutConfig.columns = Math.floor(viewerWidth / 150);
|
|
|
|
layoutConfig.buffer = this.bigBuffer;
|
|
|
|
} else if (this.mode === 'scroll') {
|
|
|
|
layoutConfig.buffer = this.pageBuffer;
|
|
|
|
} else if (this.mode === 'book') {
|
|
|
|
layoutConfig.book = true;
|
|
|
|
layoutConfig.buffer = this.bigBuffer;
|
|
|
|
} else if (this.mode === 'page') {
|
|
|
|
layoutConfig.buffer = 2;
|
|
|
|
}
|
|
|
|
|
|
|
|
var layout = {
|
|
|
|
bounds: null,
|
|
|
|
specs: []
|
|
|
|
};
|
|
|
|
|
2015-01-09 00:22:23 +03:00
|
|
|
var count = this.viewer.world.getItemCount();
|
|
|
|
var x = 0;
|
|
|
|
var y = 0;
|
2015-01-09 01:04:31 +03:00
|
|
|
var points = [];
|
2015-01-09 00:22:23 +03:00
|
|
|
|
|
|
|
var item;
|
|
|
|
for (var i = 0; i < count; i++) {
|
|
|
|
item = this.viewer.world.getItemAt(i);
|
2015-01-09 01:04:31 +03:00
|
|
|
points.push(new OpenSeadragon.Point(x, y));
|
2015-01-10 00:53:48 +03:00
|
|
|
if (layoutConfig.columns && i % layoutConfig.columns === layoutConfig.columns - 1) {
|
2015-01-09 00:22:23 +03:00
|
|
|
x = 0;
|
2015-01-10 00:53:48 +03:00
|
|
|
y += item.getBounds().height + layoutConfig.buffer;
|
2015-01-09 00:22:23 +03:00
|
|
|
} else {
|
2015-01-10 00:53:48 +03:00
|
|
|
if (!layoutConfig.book || i % 2 === 0) {
|
|
|
|
x += layoutConfig.buffer;
|
2015-01-09 00:22:23 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
x += 1;
|
|
|
|
}
|
|
|
|
}
|
2015-01-09 01:04:31 +03:00
|
|
|
|
|
|
|
var tl = this.viewer.world.getItemAt(this.page).getBounds().getTopLeft();
|
|
|
|
var offset = tl.minus(points[this.page]);
|
2015-01-10 00:53:48 +03:00
|
|
|
var box, pos;
|
|
|
|
|
2015-01-09 01:04:31 +03:00
|
|
|
for (i = 0; i < count; i++) {
|
|
|
|
item = this.viewer.world.getItemAt(i);
|
2015-01-10 00:53:48 +03:00
|
|
|
box = item.getBounds();
|
|
|
|
pos = points[i].plus(offset);
|
|
|
|
box.x = pos.x;
|
|
|
|
box.y = pos.y;
|
|
|
|
layout.specs.push({
|
|
|
|
item: item,
|
|
|
|
bounds: box
|
|
|
|
});
|
|
|
|
|
|
|
|
if (layout.bounds) {
|
2015-01-14 02:33:03 +03:00
|
|
|
layout.bounds = layout.bounds.union(box);
|
2015-01-10 00:53:48 +03:00
|
|
|
} else {
|
|
|
|
layout.bounds = box.clone();
|
|
|
|
}
|
2015-01-09 01:04:31 +03:00
|
|
|
}
|
2015-01-10 00:53:48 +03:00
|
|
|
|
|
|
|
return layout;
|
2015-01-09 00:22:23 +03:00
|
|
|
},
|
|
|
|
|
|
|
|
// ----------
|
2015-01-10 00:53:48 +03:00
|
|
|
setLayout: function(layout) {
|
|
|
|
var spec;
|
2015-01-09 00:22:23 +03:00
|
|
|
|
2015-01-10 00:53:48 +03:00
|
|
|
for (var i = 0; i < layout.specs.length; i++) {
|
|
|
|
spec = layout.specs[i];
|
|
|
|
spec.item.setPosition(spec.bounds.getTopLeft());
|
|
|
|
}
|
2015-01-09 00:22:23 +03:00
|
|
|
},
|
|
|
|
|
|
|
|
// ----------
|
2015-01-10 00:53:48 +03:00
|
|
|
goHome: function() {
|
|
|
|
var viewerWidth = this.$el.width();
|
|
|
|
var viewerHeight = this.$el.height();
|
|
|
|
var layoutConfig = {};
|
2015-01-09 00:22:23 +03:00
|
|
|
|
2015-01-10 00:53:48 +03:00
|
|
|
var box;
|
|
|
|
if (this.mode === 'thumbs') {
|
|
|
|
box = this.viewer.world.getHomeBounds();
|
|
|
|
box.x -= this.bigBuffer;
|
|
|
|
box.y -= this.bigBuffer;
|
|
|
|
box.width += (this.bigBuffer * 2);
|
|
|
|
box.height = box.width * (viewerHeight / viewerWidth);
|
|
|
|
this.viewer.viewport.fitBounds(box);
|
2015-01-14 02:33:03 +03:00
|
|
|
} else {
|
2015-01-10 00:53:48 +03:00
|
|
|
this.goToPage(this.page);
|
|
|
|
}
|
2015-01-09 00:22:23 +03:00
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
// ----------
|
|
|
|
$(document).ready(function() {
|
|
|
|
App.init();
|
|
|
|
});
|
|
|
|
})();
|