09f0910cabae52260a326bea8c6b981493d80900
[lhc/web/wiklou.git] / skins / common / IEFixes.js
1 // IE fixes javascript
2 ( function ( mw, $ ) {
3
4 var doneIEAlphaFix, doneIETransform, expandedURLs, fixalpha, isMSIE55,
5 relativeforfloats, setrelative;
6
7 isMSIE55 = window.isMSIE55 = ( window.showModalDialog && window.clipboardData && window.createPopup );
8 doneIETransform = window.doneIETransform = undefined;
9 doneIEAlphaFix = window.doneIEAlphaFix = undefined;
10
11 window.hookit = function () {
12 if ( !doneIETransform && document.getElementById && document.getElementById( 'bodyContent' ) ) {
13 doneIETransform = true;
14 relativeforfloats();
15 fixalpha();
16 }
17 };
18
19 if ( document.attachEvent ) {
20 document.attachEvent( 'onreadystatechange', window.hookit );
21 }
22
23 // png alpha transparency fixes
24 fixalpha = window.fixalpha = function ( logoId ) {
25 // bg
26 if ( isMSIE55 && !doneIEAlphaFix ) {
27 var bg, imageUrl, linkFix, logoa, logospan, plogo;
28 plogo = document.getElementById( logoId || 'p-logo' );
29 if ( !plogo ) {
30 return;
31 }
32
33 logoa = plogo.getElementsByTagName('a')[0];
34 if ( !logoa ) {
35 return;
36 }
37
38 bg = logoa.currentStyle.backgroundImage;
39 imageUrl = bg.substring( 5, bg.length - 2 );
40
41 doneIEAlphaFix = true;
42
43 if ( imageUrl.substr( imageUrl.length - 4 ).toLowerCase() === '.png' ) {
44 logospan = logoa.appendChild( document.createElement( 'span' ) );
45
46 logoa.style.backgroundImage = 'none';
47 logospan.style.filter = 'progid:DXImageTransform.Microsoft.AlphaImageLoader(src=' + imageUrl + ')';
48 logospan.style.height = '100%';
49 logospan.style.position = 'absolute';
50 logospan.style.width = logoa.currentStyle.width;
51 logospan.style.cursor = 'hand';
52 // Center image with hack for IE5.5
53 if ( document.documentElement.dir === 'rtl' ) {
54 logospan.style.right = '50%';
55 logospan.style.setExpression( 'marginRight', '"-" + (this.offsetWidth / 2) + "px"' );
56 } else {
57 logospan.style.left = '50%';
58 logospan.style.setExpression( 'marginLeft', '"-" + (this.offsetWidth / 2) + "px"' );
59 }
60 logospan.style.top = '50%';
61 logospan.style.setExpression( 'marginTop', '"-" + (this.offsetHeight / 2) + "px"' );
62
63 linkFix = logoa.appendChild( logoa.cloneNode() );
64 linkFix.style.position = 'absolute';
65 linkFix.style.height = '100%';
66 linkFix.style.width = '100%';
67 }
68 }
69 };
70
71 if ( isMSIE55 ) {
72 // ondomready
73 $( fixalpha );
74 }
75
76 // fix ie6 disappering float bug
77 relativeforfloats = window.relativeforfloats = function () {
78 var bc, tables, divs;
79 bc = document.getElementById( 'bodyContent' );
80 if ( bc ) {
81 tables = bc.getElementsByTagName( 'table' );
82 divs = bc.getElementsByTagName( 'div' );
83 setrelative( tables );
84 setrelative( divs );
85 }
86 };
87
88 setrelative = window.setrelative = function ( nodes ) {
89 var i = 0;
90 while ( i < nodes.length ) {
91 if( ( ( nodes[i].style.float && nodes[i].style.float !== ( 'none' ) ||
92 ( nodes[i].align && nodes[i].align !== ( 'none' ) ) ) &&
93 ( !nodes[i].style.position || nodes[i].style.position !== 'relative' ) ) )
94 {
95 nodes[i].style.position = 'relative';
96 }
97 i++;
98 }
99 };
100
101 // Expand links for printing
102 String.prototype.hasClass = function ( classWanted ) {
103 var i = 0, classArr = this.split(/\s/);
104 for ( i = 0; i < classArr.length; i++ ) {
105 if ( classArr[i].toLowerCase() === classWanted.toLowerCase() ) {
106 return true;
107 }
108 }
109 return false;
110 };
111
112 expandedURLs = window.expandedURLs = undefined;
113
114 window.onbeforeprint = function () {
115 var allLinks, contentEl, expandedLink, expandedText, i;
116
117 expandedURLs = [];
118 contentEl = document.getElementById( 'content' );
119
120 if ( contentEl ) {
121 allLinks = contentEl.getElementsByTagName( 'a' );
122
123 for ( i = 0; i < allLinks.length; i++ ) {
124 if ( allLinks[i].className.hasClass( 'external' ) && !allLinks[i].className.hasClass( 'free' ) ) {
125 expandedLink = document.createElement( 'span' );
126 expandedText = document.createTextNode( ' (' + allLinks[i].href + ')' );
127 expandedLink.appendChild( expandedText );
128 allLinks[i].parentNode.insertBefore( expandedLink, allLinks[i].nextSibling );
129 expandedURLs[i] = expandedLink;
130 }
131 }
132 }
133 };
134
135 window.onafterprint = function() {
136 for ( var i = 0; i < expandedURLs.length; i++ ) {
137 if ( expandedURLs[i] ) {
138 expandedURLs[i].removeNode( true );
139 }
140 }
141 };
142
143 }( mediaWiki, jQuery ) );