// Thanks Nate Wright for the fix. @https://github.com/NateWr
if (typeof this.album[this.currentImageIndex].title !== 'undefined' &&
this.album[this.currentImageIndex].title !== '') {
var $caption = this.$lightbox.find('.lb-caption');
if (this.options.sanitizeTitle) {
$caption.text(this.album[this.currentImageIndex].title);
} else {
$caption.html(this.album[this.currentImageIndex].title);
}
$caption.fadeIn('fast')
.find('a').on('click', function(event) {
if ($(this).attr('target') !== undefined) {
window.open($(this).attr('href'), $(this).attr('target'));
} else {
location.href = $(this).attr('href');
}
});
}
if (this.album.length > 1 && this.options.showImageNumberLabel) {
var labelText = this.imageCountLabel(this.currentImageIndex + 1, this.album.length);
this.$lightbox.find('.lb-number').text(labelText).fadeIn('fast');
} else {
this.$lightbox.find('.lb-number').hide();
}
this.$outerContainer.removeClass('animating');
this.$lightbox.find('.lb-dataContainer').fadeIn(this.options.resizeDuration, function() {
return self.sizeOverlay();
});
};
// Preload previous and next images in set.
Lightbox.prototype.preloadNeighboringImages = function() {
if (this.album.length > this.currentImageIndex + 1) {
var preloadNext = new Image();
preloadNext.src = this.album[this.currentImageIndex + 1].link;
}
if (this.currentImageIndex > 0) {
var preloadPrev = new Image();
preloadPrev.src = this.album[this.currentImageIndex - 1].link;
}
};
Lightbox.prototype.enableKeyboardNav = function() {
$(document).on('keyup.keyboard', $.proxy(this.keyboardAction, this));
};
Lightbox.prototype.disableKeyboardNav = function() {
$(document).off('.keyboard');
};
Lightbox.prototype.keyboardAction = function(event) {
var KEYCODE_ESC = 27;
var KEYCODE_LEFTARROW = 37;
var KEYCODE_RIGHTARROW = 39;
var keycode = event.keyCode;
var key = String.fromCharCode(keycode).toLowerCase();
if (keycode === KEYCODE_ESC || key.match(/x|o|c/)) {
this.end();
} else if (key === 'p' || keycode === KEYCODE_LEFTARROW) {
if (this.currentImageIndex !== 0) {
this.changeImage(this.currentImageIndex - 1);
} else if (this.options.wrapAround && this.album.length > 1) {
this.changeImage(this.album.length - 1);
}
} else if (key === 'n' || keycode === KEYCODE_RIGHTARROW) {
if (this.currentImageIndex !== this.album.length - 1) {
this.changeImage(this.currentImageIndex + 1);
} else if (this.options.wrapAround && this.album.length > 1) {
this.changeImage(0);
}
}
};
// Closing time. :-(
Lightbox.prototype.end = function() {
this.disableKeyboardNav();
$(window).off('resize', this.sizeOverlay);
this.$lightbox.fadeOut(this.options.fadeDuration);
this.$overlay.fadeOut(this.options.fadeDuration);
$('select, object, embed').css({
visibility: 'visible'
});
if (this.options.disableScrolling) {
$('body').removeClass('lb-disable-scrolling');
}
};
return new Lightbox();
}));
/*
* MIXITUP - A CSS3 and JQuery Filter & Sort Plugin
* Version: 1.5.5
* License: Creative Commons Attribution-NoDerivs 3.0 Unported - CC BY-ND 3.0
* http://creativecommons.org/licenses/by-nd/3.0/
* This software may be used freely on commercial and non-commercial projects with attribution to the author/copyright holder.
* Author: Patrick Kunka
* Copyright 2012-2013 Patrick Kunka, Barrel LLC, All Rights Reserved
*
* http://mixitup.io
*/
(function($){
// DECLARE METHODS
var methods = {
// "INIT" METHOD
init: function(settings){
return this.each(function(){
var browser = window.navigator.appVersion.match(/Chrome\/(\d+)\./),
ver = browser ? parseInt(browser[1], 10) : false,
chromeFix = function(id){
var grid = document.getElementById(id),
parent = grid.parentElement,
placeholder = document.createElement('div'),
frag = document.createDocumentFragment();
parent.insertBefore(placeholder, grid);
frag.appendChild(grid);
parent.replaceChild(grid, placeholder);
frag = null;
placeholder = null;
};
if(ver && ver == 31 || ver == 32){
chromeFix(this.id);
};
// BUILD CONFIG OBJECT
var config = {
// PUBLIC PROPERTIES
targetSelector : '.mix',
filterSelector : '.filter',
sortSelector : '.sort',
buttonEvent: 'click',
effects : ['fade', 'scale'],
listEffects : null,
easing : 'smooth',
layoutMode: 'grid',
targetDisplayGrid : 'inline-block',
targetDisplayList: 'block',
listClass : '',
gridClass : '',
transitionSpeed : 600,
showOnLoad : 'all',
sortOnLoad : false,
multiFilter : false,
filterLogic : 'or',
resizeContainer : true,
minHeight : 0,
failClass : 'fail',
perspectiveDistance : '3000',
perspectiveOrigin : '50% 50%',
animateGridList : true,
onMixLoad: null,
onMixStart : null,
onMixEnd : null,
// MISC
container : null,
origOrder : [],
startOrder : [],
newOrder : [],
origSort: [],
checkSort: [],
filter : '',
mixing : false,
origDisplay : '',
origLayout: '',
origHeight : 0,
newHeight : 0,
isTouch : false,
resetDelay : 0,
failsafe : null,
// CSS
prefix : '',
easingFallback : 'ease-in-out',
transition : {},
perspective : {},
clean : {},
fade : '1',
scale : '',
rotateX : '',
rotateY : '',
rotateZ : '',
blur : '',
grayscale : ''
};
if(settings){
$.extend(config, settings);
};
// ADD CONFIG OBJECT TO CONTAINER OBJECT PER INSTANTIATION
this.config = config;
// DETECT TOUCH
$.support.touch = 'ontouchend' in document;
if ($.support.touch) {
config.isTouch = true;
config.resetDelay = 350;
};
// LOCALIZE CONTAINER
config.container = $(this);
var $cont = config.container;
// GET VENDOR PREFIX
config.prefix = prefix($cont[0]);
config.prefix = config.prefix ? '-'+config.prefix.toLowerCase()+'-' : '';
// CACHE 'DEFAULT' SORTING ORDER
$cont.find(config.targetSelector).each(function(){
config.origOrder.push($(this));
});
// PERFORM SORT ON LOAD
if(config.sortOnLoad){
var sortby, order;
if($.isArray(config.sortOnLoad)){
sortby = config.sortOnLoad[0], order = config.sortOnLoad[1];
$(config.sortSelector+'[data-sort='+config.sortOnLoad[0]+'][data-order='+config.sortOnLoad[1]+']').addClass('active');
} else {
$(config.sortSelector+'[data-sort='+config.sortOnLoad+']').addClass('active');
sortby = config.sortOnLoad, config.sortOnLoad = 'desc';
};
sort(sortby, order, $cont, config);
};
// BUILD TRANSITION AND PERSPECTIVE OBJECTS
for(var i = 0; i<2; i++){
var a = i==0 ? a = config.prefix : '';
config.transition[a+'transition'] = 'all '+config.transitionSpeed+'ms ease-in-out';
config.perspective[a+'perspective'] = config.perspectiveDistance+'px';
config.perspective[a+'perspective-origin'] = config.perspectiveOrigin;
};
// BUILD TRANSITION CLEANER
for(var i = 0; i<2; i++){
var a = i==0 ? a = config.prefix : '';
config.clean[a+'transition'] = 'none';
};
// CHOOSE GRID OR LIST
if(config.layoutMode == 'list'){
$cont.addClass(config.listClass);
config.origDisplay = config.targetDisplayList;
} else {
$cont.addClass(config.gridClass);
config.origDisplay = config.targetDisplayGrid;
};
config.origLayout = config.layoutMode;
// PARSE 'SHOWONLOAD'
var showOnLoadArray = config.showOnLoad.split(' ');
// GIVE ACTIVE FILTER ACTIVE CLASS
$.each(showOnLoadArray, function(){
$(config.filterSelector+'[data-filter="'+this+'"]').addClass('active');
});
// RENAME "ALL" CATEGORY TO "MIX_ALL"
$cont.find(config.targetSelector).addClass('mix_all');
if(showOnLoadArray[0] == 'all'){
showOnLoadArray[0] = 'mix_all',
config.showOnLoad = 'mix_all';
};
// FADE IN 'SHOWONLOAD'
var $showOnLoad = $();
$.each(showOnLoadArray, function(){
$showOnLoad = $showOnLoad.add($('.'+this))
});
$showOnLoad.each(function(){
var $t = $(this);
if(config.layoutMode == 'list'){
$t.css('display',config.targetDisplayList);
} else {
$t.css('display',config.targetDisplayGrid);
};
$t.css(config.transition);
});
// WRAP FADE-IN TO PREVENT RACE CONDITION
var delay = setTimeout(function(){
config.mixing = true;
$showOnLoad.css('opacity','1');
// CLEAN UP
var reset = setTimeout(function(){
if(config.layoutMode == 'list'){
$showOnLoad.removeStyle(config.prefix+'transition, transition').css({
display: config.targetDisplayList,
opacity: 1
});
} else {
$showOnLoad.removeStyle(config.prefix+'transition, transition').css({
display: config.targetDisplayGrid,
opacity: 1
});
};
// FIRE "ONMIXLOAD" CALLBACK
config.mixing = false;
if(typeof config.onMixLoad == 'function') {
var output = config.onMixLoad.call(this, config);
// UPDATE CONFIG IF DATA RETURNED
config = output ? output : config;
};
},config.transitionSpeed);
},10);
// PRESET ACTIVE FILTER
config.filter = config.showOnLoad;
// BIND SORT CLICK HANDLERS
$(config.sortSelector).bind(config.buttonEvent,function(){
if(!config.mixing){
// PARSE SORT ARGUMENTS FROM BUTTON CLASSES
var $t = $(this),
sortby = $t.attr('data-sort'),
order = $t.attr('data-order');
if(!$t.hasClass('active')){
$(config.sortSelector).removeClass('active');
$t.addClass('active');
} else {
if(sortby != 'random')return false;
};
$cont.find(config.targetSelector).each(function(){
config.startOrder.push($(this));
});
goMix(config.filter,sortby,order,$cont, config);
};
});
// BIND FILTER CLICK HANDLERS
$(config.filterSelector).bind(config.buttonEvent,function(){
if(!config.mixing){
var $t = $(this);
// PARSE FILTER ARGUMENTS FROM BUTTON CLASSES
if(config.multiFilter == false){
// SINGLE ACTIVE BUTTON
$(config.filterSelector).removeClass('active');
$t.addClass('active');
config.filter = $t.attr('data-filter');
$(config.filterSelector+'[data-filter="'+config.filter+'"]').addClass('active');
} else {
// MULTIPLE ACTIVE BUTTONS
var thisFilter = $t.attr('data-filter');
if($t.hasClass('active')){
$t.removeClass('active');
// REMOVE FILTER FROM SPACE-SEPERATED STRING
var re = new RegExp('(\\s|^)'+thisFilter);
config.filter = config.filter.replace(re,'');
} else {
// ADD FILTER TO SPACE-SEPERATED STRING
$t.addClass('active');
config.filter = config.filter+' '+thisFilter;
};
};
// GO MIX
goMix(config.filter, null, null, $cont, config);
};
});
});
},
// "TOGRID" METHOD
toGrid: function(){
return this.each(function(){
var config = this.config;
if(config.layoutMode != 'grid'){
config.layoutMode = 'grid';
goMix(config.filter, null, null, $(this), config);
};
});
},
// "TOLIST" METHOD
toList: function(){
return this.each(function(){
var config = this.config;
if(config.layoutMode != 'list'){
config.layoutMode = 'list';
goMix(config.filter, null, null, $(this), config);
};
});
},
// "FILTER" METHOD
filter: function(arg){
return this.each(function(){
var config = this.config;
if(!config.mixing){
$(config.filterSelector).removeClass('active');
$(config.filterSelector+'[data-filter="'+arg+'"]').addClass('active');
goMix(arg, null, null, $(this), config);
};
});
},
// "SORT" METHOD
sort: function(args){
return this.each(function(){
var config = this.config,
$t = $(this);
if(!config.mixing){
$(config.sortSelector).removeClass('active');
if($.isArray(args)){
var sortby = args[0], order = args[1];
$(config.sortSelector+'[data-sort="'+args[0]+'"][data-order="'+args[1]+'"]').addClass('active');
} else {
$(config.sortSelector+'[data-sort="'+args+'"]').addClass('active');
var sortby = args, order = 'desc';
};
$t.find(config.targetSelector).each(function(){
config.startOrder.push($(this));
});
goMix(config.filter,sortby,order, $t, config);
};
});
},
// "MULTIMIX" METHOD
multimix: function(args){
return this.each(function(){
var config = this.config,
$t = $(this);
multiOut = {
filter: config.filter,
sort: null,
order: 'desc',
layoutMode: config.layoutMode
};
$.extend(multiOut, args);
if(!config.mixing){
$(config.filterSelector).add(config.sortSelector).removeClass('active');
$(config.filterSelector+'[data-filter="'+multiOut.filter+'"]').addClass('active');
if(typeof multiOut.sort !== 'undefined'){
$(config.sortSelector+'[data-sort="'+multiOut.sort+'"][data-order="'+multiOut.order+'"]').addClass('active');
$t.find(config.targetSelector).each(function(){
config.startOrder.push($(this));