beef-admin_area 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (124) hide show
  1. data/.document +5 -0
  2. data/.gitignore +5 -0
  3. data/LICENSE +20 -0
  4. data/README.rdoc +7 -0
  5. data/Rakefile +59 -0
  6. data/VERSION +1 -0
  7. data/admin_area.gemspec +168 -0
  8. data/app/controllers/admin/base_controller.rb +8 -0
  9. data/app/controllers/admin/settings_controller.rb +43 -0
  10. data/app/controllers/admin/users_controller.rb +74 -0
  11. data/app/helpers/admin/base_helper.rb +59 -0
  12. data/app/helpers/admin/settings_helper.rb +8 -0
  13. data/app/helpers/admin/users_helper.rb +2 -0
  14. data/app/models/settings.rb +92 -0
  15. data/app/views/admin/base/index.html.erb +2 -0
  16. data/app/views/admin/settings/_form.html.erb +31 -0
  17. data/app/views/admin/settings/update.js.rjs +1 -0
  18. data/app/views/admin/users/index.html.erb +39 -0
  19. data/app/views/admin/users/show.html.erb +37 -0
  20. data/app/views/layouts/admin.html.erb +68 -0
  21. data/config/routes.rb +8 -0
  22. data/generators/admin_area_files/USAGE +8 -0
  23. data/generators/admin_area_files/admin_area_files_generator.rb +114 -0
  24. data/generators/admin_area_files/lib/insert_commands.rb +47 -0
  25. data/generators/admin_area_files/templates/app/models/content_sweeper.rb +43 -0
  26. data/generators/admin_area_files/templates/app/views/admin/settings/show.html.erb +52 -0
  27. data/generators/admin_area_files/templates/config/initializers/admin_area.rb +2 -0
  28. data/generators/admin_area_files/templates/config/initializers/settings.rb +8 -0
  29. data/generators/admin_area_files/templates/lib/tasks/admin_area.rake +10 -0
  30. data/generators/admin_area_files/templates/migration.rb +21 -0
  31. data/generators/admin_area_files/templates/public/images/admin/accept_button.gif +0 -0
  32. data/generators/admin_area_files/templates/public/images/admin/add.png +0 -0
  33. data/generators/admin_area_files/templates/public/images/admin/application_cascade.png +0 -0
  34. data/generators/admin_area_files/templates/public/images/admin/arrow_left.gif +0 -0
  35. data/generators/admin_area_files/templates/public/images/admin/arrow_right.gif +0 -0
  36. data/generators/admin_area_files/templates/public/images/admin/button_bg.gif +0 -0
  37. data/generators/admin_area_files/templates/public/images/admin/cancel_button.gif +0 -0
  38. data/generators/admin_area_files/templates/public/images/admin/cursor_arrow.gif +0 -0
  39. data/generators/admin_area_files/templates/public/images/admin/delete_button.gif +0 -0
  40. data/generators/admin_area_files/templates/public/images/admin/down_icon.gif +0 -0
  41. data/generators/admin_area_files/templates/public/images/admin/edit_button.gif +0 -0
  42. data/generators/admin_area_files/templates/public/images/admin/file-uploads.png +0 -0
  43. data/generators/admin_area_files/templates/public/images/admin/folder.png +0 -0
  44. data/generators/admin_area_files/templates/public/images/admin/folder_image.png +0 -0
  45. data/generators/admin_area_files/templates/public/images/admin/head_bg.gif +0 -0
  46. data/generators/admin_area_files/templates/public/images/admin/image_add.png +0 -0
  47. data/generators/admin_area_files/templates/public/images/admin/images-pointer.png +0 -0
  48. data/generators/admin_area_files/templates/public/images/admin/info_bg.gif +0 -0
  49. data/generators/admin_area_files/templates/public/images/admin/nav_bg.gif +0 -0
  50. data/generators/admin_area_files/templates/public/images/admin/over_button_bg.gif +0 -0
  51. data/generators/admin_area_files/templates/public/images/admin/page_bg.gif +0 -0
  52. data/generators/admin_area_files/templates/public/images/admin/page_white.png +0 -0
  53. data/generators/admin_area_files/templates/public/images/admin/page_white_get.png +0 -0
  54. data/generators/admin_area_files/templates/public/images/admin/page_white_link.png +0 -0
  55. data/generators/admin_area_files/templates/public/images/admin/page_white_stack.png +0 -0
  56. data/generators/admin_area_files/templates/public/images/admin/picture.png +0 -0
  57. data/generators/admin_area_files/templates/public/images/admin/picture_medium.png +0 -0
  58. data/generators/admin_area_files/templates/public/images/admin/picture_square.png +0 -0
  59. data/generators/admin_area_files/templates/public/images/admin/picture_thumb.png +0 -0
  60. data/generators/admin_area_files/templates/public/images/admin/pictures.png +0 -0
  61. data/generators/admin_area_files/templates/public/images/admin/unapproved.png +0 -0
  62. data/generators/admin_area_files/templates/public/images/admin/up_icon.gif +0 -0
  63. data/generators/admin_area_files/templates/public/images/lightwindow/Thumbs.db +0 -0
  64. data/generators/admin_area_files/templates/public/images/lightwindow/ajax-loading.gif +0 -0
  65. data/generators/admin_area_files/templates/public/images/lightwindow/arrow-down.gif +0 -0
  66. data/generators/admin_area_files/templates/public/images/lightwindow/arrow-up.gif +0 -0
  67. data/generators/admin_area_files/templates/public/images/lightwindow/black-70.png +0 -0
  68. data/generators/admin_area_files/templates/public/images/lightwindow/black.png +0 -0
  69. data/generators/admin_area_files/templates/public/images/lightwindow/nextlabel.gif +0 -0
  70. data/generators/admin_area_files/templates/public/images/lightwindow/pattern_148-70.png +0 -0
  71. data/generators/admin_area_files/templates/public/images/lightwindow/pattern_148.gif +0 -0
  72. data/generators/admin_area_files/templates/public/images/lightwindow/prevlabel.gif +0 -0
  73. data/generators/admin_area_files/templates/public/images/textile-editor/background.png +0 -0
  74. data/generators/admin_area_files/templates/public/images/textile-editor/blockquote.png +0 -0
  75. data/generators/admin_area_files/templates/public/images/textile-editor/bold.png +0 -0
  76. data/generators/admin_area_files/templates/public/images/textile-editor/center.png +0 -0
  77. data/generators/admin_area_files/templates/public/images/textile-editor/h1.png +0 -0
  78. data/generators/admin_area_files/templates/public/images/textile-editor/h2.png +0 -0
  79. data/generators/admin_area_files/templates/public/images/textile-editor/h3.png +0 -0
  80. data/generators/admin_area_files/templates/public/images/textile-editor/h4.png +0 -0
  81. data/generators/admin_area_files/templates/public/images/textile-editor/h5.png +0 -0
  82. data/generators/admin_area_files/templates/public/images/textile-editor/h6.png +0 -0
  83. data/generators/admin_area_files/templates/public/images/textile-editor/indent.png +0 -0
  84. data/generators/admin_area_files/templates/public/images/textile-editor/italic.png +0 -0
  85. data/generators/admin_area_files/templates/public/images/textile-editor/justify.png +0 -0
  86. data/generators/admin_area_files/templates/public/images/textile-editor/left.png +0 -0
  87. data/generators/admin_area_files/templates/public/images/textile-editor/link.png +0 -0
  88. data/generators/admin_area_files/templates/public/images/textile-editor/list_bullets.png +0 -0
  89. data/generators/admin_area_files/templates/public/images/textile-editor/list_numbers.png +0 -0
  90. data/generators/admin_area_files/templates/public/images/textile-editor/omega.png +0 -0
  91. data/generators/admin_area_files/templates/public/images/textile-editor/outdent.png +0 -0
  92. data/generators/admin_area_files/templates/public/images/textile-editor/paragraph.png +0 -0
  93. data/generators/admin_area_files/templates/public/images/textile-editor/preview.png +0 -0
  94. data/generators/admin_area_files/templates/public/images/textile-editor/right.png +0 -0
  95. data/generators/admin_area_files/templates/public/images/textile-editor/strikethrough.png +0 -0
  96. data/generators/admin_area_files/templates/public/images/textile-editor/underline.png +0 -0
  97. data/generators/admin_area_files/templates/public/javascripts/admin/application.js +185 -0
  98. data/generators/admin_area_files/templates/public/javascripts/lightwindow.js +1921 -0
  99. data/generators/admin_area_files/templates/public/javascripts/textile-editor-config.js +107 -0
  100. data/generators/admin_area_files/templates/public/javascripts/textile-editor.js +788 -0
  101. data/generators/admin_area_files/templates/public/stylesheets/admin/handheld.css +6 -0
  102. data/generators/admin_area_files/templates/public/stylesheets/admin/ie.css +21 -0
  103. data/generators/admin_area_files/templates/public/stylesheets/admin/print.css +27 -0
  104. data/generators/admin_area_files/templates/public/stylesheets/admin/screen.css +996 -0
  105. data/generators/admin_area_files/templates/public/stylesheets/admin/theme-1.0.css +131 -0
  106. data/generators/admin_area_files/templates/public/stylesheets/lightwindow.css +376 -0
  107. data/generators/admin_area_files/templates/public/stylesheets/textile-editor.css +60 -0
  108. data/generators/admin_scaffold/USAGE +8 -0
  109. data/generators/admin_scaffold/admin_scaffold_generator.rb +53 -0
  110. data/generators/admin_scaffold/lib/insert_commands.rb +61 -0
  111. data/generators/admin_scaffold/templates/admin_controller.rb +83 -0
  112. data/generators/admin_scaffold/templates/admin_index.html.erb +38 -0
  113. data/generators/admin_scaffold/templates/admin_show.html.erb +16 -0
  114. data/generators/admin_scaffold/templates/helper.rb +2 -0
  115. data/generators/admin_scaffold/templates/helper_test.rb +4 -0
  116. data/generators/admin_scaffold/templates/layout.html.erb +17 -0
  117. data/generators/admin_scaffold/templates/style.css +54 -0
  118. data/generators/admin_scaffold/templates/view_controller.rb +14 -0
  119. data/generators/admin_scaffold/templates/view_index.html.erb +17 -0
  120. data/lib/admin_area.rb +82 -0
  121. data/rails/init.rb +4 -0
  122. data/test/admin_area_test.rb +7 -0
  123. data/test/test_helper.rb +10 -0
  124. metadata +206 -0
@@ -0,0 +1,1921 @@
1
+ // lightwindow.js v2.0
2
+ //
3
+ // Copyright (c) 2007 stickmanlabs
4
+ // Author: Kevin P Miller | http://www.stickmanlabs.com
5
+ //
6
+ // LightWindow is freely distributable under the terms of an MIT-style license.
7
+ //
8
+ // I don't care what you think about the file size...
9
+ // Be a pro:
10
+ // http://www.thinkvitamin.com/features/webapps/serving-javascript-fast
11
+ // http://rakaz.nl/item/make_your_pages_load_faster_by_combining_and_compressing_javascript_and_css_files
12
+ //
13
+
14
+ /*-----------------------------------------------------------------------------------------------*/
15
+
16
+ if(typeof Effect == 'undefined')
17
+ throw("lightwindow.js requires including script.aculo.us' effects.js library!");
18
+
19
+ // This will stop image flickering in IE6 when elements with images are moved
20
+ try {
21
+ document.execCommand("BackgroundImageCache", false, true);
22
+ } catch(e) {}
23
+
24
+ var lightwindow = Class.create();
25
+ lightwindow.prototype = {
26
+ //
27
+ // Setup Variables
28
+ //
29
+ element : null,
30
+ contentToFetch : null,
31
+ windowActive : false,
32
+ dataEffects : [],
33
+ dimensions : {
34
+ cruft : null,
35
+ container : null,
36
+ viewport : {
37
+ height : null,
38
+ width : null,
39
+ offsetTop : null,
40
+ offsetLeft : null
41
+ }
42
+ },
43
+ pagePosition : {
44
+ x : 0,
45
+ y : 0
46
+ },
47
+ pageDimensions : {
48
+ width : null,
49
+ height : null
50
+ },
51
+ preloadImage : [],
52
+ preloadedImage : [],
53
+ galleries : [],
54
+ resizeTo : {
55
+ height : null,
56
+ heightPercent : null,
57
+ width : null,
58
+ widthPercent : null,
59
+ fixedTop : null,
60
+ fixedLeft : null
61
+ },
62
+ scrollbarOffset : 18,
63
+ navigationObservers : {
64
+ previous : null,
65
+ next : null
66
+ },
67
+ containerChange : {
68
+ height : 0,
69
+ width : 0
70
+ },
71
+ activeGallery : false,
72
+ galleryLocation : {
73
+ current : 0,
74
+ total : 0
75
+ },
76
+ //
77
+ // Initialize the lightwindow.
78
+ //
79
+ initialize : function(options) {
80
+ this.options = Object.extend({
81
+ resizeSpeed : 8,
82
+ contentOffset : {
83
+ height : 20,
84
+ width : 20
85
+ },
86
+ dimensions : {
87
+ image : {height : 250, width : 250},
88
+ page : {height : 250, width : 250},
89
+ inline : {height : 250, width : 250},
90
+ media : {height : 250, width : 250},
91
+ external : {height : 250, width : 250},
92
+ titleHeight : 25
93
+ },
94
+ classNames : {
95
+ standard : 'lightwindow',
96
+ action : 'lightwindow_action'
97
+ },
98
+ fileTypes : {
99
+ page : ['asp', 'aspx', 'cgi', 'cfm', 'htm', 'html', 'pl', 'php4', 'php3', 'php', 'php5', 'phtml', 'rhtml', 'shtml', 'txt', 'vbs', 'rb'],
100
+ media : ['aif', 'aiff', 'asf', 'avi', 'divx', 'm1v', 'm2a', 'm2v', 'm3u', 'mid', 'midi', 'mov', 'moov', 'movie', 'mp2', 'mp3', 'mpa', 'mpa', 'mpe', 'mpeg', 'mpg', 'mpg', 'mpga', 'pps', 'qt', 'rm', 'ram', 'swf', 'viv', 'vivo', 'wav'],
101
+ image : ['bmp', 'gif', 'jpg', 'png', 'tiff']
102
+ },
103
+ mimeTypes : {
104
+ avi : 'video/avi',
105
+ aif : 'audio/aiff',
106
+ aiff : 'audio/aiff',
107
+ gif : 'image/gif',
108
+ bmp : 'image/bmp',
109
+ jpeg : 'image/jpeg',
110
+ m1v : 'video/mpeg',
111
+ m2a : 'audio/mpeg',
112
+ m2v : 'video/mpeg',
113
+ m3u : 'audio/x-mpequrl',
114
+ mid : 'audio/x-midi',
115
+ midi : 'audio/x-midi',
116
+ mjpg : 'video/x-motion-jpeg',
117
+ moov : 'video/quicktime',
118
+ mov : 'video/quicktime',
119
+ movie : 'video/x-sgi-movie',
120
+ mp2 : 'audio/mpeg',
121
+ mp3 : 'audio/mpeg3',
122
+ mpa : 'audio/mpeg',
123
+ mpa : 'video/mpeg',
124
+ mpe : 'video/mpeg',
125
+ mpeg : 'video/mpeg',
126
+ mpg : 'audio/mpeg',
127
+ mpg : 'video/mpeg',
128
+ mpga : 'audio/mpeg',
129
+ pdf : 'application/pdf',
130
+ png : 'image/png',
131
+ pps : 'application/mspowerpoint',
132
+ qt : 'video/quicktime',
133
+ ram : 'audio/x-pn-realaudio-plugin',
134
+ rm : 'application/vnd.rn-realmedia',
135
+ swf : 'application/x-shockwave-flash',
136
+ tiff : 'image/tiff',
137
+ viv : 'video/vivo',
138
+ vivo : 'video/vivo',
139
+ wav : 'audio/wav',
140
+ wmv : 'application/x-mplayer2'
141
+ },
142
+ classids : {
143
+ mov : 'clsid:02BF25D5-8C17-4B23-BC80-D3488ABDDC6B',
144
+ swf : 'clsid:D27CDB6E-AE6D-11cf-96B8-444553540000',
145
+ wmv : 'clsid:6BF52A52-394A-11d3-B153-00C04F79FAA6'
146
+ },
147
+ codebases : {
148
+ mov : 'http://www.apple.com/qtactivex/qtplugin.cab#version=6,0,2,0',
149
+ swf : 'http://fpdownload.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=7,0,0,0',
150
+ wmv : 'http://activex.microsoft.com/activex/controls/mplayer/en/nsmp2inf.cab#Version=6,4,5,715'
151
+ },
152
+ viewportPadding : 10,
153
+ EOLASFix : 'swf,wmv,fla,flv',
154
+ overlay : {
155
+ opacity : 0.7,
156
+ image : '/images/lightwindow/black.png',
157
+ presetImage : '/images/lightwindow/black-70.png'
158
+ },
159
+ skin : {
160
+ main : '<div id="lightwindow_container" >'+
161
+ '<div id="lightwindow_title_bar" >'+
162
+ '<div id="lightwindow_title_bar_inner" >'+
163
+ '<span id="lightwindow_title_bar_title"></span>'+
164
+ '<a id="lightwindow_title_bar_close_link" >close</a>'+
165
+ '</div>'+
166
+ '</div>'+
167
+ '<div id="lightwindow_stage" >'+
168
+ '<div id="lightwindow_contents" >'+
169
+ '</div>'+
170
+ '<div id="lightwindow_navigation" >'+
171
+ '<a href="#" id="lightwindow_previous" >'+
172
+ '<span id="lightwindow_previous_title"></span>'+
173
+ '</a>'+
174
+ '<a href="#" id="lightwindow_next" >'+
175
+ '<span id="lightwindow_next_title"></span>'+
176
+ '</a>'+
177
+ '<iframe name="lightwindow_navigation_shim" id="lightwindow_navigation_shim" src="javascript:false;" frameBorder="0" scrolling="no"></iframe>'+
178
+ '</div>'+
179
+ '<div id="lightwindow_galleries">'+
180
+ '<div id="lightwindow_galleries_tab_container" >'+
181
+ '<a href="#" id="lightwindow_galleries_tab" >'+
182
+ '<span id="lightwindow_galleries_tab_span" class="up" >Galleries</span>'+
183
+ '</a>'+
184
+ '</div>'+
185
+ '<div id="lightwindow_galleries_list" >'+
186
+ '</div>'+
187
+ '</div>'+
188
+ '</div>'+
189
+ '<div id="lightwindow_data_slide" >'+
190
+ '<div id="lightwindow_data_slide_inner" >'+
191
+ '<div id="lightwindow_data_details" >'+
192
+ '<div id="lightwindow_data_gallery_container" >'+
193
+ '<span id="lightwindow_data_gallery_current"></span>'+
194
+ ' of '+
195
+ '<span id="lightwindow_data_gallery_total"></span>'+
196
+ '</div>'+
197
+ '<div id="lightwindow_data_author_container" >'+
198
+ 'by <span id="lightwindow_data_author"></span>'+
199
+ '</div>'+
200
+ '</div>'+
201
+ '<div id="lightwindow_data_caption" >'+
202
+ '</div>'+
203
+ '</div>'+
204
+ '</div>'+
205
+ '</div>',
206
+ loading : '<div id="lightwindow_loading" >'+
207
+ '<img src="/images/lightwindow/ajax-loading.gif" alt="loading" />'+
208
+ '<span>Loading or <a href="javascript: myLightWindow.deactivate();">Cancel</a></span>'+
209
+ '<iframe name="lightwindow_loading_shim" id="lightwindow_loading_shim" src="javascript:false;" frameBorder="0" scrolling="no"></iframe>'+
210
+ '</div>',
211
+ iframe : '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">'+
212
+ '<html xmlns="http://www.w3.org/1999/xhtml">'+
213
+ '<body>'+
214
+ '{body_replace}'+
215
+ '</body>'+
216
+ '</html>',
217
+ gallery : {
218
+ top : '<div class="lightwindow_galleries_list">'+
219
+ '<h1>{gallery_title_replace}</h1>'+
220
+ '<ul>',
221
+ middle : '<li>'+
222
+ '{gallery_link_replace}'+
223
+ '</li>',
224
+ bottom : '</ul>'+
225
+ '</div>'
226
+ }
227
+ },
228
+ formMethod : 'get',
229
+ hideFlash : false,
230
+ hideGalleryTab : false,
231
+ showTitleBar : true,
232
+ animationHandler : false,
233
+ navigationHandler : false,
234
+ transitionHandler : false,
235
+ finalAnimationHandler : false,
236
+ formHandler : false,
237
+ galleryAnimationHandler : false,
238
+ showGalleryCount : true
239
+ }, options || {});
240
+ this.duration = ((11-this.options.resizeSpeed)*0.15);
241
+ this._setupLinks();
242
+ this._getScroll();
243
+ this._getPageDimensions();
244
+ this._browserDimensions();
245
+ this._addLightWindowMarkup(false);
246
+ this._setupDimensions();
247
+ this.buildGalleryList();
248
+ },
249
+ //
250
+ // Activate the lightwindow.
251
+ //
252
+ activate : function(e, link){
253
+ // Clear out the window Contents
254
+ this._clearWindowContents(true);
255
+
256
+ // Add back in out loading panel
257
+ this._addLoadingWindowMarkup();
258
+
259
+ // Setup the element properties
260
+ this._setupWindowElements(link);
261
+
262
+ // Setup everything
263
+ this._getScroll();
264
+ this._browserDimensions();
265
+ this._setupDimensions();
266
+ this._toggleTroubleElements('hidden', false);
267
+ this._displayLightWindow('block', 'hidden');
268
+ this._setStatus(true);
269
+ this._monitorKeyboard(true);
270
+ this._prepareIE(true);
271
+ this._loadWindow();
272
+ },
273
+ //
274
+ // Turn off the window
275
+ //
276
+ deactivate : function(){
277
+ // The window is not active
278
+ this.windowActive = false;
279
+
280
+ // There is no longer a gallery active
281
+ this.activeGallery = false;
282
+ if (!this.options.hideGalleryTab) {
283
+ this._handleGalleryAnimation(false);
284
+ }
285
+
286
+ // Kill the animation
287
+ this.animating = false;
288
+
289
+ // Clear our element
290
+ this.element = null;
291
+
292
+ // hide the window.
293
+ this._displayLightWindow('none', 'visible');
294
+
295
+ // Clear out the window Contents
296
+ this._clearWindowContents(false);
297
+
298
+ // Stop all animation
299
+ var queue = Effect.Queues.get('lightwindowAnimation').each(function(e){e.cancel();});
300
+
301
+ // Undo the setup
302
+ this._prepareIE(false);
303
+ this._setupDimensions();
304
+ this._toggleTroubleElements('visible', false);
305
+ this._monitorKeyboard(false);
306
+ },
307
+ //
308
+ // Initialize specific window
309
+ //
310
+ createWindow : function(element, attributes) {
311
+ this._processLink($(element));
312
+ },
313
+ //
314
+ // Open a Window from a hash of attributes
315
+ //
316
+ activateWindow : function(options) {
317
+ this.element = Object.extend({
318
+ href : null,
319
+ title : null,
320
+ author : null,
321
+ caption : null,
322
+ rel : null,
323
+ top : null,
324
+ left : null,
325
+ type : null,
326
+ showImages : null,
327
+ height : null,
328
+ width : null,
329
+ loadingAnimation : null,
330
+ iframeEmbed : null,
331
+ form : null
332
+ }, options || {});
333
+
334
+ // Set the window type
335
+ this.contentToFetch = this.element.href;
336
+ this.windowType = this.element.type ? this.element.type : this._fileType(this.element.href);
337
+
338
+ // Clear out the window Contents
339
+ this._clearWindowContents(true);
340
+
341
+ // Add back in out loading panel
342
+ this._addLoadingWindowMarkup();
343
+
344
+ // Setup everything
345
+ this._getScroll();
346
+ this._browserDimensions();
347
+ this._setupDimensions();
348
+ this._toggleTroubleElements('hidden', false);
349
+ this._displayLightWindow('block', 'hidden');
350
+ this._setStatus(true);
351
+ this._monitorKeyboard(true);
352
+ this._prepareIE(true);
353
+ this._loadWindow();
354
+ },
355
+ //
356
+ // Fire off our Form handler
357
+ //
358
+ submitForm : function(e) {
359
+ if (this.options.formHandler) {
360
+ this.options.formHandler(e);
361
+ } else {
362
+ this._defaultFormHandler(e);
363
+ }
364
+ },
365
+ //
366
+ // Reload the window with another location
367
+ //
368
+ openWindow : function(element) {
369
+ var element = $(element);
370
+
371
+ // The window is active
372
+ this.windowActive = true;
373
+
374
+ // Clear out the window Contents
375
+ this._clearWindowContents(true);
376
+
377
+ // Add back in out loading panel
378
+ this._addLoadingWindowMarkup();
379
+
380
+ // Setup the element properties
381
+ this._setupWindowElements(element);
382
+
383
+ this._setStatus(true);
384
+ this._handleTransition();
385
+ },
386
+ //
387
+ // Navigate the window
388
+ //
389
+ navigateWindow : function(direction) {
390
+ this._handleNavigation(false);
391
+ if (direction == 'previous') {
392
+ this.openWindow(this.navigationObservers.previous);
393
+ } else if (direction == 'next'){
394
+ this.openWindow(this.navigationObservers.next);
395
+ }
396
+ },
397
+ //
398
+ // Build the Gallery List and Load it
399
+ //
400
+ buildGalleryList : function() {
401
+ var output = '';
402
+ var galleryLink;
403
+ for (i in this.galleries) {
404
+ if (typeof this.galleries[i] == 'object') {
405
+ output += (this.options.skin.gallery.top).replace('{gallery_title_replace}', unescape(i));
406
+ for (j in this.galleries[i]) {
407
+ if (typeof this.galleries[i][j] == 'object') {
408
+ galleryLink = '<a href="#" id="lightwindow_gallery_'+i+'_'+j+'" >'+unescape(j)+'</a>';
409
+ output += (this.options.skin.gallery.middle).replace('{gallery_link_replace}', galleryLink);
410
+ }
411
+ }
412
+ output += this.options.skin.gallery.bottom;
413
+ }
414
+ }
415
+ new Insertion.Top('lightwindow_galleries_list', output);
416
+
417
+ // Attach Events
418
+ for (i in this.galleries) {
419
+ if (typeof this.galleries[i] == 'object') {
420
+ for (j in this.galleries[i]) {
421
+ if (typeof this.galleries[i][j] == 'object') {
422
+ Event.observe($('lightwindow_gallery_'+i+'_'+j), 'click', this.openWindow.bind(this, this.galleries[i][j][0]), false);
423
+ $('lightwindow_gallery_'+i+'_'+j).onclick = function() {return false;};
424
+ }
425
+ }
426
+ }
427
+ }
428
+ },
429
+ //
430
+ // Set Links Up
431
+ //
432
+ _setupLinks : function() {
433
+ var links = $$('.'+this.options.classNames.standard);
434
+ links.each(function(link) {
435
+ this._processLink(link);
436
+ }.bind(this));
437
+ },
438
+ //
439
+ // Process a Link
440
+ //
441
+ _processLink : function(link) {
442
+ if ((this._fileType(link.getAttribute('href')) == 'image' || this._fileType(link.getAttribute('href')) == 'media')) {
443
+ if (gallery = this._getGalleryInfo(link.rel)) {
444
+ if (!this.galleries[gallery[0]]) {
445
+ this.galleries[gallery[0]] = new Array();
446
+ }
447
+ if (!this.galleries[gallery[0]][gallery[1]]) {
448
+ this.galleries[gallery[0]][gallery[1]] = new Array();
449
+ }
450
+ this.galleries[gallery[0]][gallery[1]].push(link);
451
+ }
452
+ }
453
+
454
+ // Take care of our inline content
455
+ var url = link.getAttribute('href');
456
+ if (url.indexOf('?') > -1) {
457
+ url = url.substring(0, url.indexOf('?'));
458
+ }
459
+
460
+ var container = url.substring(url.indexOf('#')+1);
461
+ if($(container)) {
462
+ $(container).setStyle({
463
+ display : 'none'
464
+ });
465
+ }
466
+
467
+ Event.observe(link, 'click', this.activate.bindAsEventListener(this, link), false);
468
+ link.onclick = function() {return false;};
469
+ },
470
+ //
471
+ // Setup our actions
472
+ //
473
+ _setupActions : function() {
474
+ var links = $$('#lightwindow_container .'+this.options.classNames.action);
475
+ links.each(function(link) {
476
+ Event.observe(link, 'click', this[link.getAttribute('rel')].bindAsEventListener(this, link), false);
477
+ link.onclick = function() {return false;};
478
+ }.bind(this));
479
+ },
480
+ //
481
+ // Add the markup to the page.
482
+ //
483
+ _addLightWindowMarkup : function(rebuild) {
484
+ var overlay = Element.extend(document.createElement('div'));
485
+ overlay.setAttribute('id', 'lightwindow_overlay');
486
+ // FF Mac has a problem with putting Flash above a layer without a 100% opacity background, so we need to use a pre-made
487
+ if (Prototype.Browser.Gecko) {
488
+ overlay.setStyle({
489
+ backgroundImage: 'url('+this.options.overlay.presetImage+')',
490
+ backgroundRepeat: 'repeat',
491
+ height: this.pageDimensions.height+'px'
492
+ });
493
+ } else {
494
+ overlay.setStyle({
495
+ opacity: this.options.overlay.opacity,
496
+ backgroundImage: 'url('+this.options.overlay.image+')',
497
+ backgroundRepeat: 'repeat',
498
+ height: this.pageDimensions.height+'px'
499
+ });
500
+ }
501
+
502
+ var lw = document.createElement('div');
503
+ lw.setAttribute('id', 'lightwindow');
504
+ lw.innerHTML = this.options.skin.main;
505
+
506
+ var body = document.getElementsByTagName('body')[0];
507
+ body.appendChild(overlay);
508
+ body.appendChild(lw);
509
+
510
+ if ($('lightwindow_title_bar_close_link')) {
511
+ Event.observe('lightwindow_title_bar_close_link', 'click', this.deactivate.bindAsEventListener(this));
512
+ $('lightwindow_title_bar_close_link').onclick = function() {return false;};
513
+ }
514
+
515
+ Event.observe($('lightwindow_previous'), 'click', this.navigateWindow.bind(this, 'previous'), false);
516
+ $('lightwindow_previous').onclick = function() {return false;};
517
+ Event.observe($('lightwindow_next'), 'click', this.navigateWindow.bind(this, 'next'), false);
518
+ $('lightwindow_next').onclick = function() {return false;};
519
+
520
+ if (!this.options.hideGalleryTab) {
521
+ Event.observe($('lightwindow_galleries_tab'), 'click', this._handleGalleryAnimation.bind(this, true), false);
522
+ $('lightwindow_galleries_tab').onclick = function() {return false;};
523
+ }
524
+
525
+ // Because we use position absolute, kill the scroll Wheel on animations
526
+ if (Prototype.Browser.IE) {
527
+ Event.observe(document, 'mousewheel', this._stopScrolling.bindAsEventListener(this), false);
528
+ } else {
529
+ Event.observe(window, 'DOMMouseScroll', this._stopScrolling.bindAsEventListener(this), false);
530
+ }
531
+
532
+ Event.observe(overlay, 'click', this.deactivate.bindAsEventListener(this), false);
533
+ overlay.onclick = function() {return false;};
534
+ },
535
+ //
536
+ // Add loading window markup
537
+ //
538
+ _addLoadingWindowMarkup : function() {
539
+ $('lightwindow_contents').innerHTML += this.options.skin.loading;
540
+ },
541
+ //
542
+ // Setup the window elements
543
+ //
544
+ _setupWindowElements : function(link) {
545
+ this.element = link;
546
+ this.element.title = null ? '' : link.getAttribute('title');
547
+ this.element.author = null ? '' : link.getAttribute('author');
548
+ this.element.caption = null ? '' : link.getAttribute('caption');
549
+ this.element.rel = null ? '' : link.getAttribute('rel');
550
+ this.element.params = null ? '' : link.getAttribute('params');
551
+
552
+ // Set the window type
553
+ this.contentToFetch = this.element.href;
554
+ this.windowType = this._getParameter('lightwindow_type') ? this._getParameter('lightwindow_type') : this._fileType(this.contentToFetch);
555
+ },
556
+ //
557
+ // Clear the window contents out
558
+ //
559
+ _clearWindowContents : function(contents) {
560
+ // If there is an iframe, its got to go
561
+ if ($('lightwindow_iframe')) {
562
+ Element.remove($('lightwindow_iframe'));
563
+ }
564
+
565
+ // Stop playing an object if its still around
566
+ if ($('lightwindow_media_primary')) {
567
+ try {
568
+ $('lightwindow_media_primary').Stop();
569
+ } catch(e) {}
570
+ Element.remove($('lightwindow_media_primary'));
571
+ }
572
+
573
+ // Stop playing an object if its still around
574
+ if ($('lightwindow_media_secondary')) {
575
+ try {
576
+ $('lightwindow_media_secondary').Stop();
577
+ } catch(e) {}
578
+ Element.remove($('lightwindow_media_secondary'));
579
+ }
580
+
581
+ this.activeGallery = false;
582
+ this._handleNavigation(this.activeGallery);
583
+
584
+ if (contents) {
585
+ // Empty the contents
586
+ $('lightwindow_contents').innerHTML = '';
587
+
588
+ // Reset the scroll bars
589
+ $('lightwindow_contents').setStyle({
590
+ overflow: 'hidden'
591
+ });
592
+
593
+ if (!this.windowActive) {
594
+ $('lightwindow_data_slide_inner').setStyle({
595
+ display: 'none'
596
+ });
597
+
598
+ $('lightwindow_title_bar_title').innerHTML = '';
599
+ }
600
+
601
+ // Because of browser differences and to maintain flexible captions we need to reset this height at close
602
+ $('lightwindow_data_slide').setStyle({
603
+ height: 'auto'
604
+ });
605
+ }
606
+
607
+ this.resizeTo.height = null;
608
+ this.resizeTo.width = null;
609
+ },
610
+ //
611
+ // Set the status of our animation to keep things from getting clunky
612
+ //
613
+ _setStatus : function(status) {
614
+ this.animating = status;
615
+ if (status) {
616
+ Element.show('lightwindow_loading');
617
+ }
618
+ if (!(/MSIE 6./i.test(navigator.userAgent))) {
619
+ this._fixedWindow(status);
620
+ }
621
+ },
622
+ //
623
+ // Make this window Fixed
624
+ //
625
+ _fixedWindow : function(status) {
626
+ if (status) {
627
+ if (this.windowActive) {
628
+ this._getScroll();
629
+ $('lightwindow').setStyle({
630
+ position: 'absolute',
631
+ top: parseFloat($('lightwindow').getStyle('top'))+this.pagePosition.y+'px',
632
+ left: parseFloat($('lightwindow').getStyle('left'))+this.pagePosition.x+'px'
633
+ });
634
+ } else {
635
+ $('lightwindow').setStyle({
636
+ position: 'absolute'
637
+ });
638
+ }
639
+ } else {
640
+ if (this.windowActive) {
641
+ this._getScroll();
642
+ $('lightwindow').setStyle({
643
+ position: 'fixed',
644
+ top: parseFloat($('lightwindow').getStyle('top'))-this.pagePosition.y+'px',
645
+ left: parseFloat($('lightwindow').getStyle('left'))-this.pagePosition.x+'px'
646
+ });
647
+ } else {
648
+ if ($('lightwindow_iframe')) {
649
+ // Ideally here we would set a 50% value for top and left, but Safari rears it ugly head again and we need to do it by pixels
650
+ this._browserDimensions();
651
+ }
652
+ $('lightwindow').setStyle({
653
+ position: 'fixed',
654
+ top: (parseFloat(this._getParameter('lightwindow_top')) ? parseFloat(this._getParameter('lightwindow_top'))+'px' : this.dimensions.viewport.height/2+'px'),
655
+ left: (parseFloat(this._getParameter('lightwindow_left')) ? parseFloat(this._getParameter('lightwindow_left'))+'px' : this.dimensions.viewport.width/2+'px')
656
+ });
657
+ }
658
+ }
659
+ },
660
+ //
661
+ // Prepare the window for IE.
662
+ //
663
+ _prepareIE : function(setup) {
664
+ if (Prototype.Browser.IE) {
665
+ var height, overflowX, overflowY;
666
+ if (setup) {
667
+ var height = '100%';
668
+ } else {
669
+ var height = 'auto';
670
+ }
671
+ var body = document.getElementsByTagName('body')[0];
672
+ var html = document.getElementsByTagName('html')[0];
673
+ html.style.height = body.style.height = height;
674
+ }
675
+ },
676
+ _stopScrolling : function(e) {
677
+ if (this.animating) {
678
+ if (e.preventDefault) {
679
+ e.preventDefault();
680
+ }
681
+ e.returnValue = false;
682
+ }
683
+ },
684
+ //
685
+ // Get the scroll for the page.
686
+ //
687
+ _getScroll : function(){
688
+ if(typeof(window.pageYOffset) == 'number') {
689
+ this.pagePosition.x = window.pageXOffset;
690
+ this.pagePosition.y = window.pageYOffset;
691
+ } else if(document.body && (document.body.scrollLeft || document.body.scrollTop)) {
692
+ this.pagePosition.x = document.body.scrollLeft;
693
+ this.pagePosition.y = document.body.scrollTop;
694
+ } else if(document.documentElement) {
695
+ this.pagePosition.x = document.documentElement.scrollLeft;
696
+ this.pagePosition.y = document.documentElement.scrollTop;
697
+ }
698
+ },
699
+ //
700
+ // Reset the scroll.
701
+ //
702
+ _setScroll : function(x, y) {
703
+ document.documentElement.scrollLeft = x;
704
+ document.documentElement.scrollTop = y;
705
+ },
706
+ //
707
+ // Hide Selects from the page because of IE.
708
+ // We could use iframe shims instead here but why add all the extra markup for one browser when this is much easier and cleaner
709
+ //
710
+ _toggleTroubleElements : function(visibility, content){
711
+
712
+ if (content) {
713
+ var selects = $('lightwindow_contents').getElementsByTagName('select');
714
+ } else {
715
+ var selects = document.getElementsByTagName('select');
716
+ }
717
+
718
+ for(var i = 0; i < selects.length; i++) {
719
+ selects[i].style.visibility = visibility;
720
+ }
721
+
722
+ if (!content) {
723
+ if (this.options.hideFlash){
724
+ var objects = document.getElementsByTagName('object');
725
+ for (i = 0; i != objects.length; i++) {
726
+ objects[i].style.visibility = visibility;
727
+ }
728
+ var embeds = document.getElementsByTagName('embed');
729
+ for (i = 0; i != embeds.length; i++) {
730
+ embeds[i].style.visibility = visibility;
731
+ }
732
+ }
733
+ var iframes = document.getElementsByTagName('iframe');
734
+ for (i = 0; i != iframes.length; i++) {
735
+ iframes[i].style.visibility = visibility;
736
+ }
737
+ }
738
+ },
739
+ //
740
+ // Get the actual page size
741
+ //
742
+ _getPageDimensions : function() {
743
+ var xScroll, yScroll;
744
+ if (window.innerHeight && window.scrollMaxY) {
745
+ xScroll = document.body.scrollWidth;
746
+ yScroll = window.innerHeight + window.scrollMaxY;
747
+ } else if (document.body.scrollHeight > document.body.offsetHeight){
748
+ xScroll = document.body.scrollWidth;
749
+ yScroll = document.body.scrollHeight;
750
+ } else {
751
+ xScroll = document.body.offsetWidth;
752
+ yScroll = document.body.offsetHeight;
753
+ }
754
+
755
+ var windowWidth, windowHeight;
756
+ if (self.innerHeight) {
757
+ windowWidth = self.innerWidth;
758
+ windowHeight = self.innerHeight;
759
+ } else if (document.documentElement && document.documentElement.clientHeight) {
760
+ windowWidth = document.documentElement.clientWidth;
761
+ windowHeight = document.documentElement.clientHeight;
762
+ } else if (document.body) {
763
+ windowWidth = document.body.clientWidth;
764
+ windowHeight = document.body.clientHeight;
765
+ }
766
+
767
+ if(yScroll < windowHeight){
768
+ this.pageDimensions.height = windowHeight;
769
+ } else {
770
+ this.pageDimensions.height = yScroll;
771
+ }
772
+
773
+ if(xScroll < windowWidth){
774
+ this.pageDimensions.width = windowWidth;
775
+ } else {
776
+ this.pageDimensions.width = xScroll;
777
+ }
778
+ },
779
+ //
780
+ // Display the lightWindow.
781
+ //
782
+ _displayLightWindow : function(display, visibility) {
783
+ $('lightwindow_overlay').style.display = $('lightwindow').style.display = $('lightwindow_container').style.display = display;
784
+ $('lightwindow_overlay').style.visibility = $('lightwindow').style.visibility = $('lightwindow_container').style.visibility = visibility;
785
+ },
786
+ //
787
+ // Setup Dimensions of lightwindow.
788
+
789
+ //
790
+ _setupDimensions : function() {
791
+
792
+ var originalHeight, originalWidth;
793
+ switch (this.windowType) {
794
+ case 'page' :
795
+ originalHeight = this.options.dimensions.page.height;
796
+ originalWidth = this.options.dimensions.page.width;
797
+ break;
798
+
799
+ case 'image' :
800
+ originalHeight = this.options.dimensions.image.height;
801
+ originalWidth = this.options.dimensions.image.width;
802
+ break;
803
+
804
+ case 'media' :
805
+ originalHeight = this.options.dimensions.media.height;
806
+ originalWidth = this.options.dimensions.media.width;
807
+ break;
808
+
809
+ case 'external' :
810
+ originalHeight = this.options.dimensions.external.height;
811
+ originalWidth = this.options.dimensions.external.width;
812
+ break;
813
+
814
+ case 'inline' :
815
+ originalHeight = this.options.dimensions.inline.height;
816
+ originalWidth = this.options.dimensions.inline.width;
817
+ break;
818
+
819
+ default :
820
+ originalHeight = this.options.dimensions.page.height;
821
+ originalWidth = this.options.dimensions.page.width;
822
+ break;
823
+
824
+ }
825
+
826
+ var offsetHeight = this._getParameter('lightwindow_top') ? parseFloat(this._getParameter('lightwindow_top'))+this.pagePosition.y : this.dimensions.viewport.height/2+this.pagePosition.y;
827
+ var offsetWidth = this._getParameter('lightwindow_left') ? parseFloat(this._getParameter('lightwindow_left'))+this.pagePosition.x : this.dimensions.viewport.width/2+this.pagePosition.x;
828
+
829
+ // So if a theme has say shadowed edges, they should be consistant and take care of in the contentOffset
830
+ $('lightwindow').setStyle({
831
+ top: offsetHeight+'px',
832
+ left: offsetWidth+'px'
833
+ });
834
+
835
+ $('lightwindow_container').setStyle({
836
+ height: originalHeight+'px',
837
+ width: originalWidth+'px',
838
+ left: -(originalWidth/2)+'px',
839
+ top: -(originalHeight/2)+'px'
840
+ });
841
+
842
+ $('lightwindow_contents').setStyle({
843
+ height: originalHeight+'px',
844
+ width: originalWidth+'px'
845
+ });
846
+ },
847
+ //
848
+ // Get the type of file.
849
+ //
850
+ _fileType : function(url) {
851
+ var image = new RegExp("[^\.]\.("+this.options.fileTypes.image.join('|')+")\s*$", "i");
852
+ if (image.test(url)) return 'image';
853
+ if (url.indexOf('#') > -1 && (document.domain == this._getDomain(url))) return 'inline';
854
+ if (url.indexOf('?') > -1) url = url.substring(0, url.indexOf('?'));
855
+ var type = 'unknown';
856
+ var page = new RegExp("[^\.]\.("+this.options.fileTypes.page.join('|')+")\s*$", "i");
857
+ var media = new RegExp("[^\.]\.("+this.options.fileTypes.media.join('|')+")\s*$", "i");
858
+ if (document.domain != this._getDomain(url)) type = 'external';
859
+ if (media.test(url)) type = 'media';
860
+ if (type == 'external' || type == 'media') return type;
861
+ if (page.test(url) || url.substr((url.length-1), url.length) == '/') type = 'page';
862
+ return type;
863
+ },
864
+ //
865
+ // Get file Extension
866
+ //
867
+ _fileExtension : function(url) {
868
+ if (url.indexOf('?') > -1) {
869
+ url = url.substring(0, url.indexOf('?'));
870
+ }
871
+ var extenstion = '';
872
+ for (var x = (url.length-1); x > -1; x--) {
873
+ if (url.charAt(x) == '.') {
874
+ return extenstion;
875
+ }
876
+ extenstion = url.charAt(x)+extenstion;
877
+ }
878
+ },
879
+ //
880
+ // Monitor the keyboard while this lightwindow is up
881
+ //
882
+ _monitorKeyboard : function(status) {
883
+ if (status) document.onkeydown = this._eventKeypress.bind(this);
884
+ else document.onkeydown = '';
885
+ },
886
+ //
887
+ // Perform keyboard actions
888
+ //
889
+ _eventKeypress : function(e) {
890
+ if (e == null) {
891
+ var keycode = event.keyCode;
892
+ } else {
893
+ var keycode = e.which;
894
+ }
895
+
896
+ switch (keycode) {
897
+ case 27:
898
+ this.deactivate();
899
+ break;
900
+
901
+ case 13:
902
+ return;
903
+
904
+ default:
905
+ break;
906
+ }
907
+
908
+ // Gotta stop those quick fingers
909
+ if (this.animating) {
910
+ return false;
911
+ }
912
+
913
+ switch (String.fromCharCode(keycode).toLowerCase()) {
914
+ case 'p':
915
+ if (this.navigationObservers.previous) {
916
+ this.navigateWindow('previous');
917
+ }
918
+ break;
919
+
920
+ case 'n':
921
+ if (this.navigationObservers.next) {
922
+ this.navigateWindow('next');
923
+ }
924
+ break;
925
+
926
+ default:
927
+ break;
928
+ }
929
+ },
930
+ //
931
+ // Get Gallery Information
932
+ //
933
+ _getGalleryInfo : function(rel) {
934
+ if (!rel) return false;
935
+ if (rel.indexOf('[') > -1) {
936
+ return new Array(escape(rel.substring(0, rel.indexOf('['))), escape(rel.substring(rel.indexOf('[')+1, rel.indexOf(']'))));
937
+ } else {
938
+ return false;
939
+ }
940
+ },
941
+ //
942
+ // Get the domain from a string.
943
+ //
944
+ _getDomain : function(url) {
945
+ var leadSlashes = url.indexOf('//');
946
+ var domainStart = leadSlashes+2;
947
+ var withoutResource = url.substring(domainStart, url.length);
948
+ var nextSlash = withoutResource.indexOf('/');
949
+ var domain = withoutResource.substring(0, nextSlash);
950
+ if (domain.indexOf(':') > -1){
951
+ var portColon = domain.indexOf(':');
952
+ domain = domain.substring(0, portColon);
953
+ }
954
+ return domain;
955
+ },
956
+ //
957
+ // Get the value from the params attribute string.
958
+ //
959
+ _getParameter : function(parameter, parameters) {
960
+ if (!this.element) return false;
961
+ if (parameter == 'lightwindow_top' && this.element.top) {
962
+ return unescape(this.element.top);
963
+ } else if (parameter == 'lightwindow_left' && this.element.left) {
964
+ return unescape(this.element.left);
965
+ } else if (parameter == 'lightwindow_type' && this.element.type) {
966
+ return unescape(this.element.type);
967
+ } else if (parameter == 'lightwindow_show_images' && this.element.showImages) {
968
+ return unescape(this.element.showImages);
969
+ } else if (parameter == 'lightwindow_height' && this.element.height) {
970
+ return unescape(this.element.height);
971
+ } else if (parameter == 'lightwindow_width' && this.element.width) {
972
+ return unescape(this.element.width);
973
+ } else if (parameter == 'lightwindow_loading_animation' && this.element.loadingAnimation) {
974
+ return unescape(this.element.loadingAnimation);
975
+ } else if (parameter == 'lightwindow_iframe_embed' && this.element.iframeEmbed) {
976
+ return unescape(this.element.iframeEmbed);
977
+ } else if (parameter == 'lightwindow_form' && this.element.form) {
978
+ return unescape(this.element.form);
979
+ } else {
980
+ if (!parameters) {
981
+ if (this.element.params) parameters = this.element.params;
982
+ else return;
983
+ }
984
+ var value;
985
+ var parameterArray = parameters.split(',');
986
+ var compareString = parameter+'=';
987
+ var compareLength = compareString.length;
988
+ for (var i = 0; i < parameterArray.length; i++) {
989
+ if (parameterArray[i].substr(0, compareLength) == compareString) {
990
+ var currentParameter = parameterArray[i].split('=');
991
+ value = currentParameter[1];
992
+ break;
993
+ }
994
+ }
995
+ if (!value) return false;
996
+ else return unescape(value);
997
+ }
998
+ },
999
+ //
1000
+ // Get the Browser Viewport Dimensions
1001
+ //
1002
+ _browserDimensions : function() {
1003
+ if (Prototype.Browser.IE) {
1004
+ this.dimensions.viewport.height = document.documentElement.clientHeight;
1005
+ this.dimensions.viewport.width = document.documentElement.clientWidth;
1006
+ } else {
1007
+ this.dimensions.viewport.height = window.innerHeight;
1008
+ this.dimensions.viewport.width = document.width || document.body.offsetWidth;
1009
+ }
1010
+ },
1011
+ //
1012
+ // Get the scrollbar offset, I don't like this method but there is really no other way I can find.
1013
+ //
1014
+ _getScrollerWidth : function() {
1015
+ var scrollDiv = Element.extend(document.createElement('div'));
1016
+ scrollDiv.setAttribute('id', 'lightwindow_scroll_div');
1017
+ scrollDiv.setStyle({
1018
+ position: 'absolute',
1019
+ top: '-10000px',
1020
+ left: '-10000px',
1021
+ width: '100px',
1022
+ height: '100px',
1023
+ overflow: 'hidden'
1024
+ });
1025
+
1026
+
1027
+
1028
+ var contentDiv = Element.extend(document.createElement('div'));
1029
+ contentDiv.setAttribute('id', 'lightwindow_content_scroll_div');
1030
+ contentDiv.setStyle({
1031
+ width: '100%',
1032
+ height: '200px'
1033
+ });
1034
+
1035
+ scrollDiv.appendChild(contentDiv);
1036
+
1037
+ var body = document.getElementsByTagName('body')[0];
1038
+ body.appendChild(scrollDiv);
1039
+
1040
+ var noScroll = $('lightwindow_content_scroll_div').offsetWidth;
1041
+ scrollDiv.style.overflow = 'auto';
1042
+ var withScroll = $('lightwindow_content_scroll_div').offsetWidth;
1043
+
1044
+ Element.remove($('lightwindow_scroll_div'));
1045
+
1046
+ this.scrollbarOffset = noScroll-withScroll;
1047
+ },
1048
+
1049
+
1050
+ //
1051
+ // Add a param to an object dynamically created
1052
+ //
1053
+ _addParamToObject : function(name, value, object, id) {
1054
+ var param = document.createElement('param');
1055
+ param.setAttribute('value', value);
1056
+ param.setAttribute('name', name);
1057
+ if (id) {
1058
+ param.setAttribute('id', id);
1059
+ }
1060
+ object.appendChild(param);
1061
+ return object;
1062
+ },
1063
+ //
1064
+ // Get the outer HTML of an object CROSS BROWSER
1065
+ //
1066
+ _outerHTML : function(object) {
1067
+ if (Prototype.Browser.IE) {
1068
+ return object.outerHTML;
1069
+ } else {
1070
+ var clone = object.cloneNode(true);
1071
+ var cloneDiv = document.createElement('div');
1072
+ cloneDiv.appendChild(clone);
1073
+ return cloneDiv.innerHTML;
1074
+ }
1075
+ },
1076
+ //
1077
+ // Convert an object to markup
1078
+ //
1079
+ _convertToMarkup : function(object, closeTag) {
1080
+ var markup = this._outerHTML(object).replace('</'+closeTag+'>', '');
1081
+ if (Prototype.Browser.IE) {
1082
+ for (var i = 0; i < object.childNodes.length; i++){
1083
+ markup += this._outerHTML(object.childNodes[i]);
1084
+ }
1085
+ markup += '</'+closeTag+'>';
1086
+ }
1087
+ return markup;
1088
+ },
1089
+ //
1090
+ // Depending what type of browser it is we have to append the object differently... DAMN YOU IE!!
1091
+ //
1092
+ _appendObject : function(object, closeTag, appendTo) {
1093
+ if (Prototype.Browser.IE) {
1094
+ appendTo.innerHTML += this._convertToMarkup(object, closeTag);
1095
+
1096
+ // Fix the Eolas activate thing but only for specified media, for example doing this to a quicktime film breaks it.
1097
+ if (this.options.EOLASFix.indexOf(this._fileType(this.element.href)) > -1) {
1098
+ var objectElements = document.getElementsByTagName('object');
1099
+ for (var i = 0; i < objectElements.length; i++) {
1100
+ if (objectElements[i].getAttribute("data")) objectElements[i].removeAttribute('data');
1101
+ objectElements[i].outerHTML = objectElements[i].outerHTML;
1102
+ objectElements[i].style.visibility = "visible";
1103
+ }
1104
+ }
1105
+ } else {
1106
+ appendTo.appendChild(object);
1107
+ }
1108
+ },
1109
+ //
1110
+ // Add in iframe
1111
+ //
1112
+ _appendIframe : function(scroll) {
1113
+ var iframe = document.createElement('iframe');
1114
+ iframe.setAttribute('id', 'lightwindow_iframe');
1115
+ iframe.setAttribute('name', 'lightwindow_iframe');
1116
+ iframe.setAttribute('src', 'about:blank');
1117
+ iframe.setAttribute('height', '100%');
1118
+ iframe.setAttribute('width', '100%');
1119
+ iframe.setAttribute('frameborder', '0');
1120
+ iframe.setAttribute('marginwidth', '0');
1121
+ iframe.setAttribute('marginheight', '0');
1122
+ iframe.setAttribute('scrolling', scroll);
1123
+
1124
+ this._appendObject(iframe, 'iframe', $('lightwindow_contents'));
1125
+ },
1126
+ //
1127
+ // Write Content to the iframe using the skin
1128
+ //
1129
+ _writeToIframe : function(content) {
1130
+ var template = this.options.skin.iframe;
1131
+ template = template.replace('{body_replace}', content);
1132
+ if ($('lightwindow_iframe').contentWindow){
1133
+ $('lightwindow_iframe').contentWindow.document.open();
1134
+ $('lightwindow_iframe').contentWindow.document.write(template);
1135
+ $('lightwindow_iframe').contentWindow.document.close();
1136
+ } else {
1137
+ $('lightwindow_iframe').contentDocument.open();
1138
+ $('lightwindow_iframe').contentDocument.write(template);
1139
+ $('lightwindow_iframe').contentDocument.close();
1140
+ }
1141
+ },
1142
+ //
1143
+ // Load the window Information
1144
+ //
1145
+ _loadWindow : function() {
1146
+ switch (this.windowType) {
1147
+ case 'image' :
1148
+
1149
+ var current = 0;
1150
+ var images = [];
1151
+ this.checkImage = [];
1152
+ this.resizeTo.height = this.resizeTo.width = 0;
1153
+ this.imageCount = this._getParameter('lightwindow_show_images') ? parseInt(this._getParameter('lightwindow_show_images')) : 1;
1154
+
1155
+ // If there is a gallery get it
1156
+ if (gallery = this._getGalleryInfo(this.element.rel)) {
1157
+ for (current = 0; current < this.galleries[gallery[0]][gallery[1]].length; current++) {
1158
+ if (this.contentToFetch.indexOf(this.galleries[gallery[0]][gallery[1]][current].href) > -1) {
1159
+ break;
1160
+ }
1161
+ }
1162
+ if (this.galleries[gallery[0]][gallery[1]][current-this.imageCount]) {
1163
+ this.navigationObservers.previous = this.galleries[gallery[0]][gallery[1]][current-this.imageCount];
1164
+ } else {
1165
+ this.navigationObservers.previous = false;
1166
+ }
1167
+ if (this.galleries[gallery[0]][gallery[1]][current+this.imageCount]) {
1168
+ this.navigationObservers.next = this.galleries[gallery[0]][gallery[1]][current+this.imageCount];
1169
+ } else {
1170
+ this.navigationObservers.next = false;
1171
+ }
1172
+
1173
+ this.activeGallery = true;
1174
+ } else {
1175
+ this.navigationObservers.previous = false;
1176
+ this.navigationObservers.next = false;
1177
+
1178
+ this.activeGallery = false;
1179
+ }
1180
+
1181
+ for (var i = current; i < (current+this.imageCount); i++) {
1182
+
1183
+ if (gallery && this.galleries[gallery[0]][gallery[1]][i]) {
1184
+ this.contentToFetch = this.galleries[gallery[0]][gallery[1]][i].href;
1185
+
1186
+ this.galleryLocation = {current: (i+1)/this.imageCount, total: (this.galleries[gallery[0]][gallery[1]].length)/this.imageCount};
1187
+
1188
+ if (!this.galleries[gallery[0]][gallery[1]][i+this.imageCount]) {
1189
+ $('lightwindow_next').setStyle({
1190
+ display: 'none'
1191
+ });
1192
+ } else {
1193
+ $('lightwindow_next').setStyle({
1194
+ display: 'block'
1195
+ });
1196
+ $('lightwindow_next_title').innerHTML = this.galleries[gallery[0]][gallery[1]][i+this.imageCount].title;
1197
+ }
1198
+
1199
+ if (!this.galleries[gallery[0]][gallery[1]][i-this.imageCount]) {
1200
+ $('lightwindow_previous').setStyle({
1201
+ display: 'none'
1202
+ });
1203
+ } else {
1204
+ $('lightwindow_previous').setStyle({
1205
+ display: 'block'
1206
+ });
1207
+ $('lightwindow_previous_title').innerHTML = this.galleries[gallery[0]][gallery[1]][i-this.imageCount].title;
1208
+ }
1209
+ }
1210
+
1211
+ images[i] = document.createElement('img');
1212
+ images[i].setAttribute('id', 'lightwindow_image_'+i);
1213
+ images[i].setAttribute('border', '0');
1214
+ images[i].setAttribute('src', this.contentToFetch);
1215
+ $('lightwindow_contents').appendChild(images[i]);
1216
+
1217
+ // We have to do this instead of .onload
1218
+ this.checkImage[i] = new PeriodicalExecuter(function(i) {
1219
+ if (!(typeof $('lightwindow_image_'+i).naturalWidth != "undefined" && $('lightwindow_image_'+i).naturalWidth == 0)) {
1220
+
1221
+ this.checkImage[i].stop();
1222
+
1223
+ var imageHeight = $('lightwindow_image_'+i).getHeight();
1224
+ if (imageHeight > this.resizeTo.height) {
1225
+ this.resizeTo.height = imageHeight;
1226
+ }
1227
+ this.resizeTo.width += $('lightwindow_image_'+i).getWidth();
1228
+ this.imageCount--;
1229
+
1230
+ $('lightwindow_image_'+i).setStyle({
1231
+ height: '100%'
1232
+ });
1233
+
1234
+ if (this.imageCount == 0) {
1235
+ this._processWindow();
1236
+ }
1237
+ }
1238
+
1239
+ }.bind(this, i), 1);
1240
+ }
1241
+
1242
+
1243
+ break;
1244
+
1245
+ case 'media' :
1246
+
1247
+ var current = 0;
1248
+ this.resizeTo.height = this.resizeTo.width = 0;
1249
+
1250
+ // If there is a gallery get it
1251
+ if (gallery = this._getGalleryInfo(this.element.rel)) {
1252
+ for (current = 0; current < this.galleries[gallery[0]][gallery[1]].length; current++) {
1253
+ if (this.contentToFetch.indexOf(this.galleries[gallery[0]][gallery[1]][current].href) > -1) {
1254
+ break;
1255
+ }
1256
+ }
1257
+
1258
+ if (this.galleries[gallery[0]][gallery[1]][current-1]) {
1259
+ this.navigationObservers.previous = this.galleries[gallery[0]][gallery[1]][current-1];
1260
+ } else {
1261
+ this.navigationObservers.previous = false;
1262
+ }
1263
+ if (this.galleries[gallery[0]][gallery[1]][current+1]) {
1264
+ this.navigationObservers.next = this.galleries[gallery[0]][gallery[1]][current+1];
1265
+ } else {
1266
+ this.navigationObservers.next = false;
1267
+ }
1268
+
1269
+ this.activeGallery = true;
1270
+ } else {
1271
+ this.navigationObservers.previous = false;
1272
+ this.navigationObservers.next = false;
1273
+
1274
+ this.activeGallery = false;
1275
+ }
1276
+
1277
+
1278
+ if (gallery && this.galleries[gallery[0]][gallery[1]][current]) {
1279
+ this.contentToFetch = this.galleries[gallery[0]][gallery[1]][current].href;
1280
+
1281
+ this.galleryLocation = {current: current+1, total: this.galleries[gallery[0]][gallery[1]].length};
1282
+
1283
+ if (!this.galleries[gallery[0]][gallery[1]][current+1]) {
1284
+ $('lightwindow_next').setStyle({
1285
+ display: 'none'
1286
+ });
1287
+ } else {
1288
+ $('lightwindow_next').setStyle({
1289
+ display: 'block'
1290
+ });
1291
+ $('lightwindow_next_title').innerHTML = this.galleries[gallery[0]][gallery[1]][current+1].title;
1292
+ }
1293
+
1294
+ if (!this.galleries[gallery[0]][gallery[1]][current-1]) {
1295
+ $('lightwindow_previous').setStyle({
1296
+ display: 'none'
1297
+ });
1298
+ } else {
1299
+ $('lightwindow_previous').setStyle({
1300
+ display: 'block'
1301
+ });
1302
+ $('lightwindow_previous_title').innerHTML = this.galleries[gallery[0]][gallery[1]][current-1].title;
1303
+ }
1304
+ }
1305
+
1306
+ if (this._getParameter('lightwindow_iframe_embed')) {
1307
+ this.resizeTo.height = this.dimensions.viewport.height;
1308
+ this.resizeTo.width = this.dimensions.viewport.width;
1309
+ } else {
1310
+ this.resizeTo.height = this._getParameter('lightwindow_height');
1311
+ this.resizeTo.width = this._getParameter('lightwindow_width');
1312
+ }
1313
+
1314
+ this._processWindow();
1315
+
1316
+ break;
1317
+
1318
+ case 'external' :
1319
+
1320
+ this._appendIframe('auto');
1321
+
1322
+ this.resizeTo.height = this.dimensions.viewport.height;
1323
+ this.resizeTo.width = this.dimensions.viewport.width;
1324
+
1325
+ this._processWindow();
1326
+
1327
+ break;
1328
+
1329
+ case 'page' :
1330
+
1331
+ var newAJAX = new Ajax.Request(
1332
+ this.contentToFetch, {
1333
+ method: 'get',
1334
+ parameters: '',
1335
+ onComplete: function(response) {
1336
+ $('lightwindow_contents').innerHTML += response.responseText;
1337
+ this.resizeTo.height = $('lightwindow_contents').scrollHeight+(this.options.contentOffset.height);
1338
+ this.resizeTo.width = $('lightwindow_contents').scrollWidth+(this.options.contentOffset.width);
1339
+ this._processWindow();
1340
+ }.bind(this)
1341
+ }
1342
+ );
1343
+
1344
+ break;
1345
+
1346
+ case 'inline' :
1347
+
1348
+ var content = this.contentToFetch;
1349
+ if (content.indexOf('?') > -1) {
1350
+ content = content.substring(0, content.indexOf('?'));
1351
+ }
1352
+ content = content.substring(content.indexOf('#')+1);
1353
+
1354
+ new Insertion.Top($('lightwindow_contents'), $(content).innerHTML);
1355
+
1356
+ this.resizeTo.height = $('lightwindow_contents').scrollHeight+(this.options.contentOffset.height);
1357
+ this.resizeTo.width = $('lightwindow_contents').scrollWidth+(this.options.contentOffset.width);
1358
+
1359
+ this._toggleTroubleElements('hidden', true);
1360
+ this._processWindow();
1361
+
1362
+ break;
1363
+
1364
+ default :
1365
+ throw("Page Type could not be determined, please amend this lightwindow URL "+this.contentToFetch);
1366
+ break;
1367
+ }
1368
+ },
1369
+ //
1370
+ // Resize the Window to fit the viewport if necessary
1371
+ //
1372
+ _resizeWindowToFit : function() {
1373
+ if (this.resizeTo.height+this.dimensions.cruft.height > this.dimensions.viewport.height) {
1374
+ var heightRatio = this.resizeTo.height/this.resizeTo.width;
1375
+ this.resizeTo.height = this.dimensions.viewport.height-this.dimensions.cruft.height-(2*this.options.viewportPadding);
1376
+ // We only care about ratio's with this window type
1377
+ if (this.windowType == 'image' || (this.windowType == 'media' && !this._getParameter('lightwindow_iframe_embed'))) {
1378
+ this.resizeTo.width = this.resizeTo.height/heightRatio;
1379
+ $('lightwindow_data_slide_inner').setStyle({
1380
+ width: this.resizeTo.width+'px'
1381
+ });
1382
+ }
1383
+ }
1384
+ if (this.resizeTo.width+this.dimensions.cruft.width > this.dimensions.viewport.width) {
1385
+ var widthRatio = this.resizeTo.width/this.resizeTo.height;
1386
+ this.resizeTo.width = this.dimensions.viewport.width-2*this.dimensions.cruft.width-(2*this.options.viewportPadding);
1387
+ // We only care about ratio's with this window type
1388
+ if (this.windowType == 'image' || (this.windowType == 'media' && !this._getParameter('lightwindow_iframe_embed'))) {
1389
+ this.resizeTo.height = this.resizeTo.width/widthRatio;
1390
+ $('lightwindow_data_slide_inner').setStyle({
1391
+ height: this.resizeTo.height+'px'
1392
+ });
1393
+ }
1394
+ }
1395
+
1396
+ },
1397
+ //
1398
+ // Set the Window to a preset size
1399
+ //
1400
+ _presetWindowSize : function() {
1401
+ if (this._getParameter('lightwindow_height')) {
1402
+ this.resizeTo.height = parseFloat(this._getParameter('lightwindow_height'));
1403
+ }
1404
+ if (this._getParameter('lightwindow_width')) {
1405
+ this.resizeTo.width = parseFloat(this._getParameter('lightwindow_width'));
1406
+ }
1407
+ },
1408
+ //
1409
+ // Process the Window
1410
+ //
1411
+ _processWindow : function() {
1412
+ // Clean out our effects
1413
+ this.dimensions.dataEffects = [];
1414
+
1415
+ // Set up the data-slide if we have caption information
1416
+ if (this.element.caption || this.element.author || (this.activeGallery && this.options.showGalleryCount)) {
1417
+ if (this.element.caption) {
1418
+ $('lightwindow_data_caption').innerHTML = this.element.caption;
1419
+ $('lightwindow_data_caption').setStyle({
1420
+ display: 'block'
1421
+ });
1422
+ } else {
1423
+ $('lightwindow_data_caption').setStyle({
1424
+ display: 'none'
1425
+ });
1426
+ }
1427
+ if (this.element.author) {
1428
+ $('lightwindow_data_author').innerHTML = this.element.author;
1429
+ $('lightwindow_data_author_container').setStyle({
1430
+ display: 'block'
1431
+ });
1432
+ } else {
1433
+ $('lightwindow_data_author_container').setStyle({
1434
+ display: 'none'
1435
+ });
1436
+ }
1437
+ if (this.activeGallery && this.options.showGalleryCount) {
1438
+ $('lightwindow_data_gallery_current').innerHTML = this.galleryLocation.current;
1439
+ $('lightwindow_data_gallery_total').innerHTML = this.galleryLocation.total;
1440
+ $('lightwindow_data_gallery_container').setStyle({
1441
+ display: 'block'
1442
+ });
1443
+ } else {
1444
+ $('lightwindow_data_gallery_container').setStyle({
1445
+ display: 'none'
1446
+ });
1447
+ }
1448
+
1449
+ $('lightwindow_data_slide_inner').setStyle({
1450
+ width: this.resizeTo.width+'px',
1451
+ height: 'auto',
1452
+ visibility: 'visible',
1453
+ display: 'block'
1454
+ });
1455
+ $('lightwindow_data_slide').setStyle({
1456
+ height: $('lightwindow_data_slide').getHeight()+'px',
1457
+ width: '1px',
1458
+ overflow: 'hidden',
1459
+ display: 'block'
1460
+ });
1461
+ } else {
1462
+ $('lightwindow_data_slide').setStyle({
1463
+ display: 'none',
1464
+ width: 'auto'
1465
+ });
1466
+ $('lightwindow_data_slide_inner').setStyle({
1467
+ display: 'none',
1468
+ visibility: 'hidden',
1469
+ width: this.resizeTo.width+'px',
1470
+ height: '0px'
1471
+ });
1472
+ }
1473
+
1474
+ if (this.element.title != 'null') {
1475
+ $('lightwindow_title_bar_title').innerHTML = this.element.title;
1476
+ } else {
1477
+ $('lightwindow_title_bar_title').innerHTML = '';
1478
+ }
1479
+
1480
+ var originalContainerDimensions = {height: $('lightwindow_container').getHeight(), width: $('lightwindow_container').getWidth()};
1481
+ // Position the window
1482
+ $('lightwindow_container').setStyle({
1483
+ height: 'auto',
1484
+ // We need to set the width to a px not auto as opera has problems with it
1485
+ width: $('lightwindow_container').getWidth()+this.options.contentOffset.width-(this.windowActive ? this.options.contentOffset.width : 0)+'px'
1486
+ });
1487
+ var newContainerDimensions = {height: $('lightwindow_container').getHeight(), width: $('lightwindow_container').getWidth()};
1488
+
1489
+ // We need to record the container dimension changes
1490
+ this.containerChange = {height: originalContainerDimensions.height-newContainerDimensions.height, width: originalContainerDimensions.width-newContainerDimensions.width};
1491
+
1492
+ // Get out general dimensions
1493
+ this.dimensions.container = {height: $('lightwindow_container').getHeight(), width: $('lightwindow_container').getWidth()};
1494
+ this.dimensions.cruft = {height: this.dimensions.container.height-$('lightwindow_contents').getHeight()+this.options.contentOffset.height, width: this.dimensions.container.width-$('lightwindow_contents').getWidth()+this.options.contentOffset.width};
1495
+
1496
+ // Set Sizes if we need too
1497
+ this._presetWindowSize();
1498
+ this._resizeWindowToFit(); // Even if the window is preset we still don't want it to go outside of the viewport
1499
+
1500
+ if (!this.windowActive) {
1501
+ // Position the window
1502
+ $('lightwindow_container').setStyle({
1503
+ left: -(this.dimensions.container.width/2)+'px',
1504
+ top: -(this.dimensions.container.height/2)+'px'
1505
+ });
1506
+ }
1507
+ $('lightwindow_container').setStyle({
1508
+ height: this.dimensions.container.height+'px',
1509
+ width: this.dimensions.container.width+'px'
1510
+ });
1511
+
1512
+ // We are ready, lets show this puppy off!
1513
+ this._displayLightWindow('block', 'visible');
1514
+ this._animateLightWindow();
1515
+ },
1516
+ //
1517
+ // Fire off our animation handler
1518
+ //
1519
+ _animateLightWindow : function() {
1520
+ if (this.options.animationHandler) {
1521
+ this.options.animationHandler().bind(this);
1522
+ } else {
1523
+ this._defaultAnimationHandler();
1524
+ }
1525
+ },
1526
+ //
1527
+ // Fire off our transition handler
1528
+ //
1529
+ _handleNavigation : function(display) {
1530
+ if (this.options.navigationHandler) {
1531
+ this.options.navigationHandler().bind(this, display);
1532
+ } else {
1533
+ this._defaultDisplayNavigation(display);
1534
+ }
1535
+ },
1536
+ //
1537
+ // Fire off our transition handler
1538
+ //
1539
+ _handleTransition : function() {
1540
+ if (this.options.transitionHandler) {
1541
+ this.options.transitionHandler().bind(this);
1542
+ } else {
1543
+ this._defaultTransitionHandler();
1544
+ }
1545
+ },
1546
+ //
1547
+ // Handle the finish of the window animation
1548
+ //
1549
+ _handleFinalWindowAnimation : function(delay) {
1550
+ if (this.options.finalAnimationHandler) {
1551
+ this.options.finalAnimationHandler().bind(this, delay);
1552
+ } else {
1553
+ this._defaultfinalWindowAnimationHandler(delay);
1554
+ }
1555
+ },
1556
+ //
1557
+ // Handle the gallery Animation
1558
+ //
1559
+ _handleGalleryAnimation : function(list) {
1560
+ if (this.options.galleryAnimationHandler) {
1561
+ this.options.galleryAnimationHandler().bind(this, list);
1562
+ } else {
1563
+ this._defaultGalleryAnimationHandler(list);
1564
+ }
1565
+ },
1566
+ //
1567
+ // Display the navigation
1568
+ //
1569
+ _defaultDisplayNavigation : function(display) {
1570
+ if (display) {
1571
+ $('lightwindow_navigation').setStyle({
1572
+ display: 'block',
1573
+ height: $('lightwindow_contents').getHeight()+'px',
1574
+ width: '100%',
1575
+ marginTop: this.options.dimensions.titleHeight+'px'
1576
+ });
1577
+ } else {
1578
+ $('lightwindow_navigation').setStyle({
1579
+ display: 'none',
1580
+ height: 'auto',
1581
+ width: 'auto'
1582
+ });
1583
+ }
1584
+ },
1585
+ //
1586
+ // This is the default animation handler for LightWindow
1587
+ //
1588
+ _defaultAnimationHandler : function() {
1589
+ // Now that we have figures out the cruft lets make the caption go away and add its effects
1590
+ if (this.element.caption || this.element.author || (this.activeGallery && this.options.showGalleryCount)) {
1591
+ $('lightwindow_data_slide').setStyle({
1592
+ display: 'none',
1593
+ width: 'auto'
1594
+ });
1595
+ this.dimensions.dataEffects.push(
1596
+ new Effect.SlideDown('lightwindow_data_slide', {sync: true}),
1597
+ new Effect.Appear('lightwindow_data_slide', {sync: true, from: 0.0, to: 1.0})
1598
+ );
1599
+ }
1600
+
1601
+ // Set up the Title if we have one
1602
+ $('lightwindow_title_bar_inner').setStyle({
1603
+ height: '0px',
1604
+ marginTop: this.options.dimensions.titleHeight+'px'
1605
+ });
1606
+
1607
+ // We always want the title bar as well
1608
+ this.dimensions.dataEffects.push(
1609
+ new Effect.Morph('lightwindow_title_bar_inner', {sync: true, style: {height: this.options.dimensions.titleHeight+'px', marginTop: '0px'}}),
1610
+ new Effect.Appear('lightwindow_title_bar_inner', {sync: true, from: 0.0, to: 1.0})
1611
+ );
1612
+
1613
+ if (!this.options.hideGalleryTab) {
1614
+ this._handleGalleryAnimation(false);
1615
+ if ($('lightwindow_galleries_tab_container').getHeight() == 0) {
1616
+ this.dimensions.dataEffects.push(
1617
+ new Effect.Morph('lightwindow_galleries_tab_container', {sync: true, style: {height: '20px', marginTop: '0px'}})
1618
+ );
1619
+ $('lightwindow_galleries').setStyle({
1620
+ width: '0px'
1621
+ });
1622
+ }
1623
+ }
1624
+
1625
+ var resized = false;
1626
+ var ratio = this.dimensions.container.width-$('lightwindow_contents').getWidth()+this.resizeTo.width+this.options.contentOffset.width;
1627
+ if (ratio != $('lightwindow_container').getWidth()) {
1628
+ new Effect.Parallel([
1629
+ new Effect.Scale('lightwindow_contents', 100*(this.resizeTo.width/$('lightwindow_contents').getWidth()), {scaleFrom: 100*($('lightwindow_contents').getWidth()/($('lightwindow_contents').getWidth()+(this.options.contentOffset.width))), sync: true, scaleY: false, scaleContent: false}),
1630
+ new Effect.Scale('lightwindow_container', 100*(ratio/(this.dimensions.container.width)), {sync: true, scaleY: false, scaleFromCenter: true, scaleContent: false})
1631
+ ], {
1632
+ duration: this.duration,
1633
+ delay: 0.25,
1634
+ queue: {position: 'end', scope: 'lightwindowAnimation'}
1635
+ }
1636
+ );
1637
+ }
1638
+
1639
+ ratio = this.dimensions.container.height-$('lightwindow_contents').getHeight()+this.resizeTo.height+this.options.contentOffset.height;
1640
+ if (ratio != $('lightwindow_container').getHeight()) {
1641
+ new Effect.Parallel([
1642
+ new Effect.Scale('lightwindow_contents', 100*(this.resizeTo.height/$('lightwindow_contents').getHeight()), {scaleFrom: 100*($('lightwindow_contents').getHeight()/($('lightwindow_contents').getHeight()+(this.options.contentOffset.height))), sync: true, scaleX: false, scaleContent: false}),
1643
+ new Effect.Scale('lightwindow_container', 100*(ratio/(this.dimensions.container.height)), {sync: true, scaleX: false, scaleFromCenter: true, scaleContent: false})
1644
+ ], {
1645
+ duration: this.duration,
1646
+ afterFinish: function() {
1647
+ if (this.dimensions.dataEffects.length > 0) {
1648
+ if (!this.options.hideGalleryTab) {
1649
+ $('lightwindow_galleries').setStyle({
1650
+ width: this.resizeTo.width+'px'
1651
+ });
1652
+ }
1653
+ new Effect.Parallel(this.dimensions.dataEffects, {
1654
+ duration: this.duration,
1655
+ afterFinish: function() {
1656
+ this._finishWindow();
1657
+ }.bind(this),
1658
+ queue: {position: 'end', scope: 'lightwindowAnimation'}
1659
+ }
1660
+ );
1661
+ }
1662
+ }.bind(this),
1663
+ queue: {position: 'end', scope: 'lightwindowAnimation'}
1664
+ }
1665
+ );
1666
+ resized = true;
1667
+ }
1668
+
1669
+ // We need to do our data effect since there was no resizing
1670
+ if (!resized && this.dimensions.dataEffects.length > 0) {
1671
+ new Effect.Parallel(this.dimensions.dataEffects, {
1672
+ duration: this.duration,
1673
+ beforeStart: function() {
1674
+ if (!this.options.hideGalleryTab) {
1675
+ $('lightwindow_galleries').setStyle({
1676
+ width: this.resizeTo.width+'px'
1677
+ });
1678
+ }
1679
+ if (this.containerChange.height != 0 || this.containerChange.width != 0) {
1680
+ new Effect.MoveBy('lightwindow_container', this.containerChange.height, this.containerChange.width, {transition: Effect.Transitions.sinoidal});
1681
+ }
1682
+ }.bind(this),
1683
+ afterFinish: function() {
1684
+ this._finishWindow();
1685
+ }.bind(this),
1686
+ queue: {position: 'end', scope: 'lightwindowAnimation'}
1687
+ }
1688
+ );
1689
+ }
1690
+
1691
+ },
1692
+ //
1693
+ // Finish up Window Animation
1694
+ //
1695
+ _defaultfinalWindowAnimationHandler : function(delay) {
1696
+ if (this.windowType == 'media' || this._getParameter('lightwindow_loading_animation')) {
1697
+ // Because of major flickering with the overlay we just hide it in this case
1698
+ Element.hide('lightwindow_loading');
1699
+ this._handleNavigation(this.activeGallery);
1700
+ this._setStatus(false);
1701
+ } else {
1702
+ Effect.Fade('lightwindow_loading', {
1703
+ duration: 0.75,
1704
+ delay: 1.0,
1705
+ afterFinish: function() {
1706
+ // Just in case we need some scroll goodness (this also avoids the swiss cheese effect)
1707
+ if (this.windowType != 'image' && this.windowType != 'media' && this.windowType != 'external') {
1708
+ $('lightwindow_contents').setStyle({
1709
+ overflow: 'auto'
1710
+ });
1711
+ }
1712
+ this._handleNavigation(this.activeGallery);
1713
+ this._defaultGalleryAnimationHandler();
1714
+ this._setStatus(false);
1715
+ }.bind(this),
1716
+ queue: {position: 'end', scope: 'lightwindowAnimation'}
1717
+ });
1718
+ }
1719
+ },
1720
+ //
1721
+ // Handle the gallery Animation
1722
+ //
1723
+ _defaultGalleryAnimationHandler : function(list) {
1724
+ if (this.activeGallery) {
1725
+ $('lightwindow_galleries').setStyle({
1726
+ display: 'block',
1727
+ marginBottom: $('lightwindow_data_slide').getHeight()+this.options.contentOffset.height/2+'px'
1728
+ });
1729
+ $('lightwindow_navigation').setStyle({
1730
+ height: $('lightwindow_contents').getHeight()-20+'px'
1731
+ });
1732
+ } else {
1733
+ $('lightwindow_galleries').setStyle({
1734
+ display: 'none'
1735
+ });
1736
+ $('lightwindow_galleries_tab_container').setStyle({
1737
+ height: '0px',
1738
+ marginTop: '20px'
1739
+ });
1740
+ $('lightwindow_galleries_list').setStyle({
1741
+ height: '0px'
1742
+ });
1743
+ return false;
1744
+ }
1745
+
1746
+ if (list) {
1747
+ if ($('lightwindow_galleries_list').getHeight() == 0) {
1748
+ var height = $('lightwindow_contents').getHeight()*0.80;
1749
+ $('lightwindow_galleries_tab_span').className = 'down';
1750
+ } else {
1751
+ var height = 0;
1752
+ $('lightwindow_galleries_tab_span').className = 'up';
1753
+ }
1754
+
1755
+ new Effect.Morph('lightwindow_galleries_list', {
1756
+ duration: this.duration,
1757
+ transition: Effect.Transitions.sinoidal,
1758
+ style: {height: height+'px'},
1759
+ beforeStart: function() {
1760
+ $('lightwindow_galleries_list').setStyle({
1761
+ overflow: 'hidden'
1762
+ });
1763
+ },
1764
+ afterFinish: function() {
1765
+ $('lightwindow_galleries_list').setStyle({
1766
+ overflow: 'auto'
1767
+ });
1768
+ },
1769
+ queue: {position: 'end', scope: 'lightwindowAnimation'}
1770
+ });
1771
+ }
1772
+
1773
+
1774
+ },
1775
+ //
1776
+ // Default Transition Handler
1777
+ //
1778
+ _defaultTransitionHandler : function() {
1779
+ // Clean out our effects
1780
+ this.dimensions.dataEffects = [];
1781
+
1782
+ // Now that we have figures out the cruft lets make the caption go away and add its effects
1783
+ if ($('lightwindow_data_slide').getStyle('display') != 'none') {
1784
+ this.dimensions.dataEffects.push(
1785
+ new Effect.SlideUp('lightwindow_data_slide', {sync: true}),
1786
+ new Effect.Fade('lightwindow_data_slide', {sync: true, from: 1.0, to: 0.0})
1787
+ );
1788
+ }
1789
+
1790
+ if (!this.options.hideGalleryTab) {
1791
+ if ($('lightwindow_galleries').getHeight() != 0 && !this.options.hideGalleryTab) {
1792
+ this.dimensions.dataEffects.push(
1793
+ new Effect.Morph('lightwindow_galleries_tab_container', {sync: true, style: {height: '0px', marginTop: '20px'}})
1794
+ );
1795
+ }
1796
+
1797
+ if ($('lightwindow_galleries_list').getHeight() != 0) {
1798
+ $('lightwindow_galleries_tab_span').className = 'up';
1799
+ this.dimensions.dataEffects.push(
1800
+ new Effect.Morph('lightwindow_galleries_list', {
1801
+ sync: true,
1802
+ style: {height: '0px'},
1803
+ transition: Effect.Transitions.sinoidal,
1804
+ beforeStart: function() {
1805
+ $('lightwindow_galleries_list').setStyle({
1806
+ overflow: 'hidden'
1807
+ });
1808
+ },
1809
+ afterFinish: function() {
1810
+ $('lightwindow_galleries_list').setStyle({
1811
+ overflow: 'auto'
1812
+ });
1813
+ }
1814
+ })
1815
+ );
1816
+ }
1817
+ }
1818
+
1819
+ // We always want the title bar as well
1820
+ this.dimensions.dataEffects.push(
1821
+ new Effect.Morph('lightwindow_title_bar_inner', {sync: true, style: {height: '0px', marginTop: this.options.dimensions.titleHeight+'px'}}),
1822
+ new Effect.Fade('lightwindow_title_bar_inner', {sync: true, from: 1.0, to: 0.0})
1823
+ );
1824
+
1825
+ new Effect.Parallel(this.dimensions.dataEffects, {
1826
+ duration: this.duration,
1827
+ afterFinish: function() {
1828
+ this._loadWindow();
1829
+ }.bind(this),
1830
+ queue: {position: 'end', scope: 'lightwindowAnimation'}
1831
+ }
1832
+ );
1833
+ },
1834
+ //
1835
+ // Default Form handler for LightWindow
1836
+ //
1837
+ _defaultFormHandler : function(e) {
1838
+ var element = Event.element(e).parentNode;
1839
+ var parameterString = Form.serialize(this._getParameter('lightwindow_form', element.getAttribute('params')));
1840
+ if (this.options.formMethod == 'post') {
1841
+ var newAJAX = new Ajax.Request(element.href, {
1842
+ method: 'post',
1843
+ postBody: parameterString,
1844
+ onComplete: this.openWindow.bind(this, element)
1845
+ });
1846
+ } else if (this.options.formMethod == 'get') {
1847
+ var newAJAX = new Ajax.Request(element.href, {
1848
+ method: 'get',
1849
+ parameters: parameterString,
1850
+ onComplete: this.openWindow.bind(this, element)
1851
+ });
1852
+ }
1853
+ },
1854
+ //
1855
+ // Wrap everything up
1856
+ //
1857
+ _finishWindow : function() {
1858
+ if (this.windowType == 'external') {
1859
+ // We set the externals source here because it allows for a much smoother animation
1860
+ $('lightwindow_iframe').setAttribute('src', this.element.href);
1861
+ this._handleFinalWindowAnimation(1);
1862
+ } else if (this.windowType == 'media') {
1863
+
1864
+ var outerObject = document.createElement('object');
1865
+ outerObject.setAttribute('classid', this.options.classids[this._fileExtension(this.contentToFetch)]);
1866
+ outerObject.setAttribute('codebase', this.options.codebases[this._fileExtension(this.contentToFetch)]);
1867
+ outerObject.setAttribute('id', 'lightwindow_media_primary');
1868
+ outerObject.setAttribute('name', 'lightwindow_media_primary');
1869
+ outerObject.setAttribute('width', this.resizeTo.width);
1870
+ outerObject.setAttribute('height', this.resizeTo.height);
1871
+ outerObject = this._addParamToObject('movie', this.contentToFetch, outerObject);
1872
+ outerObject = this._addParamToObject('src', this.contentToFetch, outerObject);
1873
+ outerObject = this._addParamToObject('controller', 'true', outerObject);
1874
+ outerObject = this._addParamToObject('wmode', 'transparent', outerObject);
1875
+ outerObject = this._addParamToObject('cache', 'false', outerObject);
1876
+ outerObject = this._addParamToObject('quality', 'high', outerObject);
1877
+
1878
+ if (!Prototype.Browser.IE) {
1879
+ var innerObject = document.createElement('object');
1880
+ innerObject.setAttribute('type', this.options.mimeTypes[this._fileExtension(this.contentToFetch)]);
1881
+ innerObject.setAttribute('data', this.contentToFetch);
1882
+ innerObject.setAttribute('id', 'lightwindow_media_secondary');
1883
+ innerObject.setAttribute('name', 'lightwindow_media_secondary');
1884
+ innerObject.setAttribute('width', this.resizeTo.width);
1885
+ innerObject.setAttribute('height', this.resizeTo.height);
1886
+ innerObject = this._addParamToObject('controller', 'true', innerObject);
1887
+ innerObject = this._addParamToObject('wmode', 'transparent', innerObject);
1888
+ innerObject = this._addParamToObject('cache', 'false', innerObject);
1889
+ innerObject = this._addParamToObject('quality', 'high', innerObject);
1890
+
1891
+ outerObject.appendChild(innerObject);
1892
+ }
1893
+
1894
+ if (this._getParameter('lightwindow_iframe_embed')) {
1895
+ this._appendIframe('no');
1896
+ this._writeToIframe(this._convertToMarkup(outerObject, 'object'));
1897
+ } else {
1898
+ this._appendObject(outerObject, 'object', $('lightwindow_contents'));
1899
+ }
1900
+
1901
+ this._handleFinalWindowAnimation(0);
1902
+ } else {
1903
+ this._handleFinalWindowAnimation(0);
1904
+ }
1905
+
1906
+ // Initialize any actions
1907
+ this._setupActions();
1908
+ }
1909
+ }
1910
+
1911
+ /*-----------------------------------------------------------------------------------------------*/
1912
+
1913
+ Event.observe(window, 'load', lightwindowInit, false);
1914
+
1915
+ //
1916
+ // Set up all of our links
1917
+ //
1918
+ var myLightWindow = null;
1919
+ function lightwindowInit() {
1920
+ myLightWindow = new lightwindow();
1921
+ }