%PDF- %PDF-
| Direktori : /home/tjamichg/intranet.tjamich.gob.mx/intranet/common/vendors/mixitup/src/ |
| Current File : /home/tjamichg/intranet.tjamich.gob.mx/intranet/common/vendors/mixitup/src/jquery.mixitup.js |
/**!
* MixItUp v2.1.4
*
* @copyright Copyright 2014 KunkaLabs Limited.
* @author KunkaLabs Limited.
* @link https://mixitup.kunkalabs.com
*
* @license Commercial use requires a commercial license.
* https://mixitup.kunkalabs.com/licenses/
*
* Non-commercial use permitted under terms of CC-BY-NC license.
* http://creativecommons.org/licenses/by-nc/3.0/
*/
(function ($, undf) {
/**
* MixItUp Constructor Function
* @constructor
* @extends jQuery
*/
$.MixItUp = function () {
var self = this;
self._execAction('_constructor', 0);
$.extend(self, {
/* Public Properties
---------------------------------------------------------------------- */
selectors: {
target: '.mix',
filter: '.filter',
sort: '.sort'
},
animation: {
enable: true,
effects: 'fade scale',
duration: 600,
easing: 'ease',
perspectiveDistance: '3000',
perspectiveOrigin: '50% 50%',
queue: true,
queueLimit: 1,
animateChangeLayout: false,
animateResizeContainer: true,
animateResizeTargets: false,
staggerSequence: false,
reverseOut: false
},
callbacks: {
onMixLoad: false,
onMixStart: false,
onMixBusy: false,
onMixEnd: false,
onMixFail: false,
_user: false
},
controls: {
enable: true,
live: false,
toggleFilterButtons: false,
toggleLogic: 'or',
activeClass: 'active'
},
layout: {
display: 'inline-block',
containerClass: '',
containerClassFail: 'fail'
},
load: {
filter: 'all',
sort: false
},
/* Private Properties
---------------------------------------------------------------------- */
_$body: null,
_$container: null,
_$targets: null,
_$parent: null,
_$sortButtons: null,
_$filterButtons: null,
_suckMode: false,
_mixing: false,
_sorting: false,
_clicking: false,
_loading: true,
_changingLayout: false,
_changingClass: false,
_changingDisplay: false,
_origOrder: [],
_startOrder: [],
_newOrder: [],
_activeFilter: null,
_toggleArray: [],
_toggleString: '',
_activeSort: 'default:asc',
_newSort: null,
_startHeight: null,
_newHeight: null,
_incPadding: true,
_newDisplay: null,
_newClass: null,
_targetsBound: 0,
_targetsDone: 0,
_queue: [],
_$show: $(),
_$hide: $()
});
self._execAction('_constructor', 1);
};
/**
* MixItUp Prototype
* @override
*/
$.MixItUp.prototype = {
constructor: $.MixItUp,
/* Static Properties
---------------------------------------------------------------------- */
_instances: {},
_handled: {
_filter: {},
_sort: {}
},
_bound: {
_filter: {},
_sort: {}
},
_actions: {},
_filters: {},
/* Static Methods
---------------------------------------------------------------------- */
/**
* Extend
* @since 2.1.0
* @param {object} new properties/methods
* @extends {object} prototype
*/
extend: function (extension) {
for (var key in extension) {
$.MixItUp.prototype[key] = extension[key];
}
},
/**
* Add Action
* @since 2.1.0
* @param {string} hook name
* @param {string} namespace
* @param {function} function to execute
* @param {number} priority
* @extends {object} $.MixItUp.prototype._actions
*/
addAction: function (hook, name, func, priority) {
$.MixItUp.prototype._addHook('_actions', hook, name, func, priority);
},
/**
* Add Filter
* @since 2.1.0
* @param {string} hook name
* @param {string} namespace
* @param {function} function to execute
* @param {number} priority
* @extends {object} $.MixItUp.prototype._filters
*/
addFilter: function (hook, name, func, priority) {
$.MixItUp.prototype._addHook('_filters', hook, name, func, priority);
},
/**
* Add Hook
* @since 2.1.0
* @param {string} type of hook
* @param {string} hook name
* @param {function} function to execute
* @param {number} priority
* @extends {object} $.MixItUp.prototype._filters
*/
_addHook: function (type, hook, name, func, priority) {
var collection = $.MixItUp.prototype[type],
obj = {};
priority = (priority === 1 || priority === 'post') ? 'post' : 'pre';
obj[hook] = {};
obj[hook][priority] = {};
obj[hook][priority][name] = func;
$.extend(true, collection, obj);
},
/* Private Methods
---------------------------------------------------------------------- */
/**
* Initialise
* @since 2.0.0
* @param {object} domNode
* @param {object} config
*/
_init: function (domNode, config) {
var self = this;
self._execAction('_init', 0, arguments);
config && $.extend(true, self, config);
self._$body = $('body');
self._domNode = domNode;
self._$container = $(domNode);
self._$container.addClass(self.layout.containerClass);
self._id = domNode.id;
self._platformDetect();
self._brake = self._getPrefixedCSS('transition', 'none');
self._refresh(true);
self._$parent = self._$targets.parent().length ? self._$targets.parent() : self._$container;
if (self.load.sort) {
self._newSort = self._parseSort(self.load.sort);
self._newSortString = self.load.sort;
self._activeSort = self.load.sort;
self._sort();
self._printSort();
}
self._activeFilter = self.load.filter === 'all' ?
self.selectors.target :
self.load.filter === 'none' ?
'' :
self.load.filter;
self.controls.enable && self._bindHandlers();
if (self.controls.toggleFilterButtons) {
self._buildToggleArray();
for (var i = 0; i < self._toggleArray.length; i++) {
self._updateControls({filter: self._toggleArray[i], sort: self._activeSort}, true);
}
;
} else if (self.controls.enable) {
self._updateControls({filter: self._activeFilter, sort: self._activeSort});
}
self._filter();
self._init = true;
self._$container.data('mixItUp', self);
self._execAction('_init', 1, arguments);
self._buildState();
self._$targets.css(self._brake);
self._goMix(self.animation.enable);
},
/**
* Platform Detect
* @since 2.0.0
*/
_platformDetect: function () {
var self = this,
vendorsTrans = ['Webkit', 'Moz', 'O', 'ms'],
vendorsRAF = ['webkit', 'moz'],
chrome = window.navigator.appVersion.match(/Chrome\/(\d+)\./) || false,
ff = typeof InstallTrigger !== 'undefined',
prefix = function (el) {
for (var i = 0; i < vendorsTrans.length; i++) {
if (vendorsTrans[i] + 'Transition' in el.style) {
return {
prefix: '-' + vendorsTrans[i].toLowerCase() + '-',
vendor: vendorsTrans[i]
};
}
;
}
;
return 'transition' in el.style ? '' : false;
},
transPrefix = prefix(self._domNode);
self._execAction('_platformDetect', 0);
self._chrome = chrome ? parseInt(chrome[1], 10) : false;
self._ff = ff ? parseInt(window.navigator.userAgent.match(/rv:([^)]+)\)/)[1]) : false;
self._prefix = transPrefix.prefix;
self._vendor = transPrefix.vendor;
self._suckMode = window.atob && self._prefix ? false : true;
self._suckMode && (self.animation.enable = false);
(self._ff && self._ff <= 4) && (self.animation.enable = false);
/* Polyfills
---------------------------------------------------------------------- */
/**
* window.requestAnimationFrame
*/
for (var x = 0; x < vendorsRAF.length && !window.requestAnimationFrame; x++) {
window.requestAnimationFrame = window[vendorsRAF[x] + 'RequestAnimationFrame'];
}
/**
* Object.getPrototypeOf
*/
if (typeof Object.getPrototypeOf !== 'function') {
if (typeof 'test'.__proto__ === 'object') {
Object.getPrototypeOf = function (object) {
return object.__proto__;
};
} else {
Object.getPrototypeOf = function (object) {
return object.constructor.prototype;
};
}
}
/**
* Element.nextElementSibling
*/
if (self._domNode.nextElementSibling === undf) {
Object.defineProperty(Element.prototype, 'nextElementSibling', {
get: function () {
var el = this.nextSibling;
while (el) {
if (el.nodeType === 1) {
return el;
}
el = el.nextSibling;
}
return null;
}
});
}
self._execAction('_platformDetect', 1);
},
/**
* Refresh
* @since 2.0.0
* @param {boolean} init
* @param {boolean} force
*/
_refresh: function (init, force) {
var self = this;
self._execAction('_refresh', 0, arguments);
self._$targets = self._$container.find(self.selectors.target);
for (var i = 0; i < self._$targets.length; i++) {
var target = self._$targets[i];
if (target.dataset === undf || force) {
target.dataset = {};
for (var j = 0; j < target.attributes.length; j++) {
var attr = target.attributes[j],
name = attr.name,
val = attr.nodeValue;
if (name.indexOf('data-') > -1) {
var dataName = self._helpers._camelCase(name.substring(5, name.length));
target.dataset[dataName] = val;
}
}
}
if (target.mixParent === undf) {
target.mixParent = self._id;
}
}
if (
(self._$targets.length && init) ||
(!self._origOrder.length && self._$targets.length)
) {
self._origOrder = [];
for (var i = 0; i < self._$targets.length; i++) {
var target = self._$targets[i];
self._origOrder.push(target);
}
}
self._execAction('_refresh', 1, arguments);
},
/**
* Bind Handlers
* @since 2.0.0
*/
_bindHandlers: function () {
var self = this,
filters = $.MixItUp.prototype._bound._filter,
sorts = $.MixItUp.prototype._bound._sort;
self._execAction('_bindHandlers', 0);
if (self.controls.live) {
self._$body
.on('click.mixItUp.' + self._id, self.selectors.sort, function () {
self._processClick($(this), 'sort');
})
.on('click.mixItUp.' + self._id, self.selectors.filter, function () {
self._processClick($(this), 'filter');
});
} else {
self._$sortButtons = $(self.selectors.sort);
self._$filterButtons = $(self.selectors.filter);
self._$sortButtons.on('click.mixItUp.' + self._id, function () {
self._processClick($(this), 'sort');
});
self._$filterButtons.on('click.mixItUp.' + self._id, function () {
self._processClick($(this), 'filter');
});
}
filters[self.selectors.filter] = (filters[self.selectors.filter] === undf) ? 1 : filters[self.selectors.filter] + 1;
sorts[self.selectors.sort] = (sorts[self.selectors.sort] === undf) ? 1 : sorts[self.selectors.sort] + 1;
self._execAction('_bindHandlers', 1);
},
/**
* Process Click
* @since 2.0.0
* @param {object} $button
* @param {string} type
*/
_processClick: function ($button, type) {
var self = this,
trackClick = function ($button, type, off) {
var proto = $.MixItUp.prototype;
proto._handled['_' + type][self.selectors[type]] = (proto._handled['_' + type][self.selectors[type]] === undf) ?
1 :
proto._handled['_' + type][self.selectors[type]] + 1;
if (proto._handled['_' + type][self.selectors[type]] === proto._bound['_' + type][self.selectors[type]]) {
$button[(off ? 'remove' : 'add') + 'Class'](self.controls.activeClass);
delete proto._handled['_' + type][self.selectors[type]];
}
};
self._execAction('_processClick', 0, arguments);
if (!self._mixing || (self.animation.queue && self._queue.length < self.animation.queueLimit)) {
self._clicking = true;
if (type === 'sort') {
var sort = $button.attr('data-sort');
if (!$button.hasClass(self.controls.activeClass) || sort.indexOf('random') > -1) {
$(self.selectors.sort).removeClass(self.controls.activeClass);
trackClick($button, type);
self.sort(sort);
}
}
if (type === 'filter') {
var filter = $button.attr('data-filter'),
ndx,
seperator = self.controls.toggleLogic === 'or' ? ',' : '';
if (!self.controls.toggleFilterButtons) {
if (!$button.hasClass(self.controls.activeClass)) {
$(self.selectors.filter).removeClass(self.controls.activeClass);
trackClick($button, type);
self.filter(filter);
}
} else {
self._buildToggleArray();
if (!$button.hasClass(self.controls.activeClass)) {
trackClick($button, type);
self._toggleArray.push(filter);
} else {
trackClick($button, type, true);
ndx = self._toggleArray.indexOf(filter);
self._toggleArray.splice(ndx, 1);
}
self._toggleArray = $.grep(self._toggleArray, function (n) {
return(n);
});
self._toggleString = self._toggleArray.join(seperator);
self.filter(self._toggleString);
}
}
self._execAction('_processClick', 1, arguments);
} else {
if (typeof self.callbacks.onMixBusy === 'function') {
self.callbacks.onMixBusy.call(self._domNode, self._state, self);
}
self._execAction('_processClickBusy', 1, arguments);
}
},
/**
* Build Toggle Array
* @since 2.0.0
*/
_buildToggleArray: function () {
var self = this,
activeFilter = self._activeFilter.replace(/\s/g, '');
self._execAction('_buildToggleArray', 0, arguments);
if (self.controls.toggleLogic === 'or') {
self._toggleArray = activeFilter.split(',');
} else {
self._toggleArray = activeFilter.split('.');
!self._toggleArray[0] && self._toggleArray.shift();
for (var i = 0, filter; filter = self._toggleArray[i]; i++) {
self._toggleArray[i] = '.' + filter;
}
}
self._execAction('_buildToggleArray', 1, arguments);
},
/**
* Update Controls
* @since 2.0.0
* @param {object} command
* @param {boolean} multi
*/
_updateControls: function (command, multi) {
var self = this,
output = {
filter: command.filter,
sort: command.sort
},
update = function ($el, filter) {
(multi && type == 'filter' && !(output.filter === 'none' || output.filter === '')) ?
$el.filter(filter).addClass(self.controls.activeClass) :
$el.removeClass(self.controls.activeClass).filter(filter).addClass(self.controls.activeClass);
},
type = 'filter',
$el = null;
self._execAction('_updateControls', 0, arguments);
(command.filter === undf) && (output.filter = self._activeFilter);
(command.sort === undf) && (output.sort = self._activeSort);
(output.filter === self.selectors.target) && (output.filter = 'all');
for (var i = 0; i < 2; i++) {
$el = self.controls.live ? $(self.selectors[type]) : self['_$' + type + 'Buttons'];
$el && update($el, '[data-' + type + '="' + output[type] + '"]');
type = 'sort';
}
self._execAction('_updateControls', 1, arguments);
},
/**
* Filter (private)
* @since 2.0.0
*/
_filter: function () {
var self = this;
self._execAction('_filter', 0);
for (var i = 0; i < self._$targets.length; i++) {
var $target = $(self._$targets[i]);
if ($target.is(self._activeFilter)) {
self._$show = self._$show.add($target);
} else {
self._$hide = self._$hide.add($target);
}
}
self._execAction('_filter', 1);
},
/**
* Sort (private)
* @since 2.0.0
*/
_sort: function () {
var self = this,
arrayShuffle = function (oldArray) {
var newArray = oldArray.slice(),
len = newArray.length,
i = len;
while (i--) {
var p = parseInt(Math.random() * len);
var t = newArray[i];
newArray[i] = newArray[p];
newArray[p] = t;
}
;
return newArray;
};
self._execAction('_sort', 0);
self._startOrder = [];
for (var i = 0; i < self._$targets.length; i++) {
var target = self._$targets[i];
self._startOrder.push(target);
}
switch (self._newSort[0].sortBy) {
case 'default':
self._newOrder = self._origOrder;
break;
case 'random':
self._newOrder = arrayShuffle(self._startOrder);
break;
case 'custom':
self._newOrder = self._newSort[0].order;
break;
default:
self._newOrder = self._startOrder.concat().sort(function (a, b) {
return self._compare(a, b);
});
}
self._execAction('_sort', 1);
},
/**
* Compare Algorithm
* @since 2.0.0
* @param {string|number} a
* @param {string|number} b
* @param {number} depth (recursion)
* @return {number}
*/
_compare: function (a, b, depth) {
depth = depth ? depth : 0;
var self = this,
order = self._newSort[depth].order,
getData = function (el) {
return el.dataset[self._newSort[depth].sortBy] || 0;
},
attrA = isNaN(getData(a) * 1) ? getData(a).toLowerCase() : getData(a) * 1,
attrB = isNaN(getData(b) * 1) ? getData(b).toLowerCase() : getData(b) * 1;
if (attrA < attrB)
return order == 'asc' ? -1 : 1;
if (attrA > attrB)
return order == 'asc' ? 1 : -1;
if (attrA == attrB && self._newSort.length > depth + 1)
return self._compare(a, b, depth + 1);
return 0;
},
/**
* Print Sort
* @since 2.0.0
* @param {boolean} reset
*/
_printSort: function (reset) {
var self = this,
order = reset ? self._startOrder : self._newOrder,
targets = self._$parent[0].querySelectorAll(self.selectors.target),
nextSibling = targets[targets.length - 1].nextElementSibling,
frag = document.createDocumentFragment();
self._execAction('_printSort', 0, arguments);
for (var i = 0; i < targets.length; i++) {
var target = targets[i],
whiteSpace = target.nextSibling;
if (target.style.position === 'absolute') continue;
if (whiteSpace && whiteSpace.nodeName == '#text') {
self._$parent[0].removeChild(whiteSpace);
}
self._$parent[0].removeChild(target);
}
for (var i = 0; i < order.length; i++) {
var el = order[i];
if (self._newSort[0].sortBy == 'default' && self._newSort[0].order == 'desc' && !reset) {
var firstChild = frag.firstChild;
frag.insertBefore(el, firstChild);
frag.insertBefore(document.createTextNode(' '), el);
} else {
frag.appendChild(el);
frag.appendChild(document.createTextNode(' '));
}
}
nextSibling ?
self._$parent[0].insertBefore(frag, nextSibling) :
self._$parent[0].appendChild(frag);
self._execAction('_printSort', 1, arguments);
},
/**
* Parse Sort
* @since 2.0.0
* @param {string} sortString
* @return {array} newSort
*/
_parseSort: function (sortString) {
var self = this,
rules = typeof sortString === 'string' ? sortString.split(' ') : [sortString],
newSort = [];
for (var i = 0; i < rules.length; i++) {
var rule = typeof sortString === 'string' ? rules[i].split(':') : ['custom', rules[i]],
ruleObj = {
sortBy: self._helpers._camelCase(rule[0]),
order: rule[1] || 'asc'
};
newSort.push(ruleObj);
if (ruleObj.sortBy == 'default' || ruleObj.sortBy == 'random') break;
}
return self._execFilter('_parseSort', newSort, arguments);
},
/**
* Parse Effects
* @since 2.0.0
* @return {object} effects
*/
_parseEffects: function () {
var self = this,
effects = {
opacity: '',
transformIn: '',
transformOut: '',
filter: ''
},
parse = function (effect, extract, reverse) {
if (self.animation.effects.indexOf(effect) > -1) {
if (extract) {
var propIndex = self.animation.effects.indexOf(effect + '(');
if (propIndex > -1) {
var str = self.animation.effects.substring(propIndex),
match = /\(([^)]+)\)/.exec(str),
val = match[1];
return {val: val};
}
}
return true;
} else {
return false;
}
},
negate = function (value, invert) {
if (invert) {
return value.charAt(0) === '-' ? value.substr(1, value.length) : '-' + value;
} else {
return value;
}
},
buildTransform = function (key, invert) {
var transforms = [
['scale', '.01'],
['translateX', '20px'],
['translateY', '20px'],
['translateZ', '20px'],
['rotateX', '90deg'],
['rotateY', '90deg'],
['rotateZ', '180deg'],
];
for (var i = 0; i < transforms.length; i++) {
var prop = transforms[i][0],
def = transforms[i][1],
inverted = invert && prop !== 'scale';
effects[key] += parse(prop) ? prop + '(' + negate(parse(prop, true).val || def, inverted) + ') ' : '';
}
};
effects.opacity = parse('fade') ? parse('fade', true).val || '0' : '';
buildTransform('transformIn');
self.animation.reverseOut ? buildTransform('transformOut', true) : (effects.transformOut = effects.transformIn);
effects.transition = {};
effects.transition = self._getPrefixedCSS('transition', 'all ' + self.animation.duration + 'ms ' + self.animation.easing + ', opacity ' + self.animation.duration + 'ms linear');
self.animation.stagger = parse('stagger') ? true : false;
self.animation.staggerDuration = parseInt(parse('stagger') ? (parse('stagger', true).val ? parse('stagger', true).val : 100) : 100);
return self._execFilter('_parseEffects', effects);
},
/**
* Build State
* @since 2.0.0
* @param {boolean} future
* @return {object} futureState
*/
_buildState: function (future) {
var self = this,
state = {};
self._execAction('_buildState', 0);
state = {
activeFilter: self._activeFilter === '' ? 'none' : self._activeFilter,
activeSort: future && self._newSortString ? self._newSortString : self._activeSort,
fail: !self._$show.length && self._activeFilter !== '',
$targets: self._$targets,
$show: self._$show,
$hide: self._$hide,
totalTargets: self._$targets.length,
totalShow: self._$show.length,
totalHide: self._$hide.length,
display: future && self._newDisplay ? self._newDisplay : self.layout.display
};
if (future) {
return self._execFilter('_buildState', state);
} else {
self._state = state;
self._execAction('_buildState', 1);
}
},
/**
* Go Mix
* @since 2.0.0
* @param {boolean} animate
*/
_goMix: function (animate) {
var self = this,
phase1 = function () {
if (self._chrome && (self._chrome === 31)) {
chromeFix(self._$parent[0]);
}
self._setInter();
phase2();
},
phase2 = function () {
var scrollTop = window.pageYOffset,
scrollLeft = window.pageXOffset,
docHeight = document.documentElement.scrollHeight;
self._getInterMixData();
self._setFinal();
self._getFinalMixData();
(window.pageYOffset !== scrollTop) && window.scrollTo(scrollLeft, scrollTop);
self._prepTargets();
if (window.requestAnimationFrame) {
requestAnimationFrame(phase3);
} else {
setTimeout(function () {
phase3();
}, 20);
}
},
phase3 = function () {
self._animateTargets();
if (self._targetsBound === 0) {
self._cleanUp();
}
},
chromeFix = function (grid) {
var parent = grid.parentElement,
placeholder = document.createElement('div'),
frag = document.createDocumentFragment();
parent.insertBefore(placeholder, grid);
frag.appendChild(grid);
parent.replaceChild(grid, placeholder);
},
futureState = self._buildState(true);
self._execAction('_goMix', 0, arguments);
!self.animation.duration && (animate = false);
self._mixing = true;
self._$container.removeClass(self.layout.containerClassFail);
if (typeof self.callbacks.onMixStart === 'function') {
self.callbacks.onMixStart.call(self._domNode, self._state, futureState, self);
}
self._$container.trigger('mixStart', [self._state, futureState, self]);
self._getOrigMixData();
if (animate && !self._suckMode) {
window.requestAnimationFrame ?
requestAnimationFrame(phase1) :
phase1();
} else {
self._cleanUp();
}
self._execAction('_goMix', 1, arguments);
},
/**
* Get Target Data
* @since 2.0.0
*/
_getTargetData: function (el, stage) {
var self = this,
elStyle;
el.dataset[stage + 'PosX'] = el.offsetLeft;
el.dataset[stage + 'PosY'] = el.offsetTop;
if (self.animation.animateResizeTargets) {
elStyle = window.getComputedStyle(el);
el.dataset[stage + 'MarginBottom'] = parseInt(elStyle.marginBottom);
el.dataset[stage + 'MarginRight'] = parseInt(elStyle.marginRight);
el.dataset[stage + 'Width'] = el.offsetWidth;
el.dataset[stage + 'Height'] = el.offsetHeight;
}
},
/**
* Get Original Mix Data
* @since 2.0.0
*/
_getOrigMixData: function () {
var self = this,
parentStyle = !self._suckMode ? window.getComputedStyle(self._$parent[0]) : {boxSizing: ''},
parentBS = parentStyle.boxSizing || parentStyle[self._vendor + 'BoxSizing'];
self._incPadding = (parentBS === 'border-box');
self._execAction('_getOrigMixData', 0);
!self._suckMode && (self.effects = self._parseEffects());
self._$toHide = self._$hide.filter(':visible');
self._$toShow = self._$show.filter(':hidden');
self._$pre = self._$targets.filter(':visible');
self._startHeight = self._incPadding ?
self._$parent.outerHeight() :
self._$parent.height();
for (var i = 0; i < self._$pre.length; i++) {
var el = self._$pre[i];
self._getTargetData(el, 'orig');
}
self._execAction('_getOrigMixData', 1);
},
/**
* Set Intermediate Positions
* @since 2.0.0
*/
_setInter: function () {
var self = this;
self._execAction('_setInter', 0);
if (self._changingLayout && self.animation.animateChangeLayout) {
self._$toShow.css('display', self._newDisplay);
if (self._changingClass) {
self._$container
.removeClass(self.layout.containerClass)
.addClass(self._newClass);
}
} else {
self._$toShow.css('display', self.layout.display);
}
self._execAction('_setInter', 1);
},
/**
* Get Intermediate Mix Data
* @since 2.0.0
*/
_getInterMixData: function () {
var self = this;
self._execAction('_getInterMixData', 0);
for (var i = 0; i < self._$toShow.length; i++) {
var el = self._$toShow[i];
self._getTargetData(el, 'inter');
}
for (var i = 0; i < self._$pre.length; i++) {
var el = self._$pre[i];
self._getTargetData(el, 'inter');
}
self._execAction('_getInterMixData', 1);
},
/**
* Set Final Positions
* @since 2.0.0
*/
_setFinal: function () {
var self = this;
self._execAction('_setFinal', 0);
self._sorting && self._printSort();
self._$toHide.removeStyle('display');
if (self._changingLayout && self.animation.animateChangeLayout) {
self._$pre.css('display', self._newDisplay);
}
self._execAction('_setFinal', 1);
},
/**
* Get Final Mix Data
* @since 2.0.0
*/
_getFinalMixData: function () {
var self = this;
self._execAction('_getFinalMixData', 0);
for (var i = 0; i < self._$toShow.length; i++) {
var el = self._$toShow[i];
self._getTargetData(el, 'final');
}
for (var i = 0; i < self._$pre.length; i++) {
var el = self._$pre[i];
self._getTargetData(el, 'final');
}
self._newHeight = self._incPadding ?
self._$parent.outerHeight() :
self._$parent.height();
self._sorting && self._printSort(true);
self._$toShow.removeStyle('display');
self._$pre.css('display', self.layout.display);
if (self._changingClass && self.animation.animateChangeLayout) {
self._$container
.removeClass(self._newClass)
.addClass(self.layout.containerClass);
}
self._execAction('_getFinalMixData', 1);
},
/**
* Prepare Targets
* @since 2.0.0
*/
_prepTargets: function () {
var self = this,
transformCSS = {
_in: self._getPrefixedCSS('transform', self.effects.transformIn),
_out: self._getPrefixedCSS('transform', self.effects.transformOut)
};
self._execAction('_prepTargets', 0);
if (self.animation.animateResizeContainer) {
self._$parent.css('height', self._startHeight + 'px');
}
for (var i = 0; i < self._$toShow.length; i++) {
var el = self._$toShow[i],
$el = $(el);
el.style.opacity = self.effects.opacity;
el.style.display = (self._changingLayout && self.animation.animateChangeLayout) ?
self._newDisplay :
self.layout.display;
$el.css(transformCSS._in);
if (self.animation.animateResizeTargets) {
el.style.width = el.dataset.finalWidth + 'px';
el.style.height = el.dataset.finalHeight + 'px';
el.style.marginRight = -(el.dataset.finalWidth - el.dataset.interWidth) + (el.dataset.finalMarginRight * 1) + 'px';
el.style.marginBottom = -(el.dataset.finalHeight - el.dataset.interHeight) + (el.dataset.finalMarginBottom * 1) + 'px';
}
}
for (var i = 0; i < self._$pre.length; i++) {
var el = self._$pre[i],
$el = $(el),
translate = {
x: el.dataset.origPosX - el.dataset.interPosX,
y: el.dataset.origPosY - el.dataset.interPosY
},
transformCSS = self._getPrefixedCSS('transform', 'translate(' + translate.x + 'px,' + translate.y + 'px)');
$el.css(transformCSS);
if (self.animation.animateResizeTargets) {
el.style.width = el.dataset.origWidth + 'px';
el.style.height = el.dataset.origHeight + 'px';
if (el.dataset.origWidth - el.dataset.finalWidth) {
el.style.marginRight = -(el.dataset.origWidth - el.dataset.interWidth) + (el.dataset.origMarginRight * 1) + 'px';
}
if (el.dataset.origHeight - el.dataset.finalHeight) {
el.style.marginBottom = -(el.dataset.origHeight - el.dataset.interHeight) + (el.dataset.origMarginBottom * 1) + 'px';
}
}
}
self._execAction('_prepTargets', 1);
},
/**
* Animate Targets
* @since 2.0.0
*/
_animateTargets: function () {
var self = this;
self._execAction('_animateTargets', 0);
self._targetsDone = 0;
self._targetsBound = 0;
self._$parent
.css(self._getPrefixedCSS('perspective', self.animation.perspectiveDistance + 'px'))
.css(self._getPrefixedCSS('perspective-origin', self.animation.perspectiveOrigin));
if (self.animation.animateResizeContainer) {
self._$parent
.css(self._getPrefixedCSS('transition', 'height ' + self.animation.duration + 'ms ease'))
.css('height', self._newHeight + 'px');
}
for (var i = 0; i < self._$toShow.length; i++) {
var el = self._$toShow[i],
$el = $(el),
translate = {
x: el.dataset.finalPosX - el.dataset.interPosX,
y: el.dataset.finalPosY - el.dataset.interPosY
},
delay = self._getDelay(i),
toShowCSS = {};
el.style.opacity = '';
for (var j = 0; j < 2; j++) {
var a = j === 0 ? a = self._prefix : '';
if (self._ff && self._ff <= 20) {
toShowCSS[a + 'transition-property'] = 'all';
toShowCSS[a + 'transition-timing-function'] = self.animation.easing + 'ms';
toShowCSS[a + 'transition-duration'] = self.animation.duration + 'ms';
}
toShowCSS[a + 'transition-delay'] = delay + 'ms';
toShowCSS[a + 'transform'] = 'translate(' + translate.x + 'px,' + translate.y + 'px)';
}
if (self.effects.transform || self.effects.opacity) {
self._bindTargetDone($el);
}
(self._ff && self._ff <= 20) ?
$el.css(toShowCSS) :
$el.css(self.effects.transition).css(toShowCSS);
}
for (var i = 0; i < self._$pre.length; i++) {
var el = self._$pre[i],
$el = $(el),
translate = {
x: el.dataset.finalPosX - el.dataset.interPosX,
y: el.dataset.finalPosY - el.dataset.interPosY
},
delay = self._getDelay(i);
if (!(
el.dataset.finalPosX === el.dataset.origPosX &&
el.dataset.finalPosY === el.dataset.origPosY
)) {
self._bindTargetDone($el);
}
$el.css(self._getPrefixedCSS('transition', 'all ' + self.animation.duration + 'ms ' + self.animation.easing + ' ' + delay + 'ms'));
$el.css(self._getPrefixedCSS('transform', 'translate(' + translate.x + 'px,' + translate.y + 'px)'));
if (self.animation.animateResizeTargets) {
if (el.dataset.origWidth - el.dataset.finalWidth && el.dataset.finalWidth * 1) {
el.style.width = el.dataset.finalWidth + 'px';
el.style.marginRight = -(el.dataset.finalWidth - el.dataset.interWidth) + (el.dataset.finalMarginRight * 1) + 'px';
}
if (el.dataset.origHeight - el.dataset.finalHeight && el.dataset.finalHeight * 1) {
el.style.height = el.dataset.finalHeight + 'px';
el.style.marginBottom = -(el.dataset.finalHeight - el.dataset.interHeight) + (el.dataset.finalMarginBottom * 1) + 'px';
}
}
}
if (self._changingClass) {
self._$container
.removeClass(self.layout.containerClass)
.addClass(self._newClass);
}
for (var i = 0; i < self._$toHide.length; i++) {
var el = self._$toHide[i],
$el = $(el),
delay = self._getDelay(i),
toHideCSS = {};
for (var j = 0; j < 2; j++) {
var a = j === 0 ? a = self._prefix : '';
toHideCSS[a + 'transition-delay'] = delay + 'ms';
toHideCSS[a + 'transform'] = self.effects.transformOut;
toHideCSS.opacity = self.effects.opacity;
}
$el.css(self.effects.transition).css(toHideCSS);
if (self.effects.transform || self.effects.opacity) {
self._bindTargetDone($el);
}
;
}
self._execAction('_animateTargets', 1);
},
/**
* Bind Targets TransitionEnd
* @since 2.0.0
* @param {object} $el
*/
_bindTargetDone: function ($el) {
var self = this,
el = $el[0];
self._execAction('_bindTargetDone', 0, arguments);
if (!el.dataset.bound) {
el.dataset.bound = true;
self._targetsBound++;
$el.on('webkitTransitionEnd.mixItUp transitionend.mixItUp', function (e) {
if (
(e.originalEvent.propertyName.indexOf('transform') > -1 ||
e.originalEvent.propertyName.indexOf('opacity') > -1) &&
$(e.originalEvent.target).is(self.selectors.target)
) {
$el.off('.mixItUp');
delete el.dataset.bound;
self._targetDone();
}
});
}
self._execAction('_bindTargetDone', 1, arguments);
},
/**
* Target Done
* @since 2.0.0
*/
_targetDone: function () {
var self = this;
self._execAction('_targetDone', 0);
self._targetsDone++;
(self._targetsDone === self._targetsBound) && self._cleanUp();
self._execAction('_targetDone', 1);
},
/**
* Clean Up
* @since 2.0.0
*/
_cleanUp: function () {
var self = this,
targetStyles = self.animation.animateResizeTargets ? 'transform opacity width height margin-bottom margin-right' : 'transform opacity';
unBrake = function () {
self._$targets.removeStyle('transition', self._prefix);
};
self._execAction('_cleanUp', 0);
!self._changingLayout ?
self._$show.css('display', self.layout.display) :
self._$show.css('display', self._newDisplay);
self._$targets.css(self._brake);
self._$targets
.removeStyle(targetStyles, self._prefix)
.removeAttr('data-inter-pos-x data-inter-pos-y data-final-pos-x data-final-pos-y data-orig-pos-x data-orig-pos-y data-orig-height data-orig-width data-final-height data-final-width data-inter-width data-inter-height data-orig-margin-right data-orig-margin-bottom data-inter-margin-right data-inter-margin-bottom data-final-margin-right data-final-margin-bottom');
self._$hide.removeStyle('display');
self._$parent.removeStyle('height transition perspective-distance perspective perspective-origin-x perspective-origin-y perspective-origin perspectiveOrigin', self._prefix);
if (self._sorting) {
self._printSort();
self._activeSort = self._newSortString;
self._sorting = false;
}
if (self._changingLayout) {
if (self._changingDisplay) {
self.layout.display = self._newDisplay;
self._changingDisplay = false;
}
if (self._changingClass) {
self._$parent.removeClass(self.layout.containerClass).addClass(self._newClass);
self.layout.containerClass = self._newClass;
self._changingClass = false;
}
self._changingLayout = false;
}
self._refresh();
self._buildState();
if (self._state.fail) {
self._$container.addClass(self.layout.containerClassFail);
}
self._$show = $();
self._$hide = $();
if (window.requestAnimationFrame) {
requestAnimationFrame(unBrake);
}
self._mixing = false;
if (typeof self.callbacks._user === 'function') {
self.callbacks._user.call(self._domNode, self._state, self);
}
if (typeof self.callbacks.onMixEnd === 'function') {
self.callbacks.onMixEnd.call(self._domNode, self._state, self);
}
self._$container.trigger('mixEnd', [self._state, self]);
if (self._state.fail) {
(typeof self.callbacks.onMixFail === 'function') && self.callbacks.onMixFail.call(self._domNode, self._state, self);
self._$container.trigger('mixFail', [self._state, self]);
}
if (self._loading) {
(typeof self.callbacks.onMixLoad === 'function') && self.callbacks.onMixLoad.call(self._domNode, self._state, self);
self._$container.trigger('mixLoad', [self._state, self]);
}
if (self._queue.length) {
self._execAction('_queue', 0);
self.multiMix(self._queue[0][0], self._queue[0][1], self._queue[0][2]);
self._queue.splice(0, 1);
}
self._execAction('_cleanUp', 1);
self._loading = false;
},
/**
* Get Prefixed CSS
* @since 2.0.0
* @param {string} property
* @param {string} value
* @param {boolean} prefixValue
* @return {object} styles
*/
_getPrefixedCSS: function (property, value, prefixValue) {
var self = this,
styles = {};
for (i = 0; i < 2; i++) {
var prefix = i === 0 ? self._prefix : '';
prefixValue ? styles[prefix + property] = prefix + value : styles[prefix + property] = value;
}
return self._execFilter('_getPrefixedCSS', styles, arguments);
},
/**
* Get Delay
* @since 2.0.0
* @param {number} i
* @return {number} delay
*/
_getDelay: function (i) {
var self = this,
n = typeof self.animation.staggerFunction === 'function' ? self.animation.staggerFunction.call(self._domNode, i, self._state) : i,
delay = self.animation.stagger ? n * self.animation.staggerDuration : 0;
return self._execFilter('_getDelay', delay, arguments);
},
/**
* Parse MultiMix Arguments
* @since 2.0.0
* @param {array} args
* @return {object} output
*/
_parseMultiMixArgs: function (args) {
var self = this,
output = {
command: null,
animate: self.animation.enable,
callback: null
};
for (var i = 0; i < args.length; i++) {
var arg = args[i];
if (arg !== null) {
if (typeof arg === 'object' || typeof arg === 'string') {
output.command = arg;
} else if (typeof arg === 'boolean') {
output.animate = arg;
} else if (typeof arg === 'function') {
output.callback = arg;
}
}
}
return self._execFilter('_parseMultiMixArgs', output, arguments);
},
/**
* Parse Insert Arguments
* @since 2.0.0
* @param {array} args
* @return {object} output
*/
_parseInsertArgs: function (args) {
var self = this,
output = {
index: 0,
$object: $(),
multiMix: {filter: self._state.activeFilter},
callback: null
};
for (var i = 0; i < args.length; i++) {
var arg = args[i];
if (typeof arg === 'number') {
output.index = arg;
} else if (typeof arg === 'object' && arg instanceof $) {
output.$object = arg;
} else if (typeof arg === 'object' && self._helpers._isElement(arg)) {
output.$object = $(arg);
} else if (typeof arg === 'object' && arg !== null) {
output.multiMix = arg;
} else if (typeof arg === 'boolean' && !arg) {
output.multiMix = false;
} else if (typeof arg === 'function') {
output.callback = arg;
}
}
return self._execFilter('_parseInsertArgs', output, arguments);
},
/**
* Execute Action
* @since 2.0.0
* @param {string} methodName
* @param {boolean} isPost
* @param {array} args
*/
_execAction: function (methodName, isPost, args) {
var self = this,
context = isPost ? 'post' : 'pre';
if (!self._actions.isEmptyObject && self._actions.hasOwnProperty(methodName)) {
for (var key in self._actions[methodName][context]) {
self._actions[methodName][context][key].call(self, args);
}
}
},
/**
* Execute Filter
* @since 2.0.0
* @param {string} methodName
* @param {mixed} value
* @return {mixed} value
*/
_execFilter: function (methodName, value, args) {
var self = this;
if (!self._filters.isEmptyObject && self._filters.hasOwnProperty(methodName)) {
for (var key in self._filters[methodName]) {
return self._filters[methodName][key].call(self, args);
}
} else {
return value;
}
},
/* Helpers
---------------------------------------------------------------------- */
_helpers: {
/**
* CamelCase
* @since 2.0.0
* @param {string}
* @return {string}
*/
_camelCase: function (string) {
return string.replace(/-([a-z])/g, function (g) {
return g[1].toUpperCase();
});
},
/**
* Is Element
* @since 2.1.3
* @param {object} element to test
* @return {boolean}
*/
_isElement: function (el) {
if (window.HTMLElement) {
return el instanceof HTMLElement;
} else {
return (
el !== null &&
el.nodeType === 1 &&
el.nodeName === 'string'
);
}
}
},
/* Public Methods
---------------------------------------------------------------------- */
/**
* Is Mixing
* @since 2.0.0
* @return {boolean}
*/
isMixing: function () {
var self = this;
return self._execFilter('isMixing', self._mixing);
},
/**
* Filter (public)
* @since 2.0.0
* @param {array} arguments
*/
filter: function () {
var self = this,
args = self._parseMultiMixArgs(arguments);
self._clicking && (self._toggleString = '');
self.multiMix({filter: args.command}, args.animate, args.callback);
},
/**
* Sort (public)
* @since 2.0.0
* @param {array} arguments
*/
sort: function () {
var self = this,
args = self._parseMultiMixArgs(arguments);
self.multiMix({sort: args.command}, args.animate, args.callback);
},
/**
* Change Layout (public)
* @since 2.0.0
* @param {array} arguments
*/
changeLayout: function () {
var self = this,
args = self._parseMultiMixArgs(arguments);
self.multiMix({changeLayout: args.command}, args.animate, args.callback);
},
/**
* MultiMix
* @since 2.0.0
* @param {array} arguments
*/
multiMix: function () {
var self = this,
args = self._parseMultiMixArgs(arguments);
self._execAction('multiMix', 0, arguments);
if (!self._mixing) {
if (self.controls.enable && !self._clicking) {
self.controls.toggleFilterButtons && self._buildToggleArray();
self._updateControls(args.command, self.controls.toggleFilterButtons);
}
(self._queue.length < 2) && (self._clicking = false);
delete self.callbacks._user;
if (args.callback) self.callbacks._user = args.callback;
var sort = args.command.sort,
filter = args.command.filter,
changeLayout = args.command.changeLayout;
self._refresh();
if (sort) {
self._newSort = self._parseSort(sort);
self._newSortString = sort;
self._sorting = true;
self._sort();
}
if (filter !== undf) {
filter = (filter === 'all') ? self.selectors.target : filter;
self._activeFilter = filter;
}
self._filter();
if (changeLayout) {
self._newDisplay = (typeof changeLayout === 'string') ? changeLayout : changeLayout.display || self.layout.display;
self._newClass = changeLayout.containerClass || '';
if (
self._newDisplay !== self.layout.display ||
self._newClass !== self.layout.containerClass
) {
self._changingLayout = true;
self._changingClass = (self._newClass !== self.layout.containerClass);
self._changingDisplay = (self._newDisplay !== self.layout.display);
}
}
self._$targets.css(self._brake);
self._goMix(args.animate ^ self.animation.enable ? args.animate : self.animation.enable);
self._execAction('multiMix', 1, arguments);
} else {
if (self.animation.queue && self._queue.length < self.animation.queueLimit) {
self._queue.push(arguments);
(self.controls.enable && !self._clicking) && self._updateControls(args.command);
self._execAction('multiMixQueue', 1, arguments);
} else {
if (typeof self.callbacks.onMixBusy === 'function') {
self.callbacks.onMixBusy.call(self._domNode, self._state, self);
}
self._$container.trigger('mixBusy', [self._state, self]);
self._execAction('multiMixBusy', 1, arguments);
}
}
},
/**
* Insert
* @since 2.0.0
* @param {array} arguments
*/
insert: function () {
var self = this,
args = self._parseInsertArgs(arguments),
callback = (typeof args.callback === 'function') ? args.callback : null,
frag = document.createDocumentFragment(),
target = (function () {
self._refresh();
if (self._$targets.length) {
return (args.index < self._$targets.length || !self._$targets.length) ?
self._$targets[args.index] :
self._$targets[self._$targets.length - 1].nextElementSibling;
} else {
return self._$parent[0].children[0];
}
})();
self._execAction('insert', 0, arguments);
if (args.$object) {
for (var i = 0; i < args.$object.length; i++) {
var el = args.$object[i];
frag.appendChild(el);
frag.appendChild(document.createTextNode(' '));
}
self._$parent[0].insertBefore(frag, target);
}
self._execAction('insert', 1, arguments);
if (typeof args.multiMix === 'object') {
self.multiMix(args.multiMix, callback);
}
},
/**
* Prepend
* @since 2.0.0
* @param {array} arguments
*/
prepend: function () {
var self = this,
args = self._parseInsertArgs(arguments);
self.insert(0, args.$object, args.multiMix, args.callback);
},
/**
* Append
* @since 2.0.0
* @param {array} arguments
*/
append: function () {
var self = this,
args = self._parseInsertArgs(arguments);
self.insert(self._state.totalTargets, args.$object, args.multiMix, args.callback);
},
/**
* Get Option
* @since 2.0.0
* @param {string} string
* @return {mixed} value
*/
getOption: function (string) {
var self = this,
getProperty = function (obj, prop) {
var parts = prop.split('.'),
last = parts.pop(),
l = parts.length,
i = 1,
current = parts[0] || prop;
while ((obj = obj[current]) && i < l) {
current = parts[i];
i++;
}
if (obj !== undf) {
return obj[last] !== undf ? obj[last] : obj;
}
};
return string ? self._execFilter('getOption', getProperty(self, string), arguments) : self;
},
/**
* Set Options
* @since 2.0.0
* @param {object} config
*/
setOptions: function (config) {
var self = this;
self._execAction('setOptions', 0, arguments);
typeof config === 'object' && $.extend(true, self, config);
self._execAction('setOptions', 1, arguments);
},
/**
* Get State
* @since 2.0.0
* @return {object} state
*/
getState: function () {
var self = this;
return self._execFilter('getState', self._state, self);
},
/**
* Force Refresh
* @since 2.1.2
*/
forceRefresh: function () {
var self = this;
self._refresh(false, true);
},
/**
* Destroy
* @since 2.0.0
* @param {boolean} hideAll
*/
destroy: function (hideAll) {
var self = this;
self._execAction('destroy', 0, arguments);
self._$body
.add($(self.selectors.sort))
.add($(self.selectors.filter))
.off('.mixItUp');
for (var i = 0; i < self._$targets.length; i++) {
var target = self._$targets[i];
hideAll && (target.style.display = '');
delete target.mixParent;
}
self._execAction('destroy', 1, arguments);
delete $.MixItUp.prototype._instances[self._id];
}
};
/* jQuery Methods
---------------------------------------------------------------------- */
/**
* jQuery .mixItUp() method
* @since 2.0.0
* @extends $.fn
*/
$.fn.mixItUp = function () {
var args = arguments,
dataReturn = [],
eachReturn,
_instantiate = function (domNode, settings) {
var instance = new $.MixItUp(),
rand = function () {
return ('00000' + (Math.random() * 16777216 << 0).toString(16)).substr(-6).toUpperCase();
};
instance._execAction('_instantiate', 0, arguments);
domNode.id = !domNode.id ? 'MixItUp' + rand() : domNode.id;
if (!instance._instances[domNode.id]) {
instance._instances[domNode.id] = instance;
instance._init(domNode, settings);
}
instance._execAction('_instantiate', 1, arguments);
};
eachReturn = this.each(function () {
if (args && typeof args[0] === 'string') {
var instance = $.MixItUp.prototype._instances[this.id];
if (args[0] == 'isLoaded') {
dataReturn.push(instance ? true : false);
} else {
var data = instance[args[0]](args[1], args[2], args[3]);
if (data !== undf)dataReturn.push(data);
}
} else {
_instantiate(this, args[0]);
}
});
if (dataReturn.length) {
return dataReturn.length > 1 ? dataReturn : dataReturn[0];
} else {
return eachReturn;
}
};
/**
* jQuery .removeStyle() method
* @since 2.0.0
* @extends $.fn
*/
$.fn.removeStyle = function (style, prefix) {
prefix = prefix ? prefix : '';
return this.each(function () {
var el = this,
styles = style.split(' ');
for (var i = 0; i < styles.length; i++) {
for (var j = 0; j < 2; j++) {
var prop = j ? styles[i] : prefix + styles[i];
if (
el.style[prop] !== undf &&
typeof el.style[prop] !== 'unknown' &&
el.style[prop].length > 0
) {
el.style[prop] = '';
}
if (!prefix)break;
}
}
if (el.attributes && el.attributes.style && el.attributes.style !== undf && el.attributes.style.nodeValue === '') {
el.attributes.removeNamedItem('style');
}
});
};
})(jQuery);