/* loadCSS: load a CSS file asynchronously. [c]2015 @scottjehl, Filament Group, Inc. Licensed MIT */ (function(w){

"use strict";
/* exported loadCSS */
w.loadCSS = function( href, before, media ){
  // Arguments explained:
  // `href` [REQUIRED] is the URL for your CSS file.
  // `before` [OPTIONAL] is the element the script should use as a reference for injecting our stylesheet <link> before
    // By default, loadCSS attempts to inject the link after the last stylesheet or script in the DOM. However, you might desire a more specific location in your document.
  // `media` [OPTIONAL] is the media type or query of the stylesheet. By default it will be 'all'
  var ss = w.document.createElement( "link" );
  var ref;
  if( before ){
    ref = before;
  }
  else if( w.document.querySelectorAll ){
    var refs = w.document.querySelectorAll(  "style,link[rel=stylesheet],script" );
    // No need to check length. This script has a parent element, at least
    ref = refs[ refs.length - 1];
  }
  else {
    ref = w.document.getElementsByTagName( "script" )[ 0 ];
  }

  var sheets = w.document.styleSheets;
  ss.rel = "stylesheet";
  ss.href = href;
  // temporarily set media to something inapplicable to ensure it'll fetch without blocking render
  ss.media = "only x";

  // Inject link
    // Note: the ternary preserves the existing behavior of "before" argument, but we could choose to change the argument to "after" in a later release and standardize on ref.nextSibling for all refs
    // Note: `insertBefore` is used instead of `appendChild`, for safety re: http://www.paulirish.com/2011/surefire-dom-element-insertion/
  ref.parentNode.insertBefore( ss, ( before ? ref : ref.nextSibling ) );
  // A method (exposed on return object for external use) that mimics onload by polling until document.styleSheets until it includes the new sheet.
  ss.onloadcssdefined = function( cb ){
    var defined;
    for( var i = 0; i < sheets.length; i++ ){
      if( sheets[ i ].href && sheets[ i ].href === ss.href ){
        defined = true;
      }
    }
    if( defined ){
      cb();
    } else {
      setTimeout(function() {
        ss.onloadcssdefined( cb );
      });
    }
  };

  // once loaded, set link's media back to `all` so that the stylesheet applies once it loads
  ss.onloadcssdefined(function() {
    ss.media = media || "all";
  });
  return ss;
};

}(this));