2 * $RCSfile: mclayer.js,v $
\r
4 * $Date: 2006/02/06 20:11:09 $
\r
6 * Moxiecode floating layer script.
\r
9 * @copyright Copyright © 2004-2006, Moxiecode Systems AB, All rights reserved.
\r
12 function MCLayer(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
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
33 x = rep.absLeft + w;
\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
52 e.style.left = (x + dx) + "px";
\r
53 e.style.top = (y + dy) + "px";
\r
55 this.updateBlocker();
\r
58 moveTo : function(x, y) {
\r
59 var e = this.getElement();
\r
61 e.style.left = x + "px";
\r
62 e.style.top = y + "px";
\r
64 this.updateBlocker();
\r
68 MCLayer.visibleLayer = this;
\r
70 this.getElement().style.display = 'block';
\r
71 this.updateBlocker();
\r
75 this.getElement().style.display = 'none';
\r
76 this.updateBlocker();
\r
79 setAutoHide : function(s, cb) {
\r
80 this.autoHideCallback = cb;
\r
81 this.registerEventHandlers();
\r
84 getElement : function() {
\r
85 return document.getElementById(this.id);
\r
88 updateBlocker : function() {
\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
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
106 getBlocker : function() {
\r
107 if (!this.blockerElement) {
\r
108 var d = document, b = d.createElement("iframe");
\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
115 d.body.appendChild(b);
\r
116 this.blockerElement = b;
\r
119 return this.blockerElement;
\r
122 getAbsPosition : function(n) {
\r
123 var p = {absLeft : 0, absTop : 0};
\r
126 p.absLeft += n.offsetLeft;
\r
127 p.absTop += n.offsetTop;
\r
128 n = n.offsetParent;
\r
134 registerEventHandlers : function() {
\r
135 if (!this.events) {
\r
138 this.addEvent(d, 'mousedown', MCLayer.prototype.onMouseDown);
\r
140 this.events = true;
\r
144 addEvent : function(o, n, h) {
\r
146 o.attachEvent("on" + n, h);
\r
148 o.addEventListener(n, h, false);
\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
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
165 if (!(mx > x && mx < x + w && my > y && my < y + h)) {
\r
166 MCLayer.visibleLayer = null;
\r
168 if (l.autoHideCallback && l.autoHideCallback(l, e, mx, my))
\r
176 addCSSClass : function(e, c) {
\r
177 this.removeCSSClass(e, c);
\r
178 var a = this.explode(' ', e.className);
\r
180 e.className = a.join(' ');
\r
183 removeCSSClass : function(e, c) {
\r
184 var a = this.explode(' ', e.className), i;
\r
186 for (i=0; i<a.length; i++) {
\r
191 e.className = a.join(' ');
\r
194 explode : function(d, s) {
\r
195 var ar = s.split(d);
\r
196 var oar = new Array();
\r
198 for (var i = 0; i<ar.length; i++) {
\r
200 oar[oar.length] = ar[i];
\r
206 parseInt : function(s) {
\r
207 if (s == null || s == '')
\r
210 return parseInt(s);
\r