Ticket #32802: masonry-clean.patch
File masonry-clean.patch, 185.6 KB (added by , 9 years ago) |
---|
-
wp-includes/js/imagesloaded.js
1 /*! 2 * imagesLoaded PACKAGED v3.1.8 3 * JavaScript is all like "You images are done yet or what?" 4 * MIT License 5 */ 6 7 8 /*! 9 * EventEmitter v4.2.6 - git.io/ee 10 * Oliver Caldwell 11 * MIT license 12 * @preserve 13 */ 14 15 (function () { 16 17 18 /** 19 * Class for managing events. 20 * Can be extended to provide event functionality in other classes. 21 * 22 * @class EventEmitter Manages event registering and emitting. 23 */ 24 function EventEmitter() {} 25 26 // Shortcuts to improve speed and size 27 var proto = EventEmitter.prototype; 28 var exports = this; 29 var originalGlobalValue = exports.EventEmitter; 30 31 /** 32 * Finds the index of the listener for the event in it's storage array. 33 * 34 * @param {Function[]} listeners Array of listeners to search through. 35 * @param {Function} listener Method to look for. 36 * @return {Number} Index of the specified listener, -1 if not found 37 * @api private 38 */ 39 function indexOfListener(listeners, listener) { 40 var i = listeners.length; 41 while (i--) { 42 if (listeners[i].listener === listener) { 43 return i; 44 } 45 } 46 47 return -1; 48 } 49 50 /** 51 * Alias a method while keeping the context correct, to allow for overwriting of target method. 52 * 53 * @param {String} name The name of the target method. 54 * @return {Function} The aliased method 55 * @api private 56 */ 57 function alias(name) { 58 return function aliasClosure() { 59 return this[name].apply(this, arguments); 60 }; 61 } 62 63 /** 64 * Returns the listener array for the specified event. 65 * Will initialise the event object and listener arrays if required. 66 * Will return an object if you use a regex search. The object contains keys for each matched event. So /ba[rz]/ might return an object containing bar and baz. But only if you have either defined them with defineEvent or added some listeners to them. 67 * Each property in the object response is an array of listener functions. 68 * 69 * @param {String|RegExp} evt Name of the event to return the listeners from. 70 * @return {Function[]|Object} All listener functions for the event. 71 */ 72 proto.getListeners = function getListeners(evt) { 73 var events = this._getEvents(); 74 var response; 75 var key; 76 77 // Return a concatenated array of all matching events if 78 // the selector is a regular expression. 79 if (typeof evt === 'object') { 80 response = {}; 81 for (key in events) { 82 if (events.hasOwnProperty(key) && evt.test(key)) { 83 response[key] = events[key]; 84 } 85 } 86 } 87 else { 88 response = events[evt] || (events[evt] = []); 89 } 90 91 return response; 92 }; 93 94 /** 95 * Takes a list of listener objects and flattens it into a list of listener functions. 96 * 97 * @param {Object[]} listeners Raw listener objects. 98 * @return {Function[]} Just the listener functions. 99 */ 100 proto.flattenListeners = function flattenListeners(listeners) { 101 var flatListeners = []; 102 var i; 103 104 for (i = 0; i < listeners.length; i += 1) { 105 flatListeners.push(listeners[i].listener); 106 } 107 108 return flatListeners; 109 }; 110 111 /** 112 * Fetches the requested listeners via getListeners but will always return the results inside an object. This is mainly for internal use but others may find it useful. 113 * 114 * @param {String|RegExp} evt Name of the event to return the listeners from. 115 * @return {Object} All listener functions for an event in an object. 116 */ 117 proto.getListenersAsObject = function getListenersAsObject(evt) { 118 var listeners = this.getListeners(evt); 119 var response; 120 121 if (listeners instanceof Array) { 122 response = {}; 123 response[evt] = listeners; 124 } 125 126 return response || listeners; 127 }; 128 129 /** 130 * Adds a listener function to the specified event. 131 * The listener will not be added if it is a duplicate. 132 * If the listener returns true then it will be removed after it is called. 133 * If you pass a regular expression as the event name then the listener will be added to all events that match it. 134 * 135 * @param {String|RegExp} evt Name of the event to attach the listener to. 136 * @param {Function} listener Method to be called when the event is emitted. If the function returns true then it will be removed after calling. 137 * @return {Object} Current instance of EventEmitter for chaining. 138 */ 139 proto.addListener = function addListener(evt, listener) { 140 var listeners = this.getListenersAsObject(evt); 141 var listenerIsWrapped = typeof listener === 'object'; 142 var key; 143 144 for (key in listeners) { 145 if (listeners.hasOwnProperty(key) && indexOfListener(listeners[key], listener) === -1) { 146 listeners[key].push(listenerIsWrapped ? listener : { 147 listener: listener, 148 once: false 149 }); 150 } 151 } 152 153 return this; 154 }; 155 156 /** 157 * Alias of addListener 158 */ 159 proto.on = alias('addListener'); 160 161 /** 162 * Semi-alias of addListener. It will add a listener that will be 163 * automatically removed after it's first execution. 164 * 165 * @param {String|RegExp} evt Name of the event to attach the listener to. 166 * @param {Function} listener Method to be called when the event is emitted. If the function returns true then it will be removed after calling. 167 * @return {Object} Current instance of EventEmitter for chaining. 168 */ 169 proto.addOnceListener = function addOnceListener(evt, listener) { 170 return this.addListener(evt, { 171 listener: listener, 172 once: true 173 }); 174 }; 175 176 /** 177 * Alias of addOnceListener. 178 */ 179 proto.once = alias('addOnceListener'); 180 181 /** 182 * Defines an event name. This is required if you want to use a regex to add a listener to multiple events at once. If you don't do this then how do you expect it to know what event to add to? Should it just add to every possible match for a regex? No. That is scary and bad. 183 * You need to tell it what event names should be matched by a regex. 184 * 185 * @param {String} evt Name of the event to create. 186 * @return {Object} Current instance of EventEmitter for chaining. 187 */ 188 proto.defineEvent = function defineEvent(evt) { 189 this.getListeners(evt); 190 return this; 191 }; 192 193 /** 194 * Uses defineEvent to define multiple events. 195 * 196 * @param {String[]} evts An array of event names to define. 197 * @return {Object} Current instance of EventEmitter for chaining. 198 */ 199 proto.defineEvents = function defineEvents(evts) { 200 for (var i = 0; i < evts.length; i += 1) { 201 this.defineEvent(evts[i]); 202 } 203 return this; 204 }; 205 206 /** 207 * Removes a listener function from the specified event. 208 * When passed a regular expression as the event name, it will remove the listener from all events that match it. 209 * 210 * @param {String|RegExp} evt Name of the event to remove the listener from. 211 * @param {Function} listener Method to remove from the event. 212 * @return {Object} Current instance of EventEmitter for chaining. 213 */ 214 proto.removeListener = function removeListener(evt, listener) { 215 var listeners = this.getListenersAsObject(evt); 216 var index; 217 var key; 218 219 for (key in listeners) { 220 if (listeners.hasOwnProperty(key)) { 221 index = indexOfListener(listeners[key], listener); 222 223 if (index !== -1) { 224 listeners[key].splice(index, 1); 225 } 226 } 227 } 228 229 return this; 230 }; 231 232 /** 233 * Alias of removeListener 234 */ 235 proto.off = alias('removeListener'); 236 237 /** 238 * Adds listeners in bulk using the manipulateListeners method. 239 * If you pass an object as the second argument you can add to multiple events at once. The object should contain key value pairs of events and listeners or listener arrays. You can also pass it an event name and an array of listeners to be added. 240 * You can also pass it a regular expression to add the array of listeners to all events that match it. 241 * Yeah, this function does quite a bit. That's probably a bad thing. 242 * 243 * @param {String|Object|RegExp} evt An event name if you will pass an array of listeners next. An object if you wish to add to multiple events at once. 244 * @param {Function[]} [listeners] An optional array of listener functions to add. 245 * @return {Object} Current instance of EventEmitter for chaining. 246 */ 247 proto.addListeners = function addListeners(evt, listeners) { 248 // Pass through to manipulateListeners 249 return this.manipulateListeners(false, evt, listeners); 250 }; 251 252 /** 253 * Removes listeners in bulk using the manipulateListeners method. 254 * If you pass an object as the second argument you can remove from multiple events at once. The object should contain key value pairs of events and listeners or listener arrays. 255 * You can also pass it an event name and an array of listeners to be removed. 256 * You can also pass it a regular expression to remove the listeners from all events that match it. 257 * 258 * @param {String|Object|RegExp} evt An event name if you will pass an array of listeners next. An object if you wish to remove from multiple events at once. 259 * @param {Function[]} [listeners] An optional array of listener functions to remove. 260 * @return {Object} Current instance of EventEmitter for chaining. 261 */ 262 proto.removeListeners = function removeListeners(evt, listeners) { 263 // Pass through to manipulateListeners 264 return this.manipulateListeners(true, evt, listeners); 265 }; 266 267 /** 268 * Edits listeners in bulk. The addListeners and removeListeners methods both use this to do their job. You should really use those instead, this is a little lower level. 269 * The first argument will determine if the listeners are removed (true) or added (false). 270 * If you pass an object as the second argument you can add/remove from multiple events at once. The object should contain key value pairs of events and listeners or listener arrays. 271 * You can also pass it an event name and an array of listeners to be added/removed. 272 * You can also pass it a regular expression to manipulate the listeners of all events that match it. 273 * 274 * @param {Boolean} remove True if you want to remove listeners, false if you want to add. 275 * @param {String|Object|RegExp} evt An event name if you will pass an array of listeners next. An object if you wish to add/remove from multiple events at once. 276 * @param {Function[]} [listeners] An optional array of listener functions to add/remove. 277 * @return {Object} Current instance of EventEmitter for chaining. 278 */ 279 proto.manipulateListeners = function manipulateListeners(remove, evt, listeners) { 280 var i; 281 var value; 282 var single = remove ? this.removeListener : this.addListener; 283 var multiple = remove ? this.removeListeners : this.addListeners; 284 285 // If evt is an object then pass each of it's properties to this method 286 if (typeof evt === 'object' && !(evt instanceof RegExp)) { 287 for (i in evt) { 288 if (evt.hasOwnProperty(i) && (value = evt[i])) { 289 // Pass the single listener straight through to the singular method 290 if (typeof value === 'function') { 291 single.call(this, i, value); 292 } 293 else { 294 // Otherwise pass back to the multiple function 295 multiple.call(this, i, value); 296 } 297 } 298 } 299 } 300 else { 301 // So evt must be a string 302 // And listeners must be an array of listeners 303 // Loop over it and pass each one to the multiple method 304 i = listeners.length; 305 while (i--) { 306 single.call(this, evt, listeners[i]); 307 } 308 } 309 310 return this; 311 }; 312 313 /** 314 * Removes all listeners from a specified event. 315 * If you do not specify an event then all listeners will be removed. 316 * That means every event will be emptied. 317 * You can also pass a regex to remove all events that match it. 318 * 319 * @param {String|RegExp} [evt] Optional name of the event to remove all listeners for. Will remove from every event if not passed. 320 * @return {Object} Current instance of EventEmitter for chaining. 321 */ 322 proto.removeEvent = function removeEvent(evt) { 323 var type = typeof evt; 324 var events = this._getEvents(); 325 var key; 326 327 // Remove different things depending on the state of evt 328 if (type === 'string') { 329 // Remove all listeners for the specified event 330 delete events[evt]; 331 } 332 else if (type === 'object') { 333 // Remove all events matching the regex. 334 for (key in events) { 335 if (events.hasOwnProperty(key) && evt.test(key)) { 336 delete events[key]; 337 } 338 } 339 } 340 else { 341 // Remove all listeners in all events 342 delete this._events; 343 } 344 345 return this; 346 }; 347 348 /** 349 * Alias of removeEvent. 350 * 351 * Added to mirror the node API. 352 */ 353 proto.removeAllListeners = alias('removeEvent'); 354 355 /** 356 * Emits an event of your choice. 357 * When emitted, every listener attached to that event will be executed. 358 * If you pass the optional argument array then those arguments will be passed to every listener upon execution. 359 * Because it uses `apply`, your array of arguments will be passed as if you wrote them out separately. 360 * So they will not arrive within the array on the other side, they will be separate. 361 * You can also pass a regular expression to emit to all events that match it. 362 * 363 * @param {String|RegExp} evt Name of the event to emit and execute listeners for. 364 * @param {Array} [args] Optional array of arguments to be passed to each listener. 365 * @return {Object} Current instance of EventEmitter for chaining. 366 */ 367 proto.emitEvent = function emitEvent(evt, args) { 368 var listeners = this.getListenersAsObject(evt); 369 var listener; 370 var i; 371 var key; 372 var response; 373 374 for (key in listeners) { 375 if (listeners.hasOwnProperty(key)) { 376 i = listeners[key].length; 377 378 while (i--) { 379 // If the listener returns true then it shall be removed from the event 380 // The function is executed either with a basic call or an apply if there is an args array 381 listener = listeners[key][i]; 382 383 if (listener.once === true) { 384 this.removeListener(evt, listener.listener); 385 } 386 387 response = listener.listener.apply(this, args || []); 388 389 if (response === this._getOnceReturnValue()) { 390 this.removeListener(evt, listener.listener); 391 } 392 } 393 } 394 } 395 396 return this; 397 }; 398 399 /** 400 * Alias of emitEvent 401 */ 402 proto.trigger = alias('emitEvent'); 403 404 /** 405 * Subtly different from emitEvent in that it will pass its arguments on to the listeners, as opposed to taking a single array of arguments to pass on. 406 * As with emitEvent, you can pass a regex in place of the event name to emit to all events that match it. 407 * 408 * @param {String|RegExp} evt Name of the event to emit and execute listeners for. 409 * @param {...*} Optional additional arguments to be passed to each listener. 410 * @return {Object} Current instance of EventEmitter for chaining. 411 */ 412 proto.emit = function emit(evt) { 413 var args = Array.prototype.slice.call(arguments, 1); 414 return this.emitEvent(evt, args); 415 }; 416 417 /** 418 * Sets the current value to check against when executing listeners. If a 419 * listeners return value matches the one set here then it will be removed 420 * after execution. This value defaults to true. 421 * 422 * @param {*} value The new value to check for when executing listeners. 423 * @return {Object} Current instance of EventEmitter for chaining. 424 */ 425 proto.setOnceReturnValue = function setOnceReturnValue(value) { 426 this._onceReturnValue = value; 427 return this; 428 }; 429 430 /** 431 * Fetches the current value to check against when executing listeners. If 432 * the listeners return value matches this one then it should be removed 433 * automatically. It will return true by default. 434 * 435 * @return {*|Boolean} The current value to check for or the default, true. 436 * @api private 437 */ 438 proto._getOnceReturnValue = function _getOnceReturnValue() { 439 if (this.hasOwnProperty('_onceReturnValue')) { 440 return this._onceReturnValue; 441 } 442 else { 443 return true; 444 } 445 }; 446 447 /** 448 * Fetches the events object and creates one if required. 449 * 450 * @return {Object} The events storage object. 451 * @api private 452 */ 453 proto._getEvents = function _getEvents() { 454 return this._events || (this._events = {}); 455 }; 456 457 /** 458 * Reverts the global {@link EventEmitter} to its previous value and returns a reference to this version. 459 * 460 * @return {Function} Non conflicting EventEmitter class. 461 */ 462 EventEmitter.noConflict = function noConflict() { 463 exports.EventEmitter = originalGlobalValue; 464 return EventEmitter; 465 }; 466 467 // Expose the class either via AMD, CommonJS or the global object 468 if (typeof define === 'function' && define.amd) { 469 define('eventEmitter/EventEmitter',[],function () { 470 return EventEmitter; 471 }); 472 } 473 else if (typeof module === 'object' && module.exports){ 474 module.exports = EventEmitter; 475 } 476 else { 477 this.EventEmitter = EventEmitter; 478 } 479 }.call(this)); 480 481 /*! 482 * eventie v1.0.4 483 * event binding helper 484 * eventie.bind( elem, 'click', myFn ) 485 * eventie.unbind( elem, 'click', myFn ) 486 */ 487 488 /*jshint browser: true, undef: true, unused: true */ 489 /*global define: false */ 490 491 ( function( window ) { 492 493 494 495 var docElem = document.documentElement; 496 497 var bind = function() {}; 498 499 function getIEEvent( obj ) { 500 var event = window.event; 501 // add event.target 502 event.target = event.target || event.srcElement || obj; 503 return event; 504 } 505 506 if ( docElem.addEventListener ) { 507 bind = function( obj, type, fn ) { 508 obj.addEventListener( type, fn, false ); 509 }; 510 } else if ( docElem.attachEvent ) { 511 bind = function( obj, type, fn ) { 512 obj[ type + fn ] = fn.handleEvent ? 513 function() { 514 var event = getIEEvent( obj ); 515 fn.handleEvent.call( fn, event ); 516 } : 517 function() { 518 var event = getIEEvent( obj ); 519 fn.call( obj, event ); 520 }; 521 obj.attachEvent( "on" + type, obj[ type + fn ] ); 522 }; 523 } 524 525 var unbind = function() {}; 526 527 if ( docElem.removeEventListener ) { 528 unbind = function( obj, type, fn ) { 529 obj.removeEventListener( type, fn, false ); 530 }; 531 } else if ( docElem.detachEvent ) { 532 unbind = function( obj, type, fn ) { 533 obj.detachEvent( "on" + type, obj[ type + fn ] ); 534 try { 535 delete obj[ type + fn ]; 536 } catch ( err ) { 537 // can't delete window object properties 538 obj[ type + fn ] = undefined; 539 } 540 }; 541 } 542 543 var eventie = { 544 bind: bind, 545 unbind: unbind 546 }; 547 548 // transport 549 if ( typeof define === 'function' && define.amd ) { 550 // AMD 551 define( 'eventie/eventie',eventie ); 552 } else { 553 // browser global 554 window.eventie = eventie; 555 } 556 557 })( this ); 558 559 /*! 560 * imagesLoaded v3.1.8 561 * JavaScript is all like "You images are done yet or what?" 562 * MIT License 563 */ 564 565 ( function( window, factory ) { 566 // universal module definition 567 568 /*global define: false, module: false, require: false */ 569 570 if ( typeof define === 'function' && define.amd ) { 571 // AMD 572 define( [ 573 'eventEmitter/EventEmitter', 574 'eventie/eventie' 575 ], function( EventEmitter, eventie ) { 576 return factory( window, EventEmitter, eventie ); 577 }); 578 } else if ( typeof exports === 'object' ) { 579 // CommonJS 580 module.exports = factory( 581 window, 582 require('wolfy87-eventemitter'), 583 require('eventie') 584 ); 585 } else { 586 // browser global 587 window.imagesLoaded = factory( 588 window, 589 window.EventEmitter, 590 window.eventie 591 ); 592 } 593 594 })( window, 595 596 // -------------------------- factory -------------------------- // 597 598 function factory( window, EventEmitter, eventie ) { 599 600 601 602 var $ = window.jQuery; 603 var console = window.console; 604 var hasConsole = typeof console !== 'undefined'; 605 606 // -------------------------- helpers -------------------------- // 607 608 // extend objects 609 function extend( a, b ) { 610 for ( var prop in b ) { 611 a[ prop ] = b[ prop ]; 612 } 613 return a; 614 } 615 616 var objToString = Object.prototype.toString; 617 function isArray( obj ) { 618 return objToString.call( obj ) === '[object Array]'; 619 } 620 621 // turn element or nodeList into an array 622 function makeArray( obj ) { 623 var ary = []; 624 if ( isArray( obj ) ) { 625 // use object if already an array 626 ary = obj; 627 } else if ( typeof obj.length === 'number' ) { 628 // convert nodeList to array 629 for ( var i=0, len = obj.length; i < len; i++ ) { 630 ary.push( obj[i] ); 631 } 632 } else { 633 // array of single index 634 ary.push( obj ); 635 } 636 return ary; 637 } 638 639 // -------------------------- imagesLoaded -------------------------- // 640 641 /** 642 * @param {Array, Element, NodeList, String} elem 643 * @param {Object or Function} options - if function, use as callback 644 * @param {Function} onAlways - callback function 645 */ 646 function ImagesLoaded( elem, options, onAlways ) { 647 // coerce ImagesLoaded() without new, to be new ImagesLoaded() 648 if ( !( this instanceof ImagesLoaded ) ) { 649 return new ImagesLoaded( elem, options ); 650 } 651 // use elem as selector string 652 if ( typeof elem === 'string' ) { 653 elem = document.querySelectorAll( elem ); 654 } 655 656 this.elements = makeArray( elem ); 657 this.options = extend( {}, this.options ); 658 659 if ( typeof options === 'function' ) { 660 onAlways = options; 661 } else { 662 extend( this.options, options ); 663 } 664 665 if ( onAlways ) { 666 this.on( 'always', onAlways ); 667 } 668 669 this.getImages(); 670 671 if ( $ ) { 672 // add jQuery Deferred object 673 this.jqDeferred = new $.Deferred(); 674 } 675 676 // HACK check async to allow time to bind listeners 677 var _this = this; 678 setTimeout( function() { 679 _this.check(); 680 }); 681 } 682 683 ImagesLoaded.prototype = new EventEmitter(); 684 685 ImagesLoaded.prototype.options = {}; 686 687 ImagesLoaded.prototype.getImages = function() { 688 this.images = []; 689 690 // filter & find items if we have an item selector 691 for ( var i=0, len = this.elements.length; i < len; i++ ) { 692 var elem = this.elements[i]; 693 // filter siblings 694 if ( elem.nodeName === 'IMG' ) { 695 this.addImage( elem ); 696 } 697 // find children 698 // no non-element nodes, #143 699 var nodeType = elem.nodeType; 700 if ( !nodeType || !( nodeType === 1 || nodeType === 9 || nodeType === 11 ) ) { 701 continue; 702 } 703 var childElems = elem.querySelectorAll('img'); 704 // concat childElems to filterFound array 705 for ( var j=0, jLen = childElems.length; j < jLen; j++ ) { 706 var img = childElems[j]; 707 this.addImage( img ); 708 } 709 } 710 }; 711 712 /** 713 * @param {Image} img 714 */ 715 ImagesLoaded.prototype.addImage = function( img ) { 716 var loadingImage = new LoadingImage( img ); 717 this.images.push( loadingImage ); 718 }; 719 720 ImagesLoaded.prototype.check = function() { 721 var _this = this; 722 var checkedCount = 0; 723 var length = this.images.length; 724 this.hasAnyBroken = false; 725 // complete if no images 726 if ( !length ) { 727 this.complete(); 728 return; 729 } 730 731 function onConfirm( image, message ) { 732 if ( _this.options.debug && hasConsole ) { 733 console.log( 'confirm', image, message ); 734 } 735 736 _this.progress( image ); 737 checkedCount++; 738 if ( checkedCount === length ) { 739 _this.complete(); 740 } 741 return true; // bind once 742 } 743 744 for ( var i=0; i < length; i++ ) { 745 var loadingImage = this.images[i]; 746 loadingImage.on( 'confirm', onConfirm ); 747 loadingImage.check(); 748 } 749 }; 750 751 ImagesLoaded.prototype.progress = function( image ) { 752 this.hasAnyBroken = this.hasAnyBroken || !image.isLoaded; 753 // HACK - Chrome triggers event before object properties have changed. #83 754 var _this = this; 755 setTimeout( function() { 756 _this.emit( 'progress', _this, image ); 757 if ( _this.jqDeferred && _this.jqDeferred.notify ) { 758 _this.jqDeferred.notify( _this, image ); 759 } 760 }); 761 }; 762 763 ImagesLoaded.prototype.complete = function() { 764 var eventName = this.hasAnyBroken ? 'fail' : 'done'; 765 this.isComplete = true; 766 var _this = this; 767 // HACK - another setTimeout so that confirm happens after progress 768 setTimeout( function() { 769 _this.emit( eventName, _this ); 770 _this.emit( 'always', _this ); 771 if ( _this.jqDeferred ) { 772 var jqMethod = _this.hasAnyBroken ? 'reject' : 'resolve'; 773 _this.jqDeferred[ jqMethod ]( _this ); 774 } 775 }); 776 }; 777 778 // -------------------------- jquery -------------------------- // 779 780 if ( $ ) { 781 $.fn.imagesLoaded = function( options, callback ) { 782 var instance = new ImagesLoaded( this, options, callback ); 783 return instance.jqDeferred.promise( $(this) ); 784 }; 785 } 786 787 788 // -------------------------- -------------------------- // 789 790 function LoadingImage( img ) { 791 this.img = img; 792 } 793 794 LoadingImage.prototype = new EventEmitter(); 795 796 LoadingImage.prototype.check = function() { 797 // first check cached any previous images that have same src 798 var resource = cache[ this.img.src ] || new Resource( this.img.src ); 799 if ( resource.isConfirmed ) { 800 this.confirm( resource.isLoaded, 'cached was confirmed' ); 801 return; 802 } 803 804 // If complete is true and browser supports natural sizes, 805 // try to check for image status manually. 806 if ( this.img.complete && this.img.naturalWidth !== undefined ) { 807 // report based on naturalWidth 808 this.confirm( this.img.naturalWidth !== 0, 'naturalWidth' ); 809 return; 810 } 811 812 // If none of the checks above matched, simulate loading on detached element. 813 var _this = this; 814 resource.on( 'confirm', function( resrc, message ) { 815 _this.confirm( resrc.isLoaded, message ); 816 return true; 817 }); 818 819 resource.check(); 820 }; 821 822 LoadingImage.prototype.confirm = function( isLoaded, message ) { 823 this.isLoaded = isLoaded; 824 this.emit( 'confirm', this, message ); 825 }; 826 827 // -------------------------- Resource -------------------------- // 828 829 // Resource checks each src, only once 830 // separate class from LoadingImage to prevent memory leaks. See #115 831 832 var cache = {}; 833 834 function Resource( src ) { 835 this.src = src; 836 // add to cache 837 cache[ src ] = this; 838 } 839 840 Resource.prototype = new EventEmitter(); 841 842 Resource.prototype.check = function() { 843 // only trigger checking once 844 if ( this.isChecked ) { 845 return; 846 } 847 // simulate loading on detached element 848 var proxyImage = new Image(); 849 eventie.bind( proxyImage, 'load', this ); 850 eventie.bind( proxyImage, 'error', this ); 851 proxyImage.src = this.src; 852 // set flag 853 this.isChecked = true; 854 }; 855 856 // ----- events ----- // 857 858 // trigger specified handler for event type 859 Resource.prototype.handleEvent = function( event ) { 860 var method = 'on' + event.type; 861 if ( this[ method ] ) { 862 this[ method ]( event ); 863 } 864 }; 865 866 Resource.prototype.onload = function( event ) { 867 this.confirm( true, 'onload' ); 868 this.unbindProxyEvents( event ); 869 }; 870 871 Resource.prototype.onerror = function( event ) { 872 this.confirm( false, 'onerror' ); 873 this.unbindProxyEvents( event ); 874 }; 875 876 // ----- confirm ----- // 877 878 Resource.prototype.confirm = function( isLoaded, message ) { 879 this.isConfirmed = true; 880 this.isLoaded = isLoaded; 881 this.emit( 'confirm', this, message ); 882 }; 883 884 Resource.prototype.unbindProxyEvents = function( event ) { 885 eventie.unbind( event.target, 'load', this ); 886 eventie.unbind( event.target, 'error', this ); 887 }; 888 889 // ----- ----- // 890 891 return ImagesLoaded; 892 893 }); -
wp-includes/js/imagesloaded.min.js
1 /*! 2 * imagesLoaded PACKAGED v3.1.8 3 * JavaScript is all like "You images are done yet or what?" 4 * MIT License 5 */ 6 7 (function(){function e(){}function t(e,t){for(var n=e.length;n--;)if(e[n].listener===t)return n;return-1}function n(e){return function(){return this[e].apply(this,arguments)}}var i=e.prototype,r=this,o=r.EventEmitter;i.getListeners=function(e){var t,n,i=this._getEvents();if("object"==typeof e){t={};for(n in i)i.hasOwnProperty(n)&&e.test(n)&&(t[n]=i[n])}else t=i[e]||(i[e]=[]);return t},i.flattenListeners=function(e){var t,n=[];for(t=0;e.length>t;t+=1)n.push(e[t].listener);return n},i.getListenersAsObject=function(e){var t,n=this.getListeners(e);return n instanceof Array&&(t={},t[e]=n),t||n},i.addListener=function(e,n){var i,r=this.getListenersAsObject(e),o="object"==typeof n;for(i in r)r.hasOwnProperty(i)&&-1===t(r[i],n)&&r[i].push(o?n:{listener:n,once:!1});return this},i.on=n("addListener"),i.addOnceListener=function(e,t){return this.addListener(e,{listener:t,once:!0})},i.once=n("addOnceListener"),i.defineEvent=function(e){return this.getListeners(e),this},i.defineEvents=function(e){for(var t=0;e.length>t;t+=1)this.defineEvent(e[t]);return this},i.removeListener=function(e,n){var i,r,o=this.getListenersAsObject(e);for(r in o)o.hasOwnProperty(r)&&(i=t(o[r],n),-1!==i&&o[r].splice(i,1));return this},i.off=n("removeListener"),i.addListeners=function(e,t){return this.manipulateListeners(!1,e,t)},i.removeListeners=function(e,t){return this.manipulateListeners(!0,e,t)},i.manipulateListeners=function(e,t,n){var i,r,o=e?this.removeListener:this.addListener,s=e?this.removeListeners:this.addListeners;if("object"!=typeof t||t instanceof RegExp)for(i=n.length;i--;)o.call(this,t,n[i]);else for(i in t)t.hasOwnProperty(i)&&(r=t[i])&&("function"==typeof r?o.call(this,i,r):s.call(this,i,r));return this},i.removeEvent=function(e){var t,n=typeof e,i=this._getEvents();if("string"===n)delete i[e];else if("object"===n)for(t in i)i.hasOwnProperty(t)&&e.test(t)&&delete i[t];else delete this._events;return this},i.removeAllListeners=n("removeEvent"),i.emitEvent=function(e,t){var n,i,r,o,s=this.getListenersAsObject(e);for(r in s)if(s.hasOwnProperty(r))for(i=s[r].length;i--;)n=s[r][i],n.once===!0&&this.removeListener(e,n.listener),o=n.listener.apply(this,t||[]),o===this._getOnceReturnValue()&&this.removeListener(e,n.listener);return this},i.trigger=n("emitEvent"),i.emit=function(e){var t=Array.prototype.slice.call(arguments,1);return this.emitEvent(e,t)},i.setOnceReturnValue=function(e){return this._onceReturnValue=e,this},i._getOnceReturnValue=function(){return this.hasOwnProperty("_onceReturnValue")?this._onceReturnValue:!0},i._getEvents=function(){return this._events||(this._events={})},e.noConflict=function(){return r.EventEmitter=o,e},"function"==typeof define&&define.amd?define("eventEmitter/EventEmitter",[],function(){return e}):"object"==typeof module&&module.exports?module.exports=e:this.EventEmitter=e}).call(this),function(e){function t(t){var n=e.event;return n.target=n.target||n.srcElement||t,n}var n=document.documentElement,i=function(){};n.addEventListener?i=function(e,t,n){e.addEventListener(t,n,!1)}:n.attachEvent&&(i=function(e,n,i){e[n+i]=i.handleEvent?function(){var n=t(e);i.handleEvent.call(i,n)}:function(){var n=t(e);i.call(e,n)},e.attachEvent("on"+n,e[n+i])});var r=function(){};n.removeEventListener?r=function(e,t,n){e.removeEventListener(t,n,!1)}:n.detachEvent&&(r=function(e,t,n){e.detachEvent("on"+t,e[t+n]);try{delete e[t+n]}catch(i){e[t+n]=void 0}});var o={bind:i,unbind:r};"function"==typeof define&&define.amd?define("eventie/eventie",o):e.eventie=o}(this),function(e,t){"function"==typeof define&&define.amd?define(["eventEmitter/EventEmitter","eventie/eventie"],function(n,i){return t(e,n,i)}):"object"==typeof exports?module.exports=t(e,require("wolfy87-eventemitter"),require("eventie")):e.imagesLoaded=t(e,e.EventEmitter,e.eventie)}(window,function(e,t,n){function i(e,t){for(var n in t)e[n]=t[n];return e}function r(e){return"[object Array]"===d.call(e)}function o(e){var t=[];if(r(e))t=e;else if("number"==typeof e.length)for(var n=0,i=e.length;i>n;n++)t.push(e[n]);else t.push(e);return t}function s(e,t,n){if(!(this instanceof s))return new s(e,t);"string"==typeof e&&(e=document.querySelectorAll(e)),this.elements=o(e),this.options=i({},this.options),"function"==typeof t?n=t:i(this.options,t),n&&this.on("always",n),this.getImages(),a&&(this.jqDeferred=new a.Deferred);var r=this;setTimeout(function(){r.check()})}function f(e){this.img=e}function c(e){this.src=e,v[e]=this}var a=e.jQuery,u=e.console,h=u!==void 0,d=Object.prototype.toString;s.prototype=new t,s.prototype.options={},s.prototype.getImages=function(){this.images=[];for(var e=0,t=this.elements.length;t>e;e++){var n=this.elements[e];"IMG"===n.nodeName&&this.addImage(n);var i=n.nodeType;if(i&&(1===i||9===i||11===i))for(var r=n.querySelectorAll("img"),o=0,s=r.length;s>o;o++){var f=r[o];this.addImage(f)}}},s.prototype.addImage=function(e){var t=new f(e);this.images.push(t)},s.prototype.check=function(){function e(e,r){return t.options.debug&&h&&u.log("confirm",e,r),t.progress(e),n++,n===i&&t.complete(),!0}var t=this,n=0,i=this.images.length;if(this.hasAnyBroken=!1,!i)return this.complete(),void 0;for(var r=0;i>r;r++){var o=this.images[r];o.on("confirm",e),o.check()}},s.prototype.progress=function(e){this.hasAnyBroken=this.hasAnyBroken||!e.isLoaded;var t=this;setTimeout(function(){t.emit("progress",t,e),t.jqDeferred&&t.jqDeferred.notify&&t.jqDeferred.notify(t,e)})},s.prototype.complete=function(){var e=this.hasAnyBroken?"fail":"done";this.isComplete=!0;var t=this;setTimeout(function(){if(t.emit(e,t),t.emit("always",t),t.jqDeferred){var n=t.hasAnyBroken?"reject":"resolve";t.jqDeferred[n](t)}})},a&&(a.fn.imagesLoaded=function(e,t){var n=new s(this,e,t);return n.jqDeferred.promise(a(this))}),f.prototype=new t,f.prototype.check=function(){var e=v[this.img.src]||new c(this.img.src);if(e.isConfirmed)return this.confirm(e.isLoaded,"cached was confirmed"),void 0;if(this.img.complete&&void 0!==this.img.naturalWidth)return this.confirm(0!==this.img.naturalWidth,"naturalWidth"),void 0;var t=this;e.on("confirm",function(e,n){return t.confirm(e.isLoaded,n),!0}),e.check()},f.prototype.confirm=function(e,t){this.isLoaded=e,this.emit("confirm",this,t)};var v={};return c.prototype=new t,c.prototype.check=function(){if(!this.isChecked){var e=new Image;n.bind(e,"load",this),n.bind(e,"error",this),e.src=this.src,this.isChecked=!0}},c.prototype.handleEvent=function(e){var t="on"+e.type;this[t]&&this[t](e)},c.prototype.onload=function(e){this.confirm(!0,"onload"),this.unbindProxyEvents(e)},c.prototype.onerror=function(e){this.confirm(!1,"onerror"),this.unbindProxyEvents(e)},c.prototype.confirm=function(e,t){this.isConfirmed=!0,this.isLoaded=e,this.emit("confirm",this,t)},c.prototype.unbindProxyEvents=function(e){n.unbind(e.target,"load",this),n.unbind(e.target,"error",this)},s}); 8 No newline at end of file -
wp-includes/js/jquery/jquery.masonry.min.js
1 -/*!2 - * Masonry v2 shim3 - * to maintain backwards compatibility4 - * as of Masonry v3.1.25 - *6 - * Cascading grid layout library7 - * http://masonry.desandro.com8 - * MIT License9 - * by David DeSandro10 - */11 !function(a){"use strict";var b=a.Masonry;b.prototype._remapV2Options=function(){this._remapOption("gutterWidth","gutter"),this._remapOption("isResizable","isResizeBound"),this._remapOption("isRTL","isOriginLeft",function(a){return!a});var a=this.options.isAnimated;if(void 0!==a&&(this.options.transitionDuration=a?b.prototype.options.transitionDuration:0),void 0===a||a){var c=this.options.animationOptions,d=c&&c.duration;d&&(this.options.transitionDuration="string"==typeof d?d:d+"ms")}},b.prototype._remapOption=function(a,b,c){var d=this.options[a];void 0!==d&&(this.options[b]=c?c(d):d)};var c=b.prototype._create;b.prototype._create=function(){var a=this;this._remapV2Options(),c.apply(this,arguments),setTimeout(function(){jQuery(a.element).addClass("masonry")},0)};var d=b.prototype.layout;b.prototype.layout=function(){this._remapV2Options(),d.apply(this,arguments)};var e=b.prototype.option;b.prototype.option=function(){e.apply(this,arguments),this._remapV2Options()};var f=b.prototype._itemize;b.prototype._itemize=function(a){var b=f.apply(this,arguments);return jQuery(a).addClass("masonry-brick"),b};var g=b.prototype.measureColumns;b.prototype.measureColumns=function(){var a=this.options.columnWidth;a&&"function"==typeof a&&(this.getContainerWidth(),this.columnWidth=a(this.containerWidth)),g.apply(this,arguments)},b.prototype.reload=function(){this.reloadItems.apply(this,arguments),this.layout.apply(this)};var h=b.prototype.destroy;b.prototype.destroy=function(){var a=this.getItemElements();jQuery(this.element).removeClass("masonry"),jQuery(a).removeClass("masonry-brick"),h.apply(this,arguments)}}(window);12 No newline at end of file -
wp-includes/js/masonry.js
1 /*! 2 * Masonry PACKAGED v3.3.2 3 * Cascading grid layout library 4 * http://masonry.desandro.com 5 * MIT License 6 * by David DeSandro 7 */ 8 9 /** 10 * Bridget makes jQuery widgets 11 * v1.1.0 12 * MIT license 13 */ 14 15 ( function( window ) { 16 17 18 19 // -------------------------- utils -------------------------- // 20 21 var slice = Array.prototype.slice; 22 23 function noop() {} 24 25 // -------------------------- definition -------------------------- // 26 27 function defineBridget( $ ) { 28 29 // bail if no jQuery 30 if ( !$ ) { 31 return; 32 } 33 34 // -------------------------- addOptionMethod -------------------------- // 35 36 /** 37 * adds option method -> $().plugin('option', {...}) 38 * @param {Function} PluginClass - constructor class 39 */ 40 function addOptionMethod( PluginClass ) { 41 // don't overwrite original option method 42 if ( PluginClass.prototype.option ) { 43 return; 44 } 45 46 // option setter 47 PluginClass.prototype.option = function( opts ) { 48 // bail out if not an object 49 if ( !$.isPlainObject( opts ) ){ 50 return; 51 } 52 this.options = $.extend( true, this.options, opts ); 53 }; 54 } 55 56 // -------------------------- plugin bridge -------------------------- // 57 58 // helper function for logging errors 59 // $.error breaks jQuery chaining 60 var logError = typeof console === 'undefined' ? noop : 61 function( message ) { 62 console.error( message ); 63 }; 64 65 /** 66 * jQuery plugin bridge, access methods like $elem.plugin('method') 67 * @param {String} namespace - plugin name 68 * @param {Function} PluginClass - constructor class 69 */ 70 function bridge( namespace, PluginClass ) { 71 // add to jQuery fn namespace 72 $.fn[ namespace ] = function( options ) { 73 if ( typeof options === 'string' ) { 74 // call plugin method when first argument is a string 75 // get arguments for method 76 var args = slice.call( arguments, 1 ); 77 78 for ( var i=0, len = this.length; i < len; i++ ) { 79 var elem = this[i]; 80 var instance = $.data( elem, namespace ); 81 if ( !instance ) { 82 logError( "cannot call methods on " + namespace + " prior to initialization; " + 83 "attempted to call '" + options + "'" ); 84 continue; 85 } 86 if ( !$.isFunction( instance[options] ) || options.charAt(0) === '_' ) { 87 logError( "no such method '" + options + "' for " + namespace + " instance" ); 88 continue; 89 } 90 91 // trigger method with arguments 92 var returnValue = instance[ options ].apply( instance, args ); 93 94 // break look and return first value if provided 95 if ( returnValue !== undefined ) { 96 return returnValue; 97 } 98 } 99 // return this if no return value 100 return this; 101 } else { 102 return this.each( function() { 103 var instance = $.data( this, namespace ); 104 if ( instance ) { 105 // apply options & init 106 instance.option( options ); 107 instance._init(); 108 } else { 109 // initialize new instance 110 instance = new PluginClass( this, options ); 111 $.data( this, namespace, instance ); 112 } 113 }); 114 } 115 }; 116 117 } 118 119 // -------------------------- bridget -------------------------- // 120 121 /** 122 * converts a Prototypical class into a proper jQuery plugin 123 * the class must have a ._init method 124 * @param {String} namespace - plugin name, used in $().pluginName 125 * @param {Function} PluginClass - constructor class 126 */ 127 $.bridget = function( namespace, PluginClass ) { 128 addOptionMethod( PluginClass ); 129 bridge( namespace, PluginClass ); 130 }; 131 132 return $.bridget; 133 134 } 135 136 // transport 137 if ( typeof define === 'function' && define.amd ) { 138 // AMD 139 define( 'jquery-bridget/jquery.bridget',[ 'jquery' ], defineBridget ); 140 } else if ( typeof exports === 'object' ) { 141 defineBridget( require('jquery') ); 142 } else { 143 // get jquery from browser global 144 defineBridget( window.jQuery ); 145 } 146 147 })( window ); 148 149 /*! 150 * eventie v1.0.6 151 * event binding helper 152 * eventie.bind( elem, 'click', myFn ) 153 * eventie.unbind( elem, 'click', myFn ) 154 * MIT license 155 */ 156 157 /*jshint browser: true, undef: true, unused: true */ 158 /*global define: false, module: false */ 159 160 ( function( window ) { 161 162 163 164 var docElem = document.documentElement; 165 166 var bind = function() {}; 167 168 function getIEEvent( obj ) { 169 var event = window.event; 170 // add event.target 171 event.target = event.target || event.srcElement || obj; 172 return event; 173 } 174 175 if ( docElem.addEventListener ) { 176 bind = function( obj, type, fn ) { 177 obj.addEventListener( type, fn, false ); 178 }; 179 } else if ( docElem.attachEvent ) { 180 bind = function( obj, type, fn ) { 181 obj[ type + fn ] = fn.handleEvent ? 182 function() { 183 var event = getIEEvent( obj ); 184 fn.handleEvent.call( fn, event ); 185 } : 186 function() { 187 var event = getIEEvent( obj ); 188 fn.call( obj, event ); 189 }; 190 obj.attachEvent( "on" + type, obj[ type + fn ] ); 191 }; 192 } 193 194 var unbind = function() {}; 195 196 if ( docElem.removeEventListener ) { 197 unbind = function( obj, type, fn ) { 198 obj.removeEventListener( type, fn, false ); 199 }; 200 } else if ( docElem.detachEvent ) { 201 unbind = function( obj, type, fn ) { 202 obj.detachEvent( "on" + type, obj[ type + fn ] ); 203 try { 204 delete obj[ type + fn ]; 205 } catch ( err ) { 206 // can't delete window object properties 207 obj[ type + fn ] = undefined; 208 } 209 }; 210 } 211 212 var eventie = { 213 bind: bind, 214 unbind: unbind 215 }; 216 217 // ----- module definition ----- // 218 219 if ( typeof define === 'function' && define.amd ) { 220 // AMD 221 define( 'eventie/eventie',eventie ); 222 } else if ( typeof exports === 'object' ) { 223 // CommonJS 224 module.exports = eventie; 225 } else { 226 // browser global 227 window.eventie = eventie; 228 } 229 230 })( window ); 231 232 /*! 233 * EventEmitter v4.2.11 - git.io/ee 234 * Unlicense - http://unlicense.org/ 235 * Oliver Caldwell - http://oli.me.uk/ 236 * @preserve 237 */ 238 239 ;(function () { 240 241 242 /** 243 * Class for managing events. 244 * Can be extended to provide event functionality in other classes. 245 * 246 * @class EventEmitter Manages event registering and emitting. 247 */ 248 function EventEmitter() {} 249 250 // Shortcuts to improve speed and size 251 var proto = EventEmitter.prototype; 252 var exports = this; 253 var originalGlobalValue = exports.EventEmitter; 254 255 /** 256 * Finds the index of the listener for the event in its storage array. 257 * 258 * @param {Function[]} listeners Array of listeners to search through. 259 * @param {Function} listener Method to look for. 260 * @return {Number} Index of the specified listener, -1 if not found 261 * @api private 262 */ 263 function indexOfListener(listeners, listener) { 264 var i = listeners.length; 265 while (i--) { 266 if (listeners[i].listener === listener) { 267 return i; 268 } 269 } 270 271 return -1; 272 } 273 274 /** 275 * Alias a method while keeping the context correct, to allow for overwriting of target method. 276 * 277 * @param {String} name The name of the target method. 278 * @return {Function} The aliased method 279 * @api private 280 */ 281 function alias(name) { 282 return function aliasClosure() { 283 return this[name].apply(this, arguments); 284 }; 285 } 286 287 /** 288 * Returns the listener array for the specified event. 289 * Will initialise the event object and listener arrays if required. 290 * Will return an object if you use a regex search. The object contains keys for each matched event. So /ba[rz]/ might return an object containing bar and baz. But only if you have either defined them with defineEvent or added some listeners to them. 291 * Each property in the object response is an array of listener functions. 292 * 293 * @param {String|RegExp} evt Name of the event to return the listeners from. 294 * @return {Function[]|Object} All listener functions for the event. 295 */ 296 proto.getListeners = function getListeners(evt) { 297 var events = this._getEvents(); 298 var response; 299 var key; 300 301 // Return a concatenated array of all matching events if 302 // the selector is a regular expression. 303 if (evt instanceof RegExp) { 304 response = {}; 305 for (key in events) { 306 if (events.hasOwnProperty(key) && evt.test(key)) { 307 response[key] = events[key]; 308 } 309 } 310 } 311 else { 312 response = events[evt] || (events[evt] = []); 313 } 314 315 return response; 316 }; 317 318 /** 319 * Takes a list of listener objects and flattens it into a list of listener functions. 320 * 321 * @param {Object[]} listeners Raw listener objects. 322 * @return {Function[]} Just the listener functions. 323 */ 324 proto.flattenListeners = function flattenListeners(listeners) { 325 var flatListeners = []; 326 var i; 327 328 for (i = 0; i < listeners.length; i += 1) { 329 flatListeners.push(listeners[i].listener); 330 } 331 332 return flatListeners; 333 }; 334 335 /** 336 * Fetches the requested listeners via getListeners but will always return the results inside an object. This is mainly for internal use but others may find it useful. 337 * 338 * @param {String|RegExp} evt Name of the event to return the listeners from. 339 * @return {Object} All listener functions for an event in an object. 340 */ 341 proto.getListenersAsObject = function getListenersAsObject(evt) { 342 var listeners = this.getListeners(evt); 343 var response; 344 345 if (listeners instanceof Array) { 346 response = {}; 347 response[evt] = listeners; 348 } 349 350 return response || listeners; 351 }; 352 353 /** 354 * Adds a listener function to the specified event. 355 * The listener will not be added if it is a duplicate. 356 * If the listener returns true then it will be removed after it is called. 357 * If you pass a regular expression as the event name then the listener will be added to all events that match it. 358 * 359 * @param {String|RegExp} evt Name of the event to attach the listener to. 360 * @param {Function} listener Method to be called when the event is emitted. If the function returns true then it will be removed after calling. 361 * @return {Object} Current instance of EventEmitter for chaining. 362 */ 363 proto.addListener = function addListener(evt, listener) { 364 var listeners = this.getListenersAsObject(evt); 365 var listenerIsWrapped = typeof listener === 'object'; 366 var key; 367 368 for (key in listeners) { 369 if (listeners.hasOwnProperty(key) && indexOfListener(listeners[key], listener) === -1) { 370 listeners[key].push(listenerIsWrapped ? listener : { 371 listener: listener, 372 once: false 373 }); 374 } 375 } 376 377 return this; 378 }; 379 380 /** 381 * Alias of addListener 382 */ 383 proto.on = alias('addListener'); 384 385 /** 386 * Semi-alias of addListener. It will add a listener that will be 387 * automatically removed after its first execution. 388 * 389 * @param {String|RegExp} evt Name of the event to attach the listener to. 390 * @param {Function} listener Method to be called when the event is emitted. If the function returns true then it will be removed after calling. 391 * @return {Object} Current instance of EventEmitter for chaining. 392 */ 393 proto.addOnceListener = function addOnceListener(evt, listener) { 394 return this.addListener(evt, { 395 listener: listener, 396 once: true 397 }); 398 }; 399 400 /** 401 * Alias of addOnceListener. 402 */ 403 proto.once = alias('addOnceListener'); 404 405 /** 406 * Defines an event name. This is required if you want to use a regex to add a listener to multiple events at once. If you don't do this then how do you expect it to know what event to add to? Should it just add to every possible match for a regex? No. That is scary and bad. 407 * You need to tell it what event names should be matched by a regex. 408 * 409 * @param {String} evt Name of the event to create. 410 * @return {Object} Current instance of EventEmitter for chaining. 411 */ 412 proto.defineEvent = function defineEvent(evt) { 413 this.getListeners(evt); 414 return this; 415 }; 416 417 /** 418 * Uses defineEvent to define multiple events. 419 * 420 * @param {String[]} evts An array of event names to define. 421 * @return {Object} Current instance of EventEmitter for chaining. 422 */ 423 proto.defineEvents = function defineEvents(evts) { 424 for (var i = 0; i < evts.length; i += 1) { 425 this.defineEvent(evts[i]); 426 } 427 return this; 428 }; 429 430 /** 431 * Removes a listener function from the specified event. 432 * When passed a regular expression as the event name, it will remove the listener from all events that match it. 433 * 434 * @param {String|RegExp} evt Name of the event to remove the listener from. 435 * @param {Function} listener Method to remove from the event. 436 * @return {Object} Current instance of EventEmitter for chaining. 437 */ 438 proto.removeListener = function removeListener(evt, listener) { 439 var listeners = this.getListenersAsObject(evt); 440 var index; 441 var key; 442 443 for (key in listeners) { 444 if (listeners.hasOwnProperty(key)) { 445 index = indexOfListener(listeners[key], listener); 446 447 if (index !== -1) { 448 listeners[key].splice(index, 1); 449 } 450 } 451 } 452 453 return this; 454 }; 455 456 /** 457 * Alias of removeListener 458 */ 459 proto.off = alias('removeListener'); 460 461 /** 462 * Adds listeners in bulk using the manipulateListeners method. 463 * If you pass an object as the second argument you can add to multiple events at once. The object should contain key value pairs of events and listeners or listener arrays. You can also pass it an event name and an array of listeners to be added. 464 * You can also pass it a regular expression to add the array of listeners to all events that match it. 465 * Yeah, this function does quite a bit. That's probably a bad thing. 466 * 467 * @param {String|Object|RegExp} evt An event name if you will pass an array of listeners next. An object if you wish to add to multiple events at once. 468 * @param {Function[]} [listeners] An optional array of listener functions to add. 469 * @return {Object} Current instance of EventEmitter for chaining. 470 */ 471 proto.addListeners = function addListeners(evt, listeners) { 472 // Pass through to manipulateListeners 473 return this.manipulateListeners(false, evt, listeners); 474 }; 475 476 /** 477 * Removes listeners in bulk using the manipulateListeners method. 478 * If you pass an object as the second argument you can remove from multiple events at once. The object should contain key value pairs of events and listeners or listener arrays. 479 * You can also pass it an event name and an array of listeners to be removed. 480 * You can also pass it a regular expression to remove the listeners from all events that match it. 481 * 482 * @param {String|Object|RegExp} evt An event name if you will pass an array of listeners next. An object if you wish to remove from multiple events at once. 483 * @param {Function[]} [listeners] An optional array of listener functions to remove. 484 * @return {Object} Current instance of EventEmitter for chaining. 485 */ 486 proto.removeListeners = function removeListeners(evt, listeners) { 487 // Pass through to manipulateListeners 488 return this.manipulateListeners(true, evt, listeners); 489 }; 490 491 /** 492 * Edits listeners in bulk. The addListeners and removeListeners methods both use this to do their job. You should really use those instead, this is a little lower level. 493 * The first argument will determine if the listeners are removed (true) or added (false). 494 * If you pass an object as the second argument you can add/remove from multiple events at once. The object should contain key value pairs of events and listeners or listener arrays. 495 * You can also pass it an event name and an array of listeners to be added/removed. 496 * You can also pass it a regular expression to manipulate the listeners of all events that match it. 497 * 498 * @param {Boolean} remove True if you want to remove listeners, false if you want to add. 499 * @param {String|Object|RegExp} evt An event name if you will pass an array of listeners next. An object if you wish to add/remove from multiple events at once. 500 * @param {Function[]} [listeners] An optional array of listener functions to add/remove. 501 * @return {Object} Current instance of EventEmitter for chaining. 502 */ 503 proto.manipulateListeners = function manipulateListeners(remove, evt, listeners) { 504 var i; 505 var value; 506 var single = remove ? this.removeListener : this.addListener; 507 var multiple = remove ? this.removeListeners : this.addListeners; 508 509 // If evt is an object then pass each of its properties to this method 510 if (typeof evt === 'object' && !(evt instanceof RegExp)) { 511 for (i in evt) { 512 if (evt.hasOwnProperty(i) && (value = evt[i])) { 513 // Pass the single listener straight through to the singular method 514 if (typeof value === 'function') { 515 single.call(this, i, value); 516 } 517 else { 518 // Otherwise pass back to the multiple function 519 multiple.call(this, i, value); 520 } 521 } 522 } 523 } 524 else { 525 // So evt must be a string 526 // And listeners must be an array of listeners 527 // Loop over it and pass each one to the multiple method 528 i = listeners.length; 529 while (i--) { 530 single.call(this, evt, listeners[i]); 531 } 532 } 533 534 return this; 535 }; 536 537 /** 538 * Removes all listeners from a specified event. 539 * If you do not specify an event then all listeners will be removed. 540 * That means every event will be emptied. 541 * You can also pass a regex to remove all events that match it. 542 * 543 * @param {String|RegExp} [evt] Optional name of the event to remove all listeners for. Will remove from every event if not passed. 544 * @return {Object} Current instance of EventEmitter for chaining. 545 */ 546 proto.removeEvent = function removeEvent(evt) { 547 var type = typeof evt; 548 var events = this._getEvents(); 549 var key; 550 551 // Remove different things depending on the state of evt 552 if (type === 'string') { 553 // Remove all listeners for the specified event 554 delete events[evt]; 555 } 556 else if (evt instanceof RegExp) { 557 // Remove all events matching the regex. 558 for (key in events) { 559 if (events.hasOwnProperty(key) && evt.test(key)) { 560 delete events[key]; 561 } 562 } 563 } 564 else { 565 // Remove all listeners in all events 566 delete this._events; 567 } 568 569 return this; 570 }; 571 572 /** 573 * Alias of removeEvent. 574 * 575 * Added to mirror the node API. 576 */ 577 proto.removeAllListeners = alias('removeEvent'); 578 579 /** 580 * Emits an event of your choice. 581 * When emitted, every listener attached to that event will be executed. 582 * If you pass the optional argument array then those arguments will be passed to every listener upon execution. 583 * Because it uses `apply`, your array of arguments will be passed as if you wrote them out separately. 584 * So they will not arrive within the array on the other side, they will be separate. 585 * You can also pass a regular expression to emit to all events that match it. 586 * 587 * @param {String|RegExp} evt Name of the event to emit and execute listeners for. 588 * @param {Array} [args] Optional array of arguments to be passed to each listener. 589 * @return {Object} Current instance of EventEmitter for chaining. 590 */ 591 proto.emitEvent = function emitEvent(evt, args) { 592 var listeners = this.getListenersAsObject(evt); 593 var listener; 594 var i; 595 var key; 596 var response; 597 598 for (key in listeners) { 599 if (listeners.hasOwnProperty(key)) { 600 i = listeners[key].length; 601 602 while (i--) { 603 // If the listener returns true then it shall be removed from the event 604 // The function is executed either with a basic call or an apply if there is an args array 605 listener = listeners[key][i]; 606 607 if (listener.once === true) { 608 this.removeListener(evt, listener.listener); 609 } 610 611 response = listener.listener.apply(this, args || []); 612 613 if (response === this._getOnceReturnValue()) { 614 this.removeListener(evt, listener.listener); 615 } 616 } 617 } 618 } 619 620 return this; 621 }; 622 623 /** 624 * Alias of emitEvent 625 */ 626 proto.trigger = alias('emitEvent'); 627 628 /** 629 * Subtly different from emitEvent in that it will pass its arguments on to the listeners, as opposed to taking a single array of arguments to pass on. 630 * As with emitEvent, you can pass a regex in place of the event name to emit to all events that match it. 631 * 632 * @param {String|RegExp} evt Name of the event to emit and execute listeners for. 633 * @param {...*} Optional additional arguments to be passed to each listener. 634 * @return {Object} Current instance of EventEmitter for chaining. 635 */ 636 proto.emit = function emit(evt) { 637 var args = Array.prototype.slice.call(arguments, 1); 638 return this.emitEvent(evt, args); 639 }; 640 641 /** 642 * Sets the current value to check against when executing listeners. If a 643 * listeners return value matches the one set here then it will be removed 644 * after execution. This value defaults to true. 645 * 646 * @param {*} value The new value to check for when executing listeners. 647 * @return {Object} Current instance of EventEmitter for chaining. 648 */ 649 proto.setOnceReturnValue = function setOnceReturnValue(value) { 650 this._onceReturnValue = value; 651 return this; 652 }; 653 654 /** 655 * Fetches the current value to check against when executing listeners. If 656 * the listeners return value matches this one then it should be removed 657 * automatically. It will return true by default. 658 * 659 * @return {*|Boolean} The current value to check for or the default, true. 660 * @api private 661 */ 662 proto._getOnceReturnValue = function _getOnceReturnValue() { 663 if (this.hasOwnProperty('_onceReturnValue')) { 664 return this._onceReturnValue; 665 } 666 else { 667 return true; 668 } 669 }; 670 671 /** 672 * Fetches the events object and creates one if required. 673 * 674 * @return {Object} The events storage object. 675 * @api private 676 */ 677 proto._getEvents = function _getEvents() { 678 return this._events || (this._events = {}); 679 }; 680 681 /** 682 * Reverts the global {@link EventEmitter} to its previous value and returns a reference to this version. 683 * 684 * @return {Function} Non conflicting EventEmitter class. 685 */ 686 EventEmitter.noConflict = function noConflict() { 687 exports.EventEmitter = originalGlobalValue; 688 return EventEmitter; 689 }; 690 691 // Expose the class either via AMD, CommonJS or the global object 692 if (typeof define === 'function' && define.amd) { 693 define('eventEmitter/EventEmitter',[],function () { 694 return EventEmitter; 695 }); 696 } 697 else if (typeof module === 'object' && module.exports){ 698 module.exports = EventEmitter; 699 } 700 else { 701 exports.EventEmitter = EventEmitter; 702 } 703 }.call(this)); 704 705 /*! 706 * getStyleProperty v1.0.4 707 * original by kangax 708 * http://perfectionkills.com/feature-testing-css-properties/ 709 * MIT license 710 */ 711 712 /*jshint browser: true, strict: true, undef: true */ 713 /*global define: false, exports: false, module: false */ 714 715 ( function( window ) { 716 717 718 719 var prefixes = 'Webkit Moz ms Ms O'.split(' '); 720 var docElemStyle = document.documentElement.style; 721 722 function getStyleProperty( propName ) { 723 if ( !propName ) { 724 return; 725 } 726 727 // test standard property first 728 if ( typeof docElemStyle[ propName ] === 'string' ) { 729 return propName; 730 } 731 732 // capitalize 733 propName = propName.charAt(0).toUpperCase() + propName.slice(1); 734 735 // test vendor specific properties 736 var prefixed; 737 for ( var i=0, len = prefixes.length; i < len; i++ ) { 738 prefixed = prefixes[i] + propName; 739 if ( typeof docElemStyle[ prefixed ] === 'string' ) { 740 return prefixed; 741 } 742 } 743 } 744 745 // transport 746 if ( typeof define === 'function' && define.amd ) { 747 // AMD 748 define( 'get-style-property/get-style-property',[],function() { 749 return getStyleProperty; 750 }); 751 } else if ( typeof exports === 'object' ) { 752 // CommonJS for Component 753 module.exports = getStyleProperty; 754 } else { 755 // browser global 756 window.getStyleProperty = getStyleProperty; 757 } 758 759 })( window ); 760 761 /*! 762 * getSize v1.2.2 763 * measure size of elements 764 * MIT license 765 */ 766 767 /*jshint browser: true, strict: true, undef: true, unused: true */ 768 /*global define: false, exports: false, require: false, module: false, console: false */ 769 770 ( function( window, undefined ) { 771 772 773 774 // -------------------------- helpers -------------------------- // 775 776 // get a number from a string, not a percentage 777 function getStyleSize( value ) { 778 var num = parseFloat( value ); 779 // not a percent like '100%', and a number 780 var isValid = value.indexOf('%') === -1 && !isNaN( num ); 781 return isValid && num; 782 } 783 784 function noop() {} 785 786 var logError = typeof console === 'undefined' ? noop : 787 function( message ) { 788 console.error( message ); 789 }; 790 791 // -------------------------- measurements -------------------------- // 792 793 var measurements = [ 794 'paddingLeft', 795 'paddingRight', 796 'paddingTop', 797 'paddingBottom', 798 'marginLeft', 799 'marginRight', 800 'marginTop', 801 'marginBottom', 802 'borderLeftWidth', 803 'borderRightWidth', 804 'borderTopWidth', 805 'borderBottomWidth' 806 ]; 807 808 function getZeroSize() { 809 var size = { 810 width: 0, 811 height: 0, 812 innerWidth: 0, 813 innerHeight: 0, 814 outerWidth: 0, 815 outerHeight: 0 816 }; 817 for ( var i=0, len = measurements.length; i < len; i++ ) { 818 var measurement = measurements[i]; 819 size[ measurement ] = 0; 820 } 821 return size; 822 } 823 824 825 826 function defineGetSize( getStyleProperty ) { 827 828 // -------------------------- setup -------------------------- // 829 830 var isSetup = false; 831 832 var getStyle, boxSizingProp, isBoxSizeOuter; 833 834 /** 835 * setup vars and functions 836 * do it on initial getSize(), rather than on script load 837 * For Firefox bug https://bugzilla.mozilla.org/show_bug.cgi?id=548397 838 */ 839 function setup() { 840 // setup once 841 if ( isSetup ) { 842 return; 843 } 844 isSetup = true; 845 846 var getComputedStyle = window.getComputedStyle; 847 getStyle = ( function() { 848 var getStyleFn = getComputedStyle ? 849 function( elem ) { 850 return getComputedStyle( elem, null ); 851 } : 852 function( elem ) { 853 return elem.currentStyle; 854 }; 855 856 return function getStyle( elem ) { 857 var style = getStyleFn( elem ); 858 if ( !style ) { 859 logError( 'Style returned ' + style + 860 '. Are you running this code in a hidden iframe on Firefox? ' + 861 'See http://bit.ly/getsizebug1' ); 862 } 863 return style; 864 }; 865 })(); 866 867 // -------------------------- box sizing -------------------------- // 868 869 boxSizingProp = getStyleProperty('boxSizing'); 870 871 /** 872 * WebKit measures the outer-width on style.width on border-box elems 873 * IE & Firefox measures the inner-width 874 */ 875 if ( boxSizingProp ) { 876 var div = document.createElement('div'); 877 div.style.width = '200px'; 878 div.style.padding = '1px 2px 3px 4px'; 879 div.style.borderStyle = 'solid'; 880 div.style.borderWidth = '1px 2px 3px 4px'; 881 div.style[ boxSizingProp ] = 'border-box'; 882 883 var body = document.body || document.documentElement; 884 body.appendChild( div ); 885 var style = getStyle( div ); 886 887 isBoxSizeOuter = getStyleSize( style.width ) === 200; 888 body.removeChild( div ); 889 } 890 891 } 892 893 // -------------------------- getSize -------------------------- // 894 895 function getSize( elem ) { 896 setup(); 897 898 // use querySeletor if elem is string 899 if ( typeof elem === 'string' ) { 900 elem = document.querySelector( elem ); 901 } 902 903 // do not proceed on non-objects 904 if ( !elem || typeof elem !== 'object' || !elem.nodeType ) { 905 return; 906 } 907 908 var style = getStyle( elem ); 909 910 // if hidden, everything is 0 911 if ( style.display === 'none' ) { 912 return getZeroSize(); 913 } 914 915 var size = {}; 916 size.width = elem.offsetWidth; 917 size.height = elem.offsetHeight; 918 919 var isBorderBox = size.isBorderBox = !!( boxSizingProp && 920 style[ boxSizingProp ] && style[ boxSizingProp ] === 'border-box' ); 921 922 // get all measurements 923 for ( var i=0, len = measurements.length; i < len; i++ ) { 924 var measurement = measurements[i]; 925 var value = style[ measurement ]; 926 value = mungeNonPixel( elem, value ); 927 var num = parseFloat( value ); 928 // any 'auto', 'medium' value will be 0 929 size[ measurement ] = !isNaN( num ) ? num : 0; 930 } 931 932 var paddingWidth = size.paddingLeft + size.paddingRight; 933 var paddingHeight = size.paddingTop + size.paddingBottom; 934 var marginWidth = size.marginLeft + size.marginRight; 935 var marginHeight = size.marginTop + size.marginBottom; 936 var borderWidth = size.borderLeftWidth + size.borderRightWidth; 937 var borderHeight = size.borderTopWidth + size.borderBottomWidth; 938 939 var isBorderBoxSizeOuter = isBorderBox && isBoxSizeOuter; 940 941 // overwrite width and height if we can get it from style 942 var styleWidth = getStyleSize( style.width ); 943 if ( styleWidth !== false ) { 944 size.width = styleWidth + 945 // add padding and border unless it's already including it 946 ( isBorderBoxSizeOuter ? 0 : paddingWidth + borderWidth ); 947 } 948 949 var styleHeight = getStyleSize( style.height ); 950 if ( styleHeight !== false ) { 951 size.height = styleHeight + 952 // add padding and border unless it's already including it 953 ( isBorderBoxSizeOuter ? 0 : paddingHeight + borderHeight ); 954 } 955 956 size.innerWidth = size.width - ( paddingWidth + borderWidth ); 957 size.innerHeight = size.height - ( paddingHeight + borderHeight ); 958 959 size.outerWidth = size.width + marginWidth; 960 size.outerHeight = size.height + marginHeight; 961 962 return size; 963 } 964 965 // IE8 returns percent values, not pixels 966 // taken from jQuery's curCSS 967 function mungeNonPixel( elem, value ) { 968 // IE8 and has percent value 969 if ( window.getComputedStyle || value.indexOf('%') === -1 ) { 970 return value; 971 } 972 var style = elem.style; 973 // Remember the original values 974 var left = style.left; 975 var rs = elem.runtimeStyle; 976 var rsLeft = rs && rs.left; 977 978 // Put in the new values to get a computed value out 979 if ( rsLeft ) { 980 rs.left = elem.currentStyle.left; 981 } 982 style.left = value; 983 value = style.pixelLeft; 984 985 // Revert the changed values 986 style.left = left; 987 if ( rsLeft ) { 988 rs.left = rsLeft; 989 } 990 991 return value; 992 } 993 994 return getSize; 995 996 } 997 998 // transport 999 if ( typeof define === 'function' && define.amd ) { 1000 // AMD for RequireJS 1001 define( 'get-size/get-size',[ 'get-style-property/get-style-property' ], defineGetSize ); 1002 } else if ( typeof exports === 'object' ) { 1003 // CommonJS for Component 1004 module.exports = defineGetSize( require('desandro-get-style-property') ); 1005 } else { 1006 // browser global 1007 window.getSize = defineGetSize( window.getStyleProperty ); 1008 } 1009 1010 })( window ); 1011 1012 /*! 1013 * docReady v1.0.4 1014 * Cross browser DOMContentLoaded event emitter 1015 * MIT license 1016 */ 1017 1018 /*jshint browser: true, strict: true, undef: true, unused: true*/ 1019 /*global define: false, require: false, module: false */ 1020 1021 ( function( window ) { 1022 1023 1024 1025 var document = window.document; 1026 // collection of functions to be triggered on ready 1027 var queue = []; 1028 1029 function docReady( fn ) { 1030 // throw out non-functions 1031 if ( typeof fn !== 'function' ) { 1032 return; 1033 } 1034 1035 if ( docReady.isReady ) { 1036 // ready now, hit it 1037 fn(); 1038 } else { 1039 // queue function when ready 1040 queue.push( fn ); 1041 } 1042 } 1043 1044 docReady.isReady = false; 1045 1046 // triggered on various doc ready events 1047 function onReady( event ) { 1048 // bail if already triggered or IE8 document is not ready just yet 1049 var isIE8NotReady = event.type === 'readystatechange' && document.readyState !== 'complete'; 1050 if ( docReady.isReady || isIE8NotReady ) { 1051 return; 1052 } 1053 1054 trigger(); 1055 } 1056 1057 function trigger() { 1058 docReady.isReady = true; 1059 // process queue 1060 for ( var i=0, len = queue.length; i < len; i++ ) { 1061 var fn = queue[i]; 1062 fn(); 1063 } 1064 } 1065 1066 function defineDocReady( eventie ) { 1067 // trigger ready if page is ready 1068 if ( document.readyState === 'complete' ) { 1069 trigger(); 1070 } else { 1071 // listen for events 1072 eventie.bind( document, 'DOMContentLoaded', onReady ); 1073 eventie.bind( document, 'readystatechange', onReady ); 1074 eventie.bind( window, 'load', onReady ); 1075 } 1076 1077 return docReady; 1078 } 1079 1080 // transport 1081 if ( typeof define === 'function' && define.amd ) { 1082 // AMD 1083 define( 'doc-ready/doc-ready',[ 'eventie/eventie' ], defineDocReady ); 1084 } else if ( typeof exports === 'object' ) { 1085 module.exports = defineDocReady( require('eventie') ); 1086 } else { 1087 // browser global 1088 window.docReady = defineDocReady( window.eventie ); 1089 } 1090 1091 })( window ); 1092 1093 /** 1094 * matchesSelector v1.0.3 1095 * matchesSelector( element, '.selector' ) 1096 * MIT license 1097 */ 1098 1099 /*jshint browser: true, strict: true, undef: true, unused: true */ 1100 /*global define: false, module: false */ 1101 1102 ( function( ElemProto ) { 1103 1104 1105 1106 var matchesMethod = ( function() { 1107 // check for the standard method name first 1108 if ( ElemProto.matches ) { 1109 return 'matches'; 1110 } 1111 // check un-prefixed 1112 if ( ElemProto.matchesSelector ) { 1113 return 'matchesSelector'; 1114 } 1115 // check vendor prefixes 1116 var prefixes = [ 'webkit', 'moz', 'ms', 'o' ]; 1117 1118 for ( var i=0, len = prefixes.length; i < len; i++ ) { 1119 var prefix = prefixes[i]; 1120 var method = prefix + 'MatchesSelector'; 1121 if ( ElemProto[ method ] ) { 1122 return method; 1123 } 1124 } 1125 })(); 1126 1127 // ----- match ----- // 1128 1129 function match( elem, selector ) { 1130 return elem[ matchesMethod ]( selector ); 1131 } 1132 1133 // ----- appendToFragment ----- // 1134 1135 function checkParent( elem ) { 1136 // not needed if already has parent 1137 if ( elem.parentNode ) { 1138 return; 1139 } 1140 var fragment = document.createDocumentFragment(); 1141 fragment.appendChild( elem ); 1142 } 1143 1144 // ----- query ----- // 1145 1146 // fall back to using QSA 1147 // thx @jonathantneal https://gist.github.com/3062955 1148 function query( elem, selector ) { 1149 // append to fragment if no parent 1150 checkParent( elem ); 1151 1152 // match elem with all selected elems of parent 1153 var elems = elem.parentNode.querySelectorAll( selector ); 1154 for ( var i=0, len = elems.length; i < len; i++ ) { 1155 // return true if match 1156 if ( elems[i] === elem ) { 1157 return true; 1158 } 1159 } 1160 // otherwise return false 1161 return false; 1162 } 1163 1164 // ----- matchChild ----- // 1165 1166 function matchChild( elem, selector ) { 1167 checkParent( elem ); 1168 return match( elem, selector ); 1169 } 1170 1171 // ----- matchesSelector ----- // 1172 1173 var matchesSelector; 1174 1175 if ( matchesMethod ) { 1176 // IE9 supports matchesSelector, but doesn't work on orphaned elems 1177 // check for that 1178 var div = document.createElement('div'); 1179 var supportsOrphans = match( div, 'div' ); 1180 matchesSelector = supportsOrphans ? match : matchChild; 1181 } else { 1182 matchesSelector = query; 1183 } 1184 1185 // transport 1186 if ( typeof define === 'function' && define.amd ) { 1187 // AMD 1188 define( 'matches-selector/matches-selector',[],function() { 1189 return matchesSelector; 1190 }); 1191 } else if ( typeof exports === 'object' ) { 1192 module.exports = matchesSelector; 1193 } 1194 else { 1195 // browser global 1196 window.matchesSelector = matchesSelector; 1197 } 1198 1199 })( Element.prototype ); 1200 1201 /** 1202 * Fizzy UI utils v1.0.1 1203 * MIT license 1204 */ 1205 1206 /*jshint browser: true, undef: true, unused: true, strict: true */ 1207 1208 ( function( window, factory ) { 1209 /*global define: false, module: false, require: false */ 1210 1211 // universal module definition 1212 1213 if ( typeof define == 'function' && define.amd ) { 1214 // AMD 1215 define( 'fizzy-ui-utils/utils',[ 1216 'doc-ready/doc-ready', 1217 'matches-selector/matches-selector' 1218 ], function( docReady, matchesSelector ) { 1219 return factory( window, docReady, matchesSelector ); 1220 }); 1221 } else if ( typeof exports == 'object' ) { 1222 // CommonJS 1223 module.exports = factory( 1224 window, 1225 require('doc-ready'), 1226 require('desandro-matches-selector') 1227 ); 1228 } else { 1229 // browser global 1230 window.fizzyUIUtils = factory( 1231 window, 1232 window.docReady, 1233 window.matchesSelector 1234 ); 1235 } 1236 1237 }( window, function factory( window, docReady, matchesSelector ) { 1238 1239 1240 1241 var utils = {}; 1242 1243 // ----- extend ----- // 1244 1245 // extends objects 1246 utils.extend = function( a, b ) { 1247 for ( var prop in b ) { 1248 a[ prop ] = b[ prop ]; 1249 } 1250 return a; 1251 }; 1252 1253 // ----- modulo ----- // 1254 1255 utils.modulo = function( num, div ) { 1256 return ( ( num % div ) + div ) % div; 1257 }; 1258 1259 // ----- isArray ----- // 1260 1261 var objToString = Object.prototype.toString; 1262 utils.isArray = function( obj ) { 1263 return objToString.call( obj ) == '[object Array]'; 1264 }; 1265 1266 // ----- makeArray ----- // 1267 1268 // turn element or nodeList into an array 1269 utils.makeArray = function( obj ) { 1270 var ary = []; 1271 if ( utils.isArray( obj ) ) { 1272 // use object if already an array 1273 ary = obj; 1274 } else if ( obj && typeof obj.length == 'number' ) { 1275 // convert nodeList to array 1276 for ( var i=0, len = obj.length; i < len; i++ ) { 1277 ary.push( obj[i] ); 1278 } 1279 } else { 1280 // array of single index 1281 ary.push( obj ); 1282 } 1283 return ary; 1284 }; 1285 1286 // ----- indexOf ----- // 1287 1288 // index of helper cause IE8 1289 utils.indexOf = Array.prototype.indexOf ? function( ary, obj ) { 1290 return ary.indexOf( obj ); 1291 } : function( ary, obj ) { 1292 for ( var i=0, len = ary.length; i < len; i++ ) { 1293 if ( ary[i] === obj ) { 1294 return i; 1295 } 1296 } 1297 return -1; 1298 }; 1299 1300 // ----- removeFrom ----- // 1301 1302 utils.removeFrom = function( ary, obj ) { 1303 var index = utils.indexOf( ary, obj ); 1304 if ( index != -1 ) { 1305 ary.splice( index, 1 ); 1306 } 1307 }; 1308 1309 // ----- isElement ----- // 1310 1311 // http://stackoverflow.com/a/384380/182183 1312 utils.isElement = ( typeof HTMLElement == 'function' || typeof HTMLElement == 'object' ) ? 1313 function isElementDOM2( obj ) { 1314 return obj instanceof HTMLElement; 1315 } : 1316 function isElementQuirky( obj ) { 1317 return obj && typeof obj == 'object' && 1318 obj.nodeType == 1 && typeof obj.nodeName == 'string'; 1319 }; 1320 1321 // ----- setText ----- // 1322 1323 utils.setText = ( function() { 1324 var setTextProperty; 1325 function setText( elem, text ) { 1326 // only check setTextProperty once 1327 setTextProperty = setTextProperty || ( document.documentElement.textContent !== undefined ? 'textContent' : 'innerText' ); 1328 elem[ setTextProperty ] = text; 1329 } 1330 return setText; 1331 })(); 1332 1333 // ----- getParent ----- // 1334 1335 utils.getParent = function( elem, selector ) { 1336 while ( elem != document.body ) { 1337 elem = elem.parentNode; 1338 if ( matchesSelector( elem, selector ) ) { 1339 return elem; 1340 } 1341 } 1342 }; 1343 1344 // ----- getQueryElement ----- // 1345 1346 // use element as selector string 1347 utils.getQueryElement = function( elem ) { 1348 if ( typeof elem == 'string' ) { 1349 return document.querySelector( elem ); 1350 } 1351 return elem; 1352 }; 1353 1354 // ----- handleEvent ----- // 1355 1356 // enable .ontype to trigger from .addEventListener( elem, 'type' ) 1357 utils.handleEvent = function( event ) { 1358 var method = 'on' + event.type; 1359 if ( this[ method ] ) { 1360 this[ method ]( event ); 1361 } 1362 }; 1363 1364 // ----- filterFindElements ----- // 1365 1366 utils.filterFindElements = function( elems, selector ) { 1367 // make array of elems 1368 elems = utils.makeArray( elems ); 1369 var ffElems = []; 1370 1371 for ( var i=0, len = elems.length; i < len; i++ ) { 1372 var elem = elems[i]; 1373 // check that elem is an actual element 1374 if ( !utils.isElement( elem ) ) { 1375 continue; 1376 } 1377 // filter & find items if we have a selector 1378 if ( selector ) { 1379 // filter siblings 1380 if ( matchesSelector( elem, selector ) ) { 1381 ffElems.push( elem ); 1382 } 1383 // find children 1384 var childElems = elem.querySelectorAll( selector ); 1385 // concat childElems to filterFound array 1386 for ( var j=0, jLen = childElems.length; j < jLen; j++ ) { 1387 ffElems.push( childElems[j] ); 1388 } 1389 } else { 1390 ffElems.push( elem ); 1391 } 1392 } 1393 1394 return ffElems; 1395 }; 1396 1397 // ----- debounceMethod ----- // 1398 1399 utils.debounceMethod = function( _class, methodName, threshold ) { 1400 // original method 1401 var method = _class.prototype[ methodName ]; 1402 var timeoutName = methodName + 'Timeout'; 1403 1404 _class.prototype[ methodName ] = function() { 1405 var timeout = this[ timeoutName ]; 1406 if ( timeout ) { 1407 clearTimeout( timeout ); 1408 } 1409 var args = arguments; 1410 1411 var _this = this; 1412 this[ timeoutName ] = setTimeout( function() { 1413 method.apply( _this, args ); 1414 delete _this[ timeoutName ]; 1415 }, threshold || 100 ); 1416 }; 1417 }; 1418 1419 // ----- htmlInit ----- // 1420 1421 // http://jamesroberts.name/blog/2010/02/22/string-functions-for-javascript-trim-to-camel-case-to-dashed-and-to-underscore/ 1422 utils.toDashed = function( str ) { 1423 return str.replace( /(.)([A-Z])/g, function( match, $1, $2 ) { 1424 return $1 + '-' + $2; 1425 }).toLowerCase(); 1426 }; 1427 1428 var console = window.console; 1429 /** 1430 * allow user to initialize classes via .js-namespace class 1431 * htmlInit( Widget, 'widgetName' ) 1432 * options are parsed from data-namespace-option attribute 1433 */ 1434 utils.htmlInit = function( WidgetClass, namespace ) { 1435 docReady( function() { 1436 var dashedNamespace = utils.toDashed( namespace ); 1437 var elems = document.querySelectorAll( '.js-' + dashedNamespace ); 1438 var dataAttr = 'data-' + dashedNamespace + '-options'; 1439 1440 for ( var i=0, len = elems.length; i < len; i++ ) { 1441 var elem = elems[i]; 1442 var attr = elem.getAttribute( dataAttr ); 1443 var options; 1444 try { 1445 options = attr && JSON.parse( attr ); 1446 } catch ( error ) { 1447 // log error, do not initialize 1448 if ( console ) { 1449 console.error( 'Error parsing ' + dataAttr + ' on ' + 1450 elem.nodeName.toLowerCase() + ( elem.id ? '#' + elem.id : '' ) + ': ' + 1451 error ); 1452 } 1453 continue; 1454 } 1455 // initialize 1456 var instance = new WidgetClass( elem, options ); 1457 // make available via $().data('layoutname') 1458 var jQuery = window.jQuery; 1459 if ( jQuery ) { 1460 jQuery.data( elem, namespace, instance ); 1461 } 1462 } 1463 }); 1464 }; 1465 1466 // ----- ----- // 1467 1468 return utils; 1469 1470 })); 1471 1472 /** 1473 * Outlayer Item 1474 */ 1475 1476 ( function( window, factory ) { 1477 1478 // universal module definition 1479 if ( typeof define === 'function' && define.amd ) { 1480 // AMD 1481 define( 'outlayer/item',[ 1482 'eventEmitter/EventEmitter', 1483 'get-size/get-size', 1484 'get-style-property/get-style-property', 1485 'fizzy-ui-utils/utils' 1486 ], 1487 function( EventEmitter, getSize, getStyleProperty, utils ) { 1488 return factory( window, EventEmitter, getSize, getStyleProperty, utils ); 1489 } 1490 ); 1491 } else if (typeof exports === 'object') { 1492 // CommonJS 1493 module.exports = factory( 1494 window, 1495 require('wolfy87-eventemitter'), 1496 require('get-size'), 1497 require('desandro-get-style-property'), 1498 require('fizzy-ui-utils') 1499 ); 1500 } else { 1501 // browser global 1502 window.Outlayer = {}; 1503 window.Outlayer.Item = factory( 1504 window, 1505 window.EventEmitter, 1506 window.getSize, 1507 window.getStyleProperty, 1508 window.fizzyUIUtils 1509 ); 1510 } 1511 1512 }( window, function factory( window, EventEmitter, getSize, getStyleProperty, utils ) { 1513 1514 1515 // ----- helpers ----- // 1516 1517 var getComputedStyle = window.getComputedStyle; 1518 var getStyle = getComputedStyle ? 1519 function( elem ) { 1520 return getComputedStyle( elem, null ); 1521 } : 1522 function( elem ) { 1523 return elem.currentStyle; 1524 }; 1525 1526 1527 function isEmptyObj( obj ) { 1528 for ( var prop in obj ) { 1529 return false; 1530 } 1531 prop = null; 1532 return true; 1533 } 1534 1535 // -------------------------- CSS3 support -------------------------- // 1536 1537 var transitionProperty = getStyleProperty('transition'); 1538 var transformProperty = getStyleProperty('transform'); 1539 var supportsCSS3 = transitionProperty && transformProperty; 1540 var is3d = !!getStyleProperty('perspective'); 1541 1542 var transitionEndEvent = { 1543 WebkitTransition: 'webkitTransitionEnd', 1544 MozTransition: 'transitionend', 1545 OTransition: 'otransitionend', 1546 transition: 'transitionend' 1547 }[ transitionProperty ]; 1548 1549 // properties that could have vendor prefix 1550 var prefixableProperties = [ 1551 'transform', 1552 'transition', 1553 'transitionDuration', 1554 'transitionProperty' 1555 ]; 1556 1557 // cache all vendor properties 1558 var vendorProperties = ( function() { 1559 var cache = {}; 1560 for ( var i=0, len = prefixableProperties.length; i < len; i++ ) { 1561 var prop = prefixableProperties[i]; 1562 var supportedProp = getStyleProperty( prop ); 1563 if ( supportedProp && supportedProp !== prop ) { 1564 cache[ prop ] = supportedProp; 1565 } 1566 } 1567 return cache; 1568 })(); 1569 1570 // -------------------------- Item -------------------------- // 1571 1572 function Item( element, layout ) { 1573 if ( !element ) { 1574 return; 1575 } 1576 1577 this.element = element; 1578 // parent layout class, i.e. Masonry, Isotope, or Packery 1579 this.layout = layout; 1580 this.position = { 1581 x: 0, 1582 y: 0 1583 }; 1584 1585 this._create(); 1586 } 1587 1588 // inherit EventEmitter 1589 utils.extend( Item.prototype, EventEmitter.prototype ); 1590 1591 Item.prototype._create = function() { 1592 // transition objects 1593 this._transn = { 1594 ingProperties: {}, 1595 clean: {}, 1596 onEnd: {} 1597 }; 1598 1599 this.css({ 1600 position: 'absolute' 1601 }); 1602 }; 1603 1604 // trigger specified handler for event type 1605 Item.prototype.handleEvent = function( event ) { 1606 var method = 'on' + event.type; 1607 if ( this[ method ] ) { 1608 this[ method ]( event ); 1609 } 1610 }; 1611 1612 Item.prototype.getSize = function() { 1613 this.size = getSize( this.element ); 1614 }; 1615 1616 /** 1617 * apply CSS styles to element 1618 * @param {Object} style 1619 */ 1620 Item.prototype.css = function( style ) { 1621 var elemStyle = this.element.style; 1622 1623 for ( var prop in style ) { 1624 // use vendor property if available 1625 var supportedProp = vendorProperties[ prop ] || prop; 1626 elemStyle[ supportedProp ] = style[ prop ]; 1627 } 1628 }; 1629 1630 // measure position, and sets it 1631 Item.prototype.getPosition = function() { 1632 var style = getStyle( this.element ); 1633 var layoutOptions = this.layout.options; 1634 var isOriginLeft = layoutOptions.isOriginLeft; 1635 var isOriginTop = layoutOptions.isOriginTop; 1636 var xValue = style[ isOriginLeft ? 'left' : 'right' ]; 1637 var yValue = style[ isOriginTop ? 'top' : 'bottom' ]; 1638 // convert percent to pixels 1639 var layoutSize = this.layout.size; 1640 var x = xValue.indexOf('%') != -1 ? 1641 ( parseFloat( xValue ) / 100 ) * layoutSize.width : parseInt( xValue, 10 ); 1642 var y = yValue.indexOf('%') != -1 ? 1643 ( parseFloat( yValue ) / 100 ) * layoutSize.height : parseInt( yValue, 10 ); 1644 1645 // clean up 'auto' or other non-integer values 1646 x = isNaN( x ) ? 0 : x; 1647 y = isNaN( y ) ? 0 : y; 1648 // remove padding from measurement 1649 x -= isOriginLeft ? layoutSize.paddingLeft : layoutSize.paddingRight; 1650 y -= isOriginTop ? layoutSize.paddingTop : layoutSize.paddingBottom; 1651 1652 this.position.x = x; 1653 this.position.y = y; 1654 }; 1655 1656 // set settled position, apply padding 1657 Item.prototype.layoutPosition = function() { 1658 var layoutSize = this.layout.size; 1659 var layoutOptions = this.layout.options; 1660 var style = {}; 1661 1662 // x 1663 var xPadding = layoutOptions.isOriginLeft ? 'paddingLeft' : 'paddingRight'; 1664 var xProperty = layoutOptions.isOriginLeft ? 'left' : 'right'; 1665 var xResetProperty = layoutOptions.isOriginLeft ? 'right' : 'left'; 1666 1667 var x = this.position.x + layoutSize[ xPadding ]; 1668 // set in percentage or pixels 1669 style[ xProperty ] = this.getXValue( x ); 1670 // reset other property 1671 style[ xResetProperty ] = ''; 1672 1673 // y 1674 var yPadding = layoutOptions.isOriginTop ? 'paddingTop' : 'paddingBottom'; 1675 var yProperty = layoutOptions.isOriginTop ? 'top' : 'bottom'; 1676 var yResetProperty = layoutOptions.isOriginTop ? 'bottom' : 'top'; 1677 1678 var y = this.position.y + layoutSize[ yPadding ]; 1679 // set in percentage or pixels 1680 style[ yProperty ] = this.getYValue( y ); 1681 // reset other property 1682 style[ yResetProperty ] = ''; 1683 1684 this.css( style ); 1685 this.emitEvent( 'layout', [ this ] ); 1686 }; 1687 1688 Item.prototype.getXValue = function( x ) { 1689 var layoutOptions = this.layout.options; 1690 return layoutOptions.percentPosition && !layoutOptions.isHorizontal ? 1691 ( ( x / this.layout.size.width ) * 100 ) + '%' : x + 'px'; 1692 }; 1693 1694 Item.prototype.getYValue = function( y ) { 1695 var layoutOptions = this.layout.options; 1696 return layoutOptions.percentPosition && layoutOptions.isHorizontal ? 1697 ( ( y / this.layout.size.height ) * 100 ) + '%' : y + 'px'; 1698 }; 1699 1700 1701 Item.prototype._transitionTo = function( x, y ) { 1702 this.getPosition(); 1703 // get current x & y from top/left 1704 var curX = this.position.x; 1705 var curY = this.position.y; 1706 1707 var compareX = parseInt( x, 10 ); 1708 var compareY = parseInt( y, 10 ); 1709 var didNotMove = compareX === this.position.x && compareY === this.position.y; 1710 1711 // save end position 1712 this.setPosition( x, y ); 1713 1714 // if did not move and not transitioning, just go to layout 1715 if ( didNotMove && !this.isTransitioning ) { 1716 this.layoutPosition(); 1717 return; 1718 } 1719 1720 var transX = x - curX; 1721 var transY = y - curY; 1722 var transitionStyle = {}; 1723 transitionStyle.transform = this.getTranslate( transX, transY ); 1724 1725 this.transition({ 1726 to: transitionStyle, 1727 onTransitionEnd: { 1728 transform: this.layoutPosition 1729 }, 1730 isCleaning: true 1731 }); 1732 }; 1733 1734 Item.prototype.getTranslate = function( x, y ) { 1735 // flip cooridinates if origin on right or bottom 1736 var layoutOptions = this.layout.options; 1737 x = layoutOptions.isOriginLeft ? x : -x; 1738 y = layoutOptions.isOriginTop ? y : -y; 1739 1740 if ( is3d ) { 1741 return 'translate3d(' + x + 'px, ' + y + 'px, 0)'; 1742 } 1743 1744 return 'translate(' + x + 'px, ' + y + 'px)'; 1745 }; 1746 1747 // non transition + transform support 1748 Item.prototype.goTo = function( x, y ) { 1749 this.setPosition( x, y ); 1750 this.layoutPosition(); 1751 }; 1752 1753 // use transition and transforms if supported 1754 Item.prototype.moveTo = supportsCSS3 ? 1755 Item.prototype._transitionTo : Item.prototype.goTo; 1756 1757 Item.prototype.setPosition = function( x, y ) { 1758 this.position.x = parseInt( x, 10 ); 1759 this.position.y = parseInt( y, 10 ); 1760 }; 1761 1762 // ----- transition ----- // 1763 1764 /** 1765 * @param {Object} style - CSS 1766 * @param {Function} onTransitionEnd 1767 */ 1768 1769 // non transition, just trigger callback 1770 Item.prototype._nonTransition = function( args ) { 1771 this.css( args.to ); 1772 if ( args.isCleaning ) { 1773 this._removeStyles( args.to ); 1774 } 1775 for ( var prop in args.onTransitionEnd ) { 1776 args.onTransitionEnd[ prop ].call( this ); 1777 } 1778 }; 1779 1780 /** 1781 * proper transition 1782 * @param {Object} args - arguments 1783 * @param {Object} to - style to transition to 1784 * @param {Object} from - style to start transition from 1785 * @param {Boolean} isCleaning - removes transition styles after transition 1786 * @param {Function} onTransitionEnd - callback 1787 */ 1788 Item.prototype._transition = function( args ) { 1789 // redirect to nonTransition if no transition duration 1790 if ( !parseFloat( this.layout.options.transitionDuration ) ) { 1791 this._nonTransition( args ); 1792 return; 1793 } 1794 1795 var _transition = this._transn; 1796 // keep track of onTransitionEnd callback by css property 1797 for ( var prop in args.onTransitionEnd ) { 1798 _transition.onEnd[ prop ] = args.onTransitionEnd[ prop ]; 1799 } 1800 // keep track of properties that are transitioning 1801 for ( prop in args.to ) { 1802 _transition.ingProperties[ prop ] = true; 1803 // keep track of properties to clean up when transition is done 1804 if ( args.isCleaning ) { 1805 _transition.clean[ prop ] = true; 1806 } 1807 } 1808 1809 // set from styles 1810 if ( args.from ) { 1811 this.css( args.from ); 1812 // force redraw. http://blog.alexmaccaw.com/css-transitions 1813 var h = this.element.offsetHeight; 1814 // hack for JSHint to hush about unused var 1815 h = null; 1816 } 1817 // enable transition 1818 this.enableTransition( args.to ); 1819 // set styles that are transitioning 1820 this.css( args.to ); 1821 1822 this.isTransitioning = true; 1823 1824 }; 1825 1826 // dash before all cap letters, including first for 1827 // WebkitTransform => -webkit-transform 1828 function toDashedAll( str ) { 1829 return str.replace( /([A-Z])/g, function( $1 ) { 1830 return '-' + $1.toLowerCase(); 1831 }); 1832 } 1833 1834 var transitionProps = 'opacity,' + 1835 toDashedAll( vendorProperties.transform || 'transform' ); 1836 1837 Item.prototype.enableTransition = function(/* style */) { 1838 // HACK changing transitionProperty during a transition 1839 // will cause transition to jump 1840 if ( this.isTransitioning ) { 1841 return; 1842 } 1843 1844 // make `transition: foo, bar, baz` from style object 1845 // HACK un-comment this when enableTransition can work 1846 // while a transition is happening 1847 // var transitionValues = []; 1848 // for ( var prop in style ) { 1849 // // dash-ify camelCased properties like WebkitTransition 1850 // prop = vendorProperties[ prop ] || prop; 1851 // transitionValues.push( toDashedAll( prop ) ); 1852 // } 1853 // enable transition styles 1854 this.css({ 1855 transitionProperty: transitionProps, 1856 transitionDuration: this.layout.options.transitionDuration 1857 }); 1858 // listen for transition end event 1859 this.element.addEventListener( transitionEndEvent, this, false ); 1860 }; 1861 1862 Item.prototype.transition = Item.prototype[ transitionProperty ? '_transition' : '_nonTransition' ]; 1863 1864 // ----- events ----- // 1865 1866 Item.prototype.onwebkitTransitionEnd = function( event ) { 1867 this.ontransitionend( event ); 1868 }; 1869 1870 Item.prototype.onotransitionend = function( event ) { 1871 this.ontransitionend( event ); 1872 }; 1873 1874 // properties that I munge to make my life easier 1875 var dashedVendorProperties = { 1876 '-webkit-transform': 'transform', 1877 '-moz-transform': 'transform', 1878 '-o-transform': 'transform' 1879 }; 1880 1881 Item.prototype.ontransitionend = function( event ) { 1882 // disregard bubbled events from children 1883 if ( event.target !== this.element ) { 1884 return; 1885 } 1886 var _transition = this._transn; 1887 // get property name of transitioned property, convert to prefix-free 1888 var propertyName = dashedVendorProperties[ event.propertyName ] || event.propertyName; 1889 1890 // remove property that has completed transitioning 1891 delete _transition.ingProperties[ propertyName ]; 1892 // check if any properties are still transitioning 1893 if ( isEmptyObj( _transition.ingProperties ) ) { 1894 // all properties have completed transitioning 1895 this.disableTransition(); 1896 } 1897 // clean style 1898 if ( propertyName in _transition.clean ) { 1899 // clean up style 1900 this.element.style[ event.propertyName ] = ''; 1901 delete _transition.clean[ propertyName ]; 1902 } 1903 // trigger onTransitionEnd callback 1904 if ( propertyName in _transition.onEnd ) { 1905 var onTransitionEnd = _transition.onEnd[ propertyName ]; 1906 onTransitionEnd.call( this ); 1907 delete _transition.onEnd[ propertyName ]; 1908 } 1909 1910 this.emitEvent( 'transitionEnd', [ this ] ); 1911 }; 1912 1913 Item.prototype.disableTransition = function() { 1914 this.removeTransitionStyles(); 1915 this.element.removeEventListener( transitionEndEvent, this, false ); 1916 this.isTransitioning = false; 1917 }; 1918 1919 /** 1920 * removes style property from element 1921 * @param {Object} style 1922 **/ 1923 Item.prototype._removeStyles = function( style ) { 1924 // clean up transition styles 1925 var cleanStyle = {}; 1926 for ( var prop in style ) { 1927 cleanStyle[ prop ] = ''; 1928 } 1929 this.css( cleanStyle ); 1930 }; 1931 1932 var cleanTransitionStyle = { 1933 transitionProperty: '', 1934 transitionDuration: '' 1935 }; 1936 1937 Item.prototype.removeTransitionStyles = function() { 1938 // remove transition 1939 this.css( cleanTransitionStyle ); 1940 }; 1941 1942 // ----- show/hide/remove ----- // 1943 1944 // remove element from DOM 1945 Item.prototype.removeElem = function() { 1946 this.element.parentNode.removeChild( this.element ); 1947 // remove display: none 1948 this.css({ display: '' }); 1949 this.emitEvent( 'remove', [ this ] ); 1950 }; 1951 1952 Item.prototype.remove = function() { 1953 // just remove element if no transition support or no transition 1954 if ( !transitionProperty || !parseFloat( this.layout.options.transitionDuration ) ) { 1955 this.removeElem(); 1956 return; 1957 } 1958 1959 // start transition 1960 var _this = this; 1961 this.once( 'transitionEnd', function() { 1962 _this.removeElem(); 1963 }); 1964 this.hide(); 1965 }; 1966 1967 Item.prototype.reveal = function() { 1968 delete this.isHidden; 1969 // remove display: none 1970 this.css({ display: '' }); 1971 1972 var options = this.layout.options; 1973 1974 var onTransitionEnd = {}; 1975 var transitionEndProperty = this.getHideRevealTransitionEndProperty('visibleStyle'); 1976 onTransitionEnd[ transitionEndProperty ] = this.onRevealTransitionEnd; 1977 1978 this.transition({ 1979 from: options.hiddenStyle, 1980 to: options.visibleStyle, 1981 isCleaning: true, 1982 onTransitionEnd: onTransitionEnd 1983 }); 1984 }; 1985 1986 Item.prototype.onRevealTransitionEnd = function() { 1987 // check if still visible 1988 // during transition, item may have been hidden 1989 if ( !this.isHidden ) { 1990 this.emitEvent('reveal'); 1991 } 1992 }; 1993 1994 /** 1995 * get style property use for hide/reveal transition end 1996 * @param {String} styleProperty - hiddenStyle/visibleStyle 1997 * @returns {String} 1998 */ 1999 Item.prototype.getHideRevealTransitionEndProperty = function( styleProperty ) { 2000 var optionStyle = this.layout.options[ styleProperty ]; 2001 // use opacity 2002 if ( optionStyle.opacity ) { 2003 return 'opacity'; 2004 } 2005 // get first property 2006 for ( var prop in optionStyle ) { 2007 return prop; 2008 } 2009 }; 2010 2011 Item.prototype.hide = function() { 2012 // set flag 2013 this.isHidden = true; 2014 // remove display: none 2015 this.css({ display: '' }); 2016 2017 var options = this.layout.options; 2018 2019 var onTransitionEnd = {}; 2020 var transitionEndProperty = this.getHideRevealTransitionEndProperty('hiddenStyle'); 2021 onTransitionEnd[ transitionEndProperty ] = this.onHideTransitionEnd; 2022 2023 this.transition({ 2024 from: options.visibleStyle, 2025 to: options.hiddenStyle, 2026 // keep hidden stuff hidden 2027 isCleaning: true, 2028 onTransitionEnd: onTransitionEnd 2029 }); 2030 }; 2031 2032 Item.prototype.onHideTransitionEnd = function() { 2033 // check if still hidden 2034 // during transition, item may have been un-hidden 2035 if ( this.isHidden ) { 2036 this.css({ display: 'none' }); 2037 this.emitEvent('hide'); 2038 } 2039 }; 2040 2041 Item.prototype.destroy = function() { 2042 this.css({ 2043 position: '', 2044 left: '', 2045 right: '', 2046 top: '', 2047 bottom: '', 2048 transition: '', 2049 transform: '' 2050 }); 2051 }; 2052 2053 return Item; 2054 2055 })); 2056 2057 /*! 2058 * Outlayer v1.4.2 2059 * the brains and guts of a layout library 2060 * MIT license 2061 */ 2062 2063 ( function( window, factory ) { 2064 2065 // universal module definition 2066 2067 if ( typeof define == 'function' && define.amd ) { 2068 // AMD 2069 define( 'outlayer/outlayer',[ 2070 'eventie/eventie', 2071 'eventEmitter/EventEmitter', 2072 'get-size/get-size', 2073 'fizzy-ui-utils/utils', 2074 './item' 2075 ], 2076 function( eventie, EventEmitter, getSize, utils, Item ) { 2077 return factory( window, eventie, EventEmitter, getSize, utils, Item); 2078 } 2079 ); 2080 } else if ( typeof exports == 'object' ) { 2081 // CommonJS 2082 module.exports = factory( 2083 window, 2084 require('eventie'), 2085 require('wolfy87-eventemitter'), 2086 require('get-size'), 2087 require('fizzy-ui-utils'), 2088 require('./item') 2089 ); 2090 } else { 2091 // browser global 2092 window.Outlayer = factory( 2093 window, 2094 window.eventie, 2095 window.EventEmitter, 2096 window.getSize, 2097 window.fizzyUIUtils, 2098 window.Outlayer.Item 2099 ); 2100 } 2101 2102 }( window, function factory( window, eventie, EventEmitter, getSize, utils, Item ) { 2103 2104 2105 // ----- vars ----- // 2106 2107 var console = window.console; 2108 var jQuery = window.jQuery; 2109 var noop = function() {}; 2110 2111 // -------------------------- Outlayer -------------------------- // 2112 2113 // globally unique identifiers 2114 var GUID = 0; 2115 // internal store of all Outlayer intances 2116 var instances = {}; 2117 2118 2119 /** 2120 * @param {Element, String} element 2121 * @param {Object} options 2122 * @constructor 2123 */ 2124 function Outlayer( element, options ) { 2125 var queryElement = utils.getQueryElement( element ); 2126 if ( !queryElement ) { 2127 if ( console ) { 2128 console.error( 'Bad element for ' + this.constructor.namespace + 2129 ': ' + ( queryElement || element ) ); 2130 } 2131 return; 2132 } 2133 this.element = queryElement; 2134 // add jQuery 2135 if ( jQuery ) { 2136 this.$element = jQuery( this.element ); 2137 } 2138 2139 // options 2140 this.options = utils.extend( {}, this.constructor.defaults ); 2141 this.option( options ); 2142 2143 // add id for Outlayer.getFromElement 2144 var id = ++GUID; 2145 this.element.outlayerGUID = id; // expando 2146 instances[ id ] = this; // associate via id 2147 2148 // kick it off 2149 this._create(); 2150 2151 if ( this.options.isInitLayout ) { 2152 this.layout(); 2153 } 2154 } 2155 2156 // settings are for internal use only 2157 Outlayer.namespace = 'outlayer'; 2158 Outlayer.Item = Item; 2159 2160 // default options 2161 Outlayer.defaults = { 2162 containerStyle: { 2163 position: 'relative' 2164 }, 2165 isInitLayout: true, 2166 isOriginLeft: true, 2167 isOriginTop: true, 2168 isResizeBound: true, 2169 isResizingContainer: true, 2170 // item options 2171 transitionDuration: '0.4s', 2172 hiddenStyle: { 2173 opacity: 0, 2174 transform: 'scale(0.001)' 2175 }, 2176 visibleStyle: { 2177 opacity: 1, 2178 transform: 'scale(1)' 2179 } 2180 }; 2181 2182 // inherit EventEmitter 2183 utils.extend( Outlayer.prototype, EventEmitter.prototype ); 2184 2185 /** 2186 * set options 2187 * @param {Object} opts 2188 */ 2189 Outlayer.prototype.option = function( opts ) { 2190 utils.extend( this.options, opts ); 2191 }; 2192 2193 Outlayer.prototype._create = function() { 2194 // get items from children 2195 this.reloadItems(); 2196 // elements that affect layout, but are not laid out 2197 this.stamps = []; 2198 this.stamp( this.options.stamp ); 2199 // set container style 2200 utils.extend( this.element.style, this.options.containerStyle ); 2201 2202 // bind resize method 2203 if ( this.options.isResizeBound ) { 2204 this.bindResize(); 2205 } 2206 }; 2207 2208 // goes through all children again and gets bricks in proper order 2209 Outlayer.prototype.reloadItems = function() { 2210 // collection of item elements 2211 this.items = this._itemize( this.element.children ); 2212 }; 2213 2214 2215 /** 2216 * turn elements into Outlayer.Items to be used in layout 2217 * @param {Array or NodeList or HTMLElement} elems 2218 * @returns {Array} items - collection of new Outlayer Items 2219 */ 2220 Outlayer.prototype._itemize = function( elems ) { 2221 2222 var itemElems = this._filterFindItemElements( elems ); 2223 var Item = this.constructor.Item; 2224 2225 // create new Outlayer Items for collection 2226 var items = []; 2227 for ( var i=0, len = itemElems.length; i < len; i++ ) { 2228 var elem = itemElems[i]; 2229 var item = new Item( elem, this ); 2230 items.push( item ); 2231 } 2232 2233 return items; 2234 }; 2235 2236 /** 2237 * get item elements to be used in layout 2238 * @param {Array or NodeList or HTMLElement} elems 2239 * @returns {Array} items - item elements 2240 */ 2241 Outlayer.prototype._filterFindItemElements = function( elems ) { 2242 return utils.filterFindElements( elems, this.options.itemSelector ); 2243 }; 2244 2245 /** 2246 * getter method for getting item elements 2247 * @returns {Array} elems - collection of item elements 2248 */ 2249 Outlayer.prototype.getItemElements = function() { 2250 var elems = []; 2251 for ( var i=0, len = this.items.length; i < len; i++ ) { 2252 elems.push( this.items[i].element ); 2253 } 2254 return elems; 2255 }; 2256 2257 // ----- init & layout ----- // 2258 2259 /** 2260 * lays out all items 2261 */ 2262 Outlayer.prototype.layout = function() { 2263 this._resetLayout(); 2264 this._manageStamps(); 2265 2266 // don't animate first layout 2267 var isInstant = this.options.isLayoutInstant !== undefined ? 2268 this.options.isLayoutInstant : !this._isLayoutInited; 2269 this.layoutItems( this.items, isInstant ); 2270 2271 // flag for initalized 2272 this._isLayoutInited = true; 2273 }; 2274 2275 // _init is alias for layout 2276 Outlayer.prototype._init = Outlayer.prototype.layout; 2277 2278 /** 2279 * logic before any new layout 2280 */ 2281 Outlayer.prototype._resetLayout = function() { 2282 this.getSize(); 2283 }; 2284 2285 2286 Outlayer.prototype.getSize = function() { 2287 this.size = getSize( this.element ); 2288 }; 2289 2290 /** 2291 * get measurement from option, for columnWidth, rowHeight, gutter 2292 * if option is String -> get element from selector string, & get size of element 2293 * if option is Element -> get size of element 2294 * else use option as a number 2295 * 2296 * @param {String} measurement 2297 * @param {String} size - width or height 2298 * @private 2299 */ 2300 Outlayer.prototype._getMeasurement = function( measurement, size ) { 2301 var option = this.options[ measurement ]; 2302 var elem; 2303 if ( !option ) { 2304 // default to 0 2305 this[ measurement ] = 0; 2306 } else { 2307 // use option as an element 2308 if ( typeof option === 'string' ) { 2309 elem = this.element.querySelector( option ); 2310 } else if ( utils.isElement( option ) ) { 2311 elem = option; 2312 } 2313 // use size of element, if element 2314 this[ measurement ] = elem ? getSize( elem )[ size ] : option; 2315 } 2316 }; 2317 2318 /** 2319 * layout a collection of item elements 2320 * @api public 2321 */ 2322 Outlayer.prototype.layoutItems = function( items, isInstant ) { 2323 items = this._getItemsForLayout( items ); 2324 2325 this._layoutItems( items, isInstant ); 2326 2327 this._postLayout(); 2328 }; 2329 2330 /** 2331 * get the items to be laid out 2332 * you may want to skip over some items 2333 * @param {Array} items 2334 * @returns {Array} items 2335 */ 2336 Outlayer.prototype._getItemsForLayout = function( items ) { 2337 var layoutItems = []; 2338 for ( var i=0, len = items.length; i < len; i++ ) { 2339 var item = items[i]; 2340 if ( !item.isIgnored ) { 2341 layoutItems.push( item ); 2342 } 2343 } 2344 return layoutItems; 2345 }; 2346 2347 /** 2348 * layout items 2349 * @param {Array} items 2350 * @param {Boolean} isInstant 2351 */ 2352 Outlayer.prototype._layoutItems = function( items, isInstant ) { 2353 this._emitCompleteOnItems( 'layout', items ); 2354 2355 if ( !items || !items.length ) { 2356 // no items, emit event with empty array 2357 return; 2358 } 2359 2360 var queue = []; 2361 2362 for ( var i=0, len = items.length; i < len; i++ ) { 2363 var item = items[i]; 2364 // get x/y object from method 2365 var position = this._getItemLayoutPosition( item ); 2366 // enqueue 2367 position.item = item; 2368 position.isInstant = isInstant || item.isLayoutInstant; 2369 queue.push( position ); 2370 } 2371 2372 this._processLayoutQueue( queue ); 2373 }; 2374 2375 /** 2376 * get item layout position 2377 * @param {Outlayer.Item} item 2378 * @returns {Object} x and y position 2379 */ 2380 Outlayer.prototype._getItemLayoutPosition = function( /* item */ ) { 2381 return { 2382 x: 0, 2383 y: 0 2384 }; 2385 }; 2386 2387 /** 2388 * iterate over array and position each item 2389 * Reason being - separating this logic prevents 'layout invalidation' 2390 * thx @paul_irish 2391 * @param {Array} queue 2392 */ 2393 Outlayer.prototype._processLayoutQueue = function( queue ) { 2394 for ( var i=0, len = queue.length; i < len; i++ ) { 2395 var obj = queue[i]; 2396 this._positionItem( obj.item, obj.x, obj.y, obj.isInstant ); 2397 } 2398 }; 2399 2400 /** 2401 * Sets position of item in DOM 2402 * @param {Outlayer.Item} item 2403 * @param {Number} x - horizontal position 2404 * @param {Number} y - vertical position 2405 * @param {Boolean} isInstant - disables transitions 2406 */ 2407 Outlayer.prototype._positionItem = function( item, x, y, isInstant ) { 2408 if ( isInstant ) { 2409 // if not transition, just set CSS 2410 item.goTo( x, y ); 2411 } else { 2412 item.moveTo( x, y ); 2413 } 2414 }; 2415 2416 /** 2417 * Any logic you want to do after each layout, 2418 * i.e. size the container 2419 */ 2420 Outlayer.prototype._postLayout = function() { 2421 this.resizeContainer(); 2422 }; 2423 2424 Outlayer.prototype.resizeContainer = function() { 2425 if ( !this.options.isResizingContainer ) { 2426 return; 2427 } 2428 var size = this._getContainerSize(); 2429 if ( size ) { 2430 this._setContainerMeasure( size.width, true ); 2431 this._setContainerMeasure( size.height, false ); 2432 } 2433 }; 2434 2435 /** 2436 * Sets width or height of container if returned 2437 * @returns {Object} size 2438 * @param {Number} width 2439 * @param {Number} height 2440 */ 2441 Outlayer.prototype._getContainerSize = noop; 2442 2443 /** 2444 * @param {Number} measure - size of width or height 2445 * @param {Boolean} isWidth 2446 */ 2447 Outlayer.prototype._setContainerMeasure = function( measure, isWidth ) { 2448 if ( measure === undefined ) { 2449 return; 2450 } 2451 2452 var elemSize = this.size; 2453 // add padding and border width if border box 2454 if ( elemSize.isBorderBox ) { 2455 measure += isWidth ? elemSize.paddingLeft + elemSize.paddingRight + 2456 elemSize.borderLeftWidth + elemSize.borderRightWidth : 2457 elemSize.paddingBottom + elemSize.paddingTop + 2458 elemSize.borderTopWidth + elemSize.borderBottomWidth; 2459 } 2460 2461 measure = Math.max( measure, 0 ); 2462 this.element.style[ isWidth ? 'width' : 'height' ] = measure + 'px'; 2463 }; 2464 2465 /** 2466 * emit eventComplete on a collection of items events 2467 * @param {String} eventName 2468 * @param {Array} items - Outlayer.Items 2469 */ 2470 Outlayer.prototype._emitCompleteOnItems = function( eventName, items ) { 2471 var _this = this; 2472 function onComplete() { 2473 _this.dispatchEvent( eventName + 'Complete', null, [ items ] ); 2474 } 2475 2476 var count = items.length; 2477 if ( !items || !count ) { 2478 onComplete(); 2479 return; 2480 } 2481 2482 var doneCount = 0; 2483 function tick() { 2484 doneCount++; 2485 if ( doneCount === count ) { 2486 onComplete(); 2487 } 2488 } 2489 2490 // bind callback 2491 for ( var i=0, len = items.length; i < len; i++ ) { 2492 var item = items[i]; 2493 item.once( eventName, tick ); 2494 } 2495 }; 2496 2497 /** 2498 * emits events via eventEmitter and jQuery events 2499 * @param {String} type - name of event 2500 * @param {Event} event - original event 2501 * @param {Array} args - extra arguments 2502 */ 2503 Outlayer.prototype.dispatchEvent = function( type, event, args ) { 2504 // add original event to arguments 2505 var emitArgs = event ? [ event ].concat( args ) : args; 2506 this.emitEvent( type, emitArgs ); 2507 2508 if ( jQuery ) { 2509 // set this.$element 2510 this.$element = this.$element || jQuery( this.element ); 2511 if ( event ) { 2512 // create jQuery event 2513 var $event = jQuery.Event( event ); 2514 $event.type = type; 2515 this.$element.trigger( $event, args ); 2516 } else { 2517 // just trigger with type if no event available 2518 this.$element.trigger( type, args ); 2519 } 2520 } 2521 }; 2522 2523 // -------------------------- ignore & stamps -------------------------- // 2524 2525 2526 /** 2527 * keep item in collection, but do not lay it out 2528 * ignored items do not get skipped in layout 2529 * @param {Element} elem 2530 */ 2531 Outlayer.prototype.ignore = function( elem ) { 2532 var item = this.getItem( elem ); 2533 if ( item ) { 2534 item.isIgnored = true; 2535 } 2536 }; 2537 2538 /** 2539 * return item to layout collection 2540 * @param {Element} elem 2541 */ 2542 Outlayer.prototype.unignore = function( elem ) { 2543 var item = this.getItem( elem ); 2544 if ( item ) { 2545 delete item.isIgnored; 2546 } 2547 }; 2548 2549 /** 2550 * adds elements to stamps 2551 * @param {NodeList, Array, Element, or String} elems 2552 */ 2553 Outlayer.prototype.stamp = function( elems ) { 2554 elems = this._find( elems ); 2555 if ( !elems ) { 2556 return; 2557 } 2558 2559 this.stamps = this.stamps.concat( elems ); 2560 // ignore 2561 for ( var i=0, len = elems.length; i < len; i++ ) { 2562 var elem = elems[i]; 2563 this.ignore( elem ); 2564 } 2565 }; 2566 2567 /** 2568 * removes elements to stamps 2569 * @param {NodeList, Array, or Element} elems 2570 */ 2571 Outlayer.prototype.unstamp = function( elems ) { 2572 elems = this._find( elems ); 2573 if ( !elems ){ 2574 return; 2575 } 2576 2577 for ( var i=0, len = elems.length; i < len; i++ ) { 2578 var elem = elems[i]; 2579 // filter out removed stamp elements 2580 utils.removeFrom( this.stamps, elem ); 2581 this.unignore( elem ); 2582 } 2583 2584 }; 2585 2586 /** 2587 * finds child elements 2588 * @param {NodeList, Array, Element, or String} elems 2589 * @returns {Array} elems 2590 */ 2591 Outlayer.prototype._find = function( elems ) { 2592 if ( !elems ) { 2593 return; 2594 } 2595 // if string, use argument as selector string 2596 if ( typeof elems === 'string' ) { 2597 elems = this.element.querySelectorAll( elems ); 2598 } 2599 elems = utils.makeArray( elems ); 2600 return elems; 2601 }; 2602 2603 Outlayer.prototype._manageStamps = function() { 2604 if ( !this.stamps || !this.stamps.length ) { 2605 return; 2606 } 2607 2608 this._getBoundingRect(); 2609 2610 for ( var i=0, len = this.stamps.length; i < len; i++ ) { 2611 var stamp = this.stamps[i]; 2612 this._manageStamp( stamp ); 2613 } 2614 }; 2615 2616 // update boundingLeft / Top 2617 Outlayer.prototype._getBoundingRect = function() { 2618 // get bounding rect for container element 2619 var boundingRect = this.element.getBoundingClientRect(); 2620 var size = this.size; 2621 this._boundingRect = { 2622 left: boundingRect.left + size.paddingLeft + size.borderLeftWidth, 2623 top: boundingRect.top + size.paddingTop + size.borderTopWidth, 2624 right: boundingRect.right - ( size.paddingRight + size.borderRightWidth ), 2625 bottom: boundingRect.bottom - ( size.paddingBottom + size.borderBottomWidth ) 2626 }; 2627 }; 2628 2629 /** 2630 * @param {Element} stamp 2631 **/ 2632 Outlayer.prototype._manageStamp = noop; 2633 2634 /** 2635 * get x/y position of element relative to container element 2636 * @param {Element} elem 2637 * @returns {Object} offset - has left, top, right, bottom 2638 */ 2639 Outlayer.prototype._getElementOffset = function( elem ) { 2640 var boundingRect = elem.getBoundingClientRect(); 2641 var thisRect = this._boundingRect; 2642 var size = getSize( elem ); 2643 var offset = { 2644 left: boundingRect.left - thisRect.left - size.marginLeft, 2645 top: boundingRect.top - thisRect.top - size.marginTop, 2646 right: thisRect.right - boundingRect.right - size.marginRight, 2647 bottom: thisRect.bottom - boundingRect.bottom - size.marginBottom 2648 }; 2649 return offset; 2650 }; 2651 2652 // -------------------------- resize -------------------------- // 2653 2654 // enable event handlers for listeners 2655 // i.e. resize -> onresize 2656 Outlayer.prototype.handleEvent = function( event ) { 2657 var method = 'on' + event.type; 2658 if ( this[ method ] ) { 2659 this[ method ]( event ); 2660 } 2661 }; 2662 2663 /** 2664 * Bind layout to window resizing 2665 */ 2666 Outlayer.prototype.bindResize = function() { 2667 // bind just one listener 2668 if ( this.isResizeBound ) { 2669 return; 2670 } 2671 eventie.bind( window, 'resize', this ); 2672 this.isResizeBound = true; 2673 }; 2674 2675 /** 2676 * Unbind layout to window resizing 2677 */ 2678 Outlayer.prototype.unbindResize = function() { 2679 if ( this.isResizeBound ) { 2680 eventie.unbind( window, 'resize', this ); 2681 } 2682 this.isResizeBound = false; 2683 }; 2684 2685 // original debounce by John Hann 2686 // http://unscriptable.com/index.php/2009/03/20/debouncing-javascript-methods/ 2687 2688 // this fires every resize 2689 Outlayer.prototype.onresize = function() { 2690 if ( this.resizeTimeout ) { 2691 clearTimeout( this.resizeTimeout ); 2692 } 2693 2694 var _this = this; 2695 function delayed() { 2696 _this.resize(); 2697 delete _this.resizeTimeout; 2698 } 2699 2700 this.resizeTimeout = setTimeout( delayed, 100 ); 2701 }; 2702 2703 // debounced, layout on resize 2704 Outlayer.prototype.resize = function() { 2705 // don't trigger if size did not change 2706 // or if resize was unbound. See #9 2707 if ( !this.isResizeBound || !this.needsResizeLayout() ) { 2708 return; 2709 } 2710 2711 this.layout(); 2712 }; 2713 2714 /** 2715 * check if layout is needed post layout 2716 * @returns Boolean 2717 */ 2718 Outlayer.prototype.needsResizeLayout = function() { 2719 var size = getSize( this.element ); 2720 // check that this.size and size are there 2721 // IE8 triggers resize on body size change, so they might not be 2722 var hasSizes = this.size && size; 2723 return hasSizes && size.innerWidth !== this.size.innerWidth; 2724 }; 2725 2726 // -------------------------- methods -------------------------- // 2727 2728 /** 2729 * add items to Outlayer instance 2730 * @param {Array or NodeList or Element} elems 2731 * @returns {Array} items - Outlayer.Items 2732 **/ 2733 Outlayer.prototype.addItems = function( elems ) { 2734 var items = this._itemize( elems ); 2735 // add items to collection 2736 if ( items.length ) { 2737 this.items = this.items.concat( items ); 2738 } 2739 return items; 2740 }; 2741 2742 /** 2743 * Layout newly-appended item elements 2744 * @param {Array or NodeList or Element} elems 2745 */ 2746 Outlayer.prototype.appended = function( elems ) { 2747 var items = this.addItems( elems ); 2748 if ( !items.length ) { 2749 return; 2750 } 2751 // layout and reveal just the new items 2752 this.layoutItems( items, true ); 2753 this.reveal( items ); 2754 }; 2755 2756 /** 2757 * Layout prepended elements 2758 * @param {Array or NodeList or Element} elems 2759 */ 2760 Outlayer.prototype.prepended = function( elems ) { 2761 var items = this._itemize( elems ); 2762 if ( !items.length ) { 2763 return; 2764 } 2765 // add items to beginning of collection 2766 var previousItems = this.items.slice(0); 2767 this.items = items.concat( previousItems ); 2768 // start new layout 2769 this._resetLayout(); 2770 this._manageStamps(); 2771 // layout new stuff without transition 2772 this.layoutItems( items, true ); 2773 this.reveal( items ); 2774 // layout previous items 2775 this.layoutItems( previousItems ); 2776 }; 2777 2778 /** 2779 * reveal a collection of items 2780 * @param {Array of Outlayer.Items} items 2781 */ 2782 Outlayer.prototype.reveal = function( items ) { 2783 this._emitCompleteOnItems( 'reveal', items ); 2784 2785 var len = items && items.length; 2786 for ( var i=0; len && i < len; i++ ) { 2787 var item = items[i]; 2788 item.reveal(); 2789 } 2790 }; 2791 2792 /** 2793 * hide a collection of items 2794 * @param {Array of Outlayer.Items} items 2795 */ 2796 Outlayer.prototype.hide = function( items ) { 2797 this._emitCompleteOnItems( 'hide', items ); 2798 2799 var len = items && items.length; 2800 for ( var i=0; len && i < len; i++ ) { 2801 var item = items[i]; 2802 item.hide(); 2803 } 2804 }; 2805 2806 /** 2807 * reveal item elements 2808 * @param {Array}, {Element}, {NodeList} items 2809 */ 2810 Outlayer.prototype.revealItemElements = function( elems ) { 2811 var items = this.getItems( elems ); 2812 this.reveal( items ); 2813 }; 2814 2815 /** 2816 * hide item elements 2817 * @param {Array}, {Element}, {NodeList} items 2818 */ 2819 Outlayer.prototype.hideItemElements = function( elems ) { 2820 var items = this.getItems( elems ); 2821 this.hide( items ); 2822 }; 2823 2824 /** 2825 * get Outlayer.Item, given an Element 2826 * @param {Element} elem 2827 * @param {Function} callback 2828 * @returns {Outlayer.Item} item 2829 */ 2830 Outlayer.prototype.getItem = function( elem ) { 2831 // loop through items to get the one that matches 2832 for ( var i=0, len = this.items.length; i < len; i++ ) { 2833 var item = this.items[i]; 2834 if ( item.element === elem ) { 2835 // return item 2836 return item; 2837 } 2838 } 2839 }; 2840 2841 /** 2842 * get collection of Outlayer.Items, given Elements 2843 * @param {Array} elems 2844 * @returns {Array} items - Outlayer.Items 2845 */ 2846 Outlayer.prototype.getItems = function( elems ) { 2847 elems = utils.makeArray( elems ); 2848 var items = []; 2849 for ( var i=0, len = elems.length; i < len; i++ ) { 2850 var elem = elems[i]; 2851 var item = this.getItem( elem ); 2852 if ( item ) { 2853 items.push( item ); 2854 } 2855 } 2856 2857 return items; 2858 }; 2859 2860 /** 2861 * remove element(s) from instance and DOM 2862 * @param {Array or NodeList or Element} elems 2863 */ 2864 Outlayer.prototype.remove = function( elems ) { 2865 var removeItems = this.getItems( elems ); 2866 2867 this._emitCompleteOnItems( 'remove', removeItems ); 2868 2869 // bail if no items to remove 2870 if ( !removeItems || !removeItems.length ) { 2871 return; 2872 } 2873 2874 for ( var i=0, len = removeItems.length; i < len; i++ ) { 2875 var item = removeItems[i]; 2876 item.remove(); 2877 // remove item from collection 2878 utils.removeFrom( this.items, item ); 2879 } 2880 }; 2881 2882 // ----- destroy ----- // 2883 2884 // remove and disable Outlayer instance 2885 Outlayer.prototype.destroy = function() { 2886 // clean up dynamic styles 2887 var style = this.element.style; 2888 style.height = ''; 2889 style.position = ''; 2890 style.width = ''; 2891 // destroy items 2892 for ( var i=0, len = this.items.length; i < len; i++ ) { 2893 var item = this.items[i]; 2894 item.destroy(); 2895 } 2896 2897 this.unbindResize(); 2898 2899 var id = this.element.outlayerGUID; 2900 delete instances[ id ]; // remove reference to instance by id 2901 delete this.element.outlayerGUID; 2902 // remove data for jQuery 2903 if ( jQuery ) { 2904 jQuery.removeData( this.element, this.constructor.namespace ); 2905 } 2906 2907 }; 2908 2909 // -------------------------- data -------------------------- // 2910 2911 /** 2912 * get Outlayer instance from element 2913 * @param {Element} elem 2914 * @returns {Outlayer} 2915 */ 2916 Outlayer.data = function( elem ) { 2917 elem = utils.getQueryElement( elem ); 2918 var id = elem && elem.outlayerGUID; 2919 return id && instances[ id ]; 2920 }; 2921 2922 2923 // -------------------------- create Outlayer class -------------------------- // 2924 2925 /** 2926 * create a layout class 2927 * @param {String} namespace 2928 */ 2929 Outlayer.create = function( namespace, options ) { 2930 // sub-class Outlayer 2931 function Layout() { 2932 Outlayer.apply( this, arguments ); 2933 } 2934 // inherit Outlayer prototype, use Object.create if there 2935 if ( Object.create ) { 2936 Layout.prototype = Object.create( Outlayer.prototype ); 2937 } else { 2938 utils.extend( Layout.prototype, Outlayer.prototype ); 2939 } 2940 // set contructor, used for namespace and Item 2941 Layout.prototype.constructor = Layout; 2942 2943 Layout.defaults = utils.extend( {}, Outlayer.defaults ); 2944 // apply new options 2945 utils.extend( Layout.defaults, options ); 2946 // keep prototype.settings for backwards compatibility (Packery v1.2.0) 2947 Layout.prototype.settings = {}; 2948 2949 Layout.namespace = namespace; 2950 2951 Layout.data = Outlayer.data; 2952 2953 // sub-class Item 2954 Layout.Item = function LayoutItem() { 2955 Item.apply( this, arguments ); 2956 }; 2957 2958 Layout.Item.prototype = new Item(); 2959 2960 // -------------------------- declarative -------------------------- // 2961 2962 utils.htmlInit( Layout, namespace ); 2963 2964 // -------------------------- jQuery bridge -------------------------- // 2965 2966 // make into jQuery plugin 2967 if ( jQuery && jQuery.bridget ) { 2968 jQuery.bridget( namespace, Layout ); 2969 } 2970 2971 return Layout; 2972 }; 2973 2974 // ----- fin ----- // 2975 2976 // back in global 2977 Outlayer.Item = Item; 2978 2979 return Outlayer; 2980 2981 })); 2982 2983 2984 /*! 2985 * Masonry v3.3.2 2986 * Cascading grid layout library 2987 * http://masonry.desandro.com 2988 * MIT License 2989 * by David DeSandro 2990 */ 2991 2992 ( function( window, factory ) { 2993 2994 // universal module definition 2995 if ( typeof define === 'function' && define.amd ) { 2996 // AMD 2997 define( [ 2998 'outlayer/outlayer', 2999 'get-size/get-size', 3000 'fizzy-ui-utils/utils' 3001 ], 3002 factory ); 3003 } else if ( typeof exports === 'object' ) { 3004 // CommonJS 3005 module.exports = factory( 3006 require('outlayer'), 3007 require('get-size'), 3008 require('fizzy-ui-utils') 3009 ); 3010 } else { 3011 // browser global 3012 window.Masonry = factory( 3013 window.Outlayer, 3014 window.getSize, 3015 window.fizzyUIUtils 3016 ); 3017 } 3018 3019 }( window, function factory( Outlayer, getSize, utils ) { 3020 3021 3022 3023 // -------------------------- masonryDefinition -------------------------- // 3024 3025 // create an Outlayer layout class 3026 var Masonry = Outlayer.create('masonry'); 3027 3028 Masonry.prototype._resetLayout = function() { 3029 this.getSize(); 3030 this._getMeasurement( 'columnWidth', 'outerWidth' ); 3031 this._getMeasurement( 'gutter', 'outerWidth' ); 3032 this.measureColumns(); 3033 3034 // reset column Y 3035 var i = this.cols; 3036 this.colYs = []; 3037 while (i--) { 3038 this.colYs.push( 0 ); 3039 } 3040 3041 this.maxY = 0; 3042 }; 3043 3044 Masonry.prototype.measureColumns = function() { 3045 this.getContainerWidth(); 3046 // if columnWidth is 0, default to outerWidth of first item 3047 if ( !this.columnWidth ) { 3048 var firstItem = this.items[0]; 3049 var firstItemElem = firstItem && firstItem.element; 3050 // columnWidth fall back to item of first element 3051 this.columnWidth = firstItemElem && getSize( firstItemElem ).outerWidth || 3052 // if first elem has no width, default to size of container 3053 this.containerWidth; 3054 } 3055 3056 var columnWidth = this.columnWidth += this.gutter; 3057 3058 // calculate columns 3059 var containerWidth = this.containerWidth + this.gutter; 3060 var cols = containerWidth / columnWidth; 3061 // fix rounding errors, typically with gutters 3062 var excess = columnWidth - containerWidth % columnWidth; 3063 // if overshoot is less than a pixel, round up, otherwise floor it 3064 var mathMethod = excess && excess < 1 ? 'round' : 'floor'; 3065 cols = Math[ mathMethod ]( cols ); 3066 this.cols = Math.max( cols, 1 ); 3067 }; 3068 3069 Masonry.prototype.getContainerWidth = function() { 3070 // container is parent if fit width 3071 var container = this.options.isFitWidth ? this.element.parentNode : this.element; 3072 // check that this.size and size are there 3073 // IE8 triggers resize on body size change, so they might not be 3074 var size = getSize( container ); 3075 this.containerWidth = size && size.innerWidth; 3076 }; 3077 3078 Masonry.prototype._getItemLayoutPosition = function( item ) { 3079 item.getSize(); 3080 // how many columns does this brick span 3081 var remainder = item.size.outerWidth % this.columnWidth; 3082 var mathMethod = remainder && remainder < 1 ? 'round' : 'ceil'; 3083 // round if off by 1 pixel, otherwise use ceil 3084 var colSpan = Math[ mathMethod ]( item.size.outerWidth / this.columnWidth ); 3085 colSpan = Math.min( colSpan, this.cols ); 3086 3087 var colGroup = this._getColGroup( colSpan ); 3088 // get the minimum Y value from the columns 3089 var minimumY = Math.min.apply( Math, colGroup ); 3090 var shortColIndex = utils.indexOf( colGroup, minimumY ); 3091 3092 // position the brick 3093 var position = { 3094 x: this.columnWidth * shortColIndex, 3095 y: minimumY 3096 }; 3097 3098 // apply setHeight to necessary columns 3099 var setHeight = minimumY + item.size.outerHeight; 3100 var setSpan = this.cols + 1 - colGroup.length; 3101 for ( var i = 0; i < setSpan; i++ ) { 3102 this.colYs[ shortColIndex + i ] = setHeight; 3103 } 3104 3105 return position; 3106 }; 3107 3108 /** 3109 * @param {Number} colSpan - number of columns the element spans 3110 * @returns {Array} colGroup 3111 */ 3112 Masonry.prototype._getColGroup = function( colSpan ) { 3113 if ( colSpan < 2 ) { 3114 // if brick spans only one column, use all the column Ys 3115 return this.colYs; 3116 } 3117 3118 var colGroup = []; 3119 // how many different places could this brick fit horizontally 3120 var groupCount = this.cols + 1 - colSpan; 3121 // for each group potential horizontal position 3122 for ( var i = 0; i < groupCount; i++ ) { 3123 // make an array of colY values for that one group 3124 var groupColYs = this.colYs.slice( i, i + colSpan ); 3125 // and get the max value of the array 3126 colGroup[i] = Math.max.apply( Math, groupColYs ); 3127 } 3128 return colGroup; 3129 }; 3130 3131 Masonry.prototype._manageStamp = function( stamp ) { 3132 var stampSize = getSize( stamp ); 3133 var offset = this._getElementOffset( stamp ); 3134 // get the columns that this stamp affects 3135 var firstX = this.options.isOriginLeft ? offset.left : offset.right; 3136 var lastX = firstX + stampSize.outerWidth; 3137 var firstCol = Math.floor( firstX / this.columnWidth ); 3138 firstCol = Math.max( 0, firstCol ); 3139 var lastCol = Math.floor( lastX / this.columnWidth ); 3140 // lastCol should not go over if multiple of columnWidth #425 3141 lastCol -= lastX % this.columnWidth ? 0 : 1; 3142 lastCol = Math.min( this.cols - 1, lastCol ); 3143 // set colYs to bottom of the stamp 3144 var stampMaxY = ( this.options.isOriginTop ? offset.top : offset.bottom ) + 3145 stampSize.outerHeight; 3146 for ( var i = firstCol; i <= lastCol; i++ ) { 3147 this.colYs[i] = Math.max( stampMaxY, this.colYs[i] ); 3148 } 3149 }; 3150 3151 Masonry.prototype._getContainerSize = function() { 3152 this.maxY = Math.max.apply( Math, this.colYs ); 3153 var size = { 3154 height: this.maxY 3155 }; 3156 3157 if ( this.options.isFitWidth ) { 3158 size.width = this._getContainerFitWidth(); 3159 } 3160 3161 return size; 3162 }; 3163 3164 Masonry.prototype._getContainerFitWidth = function() { 3165 var unusedCols = 0; 3166 // count unused columns 3167 var i = this.cols; 3168 while ( --i ) { 3169 if ( this.colYs[i] !== 0 ) { 3170 break; 3171 } 3172 unusedCols++; 3173 } 3174 // fit container to columns that have been used 3175 return ( this.cols - unusedCols ) * this.columnWidth - this.gutter; 3176 }; 3177 3178 Masonry.prototype.needsResizeLayout = function() { 3179 var previousWidth = this.containerWidth; 3180 this.getContainerWidth(); 3181 return previousWidth !== this.containerWidth; 3182 }; 3183 3184 return Masonry; 3185 3186 })); 3187 -
wp-includes/js/masonry.min.js
1 1 /*! 2 * Masonry PACKAGED v3. 1.42 * Masonry PACKAGED v3.3.2 3 3 * Cascading grid layout library 4 4 * http://masonry.desandro.com 5 5 * MIT License … … 6 6 * by David DeSandro 7 7 */ 8 8 9 (function(t){function e(){}function i(t){function i(e){e.prototype.option||(e.prototype.option=function(e){t.isPlainObject(e)&&(this.options=t.extend(!0,this.options,e))})}function o(e,i){t.fn[e]=function(o){if("string"==typeof o){for(var s=n.call(arguments,1),a=0,h=this.length;h>a;a++){var p=this[a],u=t.data(p,e);if(u)if(t.isFunction(u[o])&&"_"!==o.charAt(0)){var f=u[o].apply(u,s);if(void 0!==f)return f}else r("no such method '"+o+"' for "+e+" instance");else r("cannot call methods on "+e+" prior to initialization; "+"attempted to call '"+o+"'")}return this}return this.each(function(){var n=t.data(this,e);n?(n.option(o),n._init()):(n=new i(this,o),t.data(this,e,n))})}}if(t){var r="undefined"==typeof console?e:function(t){console.error(t)};return t.bridget=function(t,e){i(e),o(t,e)},t.bridget}}var n=Array.prototype.slice;"function"==typeof define&&define.amd?define("jquery-bridget/jquery.bridget",["jquery"],i):i(t.jQuery)})(window),function(t){function e(e){var i=t.event;return i.target=i.target||i.srcElement||e,i}var i=document.documentElement,n=function(){};i.addEventListener?n=function(t,e,i){t.addEventListener(e,i,!1)}:i.attachEvent&&(n=function(t,i,n){t[i+n]=n.handleEvent?function(){var i=e(t);n.handleEvent.call(n,i)}:function(){var i=e(t);n.call(t,i)},t.attachEvent("on"+i,t[i+n])});var o=function(){};i.removeEventListener?o=function(t,e,i){t.removeEventListener(e,i,!1)}:i.detachEvent&&(o=function(t,e,i){t.detachEvent("on"+e,t[e+i]);try{delete t[e+i]}catch(n){t[e+i]=void 0}});var r={bind:n,unbind:o};"function"==typeof define&&define.amd?define("eventie/eventie",r):"object"==typeof exports?module.exports=r:t.eventie=r}(this),function(t){function e(t){"function"==typeof t&&(e.isReady?t():r.push(t))}function i(t){var i="readystatechange"===t.type&&"complete"!==o.readyState;if(!e.isReady&&!i){e.isReady=!0;for(var n=0,s=r.length;s>n;n++){var a=r[n];a()}}}function n(n){return n.bind(o,"DOMContentLoaded",i),n.bind(o,"readystatechange",i),n.bind(t,"load",i),e}var o=t.document,r=[];e.isReady=!1,"function"==typeof define&&define.amd?(e.isReady="function"==typeof requirejs,define("doc-ready/doc-ready",["eventie/eventie"],n)):t.docReady=n(t.eventie)}(this),function(){function t(){}function e(t,e){for(var i=t.length;i--;)if(t[i].listener===e)return i;return-1}function i(t){return function(){return this[t].apply(this,arguments)}}var n=t.prototype,o=this,r=o.EventEmitter;n.getListeners=function(t){var e,i,n=this._getEvents();if(t instanceof RegExp){e={};for(i in n)n.hasOwnProperty(i)&&t.test(i)&&(e[i]=n[i])}else e=n[t]||(n[t]=[]);return e},n.flattenListeners=function(t){var e,i=[];for(e=0;t.length>e;e+=1)i.push(t[e].listener);return i},n.getListenersAsObject=function(t){var e,i=this.getListeners(t);return i instanceof Array&&(e={},e[t]=i),e||i},n.addListener=function(t,i){var n,o=this.getListenersAsObject(t),r="object"==typeof i;for(n in o)o.hasOwnProperty(n)&&-1===e(o[n],i)&&o[n].push(r?i:{listener:i,once:!1});return this},n.on=i("addListener"),n.addOnceListener=function(t,e){return this.addListener(t,{listener:e,once:!0})},n.once=i("addOnceListener"),n.defineEvent=function(t){return this.getListeners(t),this},n.defineEvents=function(t){for(var e=0;t.length>e;e+=1)this.defineEvent(t[e]);return this},n.removeListener=function(t,i){var n,o,r=this.getListenersAsObject(t);for(o in r)r.hasOwnProperty(o)&&(n=e(r[o],i),-1!==n&&r[o].splice(n,1));return this},n.off=i("removeListener"),n.addListeners=function(t,e){return this.manipulateListeners(!1,t,e)},n.removeListeners=function(t,e){return this.manipulateListeners(!0,t,e)},n.manipulateListeners=function(t,e,i){var n,o,r=t?this.removeListener:this.addListener,s=t?this.removeListeners:this.addListeners;if("object"!=typeof e||e instanceof RegExp)for(n=i.length;n--;)r.call(this,e,i[n]);else for(n in e)e.hasOwnProperty(n)&&(o=e[n])&&("function"==typeof o?r.call(this,n,o):s.call(this,n,o));return this},n.removeEvent=function(t){var e,i=typeof t,n=this._getEvents();if("string"===i)delete n[t];else if(t instanceof RegExp)for(e in n)n.hasOwnProperty(e)&&t.test(e)&&delete n[e];else delete this._events;return this},n.removeAllListeners=i("removeEvent"),n.emitEvent=function(t,e){var i,n,o,r,s=this.getListenersAsObject(t);for(o in s)if(s.hasOwnProperty(o))for(n=s[o].length;n--;)i=s[o][n],i.once===!0&&this.removeListener(t,i.listener),r=i.listener.apply(this,e||[]),r===this._getOnceReturnValue()&&this.removeListener(t,i.listener);return this},n.trigger=i("emitEvent"),n.emit=function(t){var e=Array.prototype.slice.call(arguments,1);return this.emitEvent(t,e)},n.setOnceReturnValue=function(t){return this._onceReturnValue=t,this},n._getOnceReturnValue=function(){return this.hasOwnProperty("_onceReturnValue")?this._onceReturnValue:!0},n._getEvents=function(){return this._events||(this._events={})},t.noConflict=function(){return o.EventEmitter=r,t},"function"==typeof define&&define.amd?define("eventEmitter/EventEmitter",[],function(){return t}):"object"==typeof module&&module.exports?module.exports=t:this.EventEmitter=t}.call(this),function(t){function e(t){if(t){if("string"==typeof n[t])return t;t=t.charAt(0).toUpperCase()+t.slice(1);for(var e,o=0,r=i.length;r>o;o++)if(e=i[o]+t,"string"==typeof n[e])return e}}var i="Webkit Moz ms Ms O".split(" "),n=document.documentElement.style;"function"==typeof define&&define.amd?define("get-style-property/get-style-property",[],function(){return e}):"object"==typeof exports?module.exports=e:t.getStyleProperty=e}(window),function(t){function e(t){var e=parseFloat(t),i=-1===t.indexOf("%")&&!isNaN(e);return i&&e}function i(){for(var t={width:0,height:0,innerWidth:0,innerHeight:0,outerWidth:0,outerHeight:0},e=0,i=s.length;i>e;e++){var n=s[e];t[n]=0}return t}function n(t){function n(t){if("string"==typeof t&&(t=document.querySelector(t)),t&&"object"==typeof t&&t.nodeType){var n=r(t);if("none"===n.display)return i();var o={};o.width=t.offsetWidth,o.height=t.offsetHeight;for(var u=o.isBorderBox=!(!p||!n[p]||"border-box"!==n[p]),f=0,c=s.length;c>f;f++){var d=s[f],l=n[d];l=a(t,l);var m=parseFloat(l);o[d]=isNaN(m)?0:m}var y=o.paddingLeft+o.paddingRight,g=o.paddingTop+o.paddingBottom,v=o.marginLeft+o.marginRight,b=o.marginTop+o.marginBottom,_=o.borderLeftWidth+o.borderRightWidth,E=o.borderTopWidth+o.borderBottomWidth,L=u&&h,x=e(n.width);x!==!1&&(o.width=x+(L?0:y+_));var z=e(n.height);return z!==!1&&(o.height=z+(L?0:g+E)),o.innerWidth=o.width-(y+_),o.innerHeight=o.height-(g+E),o.outerWidth=o.width+v,o.outerHeight=o.height+b,o}}function a(t,e){if(o||-1===e.indexOf("%"))return e;var i=t.style,n=i.left,r=t.runtimeStyle,s=r&&r.left;return s&&(r.left=t.currentStyle.left),i.left=e,e=i.pixelLeft,i.left=n,s&&(r.left=s),e}var h,p=t("boxSizing");return function(){if(p){var t=document.createElement("div");t.style.width="200px",t.style.padding="1px 2px 3px 4px",t.style.borderStyle="solid",t.style.borderWidth="1px 2px 3px 4px",t.style[p]="border-box";var i=document.body||document.documentElement;i.appendChild(t);var n=r(t);h=200===e(n.width),i.removeChild(t)}}(),n}var o=t.getComputedStyle,r=o?function(t){return o(t,null)}:function(t){return t.currentStyle},s=["paddingLeft","paddingRight","paddingTop","paddingBottom","marginLeft","marginRight","marginTop","marginBottom","borderLeftWidth","borderRightWidth","borderTopWidth","borderBottomWidth"];"function"==typeof define&&define.amd?define("get-size/get-size",["get-style-property/get-style-property"],n):"object"==typeof exports?module.exports=n(require("get-style-property")):t.getSize=n(t.getStyleProperty)}(window),function(t,e){function i(t,e){return t[a](e)}function n(t){if(!t.parentNode){var e=document.createDocumentFragment();e.appendChild(t)}}function o(t,e){n(t);for(var i=t.parentNode.querySelectorAll(e),o=0,r=i.length;r>o;o++)if(i[o]===t)return!0;return!1}function r(t,e){return n(t),i(t,e)}var s,a=function(){if(e.matchesSelector)return"matchesSelector";for(var t=["webkit","moz","ms","o"],i=0,n=t.length;n>i;i++){var o=t[i],r=o+"MatchesSelector";if(e[r])return r}}();if(a){var h=document.createElement("div"),p=i(h,"div");s=p?i:r}else s=o;"function"==typeof define&&define.amd?define("matches-selector/matches-selector",[],function(){return s}):window.matchesSelector=s}(this,Element.prototype),function(t){function e(t,e){for(var i in e)t[i]=e[i];return t}function i(t){for(var e in t)return!1;return e=null,!0}function n(t){return t.replace(/([A-Z])/g,function(t){return"-"+t.toLowerCase()})}function o(t,o,r){function a(t,e){t&&(this.element=t,this.layout=e,this.position={x:0,y:0},this._create())}var h=r("transition"),p=r("transform"),u=h&&p,f=!!r("perspective"),c={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"otransitionend",transition:"transitionend"}[h],d=["transform","transition","transitionDuration","transitionProperty"],l=function(){for(var t={},e=0,i=d.length;i>e;e++){var n=d[e],o=r(n);o&&o!==n&&(t[n]=o)}return t}();e(a.prototype,t.prototype),a.prototype._create=function(){this._transn={ingProperties:{},clean:{},onEnd:{}},this.css({position:"absolute"})},a.prototype.handleEvent=function(t){var e="on"+t.type;this[e]&&this[e](t)},a.prototype.getSize=function(){this.size=o(this.element)},a.prototype.css=function(t){var e=this.element.style;for(var i in t){var n=l[i]||i;e[n]=t[i]}},a.prototype.getPosition=function(){var t=s(this.element),e=this.layout.options,i=e.isOriginLeft,n=e.isOriginTop,o=parseInt(t[i?"left":"right"],10),r=parseInt(t[n?"top":"bottom"],10);o=isNaN(o)?0:o,r=isNaN(r)?0:r;var a=this.layout.size;o-=i?a.paddingLeft:a.paddingRight,r-=n?a.paddingTop:a.paddingBottom,this.position.x=o,this.position.y=r},a.prototype.layoutPosition=function(){var t=this.layout.size,e=this.layout.options,i={};e.isOriginLeft?(i.left=this.position.x+t.paddingLeft+"px",i.right=""):(i.right=this.position.x+t.paddingRight+"px",i.left=""),e.isOriginTop?(i.top=this.position.y+t.paddingTop+"px",i.bottom=""):(i.bottom=this.position.y+t.paddingBottom+"px",i.top=""),this.css(i),this.emitEvent("layout",[this])};var m=f?function(t,e){return"translate3d("+t+"px, "+e+"px, 0)"}:function(t,e){return"translate("+t+"px, "+e+"px)"};a.prototype._transitionTo=function(t,e){this.getPosition();var i=this.position.x,n=this.position.y,o=parseInt(t,10),r=parseInt(e,10),s=o===this.position.x&&r===this.position.y;if(this.setPosition(t,e),s&&!this.isTransitioning)return this.layoutPosition(),void 0;var a=t-i,h=e-n,p={},u=this.layout.options;a=u.isOriginLeft?a:-a,h=u.isOriginTop?h:-h,p.transform=m(a,h),this.transition({to:p,onTransitionEnd:{transform:this.layoutPosition},isCleaning:!0})},a.prototype.goTo=function(t,e){this.setPosition(t,e),this.layoutPosition()},a.prototype.moveTo=u?a.prototype._transitionTo:a.prototype.goTo,a.prototype.setPosition=function(t,e){this.position.x=parseInt(t,10),this.position.y=parseInt(e,10)},a.prototype._nonTransition=function(t){this.css(t.to),t.isCleaning&&this._removeStyles(t.to);for(var e in t.onTransitionEnd)t.onTransitionEnd[e].call(this)},a.prototype._transition=function(t){if(!parseFloat(this.layout.options.transitionDuration))return this._nonTransition(t),void 0;var e=this._transn;for(var i in t.onTransitionEnd)e.onEnd[i]=t.onTransitionEnd[i];for(i in t.to)e.ingProperties[i]=!0,t.isCleaning&&(e.clean[i]=!0);if(t.from){this.css(t.from);var n=this.element.offsetHeight;n=null}this.enableTransition(t.to),this.css(t.to),this.isTransitioning=!0};var y=p&&n(p)+",opacity";a.prototype.enableTransition=function(){this.isTransitioning||(this.css({transitionProperty:y,transitionDuration:this.layout.options.transitionDuration}),this.element.addEventListener(c,this,!1))},a.prototype.transition=a.prototype[h?"_transition":"_nonTransition"],a.prototype.onwebkitTransitionEnd=function(t){this.ontransitionend(t)},a.prototype.onotransitionend=function(t){this.ontransitionend(t)};var g={"-webkit-transform":"transform","-moz-transform":"transform","-o-transform":"transform"};a.prototype.ontransitionend=function(t){if(t.target===this.element){var e=this._transn,n=g[t.propertyName]||t.propertyName;if(delete e.ingProperties[n],i(e.ingProperties)&&this.disableTransition(),n in e.clean&&(this.element.style[t.propertyName]="",delete e.clean[n]),n in e.onEnd){var o=e.onEnd[n];o.call(this),delete e.onEnd[n]}this.emitEvent("transitionEnd",[this])}},a.prototype.disableTransition=function(){this.removeTransitionStyles(),this.element.removeEventListener(c,this,!1),this.isTransitioning=!1},a.prototype._removeStyles=function(t){var e={};for(var i in t)e[i]="";this.css(e)};var v={transitionProperty:"",transitionDuration:""};return a.prototype.removeTransitionStyles=function(){this.css(v)},a.prototype.removeElem=function(){this.element.parentNode.removeChild(this.element),this.emitEvent("remove",[this])},a.prototype.remove=function(){if(!h||!parseFloat(this.layout.options.transitionDuration))return this.removeElem(),void 0;var t=this;this.on("transitionEnd",function(){return t.removeElem(),!0}),this.hide()},a.prototype.reveal=function(){delete this.isHidden,this.css({display:""});var t=this.layout.options;this.transition({from:t.hiddenStyle,to:t.visibleStyle,isCleaning:!0})},a.prototype.hide=function(){this.isHidden=!0,this.css({display:""});var t=this.layout.options;this.transition({from:t.visibleStyle,to:t.hiddenStyle,isCleaning:!0,onTransitionEnd:{opacity:function(){this.isHidden&&this.css({display:"none"})}}})},a.prototype.destroy=function(){this.css({position:"",left:"",right:"",top:"",bottom:"",transition:"",transform:""})},a}var r=document.defaultView,s=r&&r.getComputedStyle?function(t){return r.getComputedStyle(t,null)}:function(t){return t.currentStyle};"function"==typeof define&&define.amd?define("outlayer/item",["eventEmitter/EventEmitter","get-size/get-size","get-style-property/get-style-property"],o):(t.Outlayer={},t.Outlayer.Item=o(t.EventEmitter,t.getSize,t.getStyleProperty))}(window),function(t){function e(t,e){for(var i in e)t[i]=e[i];return t}function i(t){return"[object Array]"===f.call(t)}function n(t){var e=[];if(i(t))e=t;else if(t&&"number"==typeof t.length)for(var n=0,o=t.length;o>n;n++)e.push(t[n]);else e.push(t);return e}function o(t,e){var i=d(e,t);-1!==i&&e.splice(i,1)}function r(t){return t.replace(/(.)([A-Z])/g,function(t,e,i){return e+"-"+i}).toLowerCase()}function s(i,s,f,d,l,m){function y(t,i){if("string"==typeof t&&(t=a.querySelector(t)),!t||!c(t))return h&&h.error("Bad "+this.constructor.namespace+" element: "+t),void 0;this.element=t,this.options=e({},this.options),this.option(i);var n=++v;this.element.outlayerGUID=n,b[n]=this,this._create(),this.options.isInitLayout&&this.layout()}function g(t,i){t.prototype[i]=e({},y.prototype[i])}var v=0,b={};return y.namespace="outlayer",y.Item=m,y.prototype.options={containerStyle:{position:"relative"},isInitLayout:!0,isOriginLeft:!0,isOriginTop:!0,isResizeBound:!0,transitionDuration:"0.4s",hiddenStyle:{opacity:0,transform:"scale(0.001)"},visibleStyle:{opacity:1,transform:"scale(1)"}},e(y.prototype,f.prototype),y.prototype.option=function(t){e(this.options,t)},y.prototype._create=function(){this.reloadItems(),this.stamps=[],this.stamp(this.options.stamp),e(this.element.style,this.options.containerStyle),this.options.isResizeBound&&this.bindResize()},y.prototype.reloadItems=function(){this.items=this._itemize(this.element.children)},y.prototype._itemize=function(t){for(var e=this._filterFindItemElements(t),i=this.constructor.Item,n=[],o=0,r=e.length;r>o;o++){var s=e[o],a=new i(s,this);n.push(a)}return n},y.prototype._filterFindItemElements=function(t){t=n(t);for(var e=this.options.itemSelector,i=[],o=0,r=t.length;r>o;o++){var s=t[o];if(c(s))if(e){l(s,e)&&i.push(s);for(var a=s.querySelectorAll(e),h=0,p=a.length;p>h;h++)i.push(a[h])}else i.push(s)}return i},y.prototype.getItemElements=function(){for(var t=[],e=0,i=this.items.length;i>e;e++)t.push(this.items[e].element);return t},y.prototype.layout=function(){this._resetLayout(),this._manageStamps();var t=void 0!==this.options.isLayoutInstant?this.options.isLayoutInstant:!this._isLayoutInited;this.layoutItems(this.items,t),this._isLayoutInited=!0},y.prototype._init=y.prototype.layout,y.prototype._resetLayout=function(){this.getSize()},y.prototype.getSize=function(){this.size=d(this.element)},y.prototype._getMeasurement=function(t,e){var i,n=this.options[t];n?("string"==typeof n?i=this.element.querySelector(n):c(n)&&(i=n),this[t]=i?d(i)[e]:n):this[t]=0},y.prototype.layoutItems=function(t,e){t=this._getItemsForLayout(t),this._layoutItems(t,e),this._postLayout()},y.prototype._getItemsForLayout=function(t){for(var e=[],i=0,n=t.length;n>i;i++){var o=t[i];o.isIgnored||e.push(o)}return e},y.prototype._layoutItems=function(t,e){function i(){n.emitEvent("layoutComplete",[n,t])}var n=this;if(!t||!t.length)return i(),void 0;this._itemsOn(t,"layout",i);for(var o=[],r=0,s=t.length;s>r;r++){var a=t[r],h=this._getItemLayoutPosition(a);h.item=a,h.isInstant=e||a.isLayoutInstant,o.push(h)}this._processLayoutQueue(o)},y.prototype._getItemLayoutPosition=function(){return{x:0,y:0}},y.prototype._processLayoutQueue=function(t){for(var e=0,i=t.length;i>e;e++){var n=t[e];this._positionItem(n.item,n.x,n.y,n.isInstant)}},y.prototype._positionItem=function(t,e,i,n){n?t.goTo(e,i):t.moveTo(e,i)},y.prototype._postLayout=function(){var t=this._getContainerSize();t&&(this._setContainerMeasure(t.width,!0),this._setContainerMeasure(t.height,!1))},y.prototype._getContainerSize=u,y.prototype._setContainerMeasure=function(t,e){if(void 0!==t){var i=this.size;i.isBorderBox&&(t+=e?i.paddingLeft+i.paddingRight+i.borderLeftWidth+i.borderRightWidth:i.paddingBottom+i.paddingTop+i.borderTopWidth+i.borderBottomWidth),t=Math.max(t,0),this.element.style[e?"width":"height"]=t+"px"}},y.prototype._itemsOn=function(t,e,i){function n(){return o++,o===r&&i.call(s),!0}for(var o=0,r=t.length,s=this,a=0,h=t.length;h>a;a++){var p=t[a];p.on(e,n)}},y.prototype.ignore=function(t){var e=this.getItem(t);e&&(e.isIgnored=!0)},y.prototype.unignore=function(t){var e=this.getItem(t);e&&delete e.isIgnored},y.prototype.stamp=function(t){if(t=this._find(t)){this.stamps=this.stamps.concat(t);for(var e=0,i=t.length;i>e;e++){var n=t[e];this.ignore(n)}}},y.prototype.unstamp=function(t){if(t=this._find(t))for(var e=0,i=t.length;i>e;e++){var n=t[e];o(n,this.stamps),this.unignore(n)}},y.prototype._find=function(t){return t?("string"==typeof t&&(t=this.element.querySelectorAll(t)),t=n(t)):void 0},y.prototype._manageStamps=function(){if(this.stamps&&this.stamps.length){this._getBoundingRect();for(var t=0,e=this.stamps.length;e>t;t++){var i=this.stamps[t];this._manageStamp(i)}}},y.prototype._getBoundingRect=function(){var t=this.element.getBoundingClientRect(),e=this.size;this._boundingRect={left:t.left+e.paddingLeft+e.borderLeftWidth,top:t.top+e.paddingTop+e.borderTopWidth,right:t.right-(e.paddingRight+e.borderRightWidth),bottom:t.bottom-(e.paddingBottom+e.borderBottomWidth)}},y.prototype._manageStamp=u,y.prototype._getElementOffset=function(t){var e=t.getBoundingClientRect(),i=this._boundingRect,n=d(t),o={left:e.left-i.left-n.marginLeft,top:e.top-i.top-n.marginTop,right:i.right-e.right-n.marginRight,bottom:i.bottom-e.bottom-n.marginBottom};return o},y.prototype.handleEvent=function(t){var e="on"+t.type;this[e]&&this[e](t)},y.prototype.bindResize=function(){this.isResizeBound||(i.bind(t,"resize",this),this.isResizeBound=!0)},y.prototype.unbindResize=function(){i.unbind(t,"resize",this),this.isResizeBound=!1},y.prototype.onresize=function(){function t(){e.resize(),delete e.resizeTimeout}this.resizeTimeout&&clearTimeout(this.resizeTimeout);var e=this;this.resizeTimeout=setTimeout(t,100)},y.prototype.resize=function(){var t=d(this.element),e=this.size&&t;e&&t.innerWidth===this.size.innerWidth||this.layout()},y.prototype.addItems=function(t){var e=this._itemize(t);return e.length&&(this.items=this.items.concat(e)),e},y.prototype.appended=function(t){var e=this.addItems(t);e.length&&(this.layoutItems(e,!0),this.reveal(e))},y.prototype.prepended=function(t){var e=this._itemize(t);if(e.length){var i=this.items.slice(0);this.items=e.concat(i),this._resetLayout(),this._manageStamps(),this.layoutItems(e,!0),this.reveal(e),this.layoutItems(i)}},y.prototype.reveal=function(t){var e=t&&t.length;if(e)for(var i=0;e>i;i++){var n=t[i];n.reveal()}},y.prototype.hide=function(t){var e=t&&t.length;if(e)for(var i=0;e>i;i++){var n=t[i];n.hide()}},y.prototype.getItem=function(t){for(var e=0,i=this.items.length;i>e;e++){var n=this.items[e];if(n.element===t)return n}},y.prototype.getItems=function(t){if(t&&t.length){for(var e=[],i=0,n=t.length;n>i;i++){var o=t[i],r=this.getItem(o);r&&e.push(r)}return e}},y.prototype.remove=function(t){t=n(t);var e=this.getItems(t);if(e&&e.length){this._itemsOn(e,"remove",function(){this.emitEvent("removeComplete",[this,e])});for(var i=0,r=e.length;r>i;i++){var s=e[i];s.remove(),o(s,this.items)}}},y.prototype.destroy=function(){var t=this.element.style;t.height="",t.position="",t.width="";for(var e=0,i=this.items.length;i>e;e++){var n=this.items[e];n.destroy()}this.unbindResize(),delete this.element.outlayerGUID,p&&p.removeData(this.element,this.constructor.namespace)},y.data=function(t){var e=t&&t.outlayerGUID;return e&&b[e]},y.create=function(t,i){function n(){y.apply(this,arguments)}return Object.create?n.prototype=Object.create(y.prototype):e(n.prototype,y.prototype),n.prototype.constructor=n,g(n,"options"),e(n.prototype.options,i),n.namespace=t,n.data=y.data,n.Item=function(){m.apply(this,arguments)},n.Item.prototype=new m,s(function(){for(var e=r(t),i=a.querySelectorAll(".js-"+e),o="data-"+e+"-options",s=0,u=i.length;u>s;s++){var f,c=i[s],d=c.getAttribute(o);try{f=d&&JSON.parse(d)}catch(l){h&&h.error("Error parsing "+o+" on "+c.nodeName.toLowerCase()+(c.id?"#"+c.id:"")+": "+l);continue}var m=new n(c,f);p&&p.data(c,t,m)}}),p&&p.bridget&&p.bridget(t,n),n},y.Item=m,y}var a=t.document,h=t.console,p=t.jQuery,u=function(){},f=Object.prototype.toString,c="object"==typeof HTMLElement?function(t){return t instanceof HTMLElement}:function(t){return t&&"object"==typeof t&&1===t.nodeType&&"string"==typeof t.nodeName},d=Array.prototype.indexOf?function(t,e){return t.indexOf(e)}:function(t,e){for(var i=0,n=t.length;n>i;i++)if(t[i]===e)return i;return-1};"function"==typeof define&&define.amd?define("outlayer/outlayer",["eventie/eventie","doc-ready/doc-ready","eventEmitter/EventEmitter","get-size/get-size","matches-selector/matches-selector","./item"],s):t.Outlayer=s(t.eventie,t.docReady,t.EventEmitter,t.getSize,t.matchesSelector,t.Outlayer.Item)}(window),function(t){function e(t,e){var n=t.create("masonry");return n.prototype._resetLayout=function(){this.getSize(),this._getMeasurement("columnWidth","outerWidth"),this._getMeasurement("gutter","outerWidth"),this.measureColumns();var t=this.cols;for(this.colYs=[];t--;)this.colYs.push(0);this.maxY=0},n.prototype.measureColumns=function(){if(this.getContainerWidth(),!this.columnWidth){var t=this.items[0],i=t&&t.element;this.columnWidth=i&&e(i).outerWidth||this.containerWidth}this.columnWidth+=this.gutter,this.cols=Math.floor((this.containerWidth+this.gutter)/this.columnWidth),this.cols=Math.max(this.cols,1)},n.prototype.getContainerWidth=function(){var t=this.options.isFitWidth?this.element.parentNode:this.element,i=e(t);this.containerWidth=i&&i.innerWidth},n.prototype._getItemLayoutPosition=function(t){t.getSize();var e=t.size.outerWidth%this.columnWidth,n=e&&1>e?"round":"ceil",o=Math[n](t.size.outerWidth/this.columnWidth);o=Math.min(o,this.cols);for(var r=this._getColGroup(o),s=Math.min.apply(Math,r),a=i(r,s),h={x:this.columnWidth*a,y:s},p=s+t.size.outerHeight,u=this.cols+1-r.length,f=0;u>f;f++)this.colYs[a+f]=p;return h},n.prototype._getColGroup=function(t){if(2>t)return this.colYs;for(var e=[],i=this.cols+1-t,n=0;i>n;n++){var o=this.colYs.slice(n,n+t);e[n]=Math.max.apply(Math,o)}return e},n.prototype._manageStamp=function(t){var i=e(t),n=this._getElementOffset(t),o=this.options.isOriginLeft?n.left:n.right,r=o+i.outerWidth,s=Math.floor(o/this.columnWidth);s=Math.max(0,s);var a=Math.floor(r/this.columnWidth);a-=r%this.columnWidth?0:1,a=Math.min(this.cols-1,a);for(var h=(this.options.isOriginTop?n.top:n.bottom)+i.outerHeight,p=s;a>=p;p++)this.colYs[p]=Math.max(h,this.colYs[p])},n.prototype._getContainerSize=function(){this.maxY=Math.max.apply(Math,this.colYs);var t={height:this.maxY};return this.options.isFitWidth&&(t.width=this._getContainerFitWidth()),t},n.prototype._getContainerFitWidth=function(){for(var t=0,e=this.cols;--e&&0===this.colYs[e];)t++;return(this.cols-t)*this.columnWidth-this.gutter},n.prototype.resize=function(){var t=this.containerWidth;this.getContainerWidth(),t!==this.containerWidth&&this.layout()},n}var i=Array.prototype.indexOf?function(t,e){return t.indexOf(e)}:function(t,e){for(var i=0,n=t.length;n>i;i++){var o=t[i];if(o===e)return i}return-1};"function"==typeof define&&define.amd?define(["outlayer/outlayer","get-size/get-size"],e):t.Masonry=e(t.Outlayer,t.getSize)}(window); 10 11 /*! 12 * imagesLoaded PACKAGED v3.1.4 13 * JavaScript is all like "You images are done yet or what?" 14 * MIT License 15 */ 16 17 (function(){function e(){}function t(e,t){for(var n=e.length;n--;)if(e[n].listener===t)return n;return-1}function n(e){return function(){return this[e].apply(this,arguments)}}var i=e.prototype,r=this,o=r.EventEmitter;i.getListeners=function(e){var t,n,i=this._getEvents();if("object"==typeof e){t={};for(n in i)i.hasOwnProperty(n)&&e.test(n)&&(t[n]=i[n])}else t=i[e]||(i[e]=[]);return t},i.flattenListeners=function(e){var t,n=[];for(t=0;e.length>t;t+=1)n.push(e[t].listener);return n},i.getListenersAsObject=function(e){var t,n=this.getListeners(e);return n instanceof Array&&(t={},t[e]=n),t||n},i.addListener=function(e,n){var i,r=this.getListenersAsObject(e),o="object"==typeof n;for(i in r)r.hasOwnProperty(i)&&-1===t(r[i],n)&&r[i].push(o?n:{listener:n,once:!1});return this},i.on=n("addListener"),i.addOnceListener=function(e,t){return this.addListener(e,{listener:t,once:!0})},i.once=n("addOnceListener"),i.defineEvent=function(e){return this.getListeners(e),this},i.defineEvents=function(e){for(var t=0;e.length>t;t+=1)this.defineEvent(e[t]);return this},i.removeListener=function(e,n){var i,r,o=this.getListenersAsObject(e);for(r in o)o.hasOwnProperty(r)&&(i=t(o[r],n),-1!==i&&o[r].splice(i,1));return this},i.off=n("removeListener"),i.addListeners=function(e,t){return this.manipulateListeners(!1,e,t)},i.removeListeners=function(e,t){return this.manipulateListeners(!0,e,t)},i.manipulateListeners=function(e,t,n){var i,r,o=e?this.removeListener:this.addListener,s=e?this.removeListeners:this.addListeners;if("object"!=typeof t||t instanceof RegExp)for(i=n.length;i--;)o.call(this,t,n[i]);else for(i in t)t.hasOwnProperty(i)&&(r=t[i])&&("function"==typeof r?o.call(this,i,r):s.call(this,i,r));return this},i.removeEvent=function(e){var t,n=typeof e,i=this._getEvents();if("string"===n)delete i[e];else if("object"===n)for(t in i)i.hasOwnProperty(t)&&e.test(t)&&delete i[t];else delete this._events;return this},i.removeAllListeners=n("removeEvent"),i.emitEvent=function(e,t){var n,i,r,o,s=this.getListenersAsObject(e);for(r in s)if(s.hasOwnProperty(r))for(i=s[r].length;i--;)n=s[r][i],n.once===!0&&this.removeListener(e,n.listener),o=n.listener.apply(this,t||[]),o===this._getOnceReturnValue()&&this.removeListener(e,n.listener);return this},i.trigger=n("emitEvent"),i.emit=function(e){var t=Array.prototype.slice.call(arguments,1);return this.emitEvent(e,t)},i.setOnceReturnValue=function(e){return this._onceReturnValue=e,this},i._getOnceReturnValue=function(){return this.hasOwnProperty("_onceReturnValue")?this._onceReturnValue:!0},i._getEvents=function(){return this._events||(this._events={})},e.noConflict=function(){return r.EventEmitter=o,e},"function"==typeof define&&define.amd?define("eventEmitter/EventEmitter",[],function(){return e}):"object"==typeof module&&module.exports?module.exports=e:this.EventEmitter=e}).call(this),function(e){function t(t){var n=e.event;return n.target=n.target||n.srcElement||t,n}var n=document.documentElement,i=function(){};n.addEventListener?i=function(e,t,n){e.addEventListener(t,n,!1)}:n.attachEvent&&(i=function(e,n,i){e[n+i]=i.handleEvent?function(){var n=t(e);i.handleEvent.call(i,n)}:function(){var n=t(e);i.call(e,n)},e.attachEvent("on"+n,e[n+i])});var r=function(){};n.removeEventListener?r=function(e,t,n){e.removeEventListener(t,n,!1)}:n.detachEvent&&(r=function(e,t,n){e.detachEvent("on"+t,e[t+n]);try{delete e[t+n]}catch(i){e[t+n]=void 0}});var o={bind:i,unbind:r};"function"==typeof define&&define.amd?define("eventie/eventie",o):e.eventie=o}(this),function(e,t){"function"==typeof define&&define.amd?define(["eventEmitter/EventEmitter","eventie/eventie"],function(n,i){return t(e,n,i)}):"object"==typeof exports?module.exports=t(e,require("eventEmitter"),require("eventie")):e.imagesLoaded=t(e,e.EventEmitter,e.eventie)}(this,function(e,t,n){function i(e,t){for(var n in t)e[n]=t[n];return e}function r(e){return"[object Array]"===d.call(e)}function o(e){var t=[];if(r(e))t=e;else if("number"==typeof e.length)for(var n=0,i=e.length;i>n;n++)t.push(e[n]);else t.push(e);return t}function s(e,t,n){if(!(this instanceof s))return new s(e,t);"string"==typeof e&&(e=document.querySelectorAll(e)),this.elements=o(e),this.options=i({},this.options),"function"==typeof t?n=t:i(this.options,t),n&&this.on("always",n),this.getImages(),a&&(this.jqDeferred=new a.Deferred);var r=this;setTimeout(function(){r.check()})}function c(e){this.img=e}function f(e){this.src=e,v[e]=this}var a=e.jQuery,u=e.console,h=u!==void 0,d=Object.prototype.toString;s.prototype=new t,s.prototype.options={},s.prototype.getImages=function(){this.images=[];for(var e=0,t=this.elements.length;t>e;e++){var n=this.elements[e];"IMG"===n.nodeName&&this.addImage(n);for(var i=n.querySelectorAll("img"),r=0,o=i.length;o>r;r++){var s=i[r];this.addImage(s)}}},s.prototype.addImage=function(e){var t=new c(e);this.images.push(t)},s.prototype.check=function(){function e(e,r){return t.options.debug&&h&&u.log("confirm",e,r),t.progress(e),n++,n===i&&t.complete(),!0}var t=this,n=0,i=this.images.length;if(this.hasAnyBroken=!1,!i)return this.complete(),void 0;for(var r=0;i>r;r++){var o=this.images[r];o.on("confirm",e),o.check()}},s.prototype.progress=function(e){this.hasAnyBroken=this.hasAnyBroken||!e.isLoaded;var t=this;setTimeout(function(){t.emit("progress",t,e),t.jqDeferred&&t.jqDeferred.notify&&t.jqDeferred.notify(t,e)})},s.prototype.complete=function(){var e=this.hasAnyBroken?"fail":"done";this.isComplete=!0;var t=this;setTimeout(function(){if(t.emit(e,t),t.emit("always",t),t.jqDeferred){var n=t.hasAnyBroken?"reject":"resolve";t.jqDeferred[n](t)}})},a&&(a.fn.imagesLoaded=function(e,t){var n=new s(this,e,t);return n.jqDeferred.promise(a(this))}),c.prototype=new t,c.prototype.check=function(){var e=v[this.img.src]||new f(this.img.src);if(e.isConfirmed)return this.confirm(e.isLoaded,"cached was confirmed"),void 0;if(this.img.complete&&void 0!==this.img.naturalWidth)return this.confirm(0!==this.img.naturalWidth,"naturalWidth"),void 0;var t=this;e.on("confirm",function(e,n){return t.confirm(e.isLoaded,n),!0}),e.check()},c.prototype.confirm=function(e,t){this.isLoaded=e,this.emit("confirm",this,t)};var v={};return f.prototype=new t,f.prototype.check=function(){if(!this.isChecked){var e=new Image;n.bind(e,"load",this),n.bind(e,"error",this),e.src=this.src,this.isChecked=!0}},f.prototype.handleEvent=function(e){var t="on"+e.type;this[t]&&this[t](e)},f.prototype.onload=function(e){this.confirm(!0,"onload"),this.unbindProxyEvents(e)},f.prototype.onerror=function(e){this.confirm(!1,"onerror"),this.unbindProxyEvents(e)},f.prototype.confirm=function(e,t){this.isConfirmed=!0,this.isLoaded=e,this.emit("confirm",this,t)},f.prototype.unbindProxyEvents=function(e){n.unbind(e.target,"load",this),n.unbind(e.target,"error",this)},s}); 18 No newline at end of file 9 !function(a){function b(){}function c(a){function c(b){b.prototype.option||(b.prototype.option=function(b){a.isPlainObject(b)&&(this.options=a.extend(!0,this.options,b))})}function e(b,c){a.fn[b]=function(e){if("string"==typeof e){for(var g=d.call(arguments,1),h=0,i=this.length;i>h;h++){var j=this[h],k=a.data(j,b);if(k)if(a.isFunction(k[e])&&"_"!==e.charAt(0)){var l=k[e].apply(k,g);if(void 0!==l)return l}else f("no such method '"+e+"' for "+b+" instance");else f("cannot call methods on "+b+" prior to initialization; attempted to call '"+e+"'")}return this}return this.each(function(){var d=a.data(this,b);d?(d.option(e),d._init()):(d=new c(this,e),a.data(this,b,d))})}}if(a){var f="undefined"==typeof console?b:function(a){console.error(a)};return a.bridget=function(a,b){c(b),e(a,b)},a.bridget}}var d=Array.prototype.slice;"function"==typeof define&&define.amd?define("jquery-bridget/jquery.bridget",["jquery"],c):c("object"==typeof exports?require("jquery"):a.jQuery)}(window),function(a){function b(b){var c=a.event;return c.target=c.target||c.srcElement||b,c}var c=document.documentElement,d=function(){};c.addEventListener?d=function(a,b,c){a.addEventListener(b,c,!1)}:c.attachEvent&&(d=function(a,c,d){a[c+d]=d.handleEvent?function(){var c=b(a);d.handleEvent.call(d,c)}:function(){var c=b(a);d.call(a,c)},a.attachEvent("on"+c,a[c+d])});var e=function(){};c.removeEventListener?e=function(a,b,c){a.removeEventListener(b,c,!1)}:c.detachEvent&&(e=function(a,b,c){a.detachEvent("on"+b,a[b+c]);try{delete a[b+c]}catch(d){a[b+c]=void 0}});var f={bind:d,unbind:e};"function"==typeof define&&define.amd?define("eventie/eventie",f):"object"==typeof exports?module.exports=f:a.eventie=f}(window),function(){function a(){}function b(a,b){for(var c=a.length;c--;)if(a[c].listener===b)return c;return-1}function c(a){return function(){return this[a].apply(this,arguments)}}var d=a.prototype,e=this,f=e.EventEmitter;d.getListeners=function(a){var b,c,d=this._getEvents();if(a instanceof RegExp){b={};for(c in d)d.hasOwnProperty(c)&&a.test(c)&&(b[c]=d[c])}else b=d[a]||(d[a]=[]);return b},d.flattenListeners=function(a){var b,c=[];for(b=0;b<a.length;b+=1)c.push(a[b].listener);return c},d.getListenersAsObject=function(a){var b,c=this.getListeners(a);return c instanceof Array&&(b={},b[a]=c),b||c},d.addListener=function(a,c){var d,e=this.getListenersAsObject(a),f="object"==typeof c;for(d in e)e.hasOwnProperty(d)&&-1===b(e[d],c)&&e[d].push(f?c:{listener:c,once:!1});return this},d.on=c("addListener"),d.addOnceListener=function(a,b){return this.addListener(a,{listener:b,once:!0})},d.once=c("addOnceListener"),d.defineEvent=function(a){return this.getListeners(a),this},d.defineEvents=function(a){for(var b=0;b<a.length;b+=1)this.defineEvent(a[b]);return this},d.removeListener=function(a,c){var d,e,f=this.getListenersAsObject(a);for(e in f)f.hasOwnProperty(e)&&(d=b(f[e],c),-1!==d&&f[e].splice(d,1));return this},d.off=c("removeListener"),d.addListeners=function(a,b){return this.manipulateListeners(!1,a,b)},d.removeListeners=function(a,b){return this.manipulateListeners(!0,a,b)},d.manipulateListeners=function(a,b,c){var d,e,f=a?this.removeListener:this.addListener,g=a?this.removeListeners:this.addListeners;if("object"!=typeof b||b instanceof RegExp)for(d=c.length;d--;)f.call(this,b,c[d]);else for(d in b)b.hasOwnProperty(d)&&(e=b[d])&&("function"==typeof e?f.call(this,d,e):g.call(this,d,e));return this},d.removeEvent=function(a){var b,c=typeof a,d=this._getEvents();if("string"===c)delete d[a];else if(a instanceof RegExp)for(b in d)d.hasOwnProperty(b)&&a.test(b)&&delete d[b];else delete this._events;return this},d.removeAllListeners=c("removeEvent"),d.emitEvent=function(a,b){var c,d,e,f,g=this.getListenersAsObject(a);for(e in g)if(g.hasOwnProperty(e))for(d=g[e].length;d--;)c=g[e][d],c.once===!0&&this.removeListener(a,c.listener),f=c.listener.apply(this,b||[]),f===this._getOnceReturnValue()&&this.removeListener(a,c.listener);return this},d.trigger=c("emitEvent"),d.emit=function(a){var b=Array.prototype.slice.call(arguments,1);return this.emitEvent(a,b)},d.setOnceReturnValue=function(a){return this._onceReturnValue=a,this},d._getOnceReturnValue=function(){return this.hasOwnProperty("_onceReturnValue")?this._onceReturnValue:!0},d._getEvents=function(){return this._events||(this._events={})},a.noConflict=function(){return e.EventEmitter=f,a},"function"==typeof define&&define.amd?define("eventEmitter/EventEmitter",[],function(){return a}):"object"==typeof module&&module.exports?module.exports=a:e.EventEmitter=a}.call(this),function(a){function b(a){if(a){if("string"==typeof d[a])return a;a=a.charAt(0).toUpperCase()+a.slice(1);for(var b,e=0,f=c.length;f>e;e++)if(b=c[e]+a,"string"==typeof d[b])return b}}var c="Webkit Moz ms Ms O".split(" "),d=document.documentElement.style;"function"==typeof define&&define.amd?define("get-style-property/get-style-property",[],function(){return b}):"object"==typeof exports?module.exports=b:a.getStyleProperty=b}(window),function(a){function b(a){var b=parseFloat(a),c=-1===a.indexOf("%")&&!isNaN(b);return c&&b}function c(){}function d(){for(var a={width:0,height:0,innerWidth:0,innerHeight:0,outerWidth:0,outerHeight:0},b=0,c=g.length;c>b;b++){var d=g[b];a[d]=0}return a}function e(c){function e(){if(!m){m=!0;var d=a.getComputedStyle;if(j=function(){var a=d?function(a){return d(a,null)}:function(a){return a.currentStyle};return function(b){var c=a(b);return c||f("Style returned "+c+". Are you running this code in a hidden iframe on Firefox? See http://bit.ly/getsizebug1"),c}}(),k=c("boxSizing")){var e=document.createElement("div");e.style.width="200px",e.style.padding="1px 2px 3px 4px",e.style.borderStyle="solid",e.style.borderWidth="1px 2px 3px 4px",e.style[k]="border-box";var g=document.body||document.documentElement;g.appendChild(e);var h=j(e);l=200===b(h.width),g.removeChild(e)}}}function h(a){if(e(),"string"==typeof a&&(a=document.querySelector(a)),a&&"object"==typeof a&&a.nodeType){var c=j(a);if("none"===c.display)return d();var f={};f.width=a.offsetWidth,f.height=a.offsetHeight;for(var h=f.isBorderBox=!(!k||!c[k]||"border-box"!==c[k]),m=0,n=g.length;n>m;m++){var o=g[m],p=c[o];p=i(a,p);var q=parseFloat(p);f[o]=isNaN(q)?0:q}var r=f.paddingLeft+f.paddingRight,s=f.paddingTop+f.paddingBottom,t=f.marginLeft+f.marginRight,u=f.marginTop+f.marginBottom,v=f.borderLeftWidth+f.borderRightWidth,w=f.borderTopWidth+f.borderBottomWidth,x=h&&l,y=b(c.width);y!==!1&&(f.width=y+(x?0:r+v));var z=b(c.height);return z!==!1&&(f.height=z+(x?0:s+w)),f.innerWidth=f.width-(r+v),f.innerHeight=f.height-(s+w),f.outerWidth=f.width+t,f.outerHeight=f.height+u,f}}function i(b,c){if(a.getComputedStyle||-1===c.indexOf("%"))return c;var d=b.style,e=d.left,f=b.runtimeStyle,g=f&&f.left;return g&&(f.left=b.currentStyle.left),d.left=c,c=d.pixelLeft,d.left=e,g&&(f.left=g),c}var j,k,l,m=!1;return h}var f="undefined"==typeof console?c:function(a){console.error(a)},g=["paddingLeft","paddingRight","paddingTop","paddingBottom","marginLeft","marginRight","marginTop","marginBottom","borderLeftWidth","borderRightWidth","borderTopWidth","borderBottomWidth"];"function"==typeof define&&define.amd?define("get-size/get-size",["get-style-property/get-style-property"],e):"object"==typeof exports?module.exports=e(require("desandro-get-style-property")):a.getSize=e(a.getStyleProperty)}(window),function(a){function b(a){"function"==typeof a&&(b.isReady?a():g.push(a))}function c(a){var c="readystatechange"===a.type&&"complete"!==f.readyState;b.isReady||c||d()}function d(){b.isReady=!0;for(var a=0,c=g.length;c>a;a++){var d=g[a];d()}}function e(e){return"complete"===f.readyState?d():(e.bind(f,"DOMContentLoaded",c),e.bind(f,"readystatechange",c),e.bind(a,"load",c)),b}var f=a.document,g=[];b.isReady=!1,"function"==typeof define&&define.amd?define("doc-ready/doc-ready",["eventie/eventie"],e):"object"==typeof exports?module.exports=e(require("eventie")):a.docReady=e(a.eventie)}(window),function(a){function b(a,b){return a[g](b)}function c(a){if(!a.parentNode){var b=document.createDocumentFragment();b.appendChild(a)}}function d(a,b){c(a);for(var d=a.parentNode.querySelectorAll(b),e=0,f=d.length;f>e;e++)if(d[e]===a)return!0;return!1}function e(a,d){return c(a),b(a,d)}var f,g=function(){if(a.matches)return"matches";if(a.matchesSelector)return"matchesSelector";for(var b=["webkit","moz","ms","o"],c=0,d=b.length;d>c;c++){var e=b[c],f=e+"MatchesSelector";if(a[f])return f}}();if(g){var h=document.createElement("div"),i=b(h,"div");f=i?b:e}else f=d;"function"==typeof define&&define.amd?define("matches-selector/matches-selector",[],function(){return f}):"object"==typeof exports?module.exports=f:window.matchesSelector=f}(Element.prototype),function(a,b){"function"==typeof define&&define.amd?define("fizzy-ui-utils/utils",["doc-ready/doc-ready","matches-selector/matches-selector"],function(c,d){return b(a,c,d)}):"object"==typeof exports?module.exports=b(a,require("doc-ready"),require("desandro-matches-selector")):a.fizzyUIUtils=b(a,a.docReady,a.matchesSelector)}(window,function(a,b,c){var d={};d.extend=function(a,b){for(var c in b)a[c]=b[c];return a},d.modulo=function(a,b){return(a%b+b)%b};var e=Object.prototype.toString;d.isArray=function(a){return"[object Array]"==e.call(a)},d.makeArray=function(a){var b=[];if(d.isArray(a))b=a;else if(a&&"number"==typeof a.length)for(var c=0,e=a.length;e>c;c++)b.push(a[c]);else b.push(a);return b},d.indexOf=Array.prototype.indexOf?function(a,b){return a.indexOf(b)}:function(a,b){for(var c=0,d=a.length;d>c;c++)if(a[c]===b)return c;return-1},d.removeFrom=function(a,b){var c=d.indexOf(a,b);-1!=c&&a.splice(c,1)},d.isElement="function"==typeof HTMLElement||"object"==typeof HTMLElement?function(a){return a instanceof HTMLElement}:function(a){return a&&"object"==typeof a&&1==a.nodeType&&"string"==typeof a.nodeName},d.setText=function(){function a(a,c){b=b||(void 0!==document.documentElement.textContent?"textContent":"innerText"),a[b]=c}var b;return a}(),d.getParent=function(a,b){for(;a!=document.body;)if(a=a.parentNode,c(a,b))return a},d.getQueryElement=function(a){return"string"==typeof a?document.querySelector(a):a},d.handleEvent=function(a){var b="on"+a.type;this[b]&&this[b](a)},d.filterFindElements=function(a,b){a=d.makeArray(a);for(var e=[],f=0,g=a.length;g>f;f++){var h=a[f];if(d.isElement(h))if(b){c(h,b)&&e.push(h);for(var i=h.querySelectorAll(b),j=0,k=i.length;k>j;j++)e.push(i[j])}else e.push(h)}return e},d.debounceMethod=function(a,b,c){var d=a.prototype[b],e=b+"Timeout";a.prototype[b]=function(){var a=this[e];a&&clearTimeout(a);var b=arguments,f=this;this[e]=setTimeout(function(){d.apply(f,b),delete f[e]},c||100)}},d.toDashed=function(a){return a.replace(/(.)([A-Z])/g,function(a,b,c){return b+"-"+c}).toLowerCase()};var f=a.console;return d.htmlInit=function(c,e){b(function(){for(var b=d.toDashed(e),g=document.querySelectorAll(".js-"+b),h="data-"+b+"-options",i=0,j=g.length;j>i;i++){var k,l=g[i],m=l.getAttribute(h);try{k=m&&JSON.parse(m)}catch(n){f&&f.error("Error parsing "+h+" on "+l.nodeName.toLowerCase()+(l.id?"#"+l.id:"")+": "+n);continue}var o=new c(l,k),p=a.jQuery;p&&p.data(l,e,o)}})},d}),function(a,b){"function"==typeof define&&define.amd?define("outlayer/item",["eventEmitter/EventEmitter","get-size/get-size","get-style-property/get-style-property","fizzy-ui-utils/utils"],function(c,d,e,f){return b(a,c,d,e,f)}):"object"==typeof exports?module.exports=b(a,require("wolfy87-eventemitter"),require("get-size"),require("desandro-get-style-property"),require("fizzy-ui-utils")):(a.Outlayer={},a.Outlayer.Item=b(a,a.EventEmitter,a.getSize,a.getStyleProperty,a.fizzyUIUtils))}(window,function(a,b,c,d,e){function f(a){for(var b in a)return!1;return b=null,!0}function g(a,b){a&&(this.element=a,this.layout=b,this.position={x:0,y:0},this._create())}function h(a){return a.replace(/([A-Z])/g,function(a){return"-"+a.toLowerCase()})}var i=a.getComputedStyle,j=i?function(a){return i(a,null)}:function(a){return a.currentStyle},k=d("transition"),l=d("transform"),m=k&&l,n=!!d("perspective"),o={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"otransitionend",transition:"transitionend"}[k],p=["transform","transition","transitionDuration","transitionProperty"],q=function(){for(var a={},b=0,c=p.length;c>b;b++){var e=p[b],f=d(e);f&&f!==e&&(a[e]=f)}return a}();e.extend(g.prototype,b.prototype),g.prototype._create=function(){this._transn={ingProperties:{},clean:{},onEnd:{}},this.css({position:"absolute"})},g.prototype.handleEvent=function(a){var b="on"+a.type;this[b]&&this[b](a)},g.prototype.getSize=function(){this.size=c(this.element)},g.prototype.css=function(a){var b=this.element.style;for(var c in a){var d=q[c]||c;b[d]=a[c]}},g.prototype.getPosition=function(){var a=j(this.element),b=this.layout.options,c=b.isOriginLeft,d=b.isOriginTop,e=a[c?"left":"right"],f=a[d?"top":"bottom"],g=this.layout.size,h=-1!=e.indexOf("%")?parseFloat(e)/100*g.width:parseInt(e,10),i=-1!=f.indexOf("%")?parseFloat(f)/100*g.height:parseInt(f,10);h=isNaN(h)?0:h,i=isNaN(i)?0:i,h-=c?g.paddingLeft:g.paddingRight,i-=d?g.paddingTop:g.paddingBottom,this.position.x=h,this.position.y=i},g.prototype.layoutPosition=function(){var a=this.layout.size,b=this.layout.options,c={},d=b.isOriginLeft?"paddingLeft":"paddingRight",e=b.isOriginLeft?"left":"right",f=b.isOriginLeft?"right":"left",g=this.position.x+a[d];c[e]=this.getXValue(g),c[f]="";var h=b.isOriginTop?"paddingTop":"paddingBottom",i=b.isOriginTop?"top":"bottom",j=b.isOriginTop?"bottom":"top",k=this.position.y+a[h];c[i]=this.getYValue(k),c[j]="",this.css(c),this.emitEvent("layout",[this])},g.prototype.getXValue=function(a){var b=this.layout.options;return b.percentPosition&&!b.isHorizontal?a/this.layout.size.width*100+"%":a+"px"},g.prototype.getYValue=function(a){var b=this.layout.options;return b.percentPosition&&b.isHorizontal?a/this.layout.size.height*100+"%":a+"px"},g.prototype._transitionTo=function(a,b){this.getPosition();var c=this.position.x,d=this.position.y,e=parseInt(a,10),f=parseInt(b,10),g=e===this.position.x&&f===this.position.y;if(this.setPosition(a,b),g&&!this.isTransitioning)return void this.layoutPosition();var h=a-c,i=b-d,j={};j.transform=this.getTranslate(h,i),this.transition({to:j,onTransitionEnd:{transform:this.layoutPosition},isCleaning:!0})},g.prototype.getTranslate=function(a,b){var c=this.layout.options;return a=c.isOriginLeft?a:-a,b=c.isOriginTop?b:-b,n?"translate3d("+a+"px, "+b+"px, 0)":"translate("+a+"px, "+b+"px)"},g.prototype.goTo=function(a,b){this.setPosition(a,b),this.layoutPosition()},g.prototype.moveTo=m?g.prototype._transitionTo:g.prototype.goTo,g.prototype.setPosition=function(a,b){this.position.x=parseInt(a,10),this.position.y=parseInt(b,10)},g.prototype._nonTransition=function(a){this.css(a.to),a.isCleaning&&this._removeStyles(a.to);for(var b in a.onTransitionEnd)a.onTransitionEnd[b].call(this)},g.prototype._transition=function(a){if(!parseFloat(this.layout.options.transitionDuration))return void this._nonTransition(a);var b=this._transn;for(var c in a.onTransitionEnd)b.onEnd[c]=a.onTransitionEnd[c];for(c in a.to)b.ingProperties[c]=!0,a.isCleaning&&(b.clean[c]=!0);if(a.from){this.css(a.from);var d=this.element.offsetHeight;d=null}this.enableTransition(a.to),this.css(a.to),this.isTransitioning=!0};var r="opacity,"+h(q.transform||"transform");g.prototype.enableTransition=function(){this.isTransitioning||(this.css({transitionProperty:r,transitionDuration:this.layout.options.transitionDuration}),this.element.addEventListener(o,this,!1))},g.prototype.transition=g.prototype[k?"_transition":"_nonTransition"],g.prototype.onwebkitTransitionEnd=function(a){this.ontransitionend(a)},g.prototype.onotransitionend=function(a){this.ontransitionend(a)};var s={"-webkit-transform":"transform","-moz-transform":"transform","-o-transform":"transform"};g.prototype.ontransitionend=function(a){if(a.target===this.element){var b=this._transn,c=s[a.propertyName]||a.propertyName;if(delete b.ingProperties[c],f(b.ingProperties)&&this.disableTransition(),c in b.clean&&(this.element.style[a.propertyName]="",delete b.clean[c]),c in b.onEnd){var d=b.onEnd[c];d.call(this),delete b.onEnd[c]}this.emitEvent("transitionEnd",[this])}},g.prototype.disableTransition=function(){this.removeTransitionStyles(),this.element.removeEventListener(o,this,!1),this.isTransitioning=!1},g.prototype._removeStyles=function(a){var b={};for(var c in a)b[c]="";this.css(b)};var t={transitionProperty:"",transitionDuration:""};return g.prototype.removeTransitionStyles=function(){this.css(t)},g.prototype.removeElem=function(){this.element.parentNode.removeChild(this.element),this.css({display:""}),this.emitEvent("remove",[this])},g.prototype.remove=function(){if(!k||!parseFloat(this.layout.options.transitionDuration))return void this.removeElem();var a=this;this.once("transitionEnd",function(){a.removeElem()}),this.hide()},g.prototype.reveal=function(){delete this.isHidden,this.css({display:""});var a=this.layout.options,b={},c=this.getHideRevealTransitionEndProperty("visibleStyle");b[c]=this.onRevealTransitionEnd,this.transition({from:a.hiddenStyle,to:a.visibleStyle,isCleaning:!0,onTransitionEnd:b})},g.prototype.onRevealTransitionEnd=function(){this.isHidden||this.emitEvent("reveal")},g.prototype.getHideRevealTransitionEndProperty=function(a){var b=this.layout.options[a];if(b.opacity)return"opacity";for(var c in b)return c},g.prototype.hide=function(){this.isHidden=!0,this.css({display:""});var a=this.layout.options,b={},c=this.getHideRevealTransitionEndProperty("hiddenStyle");b[c]=this.onHideTransitionEnd,this.transition({from:a.visibleStyle,to:a.hiddenStyle,isCleaning:!0,onTransitionEnd:b})},g.prototype.onHideTransitionEnd=function(){this.isHidden&&(this.css({display:"none"}),this.emitEvent("hide"))},g.prototype.destroy=function(){this.css({position:"",left:"",right:"",top:"",bottom:"",transition:"",transform:""})},g}),function(a,b){"function"==typeof define&&define.amd?define("outlayer/outlayer",["eventie/eventie","eventEmitter/EventEmitter","get-size/get-size","fizzy-ui-utils/utils","./item"],function(c,d,e,f,g){return b(a,c,d,e,f,g)}):"object"==typeof exports?module.exports=b(a,require("eventie"),require("wolfy87-eventemitter"),require("get-size"),require("fizzy-ui-utils"),require("./item")):a.Outlayer=b(a,a.eventie,a.EventEmitter,a.getSize,a.fizzyUIUtils,a.Outlayer.Item)}(window,function(a,b,c,d,e,f){function g(a,b){var c=e.getQueryElement(a);if(!c)return void(h&&h.error("Bad element for "+this.constructor.namespace+": "+(c||a)));this.element=c,i&&(this.$element=i(this.element)),this.options=e.extend({},this.constructor.defaults),this.option(b);var d=++k;this.element.outlayerGUID=d,l[d]=this,this._create(),this.options.isInitLayout&&this.layout()}var h=a.console,i=a.jQuery,j=function(){},k=0,l={};return g.namespace="outlayer",g.Item=f,g.defaults={containerStyle:{position:"relative"},isInitLayout:!0,isOriginLeft:!0,isOriginTop:!0,isResizeBound:!0,isResizingContainer:!0,transitionDuration:"0.4s",hiddenStyle:{opacity:0,transform:"scale(0.001)"},visibleStyle:{opacity:1,transform:"scale(1)"}},e.extend(g.prototype,c.prototype),g.prototype.option=function(a){e.extend(this.options,a)},g.prototype._create=function(){this.reloadItems(),this.stamps=[],this.stamp(this.options.stamp),e.extend(this.element.style,this.options.containerStyle),this.options.isResizeBound&&this.bindResize()},g.prototype.reloadItems=function(){this.items=this._itemize(this.element.children)},g.prototype._itemize=function(a){for(var b=this._filterFindItemElements(a),c=this.constructor.Item,d=[],e=0,f=b.length;f>e;e++){var g=b[e],h=new c(g,this);d.push(h)}return d},g.prototype._filterFindItemElements=function(a){return e.filterFindElements(a,this.options.itemSelector)},g.prototype.getItemElements=function(){for(var a=[],b=0,c=this.items.length;c>b;b++)a.push(this.items[b].element);return a},g.prototype.layout=function(){this._resetLayout(),this._manageStamps();var a=void 0!==this.options.isLayoutInstant?this.options.isLayoutInstant:!this._isLayoutInited;this.layoutItems(this.items,a),this._isLayoutInited=!0},g.prototype._init=g.prototype.layout,g.prototype._resetLayout=function(){this.getSize()},g.prototype.getSize=function(){this.size=d(this.element)},g.prototype._getMeasurement=function(a,b){var c,f=this.options[a];f?("string"==typeof f?c=this.element.querySelector(f):e.isElement(f)&&(c=f),this[a]=c?d(c)[b]:f):this[a]=0},g.prototype.layoutItems=function(a,b){a=this._getItemsForLayout(a),this._layoutItems(a,b),this._postLayout()},g.prototype._getItemsForLayout=function(a){for(var b=[],c=0,d=a.length;d>c;c++){var e=a[c];e.isIgnored||b.push(e)}return b},g.prototype._layoutItems=function(a,b){if(this._emitCompleteOnItems("layout",a),a&&a.length){for(var c=[],d=0,e=a.length;e>d;d++){var f=a[d],g=this._getItemLayoutPosition(f);g.item=f,g.isInstant=b||f.isLayoutInstant,c.push(g)}this._processLayoutQueue(c)}},g.prototype._getItemLayoutPosition=function(){return{x:0,y:0}},g.prototype._processLayoutQueue=function(a){for(var b=0,c=a.length;c>b;b++){var d=a[b];this._positionItem(d.item,d.x,d.y,d.isInstant)}},g.prototype._positionItem=function(a,b,c,d){d?a.goTo(b,c):a.moveTo(b,c)},g.prototype._postLayout=function(){this.resizeContainer()},g.prototype.resizeContainer=function(){if(this.options.isResizingContainer){var a=this._getContainerSize();a&&(this._setContainerMeasure(a.width,!0),this._setContainerMeasure(a.height,!1))}},g.prototype._getContainerSize=j,g.prototype._setContainerMeasure=function(a,b){if(void 0!==a){var c=this.size;c.isBorderBox&&(a+=b?c.paddingLeft+c.paddingRight+c.borderLeftWidth+c.borderRightWidth:c.paddingBottom+c.paddingTop+c.borderTopWidth+c.borderBottomWidth),a=Math.max(a,0),this.element.style[b?"width":"height"]=a+"px"}},g.prototype._emitCompleteOnItems=function(a,b){function c(){e.dispatchEvent(a+"Complete",null,[b])}function d(){g++,g===f&&c()}var e=this,f=b.length;if(!b||!f)return void c();for(var g=0,h=0,i=b.length;i>h;h++){var j=b[h];j.once(a,d)}},g.prototype.dispatchEvent=function(a,b,c){var d=b?[b].concat(c):c;if(this.emitEvent(a,d),i)if(this.$element=this.$element||i(this.element),b){var e=i.Event(b);e.type=a,this.$element.trigger(e,c)}else this.$element.trigger(a,c)},g.prototype.ignore=function(a){var b=this.getItem(a);b&&(b.isIgnored=!0)},g.prototype.unignore=function(a){var b=this.getItem(a);b&&delete b.isIgnored},g.prototype.stamp=function(a){if(a=this._find(a)){this.stamps=this.stamps.concat(a);for(var b=0,c=a.length;c>b;b++){var d=a[b];this.ignore(d)}}},g.prototype.unstamp=function(a){if(a=this._find(a))for(var b=0,c=a.length;c>b;b++){var d=a[b];e.removeFrom(this.stamps,d),this.unignore(d)}},g.prototype._find=function(a){return a?("string"==typeof a&&(a=this.element.querySelectorAll(a)),a=e.makeArray(a)):void 0},g.prototype._manageStamps=function(){if(this.stamps&&this.stamps.length){this._getBoundingRect();for(var a=0,b=this.stamps.length;b>a;a++){var c=this.stamps[a];this._manageStamp(c)}}},g.prototype._getBoundingRect=function(){var a=this.element.getBoundingClientRect(),b=this.size;this._boundingRect={left:a.left+b.paddingLeft+b.borderLeftWidth,top:a.top+b.paddingTop+b.borderTopWidth,right:a.right-(b.paddingRight+b.borderRightWidth),bottom:a.bottom-(b.paddingBottom+b.borderBottomWidth)}},g.prototype._manageStamp=j,g.prototype._getElementOffset=function(a){var b=a.getBoundingClientRect(),c=this._boundingRect,e=d(a),f={left:b.left-c.left-e.marginLeft,top:b.top-c.top-e.marginTop,right:c.right-b.right-e.marginRight,bottom:c.bottom-b.bottom-e.marginBottom};return f},g.prototype.handleEvent=function(a){var b="on"+a.type;this[b]&&this[b](a)},g.prototype.bindResize=function(){this.isResizeBound||(b.bind(a,"resize",this),this.isResizeBound=!0)},g.prototype.unbindResize=function(){this.isResizeBound&&b.unbind(a,"resize",this),this.isResizeBound=!1},g.prototype.onresize=function(){function a(){b.resize(),delete b.resizeTimeout}this.resizeTimeout&&clearTimeout(this.resizeTimeout);var b=this;this.resizeTimeout=setTimeout(a,100)},g.prototype.resize=function(){this.isResizeBound&&this.needsResizeLayout()&&this.layout()},g.prototype.needsResizeLayout=function(){var a=d(this.element),b=this.size&&a;return b&&a.innerWidth!==this.size.innerWidth},g.prototype.addItems=function(a){var b=this._itemize(a);return b.length&&(this.items=this.items.concat(b)),b},g.prototype.appended=function(a){var b=this.addItems(a);b.length&&(this.layoutItems(b,!0),this.reveal(b))},g.prototype.prepended=function(a){var b=this._itemize(a);if(b.length){var c=this.items.slice(0);this.items=b.concat(c),this._resetLayout(),this._manageStamps(),this.layoutItems(b,!0),this.reveal(b),this.layoutItems(c)}},g.prototype.reveal=function(a){this._emitCompleteOnItems("reveal",a);for(var b=a&&a.length,c=0;b&&b>c;c++){var d=a[c];d.reveal()}},g.prototype.hide=function(a){this._emitCompleteOnItems("hide",a);for(var b=a&&a.length,c=0;b&&b>c;c++){var d=a[c];d.hide()}},g.prototype.revealItemElements=function(a){var b=this.getItems(a);this.reveal(b)},g.prototype.hideItemElements=function(a){var b=this.getItems(a);this.hide(b)},g.prototype.getItem=function(a){for(var b=0,c=this.items.length;c>b;b++){var d=this.items[b];if(d.element===a)return d}},g.prototype.getItems=function(a){a=e.makeArray(a);for(var b=[],c=0,d=a.length;d>c;c++){var f=a[c],g=this.getItem(f);g&&b.push(g)}return b},g.prototype.remove=function(a){var b=this.getItems(a);if(this._emitCompleteOnItems("remove",b),b&&b.length)for(var c=0,d=b.length;d>c;c++){var f=b[c];f.remove(),e.removeFrom(this.items,f)}},g.prototype.destroy=function(){var a=this.element.style;a.height="",a.position="",a.width="";for(var b=0,c=this.items.length;c>b;b++){var d=this.items[b];d.destroy()}this.unbindResize();var e=this.element.outlayerGUID;delete l[e],delete this.element.outlayerGUID,i&&i.removeData(this.element,this.constructor.namespace)},g.data=function(a){a=e.getQueryElement(a);var b=a&&a.outlayerGUID;return b&&l[b]},g.create=function(a,b){function c(){g.apply(this,arguments)}return Object.create?c.prototype=Object.create(g.prototype):e.extend(c.prototype,g.prototype),c.prototype.constructor=c,c.defaults=e.extend({},g.defaults),e.extend(c.defaults,b),c.prototype.settings={},c.namespace=a,c.data=g.data,c.Item=function(){f.apply(this,arguments)},c.Item.prototype=new f,e.htmlInit(c,a),i&&i.bridget&&i.bridget(a,c),c},g.Item=f,g}),function(a,b){"function"==typeof define&&define.amd?define(["outlayer/outlayer","get-size/get-size","fizzy-ui-utils/utils"],b):"object"==typeof exports?module.exports=b(require("outlayer"),require("get-size"),require("fizzy-ui-utils")):a.Masonry=b(a.Outlayer,a.getSize,a.fizzyUIUtils)}(window,function(a,b,c){var d=a.create("masonry");return d.prototype._resetLayout=function(){this.getSize(),this._getMeasurement("columnWidth","outerWidth"),this._getMeasurement("gutter","outerWidth"),this.measureColumns();var a=this.cols;for(this.colYs=[];a--;)this.colYs.push(0);this.maxY=0},d.prototype.measureColumns=function(){if(this.getContainerWidth(),!this.columnWidth){var a=this.items[0],c=a&&a.element;this.columnWidth=c&&b(c).outerWidth||this.containerWidth}var d=this.columnWidth+=this.gutter,e=this.containerWidth+this.gutter,f=e/d,g=d-e%d,h=g&&1>g?"round":"floor";f=Math[h](f),this.cols=Math.max(f,1)},d.prototype.getContainerWidth=function(){var a=this.options.isFitWidth?this.element.parentNode:this.element,c=b(a);this.containerWidth=c&&c.innerWidth},d.prototype._getItemLayoutPosition=function(a){a.getSize();var b=a.size.outerWidth%this.columnWidth,d=b&&1>b?"round":"ceil",e=Math[d](a.size.outerWidth/this.columnWidth);e=Math.min(e,this.cols);for(var f=this._getColGroup(e),g=Math.min.apply(Math,f),h=c.indexOf(f,g),i={x:this.columnWidth*h,y:g},j=g+a.size.outerHeight,k=this.cols+1-f.length,l=0;k>l;l++)this.colYs[h+l]=j;return i},d.prototype._getColGroup=function(a){if(2>a)return this.colYs;for(var b=[],c=this.cols+1-a,d=0;c>d;d++){var e=this.colYs.slice(d,d+a);b[d]=Math.max.apply(Math,e)}return b},d.prototype._manageStamp=function(a){var c=b(a),d=this._getElementOffset(a),e=this.options.isOriginLeft?d.left:d.right,f=e+c.outerWidth,g=Math.floor(e/this.columnWidth);g=Math.max(0,g);var h=Math.floor(f/this.columnWidth);h-=f%this.columnWidth?0:1,h=Math.min(this.cols-1,h);for(var i=(this.options.isOriginTop?d.top:d.bottom)+c.outerHeight,j=g;h>=j;j++)this.colYs[j]=Math.max(i,this.colYs[j])},d.prototype._getContainerSize=function(){this.maxY=Math.max.apply(Math,this.colYs);var a={height:this.maxY};return this.options.isFitWidth&&(a.width=this._getContainerFitWidth()),a},d.prototype._getContainerFitWidth=function(){for(var a=0,b=this.cols;--b&&0===this.colYs[b];)a++;return(this.cols-a)*this.columnWidth-this.gutter},d.prototype.needsResizeLayout=function(){var a=this.containerWidth;return this.getContainerWidth(),a!==this.containerWidth},d}); 10 No newline at end of file -
wp-includes/script-loader.php
242 242 $scripts->add( 'jquery-table-hotkeys', "/wp-includes/js/jquery/jquery.table-hotkeys$suffix.js", array('jquery', 'jquery-hotkeys'), false, 1 ); 243 243 $scripts->add( 'jquery-touch-punch', "/wp-includes/js/jquery/jquery.ui.touch-punch.js", array('jquery-ui-widget', 'jquery-ui-mouse'), '0.2.2', 1 ); 244 244 245 // Masonry v2 depended on jQuery. v3 does not. The older jquery-masonry handle is a shiv. 246 // It sets jQuery as a dependency, as the theme may have been implicitly loading it this way. 247 $scripts->add( 'masonry', "/wp-includes/js/masonry.min.js", array(), '3.1.2', 1 ); 248 $scripts->add( 'jquery-masonry', "/wp-includes/js/jquery/jquery.masonry$dev_suffix.js", array( 'jquery', 'masonry' ), '3.1.2', 1 ); 245 $scripts->add( 'imagesLoaded', "/wp-includes/js/imagesloaded$suffix.js", array(), '3.1.8', 1 ); 246 $scripts->add( 'masonry', "/wp-includes/js/masonry$suffix.js", array(), '3.3.2', 1 ); 249 247 250 248 $scripts->add( 'thickbox', "/wp-includes/js/thickbox/thickbox.js", array('jquery'), '3.1-20121105', 1 ); 251 249 did_action( 'init' ) && $scripts->localize( 'thickbox', 'thickboxL10n', array(