Projet

Général

Profil

Paste
Télécharger (28,4 ko) Statistiques
| Branche: | Révision:

root / drupal7 / sites / all / libraries / colorbox-1.6.2 / jquery.colorbox.js @ 99781f3b

1 85ad3d82 Assos Assos
/*!
2 0aee3c58 Assos Assos
        Colorbox 1.6.2
3
        license: MIT
4
        http://www.jacklmoore.com/colorbox
5 85ad3d82 Assos Assos
*/
6
(function ($, document, window) {
7
        var
8
        // Default settings object.
9
        // See http://jacklmoore.com/colorbox for details.
10
        defaults = {
11
                // data sources
12
                html: false,
13
                photo: false,
14
                iframe: false,
15
                inline: false,
16
17
                // behavior and appearance
18
                transition: "elastic",
19
                speed: 300,
20
                fadeOut: 300,
21
                width: false,
22
                initialWidth: "600",
23
                innerWidth: false,
24
                maxWidth: false,
25
                height: false,
26
                initialHeight: "450",
27
                innerHeight: false,
28
                maxHeight: false,
29
                scalePhotos: true,
30
                scrolling: true,
31
                opacity: 0.9,
32
                preloading: true,
33
                className: false,
34
                overlayClose: true,
35
                escKey: true,
36
                arrowKey: true,
37
                top: false,
38
                bottom: false,
39
                left: false,
40
                right: false,
41
                fixed: false,
42
                data: undefined,
43
                closeButton: true,
44
                fastIframe: true,
45
                open: false,
46
                reposition: true,
47
                loop: true,
48
                slideshow: false,
49
                slideshowAuto: true,
50
                slideshowSpeed: 2500,
51
                slideshowStart: "start slideshow",
52
                slideshowStop: "stop slideshow",
53 0aee3c58 Assos Assos
                photoRegex: /\.(gif|png|jp(e|g|eg)|bmp|ico|webp|jxr|svg)((#|\?).*)?$/i,
54 85ad3d82 Assos Assos
55
                // alternate image paths for high-res displays
56
                retinaImage: false,
57
                retinaUrl: false,
58
                retinaSuffix: '@2x.$1',
59
60
                // internationalization
61
                current: "image {current} of {total}",
62
                previous: "previous",
63
                next: "next",
64
                close: "close",
65
                xhrError: "This content failed to load.",
66
                imgError: "This image failed to load.",
67
68
                // accessbility
69
                returnFocus: true,
70
                trapFocus: true,
71
72
                // callbacks
73
                onOpen: false,
74
                onLoad: false,
75
                onComplete: false,
76
                onCleanup: false,
77 0aee3c58 Assos Assos
                onClosed: false,
78
79
                rel: function() {
80
                        return this.rel;
81
                },
82
                href: function() {
83
                        // using this.href would give the absolute url, when the href may have been inteded as a selector (e.g. '#container')
84
                        return $(this).attr('href');
85
                },
86
                title: function() {
87
                        return this.title;
88
                },
89
                createImg: function() {
90
                        var img = new Image();
91
                        var attrs = $(this).data('cbox-img-attrs');
92
93
                        if (typeof attrs === 'object') {
94
                                $.each(attrs, function(key, val){
95
                                        img[key] = val;
96
                                });
97
                        }
98
99
                        return img;
100
                },
101
                createIframe: function() {
102
                        var iframe = document.createElement('iframe');
103
                        var attrs = $(this).data('cbox-iframe-attrs');
104
105
                        if (typeof attrs === 'object') {
106
                                $.each(attrs, function(key, val){
107
                                        iframe[key] = val;
108
                                });
109
                        }
110
111
                        if ('frameBorder' in iframe) {
112
                                iframe.frameBorder = 0;
113
                        }
114
                        if ('allowTransparency' in iframe) {
115
                                iframe.allowTransparency = "true";
116
                        }
117
                        iframe.name = (new Date()).getTime(); // give the iframe a unique name to prevent caching
118
                        iframe.allowFullscreen = true;
119
120
                        return iframe;
121
                }
122 85ad3d82 Assos Assos
        },
123 0aee3c58 Assos Assos
124 85ad3d82 Assos Assos
        // Abstracting the HTML and event identifiers for easy rebranding
125
        colorbox = 'colorbox',
126
        prefix = 'cbox',
127
        boxElement = prefix + 'Element',
128 0aee3c58 Assos Assos
129 85ad3d82 Assos Assos
        // Events
130
        event_open = prefix + '_open',
131
        event_load = prefix + '_load',
132
        event_complete = prefix + '_complete',
133
        event_cleanup = prefix + '_cleanup',
134
        event_closed = prefix + '_closed',
135
        event_purge = prefix + '_purge',
136
137
        // Cached jQuery Object Variables
138
        $overlay,
139
        $box,
140
        $wrap,
141
        $content,
142
        $topBorder,
143
        $leftBorder,
144
        $rightBorder,
145
        $bottomBorder,
146
        $related,
147
        $window,
148
        $loaded,
149
        $loadingBay,
150
        $loadingOverlay,
151
        $title,
152
        $current,
153
        $slideshow,
154
        $next,
155
        $prev,
156
        $close,
157
        $groupControls,
158 0aee3c58 Assos Assos
        $events = $('<a/>'), // $({}) would be prefered, but there is an issue with jQuery 1.4.2
159
160 85ad3d82 Assos Assos
        // Variables for cached values or use across multiple functions
161
        settings,
162
        interfaceHeight,
163
        interfaceWidth,
164
        loadedHeight,
165
        loadedWidth,
166
        index,
167
        photo,
168
        open,
169
        active,
170
        closing,
171
        loadingTimer,
172
        publicMethod,
173
        div = "div",
174
        requests = 0,
175
        previousCSS = {},
176
        init;
177
178
        // ****************
179
        // HELPER FUNCTIONS
180
        // ****************
181 0aee3c58 Assos Assos
182 85ad3d82 Assos Assos
        // Convenience function for creating new jQuery objects
183
        function $tag(tag, id, css) {
184
                var element = document.createElement(tag);
185
186
                if (id) {
187
                        element.id = prefix + id;
188
                }
189
190
                if (css) {
191
                        element.style.cssText = css;
192
                }
193
194
                return $(element);
195
        }
196 0aee3c58 Assos Assos
197 85ad3d82 Assos Assos
        // Get the window height using innerHeight when available to avoid an issue with iOS
198
        // http://bugs.jquery.com/ticket/6724
199
        function winheight() {
200
                return window.innerHeight ? window.innerHeight : $(window).height();
201
        }
202
203 0aee3c58 Assos Assos
        function Settings(element, options) {
204
                if (options !== Object(options)) {
205
                        options = {};
206
                }
207
208
                this.cache = {};
209
                this.el = element;
210
211
                this.value = function(key) {
212
                        var dataAttr;
213
214
                        if (this.cache[key] === undefined) {
215
                                dataAttr = $(this.el).attr('data-cbox-'+key);
216
217
                                if (dataAttr !== undefined) {
218
                                        this.cache[key] = dataAttr;
219
                                } else if (options[key] !== undefined) {
220
                                        this.cache[key] = options[key];
221
                                } else if (defaults[key] !== undefined) {
222
                                        this.cache[key] = defaults[key];
223
                                }
224
                        }
225
226
                        return this.cache[key];
227
                };
228
229
                this.get = function(key) {
230
                        var value = this.value(key);
231
                        return $.isFunction(value) ? value.call(this.el, this) : value;
232
                };
233
        }
234
235 85ad3d82 Assos Assos
        // Determine the next and previous members in a group.
236
        function getIndex(increment) {
237
                var
238
                max = $related.length,
239
                newIndex = (index + increment) % max;
240 0aee3c58 Assos Assos
241 85ad3d82 Assos Assos
                return (newIndex < 0) ? max + newIndex : newIndex;
242
        }
243
244
        // Convert '%' and 'px' values to integers
245
        function setSize(size, dimension) {
246
                return Math.round((/%/.test(size) ? ((dimension === 'x' ? $window.width() : winheight()) / 100) : 1) * parseInt(size, 10));
247
        }
248 0aee3c58 Assos Assos
249 85ad3d82 Assos Assos
        // Checks an href to see if it is a photo.
250
        // There is a force photo option (photo: true) for hrefs that cannot be matched by the regex.
251
        function isImage(settings, url) {
252 0aee3c58 Assos Assos
                return settings.get('photo') || settings.get('photoRegex').test(url);
253 85ad3d82 Assos Assos
        }
254
255
        function retinaUrl(settings, url) {
256 0aee3c58 Assos Assos
                return settings.get('retinaUrl') && window.devicePixelRatio > 1 ? url.replace(settings.get('photoRegex'), settings.get('retinaSuffix')) : url;
257 85ad3d82 Assos Assos
        }
258
259
        function trapFocus(e) {
260 0aee3c58 Assos Assos
                if ('contains' in $box[0] && !$box[0].contains(e.target) && e.target !== $overlay[0]) {
261 85ad3d82 Assos Assos
                        e.stopPropagation();
262
                        $box.focus();
263
                }
264
        }
265
266 0aee3c58 Assos Assos
        function setClass(str) {
267
                if (setClass.str !== str) {
268
                        $box.add($overlay).removeClass(setClass.str).addClass(str);
269
                        setClass.str = str;
270 85ad3d82 Assos Assos
                }
271 0aee3c58 Assos Assos
        }
272
273
        function getRelated(rel) {
274
                index = 0;
275
276
                if (rel && rel !== false && rel !== 'nofollow') {
277
                        $related = $('.' + boxElement).filter(function () {
278
                                var options = $.data(this, colorbox);
279
                                var settings = new Settings(this, options);
280
                                return (settings.get('rel') === rel);
281
                        });
282
                        index = $related.index(settings.el);
283
284
                        // Check direct calls to Colorbox.
285
                        if (index === -1) {
286
                                $related = $related.add(settings.el);
287
                                index = $related.length - 1;
288 85ad3d82 Assos Assos
                        }
289 0aee3c58 Assos Assos
                } else {
290
                        $related = $(settings.el);
291 85ad3d82 Assos Assos
                }
292
        }
293
294 0aee3c58 Assos Assos
        function trigger(event) {
295 85ad3d82 Assos Assos
                // for external use
296
                $(document).trigger(event);
297
                // for internal use
298 0aee3c58 Assos Assos
                $events.triggerHandler(event);
299 85ad3d82 Assos Assos
        }
300
301
        var slideshow = (function(){
302
                var active,
303
                        className = prefix + "Slideshow_",
304
                        click = "click." + prefix,
305
                        timeOut;
306
307
                function clear () {
308
                        clearTimeout(timeOut);
309
                }
310
311
                function set() {
312 0aee3c58 Assos Assos
                        if (settings.get('loop') || $related[index + 1]) {
313 85ad3d82 Assos Assos
                                clear();
314 0aee3c58 Assos Assos
                                timeOut = setTimeout(publicMethod.next, settings.get('slideshowSpeed'));
315 85ad3d82 Assos Assos
                        }
316
                }
317
318
                function start() {
319
                        $slideshow
320 0aee3c58 Assos Assos
                                .html(settings.get('slideshowStop'))
321 85ad3d82 Assos Assos
                                .unbind(click)
322
                                .one(click, stop);
323
324
                        $events
325
                                .bind(event_complete, set)
326
                                .bind(event_load, clear);
327
328
                        $box.removeClass(className + "off").addClass(className + "on");
329
                }
330
331
                function stop() {
332
                        clear();
333 0aee3c58 Assos Assos
334 85ad3d82 Assos Assos
                        $events
335
                                .unbind(event_complete, set)
336
                                .unbind(event_load, clear);
337
338
                        $slideshow
339 0aee3c58 Assos Assos
                                .html(settings.get('slideshowStart'))
340 85ad3d82 Assos Assos
                                .unbind(click)
341
                                .one(click, function () {
342
                                        publicMethod.next();
343
                                        start();
344
                                });
345
346
                        $box.removeClass(className + "on").addClass(className + "off");
347
                }
348
349
                function reset() {
350
                        active = false;
351
                        $slideshow.hide();
352
                        clear();
353
                        $events
354
                                .unbind(event_complete, set)
355
                                .unbind(event_load, clear);
356
                        $box.removeClass(className + "off " + className + "on");
357
                }
358
359
                return function(){
360
                        if (active) {
361 0aee3c58 Assos Assos
                                if (!settings.get('slideshow')) {
362 85ad3d82 Assos Assos
                                        $events.unbind(event_cleanup, reset);
363
                                        reset();
364
                                }
365
                        } else {
366 0aee3c58 Assos Assos
                                if (settings.get('slideshow') && $related[1]) {
367 85ad3d82 Assos Assos
                                        active = true;
368
                                        $events.one(event_cleanup, reset);
369 0aee3c58 Assos Assos
                                        if (settings.get('slideshowAuto')) {
370 85ad3d82 Assos Assos
                                                start();
371
                                        } else {
372
                                                stop();
373
                                        }
374
                                        $slideshow.show();
375
                                }
376
                        }
377
                };
378
379
        }());
380
381
382 0aee3c58 Assos Assos
        function launch(element) {
383
                var options;
384
385 85ad3d82 Assos Assos
                if (!closing) {
386
387 0aee3c58 Assos Assos
                        options = $(element).data(colorbox);
388 85ad3d82 Assos Assos
389 0aee3c58 Assos Assos
                        settings = new Settings(element, options);
390
391
                        getRelated(settings.get('rel'));
392 85ad3d82 Assos Assos
393
                        if (!open) {
394
                                open = active = true; // Prevents the page-change action from queuing up if the visitor holds down the left or right keys.
395 0aee3c58 Assos Assos
396
                                setClass(settings.get('className'));
397
398 85ad3d82 Assos Assos
                                // Show colorbox so the sizes can be calculated in older versions of jQuery
399 0aee3c58 Assos Assos
                                $box.css({visibility:'hidden', display:'block', opacity:''});
400
401
                                $loaded = $tag(div, 'LoadedContent', 'width:0; height:0; overflow:hidden; visibility:hidden');
402 85ad3d82 Assos Assos
                                $content.css({width:'', height:''}).append($loaded);
403
404
                                // Cache values needed for size calculations
405
                                interfaceHeight = $topBorder.height() + $bottomBorder.height() + $content.outerHeight(true) - $content.height();
406
                                interfaceWidth = $leftBorder.width() + $rightBorder.width() + $content.outerWidth(true) - $content.width();
407
                                loadedHeight = $loaded.outerHeight(true);
408
                                loadedWidth = $loaded.outerWidth(true);
409
410
                                // Opens inital empty Colorbox prior to content being loaded.
411 0aee3c58 Assos Assos
                                var initialWidth = setSize(settings.get('initialWidth'), 'x');
412
                                var initialHeight = setSize(settings.get('initialHeight'), 'y');
413
                                var maxWidth = settings.get('maxWidth');
414
                                var maxHeight = settings.get('maxHeight');
415
416
                                settings.w = (maxWidth !== false ? Math.min(initialWidth, setSize(maxWidth, 'x')) : initialWidth) - loadedWidth - interfaceWidth;
417
                                settings.h = (maxHeight !== false ? Math.min(initialHeight, setSize(maxHeight, 'y')) : initialHeight) - loadedHeight - interfaceHeight;
418
419 85ad3d82 Assos Assos
                                $loaded.css({width:'', height:settings.h});
420
                                publicMethod.position();
421
422 0aee3c58 Assos Assos
                                trigger(event_open);
423
                                settings.get('onOpen');
424
425 85ad3d82 Assos Assos
                                $groupControls.add($title).hide();
426
427
                                $box.focus();
428 0aee3c58 Assos Assos
429
                                if (settings.get('trapFocus')) {
430 85ad3d82 Assos Assos
                                        // Confine focus to the modal
431
                                        // Uses event capturing that is not supported in IE8-
432
                                        if (document.addEventListener) {
433
434
                                                document.addEventListener('focus', trapFocus, true);
435 0aee3c58 Assos Assos
436 85ad3d82 Assos Assos
                                                $events.one(event_closed, function () {
437
                                                        document.removeEventListener('focus', trapFocus, true);
438
                                                });
439
                                        }
440
                                }
441
442
                                // Return focus on closing
443 0aee3c58 Assos Assos
                                if (settings.get('returnFocus')) {
444 85ad3d82 Assos Assos
                                        $events.one(event_closed, function () {
445 0aee3c58 Assos Assos
                                                $(settings.el).focus();
446 85ad3d82 Assos Assos
                                        });
447
                                }
448
                        }
449 0aee3c58 Assos Assos
450
                        var opacity = parseFloat(settings.get('opacity'));
451
                        $overlay.css({
452
                                opacity: opacity === opacity ? opacity : '',
453
                                cursor: settings.get('overlayClose') ? 'pointer' : '',
454
                                visibility: 'visible'
455
                        }).show();
456
457
                        if (settings.get('closeButton')) {
458
                                $close.html(settings.get('close')).appendTo($content);
459
                        } else {
460
                                $close.appendTo('<div/>'); // replace with .detach() when dropping jQuery < 1.4
461
                        }
462
463 85ad3d82 Assos Assos
                        load();
464
                }
465
        }
466
467
        // Colorbox's markup needs to be added to the DOM prior to being called
468
        // so that the browser will go ahead and load the CSS background images.
469
        function appendHTML() {
470 0aee3c58 Assos Assos
                if (!$box) {
471 85ad3d82 Assos Assos
                        init = false;
472
                        $window = $(window);
473
                        $box = $tag(div).attr({
474
                                id: colorbox,
475
                                'class': $.support.opacity === false ? prefix + 'IE' : '', // class for optional IE8 & lower targeted CSS.
476
                                role: 'dialog',
477
                                tabindex: '-1'
478
                        }).hide();
479
                        $overlay = $tag(div, "Overlay").hide();
480
                        $loadingOverlay = $([$tag(div, "LoadingOverlay")[0],$tag(div, "LoadingGraphic")[0]]);
481
                        $wrap = $tag(div, "Wrapper");
482
                        $content = $tag(div, "Content").append(
483
                                $title = $tag(div, "Title"),
484
                                $current = $tag(div, "Current"),
485
                                $prev = $('<button type="button"/>').attr({id:prefix+'Previous'}),
486
                                $next = $('<button type="button"/>').attr({id:prefix+'Next'}),
487
                                $slideshow = $tag('button', "Slideshow"),
488
                                $loadingOverlay
489
                        );
490
491
                        $close = $('<button type="button"/>').attr({id:prefix+'Close'});
492 0aee3c58 Assos Assos
493 85ad3d82 Assos Assos
                        $wrap.append( // The 3x3 Grid that makes up Colorbox
494
                                $tag(div).append(
495
                                        $tag(div, "TopLeft"),
496
                                        $topBorder = $tag(div, "TopCenter"),
497
                                        $tag(div, "TopRight")
498
                                ),
499
                                $tag(div, false, 'clear:left').append(
500
                                        $leftBorder = $tag(div, "MiddleLeft"),
501
                                        $content,
502
                                        $rightBorder = $tag(div, "MiddleRight")
503
                                ),
504
                                $tag(div, false, 'clear:left').append(
505
                                        $tag(div, "BottomLeft"),
506
                                        $bottomBorder = $tag(div, "BottomCenter"),
507
                                        $tag(div, "BottomRight")
508
                                )
509
                        ).find('div div').css({'float': 'left'});
510
511 0aee3c58 Assos Assos
                        $loadingBay = $tag(div, false, 'position:absolute; width:9999px; visibility:hidden; display:none; max-width:none;');
512
513
                        $groupControls = $next.add($prev).add($current).add($slideshow);
514
                }
515
                if (document.body && !$box.parent().length) {
516 85ad3d82 Assos Assos
                        $(document.body).append($overlay, $box.append($wrap, $loadingBay));
517
                }
518
        }
519
520
        // Add Colorbox's event bindings
521
        function addBindings() {
522
                function clickHandler(e) {
523
                        // ignore non-left-mouse-clicks and clicks modified with ctrl / command, shift, or alt.
524
                        // See: http://jacklmoore.com/notes/click-events/
525
                        if (!(e.which > 1 || e.shiftKey || e.altKey || e.metaKey || e.ctrlKey)) {
526
                                e.preventDefault();
527
                                launch(this);
528
                        }
529
                }
530
531
                if ($box) {
532
                        if (!init) {
533
                                init = true;
534
535
                                // Anonymous functions here keep the public method from being cached, thereby allowing them to be redefined on the fly.
536
                                $next.click(function () {
537
                                        publicMethod.next();
538
                                });
539
                                $prev.click(function () {
540
                                        publicMethod.prev();
541
                                });
542
                                $close.click(function () {
543
                                        publicMethod.close();
544
                                });
545
                                $overlay.click(function () {
546 0aee3c58 Assos Assos
                                        if (settings.get('overlayClose')) {
547 85ad3d82 Assos Assos
                                                publicMethod.close();
548
                                        }
549
                                });
550 0aee3c58 Assos Assos
551 85ad3d82 Assos Assos
                                // Key Bindings
552
                                $(document).bind('keydown.' + prefix, function (e) {
553
                                        var key = e.keyCode;
554 0aee3c58 Assos Assos
                                        if (open && settings.get('escKey') && key === 27) {
555 85ad3d82 Assos Assos
                                                e.preventDefault();
556
                                                publicMethod.close();
557
                                        }
558 0aee3c58 Assos Assos
                                        if (open && settings.get('arrowKey') && $related[1] && !e.altKey) {
559 85ad3d82 Assos Assos
                                                if (key === 37) {
560
                                                        e.preventDefault();
561
                                                        $prev.click();
562
                                                } else if (key === 39) {
563
                                                        e.preventDefault();
564
                                                        $next.click();
565
                                                }
566
                                        }
567
                                });
568
569
                                if ($.isFunction($.fn.on)) {
570
                                        // For jQuery 1.7+
571
                                        $(document).on('click.'+prefix, '.'+boxElement, clickHandler);
572
                                } else {
573
                                        // For jQuery 1.3.x -> 1.6.x
574
                                        // This code is never reached in jQuery 1.9, so do not contact me about 'live' being removed.
575
                                        // This is not here for jQuery 1.9, it's here for legacy users.
576
                                        $('.'+boxElement).live('click.'+prefix, clickHandler);
577
                                }
578
                        }
579
                        return true;
580
                }
581
                return false;
582
        }
583
584
        // Don't do anything if Colorbox already exists.
585 0aee3c58 Assos Assos
        if ($[colorbox]) {
586 85ad3d82 Assos Assos
                return;
587
        }
588
589
        // Append the HTML when the DOM loads
590
        $(appendHTML);
591
592
593
        // ****************
594
        // PUBLIC FUNCTIONS
595
        // Usage format: $.colorbox.close();
596
        // Usage from within an iframe: parent.jQuery.colorbox.close();
597
        // ****************
598 0aee3c58 Assos Assos
599 85ad3d82 Assos Assos
        publicMethod = $.fn[colorbox] = $[colorbox] = function (options, callback) {
600 0aee3c58 Assos Assos
                var settings;
601
                var $obj = this;
602
603 85ad3d82 Assos Assos
                options = options || {};
604 0aee3c58 Assos Assos
605
                if ($.isFunction($obj)) { // assume a call to $.colorbox
606
                        $obj = $('<a/>');
607
                        options.open = true;
608
                }
609
610
                if (!$obj[0]) { // colorbox being applied to empty collection
611
                        return $obj;
612
                }
613
614 85ad3d82 Assos Assos
                appendHTML();
615
616
                if (addBindings()) {
617 0aee3c58 Assos Assos
618 85ad3d82 Assos Assos
                        if (callback) {
619
                                options.onComplete = callback;
620
                        }
621 0aee3c58 Assos Assos
622
                        $obj.each(function () {
623
                                var old = $.data(this, colorbox) || {};
624
                                $.data(this, colorbox, $.extend(old, options));
625 85ad3d82 Assos Assos
                        }).addClass(boxElement);
626 0aee3c58 Assos Assos
627
                        settings = new Settings($obj[0], options);
628
629
                        if (settings.get('open')) {
630
                                launch($obj[0]);
631 85ad3d82 Assos Assos
                        }
632
                }
633 0aee3c58 Assos Assos
634
                return $obj;
635 85ad3d82 Assos Assos
        };
636
637
        publicMethod.position = function (speed, loadedCallback) {
638
                var
639
                css,
640
                top = 0,
641
                left = 0,
642
                offset = $box.offset(),
643
                scrollTop,
644
                scrollLeft;
645 0aee3c58 Assos Assos
646 85ad3d82 Assos Assos
                $window.unbind('resize.' + prefix);
647
648
                // remove the modal so that it doesn't influence the document width/height
649
                $box.css({top: -9e4, left: -9e4});
650
651
                scrollTop = $window.scrollTop();
652
                scrollLeft = $window.scrollLeft();
653
654 0aee3c58 Assos Assos
                if (settings.get('fixed')) {
655 85ad3d82 Assos Assos
                        offset.top -= scrollTop;
656
                        offset.left -= scrollLeft;
657
                        $box.css({position: 'fixed'});
658
                } else {
659
                        top = scrollTop;
660
                        left = scrollLeft;
661
                        $box.css({position: 'absolute'});
662
                }
663
664
                // keeps the top and left positions within the browser's viewport.
665 0aee3c58 Assos Assos
                if (settings.get('right') !== false) {
666
                        left += Math.max($window.width() - settings.w - loadedWidth - interfaceWidth - setSize(settings.get('right'), 'x'), 0);
667
                } else if (settings.get('left') !== false) {
668
                        left += setSize(settings.get('left'), 'x');
669 85ad3d82 Assos Assos
                } else {
670
                        left += Math.round(Math.max($window.width() - settings.w - loadedWidth - interfaceWidth, 0) / 2);
671
                }
672 0aee3c58 Assos Assos
673
                if (settings.get('bottom') !== false) {
674
                        top += Math.max(winheight() - settings.h - loadedHeight - interfaceHeight - setSize(settings.get('bottom'), 'y'), 0);
675
                } else if (settings.get('top') !== false) {
676
                        top += setSize(settings.get('top'), 'y');
677 85ad3d82 Assos Assos
                } else {
678
                        top += Math.round(Math.max(winheight() - settings.h - loadedHeight - interfaceHeight, 0) / 2);
679
                }
680
681
                $box.css({top: offset.top, left: offset.left, visibility:'visible'});
682 0aee3c58 Assos Assos
683 85ad3d82 Assos Assos
                // this gives the wrapper plenty of breathing room so it's floated contents can move around smoothly,
684
                // but it has to be shrank down around the size of div#colorbox when it's done.  If not,
685
                // it can invoke an obscure IE bug when using iframes.
686
                $wrap[0].style.width = $wrap[0].style.height = "9999px";
687 0aee3c58 Assos Assos
688 85ad3d82 Assos Assos
                function modalDimensions() {
689
                        $topBorder[0].style.width = $bottomBorder[0].style.width = $content[0].style.width = (parseInt($box[0].style.width,10) - interfaceWidth)+'px';
690
                        $content[0].style.height = $leftBorder[0].style.height = $rightBorder[0].style.height = (parseInt($box[0].style.height,10) - interfaceHeight)+'px';
691
                }
692
693
                css = {width: settings.w + loadedWidth + interfaceWidth, height: settings.h + loadedHeight + interfaceHeight, top: top, left: left};
694
695
                // setting the speed to 0 if the content hasn't changed size or position
696
                if (speed) {
697
                        var tempSpeed = 0;
698
                        $.each(css, function(i){
699
                                if (css[i] !== previousCSS[i]) {
700
                                        tempSpeed = speed;
701
                                        return;
702
                                }
703
                        });
704
                        speed = tempSpeed;
705
                }
706
707
                previousCSS = css;
708
709
                if (!speed) {
710
                        $box.css(css);
711
                }
712
713
                $box.dequeue().animate(css, {
714
                        duration: speed || 0,
715
                        complete: function () {
716
                                modalDimensions();
717 0aee3c58 Assos Assos
718 85ad3d82 Assos Assos
                                active = false;
719 0aee3c58 Assos Assos
720 85ad3d82 Assos Assos
                                // shrink the wrapper down to exactly the size of colorbox to avoid a bug in IE's iframe implementation.
721
                                $wrap[0].style.width = (settings.w + loadedWidth + interfaceWidth) + "px";
722
                                $wrap[0].style.height = (settings.h + loadedHeight + interfaceHeight) + "px";
723 0aee3c58 Assos Assos
724
                                if (settings.get('reposition')) {
725 85ad3d82 Assos Assos
                                        setTimeout(function () {  // small delay before binding onresize due to an IE8 bug.
726
                                                $window.bind('resize.' + prefix, publicMethod.position);
727
                                        }, 1);
728
                                }
729
730 0aee3c58 Assos Assos
                                if ($.isFunction(loadedCallback)) {
731 85ad3d82 Assos Assos
                                        loadedCallback();
732
                                }
733
                        },
734
                        step: modalDimensions
735
                });
736
        };
737
738
        publicMethod.resize = function (options) {
739
                var scrolltop;
740 0aee3c58 Assos Assos
741 85ad3d82 Assos Assos
                if (open) {
742
                        options = options || {};
743 0aee3c58 Assos Assos
744 85ad3d82 Assos Assos
                        if (options.width) {
745
                                settings.w = setSize(options.width, 'x') - loadedWidth - interfaceWidth;
746
                        }
747
748
                        if (options.innerWidth) {
749
                                settings.w = setSize(options.innerWidth, 'x');
750
                        }
751
752
                        $loaded.css({width: settings.w});
753 0aee3c58 Assos Assos
754 85ad3d82 Assos Assos
                        if (options.height) {
755
                                settings.h = setSize(options.height, 'y') - loadedHeight - interfaceHeight;
756
                        }
757
758
                        if (options.innerHeight) {
759
                                settings.h = setSize(options.innerHeight, 'y');
760
                        }
761
762
                        if (!options.innerHeight && !options.height) {
763
                                scrolltop = $loaded.scrollTop();
764
                                $loaded.css({height: "auto"});
765
                                settings.h = $loaded.height();
766
                        }
767
768
                        $loaded.css({height: settings.h});
769
770
                        if(scrolltop) {
771
                                $loaded.scrollTop(scrolltop);
772
                        }
773 0aee3c58 Assos Assos
774
                        publicMethod.position(settings.get('transition') === "none" ? 0 : settings.get('speed'));
775 85ad3d82 Assos Assos
                }
776
        };
777
778
        publicMethod.prep = function (object) {
779
                if (!open) {
780
                        return;
781
                }
782
783 0aee3c58 Assos Assos
                var callback, speed = settings.get('transition') === "none" ? 0 : settings.get('speed');
784
785
                $loaded.remove();
786 85ad3d82 Assos Assos
787
                $loaded = $tag(div, 'LoadedContent').append(object);
788 0aee3c58 Assos Assos
789 85ad3d82 Assos Assos
                function getWidth() {
790
                        settings.w = settings.w || $loaded.width();
791
                        settings.w = settings.mw && settings.mw < settings.w ? settings.mw : settings.w;
792
                        return settings.w;
793
                }
794
                function getHeight() {
795
                        settings.h = settings.h || $loaded.height();
796
                        settings.h = settings.mh && settings.mh < settings.h ? settings.mh : settings.h;
797
                        return settings.h;
798
                }
799 0aee3c58 Assos Assos
800 85ad3d82 Assos Assos
                $loaded.hide()
801
                .appendTo($loadingBay.show())// content has to be appended to the DOM for accurate size calculations.
802 0aee3c58 Assos Assos
                .css({width: getWidth(), overflow: settings.get('scrolling') ? 'auto' : 'hidden'})
803 85ad3d82 Assos Assos
                .css({height: getHeight()})// sets the height independently from the width in case the new width influences the value of height.
804
                .prependTo($content);
805 0aee3c58 Assos Assos
806 85ad3d82 Assos Assos
                $loadingBay.hide();
807 0aee3c58 Assos Assos
808 85ad3d82 Assos Assos
                // floating the IMG removes the bottom line-height and fixed a problem where IE miscalculates the width of the parent element as 100% of the document width.
809 0aee3c58 Assos Assos
810 85ad3d82 Assos Assos
                $(photo).css({'float': 'none'});
811
812 0aee3c58 Assos Assos
                setClass(settings.get('className'));
813
814 85ad3d82 Assos Assos
                callback = function () {
815
                        var total = $related.length,
816
                                iframe,
817
                                complete;
818 0aee3c58 Assos Assos
819 85ad3d82 Assos Assos
                        if (!open) {
820
                                return;
821
                        }
822 0aee3c58 Assos Assos
823
                        function removeFilter() { // Needed for IE8 in versions of jQuery prior to 1.7.2
824 85ad3d82 Assos Assos
                                if ($.support.opacity === false) {
825
                                        $box[0].style.removeAttribute('filter');
826
                                }
827
                        }
828 0aee3c58 Assos Assos
829 85ad3d82 Assos Assos
                        complete = function () {
830
                                clearTimeout(loadingTimer);
831
                                $loadingOverlay.hide();
832 0aee3c58 Assos Assos
                                trigger(event_complete);
833
                                settings.get('onComplete');
834 85ad3d82 Assos Assos
                        };
835
836 0aee3c58 Assos Assos
837
                        $title.html(settings.get('title')).show();
838
                        $loaded.show();
839
840 85ad3d82 Assos Assos
                        if (total > 1) { // handle grouping
841 0aee3c58 Assos Assos
                                if (typeof settings.get('current') === "string") {
842
                                        $current.html(settings.get('current').replace('{current}', index + 1).replace('{total}', total)).show();
843 85ad3d82 Assos Assos
                                }
844 0aee3c58 Assos Assos
845
                                $next[(settings.get('loop') || index < total - 1) ? "show" : "hide"]().html(settings.get('next'));
846
                                $prev[(settings.get('loop') || index) ? "show" : "hide"]().html(settings.get('previous'));
847
848 85ad3d82 Assos Assos
                                slideshow();
849 0aee3c58 Assos Assos
850 85ad3d82 Assos Assos
                                // Preloads images within a rel group
851 0aee3c58 Assos Assos
                                if (settings.get('preloading')) {
852 85ad3d82 Assos Assos
                                        $.each([getIndex(-1), getIndex(1)], function(){
853 0aee3c58 Assos Assos
                                                var img,
854 85ad3d82 Assos Assos
                                                        i = $related[this],
855 0aee3c58 Assos Assos
                                                        settings = new Settings(i, $.data(i, colorbox)),
856
                                                        src = settings.get('href');
857 85ad3d82 Assos Assos
858 0aee3c58 Assos Assos
                                                if (src && isImage(settings, src)) {
859
                                                        src = retinaUrl(settings, src);
860 85ad3d82 Assos Assos
                                                        img = document.createElement('img');
861
                                                        img.src = src;
862
                                                }
863
                                        });
864
                                }
865
                        } else {
866
                                $groupControls.hide();
867
                        }
868
869 0aee3c58 Assos Assos
                        if (settings.get('iframe')) {
870
871
                                iframe = settings.get('createIframe');
872
873
                                if (!settings.get('scrolling')) {
874 85ad3d82 Assos Assos
                                        iframe.scrolling = "no";
875
                                }
876 0aee3c58 Assos Assos
877 85ad3d82 Assos Assos
                                $(iframe)
878
                                        .attr({
879 0aee3c58 Assos Assos
                                                src: settings.get('href'),
880
                                                'class': prefix + 'Iframe'
881 85ad3d82 Assos Assos
                                        })
882
                                        .one('load', complete)
883
                                        .appendTo($loaded);
884 0aee3c58 Assos Assos
885 85ad3d82 Assos Assos
                                $events.one(event_purge, function () {
886
                                        iframe.src = "//about:blank";
887
                                });
888
889 0aee3c58 Assos Assos
                                if (settings.get('fastIframe')) {
890 85ad3d82 Assos Assos
                                        $(iframe).trigger('load');
891
                                }
892
                        } else {
893
                                complete();
894
                        }
895 0aee3c58 Assos Assos
896
                        if (settings.get('transition') === 'fade') {
897 85ad3d82 Assos Assos
                                $box.fadeTo(speed, 1, removeFilter);
898
                        } else {
899
                                removeFilter();
900
                        }
901
                };
902 0aee3c58 Assos Assos
903
                if (settings.get('transition') === 'fade') {
904 85ad3d82 Assos Assos
                        $box.fadeTo(speed, 0, function () {
905
                                publicMethod.position(0, callback);
906
                        });
907
                } else {
908
                        publicMethod.position(speed, callback);
909
                }
910
        };
911
912
        function load () {
913
                var href, setResize, prep = publicMethod.prep, $inline, request = ++requests;
914 0aee3c58 Assos Assos
915 85ad3d82 Assos Assos
                active = true;
916 0aee3c58 Assos Assos
917 85ad3d82 Assos Assos
                photo = false;
918 0aee3c58 Assos Assos
919 85ad3d82 Assos Assos
                trigger(event_purge);
920 0aee3c58 Assos Assos
                trigger(event_load);
921
                settings.get('onLoad');
922
923
                settings.h = settings.get('height') ?
924
                                setSize(settings.get('height'), 'y') - loadedHeight - interfaceHeight :
925
                                settings.get('innerHeight') && setSize(settings.get('innerHeight'), 'y');
926
927
                settings.w = settings.get('width') ?
928
                                setSize(settings.get('width'), 'x') - loadedWidth - interfaceWidth :
929
                                settings.get('innerWidth') && setSize(settings.get('innerWidth'), 'x');
930
931 85ad3d82 Assos Assos
                // Sets the minimum dimensions for use in image scaling
932
                settings.mw = settings.w;
933
                settings.mh = settings.h;
934 0aee3c58 Assos Assos
935 85ad3d82 Assos Assos
                // Re-evaluate the minimum width and height based on maxWidth and maxHeight values.
936
                // If the width or height exceed the maxWidth or maxHeight, use the maximum values instead.
937 0aee3c58 Assos Assos
                if (settings.get('maxWidth')) {
938
                        settings.mw = setSize(settings.get('maxWidth'), 'x') - loadedWidth - interfaceWidth;
939 85ad3d82 Assos Assos
                        settings.mw = settings.w && settings.w < settings.mw ? settings.w : settings.mw;
940
                }
941 0aee3c58 Assos Assos
                if (settings.get('maxHeight')) {
942
                        settings.mh = setSize(settings.get('maxHeight'), 'y') - loadedHeight - interfaceHeight;
943 85ad3d82 Assos Assos
                        settings.mh = settings.h && settings.h < settings.mh ? settings.h : settings.mh;
944
                }
945 0aee3c58 Assos Assos
946
                href = settings.get('href');
947
948 85ad3d82 Assos Assos
                loadingTimer = setTimeout(function () {
949
                        $loadingOverlay.show();
950
                }, 100);
951 0aee3c58 Assos Assos
952
                if (settings.get('inline')) {
953
                        var $target = $(href);
954 85ad3d82 Assos Assos
                        // Inserts an empty placeholder where inline content is being pulled from.
955
                        // An event is bound to put inline content back when Colorbox closes or loads new content.
956 0aee3c58 Assos Assos
                        $inline = $('<div>').hide().insertBefore($target);
957 85ad3d82 Assos Assos
958
                        $events.one(event_purge, function () {
959 0aee3c58 Assos Assos
                                $inline.replaceWith($target);
960 85ad3d82 Assos Assos
                        });
961
962 0aee3c58 Assos Assos
                        prep($target);
963
                } else if (settings.get('iframe')) {
964 85ad3d82 Assos Assos
                        // IFrame element won't be added to the DOM until it is ready to be displayed,
965
                        // to avoid problems with DOM-ready JS that might be trying to run in that iframe.
966
                        prep(" ");
967 0aee3c58 Assos Assos
                } else if (settings.get('html')) {
968
                        prep(settings.get('html'));
969 85ad3d82 Assos Assos
                } else if (isImage(settings, href)) {
970
971
                        href = retinaUrl(settings, href);
972
973 0aee3c58 Assos Assos
                        photo = settings.get('createImg');
974 85ad3d82 Assos Assos
975
                        $(photo)
976
                        .addClass(prefix + 'Photo')
977 0aee3c58 Assos Assos
                        .bind('error.'+prefix,function () {
978
                                prep($tag(div, 'Error').html(settings.get('imgError')));
979 85ad3d82 Assos Assos
                        })
980
                        .one('load', function () {
981
                                if (request !== requests) {
982
                                        return;
983
                                }
984
985 0aee3c58 Assos Assos
                                // A small pause because some browsers will occassionaly report a
986
                                // img.width and img.height of zero immediately after the img.onload fires
987
                                setTimeout(function(){
988
                                        var percent;
989 85ad3d82 Assos Assos
990 0aee3c58 Assos Assos
                                        if (settings.get('retinaImage') && window.devicePixelRatio > 1) {
991
                                                photo.height = photo.height / window.devicePixelRatio;
992
                                                photo.width = photo.width / window.devicePixelRatio;
993
                                        }
994 85ad3d82 Assos Assos
995 0aee3c58 Assos Assos
                                        if (settings.get('scalePhotos')) {
996
                                                setResize = function () {
997
                                                        photo.height -= photo.height * percent;
998
                                                        photo.width -= photo.width * percent;
999
                                                };
1000
                                                if (settings.mw && photo.width > settings.mw) {
1001
                                                        percent = (photo.width - settings.mw) / photo.width;
1002
                                                        setResize();
1003
                                                }
1004
                                                if (settings.mh && photo.height > settings.mh) {
1005
                                                        percent = (photo.height - settings.mh) / photo.height;
1006
                                                        setResize();
1007
                                                }
1008 85ad3d82 Assos Assos
                                        }
1009 0aee3c58 Assos Assos
1010
                                        if (settings.h) {
1011
                                                photo.style.marginTop = Math.max(settings.mh - photo.height, 0) / 2 + 'px';
1012 85ad3d82 Assos Assos
                                        }
1013
1014 0aee3c58 Assos Assos
                                        if ($related[1] && (settings.get('loop') || $related[index + 1])) {
1015
                                                photo.style.cursor = 'pointer';
1016
1017
                                                $(photo).bind('click.'+prefix, function () {
1018
                                                        publicMethod.next();
1019
                                                });
1020
                                        }
1021 85ad3d82 Assos Assos
1022 0aee3c58 Assos Assos
                                        photo.style.width = photo.width + 'px';
1023
                                        photo.style.height = photo.height + 'px';
1024 85ad3d82 Assos Assos
                                        prep(photo);
1025
                                }, 1);
1026
                        });
1027 0aee3c58 Assos Assos
1028
                        photo.src = href;
1029
1030 85ad3d82 Assos Assos
                } else if (href) {
1031 0aee3c58 Assos Assos
                        $loadingBay.load(href, settings.get('data'), function (data, status) {
1032 85ad3d82 Assos Assos
                                if (request === requests) {
1033 0aee3c58 Assos Assos
                                        prep(status === 'error' ? $tag(div, 'Error').html(settings.get('xhrError')) : $(this).contents());
1034 85ad3d82 Assos Assos
                                }
1035
                        });
1036
                }
1037
        }
1038 0aee3c58 Assos Assos
1039 85ad3d82 Assos Assos
        // Navigates to the next page/image in a set.
1040
        publicMethod.next = function () {
1041 0aee3c58 Assos Assos
                if (!active && $related[1] && (settings.get('loop') || $related[index + 1])) {
1042 85ad3d82 Assos Assos
                        index = getIndex(1);
1043
                        launch($related[index]);
1044
                }
1045
        };
1046 0aee3c58 Assos Assos
1047 85ad3d82 Assos Assos
        publicMethod.prev = function () {
1048 0aee3c58 Assos Assos
                if (!active && $related[1] && (settings.get('loop') || index)) {
1049 85ad3d82 Assos Assos
                        index = getIndex(-1);
1050
                        launch($related[index]);
1051
                }
1052
        };
1053
1054
        // Note: to use this within an iframe use the following format: parent.jQuery.colorbox.close();
1055
        publicMethod.close = function () {
1056
                if (open && !closing) {
1057 0aee3c58 Assos Assos
1058 85ad3d82 Assos Assos
                        closing = true;
1059
                        open = false;
1060 0aee3c58 Assos Assos
                        trigger(event_cleanup);
1061
                        settings.get('onCleanup');
1062 85ad3d82 Assos Assos
                        $window.unbind('.' + prefix);
1063 0aee3c58 Assos Assos
                        $overlay.fadeTo(settings.get('fadeOut') || 0, 0);
1064
1065
                        $box.stop().fadeTo(settings.get('fadeOut') || 0, 0, function () {
1066
                                $box.hide();
1067
                                $overlay.hide();
1068 85ad3d82 Assos Assos
                                trigger(event_purge);
1069 0aee3c58 Assos Assos
                                $loaded.remove();
1070
1071 85ad3d82 Assos Assos
                                setTimeout(function () {
1072
                                        closing = false;
1073 0aee3c58 Assos Assos
                                        trigger(event_closed);
1074
                                        settings.get('onClosed');
1075 85ad3d82 Assos Assos
                                }, 1);
1076
                        });
1077
                }
1078
        };
1079
1080
        // Removes changes Colorbox made to the document, but does not remove the plugin.
1081
        publicMethod.remove = function () {
1082
                if (!$box) { return; }
1083
1084
                $box.stop();
1085 0aee3c58 Assos Assos
                $[colorbox].close();
1086
                $box.stop(false, true).remove();
1087 85ad3d82 Assos Assos
                $overlay.remove();
1088
                closing = false;
1089
                $box = null;
1090
                $('.' + boxElement)
1091
                        .removeData(colorbox)
1092
                        .removeClass(boxElement);
1093
1094 0aee3c58 Assos Assos
                $(document).unbind('click.'+prefix).unbind('keydown.'+prefix);
1095 85ad3d82 Assos Assos
        };
1096
1097
        // A method for fetching the current element Colorbox is referencing.
1098
        // returns a jQuery object.
1099
        publicMethod.element = function () {
1100 0aee3c58 Assos Assos
                return $(settings.el);
1101 85ad3d82 Assos Assos
        };
1102
1103
        publicMethod.settings = defaults;
1104
1105
}(jQuery, document, window));