|
1 /** |
|
2 * $Id: mclayer.js 162 2007-01-03 16:16:52Z spocke $ |
|
3 * |
|
4 * Moxiecode floating layer script. |
|
5 * |
|
6 * @author Moxiecode |
|
7 * @copyright Copyright © 2004-2007, Moxiecode Systems AB, All rights reserved. |
|
8 */ |
|
9 |
|
10 function MCLayer(id) { |
|
11 this.id = id; |
|
12 this.settings = new Array(); |
|
13 this.blockerElement = null; |
|
14 this.isMSIE = navigator.appName == "Microsoft Internet Explorer"; |
|
15 this.events = false; |
|
16 this.autoHideCallback = null; |
|
17 } |
|
18 |
|
19 MCLayer.prototype = { |
|
20 moveRelativeTo : function(re, p, a) { |
|
21 var rep = this.getAbsPosition(re); |
|
22 var w = parseInt(re.offsetWidth); |
|
23 var h = parseInt(re.offsetHeight); |
|
24 var x, y; |
|
25 |
|
26 switch (p) { |
|
27 case "tl": |
|
28 break; |
|
29 |
|
30 case "tr": |
|
31 x = rep.absLeft + w; |
|
32 y = rep.absTop; |
|
33 break; |
|
34 |
|
35 case "bl": |
|
36 break; |
|
37 |
|
38 case "br": |
|
39 break; |
|
40 } |
|
41 |
|
42 this.moveTo(x, y); |
|
43 }, |
|
44 |
|
45 moveBy : function(dx, dy) { |
|
46 var e = this.getElement(); |
|
47 var x = parseInt(e.style.left); |
|
48 var y = parseInt(e.style.top); |
|
49 |
|
50 e.style.left = (x + dx) + "px"; |
|
51 e.style.top = (y + dy) + "px"; |
|
52 |
|
53 this.updateBlocker(); |
|
54 }, |
|
55 |
|
56 moveTo : function(x, y) { |
|
57 var e = this.getElement(); |
|
58 |
|
59 e.style.left = x + "px"; |
|
60 e.style.top = y + "px"; |
|
61 |
|
62 this.updateBlocker(); |
|
63 }, |
|
64 |
|
65 show : function() { |
|
66 MCLayer.visibleLayer = this; |
|
67 |
|
68 this.getElement().style.display = 'block'; |
|
69 this.updateBlocker(); |
|
70 }, |
|
71 |
|
72 hide : function() { |
|
73 this.getElement().style.display = 'none'; |
|
74 this.updateBlocker(); |
|
75 }, |
|
76 |
|
77 setAutoHide : function(s, cb) { |
|
78 this.autoHideCallback = cb; |
|
79 this.registerEventHandlers(); |
|
80 }, |
|
81 |
|
82 getElement : function() { |
|
83 return document.getElementById(this.id); |
|
84 }, |
|
85 |
|
86 updateBlocker : function() { |
|
87 if (!this.isMSIE) |
|
88 return; |
|
89 |
|
90 var e = this.getElement(); |
|
91 var b = this.getBlocker(); |
|
92 var x = this.parseInt(e.style.left); |
|
93 var y = this.parseInt(e.style.top); |
|
94 var w = this.parseInt(e.offsetWidth); |
|
95 var h = this.parseInt(e.offsetHeight); |
|
96 |
|
97 b.style.left = x + 'px'; |
|
98 b.style.top = y + 'px'; |
|
99 b.style.width = w + 'px'; |
|
100 b.style.height = h + 'px'; |
|
101 b.style.display = e.style.display; |
|
102 }, |
|
103 |
|
104 getBlocker : function() { |
|
105 if (!this.blockerElement) { |
|
106 var d = document, b = d.createElement("iframe"); |
|
107 |
|
108 b.style.cssText = 'display: none; left: 0px; position: absolute; top: 0'; |
|
109 b.src = 'javascript:false;'; |
|
110 b.frameBorder = '0'; |
|
111 b.scrolling = 'no'; |
|
112 |
|
113 d.body.appendChild(b); |
|
114 this.blockerElement = b; |
|
115 } |
|
116 |
|
117 return this.blockerElement; |
|
118 }, |
|
119 |
|
120 getAbsPosition : function(n) { |
|
121 var p = {absLeft : 0, absTop : 0}; |
|
122 |
|
123 while (n) { |
|
124 p.absLeft += n.offsetLeft; |
|
125 p.absTop += n.offsetTop; |
|
126 n = n.offsetParent; |
|
127 } |
|
128 |
|
129 return p; |
|
130 }, |
|
131 |
|
132 registerEventHandlers : function() { |
|
133 if (!this.events) { |
|
134 var d = document; |
|
135 |
|
136 this.addEvent(d, 'mousedown', MCLayer.prototype.onMouseDown); |
|
137 |
|
138 this.events = true; |
|
139 } |
|
140 }, |
|
141 |
|
142 addEvent : function(o, n, h) { |
|
143 if (o.attachEvent) |
|
144 o.attachEvent("on" + n, h); |
|
145 else |
|
146 o.addEventListener(n, h, false); |
|
147 }, |
|
148 |
|
149 onMouseDown : function(e) { |
|
150 e = typeof(e) == "undefined" ? window.event : e; |
|
151 var b = document.body; |
|
152 var l = MCLayer.visibleLayer; |
|
153 |
|
154 if (l) { |
|
155 var mx = l.isMSIE ? e.clientX + b.scrollLeft : e.pageX; |
|
156 var my = l.isMSIE ? e.clientY + b.scrollTop : e.pageY; |
|
157 var el = l.getElement(); |
|
158 var x = parseInt(el.style.left); |
|
159 var y = parseInt(el.style.top); |
|
160 var w = parseInt(el.offsetWidth); |
|
161 var h = parseInt(el.offsetHeight); |
|
162 |
|
163 if (!(mx > x && mx < x + w && my > y && my < y + h)) { |
|
164 MCLayer.visibleLayer = null; |
|
165 |
|
166 if (l.autoHideCallback && l.autoHideCallback(l, e, mx, my)) |
|
167 return true; |
|
168 |
|
169 l.hide(); |
|
170 } |
|
171 } |
|
172 }, |
|
173 |
|
174 addCSSClass : function(e, c) { |
|
175 this.removeCSSClass(e, c); |
|
176 var a = this.explode(' ', e.className); |
|
177 a[a.length] = c; |
|
178 e.className = a.join(' '); |
|
179 }, |
|
180 |
|
181 removeCSSClass : function(e, c) { |
|
182 var a = this.explode(' ', e.className), i; |
|
183 |
|
184 for (i=0; i<a.length; i++) { |
|
185 if (a[i] == c) |
|
186 a[i] = ''; |
|
187 } |
|
188 |
|
189 e.className = a.join(' '); |
|
190 }, |
|
191 |
|
192 explode : function(d, s) { |
|
193 var ar = s.split(d); |
|
194 var oar = new Array(); |
|
195 |
|
196 for (var i = 0; i<ar.length; i++) { |
|
197 if (ar[i] != "") |
|
198 oar[oar.length] = ar[i]; |
|
199 } |
|
200 |
|
201 return oar; |
|
202 }, |
|
203 |
|
204 parseInt : function(s) { |
|
205 if (s == null || s == '') |
|
206 return 0; |
|
207 |
|
208 return parseInt(s); |
|
209 } |
|
210 } |