thomascube
2006-12-13 7a5c48e7f70b8bc938fcae3ffd2be0fdbeaab145
commit | author | age
a0109c 1 /**
f0ea59 2  * $Id: mclayer.js 18 2006-06-29 14:11:23Z spocke $
a0109c 3  *
S 4  * Moxiecode floating layer script.
5  *
6  * @author Moxiecode
7  * @copyright Copyright © 2004-2006, 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     }
f0ea59 210 }