[ Index ]

PHP Cross Reference of moodle-2.8

title

Body

[close]

/theme/bootstrapbase/javascript/ -> html5shiv.js (source)

   1  /**
   2  * @preserve HTML5 Shiv v3.6.2 | @afarkas @jdalton @jon_neal @rem | MIT/GPL2 Licensed
   3  */
   4  ;(function(window, document) {
   5  /*jshint evil:true */
   6    /** version */
   7    var version = '3.6.2';
   8  
   9    /** Preset options */
  10    var options = window.html5 || {};
  11  
  12    /** Used to skip problem elements */
  13    var reSkip = /^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i;
  14  
  15    /** Not all elements can be cloned in IE **/
  16    var saveClones = /^(?:a|b|code|div|fieldset|h1|h2|h3|h4|h5|h6|i|label|li|ol|p|q|span|strong|style|table|tbody|td|th|tr|ul)$/i;
  17  
  18    /** Detect whether the browser supports default html5 styles */
  19    var supportsHtml5Styles;
  20  
  21    /** Name of the expando, to work with multiple documents or to re-shiv one document */
  22    var expando = '_html5shiv';
  23  
  24    /** The id for the the documents expando */
  25    var expanID = 0;
  26  
  27    /** Cached data for each document */
  28    var expandoData = {};
  29  
  30    /** Detect whether the browser supports unknown elements */
  31    var supportsUnknownElements;
  32  
  33    (function() {
  34      try {
  35          var a = document.createElement('a');
  36          a.innerHTML = '<xyz></xyz>';
  37          //if the hidden property is implemented we can assume, that the browser supports basic HTML5 Styles
  38          supportsHtml5Styles = ('hidden' in a);
  39  
  40          supportsUnknownElements = a.childNodes.length == 1 || (function() {
  41            // assign a false positive if unable to shiv
  42            (document.createElement)('a');
  43            var frag = document.createDocumentFragment();
  44            return (
  45              typeof frag.cloneNode == 'undefined' ||
  46              typeof frag.createDocumentFragment == 'undefined' ||
  47              typeof frag.createElement == 'undefined'
  48            );
  49          }());
  50      } catch(e) {
  51        // assign a false positive if detection fails => unable to shiv
  52        supportsHtml5Styles = true;
  53        supportsUnknownElements = true;
  54      }
  55  
  56    }());
  57  
  58    /*--------------------------------------------------------------------------*/
  59  
  60    /**
  61     * Creates a style sheet with the given CSS text and adds it to the document.
  62     * @private
  63     * @param {Document} ownerDocument The document.
  64     * @param {String} cssText The CSS text.
  65     * @returns {StyleSheet} The style element.
  66     */
  67    function addStyleSheet(ownerDocument, cssText) {
  68      var p = ownerDocument.createElement('p'),
  69          parent = ownerDocument.getElementsByTagName('head')[0] || ownerDocument.documentElement;
  70  
  71      p.innerHTML = 'x<style>' + cssText + '</style>';
  72      return parent.insertBefore(p.lastChild, parent.firstChild);
  73    }
  74  
  75    /**
  76     * Returns the value of `html5.elements` as an array.
  77     * @private
  78     * @returns {Array} An array of shived element node names.
  79     */
  80    function getElements() {
  81      var elements = html5.elements;
  82      return typeof elements == 'string' ? elements.split(' ') : elements;
  83    }
  84  
  85      /**
  86     * Returns the data associated to the given document
  87     * @private
  88     * @param {Document} ownerDocument The document.
  89     * @returns {Object} An object of data.
  90     */
  91    function getExpandoData(ownerDocument) {
  92      var data = expandoData[ownerDocument[expando]];
  93      if (!data) {
  94          data = {};
  95          expanID++;
  96          ownerDocument[expando] = expanID;
  97          expandoData[expanID] = data;
  98      }
  99      return data;
 100    }
 101  
 102    /**
 103     * returns a shived element for the given nodeName and document
 104     * @memberOf html5
 105     * @param {String} nodeName name of the element
 106     * @param {Document} ownerDocument The context document.
 107     * @returns {Object} The shived element.
 108     */
 109    function createElement(nodeName, ownerDocument, data){
 110      if (!ownerDocument) {
 111          ownerDocument = document;
 112      }
 113      if(supportsUnknownElements){
 114          return ownerDocument.createElement(nodeName);
 115      }
 116      if (!data) {
 117          data = getExpandoData(ownerDocument);
 118      }
 119      var node;
 120  
 121      if (data.cache[nodeName]) {
 122          node = data.cache[nodeName].cloneNode();
 123      } else if (saveClones.test(nodeName)) {
 124          node = (data.cache[nodeName] = data.createElem(nodeName)).cloneNode();
 125      } else {
 126          node = data.createElem(nodeName);
 127      }
 128  
 129      // Avoid adding some elements to fragments in IE < 9 because
 130      // * Attributes like `name` or `type` cannot be set/changed once an element
 131      //   is inserted into a document/fragment
 132      // * Link elements with `src` attributes that are inaccessible, as with
 133      //   a 403 response, will cause the tab/window to crash
 134      // * Script elements appended to fragments will execute when their `src`
 135      //   or `text` property is set
 136      return node.canHaveChildren && !reSkip.test(nodeName) ? data.frag.appendChild(node) : node;
 137    }
 138  
 139    /**
 140     * returns a shived DocumentFragment for the given document
 141     * @memberOf html5
 142     * @param {Document} ownerDocument The context document.
 143     * @returns {Object} The shived DocumentFragment.
 144     */
 145    function createDocumentFragment(ownerDocument, data){
 146      if (!ownerDocument) {
 147          ownerDocument = document;
 148      }
 149      if(supportsUnknownElements){
 150          return ownerDocument.createDocumentFragment();
 151      }
 152      data = data || getExpandoData(ownerDocument);
 153      var clone = data.frag.cloneNode(),
 154          i = 0,
 155          elems = getElements(),
 156          l = elems.length;
 157      for(;i<l;i++){
 158          clone.createElement(elems[i]);
 159      }
 160      return clone;
 161    }
 162  
 163    /**
 164     * Shivs the `createElement` and `createDocumentFragment` methods of the document.
 165     * @private
 166     * @param {Document|DocumentFragment} ownerDocument The document.
 167     * @param {Object} data of the document.
 168     */
 169    function shivMethods(ownerDocument, data) {
 170      if (!data.cache) {
 171          data.cache = {};
 172          data.createElem = ownerDocument.createElement;
 173          data.createFrag = ownerDocument.createDocumentFragment;
 174          data.frag = data.createFrag();
 175      }
 176  
 177  
 178      ownerDocument.createElement = function(nodeName) {
 179        //abort shiv
 180        if (!html5.shivMethods) {
 181            return data.createElem(nodeName);
 182        }
 183        return createElement(nodeName, ownerDocument, data);
 184      };
 185  
 186      ownerDocument.createDocumentFragment = Function('h,f', 'return function(){' +
 187        'var n=f.cloneNode(),c=n.createElement;' +
 188        'h.shivMethods&&(' +
 189          // unroll the `createElement` calls
 190          getElements().join().replace(/\w+/g, function(nodeName) {
 191            data.createElem(nodeName);
 192            data.frag.createElement(nodeName);
 193            return 'c("' + nodeName + '")';
 194          }) +
 195        ');return n}'
 196      )(html5, data.frag);
 197    }
 198  
 199    /*--------------------------------------------------------------------------*/
 200  
 201    /**
 202     * Shivs the given document.
 203     * @memberOf html5
 204     * @param {Document} ownerDocument The document to shiv.
 205     * @returns {Document} The shived document.
 206     */
 207    function shivDocument(ownerDocument) {
 208      if (!ownerDocument) {
 209          ownerDocument = document;
 210      }
 211      var data = getExpandoData(ownerDocument);
 212  
 213      if (html5.shivCSS && !supportsHtml5Styles && !data.hasCSS) {
 214        data.hasCSS = !!addStyleSheet(ownerDocument,
 215          // corrects block display not defined in IE6/7/8/9
 216          'article,aside,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}' +
 217          // adds styling not present in IE6/7/8/9
 218          'mark{background:#FF0;color:#000}' +
 219          // hides non-rendered elements
 220          'template{display:none}'
 221        );
 222      }
 223      if (!supportsUnknownElements) {
 224        shivMethods(ownerDocument, data);
 225      }
 226      return ownerDocument;
 227    }
 228  
 229    /*--------------------------------------------------------------------------*/
 230  
 231    /**
 232     * The `html5` object is exposed so that more elements can be shived and
 233     * existing shiving can be detected on iframes.
 234     * @type Object
 235     * @example
 236     *
 237     * // options can be changed before the script is included
 238     * html5 = { 'elements': 'mark section', 'shivCSS': false, 'shivMethods': false };
 239     */
 240    var html5 = {
 241  
 242      /**
 243       * An array or space separated string of node names of the elements to shiv.
 244       * @memberOf html5
 245       * @type Array|String
 246       */
 247      'elements': options.elements || 'abbr article aside audio bdi canvas data datalist details figcaption figure footer header hgroup main mark meter nav output progress section summary template time video',
 248  
 249      /**
 250       * current version of html5shiv
 251       */
 252      'version': version,
 253  
 254      /**
 255       * A flag to indicate that the HTML5 style sheet should be inserted.
 256       * @memberOf html5
 257       * @type Boolean
 258       */
 259      'shivCSS': (options.shivCSS !== false),
 260  
 261      /**
 262       * Is equal to true if a browser supports creating unknown/HTML5 elements
 263       * @memberOf html5
 264       * @type boolean
 265       */
 266      'supportsUnknownElements': supportsUnknownElements,
 267  
 268      /**
 269       * A flag to indicate that the document's `createElement` and `createDocumentFragment`
 270       * methods should be overwritten.
 271       * @memberOf html5
 272       * @type Boolean
 273       */
 274      'shivMethods': (options.shivMethods !== false),
 275  
 276      /**
 277       * A string to describe the type of `html5` object ("default" or "default print").
 278       * @memberOf html5
 279       * @type String
 280       */
 281      'type': 'default',
 282  
 283      // shivs the document according to the specified `html5` object options
 284      'shivDocument': shivDocument,
 285  
 286      //creates a shived element
 287      createElement: createElement,
 288  
 289      //creates a shived documentFragment
 290      createDocumentFragment: createDocumentFragment
 291    };
 292  
 293    /*--------------------------------------------------------------------------*/
 294  
 295    // expose html5
 296    window.html5 = html5;
 297  
 298    // shiv the document
 299    shivDocument(document);
 300  
 301  }(this, document));


Generated: Fri Nov 28 20:29:05 2014 Cross-referenced by PHPXref 0.7.1