eidolon/static/js/init.js
2015-10-03 05:55:55 +02:00

616 lines
17 KiB
JavaScript
Executable file

/*
Parallelism by HTML5 UP
html5up.net | @n33co
Free for personal and commercial use under the CCA 3.0 license (html5up.net/license)
*/
var parallelism = (function($) { var _ = {
/******************************/
/* Properties */
/******************************/
// Settings
settings: {
// Popup overlay color.
popupOverlayColor: '#1a1f2c',
// Popup overlay opacity.
popupOverlayOpacity: 0.75,
// Mobile only.
// If true, mobile mode will get some automatic styling.
autoStyleMobile: true,
// Desktop only.
// If true, reel will be vertically centered.
centerVertically: true,
// Delay (in ms) before showing the reel.
introDelay: 600,
// Speed (in ms) at which to fade in reel.
introSpeed: 750,
// Height (in px) of items.
itemHeight: 240,
// Default width (in px) of width.
itemWidth: 300,
// Margin (in px) to preserve at the bottom of the viewport.
marginBottom: 0,
// Margin (in px) to preserve at the top of the viewport.
marginTop: 0,
// Nudge the reel by this value (in px) after it's been vertically centered.
verticalNudge: 0,
// Maximum number of rows.
maxRows: 5,
// Minimum number of rows.
minRows: 1,
// Padding (in px) between items (0 = no padding).
padding: 5,
// Padding color.
paddingColor: '#fff',
// If true, reel scroll will reset on page refresh.
resetScroll: true,
// Scales the scroll delta (1 = normal, 2 = double, 0.5 = half, etc.).
scrollFactor: 1,
// Scroll amount when using keys.
scrollKeyAmount: 50,
// Determines where scrollwheel events should be captured ('window' or 'reel').
scrollWheelTarget: 'reel',
// Scroll amount when using scroll zones.
scrollZoneAmount: 10,
// Time (in ms) to wait between scrolls when the cursor is in a scroll zone.
scrollZoneDelay: 20,
// Width of scroll zones.
scrollZoneWidth: 40,
// Delay (in ms) before showing thumbnails.
thumbDelay: 1200,
// Spread (in ms) to randomly stagger thumbnails (0 = don't stagger).
thumbDelaySpread: 1500,
// Speed (in ms) at which to fade in thumbnails.
thumbSpeed: 750,
// If true, page will blur slightly when the popup is displayed (webkit only).
useBlurFilter: false,
// If true, the left/right arrow keys will scroll the reel.
useScrollKeys: true,
// If true, moving the cursor to the leftmost/rightmost edges of the reel will scroll it.
useScrollZones: true
},
// Touch device?
isTouch: false,
// IE version.
IEVersion: 99,
// Object cache.
objects: {},
/******************************/
/* Methods */
/******************************/
// Initializes desktop mode.
initDesktop: function() {
var $SZ = $(''), $SZLeft, $SZRight;
var windowHeight = _.objects.window.height() - _.settings.marginTop - _.settings.marginBottom,
windowWidth = _.objects.window.width(),
itemHeight = _.settings.itemHeight,
itemCount = _.objects.items.length,
itemsWidth = 0,
rows = 0,
rowWidth,
SZIntervalId;
// Window.
_.objects.window._parallelism_update = function() {
var i, j, x, y, t;
console.log(itemsWidth,itemHeight)
// Calculate number of rows we can fit on the screen.
rows = Math.min(Math.max(Math.floor(windowHeight / itemHeight) - 1, 1), _.settings.maxRows);
// Reduce row count if we have more than we need.
while ( rows > _.settings.minRows && (itemsWidth / rows) < windowWidth )
rows--;
// Get average row width.
rowWidth = Math.ceil( (itemsWidth / rows) * 1.1 );
// Resize items.
var w = 0, iw;
var rowStart = 0, rowPos = 0, rowEnded = false;
_.objects.items.each(function(i) {
var $item = $(this);
iw = $item.data('width');
// Determine end row conditions.
// Current item would push us past the row width.
if (w + iw >= rowWidth) {
rowEnded = true;
rowEnd = i - 1;
}
// Current item is the last item.
else if (i + 1 >= itemCount) {
w += iw;
rowEnded = true;
rowEnd = i;
}
// Did the row end?
if (rowEnded) {
var pt = 0;
// Rescale the row's items.
_.objects.items.slice(rowStart, rowEnd + 1).each(function(j) {
var $item = $(this);
var p = (($item.data('width') / w) * 100.00);
if (pt + p > 100.00
|| ( (rowStart + j) == rowEnd && pt + p < 100.00))
p = 100.00 - pt;
$item.css('width', p + '%');
pt += p;
});
w = 0;
rowStart = i;
rowPos++;
rowEnded = false;
}
w += iw;
});
// Resize reel.
_.objects.reel
.css('height', (itemHeight * rows) + (_.settings.padding * 2))
.css('width', rowWidth);
// Reposition main (if applicable).
_.objects.main
.css('height', (itemHeight * rows) + (_.settings.padding * 2));
if (_.settings.centerVertically)
_.objects.main
.css('top', '50%')
.css('margin-top', (-1 * (_.objects.main.outerHeight() / 2)) + _.settings.verticalNudge);
// Resize/reposition SZs.
window.setTimeout(function() {
$SZ
.css('height', _.objects.main.outerHeight())
.css('top', _.objects.main.offset().top);
}, _.settings.introDelay);
};
_.objects.window.resize(function() {
// Update window dimensions.
windowWidth = _.objects.window.width();
windowHeight = _.objects.window.height() - _.settings.marginTop - _.settings.marginBottom;
// Row count changed? Re-update.
if (Math.max(Math.floor(windowHeight / itemHeight) - 1, 1) != rows)
_.objects.window._parallelism_update();
// Update scroll zones.
$SZ._parallelism_update();
});
// Reel.
_.objects.reel
.css('overflow-y', 'hidden')
.css('margin', '0 auto')
.css('border', 'solid ' + _.settings.padding + 'px ' + _.settings.paddingColor)
.css('box-shadow', '0 0 0 ' + _.settings.padding + 'px ' + _.settings.paddingColor);
if (_.IEVersion < 9)
_.objects.reel.show();
else if (_.IEVersion < 10) {
_.objects.reel.fadeTo(0,0.0001);
window.setTimeout(function() {
_.objects.reel.fadeTo(_.settings.introSpeed, 1);
}, _.settings.introDelay);
}
else {
_.objects.reel.css('opacity', 0);
window.setTimeout(function() {
_.objects.reel
.h5u_xcss('transition', 'opacity ' + (_.settings.introSpeed / 1000.00) + 's ease-in-out')
.css('opacity', 1);
}, _.settings.introDelay);
}
// Items.
_.objects.items
.css('box-shadow', '0px 0px 0px ' + _.settings.padding + 'px ' + _.settings.paddingColor)
.css('border', 'solid ' + _.settings.padding + 'px ' + _.settings.paddingColor);
_.objects.items.each(function(i) {
var $item = $(this), $img = $item.find('img');
var w, h;
w = parseInt($item.data('width'));
if (!w)
w = _.settings.itemWidth;
h = parseInt($item.data('height'));
if (!h)
h = _.settings.itemHeight;
// Add to total width.
itemsWidth += w;
// Item.
$item
.css('position', 'relative')
.css('width', w)
.css('height', h);
// Image?
if ($img.length > 0) {
var $itemInner, $h2;
// img.
$img
.css('position', 'absolute')
.css('width', '100%')
.css('height', 'auto')
.css('min-height', '100%')
.css('top', 0)
.css('left', 0)
//.attr('title', $item.text());
// inner (for fade effect).
$item.wrapInner('<div class="inner" />');
$itemInner = $item.children('.inner');
$itemInner
.css('position', 'relative')
.css('display', 'block')
.css('-webkit-backface-visibility', 'hidden')
.css('width', '100%')
.css('height', '100%');
if (_.IEVersion < 9)
$itemInner.show();
else if (_.IEVersion < 10) {
$itemInner.hide();
$img
.load(function() {
window.setTimeout(function() {
$itemInner.fadeIn(_.settings.thumbSpeed);
}, _.settings.thumbDelay + Math.floor(Math.random() * _.settings.thumbDelaySpread));
});
}
else {
$itemInner.css('opacity', 0);
$img
.load(function() {
$itemInner.h5u_xcss('transition', 'opacity ' + (_.settings.thumbSpeed / 1000.00) + 's ease-in-out');
window.setTimeout(function() {
$itemInner.css('opacity', 1);
}, _.settings.thumbDelay + Math.floor(Math.random() * _.settings.thumbDelaySpread));
});
}
$img.attr('src', $img.attr('src'));
}
});
// Main.
if (_.isTouch)
_.objects.main
.css('overflow-x', 'auto')
.css('overflow-y', 'hidden')
.h5u_xcss('overflow-scrolling', 'touch');
else
_.objects.main.css('overflow', 'hidden');
// Scrolling.
// Scroll Wheel.
if (_.IEVersion < 9)
_.objects.main.css('overflow-x', 'scroll');
else {
var scrollHandler = function(e) {
var delta = (e.detail ? e.detail * -10 : e.wheelDelta) * _.settings.scrollFactor;
_.objects.main.scrollLeft( _.objects.main.scrollLeft() - delta );
$SZ._parallelism_update();
e.preventDefault();
e.stopPropagation();
};
var st;
if (_.settings.scrollWheelTarget == 'reel')
st = _.objects.main[0];
else
st = _.objects.window[0];
st.addEventListener('DOMMouseScroll', scrollHandler, false);
st.addEventListener('mousewheel', scrollHandler, false);
}
if (_.settings.resetScroll)
window.setTimeout(function() {
_.objects.main.scrollLeft(0);
}, 0);
// Scroll Zones.
if (!_.isTouch && _.settings.useScrollZones) {
_.objects.body.append('<div class="SZRight" style="right: 0;" />');
_.objects.body.append('<div class="SZLeft" style="left: 0;" />');
$SZLeft = _.objects.body.children('.SZLeft');
$SZRight = _.objects.body.children('.SZRight');
$SZ = $SZLeft.add($SZRight);
$SZ
.css('position', 'fixed')
.css('width', _.settings.scrollZoneWidth)
.css('height', 100)
.css('z-index', 100)
.css('background', 'rgba(255,255,255,0)') // Required due to a weird IE bug (affects <=10)
.css('top', 0);
$SZ._parallelism_update = function() {
if (_.objects.main.scrollLeft() == 0)
$SZLeft.hide();
else
$SZLeft.show();
if (_.objects.main.scrollLeft() + $(window).width() >= _.objects.reel.outerWidth())
$SZRight.hide();
else
$SZRight.show();
};
$SZRight.bind('mouseenter', function(e) {
SZIntervalId = window.setInterval(function() {
_.objects.main.scrollLeft( _.objects.main.scrollLeft() + (_.settings.scrollZoneAmount * _.settings.scrollFactor) );
$SZ._parallelism_update();
}, _.settings.scrollZoneDelay);
return false;
});
$SZLeft.bind('mouseenter', function(e) {
SZIntervalId = window.setInterval(function() {
_.objects.main.scrollLeft( _.objects.main.scrollLeft() - (_.settings.scrollZoneAmount * _.settings.scrollFactor) );
$SZ._parallelism_update();
}, _.settings.scrollZoneDelay);
return false;
});
$SZ.bind('mouseleave', function(e) {
window.clearInterval(SZIntervalId);
});
}
else
$SZ._parallelism_update = function() {};
// Scroll Keys.
if (_.settings.useScrollKeys) {
_.objects.window.keydown(function(e) {
if ($('.poptrox-popup').is(':visible'))
return;
switch (e.keyCode)
{
case 39:
window.clearInterval(SZIntervalId);
_.objects.main.scrollLeft( _.objects.main.scrollLeft() + (_.settings.scrollKeyAmount * _.settings.scrollFactor) );
$SZ._parallelism_update();
return false;
case 37:
window.clearInterval(SZIntervalId);
_.objects.main.scrollLeft( _.objects.main.scrollLeft() - (_.settings.scrollKeyAmount * _.settings.scrollFactor) );
$SZ._parallelism_update();
return false;
default:
break;
}
});
}
// Poptrox.
_.objects.reel.poptrox({
onPopupClose: (_.settings.useBlurFilter ? (function() { _.objects.wrapper.removeClass('overlayed'); }) : null),
onPopupOpen: (_.settings.useBlurFilter ? (function() { _.objects.wrapper.addClass('overlayed'); }) : null),
overlayColor: _.settings.popupOverlayColor,
overlayOpacity: _.settings.popupOverlayOpacity,
popupCloserText: '',
popupLoaderText: 'loading',
selector: '.thumb a',
usePopupCaption: true,
usePopupCloser: false,
usePopupDefaultStyling: false,
usePopupNav: true
});
// Trigger resize event.
_.objects.window.trigger('resize');
},
// Initializes mobile mode.
initMobile: function() {
// Auto styling?
if (_.settings.autoStyleMobile) {
// Items.
_.objects.items
.css('border', 'solid ' + Math.ceil(_.settings.padding / 2) + 'px ' + _.settings.paddingColor);
_.objects.items.filter('.thumb')
.css('margin-top', (-1 * Math.ceil(_.settings.padding / 2)) + 'px')
.filter(':nth-child(2n)')
.css('border-right', 0);
}
// Items.
_.objects.items.each(function() {
var $item = $(this), $img = $item.find('img');
$img
.css('opacity', 0);
$item
.css('background-image', 'url("' + $img.attr('src') + '")')
.css('background-position', 'center center')
.css('background-size', 'cover');
});
// Poptrox.
_.objects.reel.poptrox({
onPopupClose: (_.settings.useBlurFilter ? (function() { _.objects.wrapper.removeClass('overlayed'); }) : null),
onPopupOpen: (_.settings.useBlurFilter ? (function() { _.objects.wrapper.addClass('overlayed'); }) : null),
overlayColor: _.settings.popupOverlayColor,
overlayOpacity: _.settings.popupOverlayOpacity,
popupSpeed: 0,
selector: '.thumb a',
useBodyOverflow: false,
usePopupCaption: false,
usePopupCloser: false,
usePopupDefaultStyling: false,
usePopupLoader: false,
usePopupNav: false,
windowMargin: 0
});
},
// Main init method
init: function() {
// Skel.
skel.init({
reset: 'full',
prefix: '/static/css/style',
breakpoints: {
global: { range: '*', containers: 1200, grid: {gutters: 5} },
desktop: { range: '641-', containers: 600, grid: {gutters: 5}, viewport: { width: 1280, scalable: false } },
mobile: { range: '-640', containers: '100%', grid: {gutters: 5}, viewport: { scalable: false } }
}
});
_.isTouch = skel.vars.isTouch;
_.IEVersion = skel.vars.IEVersion;
// jQuery.
$.fn.h5u_xcss = function(k, v) {
return $(this)
.css('-webkit-' + k, v)
.css('-moz-' + k, v)
.css('-o-' + k, v)
.css('-ms-' + k, v)
.css(k, v);
};
$(function() {
// Objects.
_.objects.window = $(window),
_.objects.wrapper = $('#wrapper'),
_.objects.body = $('body'),
_.objects.main = $('#main'),
_.objects.reel = $('#reel'),
_.objects.items = _.objects.main.find('.item');
// Mode.
if (skel.isActive('mobile'))
_.initMobile();
else
_.initDesktop();
});
}
}; return _; })(jQuery);
parallelism.init();