monocle-rails 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/.DS_Store +0 -0
- data/.gitignore +17 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +22 -0
- data/README.md +29 -0
- data/Rakefile +1 -0
- data/lib/monocle/rails.rb +8 -0
- data/lib/monocle/rails/version.rb +5 -0
- data/monocle-rails.gemspec +23 -0
- data/vendor/.DS_Store +0 -0
- data/vendor/assets/.DS_Store +0 -0
- data/vendor/assets/javascripts/.DS_Store +0 -0
- data/vendor/assets/javascripts/compat/browser.js +120 -0
- data/vendor/assets/javascripts/compat/css.js +145 -0
- data/vendor/assets/javascripts/compat/env.js +463 -0
- data/vendor/assets/javascripts/compat/gala.js +469 -0
- data/vendor/assets/javascripts/compat/stubs.js +50 -0
- data/vendor/assets/javascripts/controls/contents.js +59 -0
- data/vendor/assets/javascripts/controls/magnifier.js +51 -0
- data/vendor/assets/javascripts/controls/panel.js +136 -0
- data/vendor/assets/javascripts/controls/placesaver.js +100 -0
- data/vendor/assets/javascripts/controls/scrubber.js +140 -0
- data/vendor/assets/javascripts/controls/spinner.js +99 -0
- data/vendor/assets/javascripts/controls/stencil.js +410 -0
- data/vendor/assets/javascripts/core/billboard.js +120 -0
- data/vendor/assets/javascripts/core/book.js +467 -0
- data/vendor/assets/javascripts/core/bookdata.js +59 -0
- data/vendor/assets/javascripts/core/component.js +413 -0
- data/vendor/assets/javascripts/core/events.js +56 -0
- data/vendor/assets/javascripts/core/factory.js +194 -0
- data/vendor/assets/javascripts/core/formatting.js +317 -0
- data/vendor/assets/javascripts/core/monocle.js +16 -0
- data/vendor/assets/javascripts/core/place.js +210 -0
- data/vendor/assets/javascripts/core/reader.js +683 -0
- data/vendor/assets/javascripts/core/selection.js +158 -0
- data/vendor/assets/javascripts/core/styles.js +155 -0
- data/vendor/assets/javascripts/dimensions/columns.js +218 -0
- data/vendor/assets/javascripts/flippers/instant.js +78 -0
- data/vendor/assets/javascripts/flippers/scroller.js +128 -0
- data/vendor/assets/javascripts/flippers/slider.js +469 -0
- data/vendor/assets/javascripts/monocore.js +27 -0
- data/vendor/assets/javascripts/monoctrl.js +1 -0
- data/vendor/assets/javascripts/panels/eink.js +61 -0
- data/vendor/assets/javascripts/panels/imode.js +180 -0
- data/vendor/assets/javascripts/panels/magic.js +297 -0
- data/vendor/assets/javascripts/panels/marginal.js +50 -0
- data/vendor/assets/javascripts/panels/twopane.js +34 -0
- data/vendor/assets/stylesheets/monocore.css +194 -0
- data/vendor/assets/stylesheets/monoctrl.css +168 -0
- metadata +129 -0
@@ -0,0 +1,78 @@
|
|
1
|
+
Monocle.Flippers.Instant = function (reader) {
|
2
|
+
|
3
|
+
var API = { constructor: Monocle.Flippers.Instant }
|
4
|
+
var k = API.constants = API.constructor;
|
5
|
+
var p = API.properties = {
|
6
|
+
pageCount: 1
|
7
|
+
}
|
8
|
+
|
9
|
+
|
10
|
+
function initialize() {
|
11
|
+
p.reader = reader;
|
12
|
+
}
|
13
|
+
|
14
|
+
|
15
|
+
function addPage(pageDiv) {
|
16
|
+
pageDiv.m.dimensions = new Monocle.Dimensions.Columns(pageDiv);
|
17
|
+
}
|
18
|
+
|
19
|
+
|
20
|
+
function getPlace() {
|
21
|
+
return page().m.place;
|
22
|
+
}
|
23
|
+
|
24
|
+
|
25
|
+
function moveTo(locus, callback) {
|
26
|
+
var fn = frameToLocus;
|
27
|
+
if (typeof callback == "function") {
|
28
|
+
fn = function (locus) { frameToLocus(locus); callback(locus); }
|
29
|
+
}
|
30
|
+
p.reader.getBook().setOrLoadPageAt(page(), locus, fn);
|
31
|
+
}
|
32
|
+
|
33
|
+
|
34
|
+
function listenForInteraction(panelClass) {
|
35
|
+
if (typeof panelClass != "function") {
|
36
|
+
if (Monocle.Browser.on.Kindle3) {
|
37
|
+
panelClass = Monocle.Panels.eInk;
|
38
|
+
}
|
39
|
+
panelClass = panelClass || k.DEFAULT_PANELS_CLASS;
|
40
|
+
}
|
41
|
+
if (!panelClass) { throw("Panels not found."); }
|
42
|
+
p.panels = new panelClass(API, { 'end': turn });
|
43
|
+
}
|
44
|
+
|
45
|
+
|
46
|
+
function page() {
|
47
|
+
return p.reader.dom.find('page');
|
48
|
+
}
|
49
|
+
|
50
|
+
|
51
|
+
function turn(dir) {
|
52
|
+
p.reader.selection.deselect();
|
53
|
+
moveTo({ page: getPlace().pageNumber() + dir});
|
54
|
+
p.reader.dispatchEvent('monocle:turning');
|
55
|
+
}
|
56
|
+
|
57
|
+
|
58
|
+
function frameToLocus(locus) {
|
59
|
+
page().m.dimensions.translateToLocus(locus);
|
60
|
+
Monocle.defer(function () { p.reader.dispatchEvent('monocle:turn'); });
|
61
|
+
}
|
62
|
+
|
63
|
+
|
64
|
+
// THIS IS THE CORE API THAT ALL FLIPPERS MUST PROVIDE.
|
65
|
+
API.pageCount = p.pageCount;
|
66
|
+
API.addPage = addPage;
|
67
|
+
API.getPlace = getPlace;
|
68
|
+
API.moveTo = moveTo;
|
69
|
+
API.listenForInteraction = listenForInteraction;
|
70
|
+
|
71
|
+
initialize();
|
72
|
+
|
73
|
+
return API;
|
74
|
+
}
|
75
|
+
|
76
|
+
Monocle.Flippers.Instant.FORWARDS = 1;
|
77
|
+
Monocle.Flippers.Instant.BACKWARDS = -1;
|
78
|
+
Monocle.Flippers.Instant.DEFAULT_PANELS_CLASS = Monocle.Panels.TwoPane;
|
@@ -0,0 +1,128 @@
|
|
1
|
+
Monocle.Flippers.Scroller = function (reader, setPageFn) {
|
2
|
+
|
3
|
+
var API = { constructor: Monocle.Flippers.Scroller }
|
4
|
+
var k = API.constants = API.constructor;
|
5
|
+
var p = API.properties = {
|
6
|
+
pageCount: 1,
|
7
|
+
duration: k.speed
|
8
|
+
}
|
9
|
+
|
10
|
+
|
11
|
+
function initialize() {
|
12
|
+
p.reader = reader;
|
13
|
+
p.setPageFn = setPageFn;
|
14
|
+
}
|
15
|
+
|
16
|
+
|
17
|
+
function addPage(pageDiv) {
|
18
|
+
pageDiv.m.dimensions = new Monocle.Dimensions.Columns(pageDiv);
|
19
|
+
}
|
20
|
+
|
21
|
+
|
22
|
+
function page() {
|
23
|
+
return p.reader.dom.find('page');
|
24
|
+
}
|
25
|
+
|
26
|
+
|
27
|
+
function listenForInteraction(panelClass) {
|
28
|
+
if (typeof panelClass != "function") {
|
29
|
+
panelClass = k.DEFAULT_PANELS_CLASS;
|
30
|
+
}
|
31
|
+
p.panels = new panelClass(
|
32
|
+
API,
|
33
|
+
{
|
34
|
+
'end': turn
|
35
|
+
}
|
36
|
+
);
|
37
|
+
}
|
38
|
+
|
39
|
+
|
40
|
+
function turn(dir) {
|
41
|
+
if (p.turning) { return; }
|
42
|
+
p.reader.selection.deselect();
|
43
|
+
moveTo({ page: getPlace().pageNumber() + dir});
|
44
|
+
p.reader.dispatchEvent('monocle:turning');
|
45
|
+
}
|
46
|
+
|
47
|
+
|
48
|
+
function getPlace() {
|
49
|
+
return page().m.place;
|
50
|
+
}
|
51
|
+
|
52
|
+
|
53
|
+
function moveTo(locus, callback) {
|
54
|
+
var fn = frameToLocus;
|
55
|
+
if (typeof callback == "function") {
|
56
|
+
fn = function (locus) { frameToLocus(locus); callback(locus); }
|
57
|
+
}
|
58
|
+
p.reader.getBook().setOrLoadPageAt(page(), locus, fn);
|
59
|
+
}
|
60
|
+
|
61
|
+
|
62
|
+
function frameToLocus(locus) {
|
63
|
+
if (locus.boundarystart || locus.boundaryend) { return; }
|
64
|
+
p.turning = true;
|
65
|
+
var dims = page().m.dimensions;
|
66
|
+
var fr = page().m.activeFrame;
|
67
|
+
var bdy = fr.contentDocument.body;
|
68
|
+
var anim = true;
|
69
|
+
if (p.activeComponent != fr.m.component) {
|
70
|
+
// No animation.
|
71
|
+
p.activeComponent = fr.m.component;
|
72
|
+
dims.translateToLocus(locus, "none");
|
73
|
+
Monocle.defer(turned);
|
74
|
+
} else if (Monocle.Browser.env.supportsTransition) {
|
75
|
+
// Native animation.
|
76
|
+
dims.translateToLocus(locus, p.duration+"ms ease-in 0ms");
|
77
|
+
Monocle.Events.afterTransition(bdy, turned);
|
78
|
+
} else {
|
79
|
+
// Old-school JS animation.
|
80
|
+
var x = dims.locusToOffset(locus);
|
81
|
+
var finalX = 0 - x;
|
82
|
+
var stamp = (new Date()).getTime();
|
83
|
+
var frameRate = 40;
|
84
|
+
var currX = p.currX || 0;
|
85
|
+
var step = (finalX - currX) * (frameRate / p.duration);
|
86
|
+
var stepFn = function () {
|
87
|
+
var destX = currX + step;
|
88
|
+
if (
|
89
|
+
(new Date()).getTime() - stamp > p.duration ||
|
90
|
+
Math.abs(currX - finalX) <= Math.abs((currX + step) - finalX)
|
91
|
+
) {
|
92
|
+
Monocle.Styles.setX(bdy, finalX);
|
93
|
+
turned();
|
94
|
+
} else {
|
95
|
+
Monocle.Styles.setX(bdy, destX);
|
96
|
+
currX = destX;
|
97
|
+
setTimeout(stepFn, frameRate);
|
98
|
+
}
|
99
|
+
p.currX = destX;
|
100
|
+
}
|
101
|
+
stepFn();
|
102
|
+
}
|
103
|
+
}
|
104
|
+
|
105
|
+
|
106
|
+
function turned() {
|
107
|
+
p.turning = false;
|
108
|
+
p.reader.dispatchEvent('monocle:turn');
|
109
|
+
}
|
110
|
+
|
111
|
+
|
112
|
+
// THIS IS THE CORE API THAT ALL FLIPPERS MUST PROVIDE.
|
113
|
+
API.pageCount = p.pageCount;
|
114
|
+
API.addPage = addPage;
|
115
|
+
API.getPlace = getPlace;
|
116
|
+
API.moveTo = moveTo;
|
117
|
+
API.listenForInteraction = listenForInteraction;
|
118
|
+
|
119
|
+
initialize();
|
120
|
+
|
121
|
+
return API;
|
122
|
+
}
|
123
|
+
|
124
|
+
Monocle.Flippers.Scroller.speed = 300; // How long the animation takes
|
125
|
+
Monocle.Flippers.Scroller.rate = 20; // frame-rate of the animation
|
126
|
+
Monocle.Flippers.Scroller.FORWARDS = 1;
|
127
|
+
Monocle.Flippers.Scroller.BACKWARDS = -1;
|
128
|
+
Monocle.Flippers.Scroller.DEFAULT_PANELS_CLASS = Monocle.Panels.TwoPane;
|
@@ -0,0 +1,469 @@
|
|
1
|
+
Monocle.Flippers.Slider = function (reader) {
|
2
|
+
|
3
|
+
var API = { constructor: Monocle.Flippers.Slider }
|
4
|
+
var k = API.constants = API.constructor;
|
5
|
+
var p = API.properties = {
|
6
|
+
reader: reader,
|
7
|
+
pageCount: 2,
|
8
|
+
activeIndex: 1,
|
9
|
+
turnData: {},
|
10
|
+
nextPageReady: true
|
11
|
+
}
|
12
|
+
|
13
|
+
|
14
|
+
function initialize() {
|
15
|
+
p.reader.listen("monocle:componentchanging", showWaitControl);
|
16
|
+
}
|
17
|
+
|
18
|
+
|
19
|
+
function addPage(pageDiv) {
|
20
|
+
pageDiv.m.dimensions = new Monocle.Dimensions.Columns(pageDiv);
|
21
|
+
|
22
|
+
// BROWSERHACK: Firefox 4 is prone to beachballing on the first page turn
|
23
|
+
// unless a zeroed translateX has been applied to the page div.
|
24
|
+
Monocle.Styles.setX(pageDiv, 0);
|
25
|
+
}
|
26
|
+
|
27
|
+
|
28
|
+
function visiblePages() {
|
29
|
+
return [upperPage()];
|
30
|
+
}
|
31
|
+
|
32
|
+
|
33
|
+
function listenForInteraction(panelClass) {
|
34
|
+
if (typeof panelClass != "function") {
|
35
|
+
panelClass = k.DEFAULT_PANELS_CLASS;
|
36
|
+
if (!panelClass) {
|
37
|
+
console.warn("Invalid panel class.")
|
38
|
+
}
|
39
|
+
}
|
40
|
+
p.panels = new panelClass(
|
41
|
+
API,
|
42
|
+
{
|
43
|
+
'start': lift,
|
44
|
+
'move': turning,
|
45
|
+
'end': release,
|
46
|
+
'cancel': release
|
47
|
+
}
|
48
|
+
);
|
49
|
+
}
|
50
|
+
|
51
|
+
|
52
|
+
function getPlace(pageDiv) {
|
53
|
+
pageDiv = pageDiv || upperPage();
|
54
|
+
return pageDiv.m ? pageDiv.m.place : null;
|
55
|
+
}
|
56
|
+
|
57
|
+
|
58
|
+
function moveTo(locus, callback) {
|
59
|
+
var cb = function () {
|
60
|
+
if (typeof callback == "function") { callback(); }
|
61
|
+
announceTurn();
|
62
|
+
}
|
63
|
+
setPage(upperPage(), locus, function () { prepareNextPage(cb) });
|
64
|
+
}
|
65
|
+
|
66
|
+
|
67
|
+
function setPage(pageDiv, locus, onLoad, onFail) {
|
68
|
+
p.reader.getBook().setOrLoadPageAt(
|
69
|
+
pageDiv,
|
70
|
+
locus,
|
71
|
+
function (locus) {
|
72
|
+
pageDiv.m.dimensions.translateToLocus(locus);
|
73
|
+
Monocle.defer(onLoad);
|
74
|
+
},
|
75
|
+
onFail
|
76
|
+
);
|
77
|
+
}
|
78
|
+
|
79
|
+
|
80
|
+
function upperPage() {
|
81
|
+
return p.reader.dom.find('page', p.activeIndex);
|
82
|
+
}
|
83
|
+
|
84
|
+
|
85
|
+
function lowerPage() {
|
86
|
+
return p.reader.dom.find('page', (p.activeIndex + 1) % 2);
|
87
|
+
}
|
88
|
+
|
89
|
+
|
90
|
+
function flipPages() {
|
91
|
+
upperPage().style.zIndex = 1;
|
92
|
+
lowerPage().style.zIndex = 2;
|
93
|
+
return p.activeIndex = (p.activeIndex + 1) % 2;
|
94
|
+
}
|
95
|
+
|
96
|
+
|
97
|
+
function lift(dir, boxPointX) {
|
98
|
+
if (p.turnData.lifting || p.turnData.releasing) { return; }
|
99
|
+
|
100
|
+
p.reader.selection.deselect();
|
101
|
+
|
102
|
+
p.turnData.points = {
|
103
|
+
start: boxPointX,
|
104
|
+
min: boxPointX,
|
105
|
+
max: boxPointX
|
106
|
+
}
|
107
|
+
p.turnData.lifting = true;
|
108
|
+
|
109
|
+
var place = getPlace();
|
110
|
+
|
111
|
+
if (dir == k.FORWARDS) {
|
112
|
+
if (place.onLastPageOfBook()) {
|
113
|
+
p.reader.dispatchEvent(
|
114
|
+
'monocle:boundaryend',
|
115
|
+
{
|
116
|
+
locus: getPlace().getLocus({ direction : dir }),
|
117
|
+
page: upperPage()
|
118
|
+
}
|
119
|
+
);
|
120
|
+
resetTurnData();
|
121
|
+
return;
|
122
|
+
}
|
123
|
+
onGoingForward(boxPointX);
|
124
|
+
} else if (dir == k.BACKWARDS) {
|
125
|
+
if (place.onFirstPageOfBook()) {
|
126
|
+
p.reader.dispatchEvent(
|
127
|
+
'monocle:boundarystart',
|
128
|
+
{
|
129
|
+
locus: getPlace().getLocus({ direction : dir }),
|
130
|
+
page: upperPage()
|
131
|
+
}
|
132
|
+
);
|
133
|
+
resetTurnData();
|
134
|
+
return;
|
135
|
+
}
|
136
|
+
onGoingBackward(boxPointX);
|
137
|
+
} else {
|
138
|
+
console.warn("Invalid direction: " + dir);
|
139
|
+
}
|
140
|
+
}
|
141
|
+
|
142
|
+
|
143
|
+
function turning(dir, boxPointX) {
|
144
|
+
if (!p.turnData.points) { return; }
|
145
|
+
if (p.turnData.lifting || p.turnData.releasing) { return; }
|
146
|
+
checkPoint(boxPointX);
|
147
|
+
slideToCursor(boxPointX, null, "0");
|
148
|
+
}
|
149
|
+
|
150
|
+
|
151
|
+
function release(dir, boxPointX) {
|
152
|
+
if (!p.turnData.points) {
|
153
|
+
return;
|
154
|
+
}
|
155
|
+
if (p.turnData.lifting) {
|
156
|
+
p.turnData.releaseArgs = [dir, boxPointX];
|
157
|
+
return;
|
158
|
+
}
|
159
|
+
if (p.turnData.releasing) {
|
160
|
+
return;
|
161
|
+
}
|
162
|
+
|
163
|
+
checkPoint(boxPointX);
|
164
|
+
|
165
|
+
p.turnData.releasing = true;
|
166
|
+
|
167
|
+
if (dir == k.FORWARDS) {
|
168
|
+
if (
|
169
|
+
p.turnData.points.tap ||
|
170
|
+
p.turnData.points.start - boxPointX > 60 ||
|
171
|
+
p.turnData.points.min >= boxPointX
|
172
|
+
) {
|
173
|
+
// Completing forward turn
|
174
|
+
slideOut(afterGoingForward);
|
175
|
+
} else {
|
176
|
+
// Cancelling forward turn
|
177
|
+
slideIn(afterCancellingForward);
|
178
|
+
}
|
179
|
+
} else if (dir == k.BACKWARDS) {
|
180
|
+
if (
|
181
|
+
p.turnData.points.tap ||
|
182
|
+
boxPointX - p.turnData.points.start > 60 ||
|
183
|
+
p.turnData.points.max <= boxPointX
|
184
|
+
) {
|
185
|
+
// Completing backward turn
|
186
|
+
slideIn(afterGoingBackward);
|
187
|
+
} else {
|
188
|
+
// Cancelling backward turn
|
189
|
+
slideOut(afterCancellingBackward);
|
190
|
+
}
|
191
|
+
} else {
|
192
|
+
console.warn("Invalid direction: " + dir);
|
193
|
+
}
|
194
|
+
}
|
195
|
+
|
196
|
+
|
197
|
+
function checkPoint(boxPointX) {
|
198
|
+
p.turnData.points.min = Math.min(p.turnData.points.min, boxPointX);
|
199
|
+
p.turnData.points.max = Math.max(p.turnData.points.max, boxPointX);
|
200
|
+
p.turnData.points.tap = p.turnData.points.max - p.turnData.points.min < 10;
|
201
|
+
}
|
202
|
+
|
203
|
+
|
204
|
+
function onGoingForward(x) {
|
205
|
+
if (p.nextPageReady === false) {
|
206
|
+
prepareNextPage(function () { lifted(x); }, resetTurnData);
|
207
|
+
} else {
|
208
|
+
lifted(x);
|
209
|
+
}
|
210
|
+
}
|
211
|
+
|
212
|
+
|
213
|
+
function onGoingBackward(x) {
|
214
|
+
var lp = lowerPage(), up = upperPage();
|
215
|
+
var onFail = function () { slideOut(afterCancellingBackward); }
|
216
|
+
|
217
|
+
if (Monocle.Browser.env.offscreenRenderingClipped) {
|
218
|
+
// set lower to "the page before upper"
|
219
|
+
setPage(
|
220
|
+
lp,
|
221
|
+
getPlace(up).getLocus({ direction: k.BACKWARDS }),
|
222
|
+
function () {
|
223
|
+
// flip lower to upper, ready to slide in from left
|
224
|
+
flipPages();
|
225
|
+
// move lower off the screen to the left
|
226
|
+
jumpOut(lp, function () { lifted(x); });
|
227
|
+
},
|
228
|
+
onFail
|
229
|
+
);
|
230
|
+
} else {
|
231
|
+
jumpOut(lp, function () {
|
232
|
+
flipPages();
|
233
|
+
setPage(
|
234
|
+
lp,
|
235
|
+
getPlace(up).getLocus({ direction: k.BACKWARDS }),
|
236
|
+
function () { lifted(x); },
|
237
|
+
onFail
|
238
|
+
);
|
239
|
+
});
|
240
|
+
}
|
241
|
+
}
|
242
|
+
|
243
|
+
|
244
|
+
function afterGoingForward() {
|
245
|
+
var up = upperPage(), lp = lowerPage();
|
246
|
+
flipPages();
|
247
|
+
jumpIn(up, function () { prepareNextPage(announceTurn); });
|
248
|
+
}
|
249
|
+
|
250
|
+
|
251
|
+
function afterGoingBackward() {
|
252
|
+
announceTurn();
|
253
|
+
}
|
254
|
+
|
255
|
+
|
256
|
+
function afterCancellingForward() {
|
257
|
+
announceCancel();
|
258
|
+
}
|
259
|
+
|
260
|
+
|
261
|
+
function afterCancellingBackward() {
|
262
|
+
flipPages(); // flip upper to lower
|
263
|
+
jumpIn(lowerPage(), function () { prepareNextPage(announceCancel); });
|
264
|
+
}
|
265
|
+
|
266
|
+
|
267
|
+
// Prepares the lower page to show the next page after the current page,
|
268
|
+
// and calls onLoad when done.
|
269
|
+
//
|
270
|
+
// Note that if the next page is a new component, and it fails to load,
|
271
|
+
// onFail will be called. If onFail is not supplied, onLoad will be called.
|
272
|
+
//
|
273
|
+
function prepareNextPage(onLoad, onFail) {
|
274
|
+
setPage(
|
275
|
+
lowerPage(),
|
276
|
+
getPlace().getLocus({ direction: k.FORWARDS }),
|
277
|
+
onLoad,
|
278
|
+
function () {
|
279
|
+
onFail ? onFail() : onLoad();
|
280
|
+
p.nextPageReady = false;
|
281
|
+
}
|
282
|
+
);
|
283
|
+
}
|
284
|
+
|
285
|
+
|
286
|
+
function lifted(x) {
|
287
|
+
p.turnData.lifting = false;
|
288
|
+
p.reader.dispatchEvent('monocle:turning');
|
289
|
+
var releaseArgs = p.turnData.releaseArgs;
|
290
|
+
if (releaseArgs) {
|
291
|
+
p.turnData.releaseArgs = null;
|
292
|
+
release(releaseArgs[0], releaseArgs[1]);
|
293
|
+
} else if (x) {
|
294
|
+
slideToCursor(x);
|
295
|
+
}
|
296
|
+
}
|
297
|
+
|
298
|
+
|
299
|
+
function announceTurn() {
|
300
|
+
p.nextPageReady = true;
|
301
|
+
p.reader.dispatchEvent('monocle:turn');
|
302
|
+
resetTurnData();
|
303
|
+
}
|
304
|
+
|
305
|
+
|
306
|
+
function announceCancel() {
|
307
|
+
p.reader.dispatchEvent('monocle:turn:cancel');
|
308
|
+
resetTurnData();
|
309
|
+
}
|
310
|
+
|
311
|
+
|
312
|
+
function resetTurnData() {
|
313
|
+
hideWaitControl();
|
314
|
+
p.turnData = {};
|
315
|
+
}
|
316
|
+
|
317
|
+
|
318
|
+
function setX(elem, x, options, callback) {
|
319
|
+
var duration, transition;
|
320
|
+
|
321
|
+
if (!options.duration) {
|
322
|
+
duration = 0;
|
323
|
+
} else {
|
324
|
+
duration = parseInt(options.duration, 10);
|
325
|
+
}
|
326
|
+
|
327
|
+
if (Monocle.Browser.env.supportsTransition) {
|
328
|
+
Monocle.Styles.transitionFor(
|
329
|
+
elem,
|
330
|
+
'transform',
|
331
|
+
duration,
|
332
|
+
options.timing,
|
333
|
+
options.delay
|
334
|
+
);
|
335
|
+
|
336
|
+
if (Monocle.Browser.env.supportsTransform3d) {
|
337
|
+
Monocle.Styles.affix(elem, 'transform', 'translate3d('+x+'px,0,0)');
|
338
|
+
} else {
|
339
|
+
Monocle.Styles.affix(elem, 'transform', 'translateX('+x+'px)');
|
340
|
+
}
|
341
|
+
|
342
|
+
if (typeof callback == "function") {
|
343
|
+
if (duration && Monocle.Styles.getX(elem) != x) {
|
344
|
+
Monocle.Events.afterTransition(elem, callback);
|
345
|
+
} else {
|
346
|
+
Monocle.defer(callback);
|
347
|
+
}
|
348
|
+
}
|
349
|
+
} else {
|
350
|
+
// Old-school JS animation.
|
351
|
+
elem.currX = elem.currX || 0;
|
352
|
+
var completeTransition = function () {
|
353
|
+
elem.currX = x;
|
354
|
+
Monocle.Styles.setX(elem, x);
|
355
|
+
if (typeof callback == "function") { callback(); }
|
356
|
+
}
|
357
|
+
if (!duration) {
|
358
|
+
completeTransition();
|
359
|
+
} else {
|
360
|
+
var stamp = (new Date()).getTime();
|
361
|
+
var frameRate = 40;
|
362
|
+
var step = (x - elem.currX) * (frameRate / duration);
|
363
|
+
var stepFn = function () {
|
364
|
+
var destX = elem.currX + step;
|
365
|
+
var timeElapsed = ((new Date()).getTime() - stamp) >= duration;
|
366
|
+
var pastDest = (destX > x && elem.currX < x) ||
|
367
|
+
(destX < x && elem.currX > x);
|
368
|
+
if (timeElapsed || pastDest) {
|
369
|
+
completeTransition();
|
370
|
+
} else {
|
371
|
+
Monocle.Styles.setX(elem, destX);
|
372
|
+
elem.currX = destX;
|
373
|
+
setTimeout(stepFn, frameRate);
|
374
|
+
}
|
375
|
+
}
|
376
|
+
stepFn();
|
377
|
+
}
|
378
|
+
}
|
379
|
+
}
|
380
|
+
|
381
|
+
|
382
|
+
function jumpIn(pageDiv, callback) {
|
383
|
+
var opts = { duration: (Monocle.Browser.env.stickySlideOut ? 1 : 0) }
|
384
|
+
setX(pageDiv, 0, opts, callback);
|
385
|
+
}
|
386
|
+
|
387
|
+
|
388
|
+
function jumpOut(pageDiv, callback) {
|
389
|
+
setX(pageDiv, 0 - pageDiv.offsetWidth, { duration: 0 }, callback);
|
390
|
+
}
|
391
|
+
|
392
|
+
|
393
|
+
// NB: Slides are always done by the visible upper page.
|
394
|
+
|
395
|
+
function slideIn(callback) {
|
396
|
+
setX(upperPage(), 0, slideOpts(), callback);
|
397
|
+
}
|
398
|
+
|
399
|
+
|
400
|
+
function slideOut(callback) {
|
401
|
+
setX(upperPage(), 0 - upperPage().offsetWidth, slideOpts(), callback);
|
402
|
+
}
|
403
|
+
|
404
|
+
|
405
|
+
function slideToCursor(cursorX, callback, duration) {
|
406
|
+
setX(
|
407
|
+
upperPage(),
|
408
|
+
Math.min(0, cursorX - upperPage().offsetWidth),
|
409
|
+
{ duration: duration || k.FOLLOW_DURATION },
|
410
|
+
callback
|
411
|
+
);
|
412
|
+
}
|
413
|
+
|
414
|
+
|
415
|
+
function slideOpts() {
|
416
|
+
var opts = { timing: 'ease-in', duration: 320 }
|
417
|
+
var now = (new Date()).getTime();
|
418
|
+
if (p.lastSlide && now - p.lastSlide < 1500) { opts.duration *= 0.5; }
|
419
|
+
p.lastSlide = now;
|
420
|
+
return opts;
|
421
|
+
}
|
422
|
+
|
423
|
+
|
424
|
+
function ensureWaitControl() {
|
425
|
+
if (p.waitControl) { return; }
|
426
|
+
p.waitControl = {
|
427
|
+
createControlElements: function (holder) {
|
428
|
+
return holder.dom.make('div', 'flippers_slider_wait');
|
429
|
+
}
|
430
|
+
}
|
431
|
+
p.reader.addControl(p.waitControl, 'page');
|
432
|
+
}
|
433
|
+
|
434
|
+
|
435
|
+
function showWaitControl() {
|
436
|
+
ensureWaitControl();
|
437
|
+
p.reader.dom.find('flippers_slider_wait', 0).style.opacity = 1;
|
438
|
+
p.reader.dom.find('flippers_slider_wait', 1).style.opacity = 1;
|
439
|
+
}
|
440
|
+
|
441
|
+
|
442
|
+
function hideWaitControl() {
|
443
|
+
ensureWaitControl();
|
444
|
+
p.reader.dom.find('flippers_slider_wait', 0).style.opacity = 0;
|
445
|
+
p.reader.dom.find('flippers_slider_wait', 1).style.opacity = 0;
|
446
|
+
}
|
447
|
+
|
448
|
+
|
449
|
+
// THIS IS THE CORE API THAT ALL FLIPPERS MUST PROVIDE.
|
450
|
+
API.pageCount = p.pageCount;
|
451
|
+
API.addPage = addPage;
|
452
|
+
API.getPlace = getPlace;
|
453
|
+
API.moveTo = moveTo;
|
454
|
+
API.listenForInteraction = listenForInteraction;
|
455
|
+
|
456
|
+
// OPTIONAL API - WILL BE INVOKED (WHERE RELEVANT) IF PROVIDED.
|
457
|
+
API.visiblePages = visiblePages;
|
458
|
+
|
459
|
+
initialize();
|
460
|
+
|
461
|
+
return API;
|
462
|
+
}
|
463
|
+
|
464
|
+
|
465
|
+
// Constants
|
466
|
+
Monocle.Flippers.Slider.DEFAULT_PANELS_CLASS = Monocle.Panels.TwoPane;
|
467
|
+
Monocle.Flippers.Slider.FORWARDS = 1;
|
468
|
+
Monocle.Flippers.Slider.BACKWARDS = -1;
|
469
|
+
Monocle.Flippers.Slider.FOLLOW_DURATION = 100;
|