puffer 0.0.11 → 0.0.12

Sign up to get free protection for your applications and to get access to all the features.
Files changed (55) hide show
  1. data/VERSION +1 -1
  2. data/app/helpers/puffer_helper.rb +8 -0
  3. data/app/views/layouts/puffer.html.erb +5 -11
  4. data/lib/generators/puffer/install/install_generator.rb +2 -2
  5. data/lib/generators/puffer/install/templates/puffer.rb +12 -0
  6. data/lib/generators/puffer/install/templates/puffer/javascripts/{application.js → puffer.js} +0 -0
  7. data/lib/generators/puffer/install/templates/puffer/javascripts/{rails-src.js → rails.js} +0 -0
  8. data/lib/puffer.rb +14 -0
  9. data/lib/puffer/controller/mutate.rb +8 -2
  10. data/lib/puffer/extensions/mapper.rb +2 -2
  11. data/lib/puffer/inputs.rb +1 -1
  12. data/lib/puffer/path_set.rb +14 -7
  13. data/lib/puffer/resource.rb +1 -1
  14. data/puffer.gemspec +8 -44
  15. data/spec/dummy/config/initializers/puffer.rb +12 -0
  16. data/spec/dummy/public/puffer/javascripts/{application.js → puffer.js} +0 -0
  17. data/spec/dummy/public/puffer/javascripts/{rails-src.js → rails.js} +0 -0
  18. metadata +10 -46
  19. data/lib/generators/puffer/install/templates/puffer/javascripts/right-autocompleter-src.js +0 -621
  20. data/lib/generators/puffer/install/templates/puffer/javascripts/right-autocompleter.js.gz +0 -0
  21. data/lib/generators/puffer/install/templates/puffer/javascripts/right-calendar-src.js +0 -1461
  22. data/lib/generators/puffer/install/templates/puffer/javascripts/right-calendar.js.gz +0 -0
  23. data/lib/generators/puffer/install/templates/puffer/javascripts/right-in-edit-src.js +0 -369
  24. data/lib/generators/puffer/install/templates/puffer/javascripts/right-in-edit.js +0 -13
  25. data/lib/generators/puffer/install/templates/puffer/javascripts/right-in-edit.js.gz +0 -0
  26. data/lib/generators/puffer/install/templates/puffer/javascripts/right-lightbox-src.js +0 -905
  27. data/lib/generators/puffer/install/templates/puffer/javascripts/right-lightbox.js +0 -24
  28. data/lib/generators/puffer/install/templates/puffer/javascripts/right-lightbox.js.gz +0 -0
  29. data/lib/generators/puffer/install/templates/puffer/javascripts/right-sortable-src.js +0 -428
  30. data/lib/generators/puffer/install/templates/puffer/javascripts/right-sortable.js +0 -17
  31. data/lib/generators/puffer/install/templates/puffer/javascripts/right-sortable.js.gz +0 -0
  32. data/lib/generators/puffer/install/templates/puffer/javascripts/right-src.js +0 -5892
  33. data/lib/generators/puffer/install/templates/puffer/javascripts/right-tabs-src.js +0 -1145
  34. data/lib/generators/puffer/install/templates/puffer/javascripts/right-tabs.js +0 -29
  35. data/lib/generators/puffer/install/templates/puffer/javascripts/right-tabs.js.gz +0 -0
  36. data/lib/generators/puffer/install/templates/puffer/javascripts/right.js.gz +0 -0
  37. data/spec/dummy/config/puffer.rb +0 -0
  38. data/spec/dummy/public/puffer/javascripts/right-autocompleter-src.js +0 -621
  39. data/spec/dummy/public/puffer/javascripts/right-autocompleter.js.gz +0 -0
  40. data/spec/dummy/public/puffer/javascripts/right-calendar-src.js +0 -1461
  41. data/spec/dummy/public/puffer/javascripts/right-calendar.js.gz +0 -0
  42. data/spec/dummy/public/puffer/javascripts/right-in-edit-src.js +0 -369
  43. data/spec/dummy/public/puffer/javascripts/right-in-edit.js +0 -13
  44. data/spec/dummy/public/puffer/javascripts/right-in-edit.js.gz +0 -0
  45. data/spec/dummy/public/puffer/javascripts/right-lightbox-src.js +0 -905
  46. data/spec/dummy/public/puffer/javascripts/right-lightbox.js +0 -24
  47. data/spec/dummy/public/puffer/javascripts/right-lightbox.js.gz +0 -0
  48. data/spec/dummy/public/puffer/javascripts/right-sortable-src.js +0 -428
  49. data/spec/dummy/public/puffer/javascripts/right-sortable.js +0 -17
  50. data/spec/dummy/public/puffer/javascripts/right-sortable.js.gz +0 -0
  51. data/spec/dummy/public/puffer/javascripts/right-src.js +0 -5892
  52. data/spec/dummy/public/puffer/javascripts/right-tabs-src.js +0 -1145
  53. data/spec/dummy/public/puffer/javascripts/right-tabs.js +0 -29
  54. data/spec/dummy/public/puffer/javascripts/right-tabs.js.gz +0 -0
  55. data/spec/dummy/public/puffer/javascripts/right.js.gz +0 -0
@@ -1,369 +0,0 @@
1
- /**
2
- * Inline editor feature for RightJS
3
- * http://rightjs.org/ui/in-edit
4
- *
5
- * Copyright (C) 2009-2010 Nikolay Nemshilov
6
- */
7
- var InEdit = RightJS.InEdit = (function(document, RightJS) {
8
- /**
9
- * This module defines the basic widgets constructor
10
- * it creates an abstract proxy with the common functionality
11
- * which then we reuse and override in the actual widgets
12
- *
13
- * Copyright (C) 2010-2011 Nikolay Nemshilov
14
- */
15
-
16
- /**
17
- * In-Edit plugin initalization
18
- *
19
- * Copyright (C) 2010 Nikolay Nemshilov
20
- */
21
- var R = RightJS,
22
- $ = RightJS.$,
23
- $w = RightJS.$w,
24
- Xhr = RightJS.Xhr,
25
- Object = RightJS.Object,
26
- Element = RightJS.Element,
27
- Input = RightJS.Input;
28
-
29
-
30
-
31
-
32
-
33
-
34
-
35
-
36
-
37
- /**
38
- * The widget units constructor
39
- *
40
- * @param String tag-name or Object methods
41
- * @param Object methods
42
- * @return Widget wrapper
43
- */
44
- function Widget(tag_name, methods) {
45
- if (!methods) {
46
- methods = tag_name;
47
- tag_name = 'DIV';
48
- }
49
-
50
- /**
51
- * An Abstract Widget Unit
52
- *
53
- * Copyright (C) 2010 Nikolay Nemshilov
54
- */
55
- var AbstractWidget = new RightJS.Class(RightJS.Element.Wrappers[tag_name] || RightJS.Element, {
56
- /**
57
- * The common constructor
58
- *
59
- * @param Object options
60
- * @param String optional tag name
61
- * @return void
62
- */
63
- initialize: function(key, options) {
64
- this.key = key;
65
- var args = [{'class': 'rui-' + key}];
66
-
67
- // those two have different constructors
68
- if (!(this instanceof RightJS.Input || this instanceof RightJS.Form)) {
69
- args.unshift(tag_name);
70
- }
71
- this.$super.apply(this, args);
72
-
73
- if (RightJS.isString(options)) {
74
- options = RightJS.$(options);
75
- }
76
-
77
- // if the options is another element then
78
- // try to dynamically rewrap it with our widget
79
- if (options instanceof RightJS.Element) {
80
- this._ = options._;
81
- if ('$listeners' in options) {
82
- options.$listeners = options.$listeners;
83
- }
84
- options = {};
85
- }
86
- this.setOptions(options, this);
87
-
88
- return (RightJS.Wrapper.Cache[RightJS.$uid(this._)] = this);
89
- },
90
-
91
- // protected
92
-
93
- /**
94
- * Catches the options
95
- *
96
- * @param Object user-options
97
- * @param Element element with contextual options
98
- * @return void
99
- */
100
- setOptions: function(options, element) {
101
- element = element || this;
102
- RightJS.Options.setOptions.call(this,
103
- RightJS.Object.merge(options, eval("("+(
104
- element.get('data-'+ this.key) || '{}'
105
- )+")"))
106
- );
107
- return this;
108
- }
109
- });
110
-
111
- /**
112
- * Creating the actual widget class
113
- *
114
- */
115
- var Klass = new RightJS.Class(AbstractWidget, methods);
116
-
117
- // creating the widget related shortcuts
118
- RightJS.Observer.createShortcuts(Klass.prototype, Klass.EVENTS || []);
119
-
120
- return Klass;
121
- }
122
-
123
-
124
- /**
125
- * A shared module to create textual spinners
126
- *
127
- * Copyright (C) 2010-2011 Nikolay Nemshilov
128
- */
129
- var Spinner = new RightJS.Class(RightJS.Element, {
130
- /**
131
- * Constructor
132
- *
133
- * @param Number optional spinner size (4 by default)
134
- * @return void
135
- */
136
- initialize: function(size) {
137
- this.$super('div', {'class': 'rui-spinner'});
138
- this.dots = [];
139
-
140
- for (var i=0; i < (size || 4); i++) {
141
- this.dots.push(new RightJS.Element('div'));
142
- }
143
-
144
- this.dots[0].addClass('glowing');
145
- this.insert(this.dots);
146
- RightJS(this.shift).bind(this).periodical(300);
147
- },
148
-
149
- /**
150
- * Shifts the spinner elements
151
- *
152
- * @return void
153
- */
154
- shift: function() {
155
- if (this.visible()) {
156
- var dot = this.dots.pop();
157
- this.dots.unshift(dot);
158
- this.insert(dot, 'top');
159
- }
160
- }
161
- });
162
-
163
-
164
- /**
165
- * An inline editor feature
166
- *
167
- * Copyright (C) 2009-2011 Nikolay Nemshilov
168
- */
169
- var InEdit = new Widget('FORM', {
170
- extend: {
171
- version: '2.2.0',
172
-
173
- EVENTS: $w('show hide send update'),
174
-
175
- Options: {
176
- url: null, // the url address where to send the stuff
177
- name: 'text', // the field name
178
- method: 'put', // the method
179
-
180
- type: 'text', // the input type, 'text', 'file', 'password' or 'textarea'
181
-
182
- toggle: null, // a reference to an element that should get hidden when the editor is active
183
-
184
- update: true, // a marker if the element should be updated with the response-text
185
-
186
- Xhr: {} // additional Xhr options
187
- },
188
-
189
- i18n: {
190
- Save: 'Save',
191
- Cancel: 'Cancel'
192
- },
193
-
194
- current: null // currently opened editor
195
- },
196
-
197
- /**
198
- * Constructor
199
- *
200
- * @param mixed an element reference
201
- * @param Object options
202
- * @return void
203
- */
204
- initialize: function(element, options) {
205
- this.element = $(element);
206
-
207
- this
208
- .$super('in-edit', options)
209
- .set('action', this.options.url)
210
- .insert([
211
- this.field = new Input({type: this.options.type, name: this.options.name, 'class': 'field'}),
212
- this.spinner = new Spinner(4),
213
- this.submit = new Input({type: 'submit', 'class': 'submit', value: InEdit.i18n.Save}),
214
- this.cancel = new Element('a', {'class': 'cancel', href: '#', html: InEdit.i18n.Cancel})
215
- ])
216
- .onClick(this.clicked)
217
- .onSubmit(this.send);
218
- },
219
-
220
- /**
221
- * Shows the inline-editor form
222
- *
223
- * @return InEdit this
224
- */
225
- show: function() {
226
- if (InEdit.current !== this) {
227
- if (InEdit.current) { InEdit.current.hide(); }
228
-
229
- this.oldContent = this.element.html();
230
-
231
- if (!R(['file', 'password']).include(this.options.type)) {
232
- this.field.setValue(this.oldContent);
233
- }
234
-
235
- this.element.update(this);
236
-
237
- this.spinner.hide();
238
- this.submit.show();
239
-
240
- if (this.options.toggle) {
241
- $(this.options.toggle).hide();
242
- }
243
- }
244
-
245
- if (this.options.type !== 'file') {
246
- this.field.focus();
247
- }
248
-
249
- InEdit.current = this;
250
- return this.fire('show');
251
- },
252
-
253
- /**
254
- * Hides the form and brings the content back
255
- *
256
- * @param String optional new content
257
- * @return InEdit this
258
- */
259
- hide: function() {
260
- this.element._.innerHTML = this.oldContent;
261
-
262
- if (this.xhr) {
263
- this.xhr.cancel();
264
- }
265
-
266
- return this.finish();
267
- },
268
-
269
- /**
270
- * Triggers the form remote submit
271
- *
272
- * @return InEdit this
273
- */
274
- send: function(event) {
275
- if (event) { event.stop(); }
276
-
277
- this.spinner.show().resize(this.submit.size());
278
- this.submit.hide();
279
-
280
- this.xhr = new Xhr(this.options.url, Object.merge(this.options.Xhr, {
281
- method: this.options.method,
282
- spinner: this.spinner,
283
- onComplete: R(this.receive).bind(this)
284
- })).send(this);
285
-
286
- return this.fire('send');
287
- },
288
-
289
- // protected
290
-
291
- // finishes up with the form
292
- finish: function() {
293
- if (this.options.toggle) {
294
- $(this.options.toggle).show();
295
- }
296
-
297
- InEdit.current = null;
298
- return this.fire('hide');
299
- },
300
-
301
- // the xhr callback
302
- receive: function() {
303
- if (this.options.update) {
304
- this.element.update(this.xhr.text);
305
- this.fire('update');
306
- }
307
-
308
- this.xhr = null;
309
-
310
- this.finish();
311
- },
312
-
313
- // catches clicks on the element
314
- clicked: function(event) {
315
- if (event.target === this.cancel) {
316
- event.stop();
317
- this.hide();
318
- }
319
- }
320
-
321
- });
322
-
323
-
324
- /**
325
- * The document hooks for in-edit form
326
- *
327
- * Copyright (C) 2010 Nikolay Nemshilov
328
- */
329
- $(document).onKeydown(function(event) {
330
- // processing the `ESC` button
331
- if (event.keyCode === 27 && InEdit.current) {
332
- InEdit.current.hide();
333
- }
334
- });
335
-
336
-
337
- /**
338
- * The element level inline editor extension
339
- *
340
- * Copyright (C) 2009-2010 Nikolay Nemshilov
341
- */
342
- Element.include({
343
- /**
344
- * Triggers an inline-editor feature on the element
345
- *
346
- * @param Object options for the InEdit class
347
- * @return InEdit object
348
- */
349
- inEdit: function(options) {
350
- return new InEdit(this, options).show();
351
- }
352
- });
353
- (function() {
354
- var style = document.createElement('style'),
355
- rules = document.createTextNode("div.rui-spinner,div.rui-spinner div{margin:0;padding:0;border:none;background:none;list-style:none;font-weight:normal;float:none;display:inline-block; *display:inline; *zoom:1;border-radius:.12em;-moz-border-radius:.12em;-webkit-border-radius:.12em}div.rui-spinner{text-align:center;white-space:nowrap;background:#EEE;border:1px solid #DDD;height:1.2em;padding:0 .2em}div.rui-spinner div{width:.4em;height:70%;background:#BBB;margin-left:1px}div.rui-spinner div:first-child{margin-left:0}div.rui-spinner div.glowing{background:#777}form.rui-in-edit,form.rui-in-edit .cancel{margin:0;padding:0;float:none;position:static}form.rui-in-edit{display:inline-block; *display:inline; *zoom:1;border:none;background:none}form.rui-in-edit div.rui-spinner{margin-right:.2em}form.rui-in-edit div.rui-spinner div{margin-top:.2em}form.rui-in-edit textarea.field{width:100%;margin-bottom:.5em}form.rui-in-edit .field,form.rui-in-edit .submit{margin-right:.2em}form.rui-in-edit,form.rui-in-edit .field,form.rui-in-edit .submit,form.rui-in-edit div.rui-spinner,form.rui-in-edit .cancel{vertical-align:middle}");
356
-
357
- style.type = 'text/css';
358
-
359
- if(style.styleSheet) {
360
- style.styleSheet.cssText = rules.nodeValue;
361
- } else {
362
- style.appendChild(rules);
363
- }
364
-
365
- document.getElementsByTagName('head')[0].appendChild(style);
366
- })();
367
-
368
- return InEdit;
369
- })(document, RightJS);
@@ -1,13 +0,0 @@
1
- /**
2
- * Inline editor feature for RightJS
3
- * http://rightjs.org/ui/in-edit
4
- *
5
- * Copyright (C) 2009-2010 Nikolay Nemshilov
6
- */
7
- var InEdit=RightJS.InEdit=function(g,b){var h=b.$,m=b.$w,n=b.Xhr,o=b.Object,j=b.Element,k=b.Input,p=new b.Class(b.Element,{initialize:function(a){this.$super("div",{"class":"rui-spinner"});this.dots=[];for(var d=0;d<(a||4);d++)this.dots.push(new b.Element("div"));this.dots[0].addClass("glowing");this.insert(this.dots);b(this.shift).bind(this).periodical(300)},shift:function(){if(this.visible()){var a=this.dots.pop();this.dots.unshift(a);this.insert(a,"top")}}}),e=new (function(a,d){if(!d){d=a;a="DIV"}var f=
8
- new b.Class(b.Element.Wrappers[a]||b.Element,{initialize:function(i,c){this.key=i;var l=[{"class":"rui-"+i}];this instanceof b.Input||this instanceof b.Form||l.unshift(a);this.$super.apply(this,l);if(b.isString(c))c=b.$(c);if(c instanceof b.Element){this._=c._;if("$listeners"in c)c.$listeners=c.$listeners;c={}}this.setOptions(c,this);return b.Wrapper.Cache[b.$uid(this._)]=this},setOptions:function(i,c){c=c||this;b.Options.setOptions.call(this,b.Object.merge(i,eval("("+(c.get("data-"+this.key)||"{}")+
9
- ")")));return this}});f=new b.Class(f,d);b.Observer.createShortcuts(f.prototype,f.EVENTS||[]);return f})("FORM",{extend:{version:"2.2.0",EVENTS:m("show hide send update"),Options:{url:null,name:"text",method:"put",type:"text",toggle:null,update:true,Xhr:{}},i18n:{Save:"Save",Cancel:"Cancel"},current:null},initialize:function(a,d){this.element=h(a);this.$super("in-edit",d).set("action",this.options.url).insert([this.field=new k({type:this.options.type,name:this.options.name,"class":"field"}),this.spinner=
10
- new p(4),this.submit=new k({type:"submit","class":"submit",value:e.i18n.Save}),this.cancel=new j("a",{"class":"cancel",href:"#",html:e.i18n.Cancel})]).onClick(this.clicked).onSubmit(this.send)},show:function(){if(e.current!==this){e.current&&e.current.hide();this.oldContent=this.element.html();b(["file","password"]).include(this.options.type)||this.field.setValue(this.oldContent);this.element.update(this);this.spinner.hide();this.submit.show();this.options.toggle&&h(this.options.toggle).hide()}this.options.type!==
11
- "file"&&this.field.focus();e.current=this;return this.fire("show")},hide:function(){this.element._.innerHTML=this.oldContent;this.xhr&&this.xhr.cancel();return this.finish()},send:function(a){a&&a.stop();this.spinner.show().resize(this.submit.size());this.submit.hide();this.xhr=(new n(this.options.url,o.merge(this.options.Xhr,{method:this.options.method,spinner:this.spinner,onComplete:b(this.receive).bind(this)}))).send(this);return this.fire("send")},finish:function(){this.options.toggle&&h(this.options.toggle).show();
12
- e.current=null;return this.fire("hide")},receive:function(){if(this.options.update){this.element.update(this.xhr.text);this.fire("update")}this.xhr=null;this.finish()},clicked:function(a){if(a.target===this.cancel){a.stop();this.hide()}}});h(g).onKeydown(function(a){a.keyCode===27&&e.current&&e.current.hide()});j.include({inEdit:function(a){return(new e(this,a)).show()}});(function(){var a=g.createElement("style"),d=g.createTextNode("div.rui-spinner,div.rui-spinner div{margin:0;padding:0;border:none;background:none;list-style:none;font-weight:normal;float:none;display:inline-block; *display:inline; *zoom:1;border-radius:.12em;-moz-border-radius:.12em;-webkit-border-radius:.12em}div.rui-spinner{text-align:center;white-space:nowrap;background:#EEE;border:1px solid #DDD;height:1.2em;padding:0 .2em}div.rui-spinner div{width:.4em;height:70%;background:#BBB;margin-left:1px}div.rui-spinner div:first-child{margin-left:0}div.rui-spinner div.glowing{background:#777}form.rui-in-edit,form.rui-in-edit .cancel{margin:0;padding:0;float:none;position:static}form.rui-in-edit{display:inline-block; *display:inline; *zoom:1;border:none;background:none}form.rui-in-edit div.rui-spinner{margin-right:.2em}form.rui-in-edit div.rui-spinner div{margin-top:.2em}form.rui-in-edit textarea.field{width:100%;margin-bottom:.5em}form.rui-in-edit .field,form.rui-in-edit .submit{margin-right:.2em}form.rui-in-edit,form.rui-in-edit .field,form.rui-in-edit .submit,form.rui-in-edit div.rui-spinner,form.rui-in-edit .cancel{vertical-align:middle}");
13
- a.type="text/css";if(a.styleSheet)a.styleSheet.cssText=d.nodeValue;else a.appendChild(d);g.getElementsByTagName("head")[0].appendChild(a)})();return e}(document,RightJS);
@@ -1,905 +0,0 @@
1
- /**
2
- * Lightbox feature for RightJS
3
- * http://rightjs.org/ui/lightbox
4
- *
5
- * Copyright (C) 2009-2010 Nikolay Nemshilov
6
- */
7
- var Lightbox = RightJS.Lightbox = (function(document, RightJS) {
8
- /**
9
- * This module defines the basic widgets constructor
10
- * it creates an abstract proxy with the common functionality
11
- * which then we reuse and override in the actual widgets
12
- *
13
- * Copyright (C) 2010-2011 Nikolay Nemshilov
14
- */
15
-
16
- /**
17
- * The filenames to include
18
- *
19
- * Copyright (C) 2010-2011 Nikolay Nemshilov
20
- */
21
- var R = RightJS,
22
- $ = RightJS.$,
23
- $$ = RightJS.$$,
24
- $w = RightJS.$w,
25
- $E = RightJS.$E,
26
- $ext = RightJS.$ext,
27
- Xhr = RightJS.Xhr,
28
- Class = RightJS.Class,
29
- Object = RightJS.Object,
30
- Element = RightJS.Element,
31
- Browser = RightJS.Browser;
32
-
33
- // IE6 doesn't support position:fixed so it needs a crunch
34
- Browser.IE6 = Browser.OLD && navigator.userAgent.indexOf("MSIE 6") > 0;
35
-
36
-
37
-
38
-
39
-
40
-
41
-
42
-
43
- /**
44
- * The widget units constructor
45
- *
46
- * @param String tag-name or Object methods
47
- * @param Object methods
48
- * @return Widget wrapper
49
- */
50
- function Widget(tag_name, methods) {
51
- if (!methods) {
52
- methods = tag_name;
53
- tag_name = 'DIV';
54
- }
55
-
56
- /**
57
- * An Abstract Widget Unit
58
- *
59
- * Copyright (C) 2010 Nikolay Nemshilov
60
- */
61
- var AbstractWidget = new RightJS.Class(RightJS.Element.Wrappers[tag_name] || RightJS.Element, {
62
- /**
63
- * The common constructor
64
- *
65
- * @param Object options
66
- * @param String optional tag name
67
- * @return void
68
- */
69
- initialize: function(key, options) {
70
- this.key = key;
71
- var args = [{'class': 'rui-' + key}];
72
-
73
- // those two have different constructors
74
- if (!(this instanceof RightJS.Input || this instanceof RightJS.Form)) {
75
- args.unshift(tag_name);
76
- }
77
- this.$super.apply(this, args);
78
-
79
- if (RightJS.isString(options)) {
80
- options = RightJS.$(options);
81
- }
82
-
83
- // if the options is another element then
84
- // try to dynamically rewrap it with our widget
85
- if (options instanceof RightJS.Element) {
86
- this._ = options._;
87
- if ('$listeners' in options) {
88
- options.$listeners = options.$listeners;
89
- }
90
- options = {};
91
- }
92
- this.setOptions(options, this);
93
-
94
- return (RightJS.Wrapper.Cache[RightJS.$uid(this._)] = this);
95
- },
96
-
97
- // protected
98
-
99
- /**
100
- * Catches the options
101
- *
102
- * @param Object user-options
103
- * @param Element element with contextual options
104
- * @return void
105
- */
106
- setOptions: function(options, element) {
107
- element = element || this;
108
- RightJS.Options.setOptions.call(this,
109
- RightJS.Object.merge(options, eval("("+(
110
- element.get('data-'+ this.key) || '{}'
111
- )+")"))
112
- );
113
- return this;
114
- }
115
- });
116
-
117
- /**
118
- * Creating the actual widget class
119
- *
120
- */
121
- var Klass = new RightJS.Class(AbstractWidget, methods);
122
-
123
- // creating the widget related shortcuts
124
- RightJS.Observer.createShortcuts(Klass.prototype, Klass.EVENTS || []);
125
-
126
- return Klass;
127
- }
128
-
129
-
130
- /**
131
- * A shared module to create textual spinners
132
- *
133
- * Copyright (C) 2010-2011 Nikolay Nemshilov
134
- */
135
- var Spinner = new RightJS.Class(RightJS.Element, {
136
- /**
137
- * Constructor
138
- *
139
- * @param Number optional spinner size (4 by default)
140
- * @return void
141
- */
142
- initialize: function(size) {
143
- this.$super('div', {'class': 'rui-spinner'});
144
- this.dots = [];
145
-
146
- for (var i=0; i < (size || 4); i++) {
147
- this.dots.push(new RightJS.Element('div'));
148
- }
149
-
150
- this.dots[0].addClass('glowing');
151
- this.insert(this.dots);
152
- RightJS(this.shift).bind(this).periodical(300);
153
- },
154
-
155
- /**
156
- * Shifts the spinner elements
157
- *
158
- * @return void
159
- */
160
- shift: function() {
161
- if (this.visible()) {
162
- var dot = this.dots.pop();
163
- this.dots.unshift(dot);
164
- this.insert(dot, 'top');
165
- }
166
- }
167
- });
168
-
169
-
170
- /**
171
- * The lightbox widget
172
- *
173
- * Copyright (C) 2009-2011 Nikolay Nemshilov
174
- */
175
- var Lightbox = new Widget({
176
-
177
- extend: {
178
- version: '2.2.0',
179
-
180
- EVENTS: $w('show hide load'),
181
-
182
- Options: {
183
- fxName: 'fade',
184
- fxDuration: 300,
185
-
186
- group: null, // a group marker
187
-
188
- hideOnEsc: true,
189
- hideOnOutClick: true,
190
- showCloseButton: true,
191
-
192
- cssRule: "a[data-lightbox]", // all lightbox links css-rule
193
-
194
- // video links default size
195
- mediaWidth: 425,
196
- mediaHeight: 350
197
- },
198
-
199
- i18n: {
200
- Close: 'Close',
201
- Prev: 'Previous Image',
202
- Next: 'Next Image'
203
- },
204
-
205
- // the supported image-urls regexp
206
- Images: /\.(jpg|jpeg|gif|png|bmp)/,
207
-
208
- // media content sources
209
- Medias: [
210
- [/(http:\/\/.*?youtube\.[a-z]+)\/watch\?v=([^&]+)/, '$1/v/$2', 'swf'],
211
- [/(http:\/\/video.google.com)\/videoplay\?docid=([^&]+)/, '$1/googleplayer.swf?docId=$2', 'swf'],
212
- [/(http:\/\/vimeo\.[a-z]+)\/([0-9]+).*?/, '$1/moogaloop.swf?clip_id=$2', 'swf']
213
- ]
214
- },
215
-
216
- /**
217
- * basic constructor
218
- *
219
- * @param Object options override
220
- * @param Element optional options holder
221
- * @return void
222
- */
223
- initialize: function(options, context) {
224
- this
225
- .$super('lightbox', {})
226
- .setOptions(options, context)
227
- .insert([
228
- this.locker = new Locker(this.options),
229
- this.dialog = new Dialog(this.options)
230
- ])
231
- .on({
232
- close: this._close,
233
- next: this._next,
234
- prev: this._prev
235
- });
236
- },
237
-
238
- /**
239
- * Extracting the rel="lightboux[groupname]" attributes
240
- *
241
- * @param Object options
242
- * @param Element link with options
243
- * @return Dialog this
244
- */
245
- setOptions: function(options, context) {
246
- this.$super(options, context);
247
-
248
- if (context) {
249
- var rel = context.get('rel');
250
- if (rel && (rel = rel.match(/lightbox\[(.+?)\]/))) {
251
- this.options.group = rel[1];
252
- }
253
- }
254
-
255
- return this;
256
- },
257
-
258
- /**
259
- * Sets the popup's title
260
- *
261
- * @param mixed string or element or somethin'
262
- * @return Lighbox self
263
- */
264
- setTitle: function(text) {
265
- this.dialog.setTitle(text);
266
-
267
- return this;
268
- },
269
-
270
- /**
271
- * Shows the lightbox
272
- *
273
- * @param String/Array... content
274
- * @return Lightbox this
275
- */
276
- show: function(content) {
277
- return this._showAnd(function() {
278
- this.dialog.show(content, !content);
279
- });
280
- },
281
-
282
- /**
283
- * Hides the lightbox
284
- *
285
- * @return Lightbox this
286
- */
287
- hide: function() {
288
- Lightbox.current = null;
289
-
290
- return this.$super(this.options.fxName, {
291
- duration: this.options.fxDuration/3,
292
- onFinish: R(function() {
293
- this.fire('hide');
294
- this.remove();
295
- }).bind(this)
296
- });
297
- },
298
-
299
- /**
300
- * Loads up the data from url or a link
301
- *
302
- * @param String address or a link element
303
- * @param Object Xhr options
304
- * @return Lightbox this
305
- */
306
- load: function(link, options) {
307
- return this._showAnd(function() {
308
- this.dialog.load(link, options);
309
- });
310
- },
311
-
312
- /**
313
- * Resizes the content block to the given size
314
- *
315
- * @param Hash size
316
- * @return Lightbox this
317
- */
318
- resize: function(size) {
319
- this.dialog.resize(size);
320
- return this;
321
- },
322
-
323
- // protected
324
-
325
- // handles the 'close' event
326
- _close: function(event) {
327
- event.stop();
328
- this.hide();
329
- },
330
-
331
- // handles the 'prev' event
332
- _prev: function(event) {
333
- event.stop();
334
- Pager.prev();
335
- },
336
-
337
- // handles the 'next' event
338
- _next: function(event) {
339
- event.stop();
340
- Pager.next();
341
- },
342
-
343
- // shows the lightbox element and then calls back
344
- _showAnd: function(callback) {
345
- if (Lightbox.current !== this) {
346
- Lightbox.current = this;
347
-
348
- // hidding all the hanging around lightboxes
349
- $$('div.rui-lightbox').each('remove');
350
-
351
- this.insertTo(document.body);
352
- this.dialog.show('', true);
353
-
354
- if (Browser.OLD) { // IE's get screwed by the transparency tricks
355
- this.reposition();
356
- Element.prototype.show.call(this);
357
- callback.call(this);
358
- } else {
359
- this.setStyle('display:none');
360
- Element.prototype.show.call(this, this.options.fxName, {
361
- duration: this.options.fxDuration/2,
362
- onFinish: R(function() {
363
- callback.call(this);
364
- this.fire('show');
365
- }).bind(this)
366
- });
367
- }
368
- } else {
369
- callback.call(this);
370
- }
371
-
372
- return this;
373
- },
374
-
375
- // manually repositioning under IE6 browser
376
- reposition: function() {
377
- if (Browser.IE6) {
378
- var win = $(window);
379
-
380
- this.setStyle({
381
- top: win.scrolls().y + 'px',
382
- width: win.size().x + 'px',
383
- height: win.size().y + 'px',
384
- position: "absolute"
385
- });
386
- }
387
- }
388
- });
389
-
390
-
391
- /**
392
- * The class level interface
393
- *
394
- * @copyright (C) 2009 Nikolay Nemshilov
395
- */
396
- Lightbox.extend({
397
- hide: function() {
398
- if (Lightbox.current) {
399
- Lightbox.current.hide();
400
- }
401
- },
402
-
403
- show: function() {
404
- return this.inst('show', arguments);
405
- },
406
-
407
- load: function() {
408
- return this.inst('load', arguments);
409
- },
410
-
411
- // private
412
-
413
- inst: function(name, args) {
414
- var inst = new Lightbox();
415
- return inst[name].apply(inst, args);
416
- }
417
- });
418
-
419
-
420
- /**
421
- * Lightbox background locker element
422
- *
423
- * Copyright (C) 2010-2011 Nikolay Nemshilov
424
- */
425
- var Locker = new Class(Element, {
426
- initialize: function(options) {
427
- this.$super('div', {'class': 'rui-lightbox-locker'});
428
-
429
- if (options.hideOnOutClick) {
430
- this.onClick('fire', 'close');
431
- }
432
- }
433
- });
434
-
435
-
436
- /**
437
- * The dialog element wrapper
438
- *
439
- * Copyright (C) 2010-2011 Nikolay Nemshilov
440
- */
441
- var Dialog = new Class(Element, {
442
- /**
443
- * Constructor
444
- *
445
- * @param Object options
446
- * @return void
447
- */
448
- initialize: function(options) {
449
- var i18n = Lightbox.i18n;
450
-
451
- this.options = options;
452
- this.$super('div', {'class': 'rui-lightbox-dialog'});
453
-
454
- // building up the
455
- this.insert([
456
- this.title = $E('div', {'class': 'rui-lightbox-title'}),
457
-
458
- $E('div', {'class': 'rui-lightbox-body'}).insert(
459
- $E('div', {'class': 'rui-lightbox-body-inner'}).insert([
460
- this.locker = $E('div', {'class': 'rui-lightbox-body-locker'}).insert(new Spinner(4)),
461
- this.scroller = $E('div', {'class': 'rui-lightbox-scroller'}).insert(
462
- this.content = $E('div', {'class': 'rui-lightbox-content'})
463
- )
464
- ])
465
- ),
466
-
467
- $E('div', {'class': 'rui-lightbox-navigation'}).insert([
468
- this.closeButton = $E('div', {'class': 'close', html: '&times;', title: i18n.Close}).onClick('fire', 'close'),
469
- this.prevLink = $E('div', {'class': 'prev', html: '&larr;', title: i18n.Prev}).onClick('fire', 'prev'),
470
- this.nextLink = $E('div', {'class': 'next', html: '&rarr;', title: i18n.Next}).onClick('fire', 'next')
471
- ])
472
- ]);
473
-
474
- // presetting the navigation state
475
- this.prevLink.hide();
476
- this.nextLink.hide();
477
-
478
- if (!options.showCloseButton) {
479
- this.closeButton.hide();
480
- }
481
- },
482
-
483
- /**
484
- * Sets the dialogue caption
485
- *
486
- * @param String title
487
- * @return Dialog this
488
- */
489
- setTitle: function(title) {
490
- this.title.update(title||'');
491
- },
492
-
493
- /**
494
- * Nicely resize the dialog box
495
- *
496
- * @param Object the end size
497
- * @param Boolean use fx (false by default)
498
- * @return Dialog this
499
- */
500
- resize: function(end_size, with_fx) {
501
- var win_size = this.parent().size(),
502
- cur_size = this.scroller.size(),
503
- cur_top = (win_size.y - this.size().y)/2,
504
- dlg_diff = this.size().x - cur_size.x; // <- use for IE6 fixes
505
-
506
- if (end_size) {
507
- // getting the actual end-size
508
- end_size = this.scroller.setStyle(end_size).size();
509
-
510
- this.scroller.setStyle({
511
- width: cur_size.x + 'px',
512
- height: cur_size.y + 'px'
513
- });
514
- } else {
515
- // using the content block size
516
- end_size = this.content.size();
517
- }
518
-
519
- // checking the constraints
520
- var threshold = 100; // px
521
- if ((end_size.x + threshold) > win_size.x) { end_size.x = win_size.x - threshold; }
522
- if ((end_size.y + threshold) > win_size.y) { end_size.y = win_size.y - threshold; }
523
-
524
- // the actual resize and reposition
525
- var end_top = (cur_top * 2 + cur_size.y - end_size.y) / 2;
526
- var dialog = this._.style, content = this.scroller._.style;
527
-
528
- if (RightJS.Fx && with_fx && (end_size.x != cur_size.x || end_size.y != cur_size.y)) {
529
-
530
- $ext(new RightJS.Fx(this, {duration: this.options.fxDuration}), {
531
- render: function(delta) {
532
- content.width = (cur_size.x + (end_size.x - cur_size.x) * delta) + 'px';
533
- content.height = (cur_size.y + (end_size.y - cur_size.y) * delta) + 'px';
534
- dialog.top = (cur_top + (end_top - cur_top) * delta) + 'px';
535
-
536
- if (Browser.IE6) {
537
- dialog.width = (dlg_diff + cur_size.y + (end_size.y - cur_size.y) * delta) + 'px';
538
- }
539
- }
540
- }).onFinish(R(this.unlock).bind(this)).start();
541
-
542
- } else {
543
- // no-fx direct assignment
544
- content.width = end_size.x + 'px';
545
- content.height = end_size.y + 'px';
546
- dialog.top = end_top + 'px';
547
-
548
- if (Browser.IE6) {
549
- dialog.width = (dlg_diff + end_size.x) + 'px';
550
- }
551
-
552
- if (!this.request) { this.unlock(); }
553
- }
554
-
555
- return this;
556
- },
557
-
558
- /**
559
- * Shows the content
560
- *
561
- * @param mixed content String/Element/Array and so one
562
- * @return Dialog this
563
- */
564
- show: function(content, no_fx) {
565
- this.content.update(content || '');
566
- this.resize(null, !no_fx);
567
- },
568
-
569
- /**
570
- * Loads up the data from the link
571
- *
572
- * @param mixed String url address or a link element
573
- * @param Object xhr-options
574
- * @return void
575
- */
576
- load: function(url, options) {
577
- if (url instanceof Element) {
578
- this.setTitle(url.get('title'));
579
- url = url.get('href');
580
- }
581
-
582
- Pager.show(this, url);
583
- this.lock().cancel();
584
-
585
- // defined in the loader.js file
586
- this.request = new Loader(url, options, R(function(content, no_fx) {
587
- this.request = null;
588
- this.show(content, no_fx);
589
- }).bind(this));
590
-
591
- return this.resize(); // the look might be changed for a media-type
592
- },
593
-
594
- /**
595
- * Cancels a currently loading request
596
- *
597
- * @return Dialog this
598
- */
599
- cancel: function() {
600
- if (this.request) {
601
- this.request.cancel();
602
- }
603
-
604
- return this;
605
- },
606
-
607
- /**
608
- * Shows the loading lock
609
- *
610
- * @return Dialog this
611
- */
612
- lock: function() {
613
- this.locker.setStyle('opacity:1;display:block').insertTo(this.scroller, 'before');
614
- return this;
615
- },
616
-
617
- /**
618
- * Hides the loading lock
619
- *
620
- * @return Dialog this
621
- */
622
- unlock: function() {
623
- this.locker.remove(R(this.content.html()).blank() ? null : 'fade', {
624
- duration: this.options.fxDuration * 2/3
625
- });
626
-
627
- return this;
628
- }
629
- });
630
-
631
-
632
- /**
633
- * Xhr/images/medias loading module
634
- *
635
- * Copyright (C) 2009-2010 Nikolay Nemshilov
636
- */
637
- var Loader = new Class({
638
- /**
639
- * Constructor
640
- *
641
- * @param String url address
642
- * @param Object Xhr options
643
- * @param Function on-finish callback
644
- */
645
- initialize: function(url, options, on_finish) {
646
- // adjusting the dialog look for different media-types
647
- if (this.isImage(url, on_finish)) {
648
- Lightbox.current.addClass('rui-lightbox-image');
649
- } else if (this.isMedia(url, on_finish)) {
650
- Lightbox.current.addClass('rui-lightbox-media');
651
- } else {
652
- this.xhr = new Xhr(url,
653
- Object.merge({method: 'get'}, options)
654
- ).onComplete(function() {
655
- on_finish(this.text);
656
- }).send();
657
- }
658
- },
659
-
660
- /**
661
- * Cancels the request
662
- *
663
- * @return Loader this
664
- */
665
- cancel: function() {
666
- if (this.xhr) {
667
- this.xhr.cancel();
668
- } else if (this.img) {
669
- this.img.onload = function() {};
670
- }
671
- },
672
-
673
- // protected
674
-
675
- // tries to initialize it as an image loading
676
- isImage: function(url, on_finish) {
677
- if (url.match(Lightbox.Images)) {
678
- var img = this.img = $E('img')._;
679
- img.onload = function() {
680
- on_finish(img);
681
- };
682
- img.src = url;
683
- return true;
684
- }
685
- },
686
-
687
- // tries to initialize it as a flash-element
688
- isMedia: function(url, on_finish) {
689
- var media = R(Lightbox.Medias).map(function(desc) {
690
- return url.match(desc[0]) ? this.buildEmbed(
691
- url.replace(desc[0], desc[1]), desc[2]) : null;
692
- }, this).compact()[0];
693
-
694
- if (media) {
695
- on_finish(media, true);
696
- return true;
697
- }
698
- },
699
-
700
- // builds an embedded media block
701
- buildEmbed: function(url, type) {
702
- var media_types = {
703
- swf: [
704
- 'D27CDB6E-AE6D-11cf-96B8-444553540000',
705
- 'http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0',
706
- 'application/x-shockwave-flash'
707
- ]
708
- },
709
- options = Lightbox.current ? Lightbox.current.options : Lightbox.Options,
710
- sizes = ' width="'+ options.mediaWidth + '" height="'+ options.mediaHeight + '"';
711
-
712
- return '<object classid="clsid:' + media_types[type][0] +
713
- '" codebase="' + media_types[type][1] + '"'+ sizes + '>' +
714
- '<param name="src" value="'+ url +'" />'+
715
- '<embed src="'+ url +'" type="'+ media_types[type][2]+'"'+ sizes + ' />' +
716
- '</object>';
717
- }
718
-
719
- });
720
-
721
-
722
- /**
723
- * Processes the link-groups showing things in a single Lightbox
724
- *
725
- * Copyright (C) 2010 Nikolay Nemshilov
726
- */
727
- var Pager = {
728
- /**
729
- * Checks and shows the pager links on the dialog
730
- *
731
- * @param Dialog dialog
732
- * @param String url-address
733
- * @return void
734
- */
735
- show: function(dialog, url) {
736
- if (dialog.options.group) {
737
- this.dialog = dialog;
738
- this.links = this.find(dialog.options.group);
739
- this.link = this.links.first(function(link) {
740
- return link.get('href') === url;
741
- });
742
-
743
- var index = this.links.indexOf(this.link), size = this.links.length;
744
-
745
- dialog.prevLink[size && index > 0 ? 'show' : 'hide']();
746
- dialog.nextLink[size && index < size - 1 ? 'show' : 'hide']();
747
- } else {
748
- this.dialog = null;
749
- }
750
- },
751
-
752
- /**
753
- * Shows the prev link
754
- *
755
- * @return void
756
- */
757
- prev: function() {
758
- if (this.dialog && !this.timer) {
759
- var id = this.links.indexOf(this.link),
760
- link = this.links[id - 1];
761
-
762
- if (link) {
763
- this.dialog.load(link);
764
- this.timeout();
765
- }
766
- }
767
- },
768
-
769
- /**
770
- * Shows the next link
771
- *
772
- * @return void
773
- */
774
- next: function() {
775
- if (this.dialog && !this.timer) {
776
- var id = this.links.indexOf(this.link),
777
- link = this.links[id + 1];
778
-
779
- if (link) {
780
- this.dialog.load(link);
781
- this.timeout();
782
- }
783
- }
784
- },
785
-
786
- // private
787
-
788
- // finding the links list
789
- find: function(group) {
790
- return $$('a').filter(function(link) {
791
- var data = link.get('data-lightbox');
792
- var rel = link.get('rel');
793
-
794
- return (data && eval("("+ data + ")").group === group) ||
795
- (rel && rel.indexOf('lightbox['+ group + ']') > -1);
796
- });
797
- },
798
-
799
- // having a little nap to prevent ugly quick scrolling
800
- timeout: function() {
801
- this.timer = R(function() {
802
- Pager.timer = null;
803
- }).delay(300);
804
- }
805
- };
806
-
807
-
808
- /**
809
- * document level hooks
810
- *
811
- * Copyright (C) 2009-2010 Nikolay Nemshilov
812
- */
813
-
814
- $(document).on({
815
- /**
816
- * Catches clicks on the target links
817
- *
818
- * @param Event click
819
- * @return void
820
- */
821
- click: function(event) {
822
- var target = event.find(Lightbox.Options.cssRule) || event.find('a[rel^=lightbox]');
823
-
824
- if (target) {
825
- event.stop();
826
- new Lightbox({}, target).load(target);
827
- }
828
- },
829
-
830
- /**
831
- * Catches the mousewheel event and tries to scroll
832
- * the list of objects on the lightbox
833
- *
834
- * @param Event mousewheel
835
- * @return void
836
- */
837
- mousewheel: function(event) {
838
- if (Lightbox.current) {
839
- var target = event.target, box = target.parent('div.rui-lightbox-content');
840
-
841
- if (!box || target.getStyle('overflow') === 'visible') {
842
- event.stop();
843
- }
844
-
845
- Lightbox.current.fire((event._.detail || -event._.wheelDelta) < 0 ? 'prev' : 'next');
846
- }
847
- },
848
-
849
- /**
850
- * Handles the navigation form a keyboard
851
- *
852
- * @param Event keydown
853
- * @return void
854
- */
855
- keydown: function(event) {
856
- var lightbox = Lightbox.current, name = ({
857
- 27: 'close', // Esc
858
- 33: 'prev', // PageUp
859
- 37: 'prev', // Left
860
- 38: 'prev', // Up
861
- 39: 'next', // Right
862
- 40: 'next', // Down
863
- 34: 'next' // PageDown
864
- })[event.keyCode];
865
-
866
- if (lightbox && name) {
867
- if (name !== 'close' || lightbox.options.hideOnEsc) {
868
- event.stop();
869
- lightbox.fire(name);
870
- }
871
- }
872
- }
873
- });
874
-
875
- $(window).on({
876
- resize: function() {
877
- if (Lightbox.current) {
878
- Lightbox.current.reposition();
879
- Lightbox.current.dialog.resize();
880
- }
881
- },
882
-
883
- scroll: function(event) {
884
- if (Lightbox.current && Browser.IE6) {
885
- Lightbox.current.reposition();
886
- }
887
- }
888
- });
889
- (function() {
890
- var style = document.createElement('style'),
891
- rules = document.createTextNode("div.rui-spinner,div.rui-spinner div{margin:0;padding:0;border:none;background:none;list-style:none;font-weight:normal;float:none;display:inline-block; *display:inline; *zoom:1;border-radius:.12em;-moz-border-radius:.12em;-webkit-border-radius:.12em}div.rui-spinner{text-align:center;white-space:nowrap;background:#EEE;border:1px solid #DDD;height:1.2em;padding:0 .2em}div.rui-spinner div{width:.4em;height:70%;background:#BBB;margin-left:1px}div.rui-spinner div:first-child{margin-left:0}div.rui-spinner div.glowing{background:#777}div.rui-lightbox{position:fixed;top:0;left:0;float:none;width:100%;height:100%;margin:0;padding:0;background:none;border:none;text-align:center;z-index:9999;z-index/*\\**/:auto\\9;}div.rui-lightbox-locker{position:absolute;top:0px;left:0px;width:100%;height:100%;background-color:#000;opacity:0.8;filter:alpha(opacity=80);cursor:default;z-index/*\\**/:9990\\9;}div.rui-lightbox-dialog{display:inline-block; *display:inline; *zoom:1;position:relative;text-align:left;z-index/*\\**/:9999\\9;}div.rui-lightbox-title{height:1.2em;margin-bottom:.1em;white-space:nowrap;color:#DDD;font-weight:bold;font-size:1.6em;font-family:Helvetica}div.rui-lightbox-body{background-color:#FFF;padding:1em;border-radius:.5em;-moz-border-radius:.5em;-webkit-border-radius:.5em}div.rui-lightbox-body-inner{position:relative}div.rui-lightbox-scroller{overflow:hidden}div.rui-lightbox-content{display:inline-block; *display:inline; *zoom:1;min-height:10em;min-width:10em;_height:10em;_width:10em}div.rui-lightbox-body-locker{background-color:white;position:absolute;left:0px;top:0px;width:100%;height:100%;opacity:0;filter:alpha(opacity=0)}div.rui-lightbox-body-locker div.rui-spinner{position:absolute;right:0;bottom:0;border:none;background:none;font-size:150%}div.rui-lightbox-navigation{color:#888;font-size:160%;font-family:Arial;height:1em;user-select:none;-moz-user-select:none;-webkit-user-select:none}div.rui-lightbox-navigation div{cursor:pointer;position:absolute}div.rui-lightbox-navigation div:hover{color:white}div.rui-lightbox-navigation div.next{left:2em}div.rui-lightbox-navigation div.close{right:0}div.rui-lightbox-image div.rui-lightbox-body,div.rui-lightbox-media div.rui-lightbox-body{padding:0;border:1px solid #777;border-radius:0px;-moz-border-radius:0px;-webkit-border-radius:0px}div.rui-lightbox-image div.rui-lightbox-content,div.rui-lightbox-media div.rui-lightbox-content{min-height:12em;min-width:12em;_height:12em;_width:12em}div.rui-lightbox-image div.rui-lightbox-content img{vertical-align:middle}div.rui-lightbox-image div.rui-lightbox-body,div.rui-lightbox-image div.rui-lightbox-body-locker,div.rui-lightbox-media div.rui-lightbox-body,div.rui-lightbox-media div.rui-lightbox-body-locker{background-color:#D8D8D8}div.rui-lightbox-image div.rui-lightbox-body-locker div.rui-spinner,div.rui-lightbox-media div.rui-lightbox-body-locker div.rui-spinner{bottom:.5em;right:.5em}");
892
-
893
- style.type = 'text/css';
894
-
895
- if(style.styleSheet) {
896
- style.styleSheet.cssText = rules.nodeValue;
897
- } else {
898
- style.appendChild(rules);
899
- }
900
-
901
- document.getElementsByTagName('head')[0].appendChild(style);
902
- })();
903
-
904
- return Lightbox;
905
- })(document, RightJS);