2015-06-27 20:29:50 -07:00
|
|
|
|
(function ($) {
|
|
|
|
|
|
2015-06-28 07:45:21 -07:00
|
|
|
|
})(jQuery);
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* jQuery Unveil
|
|
|
|
|
* A very lightweight jQuery plugin to lazy load images
|
|
|
|
|
* http://luis-almeida.github.com/unveil
|
|
|
|
|
*
|
|
|
|
|
* Licensed under the MIT license.
|
|
|
|
|
* Copyright 2013 Luís Almeida
|
|
|
|
|
* https://github.com/luis-almeida
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
(function ($) {
|
|
|
|
|
|
2015-06-27 20:29:50 -07:00
|
|
|
|
/**
|
2015-06-28 07:45:21 -07:00
|
|
|
|
* Copyright 2012, Digital Fusion
|
|
|
|
|
* Licensed under the MIT license.
|
|
|
|
|
* http://teamdf.com/jquery-plugins/license/
|
|
|
|
|
*
|
|
|
|
|
* @author Sam Sehnert
|
|
|
|
|
* @desc A small plugin that checks whether elements are within
|
|
|
|
|
* the user visible viewport of a web browser.
|
|
|
|
|
* only accounts for vertical position, not horizontal.
|
|
|
|
|
*/
|
2015-06-27 20:29:50 -07:00
|
|
|
|
var $w = $(window);
|
|
|
|
|
|
2015-06-28 07:45:21 -07:00
|
|
|
|
function visibleInViewport(elem, partial, hidden, direction, threshold) {
|
2015-06-27 20:29:50 -07:00
|
|
|
|
|
2015-06-28 07:45:21 -07:00
|
|
|
|
var $t = $(elem),
|
|
|
|
|
t = elem,
|
2015-06-27 20:29:50 -07:00
|
|
|
|
vpWidth = $w.width(),
|
|
|
|
|
vpHeight = $w.height(),
|
|
|
|
|
direction = (direction) ? direction : 'both',
|
|
|
|
|
clientSize = hidden === true ? t.offsetWidth * t.offsetHeight : true;
|
|
|
|
|
|
|
|
|
|
if (typeof t.getBoundingClientRect === 'function') {
|
|
|
|
|
|
|
|
|
|
// Use this native browser method, if available.
|
|
|
|
|
var rec = t.getBoundingClientRect(),
|
|
|
|
|
tViz = rec.top >= 0 && rec.top < vpHeight + threshold,
|
|
|
|
|
bViz = rec.bottom > 0 && rec.bottom <= vpHeight + threshold,
|
|
|
|
|
lViz = rec.left >= 0 && rec.left < vpWidth + threshold,
|
|
|
|
|
rViz = rec.right > 0 && rec.right <= vpWidth + threshold,
|
|
|
|
|
vVisible = partial ? tViz || bViz : tViz && bViz,
|
|
|
|
|
hVisible = partial ? lViz || rViz : lViz && rViz;
|
|
|
|
|
|
|
|
|
|
if (direction === 'both')
|
|
|
|
|
return clientSize && vVisible && hVisible;
|
|
|
|
|
else if (direction === 'vertical')
|
|
|
|
|
return clientSize && vVisible;
|
|
|
|
|
else if (direction === 'horizontal')
|
|
|
|
|
return clientSize && hVisible;
|
|
|
|
|
} else {
|
|
|
|
|
|
|
|
|
|
var viewTop = $w.scrollTop(),
|
|
|
|
|
viewBottom = viewTop + vpHeight,
|
|
|
|
|
viewLeft = $w.scrollLeft(),
|
|
|
|
|
viewRight = viewLeft + vpWidth,
|
|
|
|
|
offset = $t.offset(),
|
|
|
|
|
_top = offset.top,
|
|
|
|
|
_bottom = _top + $t.height(),
|
|
|
|
|
_left = offset.left,
|
|
|
|
|
_right = _left + $t.width(),
|
|
|
|
|
compareTop = partial === true ? _bottom : _top,
|
|
|
|
|
compareBottom = partial === true ? _top : _bottom,
|
|
|
|
|
compareLeft = partial === true ? _right : _left,
|
|
|
|
|
compareRight = partial === true ? _left : _right;
|
|
|
|
|
|
|
|
|
|
if (direction === 'both')
|
|
|
|
|
return !!clientSize && ((compareBottom <= viewBottom) && (compareTop >= viewTop)) && ((compareRight <= viewRight) && (compareLeft >= viewLeft));
|
|
|
|
|
else if (direction === 'vertical')
|
|
|
|
|
return !!clientSize && ((compareBottom <= viewBottom) && (compareTop >= viewTop));
|
|
|
|
|
else if (direction === 'horizontal')
|
|
|
|
|
return !!clientSize && ((compareRight <= viewRight) && (compareLeft >= viewLeft));
|
|
|
|
|
}
|
2015-06-28 07:45:21 -07:00
|
|
|
|
}
|
2015-05-09 21:29:04 -07:00
|
|
|
|
|
|
|
|
|
var unveilId = 0;
|
2014-04-08 11:22:03 -07:00
|
|
|
|
|
2015-05-12 21:55:19 -07:00
|
|
|
|
function getThreshold() {
|
|
|
|
|
|
2015-05-27 22:51:48 -07:00
|
|
|
|
// If less than 100, the search window ends up not getting images
|
|
|
|
|
// If less than 200, this happens on the home page
|
|
|
|
|
// Need to fix those before this can be set to 0
|
2015-06-10 20:01:41 -07:00
|
|
|
|
|
2015-06-15 21:52:01 -07:00
|
|
|
|
if (window.AppInfo && AppInfo.isNativeApp && $.browser.safari) {
|
2015-06-22 08:43:19 -07:00
|
|
|
|
return 7000;
|
2015-06-15 21:52:01 -07:00
|
|
|
|
}
|
|
|
|
|
|
2015-06-19 21:48:45 -07:00
|
|
|
|
var screens = $.browser.mobile ? 2.5 : 1;
|
2015-06-10 20:01:41 -07:00
|
|
|
|
|
2015-06-14 21:17:12 -07:00
|
|
|
|
// This helps eliminate the draw-in effect as you scroll
|
2015-06-15 21:52:01 -07:00
|
|
|
|
return Math.max(screen.availHeight * screens, 1000);
|
2015-05-12 21:55:19 -07:00
|
|
|
|
}
|
2015-05-11 09:32:15 -07:00
|
|
|
|
|
2015-06-27 20:29:50 -07:00
|
|
|
|
var threshold = getThreshold();
|
|
|
|
|
|
|
|
|
|
function isVisible() {
|
2015-06-28 07:45:21 -07:00
|
|
|
|
return visibleInViewport(this, true, false, 'both', threshold);
|
2015-06-27 20:29:50 -07:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function fillImage() {
|
|
|
|
|
var elem = this;
|
|
|
|
|
var source = elem.getAttribute('data-src');
|
|
|
|
|
if (source) {
|
|
|
|
|
ImageStore.setImageInto(elem, source);
|
|
|
|
|
elem.setAttribute("data-src", '');
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2015-06-28 07:45:21 -07:00
|
|
|
|
function unveilElements(elems) {
|
|
|
|
|
|
|
|
|
|
if (!elems.length) {
|
|
|
|
|
return;
|
|
|
|
|
}
|
2014-04-08 11:22:03 -07:00
|
|
|
|
|
2015-06-28 07:45:21 -07:00
|
|
|
|
var images = $(elems),
|
|
|
|
|
loaded;
|
2014-04-08 11:22:03 -07:00
|
|
|
|
|
2015-05-09 21:29:04 -07:00
|
|
|
|
unveilId++;
|
|
|
|
|
var eventNamespace = 'unveil' + unveilId;
|
|
|
|
|
|
2015-06-28 07:45:21 -07:00
|
|
|
|
images.one("unveil", fillImage);
|
2014-04-08 11:22:03 -07:00
|
|
|
|
|
|
|
|
|
function unveil() {
|
2015-06-27 20:29:50 -07:00
|
|
|
|
var inview = images.filter(isVisible);
|
2014-04-08 11:22:03 -07:00
|
|
|
|
|
|
|
|
|
loaded = inview.trigger("unveil");
|
|
|
|
|
images = images.not(loaded);
|
2015-05-09 21:29:04 -07:00
|
|
|
|
|
|
|
|
|
if (!images.length) {
|
2015-06-28 07:45:21 -07:00
|
|
|
|
Events.off(window, 'scroll.' + eventNamespace);
|
|
|
|
|
Events.off(window, 'resize.' + eventNamespace);
|
2015-05-09 21:29:04 -07:00
|
|
|
|
}
|
2014-04-08 11:22:03 -07:00
|
|
|
|
}
|
|
|
|
|
|
2015-06-28 07:45:21 -07:00
|
|
|
|
Events.on(window, 'scroll.' + eventNamespace, unveil);
|
|
|
|
|
Events.on(window, 'resize.' + eventNamespace, unveil);
|
2014-04-08 11:22:03 -07:00
|
|
|
|
|
|
|
|
|
unveil();
|
2015-06-28 07:45:21 -07:00
|
|
|
|
}
|
2014-04-08 11:22:03 -07:00
|
|
|
|
|
2015-06-28 07:45:21 -07:00
|
|
|
|
function fillImages(elems) {
|
2014-04-08 11:22:03 -07:00
|
|
|
|
|
2015-06-28 07:45:21 -07:00
|
|
|
|
for (var i = 0, length = elems.length; i < length; i++) {
|
|
|
|
|
var elem = elems[0];
|
|
|
|
|
var source = elem.getAttribute('data-src');
|
|
|
|
|
if (source) {
|
|
|
|
|
ImageStore.setImageInto(elem, source);
|
|
|
|
|
elem.setAttribute("data-src", '');
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
2014-04-08 11:22:03 -07:00
|
|
|
|
|
2015-06-28 07:45:21 -07:00
|
|
|
|
function lazyChildren(elem) {
|
2015-06-27 20:29:50 -07:00
|
|
|
|
|
2015-06-28 07:45:21 -07:00
|
|
|
|
unveilElements(elem.getElementsByClassName('lazy'));
|
|
|
|
|
}
|
2015-06-27 20:29:50 -07:00
|
|
|
|
|
2015-01-22 23:15:15 -07:00
|
|
|
|
$.fn.lazyChildren = function () {
|
|
|
|
|
|
2015-06-28 07:45:21 -07:00
|
|
|
|
if (this.length == 1) {
|
|
|
|
|
lazyChildren(this[0]);
|
|
|
|
|
} else {
|
|
|
|
|
unveilElements($('.lazy', this));
|
2015-05-09 21:29:04 -07:00
|
|
|
|
}
|
2015-01-22 23:15:15 -07:00
|
|
|
|
return this;
|
|
|
|
|
};
|
|
|
|
|
|
2015-06-28 07:45:21 -07:00
|
|
|
|
function lazyImage(elem, url) {
|
|
|
|
|
|
|
|
|
|
elem.setAttribute('data-src', url);
|
|
|
|
|
fillImages([elem]);
|
|
|
|
|
}
|
2015-05-09 21:29:04 -07:00
|
|
|
|
|
2015-06-28 07:45:21 -07:00
|
|
|
|
window.ImageLoader = {
|
|
|
|
|
fillImages: fillImages,
|
|
|
|
|
lazyImage: lazyImage,
|
|
|
|
|
lazyChildren: lazyChildren
|
2015-05-09 21:29:04 -07:00
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
})(window.jQuery || window.Zepto);
|
|
|
|
|
|
|
|
|
|
(function () {
|
|
|
|
|
|
2015-05-11 09:32:15 -07:00
|
|
|
|
function setImageIntoElement(elem, url) {
|
|
|
|
|
|
2015-06-20 17:49:42 -07:00
|
|
|
|
if (elem.tagName !== "IMG") {
|
2015-05-11 09:32:15 -07:00
|
|
|
|
|
|
|
|
|
elem.style.backgroundImage = "url('" + url + "')";
|
|
|
|
|
|
|
|
|
|
} else {
|
|
|
|
|
elem.setAttribute("src", url);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2015-05-09 21:29:04 -07:00
|
|
|
|
function simpleImageStore() {
|
|
|
|
|
|
|
|
|
|
var self = this;
|
|
|
|
|
|
2015-05-11 09:32:15 -07:00
|
|
|
|
self.setImageInto = setImageIntoElement;
|
2015-05-09 21:29:04 -07:00
|
|
|
|
}
|
|
|
|
|
|
2015-05-12 21:55:19 -07:00
|
|
|
|
console.log('creating simpleImageStore');
|
|
|
|
|
window.ImageStore = new simpleImageStore();
|
|
|
|
|
|
2015-05-09 21:29:04 -07:00
|
|
|
|
})();
|