Subversion Repositories Sites.tela-botanica.org

Rev

Blame | Last modification | View Log | RSS feed

/**
 * $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);
        }
}