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