annotate src/de/mpg/mpiwg/itgroup/digilib/icons/greyskin/fixed.js @ 1:83c58ea33792

first release (continued)
author dwinter
date Mon, 03 Jan 2011 09:11:25 +0100
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
1 // fixed.js: fix fixed positioning and fixed backgrounds in IE/Win
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
2 // version 1.8, 08-Aug-2003
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
3 // written by Andrew Clover <and@doxdesk.com>, use freely
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
4
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
5 /*@cc_on
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
6 @if (@_win32 && @_jscript_version>4)
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
7
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
8 var fixed_positions= new Array();
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
9 var fixed_backgrounds= new Array();
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
10 var fixed_viewport;
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
11
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
12 // Initialisation. Called when the <body> tag arrives. Set up viewport so the
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
13 // rest of the script knows we're going, and add a measurer div, used to detect
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
14 // font size changes and measure image sizes for backgrounds later
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
15
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
16 function fixed_init() {
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
17 fixed_viewport= (document.compatMode=='CSS1Compat') ?
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
18 document.documentElement : document.body;
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
19 var el= document.createElement('div');
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
20 el.setAttribute('id', 'fixed-measure');
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
21 el.style.position= 'absolute';
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
22 el.style.top= '0'; el.style.left= '0';
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
23 el.style.overflow= 'hidden'; el.style.visibility= 'hidden';
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
24 el.style.fontSize= 'xx-large'; el.style.height= '5em';
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
25 el.style.setExpression('width', 'fixed_measureFont()');
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
26 document.body.insertBefore(el, document.body.firstChild);
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
27 }
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
28
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
29 // Binding. Called every time an element is added to the document, check it
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
30 // for fixed features, if found add to our lists and set initial props
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
31
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
32 function fixed_bind(el) {
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
33 var needLayout= false;
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
34 var tag= el.tagName.toLowerCase();
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
35 var st= el.style;
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
36 var cst= el.currentStyle;
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
37 var anc;
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
38
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
39 // find fixed-position elements
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
40 if (cst.position=='fixed') {
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
41 needLayout= true;
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
42 fixed_positions[fixed_positions.length]= el;
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
43 // store original positioning as we'll overwrite it
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
44 st.position= 'absolute';
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
45 st.fixedPLeft= cst.left;
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
46 st.fixedPTop= cst.top;
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
47 st.fixedPRight= cst.right;
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
48 st.fixedPBottom= cst.bottom;
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
49 st.fixedPWidth= fixed_parseLength(cst.width);
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
50 st.fixedPHeight= fixed_parseLength(cst.height);
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
51 // find element that will act as containing box, for convenience later
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
52 st.fixedCB= null;
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
53 for (anc= el; (anc= anc.parentElement).parentElement;) {
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
54 if (anc.currentStyle.position!='static') {
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
55 st.fixedCB= anc;
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
56 break;
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
57 } }
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
58 // detect nested fixed positioning (only ancestor need move)
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
59 st.fixedNest= false;
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
60 for (anc= el; anc= anc.parentElement;) {
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
61 if (anc.style.fixedNest!=null)
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
62 st.fixedNest= true;
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
63 break;
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
64 }
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
65 }
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
66
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
67 // find fixed-background elements (not body/html which IE already gets right)
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
68 if (cst.backgroundAttachment=='fixed' && tag!='body' && tag!='html') {
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
69 needLayout= true;
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
70 fixed_backgrounds[fixed_backgrounds.length]= el;
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
71 // get background offset, converting from keyword if necessary
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
72 st.fixedBLeft= fixed_parseLength(cst.backgroundPositionX);
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
73 st.fixedBTop= fixed_parseLength(cst.backgroundPositionY);
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
74 // if it's a non-zero %age, need to know size of image for layout
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
75 if (st.fixedBLeft[1]=='%' || st.fixedBTop[1]=='%') {
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
76 st.fixedBWidth= 0; st.fixedBHeight= 0;
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
77 fixed_measureBack(el);
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
78 }
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
79 }
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
80 if (needLayout) fixed_layout();
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
81 }
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
82
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
83 // Layout. On every window or font size change, recalculate positioning
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
84
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
85 // Request re-layout at next free moment
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
86 var fixed_delaying= false;
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
87 function fixed_delayout() {
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
88 if (fixed_delaying) return;
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
89 fixed_delaying= true;
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
90 window.setTimeout(fixed_layout, 0);
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
91 }
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
92
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
93 var fixed_ARBITRARY= 200;
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
94
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
95 function fixed_layout() {
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
96 fixed_delaying= false;
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
97 if (!fixed_viewport) return;
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
98 var i, el, st, j, pr, tmp, A= 'auto';
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
99 var cb, cbLeft, cbTop, cbRight, cbBottom, oLeft, oTop, oRight, oBottom;
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
100 var vpWidth=fixed_viewport.clientWidth, vpHeight=fixed_viewport.clientHeight;
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
101
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
102 // calculate initial position for fixed-position elements [black magic]
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
103 for (i= fixed_positions.length; i-->0;) {
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
104 el= fixed_positions[i]; st= el.style;
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
105 // find positioning of containing block
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
106 cb= st.fixedCB; if (!cb) cb= fixed_viewport;
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
107 cbLeft= fixed_pageLeft(cb); cbTop= fixed_pageTop(cb);
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
108 if (cb!=fixed_viewport) { cbLeft+= cb.clientLeft; cbTop+= cb.clientTop; }
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
109 cbRight= fixed_viewport.clientWidth-cbLeft-cb.clientWidth;
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
110 cbBottom= fixed_viewport.clientHeight-cbTop-cb.clientHeight;
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
111 // if size is in %, must recalculate relative to viewport
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
112 if (st.fixedPWidth[1]=='%')
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
113 st.width= Math.round(vpWidth*st.fixedPWidth[0]/100)+'px';
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
114 if (st.fixedPHeight[1]=='%')
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
115 st.height= Math.round(vpHeight*st.fixedPHeight[0]/100)+'px';
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
116 // find out offset values at max size, to account for margins
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
117 st.left= A; st.right= '0'; st.top= A; st.bottom= '0';
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
118 oRight= el.offsetLeft+el.offsetWidth; oBottom= el.offsetTop+el.offsetHeight;
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
119 st.left= '0'; st.right= A; st.top= '0'; st.bottom= A;
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
120 oLeft= el.offsetLeft; oTop= el.offsetTop;
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
121 // use this to convert all edges to pixels
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
122 st.left= A; st.right= st.fixedPRight;
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
123 st.top= A; st.bottom= st.fixedPBottom;
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
124 oRight-= el.offsetLeft+el.offsetWidth;
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
125 oBottom-= el.offsetTop+el.offsetHeight;
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
126 st.left= st.fixedPLeft; st.top= st.fixedPTop;
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
127 oLeft= el.offsetLeft-oLeft; oTop= el.offsetTop-oTop;
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
128 // edge positioning fix
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
129 if (st.fixedPWidth[1]==A && st.fixedPLeft!=A && st.fixedPRight!=A) {
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
130 tmp= el.offsetLeft; st.left= A; st.width= fixed_ARBITRARY+'px';
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
131 tmp= fixed_ARBITRARY+el.offsetLeft-tmp+cbLeft+cbRight;
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
132 st.left= st.fixedPLeft; st.width= ((tmp<1)?1:tmp)+'px';
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
133 }
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
134 if (st.fixedPHeight[1]==A && st.fixedPTop!=A && st.fixedPBottom!=A) {
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
135 tmp= el.offsetTop; st.top= A; st.height= fixed_ARBITRARY+'px';
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
136 tmp= fixed_ARBITRARY+el.offsetTop-tmp+cbTop+cbBottom;
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
137 st.top= st.fixedPTop; st.height= ((tmp<1)?1:tmp)+'px';
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
138 }
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
139 // move all non-auto edges relative to the viewport
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
140 st.fixedCLeft= (st.fixedPLeft=='auto') ? oLeft : oLeft-cbLeft;
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
141 st.fixedCTop= (st.fixedPTop=='auto') ? oTop : oTop-cbTop;
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
142 st.fixedCRight= (st.fixedPRight=='auto') ? oRight : oRight-cbRight;
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
143 st.fixedCBottom= (st.fixedPBottom=='auto') ? oBottom : oBottom-cbBottom;
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
144 // remove left-positioning of right-positioned elements
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
145 if (st.fixedPLeft=='auto' && st.fixedPRight!='auto') st.fixedCLeft= 'auto';
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
146 if (st.fixedPTop=='auto' && st.fixedPBottom!='auto') st.fixedCTop= 'auto';
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
147 }
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
148
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
149
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
150 // calculate initial positioning of fixed backgrounds
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
151 for (i= fixed_backgrounds.length; i-->0;) {
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
152 el= fixed_backgrounds[i]; st= el.style;
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
153 tmp= st.fixedBImage;
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
154 if (tmp) {
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
155 if (tmp.readyState!='uninitialized') {
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
156 st.fixedBWidth= tmp.offsetWidth;
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
157 st.fixedBHeight= tmp.offsetHeight;
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
158 st.fixedBImage= window.undefined;
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
159 }
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
160 }
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
161 st.fixedBX= fixed_length(el, st.fixedBLeft, vpWidth-st.fixedBWidth);
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
162 st.fixedBY= fixed_length(el, st.fixedBTop, vpHeight-st.fixedBHeight);
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
163 }
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
164
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
165 // now call scroll() to set the positions from the values just calculated
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
166 fixed_scroll();
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
167 }
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
168
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
169 // Scrolling. Offset fixed elements relative to viewport scrollness
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
170
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
171 var fixed_lastX, fixed_lastY;
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
172 var fixed_PATCHDELAY= 300;
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
173 var fixed_patching= false;
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
174
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
175 // callback function after a scroll, because incorrect scroll position is
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
176 // often reported first go!
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
177 function fixed_patch() {
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
178 fixed_patching= false;
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
179 var scrollX= fixed_viewport.scrollLeft, scrollY= fixed_viewport.scrollTop;
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
180 if (scrollX!=fixed_lastX && scrollY!=fixed_lastY) fixed_scroll();
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
181 }
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
182
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
183 function fixed_scroll() {
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
184 if (!fixed_viewport) return;
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
185 var i, el, st, viewportX, viewportY;
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
186 var scrollX= fixed_viewport.scrollLeft, scrollY= fixed_viewport.scrollTop;
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
187 fixed_lastX= scrollX; fixed_lastY= scrollY;
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
188
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
189 // move non-nested fixed-position elements
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
190 for (i= fixed_positions.length; i-->0;) {
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
191 st= fixed_positions[i].style;
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
192 viewportX= (st.fixedNest) ? 0 : scrollX;
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
193 viewportY= (st.fixedNest) ? 0 : scrollY;
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
194 if (st.fixedCLeft!='auto') st.left= (st.fixedCLeft+viewportX)+'px';
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
195 if (st.fixedCTop!='auto') st.top= (st.fixedCTop+viewportY)+'px';
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
196 viewportX= (st.fixedCB==null || st.fixedCB==fixed_viewport) ? 0 : viewportX;
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
197 viewportY= (st.fixedCB==null || st.fixedCB==fixed_viewport) ? 0 : viewportY;
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
198 st.right= (st.fixedCRight-viewportX+1)+'px'; st.right= (st.fixedCRight-viewportX)+'px';
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
199 st.bottom= (st.fixedCBottom-viewportY+1)+'px'; st.bottom= (st.fixedCBottom-viewportY)+'px';
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
200 }
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
201
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
202 // align fixed backgrounds to viewport
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
203 for (i= fixed_backgrounds.length; i-->0;) {
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
204 el= fixed_backgrounds[i]; st= el.style;
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
205 viewportX= scrollX;
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
206 viewportY= scrollY;
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
207 while (el.offsetParent) {
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
208 viewportX-= el.offsetLeft+el.clientLeft;
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
209 viewportY-= el.offsetTop +el.clientTop;
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
210 el= el.offsetParent;
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
211 }
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
212 st.backgroundPositionX= (st.fixedBX+viewportX)+'px';
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
213 st.backgroundPositionY= (st.fixedBY+viewportY)+'px';
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
214 }
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
215
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
216 // call back again in a tic
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
217 if (!fixed_patching) {
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
218 fixed_patching= true;
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
219 window.setTimeout(fixed_patch, fixed_PATCHDELAY);
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
220 }
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
221 }
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
222
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
223 // Measurement. Load bg-image into an invisible element on the page, when
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
224 // loaded write the width/height to an element's style for layout use; detect
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
225 // when font size changes
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
226
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
227 function fixed_measureBack(el) {
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
228 var measure= document.getElementById('fixed-measure');
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
229 var img= document.createElement('img');
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
230 img.setAttribute('src', fixed_parseURL(el.currentStyle.backgroundImage));
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
231 measure.appendChild(img);
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
232 el.style.fixedBImage= img;
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
233 if (img.readyState=='uninitialized')
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
234 img.attachEvent('onreadystatechange', fixed_measureBackImage_ready);
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
235 }
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
236
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
237 function fixed_measureBackImage_ready() {
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
238 var img= event.srcElement;
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
239 if (img && img.readyState!='uninitialized') {
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
240 img.detachEvent('onreadystatechange', fixed_measureBackImage_ready);
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
241 fixed_layout();
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
242 }
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
243 }
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
244
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
245 var fixed_fontsize= 0;
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
246 function fixed_measureFont() {
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
247 var fs= document.getElementById('fixed-measure').offsetHeight;
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
248 if (fixed_fontsize!=fs && fixed_fontsize!=0)
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
249 fixed_delayout();
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
250 fixed_fontsize= fs;
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
251 return '5em';
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
252 }
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
253
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
254 // Utility. General-purpose functions
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
255
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
256 // parse url() to get value inside
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
257
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
258 function fixed_parseURL(v) {
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
259 v= v.substring(4, v.length-1);
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
260 if (v.charAt(0)=='"' && v.charAt(v.length-1)=='"' ||
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
261 v.charAt(0)=="'" && v.charAt(v.length-1)=="'")
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
262 return v.substring(1, v.length-1);
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
263 else return v;
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
264 }
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
265
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
266 // parse length or auto or background-position keyword into number and unit
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
267
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
268 var fixed_numberChars= '+-0123456789.';
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
269 var fixed_ZERO= new Array(0, 'px');
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
270 var fixed_50PC= new Array(50, '%');
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
271 var fixed_100PC= new Array(100, '%');
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
272 var fixed_AUTO= new Array(0, 'auto');
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
273
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
274 function fixed_parseLength(v) {
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
275 var num, i;
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
276 if (v=='left' || v=='top') return fixed_ZERO;
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
277 if (v=='right' || v=='bottom') return fixed_100PC;
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
278 if (v=='center') return fixed_50PC;
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
279 if (v=='auto') return fixed_AUTO;
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
280 i= 0;
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
281 while (i<v.length && fixed_numberChars.indexOf(v.charAt(i))!=-1)
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
282 i++;
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
283 num= parseFloat(v.substring(0, i));
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
284 if (num==0) return fixed_ZERO;
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
285 else return new Array(num, v.substring(i));
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
286 }
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
287
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
288 // convert parsed (number, unit) into a number of pixels
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
289
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
290 function fixed_length(el, l, full) {
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
291 var tmp, x;
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
292 if (l[1]=='px') return l[0];
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
293 if (l[1]=='%') return Math.round(full*l[0]/100);
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
294 // other units - measure by setting position; this is rather inefficient
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
295 // but then these units are used for background-position so seldom...
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
296 tmp= el.currentStyle.left;
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
297 el.style.left= '0';
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
298 x= el.offsetLeft;
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
299 el.style.left= l[0]+l[1];
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
300 x= el.offsetLeft-x;
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
301 el.style.left= tmp;
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
302 return x;
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
303 }
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
304
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
305 // convert stupid IE offsetLeft/Top to page-relative values
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
306
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
307 function fixed_pageLeft(el) {
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
308 var v= 0;
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
309 while (el.offsetParent) {
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
310 v+= el.offsetLeft;
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
311 el= el.offsetParent;
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
312 }
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
313 return v;
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
314 }
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
315 function fixed_pageTop(el) {
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
316 var v= 0;
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
317 while (el.offsetParent) {
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
318 v+= el.offsetTop;
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
319 el= el.offsetParent;
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
320 }
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
321 return v;
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
322 }
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
323
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
324 // Scanning. Check document every so often until it has finished loading. Do
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
325 // nothing until <body> arrives, then call main init. Pass any new elements
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
326 // found on each scan to be bound
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
327
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
328 var fixed_SCANDELAY= 500;
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
329
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
330 function fixed_scan() {
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
331 if (!document.body) return;
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
332 if (!fixed_viewport) fixed_init();
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
333 var el;
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
334 for (var i= 0; i<document.all.length; i++) {
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
335 el= document.all[i];
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
336 if (!el.fixed_bound) {
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
337 el.fixed_bound= true;
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
338 fixed_bind(el);
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
339 } }
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
340 }
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
341
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
342 var fixed_scanner;
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
343 function fixed_stop() {
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
344 window.clearInterval(fixed_scanner);
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
345 fixed_scan();
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
346 }
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
347
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
348 fixed_scan();
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
349 fixed_scanner= window.setInterval(fixed_scan, fixed_SCANDELAY);
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
350 window.attachEvent('onload', fixed_stop);
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
351 window.attachEvent('onresize', fixed_delayout);
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
352 window.attachEvent('onscroll', fixed_scroll);
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
353
83c58ea33792 first release (continued)
dwinter
parents:
diff changeset
354 @end @*/