| /** |
| * $Id: mclayer.js 162 2007-01-03 16:16:52Z spocke $ |
| * |
| * Moxiecode floating layer script. |
| * |
| * @author Moxiecode |
| * @copyright Copyright © 2004-2007, Moxiecode Systems AB, All rights reserved. |
| */ |
| |
| function MCLayer(id) { |
| this.id = id; |
| this.settings = new Array(); |
| this.blockerElement = null; |
| this.isMSIE = navigator.appName == "Microsoft Internet Explorer"; |
| this.events = false; |
| this.autoHideCallback = null; |
| } |
| |
| MCLayer.prototype = { |
| moveRelativeTo : function(re, p, a) { |
| var rep = this.getAbsPosition(re); |
| var w = parseInt(re.offsetWidth); |
| var h = parseInt(re.offsetHeight); |
| var x, y; |
| |
| switch (p) { |
| case "tl": |
| break; |
| |
| case "tr": |
| x = rep.absLeft + w; |
| y = rep.absTop; |
| break; |
| |
| case "bl": |
| break; |
| |
| case "br": |
| break; |
| } |
| |
| this.moveTo(x, y); |
| }, |
| |
| moveBy : function(dx, dy) { |
| var e = this.getElement(); |
| var x = parseInt(e.style.left); |
| var y = parseInt(e.style.top); |
| |
| e.style.left = (x + dx) + "px"; |
| e.style.top = (y + dy) + "px"; |
| |
| this.updateBlocker(); |
| }, |
| |
| moveTo : function(x, y) { |
| var e = this.getElement(); |
| |
| e.style.left = x + "px"; |
| e.style.top = y + "px"; |
| |
| this.updateBlocker(); |
| }, |
| |
| show : function() { |
| MCLayer.visibleLayer = this; |
| |
| this.getElement().style.display = 'block'; |
| this.updateBlocker(); |
| }, |
| |
| hide : function() { |
| this.getElement().style.display = 'none'; |
| this.updateBlocker(); |
| }, |
| |
| setAutoHide : function(s, cb) { |
| this.autoHideCallback = cb; |
| this.registerEventHandlers(); |
| }, |
| |
| getElement : function() { |
| return document.getElementById(this.id); |
| }, |
| |
| updateBlocker : function() { |
| if (!this.isMSIE) |
| return; |
| |
| var e = this.getElement(); |
| var b = this.getBlocker(); |
| var x = this.parseInt(e.style.left); |
| var y = this.parseInt(e.style.top); |
| var w = this.parseInt(e.offsetWidth); |
| var h = this.parseInt(e.offsetHeight); |
| |
| b.style.left = x + 'px'; |
| b.style.top = y + 'px'; |
| b.style.width = w + 'px'; |
| b.style.height = h + 'px'; |
| b.style.display = e.style.display; |
| }, |
| |
| getBlocker : function() { |
| if (!this.blockerElement) { |
| var d = document, b = d.createElement("iframe"); |
| |
| b.style.cssText = 'display: none; left: 0px; position: absolute; top: 0'; |
| b.src = 'javascript:false;'; |
| b.frameBorder = '0'; |
| b.scrolling = 'no'; |
| |
| d.body.appendChild(b); |
| this.blockerElement = b; |
| } |
| |
| return this.blockerElement; |
| }, |
| |
| getAbsPosition : function(n) { |
| var p = {absLeft : 0, absTop : 0}; |
| |
| while (n) { |
| p.absLeft += n.offsetLeft; |
| p.absTop += n.offsetTop; |
| n = n.offsetParent; |
| } |
| |
| return p; |
| }, |
| |
| registerEventHandlers : function() { |
| if (!this.events) { |
| var d = document; |
| |
| this.addEvent(d, 'mousedown', MCLayer.prototype.onMouseDown); |
| |
| this.events = true; |
| } |
| }, |
| |
| addEvent : function(o, n, h) { |
| if (o.attachEvent) |
| o.attachEvent("on" + n, h); |
| else |
| o.addEventListener(n, h, false); |
| }, |
| |
| onMouseDown : function(e) { |
| e = typeof(e) == "undefined" ? window.event : e; |
| var b = document.body; |
| var l = MCLayer.visibleLayer; |
| |
| if (l) { |
| var mx = l.isMSIE ? e.clientX + b.scrollLeft : e.pageX; |
| var my = l.isMSIE ? e.clientY + b.scrollTop : e.pageY; |
| var el = l.getElement(); |
| var x = parseInt(el.style.left); |
| var y = parseInt(el.style.top); |
| var w = parseInt(el.offsetWidth); |
| var h = parseInt(el.offsetHeight); |
| |
| if (!(mx > x && mx < x + w && my > y && my < y + h)) { |
| MCLayer.visibleLayer = null; |
| |
| if (l.autoHideCallback && l.autoHideCallback(l, e, mx, my)) |
| return true; |
| |
| l.hide(); |
| } |
| } |
| }, |
| |
| addCSSClass : function(e, c) { |
| this.removeCSSClass(e, c); |
| var a = this.explode(' ', e.className); |
| a[a.length] = c; |
| e.className = a.join(' '); |
| }, |
| |
| removeCSSClass : function(e, c) { |
| var a = this.explode(' ', e.className), i; |
| |
| for (i=0; i<a.length; i++) { |
| if (a[i] == c) |
| a[i] = ''; |
| } |
| |
| e.className = a.join(' '); |
| }, |
| |
| explode : function(d, s) { |
| var ar = s.split(d); |
| var oar = new Array(); |
| |
| for (var i = 0; i<ar.length; i++) { |
| if (ar[i] != "") |
| oar[oar.length] = ar[i]; |
| } |
| |
| return oar; |
| }, |
| |
| parseInt : function(s) { |
| if (s == null || s == '') |
| return 0; |
| |
| return parseInt(s); |
| } |
| } |