bookreader 1.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.
Files changed (142) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +8 -0
  3. data/.gitmodules +3 -0
  4. data/.travis.yml +7 -0
  5. data/CODE_OF_CONDUCT.md +74 -0
  6. data/Gemfile +6 -0
  7. data/LICENSE.txt +21 -0
  8. data/README.md +43 -0
  9. data/Rakefile +10 -0
  10. data/bin/console +14 -0
  11. data/bin/setup +8 -0
  12. data/bookreader.gemspec +42 -0
  13. data/lib/bookreader/engine.rb +6 -0
  14. data/lib/bookreader/version.rb +3 -0
  15. data/lib/bookreader.rb +8 -0
  16. data/vendor/assets/images/BRicons.png +0 -0
  17. data/vendor/assets/images/BRicons.svg +94 -0
  18. data/vendor/assets/images/BRicons_ia.png +0 -0
  19. data/vendor/assets/images/back_pages.png +0 -0
  20. data/vendor/assets/images/book_bottom_icon.png +0 -0
  21. data/vendor/assets/images/book_down_icon.png +0 -0
  22. data/vendor/assets/images/book_left_icon.png +0 -0
  23. data/vendor/assets/images/book_leftmost_icon.png +0 -0
  24. data/vendor/assets/images/book_right_icon.png +0 -0
  25. data/vendor/assets/images/book_rightmost_icon.png +0 -0
  26. data/vendor/assets/images/book_top_icon.png +0 -0
  27. data/vendor/assets/images/book_up_icon.png +0 -0
  28. data/vendor/assets/images/books_graphic.svg +177 -0
  29. data/vendor/assets/images/booksplit.png +0 -0
  30. data/vendor/assets/images/control_pause_icon.png +0 -0
  31. data/vendor/assets/images/control_play_icon.png +0 -0
  32. data/vendor/assets/images/embed_icon.png +0 -0
  33. data/vendor/assets/images/icon-home-ia.png +0 -0
  34. data/vendor/assets/images/icon_OL-logo-xs.png +0 -0
  35. data/vendor/assets/images/icon_alert-xs.png +0 -0
  36. data/vendor/assets/images/icon_book.svg +12 -0
  37. data/vendor/assets/images/icon_bookmark.svg +12 -0
  38. data/vendor/assets/images/icon_close-pop.png +0 -0
  39. data/vendor/assets/images/icon_download.png +0 -0
  40. data/vendor/assets/images/icon_gear.svg +17 -0
  41. data/vendor/assets/images/icon_hamburger.svg +20 -0
  42. data/vendor/assets/images/icon_home.png +0 -0
  43. data/vendor/assets/images/icon_home.svg +21 -0
  44. data/vendor/assets/images/icon_home_ia.png +0 -0
  45. data/vendor/assets/images/icon_indicator.png +0 -0
  46. data/vendor/assets/images/icon_info.svg +12 -0
  47. data/vendor/assets/images/icon_one_page.svg +16 -0
  48. data/vendor/assets/images/icon_return.png +0 -0
  49. data/vendor/assets/images/icon_search_button.svg +14 -0
  50. data/vendor/assets/images/icon_search_button_blue.svg +18 -0
  51. data/vendor/assets/images/icon_share.svg +17 -0
  52. data/vendor/assets/images/icon_speaker.svg +18 -0
  53. data/vendor/assets/images/icon_speaker_open.svg +26 -0
  54. data/vendor/assets/images/icon_thumbnails.svg +19 -0
  55. data/vendor/assets/images/icon_two_pages.svg +17 -0
  56. data/vendor/assets/images/icon_zoomer.png +0 -0
  57. data/vendor/assets/images/left_edges.png +0 -0
  58. data/vendor/assets/images/loading.gif +0 -0
  59. data/vendor/assets/images/logo_icon.png +0 -0
  60. data/vendor/assets/images/marker_chap-off.png +0 -0
  61. data/vendor/assets/images/marker_chap-off.svg +11 -0
  62. data/vendor/assets/images/marker_chap-off_ia.png +0 -0
  63. data/vendor/assets/images/marker_chap-on.png +0 -0
  64. data/vendor/assets/images/marker_chap-on.svg +11 -0
  65. data/vendor/assets/images/marker_srch-off.png +0 -0
  66. data/vendor/assets/images/marker_srch-off.svg +11 -0
  67. data/vendor/assets/images/marker_srch-on.png +0 -0
  68. data/vendor/assets/images/marker_srch-on.svg +11 -0
  69. data/vendor/assets/images/marker_srchchap-off.png +0 -0
  70. data/vendor/assets/images/marker_srchchap-on.png +0 -0
  71. data/vendor/assets/images/nav_control-dn.png +0 -0
  72. data/vendor/assets/images/nav_control-dn_ia.png +0 -0
  73. data/vendor/assets/images/nav_control-up.png +0 -0
  74. data/vendor/assets/images/nav_control-up_ia.png +0 -0
  75. data/vendor/assets/images/nav_control.png +0 -0
  76. data/vendor/assets/images/one_page_mode_icon.png +0 -0
  77. data/vendor/assets/images/paper-badge.png +0 -0
  78. data/vendor/assets/images/print_icon.png +0 -0
  79. data/vendor/assets/images/progressbar.gif +0 -0
  80. data/vendor/assets/images/right_edges.png +0 -0
  81. data/vendor/assets/images/slider.png +0 -0
  82. data/vendor/assets/images/slider_ia.png +0 -0
  83. data/vendor/assets/images/thumbnail_mode_icon.png +0 -0
  84. data/vendor/assets/images/transparent.png +0 -0
  85. data/vendor/assets/images/two_page_mode_icon.png +0 -0
  86. data/vendor/assets/images/zoom_in_icon.png +0 -0
  87. data/vendor/assets/images/zoom_out_icon.png +0 -0
  88. data/vendor/assets/javascripts/BookReader.js +4849 -0
  89. data/vendor/assets/javascripts/BookReaderJSAdvanced.js +115 -0
  90. data/vendor/assets/javascripts/BookReaderJSSimple.js +56 -0
  91. data/vendor/assets/javascripts/IIIFBookReader.js +207 -0
  92. data/vendor/assets/javascripts/demo-iiif.js +26 -0
  93. data/vendor/assets/javascripts/dragscrollable-br.js +261 -0
  94. data/vendor/assets/javascripts/excanvas.compiled.js +35 -0
  95. data/vendor/assets/javascripts/jquery-1.10.1.js +9807 -0
  96. data/vendor/assets/javascripts/jquery-ui-1.12.0.min.js +18686 -0
  97. data/vendor/assets/javascripts/jquery.browser.min.js +14 -0
  98. data/vendor/assets/javascripts/jquery.bt.min.js +8 -0
  99. data/vendor/assets/javascripts/jquery.colorbox-min.js +6 -0
  100. data/vendor/assets/javascripts/jquery.ui.touch-punch.min.js +11 -0
  101. data/vendor/assets/javascripts/mmenu/dist/addons/navbars/jquery.mmenu.navbars.min.js +43 -0
  102. data/vendor/assets/javascripts/mmenu/dist/addons/offcanvas/jquery.mmenu.offcanvas.min.js +7 -0
  103. data/vendor/assets/javascripts/mmenu/dist/addons/screenreader/jquery.mmenu.screenreader.min.js +7 -0
  104. data/vendor/assets/javascripts/mmenu/dist/addons/searchfield/jquery.mmenu.searchfield.min.js +7 -0
  105. data/vendor/assets/javascripts/mmenu/dist/js/jquery.mmenu.all.min.js +151 -0
  106. data/vendor/assets/javascripts/mmenu/dist/js/jquery.mmenu.all.min.umd.js +162 -0
  107. data/vendor/assets/javascripts/mmenu/dist/js/jquery.mmenu.min.js +25 -0
  108. data/vendor/assets/javascripts/mmenu/dist/js/jquery.mmenu.min.umd.js +36 -0
  109. data/vendor/assets/javascripts/mmenu/dist/js/jquery.mmenu.oncanvas.min.js +13 -0
  110. data/vendor/assets/javascripts/mmenu/jquery.mmenu.searchfield.js +510 -0
  111. data/vendor/assets/javascripts/plugins/plugin.archive_analytics.js +67 -0
  112. data/vendor/assets/javascripts/plugins/plugin.chapters.js +197 -0
  113. data/vendor/assets/javascripts/plugins/plugin.iframe.js +73 -0
  114. data/vendor/assets/javascripts/plugins/plugin.mobile_nav.js +197 -0
  115. data/vendor/assets/javascripts/plugins/plugin.print.js +70 -0
  116. data/vendor/assets/javascripts/plugins/plugin.resume.js +73 -0
  117. data/vendor/assets/javascripts/plugins/plugin.search.js +523 -0
  118. data/vendor/assets/javascripts/plugins/plugin.themes.js +49 -0
  119. data/vendor/assets/javascripts/plugins/plugin.tts.js +523 -0
  120. data/vendor/assets/javascripts/plugins/plugin.url.js +168 -0
  121. data/vendor/assets/javascripts/soundmanager/license.txt +29 -0
  122. data/vendor/assets/javascripts/soundmanager/script/soundmanager2-jsmin.js +113 -0
  123. data/vendor/assets/javascripts/soundmanager/script/soundmanager2-nodebug-jsmin.js +83 -0
  124. data/vendor/assets/javascripts/soundmanager/script/soundmanager2-nodebug.js +2765 -0
  125. data/vendor/assets/javascripts/soundmanager/script/soundmanager2.js +6325 -0
  126. data/vendor/assets/javascripts/soundmanager/swf/soundmanager2.swf +0 -0
  127. data/vendor/assets/javascripts/soundmanager/swf/soundmanager2_debug.swf +0 -0
  128. data/vendor/assets/javascripts/soundmanager/swf/soundmanager2_flash9.swf +0 -0
  129. data/vendor/assets/javascripts/soundmanager/swf/soundmanager2_flash9_debug.swf +0 -0
  130. data/vendor/assets/javascripts/soundmanager/swf/soundmanager2_flash_xdomain.zip +0 -0
  131. data/vendor/assets/stylesheets/BookReader.css +1887 -0
  132. data/vendor/assets/stylesheets/BookReaderDemo.css +18 -0
  133. data/vendor/assets/stylesheets/BookReaderEmbed.css +0 -0
  134. data/vendor/assets/stylesheets/demo.css +0 -0
  135. data/vendor/assets/stylesheets/dist/addons/navbars/jquery.mmenu.navbars.css +29 -0
  136. data/vendor/assets/stylesheets/dist/addons/offcanvas/jquery.mmenu.offcanvas.css +14 -0
  137. data/vendor/assets/stylesheets/dist/addons/screenreader/jquery.mmenu.screenreader.css +1 -0
  138. data/vendor/assets/stylesheets/dist/addons/searchfield/jquery.mmenu.searchfield.css +16 -0
  139. data/vendor/assets/stylesheets/dist/css/jquery.mmenu.all.css +413 -0
  140. data/vendor/assets/stylesheets/dist/css/jquery.mmenu.css +80 -0
  141. data/vendor/assets/stylesheets/dist/css/jquery.mmenu.oncanvas.css +66 -0
  142. metadata +226 -0
@@ -0,0 +1,510 @@
1
+ /*
2
+ * jQuery mmenu BookReader Search addon
3
+ * mmenu.frebsite.nl
4
+ *
5
+ * Adapted from searchfield by Fred Heusschen
6
+ */
7
+
8
+ (function( $ ) {
9
+
10
+ var _PLUGIN_ = 'mmenu',
11
+ _ADDON_ = 'searchfield';
12
+
13
+
14
+ $[ _PLUGIN_ ].addons[ _ADDON_ ] = {
15
+
16
+ // setup: fired once per menu
17
+ setup: function()
18
+ {
19
+ var that = this,
20
+ opts = this.opts[ _ADDON_ ],
21
+ conf = this.conf[ _ADDON_ ];
22
+
23
+ glbl = $[ _PLUGIN_ ].glbl;
24
+
25
+
26
+ // Extend shortcut options
27
+ if ( typeof opts == 'boolean' )
28
+ {
29
+ opts = {
30
+ add: opts
31
+ };
32
+ }
33
+ if ( typeof opts != 'object' )
34
+ {
35
+ opts = {};
36
+ }
37
+ if ( typeof opts.resultsPanel == 'boolean' )
38
+ {
39
+ opts.resultsPanel = {
40
+ add: opts.resultsPanel
41
+ };
42
+ }
43
+ opts = this.opts[ _ADDON_ ] = $.extend( true, {}, $[ _PLUGIN_ ].defaults[ _ADDON_ ], opts );
44
+
45
+ // Extend shortcut configuration
46
+ conf = this.conf[ _ADDON_ ] = $.extend( true, {}, $[ _PLUGIN_ ].configuration[ _ADDON_ ], conf );
47
+
48
+
49
+ // Blur searchfield
50
+ this.bind( 'close',
51
+ function()
52
+ {
53
+ this.$menu
54
+ .find( '.' + _c.search )
55
+ .find( 'input' )
56
+ .blur();
57
+ }
58
+ );
59
+
60
+
61
+ // Bind functions to update
62
+ this.bind( 'init',
63
+ function( $panels )
64
+ {
65
+ // console.log(opts);
66
+ // opts.addTo = ".search-parent";
67
+ // Add the searchfield(s)
68
+ if ( opts.add )
69
+ {
70
+ var $wrapper;
71
+ switch( opts.addTo )
72
+ {
73
+ case 'panels':
74
+ $wrapper = $panels;
75
+ break;
76
+
77
+ default:
78
+ $wrapper = this.$menu.find( opts.addTo );
79
+ break;
80
+ }
81
+ // alert(1);
82
+ // console.log($wrapper);
83
+
84
+ $wrapper
85
+ .each(
86
+ function()
87
+ {
88
+ // Add the searchfield
89
+ var $panl = $(this);
90
+ if ( $panl.is( '.' + _c.panel ) && $panl.is( '.' + _c.vertical ) )
91
+ {
92
+ return;
93
+ }
94
+
95
+ if ( !$panl.children( '.' + _c.search ).length )
96
+ {
97
+ var clear = that.__valueOrFn( conf.clear , $panl ),
98
+ form = that.__valueOrFn( conf.form , $panl ),
99
+ input = that.__valueOrFn( conf.input , $panl ),
100
+ submit = that.__valueOrFn( conf.submit, $panl );
101
+
102
+ var $srch = $( '<' + ( form ? 'form' : 'div' ) + ' class="' + _c.search + '" />' ),
103
+ $inpt = $( '<input placeholder="' + opts.placeholder + '" type="text" autocomplete="off"/>' );
104
+
105
+ $srch.append( $inpt );
106
+
107
+ var k;
108
+
109
+ if ( input )
110
+ {
111
+ for ( k in input )
112
+ {
113
+ $inpt.attr( k, input[ k ] );
114
+ }
115
+ }
116
+ if ( clear )
117
+ {
118
+ $('<a class="' + _c.btn + ' ' + _c.clear + '" href="#" />')
119
+ .appendTo( $srch )
120
+ .on( _e.click + '-searchfield',
121
+ function( e )
122
+ {
123
+ e.preventDefault();
124
+ $inpt
125
+ .val( '' )
126
+ .trigger( _e.keyup + '-searchfield' );
127
+ }
128
+ );
129
+ }
130
+ if ( form )
131
+ {
132
+ for ( k in form )
133
+ {
134
+ $srch.attr( k, form[ k ] );
135
+ }
136
+ if ( submit && !clear )
137
+ {
138
+ $('<a class="' + _c.btn + ' ' + _c.next + '" href="#" />')
139
+ .appendTo( $srch )
140
+ .on( _e.click + '-searchfield',
141
+ function( e )
142
+ {
143
+ e.preventDefault();
144
+ $srch.submit();
145
+ }
146
+ );
147
+ }
148
+ }
149
+
150
+ if ( $panl.hasClass( _c.search ) )
151
+ {
152
+ $panl.replaceWith( $srch );
153
+ }
154
+ else
155
+ {
156
+ $panl.append( $srch )
157
+ .addClass( _c.hassearch );
158
+ }
159
+ }
160
+
161
+ if ( opts.noResults )
162
+ {
163
+ var inPanel = $panl.closest( '.' + _c.panel ).length;
164
+
165
+ // Not in a panel
166
+ if ( !inPanel )
167
+ {
168
+ $panl = that.$pnls.children( '.' + _c.panel ).first();
169
+ }
170
+
171
+ // Add no-results message
172
+ if ( !$panl.children( '.' + _c.noresultsmsg ).length )
173
+ {
174
+ var $lst = $panl.children( '.' + _c.listview ).first();
175
+
176
+ $( '<div class="' + _c.noresultsmsg + ' ' + _c.hidden + '" />' )
177
+ .append( opts.noResults )
178
+ [ $lst.length ? 'insertAfter' : 'prependTo' ]( $lst.length ? $lst : $panl );
179
+ }
180
+ }
181
+ }
182
+ );
183
+
184
+
185
+ // Search through list items
186
+ if ( opts.search )
187
+ {
188
+
189
+ if ( opts.resultsPanel.add )
190
+ {
191
+ opts.showSubPanels = false;
192
+
193
+ var $rpnl = this.$pnls.children( '.' + _c.resultspanel );
194
+ if ( !$rpnl.length )
195
+ {
196
+ $rpnl = $( '<div class="' + _c.panel + ' ' + _c.resultspanel + ' ' + _c.hidden + '" />' )
197
+ .appendTo( this.$pnls )
198
+ .append( '<div class="' + _c.navbar + ' ' + _c.hidden + '"><a class="' + _c.title + '">' + opts.resultsPanel.title + '</a></div>' )
199
+ .append( '<ul class="' + _c.listview + '" />' )
200
+ .append( this.$pnls.find( '.' + _c.noresultsmsg ).first().clone() );
201
+
202
+ this.init( $rpnl );
203
+ }
204
+ }
205
+
206
+ this.$menu
207
+ .find( '.' + _c.search )
208
+ .each(
209
+ function()
210
+ {
211
+ var $srch = $(this),
212
+ inPanel = $srch.closest( '.' + _c.panel ).length;
213
+
214
+ var $pnls, $panl;
215
+
216
+ // In a panel
217
+ if ( inPanel )
218
+ {
219
+ $pnls = $srch.closest( '.' + _c.panel );
220
+ $panl = $pnls;
221
+ }
222
+
223
+ // Not in a panel
224
+ else
225
+ {
226
+ $pnls = $('.' + _c.panel, that.$menu);
227
+ $panl = that.$menu;
228
+ }
229
+
230
+ if ( opts.resultsPanel.add )
231
+ {
232
+ $pnls = $pnls.not( $rpnl );
233
+ }
234
+
235
+ var $inpt = $srch.children( 'input' ),
236
+ $itms = that.__findAddBack( $pnls, '.' + _c.listview ).children( 'li' ),
237
+ $dvdr = $itms.filter( '.' + _c.divider ),
238
+ $rslt = that.__filterListItems( $itms );
239
+
240
+ var _anchor = 'a',
241
+ _both = _anchor + ', span';
242
+
243
+
244
+ var query = '';
245
+ var search = function()
246
+ {
247
+
248
+ var q = $inpt.val().toLowerCase();
249
+ if ( q == query )
250
+ {
251
+ return;
252
+ }
253
+ query = q;
254
+
255
+
256
+ if ( opts.resultsPanel.add )
257
+ {
258
+ $rpnl
259
+ .children( '.' + _c.listview )
260
+ .empty();
261
+ }
262
+
263
+ // Scroll to top
264
+ $pnls.scrollTop( 0 );
265
+
266
+ // Search through items
267
+ $rslt
268
+ .add( $dvdr )
269
+ .addClass( _c.hidden )
270
+ .find( '.' + _c.fullsubopensearch )
271
+ .removeClass( _c.fullsubopen + ' ' + _c.fullsubopensearch );
272
+
273
+ $rslt
274
+ .each(
275
+ function()
276
+ {
277
+ var $item = $(this),
278
+ _search = _anchor;
279
+
280
+ if ( opts.showTextItems || ( opts.showSubPanels && $item.find( '.' + _c.next ) ) )
281
+ {
282
+ _search = _both;
283
+ }
284
+
285
+ var txt = $item.data( _d.searchtext ) || $item.children( _search ).text();
286
+ if ( txt.toLowerCase().indexOf( query ) > -1 )
287
+ {
288
+ $item.add( $item.prevAll( '.' + _c.divider ).first() ).removeClass( _c.hidden );
289
+ }
290
+ }
291
+ );
292
+
293
+ // Update sub items
294
+ if ( opts.showSubPanels )
295
+ {
296
+ $pnls.each(
297
+ function( i )
298
+ {
299
+ var $panl = $(this);
300
+ that.__filterListItems( $panl.find( '.' + _c.listview ).children() )
301
+ .each(
302
+ function()
303
+ {
304
+ var $li = $(this),
305
+ $su = $li.data( _d.sub );
306
+
307
+ $li.removeClass( _c.nosubresults );
308
+ if ( $su )
309
+ {
310
+ $su.find( '.' + _c.listview ).children().removeClass( _c.hidden );
311
+ }
312
+ }
313
+ );
314
+ }
315
+ );
316
+ }
317
+
318
+ // All results in one panel
319
+ if ( opts.resultsPanel.add )
320
+ {
321
+ if ( query === '' )
322
+ {
323
+ this.closeAllPanels();
324
+ this.openPanel( this.$pnls.children( '.' + _c.subopened ).last() );
325
+ }
326
+ else
327
+ {
328
+ var $itms = $();
329
+ $pnls
330
+ .each(
331
+ function()
332
+ {
333
+ var $i = that.__filterListItems( $(this).find( '.' + _c.listview ).children() ).not( '.' + _c.hidden ).clone( true );
334
+ if ( $i.length )
335
+ {
336
+ if ( opts.resultsPanel.dividers )
337
+ {
338
+ $itms = $itms.add( '<li class="' + _c.divider + '">' + $(this).children( '.' + _c.navbar ).text() + '</li>' );
339
+ }
340
+ $itms = $itms.add( $i );
341
+ }
342
+ }
343
+ );
344
+
345
+ $itms
346
+ .find( '.' + _c.next )
347
+ .remove();
348
+
349
+ $rpnl
350
+ .children( '.' + _c.listview )
351
+ .append( $itms );
352
+
353
+ this.openPanel( $rpnl );
354
+ }
355
+ }
356
+
357
+ // Update parent for submenus
358
+ else
359
+ {
360
+
361
+ $( $pnls.get().reverse() )
362
+ .each(
363
+ function( i )
364
+ {
365
+ var $panl = $(this),
366
+ $prnt = $panl.data( _d.parent );
367
+
368
+ if ( $prnt )
369
+ {
370
+ if ( that.__filterListItems( $panl.find( '.' + _c.listview ).children() ).length )
371
+ {
372
+ if ( $prnt.hasClass( _c.hidden ) )
373
+ {
374
+ $prnt.children( '.' + _c.next )
375
+ .not( '.' + _c.fullsubopen )
376
+ .addClass( _c.fullsubopen )
377
+ .addClass( _c.fullsubopensearch );
378
+ }
379
+ $prnt
380
+ .removeClass( _c.hidden )
381
+ .removeClass( _c.nosubresults )
382
+ .prevAll( '.' + _c.divider )
383
+ .first()
384
+ .removeClass( _c.hidden );
385
+ }
386
+ else if ( !inPanel )
387
+ {
388
+ if ( $panl.hasClass( _c.opened ) )
389
+ {
390
+ // Compensate the timeout for the opening animation
391
+ setTimeout(
392
+ function()
393
+ {
394
+ that.openPanel( $prnt.closest( '.' + _c.panel ) );
395
+ }, ( i + 1 ) * ( that.conf.openingInterval * 1.5 )
396
+ );
397
+ }
398
+ $prnt.addClass( _c.nosubresults );
399
+ }
400
+ }
401
+ }
402
+ );
403
+ }
404
+
405
+ // Show/hide no results message
406
+ $panl.find( '.' + _c.noresultsmsg )[ $rslt.not( '.' + _c.hidden ).length ? 'addClass' : 'removeClass' ]( _c.hidden );
407
+
408
+ // Update for other addons
409
+ this.update();
410
+ };
411
+
412
+ $inpt
413
+ .off( _e.keyup + '-' + _ADDON_ + ' ' + _e.change + '-' + _ADDON_ )
414
+ .on( _e.keyup + '-' + _ADDON_,
415
+ function( e )
416
+ {
417
+ if ( !preventKeypressSearch( e.keyCode ) )
418
+ {
419
+ search.call( that );
420
+ }
421
+ }
422
+ )
423
+ .on( _e.change + '-' + _ADDON_,
424
+ function( e )
425
+ {
426
+ search.call( that );
427
+ }
428
+ );
429
+
430
+ var $btn = $srch.children( '.' + _c.btn );
431
+ if ( $btn.length )
432
+ {
433
+ $inpt
434
+ .on( _e.keyup + '-' + _ADDON_,
435
+ function( e )
436
+ {
437
+ $btn[ $inpt.val().length ? 'removeClass' : 'addClass' ]( _c.hidden );
438
+ }
439
+ );
440
+ }
441
+ $inpt.trigger( _e.keyup + '-' + _ADDON_ );
442
+ }
443
+ );
444
+ }
445
+ }
446
+ }
447
+ );
448
+ },
449
+
450
+ // add: fired once per page load
451
+ add: function()
452
+ {
453
+ _c = $[ _PLUGIN_ ]._c;
454
+ _d = $[ _PLUGIN_ ]._d;
455
+ _e = $[ _PLUGIN_ ]._e;
456
+
457
+ _c.add( 'clear search hassearch resultspanel noresultsmsg noresults nosubresults fullsubopensearch' );
458
+ _d.add( 'searchtext' );
459
+ _e.add( 'change keyup' );
460
+ },
461
+
462
+ // clickAnchor: prevents default behavior when clicking an anchor
463
+ clickAnchor: function( $a, inMenu ) {}
464
+ };
465
+
466
+
467
+ // Default options and configuration
468
+ $[ _PLUGIN_ ].defaults[ _ADDON_ ] = {
469
+ add : false,
470
+ addTo : 'panels',
471
+ placeholder : 'Search',
472
+ noResults : 'No results found.',
473
+ resultsPanel : {
474
+ add : false,
475
+ dividers : true,
476
+ title : 'Search results'
477
+ },
478
+ search : true,
479
+ showTextItems : false,
480
+ showSubPanels : true
481
+ };
482
+ $[ _PLUGIN_ ].configuration[ _ADDON_ ] = {
483
+ clear : false,
484
+ form : false,
485
+ input : false,
486
+ submit : false
487
+ };
488
+
489
+
490
+ var _c, _d, _e, glbl;
491
+
492
+
493
+ function preventKeypressSearch( c )
494
+ {
495
+ switch( c )
496
+ {
497
+ case 9: // tab
498
+ case 16: // shift
499
+ case 17: // control
500
+ case 18: // alt
501
+ case 37: // left
502
+ case 38: // top
503
+ case 39: // right
504
+ case 40: // bottom
505
+ return true;
506
+ }
507
+ return false;
508
+ }
509
+
510
+ })( jQuery );
@@ -0,0 +1,67 @@
1
+ /**
2
+ * Plugin for Archive.org analytics
3
+ */
4
+ jQuery.extend(BookReader.defaultOptions, {
5
+ enableArchiveAnalytics: true
6
+ });
7
+
8
+ BookReader.prototype.init = (function(super_) {
9
+ return function() {
10
+ super_.call(this);
11
+
12
+ if (this.options.enableArchiveAnalytics) {
13
+ this.bind(
14
+ BookReader.eventNames.fragmentChange,
15
+ function() {
16
+ this.archiveAnalyticsSend();
17
+ }.bind(this)
18
+ );
19
+ }
20
+ };
21
+ })(BookReader.prototype.init);
22
+
23
+ BookReader.prototype.archiveAnalyticsSend = function() {
24
+ if (!window.archive_analytics) {
25
+ return;
26
+ }
27
+
28
+ var prevFragment = this.archiveAnalyticsSend.prevHash;
29
+
30
+ var params = this.paramsFromCurrent();
31
+ var newFragment = this.fragmentFromParams(params);
32
+
33
+ if (prevFragment != newFragment) {
34
+ var values = {
35
+ bookreader: "user_changed_view",
36
+ itemid: this.bookId,
37
+ cache_bust: Math.random()
38
+ };
39
+ // EEK! offsite embedding and /details/ page books look the same in analytics, otherwise!
40
+ values.offsite = 1;
41
+ values.details = 0;
42
+ try {
43
+ values.offsite = window.top.location.hostname.match(/\.archive.org$/)
44
+ ? 0
45
+ : 1;
46
+ values.details =
47
+ !values.offsite && window.top.location.pathname.match(/^\/details\//)
48
+ ? 1
49
+ : 0;
50
+ } catch (e) {}
51
+ // avoids embed cross site exceptions -- but on (+) side, means it is and keeps marked offite!
52
+
53
+ // Send bookreader ping
54
+ archive_analytics.send_ping(values, null, "augment_for_ao_site");
55
+
56
+ // Also send tracking event ping
57
+ archive_analytics.send_ping({
58
+ kind: "event",
59
+ ec: "BookReader",
60
+ ea: "UserChangedView",
61
+ el: window.location.pathname,
62
+ cache_bust: Math.random()
63
+ });
64
+
65
+ this.archiveAnalyticsSend.prevFragment = newFragment;
66
+ }
67
+ };