1/* 2 * Foundation Responsive Library 3 * http://foundation.zurb.com 4 * Copyright 2015, ZURB 5 * Free to use under the MIT license. 6 * http://www.opensource.org/licenses/mit-license.php 7*/ 8 9(function ($, window, document, undefined) { 10 'use strict'; 11 12 var header_helpers = function (class_array) { 13 var head = $('head'); 14 head.prepend($.map(class_array, function (class_name) { 15 if (head.has('.' + class_name).length === 0) { 16 return '<meta class="' + class_name + '" />'; 17 } 18 })); 19 }; 20 21 header_helpers([ 22 'foundation-mq-small', 23 'foundation-mq-small-only', 24 'foundation-mq-medium', 25 'foundation-mq-medium-only', 26 'foundation-mq-large', 27 'foundation-mq-large-only', 28 'foundation-mq-xlarge', 29 'foundation-mq-xlarge-only', 30 'foundation-mq-xxlarge', 31 'foundation-data-attribute-namespace']); 32 33 // Enable FastClick if present 34 35 $(function () { 36 if (typeof FastClick !== 'undefined') { 37 // Don't attach to body if undefined 38 if (typeof document.body !== 'undefined') { 39 FastClick.attach(document.body); 40 } 41 } 42 }); 43 44 // private Fast Selector wrapper, 45 // returns jQuery object. Only use where 46 // getElementById is not available. 47 var S = function (selector, context) { 48 if (typeof selector === 'string') { 49 if (context) { 50 var cont; 51 if (context.jquery) { 52 cont = context[0]; 53 if (!cont) { 54 return context; 55 } 56 } else { 57 cont = context; 58 } 59 return $(cont.querySelectorAll(selector)); 60 } 61 62 return $(document.querySelectorAll(selector)); 63 } 64 65 return $(selector, context); 66 }; 67 68 // Namespace functions. 69 70 var attr_name = function (init) { 71 var arr = []; 72 if (!init) { 73 arr.push('data'); 74 } 75 if (this.namespace.length > 0) { 76 arr.push(this.namespace); 77 } 78 arr.push(this.name); 79 80 return arr.join('-'); 81 }; 82 83 var add_namespace = function (str) { 84 var parts = str.split('-'), 85 i = parts.length, 86 arr = []; 87 88 while (i--) { 89 if (i !== 0) { 90 arr.push(parts[i]); 91 } else { 92 if (this.namespace.length > 0) { 93 arr.push(this.namespace, parts[i]); 94 } else { 95 arr.push(parts[i]); 96 } 97 } 98 } 99 100 return arr.reverse().join('-'); 101 }; 102 103 // Event binding and data-options updating. 104 105 var bindings = function (method, options) { 106 var self = this, 107 bind = function(){ 108 var $this = S(this), 109 should_bind_events = !$this.data(self.attr_name(true) + '-init'); 110 $this.data(self.attr_name(true) + '-init', $.extend({}, self.settings, (options || method), self.data_options($this))); 111 112 if (should_bind_events) { 113 self.events(this); 114 } 115 }; 116 117 if (S(this.scope).is('[' + this.attr_name() +']')) { 118 bind.call(this.scope); 119 } else { 120 S('[' + this.attr_name() +']', this.scope).each(bind); 121 } 122 // # Patch to fix #5043 to move this *after* the if/else clause in order for Backbone and similar frameworks to have improved control over event binding and data-options updating. 123 if (typeof method === 'string') { 124 return this[method].call(this, options); 125 } 126 127 }; 128 129 var single_image_loaded = function (image, callback) { 130 function loaded () { 131 callback(image[0]); 132 } 133 134 function bindLoad () { 135 this.one('load', loaded); 136 137 if (/MSIE (\d+\.\d+);/.test(navigator.userAgent)) { 138 var src = this.attr( 'src' ), 139 param = src.match( /\?/ ) ? '&' : '?'; 140 141 param += 'random=' + (new Date()).getTime(); 142 this.attr('src', src + param); 143 } 144 } 145 146 if (!image.attr('src')) { 147 loaded(); 148 return; 149 } 150 151 if (image[0].complete || image[0].readyState === 4) { 152 loaded(); 153 } else { 154 bindLoad.call(image); 155 } 156 }; 157 158 /*! matchMedia() polyfill - Test a CSS media type/query in JS. Authors & copyright (c) 2012: Scott Jehl, Paul Irish, Nicholas Zakas, David Knight. Dual MIT/BSD license */ 159 160 window.matchMedia || (window.matchMedia = function() { 161 "use strict"; 162 163 // For browsers that support matchMedium api such as IE 9 and webkit 164 var styleMedia = (window.styleMedia || window.media); 165 166 // For those that don't support matchMedium 167 if (!styleMedia) { 168 var style = document.createElement('style'), 169 script = document.getElementsByTagName('script')[0], 170 info = null; 171 172 style.type = 'text/css'; 173 style.id = 'matchmediajs-test'; 174 175 script.parentNode.insertBefore(style, script); 176 177 // 'style.currentStyle' is used by IE <= 8 and 'window.getComputedStyle' for all other browsers 178 info = ('getComputedStyle' in window) && window.getComputedStyle(style, null) || style.currentStyle; 179 180 styleMedia = { 181 matchMedium: function(media) { 182 var text = '@media ' + media + '{ #matchmediajs-test { width: 1px; } }'; 183 184 // 'style.styleSheet' is used by IE <= 8 and 'style.textContent' for all other browsers 185 if (style.styleSheet) { 186 style.styleSheet.cssText = text; 187 } else { 188 style.textContent = text; 189 } 190 191 // Test if media query is true or false 192 return info.width === '1px'; 193 } 194 }; 195 } 196 197 return function(media) { 198 return { 199 matches: styleMedia.matchMedium(media || 'all'), 200 media: media || 'all' 201 }; 202 }; 203 }()); 204 205 /* 206 * jquery.requestAnimationFrame 207 * https://github.com/gnarf37/jquery-requestAnimationFrame 208 * Requires jQuery 1.8+ 209 * 210 * Copyright (c) 2012 Corey Frang 211 * Licensed under the MIT license. 212 */ 213 214 (function(jQuery) { 215 216 217 // requestAnimationFrame polyfill adapted from Erik Möller 218 // fixes from Paul Irish and Tino Zijdel 219 // http://paulirish.com/2011/requestanimationframe-for-smart-animating/ 220 // http://my.opera.com/emoller/blog/2011/12/20/requestanimationframe-for-smart-er-animating 221 222 var animating, 223 lastTime = 0, 224 vendors = ['webkit', 'moz'], 225 requestAnimationFrame = window.requestAnimationFrame, 226 cancelAnimationFrame = window.cancelAnimationFrame, 227 jqueryFxAvailable = 'undefined' !== typeof jQuery.fx; 228 229 for (;
229 lastTime < vendors.length && !requestAnimationFrame; lastTime++) { 230 requestAnimationFrame = window[ vendors[lastTime] + 'RequestAnimationFrame' ]; 231 cancelAnimationFrame = cancelAnimationFrame || 232 window[ vendors[lastTime] + 'CancelAnimationFrame' ] || 233 window[ vendors[lastTime] + 'CancelRequestAnimationFrame' ]; 234 } 235 236 function raf() { 237 if (animating) { 238 requestAnimationFrame(raf); 239 240 if (jqueryFxAvailable) { 241 jQuery.fx.tick(); 242 } 243 } 244 } 245 246 if (requestAnimationFrame) { 247 // use rAF 248 window.requestAnimationFrame = requestAnimationFrame; 249 window.cancelAnimationFrame = cancelAnimationFrame; 250 251 if (jqueryFxAvailable) { 252 jQuery.fx.timer = function (timer) { 253 if (timer() && jQuery.timers.push(timer) && !animating) { 254 animating = true; 255 raf(); 256 } 257 }; 258 259 jQuery.fx.stop = function () { 260 animating = false; 261 }; 262 } 263 } else { 264 // polyfill 265 window.requestAnimationFrame = function (callback) { 266 var currTime = new Date().getTime(), 267 timeToCall = Math.max(0, 16 - (currTime - lastTime)), 268 id = window.setTimeout(function () { 269 callback(currTime + timeToCall); 270 }, timeToCall); 271 lastTime = currTime + timeToCall; 272 return id; 273 }; 274 275 window.cancelAnimationFrame = function (id) { 276 clearTimeout(id); 277 }; 278 279 } 280 281 }( $ )); 282 283 function removeQuotes (string) { 284 if (typeof string === 'string' || string instanceof String) { 285 string = string.replace(/^['\\/"]+|(;\s?})+|['\\/"]+$/g, ''); 286 } 287 288 return string; 289 } 290 291 function MediaQuery(selector) { 292 this.selector = selector; 293 this.query = ''; 294 } 295 296 MediaQuery.prototype.toString = function () { 297 return this.query || (this.query = S(this.selector).css('font-family').replace(/^[\/\\'"]+|(;\s?})+|[\/\\'"]+$/g, '')); 298 }; 299 300 window.Foundation = { 301 name : 'Foundation', 302 303 version : '5.5.3', 304 305 media_queries : { 306 'small' : new MediaQuery('.foundation-mq-small'), 307 'small-only' : new MediaQuery('.foundation-mq-small-only'), 308 'medium' : new MediaQuery('.foundation-mq-medium'), 309 'medium-only' : new MediaQuery('.foundation-mq-medium-only'), 310 'large' : new MediaQuery('.foundation-mq-large'), 311 'large-only' : new MediaQuery('.foundation-mq-large-only'), 312 'xlarge' : new MediaQuery('.foundation-mq-xlarge'), 313 'xlarge-only' : new MediaQuery('.foundation-mq-xlarge-only'), 314 'xxlarge' : new MediaQuery('.foundation-mq-xxlarge') 315 }, 316 317 stylesheet : $('<style></style>').appendTo('head')[0].sheet, 318 319 global : { 320 namespace : undefined 321 }, 322 323 init : function (scope, libraries, method, options, response) { 324 var args = [scope, method, options, response], 325 responses = []; 326 327 // check RTL 328 this.rtl = /rtl/i.test(S('html').attr('dir')); 329 330 // set foundation global scope 331 this.scope = scope || this.scope; 332 333 this.set_namespace(); 334 335 if (libraries && typeof libraries === 'string' && !/reflow/i.test(libraries)) { 336 if (this.libs.hasOwnProperty(libraries)) { 337 responses.push(this.init_lib(libraries, args)); 338 } 339 } else { 340 for (var lib in this.libs) { 341 responses.push(this.init_lib(lib, libraries)); 342 } 343 } 344 345 S(window).load(function () { 346 S(window) 347 .trigger('resize.fndtn.clearing') 348 .trigger('resize.fndtn.dropdown') 349 .trigger('resize.fndtn.equalizer') 350 .trigger('resize.fndtn.interchange') 351 .trigger('resize.fndtn.joyride') 352 .trigger('resize.fndtn.magellan') 353 .trigger('resize.fndtn.topbar') 354 .trigger('resize.fndtn.slider'); 355 }); 356 357 return scope; 358 }, 359 360 init_lib : function (lib, args) { 361 if (this.libs.hasOwnProperty(lib)) { 362 this.patch(this.libs[lib]); 363 364 if (args && args.hasOwnProperty(lib)) { 365 if (typeof this.libs[lib].settings !== 'undefined') { 366 $.extend(true, this.libs[lib].settings, args[lib]); 367 } else if (typeof this.libs[lib].defaults !== 'undefined') { 368 $.extend(true, this.libs[lib].defaults, args[lib]); 369 } 370 return this.libs[lib].init.apply(this.libs[lib], [this.scope, args[lib]]); 371 } 372 373 args = args instanceof Array ? args : new Array(args); 374 return this.libs[lib].init.apply(this.libs[lib], args); 375 } 376 377 return function () {}; 378 }, 379 380 patch : function (lib) { 381 lib.scope = this.scope; 382 lib.namespace = this.global.namespace; 383 lib.rtl = this.rtl; 384 lib['data_options'] = this.utils.data_options; 385 lib['attr_name'] = attr_name; 386 lib['add_namespace'] = add_namespace; 387 lib['bindings'] = bindings; 388 lib['S'] = this.utils.S; 389 }, 390 391 inherit : function (scope, methods) { 392 var methods_arr = methods.split(' '), 393 i = methods_arr.length; 394 395 while (i--) { 396 if (this.utils.hasOwnProperty(methods_arr[i])) { 397 scope[methods_arr[i]] = this.utils[methods_arr[i]]; 398 } 399 } 400 }, 401 402 set_namespace : function () { 403 404 // Description: 405 // Don't bother reading the namespace out of the meta tag 406 // if the namespace has been set globally in javascript 407 // 408 // Example: 409 // Foundation.global.namespace = 'my-namespace'; 410 // or make it an empty string: 411 // Foundation.global.namespace = ''; 412 // 413 // 414 415 // If the namespace has not been set (is undefined), try to read it out of the meta element. 416 // Otherwise use the globally defined namespace, even if it's empty ('') 417 var namespace = ( this.global.namespace === undefined ) ? $('.foundation-data-attribute-namespace').css('font-family') : this.global.namespace; 418 419 // Finally, if the namsepace is either undefined or false, set it to an empty string. 420 // Otherwise use the namespace value. 421 this.global.namespace = ( namespace === undefined || /false/i.test(namespace) ) ? '' : namespace; 422 }, 423 424 libs : {}, 425 426 // methods that can be inherited in libraries 427 utils : { 428 429 // Description: 430 // Fast Selector wrapper returns jQuery object. Only use where getElementById 431 // is not available. 432 // 433 // Arguments:
434 // Selector (String): CSS selector describing the element(s) to be 435 // returned as a jQuery object. 436 // 437 // Scope (String): CSS selector describing the area to be searched. Default 438 // is document. 439 // 440 // Returns: 441 // Element (jQuery Object): jQuery object containing elements matching the 442 // selector within the scope. 443 S : S, 444 445 // Description: 446 // Executes a function a max of once every n milliseconds 447 // 448 // Arguments: 449 // Func (Function): Function to be throttled. 450 // 451 // Delay (Integer): Function execution threshold in milliseconds. 452 // 453 // Returns: 454 // Lazy_function (Function): Function with throttling applied. 455 throttle : function (func, delay) { 456 var timer = null; 457 458 return function () { 459 var context = this, args = arguments; 460 461 if (timer == null) { 462 timer = setTimeout(function () { 463 func.apply(context, args); 464 timer = null; 465 }, delay); 466 } 467 }; 468 }, 469 470 // Description: 471 // Executes a function when it stops being invoked for n seconds 472 // Modified version of _.debounce() http://underscorejs.org 473 // 474 // Arguments: 475 // Func (Function): Function to be debounced. 476 // 477 // Delay (Integer): Function execution threshold in milliseconds. 478 // 479 // Immediate (Bool): Whether the function should be called at the beginning 480 // of the delay instead of the end. Default is false. 481 // 482 // Returns: 483 // Lazy_function (Function): Function with debouncing applied. 484 debounce : function (func, delay, immediate) { 485 var timeout, result; 486 return function () { 487 var context = this, args = arguments; 488 var later = function () { 489 timeout = null; 490 if (!immediate) { 491 result = func.apply(context, args); 492 } 493 }; 494 var callNow = immediate && !timeout; 495 clearTimeout(timeout); 496 timeout = setTimeout(later, delay); 497 if (callNow) { 498 result = func.apply(context, args); 499 } 500 return result; 501 }; 502 }, 503 504 // Description: 505 // Parses data-options attribute 506 // 507 // Arguments: 508 // El (jQuery Object): Element to be parsed. 509 // 510 // Returns: 511 // Options (Javascript Object): Contents of the element's data-options 512 // attribute. 513 data_options : function (el, data_attr_name) { 514 data_attr_name = data_attr_name || 'options'; 515 var opts = {}, ii, p, opts_arr, 516 data_options = function (el) { 517 var namespace = Foundation.global.namespace; 518 519 if (namespace.length > 0) { 520 return el.data(namespace + '-' + data_attr_name); 521 } 522 523 return el.data(data_attr_name); 524 }; 525 526 var cached_options = data_options(el); 527 528 if (typeof cached_options === 'object') { 529 return cached_options; 530 } 531 532 opts_arr = (cached_options || ':').split(';'); 533 ii = opts_arr.length; 534 535 function isNumber (o) { 536 return !isNaN (o - 0) && o !== null && o !== '' && o !== false && o !== true; 537 } 538 539 function trim (str) { 540 if (typeof str === 'string') { 541 return $.trim(str); 542 } 543 return str; 544 } 545 546 while (ii--) { 547 p = opts_arr[ii].split(':'); 548 p = [p[0], p.slice(1).join(':')]; 549 550 if (/true/i.test(p[1])) { 551 p[1] = true; 552 } 553 if (/false/i.test(p[1])) { 554 p[1] = false; 555 } 556 if (isNumber(p[1])) { 557 if (p[1].indexOf('.') === -1) { 558 p[1] = parseInt(p[1], 10); 559 } else { 560 p[1] = parseFloat(p[1]); 561 } 562 } 563 564 if (p.length === 2 && p[0].length > 0) { 565 opts[trim(p[0])] = trim(p[1]); 566 } 567 } 568 569 return opts; 570 }, 571 572 // Description: 573 // Adds JS-recognizable media queries 574 // 575 // Arguments: 576 // Media (String): Key string for the media query to be stored as in 577 // Foundation.media_queries 578 //
579 // Class (String): Class name for the generated <meta> tag 580 register_media : function (media, media_class) { 581 if (Foundation.media_queries[media] === undefined) { 582 $('head').append('<meta class="' + media_class + '"/>'); 583 Foundation.media_queries[media] = removeQuotes($('.' + media_class).css('font-family')); 584 } 585 }, 586 587 // Description: 588 // Add custom CSS within a JS-defined media query 589 // 590 // Arguments: 591 // Rule (String): CSS rule to be appended to the document. 592 // 593 // Media (String): Optional media query string for the CSS rule to be 594 // nested under. 595 add_custom_rule : function (rule, media) { 596 if (media === undefined && Foundation.stylesheet) { 597 Foundation.stylesheet.insertRule(rule, Foundation.stylesheet.cssRules.length); 598 } else { 599 var query = Foundation.media_queries[media]; 600 601 if (query !== undefined) { 602 Foundation.stylesheet.insertRule('@media ' + 603 Foundation.media_queries[media] + '{ ' + rule + ' }', Foundation.stylesheet.cssRules.length); 604 } 605 } 606 }, 607 608 // Description: 609 // Performs a callback function when an image is fully loaded 610 // 611 // Arguments: 612 // Image (jQuery Object): Image(s) to check if loaded. 613 // 614 // Callback (Function): Function to execute when image is fully loaded. 615 image_loaded : function (images, callback) { 616 var self = this, 617 unloaded = images.length; 618 619 function pictures_has_height(images) { 620 var pictures_number = images.length; 621 622 for (var i = pictures_number - 1; i >= 0; i--) { 623 if(images.attr('height') === undefined) { 624 return false; 625 }; 626 }; 627 628 return true; 629 } 630 631 if (unloaded === 0 || pictures_has_height(images)) { 632 callback(images); 633 } 634 635 images.each(function () { 636 single_image_loaded(self.S(this), function () { 637 unloaded -= 1; 638 if (unloaded === 0) { 639 callback(images); 640 } 641 }); 642 }); 643 }, 644 645 // Description: 646 // Returns a random, alphanumeric string 647 // 648 // Arguments: 649 // Length (Integer): Length of string to be generated. Defaults to random 650 // integer. 651 // 652 // Returns: 653 // Rand (String): Pseudo-random, alphanumeric string. 654 random_str : function () { 655 if (!this.fidx) { 656 this.fidx = 0; 657 } 658 this.prefix = this.prefix || [(this.name || 'F'), (+new Date).toString(36)].join('-'); 659 660 return this.prefix + (this.fidx++).toString(36); 661 }, 662 663 // Description: 664 // Helper for window.matchMedia 665 // 666 // Arguments: 667 // mq (String): Media query 668 // 669 // Returns: 670 // (Boolean): Whether the media query passes or not 671 match : function (mq) { 672 return window.matchMedia(mq).matches; 673 }, 674 675 // Description: 676 // Helpers for checking Foundation default media queries with JS 677 // 678 // Returns: 679 // (Boolean): Whether the media query passes or not 680 681 is_small_up : function () { 682 return this.match(Foundation.media_queries.small); 683 }, 684 685 is_medium_up : function () { 686 return this.match(Foundation.media_queries.medium); 687 }, 688 689 is_large_up : function () { 690 return this.match(Foundation.media_queries.large); 691 }, 692 693 is_xlarge_up : function () { 694 return this.match(Foundation.media_queries.xlarge); 695 }, 696 697 is_xxlarge_up : function () { 698 return this.match(Foundation.media_queries.xxlarge); 699 }, 700 701 is_small_only : function () { 702 return !this.is_medium_up() && !this.is_large_up() && !this.is_xlarge_up() && !this.is_xxlarge_up(); 703 }, 704 705 is_medium_only : function () { 706 return this.is_medium_up() && !this.is_large_up() && !this.is_xlarge_up() && !this.is_xxlarge_up(); 707 }, 708 709 is_large_only : function () { 710 return this.is_medium_up() && this.is_large_up() && !this.is_xlarge_up() && !this.is_xxlarge_up(); 711 }, 712 713 is_xlarge_only : function () { 714 return this.is_medium_up() && this.is_large_up() && this.is_xlarge_up() && !this.is_xxlarge_up(); 715 }, 716 717 is_xxlarge_only : function () { 718 return this.is_medium_up() && this.is_large_up() && this.is_xlarge_up() && this.is_xxlarge_up(); 719 } 720 } 721 }; 722 723 $.fn.foundation = function () { 724 var args = Array.prototype.slice.call(arguments, 0); 725 726 return this.each(function () {
727 Foundation.init.apply(Foundation, [this].concat(args)); 728 return this; 729 }); 730 }; 731 732}(jQuery, window, window.document));
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.