/** * @preserve html5 shiv 3.7.3 | @afarkas @jdalton @jon_neal @rem | mit/gpl2 licensed */ ;(function(window, document) { /*jshint evil:true */ /** version */ var version = '3.7.3'; /** preset options */ var options = window.html5 || {}; /** used to skip problem elements */ var reskip = /^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i; /** not all elements can be cloned in ie **/ 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; /** detect whether the browser supports default html5 styles */ var supportshtml5styles; /** name of the expando, to work with multiple documents or to re-shiv one document */ var expando = '_html5shiv'; /** the id for the the documents expando */ var expanid = 0; /** cached data for each document */ var expandodata = {}; /** detect whether the browser supports unknown elements */ var supportsunknownelements; (function() { try { var a = document.createelement('a'); a.innerhtml = ''; //if the hidden property is implemented we can assume, that the browser supports basic html5 styles supportshtml5styles = ('hidden' in a); supportsunknownelements = a.childnodes.length == 1 || (function() { // assign a false positive if unable to shiv (document.createelement)('a'); var frag = document.createdocumentfragment(); return ( typeof frag.clonenode == 'undefined' || typeof frag.createdocumentfragment == 'undefined' || typeof frag.createelement == 'undefined' ); }()); } catch(e) { // assign a false positive if detection fails => unable to shiv supportshtml5styles = true; supportsunknownelements = true; } }()); /*--------------------------------------------------------------------------*/ /** * creates a style sheet with the given css text and adds it to the document. * @private * @param {document} ownerdocument the document. * @param {string} csstext the css text. * @returns {stylesheet} the style element. */ function addstylesheet(ownerdocument, csstext) { var p = ownerdocument.createelement('p'), parent = ownerdocument.getelementsbytagname('head')[0] || ownerdocument.documentelement; p.innerhtml = 'x'; return parent.insertbefore(p.lastchild, parent.firstchild); } /** * returns the value of `html5.elements` as an array. * @private * @returns {array} an array of shived element node names. */ function getelements() { var elements = html5.elements; return typeof elements == 'string' ? elements.split(' ') : elements; } /** * extends the built-in list of html5 elements * @memberof html5 * @param {string|array} newelements whitespace separated list or array of new element names to shiv * @param {document} ownerdocument the context document. */ function addelements(newelements, ownerdocument) { var elements = html5.elements; if(typeof elements != 'string'){ elements = elements.join(' '); } if(typeof newelements != 'string'){ newelements = newelements.join(' '); } html5.elements = elements +' '+ newelements; shivdocument(ownerdocument); } /** * returns the data associated to the given document * @private * @param {document} ownerdocument the document. * @returns {object} an object of data. */ function getexpandodata(ownerdocument) { var data = expandodata[ownerdocument[expando]]; if (!data) { data = {}; expanid++; ownerdocument[expando] = expanid; expandodata[expanid] = data; } return data; } /** * returns a shived element for the given nodename and document * @memberof html5 * @param {string} nodename name of the element * @param {document|documentfragment} ownerdocument the context document. * @returns {object} the shived element. */ function createelement(nodename, ownerdocument, data){ if (!ownerdocument) { ownerdocument = document; } if(supportsunknownelements){ return ownerdocument.createelement(nodename); } if (!data) { data = getexpandodata(ownerdocument); } var node; if (data.cache[nodename]) { node = data.cache[nodename].clonenode(); } else if (saveclones.test(nodename)) { node = (data.cache[nodename] = data.createelem(nodename)).clonenode(); } else { node = data.createelem(nodename); } // avoid adding some elements to fragments in ie < 9 because // * attributes like `name` or `type` cannot be set/changed once an element // is inserted into a document/fragment // * link elements with `src` attributes that are inaccessible, as with // a 403 response, will cause the tab/window to crash // * script elements appended to fragments will execute when their `src` // or `text` property is set return node.canhavechildren && !reskip.test(nodename) && !node.tagurn ? data.frag.appendchild(node) : node; } /** * returns a shived documentfragment for the given document * @memberof html5 * @param {document} ownerdocument the context document. * @returns {object} the shived documentfragment. */ function createdocumentfragment(ownerdocument, data){ if (!ownerdocument) { ownerdocument = document; } if(supportsunknownelements){ return ownerdocument.createdocumentfragment(); } data = data || getexpandodata(ownerdocument); var clone = data.frag.clonenode(), i = 0, elems = getelements(), l = elems.length; for(;i