root / snf-astakos-app / astakos / im / static / im / js / html5shiv-printshiv.js @ 49a1289d
History | View | Annotate | Download (8.7 kB)
1 | 0f4a8a68 | Olga Brani | /*! HTML5 Shiv v3 | @jon_neal @afarkas @rem | MIT/GPL2 Licensed */ |
---|---|---|---|
2 | 0f4a8a68 | Olga Brani | (function (win, doc) {
|
3 | 0f4a8a68 | Olga Brani | // feature detection: whether the browser supports unknown elements
|
4 | 0f4a8a68 | Olga Brani | var supportsUnknownElements = (function (a) { |
5 | 0f4a8a68 | Olga Brani | a.innerHTML = '<x-element></x-element>';
|
6 | 0f4a8a68 | Olga Brani | return a.childNodes.length === 1; |
7 | 0f4a8a68 | Olga Brani | })(doc.createElement('a'));
|
8 | 0f4a8a68 | Olga Brani | |
9 | 0f4a8a68 | Olga Brani | // feature detection: whether the browser supports default html5 styles
|
10 | 0f4a8a68 | Olga Brani | var supportsHtml5Styles = (function (nav, docEl, compStyle) { |
11 | 0f4a8a68 | Olga Brani | docEl.appendChild(nav); |
12 | 0f4a8a68 | Olga Brani | return (compStyle = (compStyle ? compStyle(nav) : nav.currentStyle).display) && docEl.removeChild(nav) && compStyle === 'block'; |
13 | 0f4a8a68 | Olga Brani | })(doc.createElement('nav'), doc.documentElement, win.getComputedStyle);
|
14 | 0f4a8a68 | Olga Brani | |
15 | 0f4a8a68 | Olga Brani | // html5 global so that more elements can be shived and also so that existing shiving can be detected on iframes
|
16 | 0f4a8a68 | Olga Brani | // more elements can be added and shived with the following code: html5.elements.push('element-name'); shivDocument(document);
|
17 | 0f4a8a68 | Olga Brani | var html5 = {
|
18 | 0f4a8a68 | Olga Brani | // a list of html5 elements
|
19 | 0f4a8a68 | Olga Brani | elements: 'abbr article aside audio bdi canvas data datalist details figcaption figure footer header hgroup mark meter nav output progress section summary time video'.split(' '), |
20 | 0f4a8a68 | Olga Brani | |
21 | 0f4a8a68 | Olga Brani | // the shiv function
|
22 | 0f4a8a68 | Olga Brani | shivDocument: function (scopeDocument) { |
23 | 0f4a8a68 | Olga Brani | scopeDocument = scopeDocument || doc; |
24 | 0f4a8a68 | Olga Brani | |
25 | 0f4a8a68 | Olga Brani | // test if the document has already been shived
|
26 | 0f4a8a68 | Olga Brani | if (scopeDocument.documentShived) {
|
27 | 0f4a8a68 | Olga Brani | return;
|
28 | 0f4a8a68 | Olga Brani | } |
29 | 0f4a8a68 | Olga Brani | scopeDocument.documentShived = true;
|
30 | 0f4a8a68 | Olga Brani | |
31 | 0f4a8a68 | Olga Brani | // set local variables
|
32 | 0f4a8a68 | Olga Brani | var
|
33 | 0f4a8a68 | Olga Brani | documentCreateElement = scopeDocument.createElement, |
34 | 0f4a8a68 | Olga Brani | documentCreateDocumentFragment = scopeDocument.createDocumentFragment, |
35 | 0f4a8a68 | Olga Brani | documentHead = scopeDocument.getElementsByTagName('head')[0], |
36 | 0f4a8a68 | Olga Brani | documentCreateElementReplaceFunction = function (m) { |
37 | 0f4a8a68 | Olga Brani | documentCreateElement(m); |
38 | 0f4a8a68 | Olga Brani | }; |
39 | 0f4a8a68 | Olga Brani | |
40 | 0f4a8a68 | Olga Brani | // shiv for unknown elements
|
41 | 0f4a8a68 | Olga Brani | if (!supportsUnknownElements) {
|
42 | 0f4a8a68 | Olga Brani | // shiv the document
|
43 | 0f4a8a68 | Olga Brani | html5.elements.join(' ').replace(/\w+/g, documentCreateElementReplaceFunction); |
44 | 0f4a8a68 | Olga Brani | |
45 | 0f4a8a68 | Olga Brani | // shiv document create element function
|
46 | 0f4a8a68 | Olga Brani | scopeDocument.createElement = function (nodeName) { |
47 | 0f4a8a68 | Olga Brani | var element = documentCreateElement(nodeName);
|
48 | 0f4a8a68 | Olga Brani | if (element.canHaveChildren){
|
49 | 0f4a8a68 | Olga Brani | html5.shivDocument(element.document); |
50 | 0f4a8a68 | Olga Brani | } |
51 | 0f4a8a68 | Olga Brani | return element;
|
52 | 0f4a8a68 | Olga Brani | }; |
53 | 0f4a8a68 | Olga Brani | |
54 | 0f4a8a68 | Olga Brani | // shiv document create element function
|
55 | 0f4a8a68 | Olga Brani | scopeDocument.createDocumentFragment = function () { |
56 | 0f4a8a68 | Olga Brani | return html5.shivDocument(documentCreateDocumentFragment());
|
57 | 0f4a8a68 | Olga Brani | }; |
58 | 0f4a8a68 | Olga Brani | } |
59 | 0f4a8a68 | Olga Brani | |
60 | 0f4a8a68 | Olga Brani | // shiv for default html5 styles
|
61 | 0f4a8a68 | Olga Brani | if (!supportsHtml5Styles && documentHead) {
|
62 | 0f4a8a68 | Olga Brani | var div = documentCreateElement('div'); |
63 | 0f4a8a68 | Olga Brani | div.innerHTML = ['x<style>',
|
64 | 0f4a8a68 | Olga Brani | 'article,aside,details,figcaption,figure,footer,header,hgroup,nav,section{display:block}', // Corrects block display not defined in IE6/7/8/9 |
65 | 0f4a8a68 | Olga Brani | 'audio{display:none}', // Corrects audio display not defined in IE6/7/8/9 |
66 | 0f4a8a68 | Olga Brani | 'canvas,video{display:inline-block;*display:inline;*zoom:1}', // Corrects canvas and video display not defined in IE6/7/8/9 (audio[controls] in IE7) |
67 | 0f4a8a68 | Olga Brani | '[hidden]{display:none}audio[controls]{display:inline-block;*display:inline;*zoom:1}', // Corrects 'hidden' attribute and audio[controls] display not present in IE7/8/9 |
68 | 0f4a8a68 | Olga Brani | 'mark{background:#FF0;color:#000}', // Addresses styling not present in IE6/7/8/9 |
69 | 0f4a8a68 | Olga Brani | '</style>'].join(''); |
70 | 0f4a8a68 | Olga Brani | documentHead.insertBefore(div.lastChild, documentHead.firstChild); |
71 | 0f4a8a68 | Olga Brani | } |
72 | 0f4a8a68 | Olga Brani | |
73 | 0f4a8a68 | Olga Brani | // return document (for potential chaining)
|
74 | 0f4a8a68 | Olga Brani | return scopeDocument;
|
75 | 0f4a8a68 | Olga Brani | } |
76 | 0f4a8a68 | Olga Brani | }; |
77 | 0f4a8a68 | Olga Brani | |
78 | 0f4a8a68 | Olga Brani | // shiv the document
|
79 | 0f4a8a68 | Olga Brani | html5.shivDocument(doc); |
80 | 0f4a8a68 | Olga Brani | |
81 | 0f4a8a68 | Olga Brani | win.html5 = html5; |
82 | 0f4a8a68 | Olga Brani | |
83 | 0f4a8a68 | Olga Brani | // ie print shiv
|
84 | 0f4a8a68 | Olga Brani | if (supportsUnknownElements || !win.attachEvent){return;} |
85 | 0f4a8a68 | Olga Brani | |
86 | 0f4a8a68 | Olga Brani | // replaces an element with a namespace-shived clone (eg. header element becomes shiv:header element)
|
87 | 0f4a8a68 | Olga Brani | function namespaceShivElement(element) { |
88 | 0f4a8a68 | Olga Brani | var elementClone, a, l, i;
|
89 | 0f4a8a68 | Olga Brani | if (doc.documentMode > 7) { |
90 | 0f4a8a68 | Olga Brani | elementClone = doc.createElement('font');
|
91 | 0f4a8a68 | Olga Brani | elementClone.setAttribute('data-html5shiv', element.nodeName.toLowerCase());
|
92 | 0f4a8a68 | Olga Brani | } |
93 | 0f4a8a68 | Olga Brani | else {
|
94 | 0f4a8a68 | Olga Brani | elementClone = doc.createElement('shiv:' + element.nodeName);
|
95 | 0f4a8a68 | Olga Brani | } |
96 | 0f4a8a68 | Olga Brani | while (element.firstChild) {
|
97 | 0f4a8a68 | Olga Brani | elementClone.appendChild(element.childNodes[0]);
|
98 | 0f4a8a68 | Olga Brani | } |
99 | 0f4a8a68 | Olga Brani | for (a = element.attributes, l = a.length, i = 0; i < l; ++i) { |
100 | 0f4a8a68 | Olga Brani | if (a[i].specified) {
|
101 | 0f4a8a68 | Olga Brani | elementClone.setAttribute(a[i].nodeName, a[i].nodeValue); |
102 | 0f4a8a68 | Olga Brani | } |
103 | 0f4a8a68 | Olga Brani | } |
104 | 0f4a8a68 | Olga Brani | elementClone.style.cssText = element.style.cssText; |
105 | 0f4a8a68 | Olga Brani | element.parentNode.replaceChild(elementClone, element); |
106 | 0f4a8a68 | Olga Brani | elementClone.originalElement = element; |
107 | 0f4a8a68 | Olga Brani | } |
108 | 0f4a8a68 | Olga Brani | |
109 | 0f4a8a68 | Olga Brani | // restores an element from a namespace-shived clone (eg. shiv:header element becomes header element)
|
110 | 0f4a8a68 | Olga Brani | function unNamespaceShivElement(element) { |
111 | 0f4a8a68 | Olga Brani | var originalElement = element.originalElement;
|
112 | 0f4a8a68 | Olga Brani | while (element.childNodes.length) {
|
113 | 0f4a8a68 | Olga Brani | originalElement.appendChild(element.childNodes[0]);
|
114 | 0f4a8a68 | Olga Brani | } |
115 | 0f4a8a68 | Olga Brani | element.parentNode.replaceChild(originalElement, element); |
116 | 0f4a8a68 | Olga Brani | } |
117 | 0f4a8a68 | Olga Brani | |
118 | 0f4a8a68 | Olga Brani | // get style sheet list css text
|
119 | 0f4a8a68 | Olga Brani | function getStyleSheetListCssText(styleSheetList, mediaType) { |
120 | 0f4a8a68 | Olga Brani | // set media type
|
121 | 0f4a8a68 | Olga Brani | mediaType = mediaType || 'all';
|
122 | 0f4a8a68 | Olga Brani | |
123 | 0f4a8a68 | Olga Brani | // set local variables
|
124 | 0f4a8a68 | Olga Brani | var
|
125 | 0f4a8a68 | Olga Brani | i = -1,
|
126 | 0f4a8a68 | Olga Brani | cssTextArr = [], |
127 | 0f4a8a68 | Olga Brani | styleSheetListLength = styleSheetList.length, |
128 | 0f4a8a68 | Olga Brani | styleSheet, |
129 | 0f4a8a68 | Olga Brani | styleSheetMediaType; |
130 | 0f4a8a68 | Olga Brani | |
131 | 0f4a8a68 | Olga Brani | // loop through style sheets
|
132 | 0f4a8a68 | Olga Brani | while (++i < styleSheetListLength) {
|
133 | 0f4a8a68 | Olga Brani | // get style sheet
|
134 | 0f4a8a68 | Olga Brani | styleSheet = styleSheetList[i]; |
135 | 0f4a8a68 | Olga Brani | |
136 | 0f4a8a68 | Olga Brani | // get style sheet media type
|
137 | 0f4a8a68 | Olga Brani | styleSheetMediaType = styleSheet.media || mediaType; |
138 | 0f4a8a68 | Olga Brani | |
139 | 0f4a8a68 | Olga Brani | // skip a disabled or non-print style sheet
|
140 | 0f4a8a68 | Olga Brani | if (styleSheet.disabled || !(/print|all/.test(styleSheetMediaType))) { |
141 | 0f4a8a68 | Olga Brani | continue;
|
142 | 0f4a8a68 | Olga Brani | } |
143 | 0f4a8a68 | Olga Brani | |
144 | 0f4a8a68 | Olga Brani | // push style sheet css text
|
145 | 0f4a8a68 | Olga Brani | cssTextArr.push(getStyleSheetListCssText(styleSheet.imports, styleSheetMediaType), styleSheet.cssText); |
146 | 0f4a8a68 | Olga Brani | } |
147 | 0f4a8a68 | Olga Brani | |
148 | 0f4a8a68 | Olga Brani | // return css text
|
149 | 0f4a8a68 | Olga Brani | return cssTextArr.join(''); |
150 | 0f4a8a68 | Olga Brani | } |
151 | 0f4a8a68 | Olga Brani | |
152 | 0f4a8a68 | Olga Brani | // shiv css text (eg. header {} becomes shiv\:header {})
|
153 | 0f4a8a68 | Olga Brani | function shivCssText (cssText) { |
154 | 0f4a8a68 | Olga Brani | // set local variables
|
155 | 0f4a8a68 | Olga Brani | var
|
156 | 0f4a8a68 | Olga Brani | elementsRegExp = new RegExp('(^|[\\s,{}])(' + win.html5.elements.join('|') + ')', 'gi'), |
157 | 0f4a8a68 | Olga Brani | cssTextSplit = cssText.split('{'),
|
158 | 0f4a8a68 | Olga Brani | cssTextSplitLength = cssTextSplit.length, |
159 | 0f4a8a68 | Olga Brani | i = -1;
|
160 | 0f4a8a68 | Olga Brani | |
161 | 0f4a8a68 | Olga Brani | // shiv css text
|
162 | 0f4a8a68 | Olga Brani | while (++i < cssTextSplitLength) {
|
163 | 0f4a8a68 | Olga Brani | cssTextSplit[i] = cssTextSplit[i].split('}');
|
164 | 0f4a8a68 | Olga Brani | if (doc.documentMode > 7) { |
165 | 0f4a8a68 | Olga Brani | cssTextSplit[i][cssTextSplit[i].length - 1] = cssTextSplit[i][cssTextSplit[i].length - 1].replace(elementsRegExp, '$1font[data-html5shiv="$2"]'); |
166 | 0f4a8a68 | Olga Brani | } |
167 | 0f4a8a68 | Olga Brani | else {
|
168 | 0f4a8a68 | Olga Brani | cssTextSplit[i][cssTextSplit[i].length - 1] = cssTextSplit[i][cssTextSplit[i].length - 1].replace(elementsRegExp, '$1shiv\\:$2'); |
169 | 0f4a8a68 | Olga Brani | } |
170 | 0f4a8a68 | Olga Brani | cssTextSplit[i] = cssTextSplit[i].join('}');
|
171 | 0f4a8a68 | Olga Brani | } |
172 | 0f4a8a68 | Olga Brani | |
173 | 0f4a8a68 | Olga Brani | // return shived css text
|
174 | 0f4a8a68 | Olga Brani | return cssTextSplit.join('{'); |
175 | 0f4a8a68 | Olga Brani | } |
176 | 0f4a8a68 | Olga Brani | |
177 | 0f4a8a68 | Olga Brani | // the before print function
|
178 | 0f4a8a68 | Olga Brani | win.attachEvent( |
179 | 0f4a8a68 | Olga Brani | 'onbeforeprint',
|
180 | 0f4a8a68 | Olga Brani | function () {
|
181 | 0f4a8a68 | Olga Brani | // test for scenarios where shiving is unnecessary or unavailable
|
182 | 0f4a8a68 | Olga Brani | if (win.html5.supportsXElement || !doc.namespaces) {
|
183 | 0f4a8a68 | Olga Brani | return;
|
184 | 0f4a8a68 | Olga Brani | } |
185 | 0f4a8a68 | Olga Brani | |
186 | 0f4a8a68 | Olga Brani | // add the shiv namespace
|
187 | 0f4a8a68 | Olga Brani | if (!doc.namespaces.shiv) {
|
188 | 0f4a8a68 | Olga Brani | doc.namespaces.add('shiv');
|
189 | 0f4a8a68 | Olga Brani | } |
190 | 0f4a8a68 | Olga Brani | |
191 | 0f4a8a68 | Olga Brani | // set local variables
|
192 | 0f4a8a68 | Olga Brani | var
|
193 | 0f4a8a68 | Olga Brani | i = -1,
|
194 | 0f4a8a68 | Olga Brani | elementsRegExp = new RegExp('^(' + win.html5.elements.join('|') + ')$', 'i'), |
195 | 0f4a8a68 | Olga Brani | nodeList = doc.getElementsByTagName('*'),
|
196 | 0f4a8a68 | Olga Brani | nodeListLength = nodeList.length, |
197 | 0f4a8a68 | Olga Brani | element, |
198 | 0f4a8a68 | Olga Brani | // sorts style and link files and returns their stylesheets
|
199 | 0f4a8a68 | Olga Brani | shivedCSS = shivCssText(getStyleSheetListCssText((function (s, l) {
|
200 | 0f4a8a68 | Olga Brani | var arr = [], i = s.length;
|
201 | 0f4a8a68 | Olga Brani | while (i) {
|
202 | 0f4a8a68 | Olga Brani | arr.unshift(s[--i]); |
203 | 0f4a8a68 | Olga Brani | } |
204 | 0f4a8a68 | Olga Brani | i = l.length; |
205 | 0f4a8a68 | Olga Brani | while (i) {
|
206 | 0f4a8a68 | Olga Brani | arr.unshift(l[--i]); |
207 | 0f4a8a68 | Olga Brani | } |
208 | 0f4a8a68 | Olga Brani | arr.sort(function (a, b) {
|
209 | 0f4a8a68 | Olga Brani | return (a.sourceIndex - b.sourceIndex);
|
210 | 0f4a8a68 | Olga Brani | }); |
211 | 0f4a8a68 | Olga Brani | i = arr.length; |
212 | 0f4a8a68 | Olga Brani | while (i) {
|
213 | 0f4a8a68 | Olga Brani | arr[--i] = arr[i].styleSheet; |
214 | 0f4a8a68 | Olga Brani | } |
215 | 0f4a8a68 | Olga Brani | return arr;
|
216 | 0f4a8a68 | Olga Brani | })(doc.getElementsByTagName('style'), doc.getElementsByTagName('link')))); |
217 | 0f4a8a68 | Olga Brani | |
218 | 0f4a8a68 | Olga Brani | // loop through document elements
|
219 | 0f4a8a68 | Olga Brani | while (++i < nodeListLength) {
|
220 | 0f4a8a68 | Olga Brani | // get element
|
221 | 0f4a8a68 | Olga Brani | element = nodeList[i]; |
222 | 0f4a8a68 | Olga Brani | |
223 | 0f4a8a68 | Olga Brani | // clone matching elements as shiv namespaced
|
224 | 0f4a8a68 | Olga Brani | if (elementsRegExp.test(element.nodeName)) {
|
225 | 0f4a8a68 | Olga Brani | namespaceShivElement(element); |
226 | 0f4a8a68 | Olga Brani | } |
227 | 0f4a8a68 | Olga Brani | } |
228 | 0f4a8a68 | Olga Brani | |
229 | 0f4a8a68 | Olga Brani | // set new shived css text
|
230 | 0f4a8a68 | Olga Brani | doc.appendChild(doc._shivedStyleSheet = doc.createElement('style')).styleSheet.cssText = shivedCSS;
|
231 | 0f4a8a68 | Olga Brani | } |
232 | 0f4a8a68 | Olga Brani | ); |
233 | 0f4a8a68 | Olga Brani | |
234 | 0f4a8a68 | Olga Brani | // the after print function
|
235 | 0f4a8a68 | Olga Brani | win.attachEvent( |
236 | 0f4a8a68 | Olga Brani | 'onafterprint',
|
237 | 0f4a8a68 | Olga Brani | function() {
|
238 | 0f4a8a68 | Olga Brani | // test for scenarios where shiving is unnecessary
|
239 | 0f4a8a68 | Olga Brani | if (win.html5.supportsXElement || !doc.namespaces) {
|
240 | 0f4a8a68 | Olga Brani | return;
|
241 | 0f4a8a68 | Olga Brani | } |
242 | 0f4a8a68 | Olga Brani | |
243 | 0f4a8a68 | Olga Brani | // set local variables
|
244 | 0f4a8a68 | Olga Brani | var
|
245 | 0f4a8a68 | Olga Brani | i = -1,
|
246 | 0f4a8a68 | Olga Brani | nodeList = doc.getElementsByTagName('*'),
|
247 | 0f4a8a68 | Olga Brani | nodeListLength = nodeList.length, |
248 | 0f4a8a68 | Olga Brani | element; |
249 | 0f4a8a68 | Olga Brani | |
250 | 0f4a8a68 | Olga Brani | // loop through document elements
|
251 | 0f4a8a68 | Olga Brani | while (++i < nodeListLength) {
|
252 | 0f4a8a68 | Olga Brani | // get element
|
253 | 0f4a8a68 | Olga Brani | element = nodeList[i]; |
254 | 0f4a8a68 | Olga Brani | |
255 | 0f4a8a68 | Olga Brani | // restore original elements
|
256 | 0f4a8a68 | Olga Brani | if (element.originalElement) {
|
257 | 0f4a8a68 | Olga Brani | unNamespaceShivElement(element); |
258 | 0f4a8a68 | Olga Brani | } |
259 | 0f4a8a68 | Olga Brani | } |
260 | 0f4a8a68 | Olga Brani | |
261 | 0f4a8a68 | Olga Brani | // cut new shived css text
|
262 | 0f4a8a68 | Olga Brani | if (doc._shivedStyleSheet) {
|
263 | 0f4a8a68 | Olga Brani | doc._shivedStyleSheet.parentNode.removeChild(doc._shivedStyleSheet); |
264 | 0f4a8a68 | Olga Brani | } |
265 | 0f4a8a68 | Olga Brani | } |
266 | 0f4a8a68 | Olga Brani | ); |
267 | 0f4a8a68 | Olga Brani | })(this, document); |