(function($, undf){
'use strict';
$.MixItUp=function(){
var self=this;
self._execAction('_constructor', 0);
$.extend(self, {
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
},
_$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={
constructor: $.MixItUp,
_instances: {},
_handled: {
_filter: {},
_sort: {}},
_bound: {
_filter: {},
_sort: {}},
_actions: {},
_filters: {},
extend: function(extension){
for(var key in extension){
$.MixItUp.prototype[key]=extension[key];
}},
addAction: function(hook, name, func, priority){
$.MixItUp.prototype._addHook('_actions', hook, name, func, priority);
},
addFilter: function(hook, name, func, priority){
$.MixItUp.prototype._addHook('_filters', hook, name, func, priority);
},
_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);
},
_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);
},
_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);
for(var x=0; x < vendorsRAF.length&&!window.requestAnimationFrame; x++){
window.requestAnimationFrame=window[vendorsRAF[x]+'RequestAnimationFrame'];
}
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;
};}}
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: 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.value;
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);
},
_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);
},
_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);
}},
_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);
},
_updateControls: function(command, multi){
var self=this,
output={
filter: command.filter,
sort: command.sort
},
update=function($el, filter){
try {
(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);
} catch(e){}},
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: 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: 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: 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;
},
_printSort: function(reset){
var self=this,
order=reset ? self._startOrder:self._newOrder,
targets=self._$parent[0].querySelectorAll(self.selectors.target),
nextSibling=targets.length ? targets[targets.length -1].nextElementSibling:null,
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);
},
_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);
},
_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':'1';
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);
},
_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);
}},
_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);
},
_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 = !self._suckMode ?
window.getComputedStyle(el) :
{
marginBottom: '',
marginRight: ''
};
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;
}},
_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);
},
_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);
},
_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);
},
_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);
},
_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);
},
_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);
},
_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);
},
_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);
},
_targetDone: function(){
var self=this;
self._execAction('_targetDone', 0);
self._targetsDone++;
(self._targetsDone===self._targetsBound)&&self._cleanUp();
self._execAction('_targetDone', 1);
},
_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;
},
_getPrefixedCSS: function(property, value, prefixValue){
var self=this,
styles={},
prefix='',
i=-1;
for(i=0; i < 2; i++){
prefix=i===0 ? self._prefix:'';
prefixValue ? styles[prefix+property]=prefix+value:styles[prefix+property]=value;
}
return self._execFilter('_getPrefixedCSS', styles, arguments);
},
_getDelay: function(i){
var self=this,
n=typeof self.animation.staggerSequence==='function' ? self.animation.staggerSequence.call(self._domNode, i, self._state):i,
delay=self.animation.stagger ? n * self.animation.staggerDuration:0;
return self._execFilter('_getDelay', delay, arguments);
},
_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);
},
_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);
},
_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);
}}
},
_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: {
_camelCase: function(string){
return string.replace(/-([a-z])/g, function(g){
return g[1].toUpperCase();
});
},
_isElement: function(el){
if(window.HTMLElement){
return el instanceof HTMLElement;
}else{
return (
el!==null &&
el.nodeType===1 &&
el.nodeName==='string'
);
}}
},
isMixing: function(){
var self=this;
return self._execFilter('isMixing', self._mixing);
},
filter: function(){
var self=this,
args=self._parseMultiMixArgs(arguments);
self._clicking&&(self._toggleString='');
self.multiMix({filter: args.command}, args.animate, args.callback);
},
sort: function(){
var self=this,
args=self._parseMultiMixArgs(arguments);
self.multiMix({sort: args.command}, args.animate, args.callback);
},
changeLayout: function(){
var self=this,
args=self._parseMultiMixArgs(arguments);
self.multiMix({changeLayout: args.command}, args.animate, args.callback);
},
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: 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: function(){
var self=this,
args=self._parseInsertArgs(arguments);
self.insert(0, args.$object, args.multiMix, args.callback);
},
append: function(){
var self=this,
args=self._parseInsertArgs(arguments);
self.insert(self._state.totalTargets, args.$object, args.multiMix, args.callback);
},
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;
},
setOptions: function(config){
var self=this;
self._execAction('setOptions', 0, arguments);
typeof config==='object'&&$.extend(true, self, config);
self._execAction('setOptions', 1, arguments);
},
getState: function(){
var self=this;
return self._execFilter('getState', self._state, self);
},
forceRefresh: function(){
var self=this;
self._refresh(false, true);
},
destroy: function(hideAll){
var self=this,
filters=$.MixItUp.prototype._bound._filter,
sorts=$.MixItUp.prototype._bound._sort;
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);
if(filters[self.selectors.filter]&&filters[self.selectors.filter] > 1){
filters[self.selectors.filter]--;
}else if(filters[self.selectors.filter]===1){
delete filters[self.selectors.filter];
}
if(sorts[self.selectors.sort]&&sorts[self.selectors.sort] > 1){
sorts[self.selectors.sort]--;
}else if(sorts[self.selectors.sort]===1){
delete sorts[self.selectors.sort];
}
delete $.MixItUp.prototype._instances[self._id];
}};
$.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;
}};
$.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 < 4; j++){
switch (j){
case 0:
var prop=styles[i];
break;
case 1:
var prop=$.MixItUp.prototype._helpers._camelCase(prop);
break;
case 2:
var prop=prefix+styles[i];
break;
case 3:
var prop=$.MixItUp.prototype._helpers._camelCase(prefix+styles[i]);
}
if(el.style[prop]!==undf &&
typeof el.style[prop]!=='unknown' &&
el.style[prop].length > 0
){
el.style[prop]='';
}
if(!prefix&&j===1)break;
}}
if(el.attributes&&el.attributes.style&&el.attributes.style!==undf&&el.attributes.style.value===''){
el.attributes.removeNamedItem('style');
}});
};})(jQuery);