Statistics
| Branch: | Tag: | Revision:

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);