image_viewer_rails 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (48) hide show
  1. data/MIT-LICENSE +20 -0
  2. data/README.rdoc +5 -0
  3. data/Rakefile +40 -0
  4. data/app/assets/javascripts/image_viewer_rails/application.js +16 -0
  5. data/app/assets/javascripts/image_viewer_rails/image_viewer.js +392 -0
  6. data/app/assets/javascripts/image_viewer_rails/jquery.rotate.js +313 -0
  7. data/app/assets/javascripts/image_viewer_rails/keymaster.js +236 -0
  8. data/app/assets/javascripts/image_viewer_rails/keymaster_filter.js +23 -0
  9. data/app/controllers/image_viewer_rails/application_controller.rb +4 -0
  10. data/app/helpers/image_viewer_rails/application_helper.rb +4 -0
  11. data/app/views/layouts/image_viewer_rails/application.html.erb +14 -0
  12. data/config/routes.rb +2 -0
  13. data/lib/image_viewer_rails.rb +4 -0
  14. data/lib/image_viewer_rails/engine.rb +5 -0
  15. data/lib/image_viewer_rails/version.rb +3 -0
  16. data/lib/tasks/image_viewer_rails_tasks.rake +4 -0
  17. data/test/dummy/README.rdoc +261 -0
  18. data/test/dummy/Rakefile +7 -0
  19. data/test/dummy/app/assets/javascripts/application.js +15 -0
  20. data/test/dummy/app/assets/stylesheets/application.css +13 -0
  21. data/test/dummy/app/controllers/application_controller.rb +3 -0
  22. data/test/dummy/app/helpers/application_helper.rb +2 -0
  23. data/test/dummy/app/views/layouts/application.html.erb +14 -0
  24. data/test/dummy/config.ru +4 -0
  25. data/test/dummy/config/application.rb +59 -0
  26. data/test/dummy/config/boot.rb +10 -0
  27. data/test/dummy/config/database.yml +25 -0
  28. data/test/dummy/config/environment.rb +5 -0
  29. data/test/dummy/config/environments/development.rb +37 -0
  30. data/test/dummy/config/environments/production.rb +67 -0
  31. data/test/dummy/config/environments/test.rb +37 -0
  32. data/test/dummy/config/initializers/backtrace_silencers.rb +7 -0
  33. data/test/dummy/config/initializers/inflections.rb +15 -0
  34. data/test/dummy/config/initializers/mime_types.rb +5 -0
  35. data/test/dummy/config/initializers/secret_token.rb +7 -0
  36. data/test/dummy/config/initializers/session_store.rb +8 -0
  37. data/test/dummy/config/initializers/wrap_parameters.rb +14 -0
  38. data/test/dummy/config/locales/en.yml +5 -0
  39. data/test/dummy/config/routes.rb +4 -0
  40. data/test/dummy/public/404.html +26 -0
  41. data/test/dummy/public/422.html +26 -0
  42. data/test/dummy/public/500.html +25 -0
  43. data/test/dummy/public/favicon.ico +0 -0
  44. data/test/dummy/script/rails +6 -0
  45. data/test/image_viewer_rails_test.rb +7 -0
  46. data/test/integration/navigation_test.rb +10 -0
  47. data/test/test_helper.rb +15 -0
  48. metadata +157 -0
data/MIT-LICENSE ADDED
@@ -0,0 +1,20 @@
1
+ Copyright 2013 Jonathan Jackson
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.rdoc ADDED
@@ -0,0 +1,5 @@
1
+ = ImageViewerRails
2
+
3
+ This project rocks and uses MIT-LICENSE.
4
+
5
+ A rails engine to serve imageviewer js files easily and ubiquitiously
data/Rakefile ADDED
@@ -0,0 +1,40 @@
1
+ #!/usr/bin/env rake
2
+ begin
3
+ require 'bundler/setup'
4
+ rescue LoadError
5
+ puts 'You must `gem install bundler` and `bundle install` to run rake tasks'
6
+ end
7
+ begin
8
+ require 'rdoc/task'
9
+ rescue LoadError
10
+ require 'rdoc/rdoc'
11
+ require 'rake/rdoctask'
12
+ RDoc::Task = Rake::RDocTask
13
+ end
14
+
15
+ RDoc::Task.new(:rdoc) do |rdoc|
16
+ rdoc.rdoc_dir = 'rdoc'
17
+ rdoc.title = 'ImageViewerRails'
18
+ rdoc.options << '--line-numbers'
19
+ rdoc.rdoc_files.include('README.rdoc')
20
+ rdoc.rdoc_files.include('lib/**/*.rb')
21
+ end
22
+
23
+ APP_RAKEFILE = File.expand_path("../test/dummy/Rakefile", __FILE__)
24
+ load 'rails/tasks/engine.rake'
25
+
26
+
27
+
28
+ Bundler::GemHelper.install_tasks
29
+
30
+ require 'rake/testtask'
31
+
32
+ Rake::TestTask.new(:test) do |t|
33
+ t.libs << 'lib'
34
+ t.libs << 'test'
35
+ t.pattern = 'test/**/*_test.rb'
36
+ t.verbose = false
37
+ end
38
+
39
+
40
+ task :default => :test
@@ -0,0 +1,16 @@
1
+ // This is a manifest file that'll be compiled into application.js, which will include all the files
2
+ // listed below.
3
+ //
4
+ // Any JavaScript/Coffee file within this directory, lib/assets/javascripts, vendor/assets/javascripts,
5
+ // or vendor/assets/javascripts of plugins, if any, can be referenced here using a relative path.
6
+ //
7
+ // It's not advisable to add code directly here, but if you do, it'll appear at the bottom of the
8
+ // the compiled file.
9
+ //
10
+ // WARNING: THE FIRST BLANK LINE MARKS THE END OF WHAT'S TO BE PROCESSED, ANY BLANK LINE SHOULD
11
+ // GO AFTER THE REQUIRES BELOW.
12
+ //
13
+ //
14
+ //= require jquery
15
+ //= require jquery_ujs
16
+ //= require_tree .
@@ -0,0 +1,392 @@
1
+ (function($) {
2
+ $.fn.imageViewer = function(method) {
3
+ var settings = {
4
+ 'height': '550',
5
+ 'nav_links':true,
6
+ 'zoomLevel': 75,
7
+ 'increment' : 50,
8
+ 'images' : null,
9
+ 'mainDivId' : this,
10
+ 'mainDiv' : null,
11
+ 'imageOverlay': null,
12
+ 'imageViewerImg': null,
13
+ 'imageIndex': null,
14
+ 'currentImageDiv': null,
15
+ 'keyBindings' : {},
16
+ 'suppressed_keys' : [],
17
+ 'calculate_height_with_header' : true,
18
+ 'calculate_height_with_footer' : false
19
+ };
20
+ var self = $.fn.imageViewer;
21
+
22
+ $.fn.imageViewer.scrollPage = function(increment){
23
+ if(settings["imageIndex"] === 0 && increment === -1) {
24
+ settings["imageIndex"] = (settings["images"].length - 1);
25
+ } else if(settings["imageIndex"] == (settings["images"].length - 1) && increment == 1){
26
+ settings["imageIndex"] = 0;
27
+ } else {
28
+ settings["imageIndex"] += increment;
29
+ }
30
+ showPage(settings["imageIndex"]);
31
+ };
32
+
33
+ $.fn.imageViewer.settings = function(str) {
34
+ if (settings[str] !== undefined) {
35
+ return settings[str];
36
+ }
37
+ };
38
+
39
+ $.fn.imageViewer.teardownKeyBindings = function() { teardownKeyBindings(); };
40
+
41
+ $.fn.imageViewer.setupKeyBindings = function() { setupKeyBindings(); };
42
+
43
+ $.fn.imageViewer.displayLegend = function() {
44
+ var id = $('#dialog');
45
+ var maskHeight = $(document).height();
46
+ var maskWidth = $(window).width();
47
+
48
+ $('#mask').css({'width':maskWidth,'height':maskHeight});
49
+ $('#mask').fadeIn(600);
50
+ $('#mask').fadeTo("slow",0.8);
51
+
52
+ var winH = $(window).height();
53
+ var winW = $(window).width();
54
+
55
+ $(id).css('top', winH/2-$(id).height()/2);
56
+ $(id).css('left', winW/2-$(id).width()/2);
57
+
58
+ $(id).fadeIn(2000);
59
+ };
60
+
61
+ $.fn.imageViewer.scroll = function(left, top){
62
+ settings["currentImageDiv"].scrollTop(settings["currentImageDiv"].scrollTop() + top);
63
+ settings["currentImageDiv"].scrollLeft(settings["currentImageDiv"].scrollLeft() + left);
64
+ };
65
+
66
+ $.fn.imageViewer.zoom = function(increment){
67
+ if(increment < 0 && settings["zoomLevel"] <= settings["increment"]) increment = 0;
68
+ zoomAbsolute(settings["zoomLevel"] + increment);
69
+ };
70
+
71
+ $.fn.imageViewer.rotate_all = function(increment){
72
+ $.each(settings["images"], function(index, image) {
73
+ showPage(index);
74
+ rotate(increment, index);
75
+ });
76
+ showPage(0);
77
+ };
78
+
79
+ $.fn.imageViewer.rotate = function(increment){
80
+ rotate(increment);
81
+ };
82
+
83
+ $.fn.imageViewer.print = function() {
84
+ var myWindow = window.open("", '_newtab');
85
+ var image_tags = "";
86
+
87
+ $.each(settings["images"], function(index, image) {
88
+ image_tags += '<img style="clear:both;width:100%;page-break-after:always;max-width:none;" src="' + image + '" />';
89
+ });
90
+
91
+ var print_script = '<script type=\'text/javascript\'>' +
92
+ 'function PrintWindow() {CheckWindowState(); }' +
93
+ 'function CheckWindowState(){' +
94
+ 'if(document.readyState=="complete")' +
95
+ '{ window.print();window.close();}' +
96
+ 'else{setTimeout("CheckWindowState()", 2000)}}' +
97
+ 'PrintWindow();' +
98
+ '</script>';
99
+
100
+ myWindow.document.write(image_tags + print_script);
101
+ myWindow.document.close();
102
+ };
103
+
104
+
105
+ function init(image_path_array, options){
106
+ main_div_id = (settings["mainDivId"]).attr("id");
107
+ if ( options )
108
+ $.extend( settings, options );
109
+
110
+ this.data("settings", settings);
111
+
112
+ if (main_div_id !== undefined)
113
+ settings["mainDivId"] = main_div_id;
114
+
115
+ setupContainers();
116
+ setupHeight();
117
+ setupKeyBindings();
118
+ if (settings['nav_links'] === true) {createNavTable();}
119
+ setupImages(image_path_array);
120
+ setupLegend();
121
+ setupMaskListener();
122
+ handleWindowResize();
123
+ }
124
+
125
+ function setupLegend() {
126
+ var modal_container = "<div id='key-bindings'></div>";
127
+ var mask_div = "<div id='mask'></div>";
128
+
129
+ var key_binding_div = "<div class='window' id='dialog'>" +
130
+ "<a href='#' style='float:right;' class='close'>(X) Close</a>" +
131
+ "<table>" +
132
+ " <thead>" +
133
+ " <tr>" +
134
+ " <th>Keystroke</th>" +
135
+ " <th>Description</th>" +
136
+ " </tr>" +
137
+ " </thead>" +
138
+ " <tbody>" +
139
+ " <tr><td>'\\'</td><td>Toggle Command Mode</td></tr>" +
140
+ " <tr><td>'i'</td><td>Zoom In</td></tr>" +
141
+ " <tr><td>'k', 'o'</td><td>Zoom Out</td></tr>" +
142
+ " <tr><td>'l', 'n'</td><td>Next</td></tr>" +
143
+ " <tr><td>'j', 'p'</td><td>Previous</td></tr>" +
144
+ " <tr><td>'e', 'up arrow'</td><td>Scroll Up</td></tr>" +
145
+ " <tr><td>'d', 'down arrow'</td><td>Scroll Down</td></tr>" +
146
+ " <tr><td>'s', 'left arrow'</td><td>Scroll Left</td></tr>" +
147
+ " <tr><td>'f', 'right arrow'</td><td>Scroll Right</td></tr>" +
148
+ " <tr><td>'r'</td><td>Rotate Clockwise</td></tr>" +
149
+ " <tr><td>'t'</td><td>Rotate All Clockwise</td></tr>" +
150
+ " <tr><td>';', 'page down'</td><td>Page Down</td></tr>" +
151
+ " <tr><td>'a', 'page up'</td><td>Page Up</td></tr>" +
152
+ " </tbody>" +
153
+ "</table>" +
154
+ "</div>";
155
+
156
+ $('body').prepend(modal_container);
157
+ $('#key-bindings').append(key_binding_div);
158
+ $('#key-bindings').append(mask_div);
159
+ }
160
+ function setupMaskListener(){
161
+ $('.window .close').click(function (e) {
162
+ //Cancel the link behavior
163
+ e.preventDefault();
164
+ $('#mask, .window').hide();
165
+ });
166
+ $('#mask').click(function () {
167
+ $(this).hide();
168
+ $('.window').hide();
169
+ });
170
+ }
171
+ function reload(){
172
+ image_array = settings["images"];
173
+ settings["zoomLevel"] = 75;
174
+ settings["images"] = null;
175
+ settings["mainDiv"] = null;
176
+ settings["imageOverlay"] = null;
177
+ settings["imageViewerImg"] = null;
178
+ settings["imageIndex"] = null;
179
+ settings["currentImageDiv"] = null;
180
+
181
+ init(image_array);
182
+ }
183
+
184
+ function createNavTable() {
185
+ table = '<table id="navlinks-for-' + settings['mainDivId'] + '" class="table" style="margin:0px;">' +
186
+ '<tr>' +
187
+ '<td>' + createNavLink('scrollPage(-1)', 'previous') + '</td>' +
188
+ '<td>' + createNavLink('scrollPage(1)', 'next') + '</td>' +
189
+ '<td>' + createNavLink('scroll(-1 * ' + settings["increment"] + ",0)", 'left') + '</td>' +
190
+ '<td>' + createNavLink('scroll(' + settings["increment"] + ",0)", 'right') + '</td>' +
191
+ '<td>' + createNavLink('scroll(0, -1 * ' + settings["increment"] + ")", 'up') + '</td>' +
192
+ '<td>' + createNavLink('scroll(0,' + settings["increment"] + ")", 'down') + '</td>' +
193
+ '<td>' + createNavLink('zoom(' + settings["increment"] + ")", 'zoom in') + '</td>' +
194
+ '<td>' + createNavLink('zoom(-1 * ' + settings["increment"] + ")", 'zoom out') + '</td>' +
195
+ '<td>' + createNavLink('rotate(90)', 'rotate') + '</td>' +
196
+ '<td>' + createNavLink('rotate_all(90)', 'rotate all') + '</td>' +
197
+ '<td>' + createNavLink('print()', 'print') + '</td>' +
198
+ '<td>' + createNavLink('displayLegend()', 'legend') + '</td>' +
199
+ '</tr>' +
200
+ '</table>';
201
+
202
+ settings["mainDiv"].prepend(table);
203
+ }
204
+ function createNavLink( call, name ) {
205
+ var div_id = '#' + settings["mainDivId"];
206
+
207
+ return '<a href="#" onclick="' +
208
+ '$(\'' + div_id + '\')' +
209
+ '.imageViewer.' + call + ';return false;">' +
210
+ name +
211
+ '</a>';
212
+ }
213
+
214
+ function setupContainers(){
215
+ settings["mainDiv"] = $('#' + settings["mainDivId"]);
216
+ settings["mainDiv"].empty();
217
+ settings["mainDiv"].addClass('image-viewer-container');
218
+ settings["mainDiv"].css("width", settings["width"]);
219
+ settings["mainDiv"].append('<div id="' + settings["mainDivId"] + '-image-overlay" class="image-overlay"></div>');
220
+ settings["imageOverlay"] = $('#' + settings["mainDivId"] + '-image-overlay');
221
+ }
222
+
223
+ function setupImages(images){
224
+ settings["images"] = images;
225
+ var style = "";
226
+
227
+ $.each(images, function(index, image){
228
+ if(index !== 0)
229
+ style += "display: none;";
230
+
231
+ settings["mainDiv"].append('<div id="' + settings["mainDivId"] + '-image-viewer-' + index + '" ' +
232
+ 'class="image-viewer" ' +
233
+ 'style="' + style + '">' +
234
+ '<img id="' + settings["mainDivId"] + '-full-image-' + index + '" ' +
235
+ 'src="' + image + '" ' +
236
+ 'alt="Full Image" ' +
237
+ 'style="width:100%;max-width:none;" ' +
238
+ 'angle="0"/>' +
239
+ '</div>');
240
+
241
+ });
242
+
243
+ settings["currentImageDiv"] = $('#' + settings["mainDivId"] + '-image-viewer-0');
244
+ settings["imageViewerImg"] = $('#' + settings["mainDivId"] + '-full-image-0');
245
+ settings["imageIndex"] = 0;
246
+ updateOverlay();
247
+ }
248
+
249
+ function delayedRedirect(){
250
+ window.location = "/";
251
+ }
252
+
253
+ function teardownKeyBindings(){
254
+ key.deleteScope('imageviewer');
255
+ }
256
+
257
+ function addKeyToKeyMaster(keyString, keyScope, func){
258
+ var keys = typeof(keyString) === 'string' ? [keyString] : keyString
259
+ $.each(keys, function(index, k) {
260
+ if ($.inArray(k, settings['suppressed_keys']) === -1) {
261
+ key(k, keyScope, func);
262
+ }
263
+ });
264
+ }
265
+
266
+ function setupKeyBindings(){
267
+ teardownKeyBindings();
268
+
269
+ key.setScope('imageviewer');
270
+
271
+ keymasterCommandModeCallback = updateOverlay;
272
+
273
+ // prevent alt+f4 from closing browser
274
+ addKeyToKeyMaster('alt+f4', 'imageviewer', function(){ alert('NO WAY JOSE! (Don\'t hit Alt+F4!!!)'); return false; });
275
+ // zoom out
276
+ addKeyToKeyMaster(['k','shift+k','o','shift+o'], 'imageviewer', function(){ self.zoom(-1 * settings["increment"]); return false;});
277
+ // zoom in
278
+ addKeyToKeyMaster(['i','shift+i'], 'imageviewer', function(){ self.zoom(settings["increment"]); return false;});
279
+ // scroll up
280
+ addKeyToKeyMaster(['e','shift+e','up'], 'imageviewer', function(){ self.scroll(0,-1 * settings["increment"]); return false;});
281
+ // scroll down
282
+ addKeyToKeyMaster(['d','shift+d','down'], 'imageviewer', function(){ self.scroll(0,settings["increment"]); return false;});
283
+ // page up
284
+ addKeyToKeyMaster(['a','shift+a','pageup'], 'imageviewer', function(){ self.scroll(0,-1 * (settings["increment"] * 5)); return false;});
285
+ // page down
286
+ addKeyToKeyMaster([';','pagedown'], 'imageviewer', function(){ self.scroll(0,(settings["increment"] * 5)); return false;});
287
+ // scroll right
288
+ addKeyToKeyMaster(['f','shift+f','right'], 'imageviewer', function(){ self.scroll(settings["increment"],0); return false;});
289
+ // scroll left
290
+ addKeyToKeyMaster(['s','shift+s','left'], 'imageviewer', function(){ self.scroll((-1 * settings["increment"]),0); return false; });
291
+ // previous page
292
+ addKeyToKeyMaster(['j','shift+j','p','shift+p'], 'imageviewer', function(){ self.scrollPage(-1); return false; });
293
+ // next page
294
+ addKeyToKeyMaster(['l','shift+l','n','shift+n'], 'imageviewer', function(){ self.scrollPage(1); return false; });
295
+ // rotate
296
+ addKeyToKeyMaster(['r','shift+r'], 'imageviewer', function(){ self.rotate(90); return false; });
297
+ // rotate all
298
+ addKeyToKeyMaster(['t','shift+t'], 'imageviewer', function(){ self.rotate_all(90); return false; });
299
+ }
300
+
301
+ function setupHeight(){
302
+ var window_height = $(window).height();
303
+ var footer = $('#footer');
304
+ var navlinks = $('#navlinks-for-' + settings['mainDivId']);
305
+
306
+ var footer_height, menu_offset;
307
+
308
+ if (settings['calculate_height_with_header']) {
309
+ menu_offset = settings["mainDiv"].offset().top;
310
+ } else {
311
+ menu_offset = 0;
312
+ }
313
+
314
+ if(footer && settings['calculate_height_with_footer']){
315
+ footer_height = footer.height() + 7;
316
+ } else {
317
+ footer_height = 0;
318
+ }
319
+
320
+ var new_height = window_height - menu_offset - footer_height - 20;
321
+
322
+ settings["mainDiv"].css('height', new_height + 'px');
323
+ settings["mainDiv"].css('top', '0px');
324
+
325
+ $('.image-viewer').css('height', (settings["mainDiv"].height() - navlinks.height()) + 'px');
326
+ }
327
+
328
+ function handleWindowResize(){
329
+ $(window).bind('resize', setupHeight);
330
+ }
331
+
332
+ function zoomAbsolute(zoomLevel){
333
+ previous_zoomLevel = settings["zoomLevel"];
334
+ settings["zoomLevel"] = zoomLevel;
335
+
336
+ object_to_zoom = $('#' + settings["mainDivId"] + '-full-image-' + settings["imageIndex"]);
337
+
338
+ object_to_zoom.css('width', settings["zoomLevel"] + '%');
339
+ self.scroll(0,0);
340
+ }
341
+
342
+ function showPage(page){
343
+ settings["imageIndex"] = page;
344
+
345
+ settings["currentImageDiv"].hide();
346
+ settings["currentImageDiv"] = $('#' + settings["mainDivId"] + '-image-viewer-' + page);
347
+ settings["imageViewerImg"] = $('#' + settings["mainDivId"] + '-full-image-' + page);
348
+ settings["currentImageDiv"].show();
349
+ updateOverlay();
350
+ }
351
+
352
+ function updateOverlay(commandMode){
353
+ var s = (settings["imageIndex"] + 1) + ' / ' + settings["images"].length;
354
+
355
+ if(commandMode === undefined)
356
+ commandMode = settings["imageOverlay"].html().search(/CM/) !== -1;
357
+
358
+ if(commandMode === true)
359
+ s += ' CM';
360
+
361
+ settings["imageOverlay"].html(s);
362
+ }
363
+
364
+ function rotate(increment, imageIndex){
365
+ if (imageIndex === undefined) imageIndex = settings["imageIndex"];
366
+ var image = $('#' + settings["mainDivId"] + '-full-image-' + imageIndex);
367
+ var current_angle = parseInt(image.attr('angle'),10);
368
+
369
+ zoomAbsolute(100);
370
+
371
+ image.rotate(current_angle + increment);
372
+ current_angle = parseInt(image.getRotateAngle(),10) % 360;
373
+
374
+ if (current_angle === 90 || current_angle === 270) {
375
+ var offset = image.height()/2 - image.width()/2;
376
+ image.css('margin-top', -1 * offset);
377
+ image.css('margin-left', offset);
378
+ } else {
379
+ image.css('margin-top', 0);
380
+ image.css('margin-left', 0);
381
+ }
382
+
383
+ image.attr('angle',current_angle);
384
+ }
385
+
386
+ if ( typeof method === 'object' || ! method )
387
+ return init.apply( this, arguments);
388
+ else
389
+ $.error( 'Method ' + method + ' does not exist on jQuery.imageViewer' );
390
+
391
+ };
392
+ })(jQuery);