Projet

Général

Profil

Paste
Télécharger (15,8 ko) Statistiques
| Branche: | Révision:

root / drupal7 / sites / all / themes / adaptivetheme / at_core / scripts / html5.js @ a08833bd

1
/**
2
* @preserve HTML5 Shiv 3.7.2 | @afarkas @jdalton @jon_neal @rem | MIT/GPL2 Licensed
3
*/
4
;(function(window, document) {
5
/*jshint evil:true */
6
  /** version */
7
  var version = '3.7.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
   * Extends the built-in list of html5 elements
87
   * @memberOf html5
88
   * @param {String|Array} newElements whitespace separated list or array of new element names to shiv
89
   * @param {Document} ownerDocument The context document.
90
   */
91
  function addElements(newElements, ownerDocument) {
92
    var elements = html5.elements;
93
    if(typeof elements != 'string'){
94
      elements = elements.join(' ');
95
    }
96
    if(typeof newElements != 'string'){
97
      newElements = newElements.join(' ');
98
    }
99
    html5.elements = elements +' '+ newElements;
100
    shivDocument(ownerDocument);
101
  }
102

    
103
    /**
104
   * Returns the data associated to the given document
105
   * @private
106
   * @param {Document} ownerDocument The document.
107
   * @returns {Object} An object of data.
108
   */
109
  function getExpandoData(ownerDocument) {
110
    var data = expandoData[ownerDocument[expando]];
111
    if (!data) {
112
        data = {};
113
        expanID++;
114
        ownerDocument[expando] = expanID;
115
        expandoData[expanID] = data;
116
    }
117
    return data;
118
  }
119

    
120
  /**
121
   * returns a shived element for the given nodeName and document
122
   * @memberOf html5
123
   * @param {String} nodeName name of the element
124
   * @param {Document} ownerDocument The context document.
125
   * @returns {Object} The shived element.
126
   */
127
  function createElement(nodeName, ownerDocument, data){
128
    if (!ownerDocument) {
129
        ownerDocument = document;
130
    }
131
    if(supportsUnknownElements){
132
        return ownerDocument.createElement(nodeName);
133
    }
134
    if (!data) {
135
        data = getExpandoData(ownerDocument);
136
    }
137
    var node;
138

    
139
    if (data.cache[nodeName]) {
140
        node = data.cache[nodeName].cloneNode();
141
    } else if (saveClones.test(nodeName)) {
142
        node = (data.cache[nodeName] = data.createElem(nodeName)).cloneNode();
143
    } else {
144
        node = data.createElem(nodeName);
145
    }
146

    
147
    // Avoid adding some elements to fragments in IE < 9 because
148
    // * Attributes like `name` or `type` cannot be set/changed once an element
149
    //   is inserted into a document/fragment
150
    // * Link elements with `src` attributes that are inaccessible, as with
151
    //   a 403 response, will cause the tab/window to crash
152
    // * Script elements appended to fragments will execute when their `src`
153
    //   or `text` property is set
154
    return node.canHaveChildren && !reSkip.test(nodeName) && !node.tagUrn ? data.frag.appendChild(node) : node;
155
  }
156

    
157
  /**
158
   * returns a shived DocumentFragment for the given document
159
   * @memberOf html5
160
   * @param {Document} ownerDocument The context document.
161
   * @returns {Object} The shived DocumentFragment.
162
   */
163
  function createDocumentFragment(ownerDocument, data){
164
    if (!ownerDocument) {
165
        ownerDocument = document;
166
    }
167
    if(supportsUnknownElements){
168
        return ownerDocument.createDocumentFragment();
169
    }
170
    data = data || getExpandoData(ownerDocument);
171
    var clone = data.frag.cloneNode(),
172
        i = 0,
173
        elems = getElements(),
174
        l = elems.length;
175
    for(;i<l;i++){
176
        clone.createElement(elems[i]);
177
    }
178
    return clone;
179
  }
180

    
181
  /**
182
   * Shivs the `createElement` and `createDocumentFragment` methods of the document.
183
   * @private
184
   * @param {Document|DocumentFragment} ownerDocument The document.
185
   * @param {Object} data of the document.
186
   */
187
  function shivMethods(ownerDocument, data) {
188
    if (!data.cache) {
189
        data.cache = {};
190
        data.createElem = ownerDocument.createElement;
191
        data.createFrag = ownerDocument.createDocumentFragment;
192
        data.frag = data.createFrag();
193
    }
194

    
195

    
196
    ownerDocument.createElement = function(nodeName) {
197
      //abort shiv
198
      if (!html5.shivMethods) {
199
          return data.createElem(nodeName);
200
      }
201
      return createElement(nodeName, ownerDocument, data);
202
    };
203

    
204
    ownerDocument.createDocumentFragment = Function('h,f', 'return function(){' +
205
      'var n=f.cloneNode(),c=n.createElement;' +
206
      'h.shivMethods&&(' +
207
        // unroll the `createElement` calls
208
        getElements().join().replace(/[\w\-:]+/g, function(nodeName) {
209
          data.createElem(nodeName);
210
          data.frag.createElement(nodeName);
211
          return 'c("' + nodeName + '")';
212
        }) +
213
      ');return n}'
214
    )(html5, data.frag);
215
  }
216

    
217
  /*--------------------------------------------------------------------------*/
218

    
219
  /**
220
   * Shivs the given document.
221
   * @memberOf html5
222
   * @param {Document} ownerDocument The document to shiv.
223
   * @returns {Document} The shived document.
224
   */
225
  function shivDocument(ownerDocument) {
226
    if (!ownerDocument) {
227
        ownerDocument = document;
228
    }
229
    var data = getExpandoData(ownerDocument);
230

    
231
    if (html5.shivCSS && !supportsHtml5Styles && !data.hasCSS) {
232
      data.hasCSS = !!addStyleSheet(ownerDocument,
233
        // corrects block display not defined in IE6/7/8/9
234
        'article,aside,dialog,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}' +
235
        // adds styling not present in IE6/7/8/9
236
        'mark{background:#FF0;color:#000}' +
237
        // hides non-rendered elements
238
        'template{display:none}'
239
      );
240
    }
241
    if (!supportsUnknownElements) {
242
      shivMethods(ownerDocument, data);
243
    }
244
    return ownerDocument;
245
  }
246

    
247
  /*--------------------------------------------------------------------------*/
248

    
249
  /**
250
   * The `html5` object is exposed so that more elements can be shived and
251
   * existing shiving can be detected on iframes.
252
   * @type Object
253
   * @example
254
   *
255
   * // options can be changed before the script is included
256
   * html5 = { 'elements': 'mark section', 'shivCSS': false, 'shivMethods': false };
257
   */
258
  var html5 = {
259

    
260
    /**
261
     * An array or space separated string of node names of the elements to shiv.
262
     * @memberOf html5
263
     * @type Array|String
264
     */
265
    'elements': options.elements || 'abbr article aside audio bdi canvas data datalist details dialog figcaption figure footer header hgroup main mark meter nav output picture progress section summary template time video',
266

    
267
    /**
268
     * current version of html5shiv
269
     */
270
    'version': version,
271

    
272
    /**
273
     * A flag to indicate that the HTML5 style sheet should be inserted.
274
     * @memberOf html5
275
     * @type Boolean
276
     */
277
    'shivCSS': (options.shivCSS !== false),
278

    
279
    /**
280
     * Is equal to true if a browser supports creating unknown/HTML5 elements
281
     * @memberOf html5
282
     * @type boolean
283
     */
284
    'supportsUnknownElements': supportsUnknownElements,
285

    
286
    /**
287
     * A flag to indicate that the document's `createElement` and `createDocumentFragment`
288
     * methods should be overwritten.
289
     * @memberOf html5
290
     * @type Boolean
291
     */
292
    'shivMethods': (options.shivMethods !== false),
293

    
294
    /**
295
     * A string to describe the type of `html5` object ("default" or "default print").
296
     * @memberOf html5
297
     * @type String
298
     */
299
    'type': 'default',
300

    
301
    // shivs the document according to the specified `html5` object options
302
    'shivDocument': shivDocument,
303

    
304
    //creates a shived element
305
    createElement: createElement,
306

    
307
    //creates a shived documentFragment
308
    createDocumentFragment: createDocumentFragment,
309

    
310
    //extends list of elements
311
    addElements: addElements
312
  };
313

    
314
  /*--------------------------------------------------------------------------*/
315

    
316
  // expose html5
317
  window.html5 = html5;
318

    
319
  // shiv the document
320
  shivDocument(document);
321

    
322
  /*------------------------------- Print Shiv -------------------------------*/
323

    
324
  /** Used to filter media types */
325
  var reMedia = /^$|\b(?:all|print)\b/;
326

    
327
  /** Used to namespace printable elements */
328
  var shivNamespace = 'html5shiv';
329

    
330
  /** Detect whether the browser supports shivable style sheets */
331
  var supportsShivableSheets = !supportsUnknownElements && (function() {
332
    // assign a false negative if unable to shiv
333
    var docEl = document.documentElement;
334
    return !(
335
      typeof document.namespaces == 'undefined' ||
336
      typeof document.parentWindow == 'undefined' ||
337
      typeof docEl.applyElement == 'undefined' ||
338
      typeof docEl.removeNode == 'undefined' ||
339
      typeof window.attachEvent == 'undefined'
340
    );
341
  }());
342

    
343
  /*--------------------------------------------------------------------------*/
344

    
345
  /**
346
   * Wraps all HTML5 elements in the given document with printable elements.
347
   * (eg. the "header" element is wrapped with the "html5shiv:header" element)
348
   * @private
349
   * @param {Document} ownerDocument The document.
350
   * @returns {Array} An array wrappers added.
351
   */
352
  function addWrappers(ownerDocument) {
353
    var node,
354
        nodes = ownerDocument.getElementsByTagName('*'),
355
        index = nodes.length,
356
        reElements = RegExp('^(?:' + getElements().join('|') + ')$', 'i'),
357
        result = [];
358

    
359
    while (index--) {
360
      node = nodes[index];
361
      if (reElements.test(node.nodeName)) {
362
        result.push(node.applyElement(createWrapper(node)));
363
      }
364
    }
365
    return result;
366
  }
367

    
368
  /**
369
   * Creates a printable wrapper for the given element.
370
   * @private
371
   * @param {Element} element The element.
372
   * @returns {Element} The wrapper.
373
   */
374
  function createWrapper(element) {
375
    var node,
376
        nodes = element.attributes,
377
        index = nodes.length,
378
        wrapper = element.ownerDocument.createElement(shivNamespace + ':' + element.nodeName);
379

    
380
    // copy element attributes to the wrapper
381
    while (index--) {
382
      node = nodes[index];
383
      node.specified && wrapper.setAttribute(node.nodeName, node.nodeValue);
384
    }
385
    // copy element styles to the wrapper
386
    wrapper.style.cssText = element.style.cssText;
387
    return wrapper;
388
  }
389

    
390
  /**
391
   * Shivs the given CSS text.
392
   * (eg. header{} becomes html5shiv\:header{})
393
   * @private
394
   * @param {String} cssText The CSS text to shiv.
395
   * @returns {String} The shived CSS text.
396
   */
397
  function shivCssText(cssText) {
398
    var pair,
399
        parts = cssText.split('{'),
400
        index = parts.length,
401
        reElements = RegExp('(^|[\\s,>+~])(' + getElements().join('|') + ')(?=[[\\s,>+~#.:]|$)', 'gi'),
402
        replacement = '$1' + shivNamespace + '\\:$2';
403

    
404
    while (index--) {
405
      pair = parts[index] = parts[index].split('}');
406
      pair[pair.length - 1] = pair[pair.length - 1].replace(reElements, replacement);
407
      parts[index] = pair.join('}');
408
    }
409
    return parts.join('{');
410
  }
411

    
412
  /**
413
   * Removes the given wrappers, leaving the original elements.
414
   * @private
415
   * @params {Array} wrappers An array of printable wrappers.
416
   */
417
  function removeWrappers(wrappers) {
418
    var index = wrappers.length;
419
    while (index--) {
420
      wrappers[index].removeNode();
421
    }
422
  }
423

    
424
  /*--------------------------------------------------------------------------*/
425

    
426
  /**
427
   * Shivs the given document for print.
428
   * @memberOf html5
429
   * @param {Document} ownerDocument The document to shiv.
430
   * @returns {Document} The shived document.
431
   */
432
  function shivPrint(ownerDocument) {
433
    var shivedSheet,
434
        wrappers,
435
        data = getExpandoData(ownerDocument),
436
        namespaces = ownerDocument.namespaces,
437
        ownerWindow = ownerDocument.parentWindow;
438

    
439
    if (!supportsShivableSheets || ownerDocument.printShived) {
440
      return ownerDocument;
441
    }
442
    if (typeof namespaces[shivNamespace] == 'undefined') {
443
      namespaces.add(shivNamespace);
444
    }
445

    
446
    function removeSheet() {
447
      clearTimeout(data._removeSheetTimer);
448
      if (shivedSheet) {
449
          shivedSheet.removeNode(true);
450
      }
451
      shivedSheet= null;
452
    }
453

    
454
    ownerWindow.attachEvent('onbeforeprint', function() {
455

    
456
      removeSheet();
457

    
458
      var imports,
459
          length,
460
          sheet,
461
          collection = ownerDocument.styleSheets,
462
          cssText = [],
463
          index = collection.length,
464
          sheets = Array(index);
465

    
466
      // convert styleSheets collection to an array
467
      while (index--) {
468
        sheets[index] = collection[index];
469
      }
470
      // concat all style sheet CSS text
471
      while ((sheet = sheets.pop())) {
472
        // IE does not enforce a same origin policy for external style sheets...
473
        // but has trouble with some dynamically created stylesheets
474
        if (!sheet.disabled && reMedia.test(sheet.media)) {
475

    
476
          try {
477
            imports = sheet.imports;
478
            length = imports.length;
479
          } catch(er){
480
            length = 0;
481
          }
482

    
483
          for (index = 0; index < length; index++) {
484
            sheets.push(imports[index]);
485
          }
486

    
487
          try {
488
            cssText.push(sheet.cssText);
489
          } catch(er){}
490
        }
491
      }
492

    
493
      // wrap all HTML5 elements with printable elements and add the shived style sheet
494
      cssText = shivCssText(cssText.reverse().join(''));
495
      wrappers = addWrappers(ownerDocument);
496
      shivedSheet = addStyleSheet(ownerDocument, cssText);
497

    
498
    });
499

    
500
    ownerWindow.attachEvent('onafterprint', function() {
501
      // remove wrappers, leaving the original elements, and remove the shived style sheet
502
      removeWrappers(wrappers);
503
      clearTimeout(data._removeSheetTimer);
504
      data._removeSheetTimer = setTimeout(removeSheet, 500);
505
    });
506

    
507
    ownerDocument.printShived = true;
508
    return ownerDocument;
509
  }
510

    
511
  /*--------------------------------------------------------------------------*/
512

    
513
  // expose API
514
  html5.type += ' print';
515
  html5.shivPrint = shivPrint;
516

    
517
  // shiv for print
518
  shivPrint(document);
519

    
520
}(this, document));