mirror of
				https://github.com/MinimalBible/MinimalBible.github.io
				synced 2025-11-04 02:20:33 -05:00 
			
		
		
		
	Engage!
This commit is contained in:
		
							
								
								
									
										1114
									
								
								assets/js/main.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1114
									
								
								assets/js/main.js
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										5
									
								
								assets/js/vendor/jquery-1.9.1.min.js
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										5
									
								
								assets/js/vendor/jquery-1.9.1.min.js
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							
							
								
								
									
										252
									
								
								assets/js/vendor/jquery.dlmenu.js
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										252
									
								
								assets/js/vendor/jquery.dlmenu.js
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@ -0,0 +1,252 @@
 | 
			
		||||
/**
 | 
			
		||||
 * jquery.dlmenu.js v1.0.1
 | 
			
		||||
 * http://www.codrops.com
 | 
			
		||||
 *
 | 
			
		||||
 * Licensed under the MIT license.
 | 
			
		||||
 * http://www.opensource.org/licenses/mit-license.php
 | 
			
		||||
 * 
 | 
			
		||||
 * Copyright 2013, Codrops
 | 
			
		||||
 * http://www.codrops.com
 | 
			
		||||
 */
 | 
			
		||||
;( function( $, window, undefined ) {
 | 
			
		||||
 | 
			
		||||
	'use strict';
 | 
			
		||||
 | 
			
		||||
	// global
 | 
			
		||||
	var Modernizr = window.Modernizr, $body = $( 'body' );
 | 
			
		||||
 | 
			
		||||
	$.DLMenu = function( options, element ) {
 | 
			
		||||
		this.$el = $( element );
 | 
			
		||||
		this._init( options );
 | 
			
		||||
	};
 | 
			
		||||
 | 
			
		||||
	// the options
 | 
			
		||||
	$.DLMenu.defaults = {
 | 
			
		||||
		// classes for the animation effects
 | 
			
		||||
		animationClasses : { classin : 'dl-animate-in-1', classout : 'dl-animate-out-1' },
 | 
			
		||||
		// callback: click a link that has a sub menu
 | 
			
		||||
		// el is the link element (li); name is the level name
 | 
			
		||||
		onLevelClick : function( el, name ) { return false; },
 | 
			
		||||
		// callback: click a link that does not have a sub menu
 | 
			
		||||
		// el is the link element (li); ev is the event obj
 | 
			
		||||
		onLinkClick : function( el, ev ) { return false; }
 | 
			
		||||
	};
 | 
			
		||||
 | 
			
		||||
	$.DLMenu.prototype = {
 | 
			
		||||
		_init : function( options ) {
 | 
			
		||||
 | 
			
		||||
			// options
 | 
			
		||||
			this.options = $.extend( true, {}, $.DLMenu.defaults, options );
 | 
			
		||||
			// cache some elements and initialize some variables
 | 
			
		||||
			this._config();
 | 
			
		||||
			
 | 
			
		||||
			var animEndEventNames = {
 | 
			
		||||
					'WebkitAnimation' : 'webkitAnimationEnd',
 | 
			
		||||
					'OAnimation' : 'oAnimationEnd',
 | 
			
		||||
					'msAnimation' : 'MSAnimationEnd',
 | 
			
		||||
					'animation' : 'animationend'
 | 
			
		||||
				},
 | 
			
		||||
				transEndEventNames = {
 | 
			
		||||
					'WebkitTransition' : 'webkitTransitionEnd',
 | 
			
		||||
					'MozTransition' : 'transitionend',
 | 
			
		||||
					'OTransition' : 'oTransitionEnd',
 | 
			
		||||
					'msTransition' : 'MSTransitionEnd',
 | 
			
		||||
					'transition' : 'transitionend'
 | 
			
		||||
				};
 | 
			
		||||
			// animation end event name
 | 
			
		||||
			this.animEndEventName = animEndEventNames[ Modernizr.prefixed( 'animation' ) ] + '.dlmenu';
 | 
			
		||||
			// transition end event name
 | 
			
		||||
			this.transEndEventName = transEndEventNames[ Modernizr.prefixed( 'transition' ) ] + '.dlmenu',
 | 
			
		||||
			// support for css animations and css transitions
 | 
			
		||||
			this.supportAnimations = Modernizr.cssanimations,
 | 
			
		||||
			this.supportTransitions = Modernizr.csstransitions;
 | 
			
		||||
 | 
			
		||||
			this._initEvents();
 | 
			
		||||
 | 
			
		||||
		},
 | 
			
		||||
		_config : function() {
 | 
			
		||||
			this.open = false;
 | 
			
		||||
			this.$trigger = this.$el.children( '.dl-trigger' );
 | 
			
		||||
			this.$menu = this.$el.children( 'ul.dl-menu' );
 | 
			
		||||
			this.$menuitems = this.$menu.find( 'li:not(.dl-back)' );
 | 
			
		||||
			this.$el.find( 'ul.dl-submenu' ).prepend( '<li class="dl-back"><a href="#">back</a></li>' );
 | 
			
		||||
			this.$back = this.$menu.find( 'li.dl-back' );
 | 
			
		||||
		},
 | 
			
		||||
		_initEvents : function() {
 | 
			
		||||
 | 
			
		||||
			var self = this;
 | 
			
		||||
 | 
			
		||||
			this.$trigger.on( 'click.dlmenu', function() {
 | 
			
		||||
				
 | 
			
		||||
				if( self.open ) {
 | 
			
		||||
					self._closeMenu();
 | 
			
		||||
				} 
 | 
			
		||||
				else {
 | 
			
		||||
					self._openMenu();
 | 
			
		||||
				}
 | 
			
		||||
				return false;
 | 
			
		||||
 | 
			
		||||
			} );
 | 
			
		||||
 | 
			
		||||
			this.$menuitems.on( 'click.dlmenu', function( event ) {
 | 
			
		||||
				
 | 
			
		||||
				event.stopPropagation();
 | 
			
		||||
 | 
			
		||||
				var $item = $(this),
 | 
			
		||||
					$submenu = $item.children( 'ul.dl-submenu' );
 | 
			
		||||
 | 
			
		||||
				if( $submenu.length > 0 ) {
 | 
			
		||||
 | 
			
		||||
					var $flyin = $submenu.clone().css( 'opacity', 0 ).insertAfter( self.$menu ),
 | 
			
		||||
						onAnimationEndFn = function() {
 | 
			
		||||
							self.$menu.off( self.animEndEventName ).removeClass( self.options.animationClasses.classout ).addClass( 'dl-subview' );
 | 
			
		||||
							$item.addClass( 'dl-subviewopen' ).parents( '.dl-subviewopen:first' ).removeClass( 'dl-subviewopen' ).addClass( 'dl-subview' );
 | 
			
		||||
							$flyin.remove();
 | 
			
		||||
						};
 | 
			
		||||
 | 
			
		||||
					setTimeout( function() {
 | 
			
		||||
						$flyin.addClass( self.options.animationClasses.classin );
 | 
			
		||||
						self.$menu.addClass( self.options.animationClasses.classout );
 | 
			
		||||
						if( self.supportAnimations ) {
 | 
			
		||||
							self.$menu.on( self.animEndEventName, onAnimationEndFn );
 | 
			
		||||
						}
 | 
			
		||||
						else {
 | 
			
		||||
							onAnimationEndFn.call();
 | 
			
		||||
						}
 | 
			
		||||
 | 
			
		||||
						self.options.onLevelClick( $item, $item.children( 'a:first' ).text() );
 | 
			
		||||
					} );
 | 
			
		||||
 | 
			
		||||
					return false;
 | 
			
		||||
 | 
			
		||||
				}
 | 
			
		||||
				else {
 | 
			
		||||
					self.options.onLinkClick( $item, event );
 | 
			
		||||
				}
 | 
			
		||||
 | 
			
		||||
			} );
 | 
			
		||||
 | 
			
		||||
			this.$back.on( 'click.dlmenu', function( event ) {
 | 
			
		||||
				
 | 
			
		||||
				var $this = $( this ),
 | 
			
		||||
					$submenu = $this.parents( 'ul.dl-submenu:first' ),
 | 
			
		||||
					$item = $submenu.parent(),
 | 
			
		||||
 | 
			
		||||
					$flyin = $submenu.clone().insertAfter( self.$menu );
 | 
			
		||||
 | 
			
		||||
				var onAnimationEndFn = function() {
 | 
			
		||||
					self.$menu.off( self.animEndEventName ).removeClass( self.options.animationClasses.classin );
 | 
			
		||||
					$flyin.remove();
 | 
			
		||||
				};
 | 
			
		||||
 | 
			
		||||
				setTimeout( function() {
 | 
			
		||||
					$flyin.addClass( self.options.animationClasses.classout );
 | 
			
		||||
					self.$menu.addClass( self.options.animationClasses.classin );
 | 
			
		||||
					if( self.supportAnimations ) {
 | 
			
		||||
						self.$menu.on( self.animEndEventName, onAnimationEndFn );
 | 
			
		||||
					}
 | 
			
		||||
					else {
 | 
			
		||||
						onAnimationEndFn.call();
 | 
			
		||||
					}
 | 
			
		||||
 | 
			
		||||
					$item.removeClass( 'dl-subviewopen' );
 | 
			
		||||
					
 | 
			
		||||
					var $subview = $this.parents( '.dl-subview:first' );
 | 
			
		||||
					if( $subview.is( 'li' ) ) {
 | 
			
		||||
						$subview.addClass( 'dl-subviewopen' );
 | 
			
		||||
					}
 | 
			
		||||
					$subview.removeClass( 'dl-subview' );
 | 
			
		||||
				} );
 | 
			
		||||
 | 
			
		||||
				return false;
 | 
			
		||||
 | 
			
		||||
			} );
 | 
			
		||||
			
 | 
			
		||||
		},
 | 
			
		||||
		closeMenu : function() {
 | 
			
		||||
			if( this.open ) {
 | 
			
		||||
				this._closeMenu();
 | 
			
		||||
			}
 | 
			
		||||
		},
 | 
			
		||||
		_closeMenu : function() {
 | 
			
		||||
			var self = this,
 | 
			
		||||
				onTransitionEndFn = function() {
 | 
			
		||||
					self.$menu.off( self.transEndEventName );
 | 
			
		||||
					self._resetMenu();
 | 
			
		||||
				};
 | 
			
		||||
			
 | 
			
		||||
			this.$menu.removeClass( 'dl-menuopen' );
 | 
			
		||||
			this.$menu.addClass( 'dl-menu-toggle' );
 | 
			
		||||
			this.$trigger.removeClass( 'dl-active' );
 | 
			
		||||
			
 | 
			
		||||
			if( this.supportTransitions ) {
 | 
			
		||||
				this.$menu.on( this.transEndEventName, onTransitionEndFn );
 | 
			
		||||
			}
 | 
			
		||||
			else {
 | 
			
		||||
				onTransitionEndFn.call();
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			this.open = false;
 | 
			
		||||
		},
 | 
			
		||||
		openMenu : function() {
 | 
			
		||||
			if( !this.open ) {
 | 
			
		||||
				this._openMenu();
 | 
			
		||||
			}
 | 
			
		||||
		},
 | 
			
		||||
		_openMenu : function() {
 | 
			
		||||
			var self = this;
 | 
			
		||||
			// clicking somewhere else makes the menu close
 | 
			
		||||
			$body.off( 'click' ).on( 'click.dlmenu', function() {
 | 
			
		||||
				self._closeMenu() ;
 | 
			
		||||
			} );
 | 
			
		||||
			this.$menu.addClass( 'dl-menuopen dl-menu-toggle' ).on( this.transEndEventName, function() {
 | 
			
		||||
				$( this ).removeClass( 'dl-menu-toggle' );
 | 
			
		||||
			} );
 | 
			
		||||
			this.$trigger.addClass( 'dl-active' );
 | 
			
		||||
			this.open = true;
 | 
			
		||||
		},
 | 
			
		||||
		// resets the menu to its original state (first level of options)
 | 
			
		||||
		_resetMenu : function() {
 | 
			
		||||
			this.$menu.removeClass( 'dl-subview' );
 | 
			
		||||
			this.$menuitems.removeClass( 'dl-subview dl-subviewopen' );
 | 
			
		||||
		}
 | 
			
		||||
	};
 | 
			
		||||
 | 
			
		||||
	var logError = function( message ) {
 | 
			
		||||
		if ( window.console ) {
 | 
			
		||||
			window.console.error( message );
 | 
			
		||||
		}
 | 
			
		||||
	};
 | 
			
		||||
 | 
			
		||||
	$.fn.dlmenu = function( options ) {
 | 
			
		||||
		if ( typeof options === 'string' ) {
 | 
			
		||||
			var args = Array.prototype.slice.call( arguments, 1 );
 | 
			
		||||
			this.each(function() {
 | 
			
		||||
				var instance = $.data( this, 'dlmenu' );
 | 
			
		||||
				if ( !instance ) {
 | 
			
		||||
					logError( "cannot call methods on dlmenu prior to initialization; " +
 | 
			
		||||
					"attempted to call method '" + options + "'" );
 | 
			
		||||
					return;
 | 
			
		||||
				}
 | 
			
		||||
				if ( !$.isFunction( instance[options] ) || options.charAt(0) === "_" ) {
 | 
			
		||||
					logError( "no such method '" + options + "' for dlmenu instance" );
 | 
			
		||||
					return;
 | 
			
		||||
				}
 | 
			
		||||
				instance[ options ].apply( instance, args );
 | 
			
		||||
			});
 | 
			
		||||
		} 
 | 
			
		||||
		else {
 | 
			
		||||
			this.each(function() {	
 | 
			
		||||
				var instance = $.data( this, 'dlmenu' );
 | 
			
		||||
				if ( instance ) {
 | 
			
		||||
					instance._init();
 | 
			
		||||
				}
 | 
			
		||||
				else {
 | 
			
		||||
					instance = $.data( this, 'dlmenu', new $.DLMenu( options, this ) );
 | 
			
		||||
				}
 | 
			
		||||
			});
 | 
			
		||||
		}
 | 
			
		||||
		return this;
 | 
			
		||||
	};
 | 
			
		||||
 | 
			
		||||
} )( jQuery, window );
 | 
			
		||||
							
								
								
									
										81
									
								
								assets/js/vendor/jquery.fitvids.js
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										81
									
								
								assets/js/vendor/jquery.fitvids.js
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@ -0,0 +1,81 @@
 | 
			
		||||
/*global jQuery */
 | 
			
		||||
/*jshint multistr:true browser:true */
 | 
			
		||||
/*!
 | 
			
		||||
* FitVids 1.0
 | 
			
		||||
*
 | 
			
		||||
* Copyright 2011, Chris Coyier - http://css-tricks.com + Dave Rupert - http://daverupert.com
 | 
			
		||||
* Credit to Thierry Koblentz - http://www.alistapart.com/articles/creating-intrinsic-ratios-for-video/
 | 
			
		||||
* Released under the WTFPL license - http://sam.zoy.org/wtfpl/
 | 
			
		||||
*
 | 
			
		||||
* Date: Thu Sept 01 18:00:00 2011 -0500
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
(function( $ ){
 | 
			
		||||
 | 
			
		||||
  "use strict";
 | 
			
		||||
 | 
			
		||||
  $.fn.fitVids = function( options ) {
 | 
			
		||||
    var settings = {
 | 
			
		||||
      customSelector: null
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    var div = document.createElement('div'),
 | 
			
		||||
        ref = document.getElementsByTagName('base')[0] || document.getElementsByTagName('script')[0];
 | 
			
		||||
 | 
			
		||||
    div.className = 'fit-vids-style';
 | 
			
		||||
    div.innerHTML = '­<style>         \
 | 
			
		||||
      .fluid-width-video-wrapper {        \
 | 
			
		||||
         width: 100%;                     \
 | 
			
		||||
         position: relative;              \
 | 
			
		||||
         padding: 0;                      \
 | 
			
		||||
      }                                   \
 | 
			
		||||
                                          \
 | 
			
		||||
      .fluid-width-video-wrapper iframe,  \
 | 
			
		||||
      .fluid-width-video-wrapper object,  \
 | 
			
		||||
      .fluid-width-video-wrapper embed {  \
 | 
			
		||||
         position: absolute;              \
 | 
			
		||||
         top: 0;                          \
 | 
			
		||||
         left: 0;                         \
 | 
			
		||||
         width: 100%;                     \
 | 
			
		||||
         height: 100%;                    \
 | 
			
		||||
      }                                   \
 | 
			
		||||
    </style>';
 | 
			
		||||
 | 
			
		||||
    ref.parentNode.insertBefore(div,ref);
 | 
			
		||||
 | 
			
		||||
    if ( options ) {
 | 
			
		||||
      $.extend( settings, options );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return this.each(function(){
 | 
			
		||||
      var selectors = [
 | 
			
		||||
        "iframe[src*='player.vimeo.com']",
 | 
			
		||||
        "iframe[src*='www.youtube.com']",
 | 
			
		||||
        "iframe[src*='www.youtube-nocookie.com']",
 | 
			
		||||
        "iframe[src*='www.kickstarter.com']",
 | 
			
		||||
        "object",
 | 
			
		||||
        "embed"
 | 
			
		||||
      ];
 | 
			
		||||
 | 
			
		||||
      if (settings.customSelector) {
 | 
			
		||||
        selectors.push(settings.customSelector);
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      var $allVideos = $(this).find(selectors.join(','));
 | 
			
		||||
 | 
			
		||||
      $allVideos.each(function(){
 | 
			
		||||
        var $this = $(this);
 | 
			
		||||
        if (this.tagName.toLowerCase() === 'embed' && $this.parent('object').length || $this.parent('.fluid-width-video-wrapper').length) { return; }
 | 
			
		||||
        var height = ( this.tagName.toLowerCase() === 'object' || ($this.attr('height') && !isNaN(parseInt($this.attr('height'), 10))) ) ? parseInt($this.attr('height'), 10) : $this.height(),
 | 
			
		||||
            width = !isNaN(parseInt($this.attr('width'), 10)) ? parseInt($this.attr('width'), 10) : $this.width(),
 | 
			
		||||
            aspectRatio = height / width;
 | 
			
		||||
        if(!$this.attr('id')){
 | 
			
		||||
          var videoID = 'fitvid' + Math.floor(Math.random()*999999);
 | 
			
		||||
          $this.attr('id', videoID);
 | 
			
		||||
        }
 | 
			
		||||
        $this.wrap('<div class="fluid-width-video-wrapper"></div>').parent('.fluid-width-video-wrapper').css('padding-top', (aspectRatio * 100)+"%");
 | 
			
		||||
        $this.removeAttr('height').removeAttr('width');
 | 
			
		||||
      });
 | 
			
		||||
    });
 | 
			
		||||
  };
 | 
			
		||||
})( jQuery );
 | 
			
		||||
							
								
								
									
										4
									
								
								assets/js/vendor/modernizr-2.6.2.custom.min.js
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										4
									
								
								assets/js/vendor/modernizr-2.6.2.custom.min.js
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							
							
								
								
									
										342
									
								
								assets/js/vendor/respond.js
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										342
									
								
								assets/js/vendor/respond.js
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@ -0,0 +1,342 @@
 | 
			
		||||
/*! matchMedia() polyfill - Test a CSS media type/query in JS. Authors & copyright (c) 2012: Scott Jehl, Paul Irish, Nicholas Zakas. Dual MIT/BSD license */
 | 
			
		||||
/*! NOTE: If you're already including a window.matchMedia polyfill via Modernizr or otherwise, you don't need this part */
 | 
			
		||||
 | 
			
		||||
window.matchMedia = window.matchMedia || (function( doc, undefined ) {
 | 
			
		||||
 | 
			
		||||
  "use strict";
 | 
			
		||||
 | 
			
		||||
  var bool,
 | 
			
		||||
      docElem = doc.documentElement,
 | 
			
		||||
      refNode = docElem.firstElementChild || docElem.firstChild,
 | 
			
		||||
      // fakeBody required for <FF4 when executed in <head>
 | 
			
		||||
      fakeBody = doc.createElement( "body" ),
 | 
			
		||||
      div = doc.createElement( "div" );
 | 
			
		||||
 | 
			
		||||
  div.id = "mq-test-1";
 | 
			
		||||
  div.style.cssText = "position:absolute;top:-100em";
 | 
			
		||||
  fakeBody.style.background = "none";
 | 
			
		||||
  fakeBody.appendChild(div);
 | 
			
		||||
 | 
			
		||||
  return function(q){
 | 
			
		||||
 | 
			
		||||
    div.innerHTML = "­<style media=\"" + q + "\"> #mq-test-1 { width: 42px; }</style>";
 | 
			
		||||
 | 
			
		||||
    docElem.insertBefore( fakeBody, refNode );
 | 
			
		||||
    bool = div.offsetWidth === 42;
 | 
			
		||||
    docElem.removeChild( fakeBody );
 | 
			
		||||
 | 
			
		||||
    return {
 | 
			
		||||
      matches: bool,
 | 
			
		||||
      media: q
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
}( document ));
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*! Respond.js v1.1.0: min/max-width media query polyfill. (c) Scott Jehl. MIT/GPLv2 Lic. j.mp/respondjs  */
 | 
			
		||||
(function( win ){
 | 
			
		||||
 | 
			
		||||
	"use strict";
 | 
			
		||||
 | 
			
		||||
	//exposed namespace
 | 
			
		||||
	var respond = {};
 | 
			
		||||
	win.respond = respond;
 | 
			
		||||
	
 | 
			
		||||
	//define update even in native-mq-supporting browsers, to avoid errors
 | 
			
		||||
	respond.update = function(){};
 | 
			
		||||
	
 | 
			
		||||
	//expose media query support flag for external use
 | 
			
		||||
	respond.mediaQueriesSupported	= win.matchMedia && win.matchMedia( "only all" ).matches;
 | 
			
		||||
	
 | 
			
		||||
	//if media queries are supported, exit here
 | 
			
		||||
	if( respond.mediaQueriesSupported ){
 | 
			
		||||
		return;
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	//define vars
 | 
			
		||||
	var doc = win.document,
 | 
			
		||||
		docElem = doc.documentElement,
 | 
			
		||||
		mediastyles = [],
 | 
			
		||||
		rules = [],
 | 
			
		||||
		appendedEls = [],
 | 
			
		||||
		parsedSheets = {},
 | 
			
		||||
		resizeThrottle = 30,
 | 
			
		||||
		head = doc.getElementsByTagName( "head" )[0] || docElem,
 | 
			
		||||
		base = doc.getElementsByTagName( "base" )[0],
 | 
			
		||||
		links = head.getElementsByTagName( "link" ),
 | 
			
		||||
		requestQueue = [],
 | 
			
		||||
		
 | 
			
		||||
		//loop stylesheets, send text content to translate
 | 
			
		||||
		ripCSS = function(){
 | 
			
		||||
 | 
			
		||||
			for( var i = 0; i < links.length; i++ ){
 | 
			
		||||
				var sheet = links[ i ],
 | 
			
		||||
				href = sheet.href,
 | 
			
		||||
				media = sheet.media,
 | 
			
		||||
				isCSS = sheet.rel && sheet.rel.toLowerCase() === "stylesheet";
 | 
			
		||||
 | 
			
		||||
				//only links plz and prevent re-parsing
 | 
			
		||||
				if( !!href && isCSS && !parsedSheets[ href ] ){
 | 
			
		||||
					// selectivizr exposes css through the rawCssText expando
 | 
			
		||||
					if (sheet.styleSheet && sheet.styleSheet.rawCssText) {
 | 
			
		||||
						translate( sheet.styleSheet.rawCssText, href, media );
 | 
			
		||||
						parsedSheets[ href ] = true;
 | 
			
		||||
					} else {
 | 
			
		||||
						if( (!/^([a-zA-Z:]*\/\/)/.test( href ) && !base) ||
 | 
			
		||||
							href.replace( RegExp.$1, "" ).split( "/" )[0] === win.location.host ){
 | 
			
		||||
							requestQueue.push( {
 | 
			
		||||
								href: href,
 | 
			
		||||
								media: media
 | 
			
		||||
							} );
 | 
			
		||||
						}
 | 
			
		||||
					}
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
			makeRequests();
 | 
			
		||||
		},
 | 
			
		||||
		
 | 
			
		||||
		//recurse through request queue, get css text
 | 
			
		||||
		makeRequests	= function(){
 | 
			
		||||
			if( requestQueue.length ){
 | 
			
		||||
				var thisRequest = requestQueue.shift();
 | 
			
		||||
				
 | 
			
		||||
				ajax( thisRequest.href, function( styles ){
 | 
			
		||||
					translate( styles, thisRequest.href, thisRequest.media );
 | 
			
		||||
					parsedSheets[ thisRequest.href ] = true;
 | 
			
		||||
 | 
			
		||||
					// by wrapping recursive function call in setTimeout 
 | 
			
		||||
					// we prevent "Stack overflow" error in IE7
 | 
			
		||||
					win.setTimeout(function(){ makeRequests(); },0);
 | 
			
		||||
				} );
 | 
			
		||||
			}
 | 
			
		||||
		},
 | 
			
		||||
		
 | 
			
		||||
		//find media blocks in css text, convert to style blocks
 | 
			
		||||
		translate = function( styles, href, media ){
 | 
			
		||||
			var qs = styles.match(  /@media[^\{]+\{([^\{\}]*\{[^\}\{]*\})+/gi ),
 | 
			
		||||
				ql = qs && qs.length || 0;
 | 
			
		||||
 | 
			
		||||
			//try to get CSS path
 | 
			
		||||
			href = href.substring( 0, href.lastIndexOf( "/" ) );
 | 
			
		||||
 | 
			
		||||
			var repUrls	= function( css ){
 | 
			
		||||
					return css.replace( /(url\()['"]?([^\/\)'"][^:\)'"]+)['"]?(\))/g, "$1" + href + "$2$3" );
 | 
			
		||||
				},
 | 
			
		||||
				useMedia = !ql && media;
 | 
			
		||||
 | 
			
		||||
			//if path exists, tack on trailing slash
 | 
			
		||||
			if( href.length ){ href += "/"; }	
 | 
			
		||||
				
 | 
			
		||||
			//if no internal queries exist, but media attr does, use that	
 | 
			
		||||
			//note: this currently lacks support for situations where a media attr is specified on a link AND
 | 
			
		||||
				//its associated stylesheet has internal CSS media queries.
 | 
			
		||||
				//In those cases, the media attribute will currently be ignored.
 | 
			
		||||
			if( useMedia ){
 | 
			
		||||
				ql = 1;
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			for( var i = 0; i < ql; i++ ){
 | 
			
		||||
				var fullq, thisq, eachq, eql;
 | 
			
		||||
 | 
			
		||||
				//media attr
 | 
			
		||||
				if( useMedia ){
 | 
			
		||||
					fullq = media;
 | 
			
		||||
					rules.push( repUrls( styles ) );
 | 
			
		||||
				}
 | 
			
		||||
				//parse for styles
 | 
			
		||||
				else{
 | 
			
		||||
					fullq = qs[ i ].match( /@media *([^\{]+)\{([\S\s]+?)$/ ) && RegExp.$1;
 | 
			
		||||
					rules.push( RegExp.$2 && repUrls( RegExp.$2 ) );
 | 
			
		||||
				}
 | 
			
		||||
				
 | 
			
		||||
				eachq = fullq.split( "," );
 | 
			
		||||
				eql	= eachq.length;
 | 
			
		||||
					
 | 
			
		||||
				for( var j = 0; j < eql; j++ ){
 | 
			
		||||
					thisq = eachq[ j ];
 | 
			
		||||
					mediastyles.push( { 
 | 
			
		||||
						media : thisq.split( "(" )[ 0 ].match( /(only\s+)?([a-zA-Z]+)\s?/ ) && RegExp.$2 || "all",
 | 
			
		||||
						rules : rules.length - 1,
 | 
			
		||||
						hasquery : thisq.indexOf("(") > -1,
 | 
			
		||||
						minw : thisq.match( /\(\s*min\-width\s*:\s*(\s*[0-9\.]+)(px|em)\s*\)/ ) && parseFloat( RegExp.$1 ) + ( RegExp.$2 || "" ), 
 | 
			
		||||
						maxw : thisq.match( /\(\s*max\-width\s*:\s*(\s*[0-9\.]+)(px|em)\s*\)/ ) && parseFloat( RegExp.$1 ) + ( RegExp.$2 || "" )
 | 
			
		||||
					} );
 | 
			
		||||
				}	
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			applyMedia();
 | 
			
		||||
		},
 | 
			
		||||
        
 | 
			
		||||
		lastCall,
 | 
			
		||||
		
 | 
			
		||||
		resizeDefer,
 | 
			
		||||
		
 | 
			
		||||
		// returns the value of 1em in pixels
 | 
			
		||||
		getEmValue = function() {
 | 
			
		||||
			var ret,
 | 
			
		||||
				div = doc.createElement('div'),
 | 
			
		||||
				body = doc.body,
 | 
			
		||||
				fakeUsed = false;
 | 
			
		||||
									
 | 
			
		||||
			div.style.cssText = "position:absolute;font-size:1em;width:1em";
 | 
			
		||||
					
 | 
			
		||||
			if( !body ){
 | 
			
		||||
				body = fakeUsed = doc.createElement( "body" );
 | 
			
		||||
				body.style.background = "none";
 | 
			
		||||
			}
 | 
			
		||||
					
 | 
			
		||||
			body.appendChild( div );
 | 
			
		||||
								
 | 
			
		||||
			docElem.insertBefore( body, docElem.firstChild );
 | 
			
		||||
								
 | 
			
		||||
			ret = div.offsetWidth;
 | 
			
		||||
								
 | 
			
		||||
			if( fakeUsed ){
 | 
			
		||||
				docElem.removeChild( body );
 | 
			
		||||
			}
 | 
			
		||||
			else {
 | 
			
		||||
				body.removeChild( div );
 | 
			
		||||
			}
 | 
			
		||||
			
 | 
			
		||||
			//also update eminpx before returning
 | 
			
		||||
			ret = eminpx = parseFloat(ret);
 | 
			
		||||
								
 | 
			
		||||
			return ret;
 | 
			
		||||
		},
 | 
			
		||||
		
 | 
			
		||||
		//cached container for 1em value, populated the first time it's needed 
 | 
			
		||||
		eminpx,
 | 
			
		||||
		
 | 
			
		||||
		//enable/disable styles
 | 
			
		||||
		applyMedia = function( fromResize ){
 | 
			
		||||
			var name = "clientWidth",
 | 
			
		||||
				docElemProp = docElem[ name ],
 | 
			
		||||
				currWidth = doc.compatMode === "CSS1Compat" && docElemProp || doc.body[ name ] || docElemProp,
 | 
			
		||||
				styleBlocks	= {},
 | 
			
		||||
				lastLink = links[ links.length-1 ],
 | 
			
		||||
				now = (new Date()).getTime();
 | 
			
		||||
 | 
			
		||||
			//throttle resize calls	
 | 
			
		||||
			if( fromResize && lastCall && now - lastCall < resizeThrottle ){
 | 
			
		||||
				win.clearTimeout( resizeDefer );
 | 
			
		||||
				resizeDefer = win.setTimeout( applyMedia, resizeThrottle );
 | 
			
		||||
				return;
 | 
			
		||||
			}
 | 
			
		||||
			else {
 | 
			
		||||
				lastCall = now;
 | 
			
		||||
			}
 | 
			
		||||
										
 | 
			
		||||
			for( var i in mediastyles ){
 | 
			
		||||
				if( mediastyles.hasOwnProperty( i ) ){
 | 
			
		||||
					var thisstyle = mediastyles[ i ],
 | 
			
		||||
						min = thisstyle.minw,
 | 
			
		||||
						max = thisstyle.maxw,
 | 
			
		||||
						minnull = min === null,
 | 
			
		||||
						maxnull = max === null,
 | 
			
		||||
						em = "em";
 | 
			
		||||
					
 | 
			
		||||
					if( !!min ){
 | 
			
		||||
						min = parseFloat( min ) * ( min.indexOf( em ) > -1 ? ( eminpx || getEmValue() ) : 1 );
 | 
			
		||||
					}
 | 
			
		||||
					if( !!max ){
 | 
			
		||||
						max = parseFloat( max ) * ( max.indexOf( em ) > -1 ? ( eminpx || getEmValue() ) : 1 );
 | 
			
		||||
					}
 | 
			
		||||
					
 | 
			
		||||
					// if there's no media query at all (the () part), or min or max is not null, and if either is present, they're true
 | 
			
		||||
					if( !thisstyle.hasquery || ( !minnull || !maxnull ) && ( minnull || currWidth >= min ) && ( maxnull || currWidth <= max ) ){
 | 
			
		||||
						if( !styleBlocks[ thisstyle.media ] ){
 | 
			
		||||
							styleBlocks[ thisstyle.media ] = [];
 | 
			
		||||
						}
 | 
			
		||||
						styleBlocks[ thisstyle.media ].push( rules[ thisstyle.rules ] );
 | 
			
		||||
					}
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
			
 | 
			
		||||
			//remove any existing respond style element(s)
 | 
			
		||||
			for( var j in appendedEls ){
 | 
			
		||||
				if( appendedEls.hasOwnProperty( j ) ){
 | 
			
		||||
					if( appendedEls[ j ] && appendedEls[ j ].parentNode === head ){
 | 
			
		||||
						head.removeChild( appendedEls[ j ] );
 | 
			
		||||
					}
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
			
 | 
			
		||||
			//inject active styles, grouped by media type
 | 
			
		||||
			for( var k in styleBlocks ){
 | 
			
		||||
				if( styleBlocks.hasOwnProperty( k ) ){
 | 
			
		||||
					var ss = doc.createElement( "style" ),
 | 
			
		||||
						css = styleBlocks[ k ].join( "\n" );
 | 
			
		||||
					
 | 
			
		||||
					ss.type = "text/css";	
 | 
			
		||||
					ss.media = k;
 | 
			
		||||
					
 | 
			
		||||
					//originally, ss was appended to a documentFragment and sheets were appended in bulk.
 | 
			
		||||
					//this caused crashes in IE in a number of circumstances, such as when the HTML element had a bg image set, so appending beforehand seems best. Thanks to @dvelyk for the initial research on this one!
 | 
			
		||||
					head.insertBefore( ss, lastLink.nextSibling );
 | 
			
		||||
					
 | 
			
		||||
					if ( ss.styleSheet ){ 
 | 
			
		||||
						ss.styleSheet.cssText = css;
 | 
			
		||||
					}
 | 
			
		||||
					else {
 | 
			
		||||
						ss.appendChild( doc.createTextNode( css ) );
 | 
			
		||||
					}
 | 
			
		||||
 | 
			
		||||
					//push to appendedEls to track for later removal
 | 
			
		||||
					appendedEls.push( ss );
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
		},
 | 
			
		||||
		//tweaked Ajax functions from Quirksmode
 | 
			
		||||
		ajax = function( url, callback ) {
 | 
			
		||||
			var req = xmlHttp();
 | 
			
		||||
			if (!req){
 | 
			
		||||
				return;
 | 
			
		||||
			}	
 | 
			
		||||
			req.open( "GET", url, true );
 | 
			
		||||
			req.onreadystatechange = function () {
 | 
			
		||||
				if ( req.readyState !== 4 || req.status !== 200 && req.status !== 304 ){
 | 
			
		||||
					return;
 | 
			
		||||
				}
 | 
			
		||||
				callback( req.responseText );
 | 
			
		||||
			};
 | 
			
		||||
			if ( req.readyState === 4 ){
 | 
			
		||||
				return;
 | 
			
		||||
			}
 | 
			
		||||
			req.send( null );
 | 
			
		||||
		},
 | 
			
		||||
		//define ajax obj 
 | 
			
		||||
		xmlHttp = (function() {
 | 
			
		||||
			var xmlhttpmethod = false;	
 | 
			
		||||
			try {
 | 
			
		||||
				xmlhttpmethod = new win.XMLHttpRequest();
 | 
			
		||||
			}
 | 
			
		||||
			catch( e ){
 | 
			
		||||
				xmlhttpmethod = new win.ActiveXObject( "Microsoft.XMLHTTP" );
 | 
			
		||||
			}
 | 
			
		||||
			return function(){
 | 
			
		||||
				return xmlhttpmethod;
 | 
			
		||||
			};
 | 
			
		||||
		})();
 | 
			
		||||
	
 | 
			
		||||
	//translate CSS
 | 
			
		||||
	ripCSS();
 | 
			
		||||
	
 | 
			
		||||
	//expose update for re-running respond later on
 | 
			
		||||
	respond.update = ripCSS;
 | 
			
		||||
	
 | 
			
		||||
	//adjust on resize
 | 
			
		||||
	function callMedia(){
 | 
			
		||||
		applyMedia( true );
 | 
			
		||||
	}
 | 
			
		||||
	if( win.addEventListener ){
 | 
			
		||||
		win.addEventListener( "resize", callMedia, false );
 | 
			
		||||
	}
 | 
			
		||||
	else if( win.attachEvent ){
 | 
			
		||||
		win.attachEvent( "onresize", callMedia );
 | 
			
		||||
	}
 | 
			
		||||
})(this);
 | 
			
		||||
		Reference in New Issue
	
	Block a user