PageSourceSearch

https://iii-iii-iii.org/wp-content/plugins/photo-image-gallery/assets/js/elastic_grid.js?ver=1.0.0

js iii-iii-iii.org collected 2026-10-08 19:42:16 UTC 33,380 bytes, 865 lines download raw bytes

1/*
2 * This is a fork of jQuery Elastic Grid library which is licensed under the MIT license
3 *
4 * latest version and complete README available on Github:
5 * https://github.com/louisremi/jquery-smartresize/blob/master/jquery.debouncedresize.js
6 */
7var $event = jQuery.event,
8    $special,
9    resizeTimeout;
10
11$special = $event.special.debouncedresize = {
12    setup: function () {
13        jQuery(this).on("resize", $special.handler);
14    },
15    teardown: function () {
16        jQuery(this).off("resize", $special.handler);
17    },
18    handler: function (event, execAsap) {
19
20        var previewWrapperWidth = jQuery('.og-fullimg').width();
21        jQuery('.og-fullimg').find('iframe:first').height(previewWrapperWidth * 9 / 16);
22        // Save the context
23        /*var context = this,
24         args = arguments,
25         dispatch = function() {
26         // set correct event type
27         event.type = "debouncedresize";
28         $event.dispatch.apply( context, args );
29         };
30
31         if ( resizeTimeout ) {
32         clearTimeout( resizeTimeout );
33         }
34
35         execAsap ?
36         dispatch() :
37         resizeTimeout = setTimeout( dispatch, $special.threshold );*/
38        jQuery('.og-expander').height('auto');
39        var ogExpanderHeight = jQuery('.og-expander').height();
40        var elementHeight = jQuery('.og-expanded').find('a:first').height();
41        var bigElementHeigh = ogExpanderHeight + elementHeight + parseInt(elements_margin);
42        jQuery('.og-expanded').height(bigElementHeigh);
43    },
44    threshold: 250
45};
46
47// ======================= imagesLoaded Plugin ===============================
48// https://github.com/desandro/$
49
50// jQuery('#my-container').imagesLoaded(myFunction)
51// execute a callback when all images have loaded.
52// needed because .load() doesn't work on cached images
53
54// callback function gets image collection as argument
55//  this is the container
56
57// original: MIT license. Paul Irish. 2010.
58// contributors: Oren Solomianik, David DeSandro, Yiannis Chatzikonstantinou
59
60// blank image data-uri bypasses webkit log warning (thx doug jones)
61var BLANK = 'data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///ywAAAAAAQABAAACAUwAOw==';
62
63jQuery.fn.imagesLoaded = function (callback) {
64    var $this = this,
65        deferred = jQuery.isFunction(jQuery.Deferred) ? jQuery.Deferred() : 0,
66        hasNotify = jQuery.isFunction(deferred.notify),
67        $images = $this.find('img').add($this.filter('img')),
68        loaded = [],
69        proper = [],
70        broken = [];
71
72    // Register deferred callbacks
73    if (jQuery.isPlainObject(callback)) {
74        jQuery.each(callback, function (key, value) {
75            if (key === 'callback') {
76                callback = value;
77            } else if (deferred) {
78                deferred[key](value);
79            }
80        });
81    }
82
83    function doneLoading() {
84        var $proper = jQuery(proper),
85            $broken = jQuery(broken);
86
87        if (deferred) {
88            if (broken.length) {
89                deferred.reject($images, $proper, $broken);
90            } else {
91                deferred.resolve($images);
92            }
93        }
94
95        if (jQuery.isFunction(callback)) {
96            callback.call($this, $images, $proper, $broken);
97        }
98    }
99
100    function imgLoaded(img, isBroken) {
101        // don't proceed if BLANK image, or image is already loaded
102        if (img.src === BLANK || jQuery.inArray(img, loaded) !== -1) {
103            return;
104        }
105
106        // store element in loaded images array
107        loaded.push(img);
108
109        // keep track of broken and properly loaded images
110        if (isBroken) {
111            broken.push(img);
112        } else {
113            proper.push(img);
114        }
115
116        // cache image and its state for future calls
117        jQuery.data(img, 'imagesLoaded', {isBroken: isBroken, src: img.src});
118
119        // trigger deferred progress method if present
120        if (hasNotify) {
121            deferred.notifyWith(jQuery(img), [isBroken, $images, jQuery(proper), jQuery(broken)]);
122        }
123
124        // call doneLoading and clean listeners if all images are loaded
125        if ($images.length === loaded.length) {
126            setTimeout(doneLoading);
127            $images.unbind('.imagesLoaded');
128        }
129    }
130
131    // if no images, trigger immediately
132    if (!$images.length) {
133        doneLoading();
134    } else {
135        $images.bind('load.imagesLoaded error.imagesLoaded', function (event) {
136            // trigger imgLoaded
137            imgLoaded(event.target, event.type === 'error');
138        }).each(function (i, el) {
139            var src = el.src;
140
141            // find out if this image has been already checked for status
142            // if it was, and src has not changed, call imgLoaded on it
143            var cached = jQuery.data(el, 'imagesLoaded');
144            if (cached && cached.src === src) {
145                imgLoaded(el, cached.isBroken);
146                return;
147            }
148
149            // if complete is true and browser supports natural sizes, try
150            // to check for image status manually
151            if (el.complete && el.naturalWidth !== undefined) {
152                imgLoaded(el, el.naturalWidth === 0 || el.naturalHeight === 0);
153                return;
154            }
155
156            // cached images don't fire load sometimes, so we reset src, but only when
157            // dealing with IE, or image is complete (loaded) and failed manual check
158            // webkit hack from http://groups.google.com/group/jquery-dev/browse_thread/thread/eee6ab7b2da50e1f
159            if (el.readyState || el.complete) {
160                el.src = BLANK;
161                el.src = src;
162            }
163        });
164    }
165
166    return deferred ? deferred.promise($this) : $this;
167};
168
169/**
170 * jquery elastic_grid
171 *
172 * Copyright 2013, vukhanhtruong
173 * http://www.bonchen.net
174 */
175jQuery(function () {
176    jQuery.elastic_grid = {
177        version: '1.0'
178    };
179    jQuery.fn.elastic_grid = function (config) {
180        config = jQuery.extend({}, {
181            items: null,
182            filterEffect: '',
183            hoverDirection: true,
184            hoverDelay: 0,
185            hoverInverse: false,
186            expandingHeight: 500,
187            expandingSpeed: 300,
188            callback: function () {
189            }
190        }, config);
191
192        // initial container object
193        var container = jQuery(this);
194        // number of questions
195        var numOfItems = config.items.length;
196        if (numOfItems == 0) {
197            return false;
198        }
199
200        //initial filter nav
201        container.html('<div class="wagwep-container"><nav id="porfolio-nav" class="clearfix"><ul id="portfolio-filter" class="nav nav-tabs clearfix"></ul></nav></div>');
202
203        //initial items
204        var gridContent = "";
205        var ulObject = jQuery('<ul id="og-grid" class="og-grid"></ul>');
206        for (itemIdx = 0; itemIdx < numOfItems; itemIdx++) {
207            if (config.items[itemIdx] != undefined) {
208                var item = config.items[itemIdx];
209
210                //initial new li
211                liObject = jQuery('<li></li>');
212
213                //get tags
214                tags = item.tags;
215                strTag = "";
216                for (var i = tags.length - 1; i >= 0; i--) {
217                    strTag += "," + tags[i];
218                }
219                ;
220                strTag = strTag.substring(1);
221                liObject.attr('data-tags', strTag);
222
223                //initial a object
224                aObject = jQuery('<a></a>');
225                aObject.attr('href', 'javascript:;;');
226
227                //initial default photo
228                imgObject = jQuery('<img/>');
229                imgObject.attr('src', item.thumbnail[0]);
230                if (galleryImgYoutubeParser(item.large[0]) == false) {
231                    imgObject.attr('data-largesrc', item.large[0]);
232                }
233                else {
234                    imgObject.attr('data-video', item.large[0]);
235                }
236
237
238                //initial hover direction
239                spanObject = jQuery('<span></span>');
240                spanObject.html(item.title.replace(/__5_5_5__/g, '%'));
241                figureObject = jQuery('<figure></figure>');
242                figureObject.append(spanObject);
243
244                imgObject.appendTo(aObject);
245                figureObject.appendTo(aObject);
246                aObject.appendTo(liObject);
247                liObject.appendTo(ulObject);
248            }
249        }
250        if (config.filterEffect == '') {
251            config.filterEffect = 'moveup';
252        }
253        ulObject.addClass('effect-' + config.filterEffect);
254        ulObject.appendTo(container);
255        /**************************************************************************
256         * HOVER DIR
257         ***************************************************************************/
258        if (config.hoverDirection == true) {
259            ulObject.find('li').each(function () {
260                jQuery(this).hoverdir({
261                    hoverDelay: config.hoverDelay,
262                    inverse: config.hoverInverse
263                });
264            });
265        }
266
267        /**************************************************************************
268         * Tags to filter
269         ***************************************************************************/
270        var porfolio_filter = container.find('#portfolio-filter');
271        var items = ulObject.find('li'),
272            itemsByTags = {};
273        numOfTag = 0;
274
275        // Looping though all the li items:
276
277        items.each(function (i) {
278            var elem = jQuery(this),
279                tags = elem.data('tags').split(',');
280
281            // Adding a data-id attribute. Required by the Quicksand plugin:
282            elem.attr('data-id', i);
283
284            elem.addClass('all');
285            jQuery.each(tags, function (key, value) {
286                // Removing extra whitespace:
287                value = jQuery.trim(value);
288
289                //add class tags to li
290                elem.addClass(value.toLowerCase().replace(' ', '-'));
291
292                if (!(value in itemsByTags)) {
293                    // Create an empty array to hold this item:
294                    itemsByTags[value] = [];
295                    numOfTag++;
296                }
297
298                // Each item is added to one array per tag:
299                itemsByTags[value].push(elem);
300            });
301
302        });
303
304        if (numOfTag > 1) {
305            // Creating the "Everything" option in the menu:
306            if (show_filter_all_text == 'on' || config.showAllText) {
307                createList(config.showAllText);
308            }
309
310            // Looping though the arrays in itemsByTags:
311            jQuery.each(itemsByTags, function (k, v) {
312                createList(k);
313            });
314        } else {
315            porfolio_filter.remove();
316        }
317
318
319        porfolio_filter.find('a').bind('click', function (e) {
320            //close expanding preview
321            $grid.find('li.og-expanded').find('a').trigger('click');
322            $grid.find('.og-close').trigger('click');
323
324            $this = jQuery(this);
325            $this.css('outline', 'none');
326            porfolio_filter.find('.current').removeClass('current');
327            $this.parent().addClass('current');
328
329            //var filterVal = $this.text().toLowerCase().replace(' ','-');
330            var filterVal = $this.attr('data-filter').slice(1);
331            var count = numOfItems;
332            ulObject.find('li').each(function (i, el) {
333                classie.remove(el, 'hidden');
334                classie.remove(el, 'animate');
335                if (!--count) {
336                    setTimeout(function () {
337                        doAnimateItems(ulObject.find('li'), filterVal);
338                    }, 1);
339                }
340            });
341
342            return false;
343        });
344
345        function doAnimateItems(objectLi, filterVal) {
346            objectLi.each(function (i, el) {
347                if (classie.has(el, filterVal)) {
348                    classie.toggle(el, 'animate');
349                    classie.remove(el, 'hidden');
350                } else {
351                    classie.add(el, 'hidden');
352                    classie.remove(el, 'animate');
353                }
354            });
355        }
356
357        porfolio_filter.find('li:first').addClass('current');
358
359        function createList(text) {
360            var filter = text.toLowerCase().replace(' ', '-');
361            // This is a helper function that takes the
362            // text of a menu button and array of li items
363            if (text != '') {
364                text = text.replace(/_/g, ' ');
365                var li = jQuery('<li>');
366                var a = jQuery('<a>', {
367                    html: text,
368                    'data-filter': '.' + filter,
369                    href: '#',
370                    'class': 'filter',
371                }).appendTo(li);
372
373                li.appendTo(porfolio_filter);
374            }
375        }
376
377        /**************************************************************************
378         * EXPANDING
379         ***************************************************************************/
380            // list of items
381        var $grid = ulObject,
382            // the items
383            $items = $grid.children('li'),
384            // current expanded item's index
385            current = -1,
386            // position (top) of the expanded item
387            // used to know if the preview will expand in a different row
388            previewPos = -1,
389            // extra amount of pixels to scroll the window
390            scrollExtra = 0,
391            // extra margin when expanded (between preview overlay and the next items)
392            marginExpanded = 10,
393            $window = jQuery(window), winsize,
394            $body = jQuery('html, body'),
395            // transitionend events
396            transEndEventNames = {
397                'WebkitTransition': 'webkitTransitionEnd',
398                'MozTransition': 'transitionend',
399                'OTransition': 'oTransitionEnd',
400                'msTransition': 'MSTransitionEnd',
401                'transition': 'transitionend'
402            },
403            transEndEventName = transEndEventNames[Modernizr.prefixed('transition')],
404            // support for csstransitions
405            support = Modernizr.csstransitions,
406            // default settings
407            settings = {
408                minHeight: config.expandingHeight,
409                speed: config.expandingSpeed,
410                easing: 'ease'
411            };
412
413
414        // add more items to the grid.
415        // the new items need to appended to the grid.
416        // after that call Grid.addItems(theItems);
417        function addItems($newitems) {
418
419            $items = $items.add($newitems);
420
421            $newitems.each(function () {
422                var $item = jQuery(this);
423                $item.data({
424                    offsetTop: $item.offset().top,
425                    height: $item.height()
426                });
427            });
428
429            initItemsEvents($newitems);
430
431        }
432
433        // saves the item´s offset top and height (if saveheight is true)
434        function saveItemInfo(saveheight) {
435            $items.each(function () {
436                var $item = jQuery(this);
437                $item.data('offsetTop', $item.offset().top);
438                if (saveheight) {
439                    $item.data('height', $item.height());
440                }
441            });
442        }
443
444        function initEvents() {
445
446            // when clicking an item, show the preview with the item´s info and large image.
447            // close the item if already expanded.
448            // also close if clicking on the item´s cross
449            initItemsEvents($items);
450
451            // on window resize get the window´s size again
452            // reset some values..
453            $window.on('debouncedresize', function () {
454
455                scrollExtra = 0;
456                previewPos = -1;
457                // save item´s offset
458                saveItemInfo();
459                getWinSize();
460                var preview = jQuery.data(this, 'preview');
461                if (typeof preview != 'undefined') {
462                    hidePreview();
463                }
464
465            });
466
467        }
468
469        function initItemsEvents($items) {
470            $items.on('click', 'span.og-close', function () {
471                hidePreview();
472                return false;
473            }).children('a').on('click', function (e) {
474                var $item = jQuery(this).parent();
475                //jQuery(this).addClass('unhoverdir');
476                //remove animate class
477                $item.removeClass('animate');
478
479                // check if item already opened
480                current === $item.index() ? hidePreview(jQuery(this)) : showPreview($item);
481                return false;
482
483            });
484        }
485
486        function getWinSize() {
487            winsize = {width: $window.width(), height: $window.height()};
488        }
489
490        function showPreview($item) {
491            hidePreview();
492            var preview = jQuery.data(this, 'preview'),
493                // item´s offset top
494                position = $item.data('offsetTop');
495
496            scrollExtra = 0;
497
498            // if a preview exists and previewPos is different (different row) from item´s top then close it
499            if (typeof preview != 'undefined') {
500
501                // not in the same row
502                if (previewPos !== position) {
503                    // if position > previewPos then we need to take te current preview´s height in consideration when scrolling the window
504                    if (position > previewPos) {
505                        scrollExtra = preview.height;
506                    }
507                    hidePreview();
508                }
509                // same row
510                else {
511                    preview.update($item);
512                    return false;
513                }
514
515            }
516
517            // update previewPos
518            previewPos = position;
519            // initialize new preview for the clicked item
520            preview = jQuery.data(this, 'preview', new Preview($item));
521            // expand preview overlay
522            preview.open();
523
524        }
525
526        function hidePreview() {
527            //hide pointer
528            $items.find('.og-pointer').remove();
529
530            current = -1;
531            var preview = jQuery.data(this, 'preview');
532
533            if (typeof preview == "undefined") {
534                //do nothing
535            } else {
536                preview.close();
537            }
538            jQuery.removeData(this, 'preview');
539        }
540
541        // the preview obj / overlay
542        function Preview($item) {
543            this.$item = $item;
544            this.expandedIdx = this.$item.index();
545            this.create();
546            this.update();
547        }
548
549        Preview.prototype = {
550            create: function () {
551                // create Preview structure:
552                this.$title = jQuery('<h3></h3>');
553                this.$description = jQuery('<p></p>');
554                this.$href = jQuery('<a href="#">Visit website</a>');
555                this.$detailButtonList = jQuery('<p class="buttons-list"></p>');
556                this.$details = jQuery('<div class="og-details"></div>').append(this.$title, this.$description, this.$detailButtonList);
557                this.$loading = jQuery('<div class="og-loading"></div>');
558                this.$fullimage = jQuery('<div class="og-fullimg"></div>').append(this.$loading);
559                this.$closePreview = jQuery('<span class="og-close"></span>');
560                this.$previewInner = jQuery('<div class="og-expander-inner"></div>').append(this.$closePreview, this.$fullimage, this.$details);
561                this.$previewEl = jQuery('<div class="og-expander"></div>').append(this.$previewInner);
562                // append preview element to the item
563                this.$item.append(jQuery('<div class="og-pointer"></div>'));
564                this.$item.append(this.getEl());
565
566                // set the transitions for the preview and the item
567                if (support) {
568                    this.setTransition();
569                }
570            },
571            update: function ($item) {
572
573                if ($item) {
574                    this.$item = $item;
575                }
576
577                // if already expanded remove class "og-expanded" from current item and add it to new item
578                if (current !== -1) {
579                    var $currentItem = $items.eq(current);
580                    $currentItem.removeClass('og-expanded');
581                    this.$item.addClass('og-expanded');
582                    // position the preview correctly
583                    this.positionPreview();
584                }
585
586                // update current value
587                current = this.$item.index();
588
589
590                // update preview´s content
591                if (typeof config.items[current] === "undefined") {
592                    //nothing happen
593                } else {
594                    eldata = config.items[current];
595
596                    this.$title.html(eldata.title.replace(/__5_5_5__/g, '%'));
597                    this.$description.html(eldata.description.replace(/__5_5_5__/g, '%'));
598                    //clear current button list
599                    this.$detailButtonList.html("");
600                    urlList = eldata.button_list;
601
602                    if (urlList.length > 0) {
603                        for (i = 0; i < urlList.length; i++) {
604                            var linkTarget = (urlList[i]['new_window']) ? '_blank' : '_self';
605                            var ObjA = jQuery('<a target="' + linkTarget + '"></a>');
606                            ObjA.addClass('link-button');
607                            if (i == 0) {
608                                ObjA.addClass('first');
609                            }
610                            ObjA.attr("href", urlList[i]['url']);
611                            ObjA.html(urlList[i]['title']);
612                            if ((urlList[i]['url'])) {
613                                this.$detailButtonList.append(ObjA);
614                            }
615                        }
616                    }
617
618                    var self = this;
619
620                    // remove the current image in the preview
621                    if (typeof self.$largeImg != 'undefined') {
622                        self.$largeImg.remove();
623                    }
624
625
626                    //relate photo
627                    glarge = eldata.large;
628                    gthumbs = eldata.thumbnail;
629                    if (glarge.length == gthumbs.length && glarge.length > 0) {
630                        var ObjUl = jQuery('<ul></ul>');
631                        for (i = 0; i < gthumbs.length; i++) {
632                            var Objli = jQuery('<li></li>');
633                            var ObjA = jQuery('<a href="javascript:;;"></a>');
634                            var ObjImg = jQuery('<img/>');
635
636                            ObjImg.addClass('related_photo');
637                            if (i == 0) {
638                                ObjImg.addClass('selected');
639                            }
640                            ObjImg.attr("src", gthumbs[i]);
641                            if (galleryImgYoutubeParser(glarge[i]) == false) {
642                                ObjImg.attr("data-large", glarge[i]);
643                            }
644                            else {
645                                ObjImg.attr("data-video", glarge[i]);
646                            }
647                            ObjA.append(ObjImg);
648                            Objli.append(ObjA);
649                            ObjUl.append(Objli);
650                        }
651
652                        //On thumbnail click counting expanded element block height, which is sum of element height and expanded block height
653                        function resizeExpander() {
654                            self.$fullimage.parents('.og-expander').height('auto');
655                            var ogExpanderHeight = self.$fullimage.parents('.og-expander').height();
656                            var elementHeight = self.$fullimage.parents('.og-expanded').find('a:first').height();
657                            var bigElementHeigh = ogExpanderHeight + elementHeight + parseInt(elements_margin);
658                            self.$fullimage.parents('.og-expanded').height(bigElementHeigh);
659                        }
660
661                        // ObjUl.addClass("og-grid-small");
662                        ObjUl.addClass("elastislide-list");
663                        ObjUl.elastislide();
664                        var carousel = jQuery('<div class="elastislide-wrapper elastislide-horizontal"></div>');
665                        self.$details.append('<div class="infosep"></div>');
666                        //self.$details.append(carousel);
667                    } else {
668                        self.$details.find('.infosep, .og-grid-small').remove();
669                    }
670
671
672                    // preload large image and add it to the preview
673                    // for smaller screens we don´t display the large image (the media query will hide the fullimage wrapper)
674                    self.setInitialHeights();
675                    self.$loading.show();
676                    if (self.$fullimage.is(':visible')) {
677                        jQuery('<img/>').load(function () {
678                            var $img = jQuery(this);
679                            if ($img.attr('src') === self.$item.children('a').find('img').data('largesrc')) {
680                                self.$loading.hide();
681                                self.$fullimage.find('img').remove();
682                                self.$largeImg = $img.fadeIn(350);
683                                self.$fullimage.append(self.$largeImg);
684                                if (galleryImgDisableRightClickElastic == 'on') {
685                                    self.$largeImg.bind('contextmenu', function () {
686                                        return false;
687                                    });
688                                }
689                            }
690
691                            self.setHeights();
692                        }).attr('src', eldata.large[0]);
693                    }
694                    if (self.$item.children('a').find('img').data('video')) {
695                        self.$loading.show();
696                        var iframeSrc = self.$item.children('a').find('img').data('video');
697                        var iframe = jQuery('<iframe allowfullscreen>').attr('src', iframeSrc);
698                        self.$fullimage.find('img').remove();
699                        self.$largeImg = iframe.fadeIn(350);
700
701                        self.$fullimage.append(iframe);
702                        self.$fullimage.find('iframe').on('load', function () {
703                            self.$loading.hide();
704                        });
705                        self.setHeights();
706                        var previewWrapperWidth = self.$fullimage.width();
707                        self.$fullimage.find('iframe:first').height(previewWrapperWidth * 9 / 16);
708                    }
709
710                }
711            },
712            open: function () {
713                //this.setHeights();
714
715            },
716            close: function () {
717
718                var self = this,
719                    onEndFn = function () {
720                        if (support) {
721                            jQuery(this).off(transEndEventName);
722                        }
723                        self.$item.removeClass('og-expanded');
724                        self.$previewEl.remove();
725                    };
726
727                setTimeout(jQuery.proxy(function () {
728
729                    if (typeof this.$largeImg !== 'undefined') {
730                        this.$largeImg.fadeOut('fast');
731                    }
732                    this.$previewEl.css('height', 0);
733                    // the current expanded item (might be different from this.$item)
734                    var $expandedItem = $items.eq(this.expandedIdx);
735                    $expandedItem.css('height', $expandedItem.data('height')).on(transEndEventName, onEndFn);
736
737                    if (!support) {
738                        onEndFn.call();
739                    }
740
741                }, this), 25);
742
743                return false;
744
745            },
746            calcHeight: function () {
747
748                var heightPreview = winsize.height - this.$item.data('height') - marginExpanded,
749                    itemHeight = winsize.height;
750
751                if (heightPreview < settings.minHeight) {
752                    heightPreview = settings.minHeight;
753                    itemHeight = settings.minHeight + this.$item.data('height') + marginExpanded;
754                }
755
756                this.height = heightPreview;
757                this.itemHeight = itemHeight;
758
759            },
760            setHeights: function () {
761
762                var self = this,
763                    onEndFn = function () {
764                        if (support) {
765                            self.$item.off(transEndEventName);
766                        }
767                        self.$item.addClass('og-expanded');
768                        self.$fullimage.find('img').css('width', '100%');
769                    };
770
771                this.calcHeight();
772
773                var detailsHeight = self.$previewEl.find('.og-details').outerHeight();
774                var imgRatio = self.$fullimage.find('img').prop('naturalHeight') / self.$fullimage.find('img').prop('naturalWidth');
775                var imgHeight = ( self.$fullimage.find('img').length ) ? self.$fullimage.width() * imgRatio : self.$fullimage.find('iframe').width() * 9 / 16;
776                var blockHeight = Math.max(detailsHeight, imgHeight);
777                if (jQuery(window).width() > 767) {
778                    self.$previewEl.css('height', blockHeight + 60);
779                    self.itemHeight = self.$item.data('height') + blockHeight + 90;
780                }
781                else {
782                    self.$previewEl.css('height', detailsHeight + imgHeight + 60);
783                    self.itemHeight = self.$item.data('height') + detailsHeight + imgHeight + 90;
784                }
785                self.$item.css('height', self.itemHeight).on(transEndEventName, onEndFn);
786
787                if (!support) {
788                    onEndFn.call();
789                }
790
791            },
792            setInitialHeights: function () {
793
794                var self = this,
795                    onEndFn = function () {
796                        if (support) {
797                            self.$item.off(transEndEventName);
798                        }
799                        self.$item.addClass('og-expanded');
800                    };
801
802                self.$previewEl.css('height', config.expandingHeight);
803                self.positionPreview();
804                self.itemHeight = self.$item.data('height') + config.expandingHeight + parseInt(elements_margin);
805                self.$item.css('height', self.itemHeight).on(transEndEventName, onEndFn);
806
807                if (!support) {
808                    onEndFn.call();
809                }
810
811            },
812            positionPreview: function () {
813
814                // scroll page
815                // case 1 : preview height + item height fits in window´s height
816                // case 2 : preview height + item height does not fit in window´s height and preview height is smaller than window´s height
817                // case 3 : preview height + item height does not fit in window´s height and preview height is bigger than window´s height
818                var position = this.$item.data('offsetTop'),
819                    previewOffsetT = this.$previewEl.offset().top - scrollExtra,
820                    //scrollVal = this.height + this.$item.data( 'height' ) + marginExpanded <= winsize.height ? position : this.height < winsize.height ? previewOffsetT - ( winsize.height - this.height ) : previewOffsetT;
821                    scrollVal = this.$previewEl.height() + this.$item.data('height') + marginExpanded <= winsize.height ? position : this.height < winsize.height ? previewOffsetT - ( winsize.height - this.height ) : previewOffsetT;
822
823                $body.animate({scrollTop: scrollVal}, settings.speed);
824
825            },
826            setTransition: function () {
827                this.$previewEl.css('transition', 'height ' + settings.speed + 'ms ' + settings.easing);
828                this.$item.css('transition', 'height ' + settings.speed + 'ms ' + settings.easing);
829            },
830            getEl: function () {
831                return this.$previewEl;
832            }
833        }
834
835        // return {
836        //     init : init,
837        //     addItems : addItems
838        // };
839        $grid.imagesLoaded(function () {
840
841            // save item´s size and offset
842            saveItemInfo(true);
843            // get window´s size
844            getWinSize();
845            // initialize some events
846            initEvents();
847
848        });
849
850    }
851    jQuery(window).trigger('elastic-grid:ready');
852})
853
854function galleryImgYoutubeParser(url) {
855    var regExp = /^.*((youtu.be\/)|(v\/)|(\/u\/\w\/)|(embed\/)|(watch\?))\??v?=?([^#\&\?]*).*/;
856    var match = url.match(regExp);
857    var match_vimeo = /vimeo.*\/(\d+)/i.exec(url);
858    if (match && match[7].length == 11) {
859        return match[7];
860    } else if (match_vimeo) {
861        return match_vimeo[1];
862    } else {
863        return false;
864    }
865}

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.