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.