Subversion Repositories Sites.tela-botanica.org

Rev

Blame | Last modification | View Log | RSS feed

/**
 * $Id: editor_plugin_src.js 201 2007-02-12 15:56:56Z spocke $
 *
 * @author Moxiecode
 * @copyright Copyright © 2004-2007, Moxiecode Systems AB, All rights reserved.
 */

/* Import plugin specific language pack */
tinyMCE.importPluginLanguagePack('layer');

var TinyMCE_LayerPlugin = {
        getInfo : function() {
                return {
                        longname : 'Layer',
                        author : 'Moxiecode Systems AB',
                        authorurl : 'http://tinymce.moxiecode.com',
                        infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/layer',
                        version : tinyMCE.majorVersion + "." + tinyMCE.minorVersion
                };
        },

        initInstance : function(inst) {
                if (tinyMCE.isMSIE && !tinyMCE.isOpera)
                        inst.getDoc().execCommand('2D-Position');
        },

        handleEvent : function(e) {
                var inst = tinyMCE.selectedInstance;
                var w = inst.getWin(), le = inst._lastStyleElm, e;

                if (tinyMCE.isGecko) {
                        e = this._getParentLayer(inst.getFocusElement());

                        if (e) {
                                if (!inst._lastStyleElm) {
                                        e.style.overflow = 'auto';
                                        inst._lastStyleElm = e;
                                }
                        } else if (le) {
                                le = inst._lastStyleElm;
                                le.style.width = le.scrollWidth + 'px';
                                le.style.height = le.scrollHeight + 'px';
                                le.style.overflow = '';
                                inst._lastStyleElm = null;
                        }
                }

                return true;
        },

        handleVisualAid : function(el, deep, state, inst) {
                var nl = inst.getDoc().getElementsByTagName("div"), i;

                for (i=0; i<nl.length; i++) {
                        if (new RegExp('absolute|relative|static', 'gi').test(nl[i].style.position)) {
                                if (state)
                                        tinyMCE.addCSSClass(nl[i], 'mceVisualAid');
                                else
                                        tinyMCE.removeCSSClass(nl[i], 'mceVisualAid');                                  
                        }
                }
        },

        getControlHTML : function(cn) {
                switch (cn) {
                        case "moveforward":
                                return tinyMCE.getButtonHTML(cn, 'lang_layer_forward_desc', '{$pluginurl}/images/moveforward.gif', 'mceMoveForward', true);

                        case "movebackward":
                                return tinyMCE.getButtonHTML(cn, 'lang_layer_backward_desc', '{$pluginurl}/images/movebackward.gif', 'mceMoveBackward', true);

                        case "absolute":
                                return tinyMCE.getButtonHTML(cn, 'lang_layer_absolute_desc', '{$pluginurl}/images/absolute.gif', 'mceMakeAbsolute', true);

                        case "insertlayer":
                                return tinyMCE.getButtonHTML(cn, 'lang_layer_insertlayer_desc', '{$pluginurl}/images/insertlayer.gif', 'mceInsertLayer', true);
                }

                return "";
        },

        execCommand : function(editor_id, element, command, user_interface, value) {
                // Handle commands
                switch (command) {
                        case "mceInsertLayer":
                                this._insertLayer();
                                return true;

                        case "mceMoveForward":
                                this._move(1);
                                return true;

                        case "mceMoveBackward":
                                this._move(-1);
                                return true;

                        case "mceMakeAbsolute":
                                this._toggleAbsolute();
                                return true;
                }

                // Pass to next handler in chain
                return false;
        },

        handleNodeChange : function(editor_id, node, undo_index, undo_levels, visual_aid, any_selection) {
                var inst = tinyMCE.getInstanceById(editor_id);
                var le = this._getParentLayer(inst.getFocusElement());
                var p = tinyMCE.getParentElement(inst.getFocusElement(), 'div,p,img');

                tinyMCE.switchClass(editor_id + '_absolute', 'mceButtonDisabled');
                tinyMCE.switchClass(editor_id + '_moveforward', 'mceButtonDisabled');
                tinyMCE.switchClass(editor_id + '_movebackward', 'mceButtonDisabled');

                if (p)
                        tinyMCE.switchClass(editor_id + '_absolute', 'mceButtonNormal');

                if (le && le.style.position.toLowerCase() == "absolute") {
                        tinyMCE.switchClass(editor_id + '_absolute', 'mceButtonSelected');
                        tinyMCE.switchClass(editor_id + '_moveforward', 'mceButtonNormal');
                        tinyMCE.switchClass(editor_id + '_movebackward', 'mceButtonNormal');
                }
        },

        // Private plugin specific methods

        _move : function(d) {
                var inst = tinyMCE.selectedInstance, i, z = new Array();
                var le = this._getParentLayer(inst.getFocusElement()), ci = -1, fi = -1;
                var nl = tinyMCE.selectNodes(inst.getBody(), function(n) {
                        return n.nodeType == 1 && new RegExp('absolute|relative|static', 'gi').test(n.style.position);
                });

                // Find z-indexes
                for (i=0; i<nl.length; i++) {
                        z[i] = nl[i].style.zIndex ? parseInt(nl[i].style.zIndex) : 0;

                        if (ci < 0 && nl[i] == le)
                                ci = i;
                }

                if (d < 0) {
                        // Move back

                        // Try find a lower one
                        for (i=0; i<z.length; i++) {
                                if (z[i] < z[ci]) {
                                        fi = i;
                                        break;
                                }
                        }

                        if (fi > -1) {
                                nl[ci].style.zIndex = z[fi];
                                nl[fi].style.zIndex = z[ci];
                        } else {
                                if (z[ci] > 0)
                                        nl[ci].style.zIndex = z[ci] - 1;
                        }
                } else {
                        // Move forward

                        // Try find a higher one
                        for (i=0; i<z.length; i++) {
                                if (z[i] > z[ci]) {
                                        fi = i;
                                        break;
                                }
                        }

                        if (fi > -1) {
                                nl[ci].style.zIndex = z[fi];
                                nl[fi].style.zIndex = z[ci];
                        } else
                                nl[ci].style.zIndex = z[ci] + 1;
                }

                inst.repaint();
        },

        _getParentLayer : function(n) {
                return tinyMCE.getParentNode(n, function(n) {
                        return n.nodeType == 1 && new RegExp('absolute|relative|static', 'gi').test(n.style.position);
                });
        },

        _insertLayer : function() {
                var inst = tinyMCE.selectedInstance;
                var e = tinyMCE.getParentElement(inst.getFocusElement());
                var p = tinyMCE.getAbsPosition(e);
                var d = inst.getDoc();
                var ne = d.createElement('div');
                var h = inst.selection.getSelectedHTML();

                // Move div
                ne.style.position = 'absolute';
                ne.style.left = p.absLeft + 'px';
                ne.style.top = (p.absTop > 20 ? p.absTop : 20) + 'px';
                ne.style.width = '100px';
                ne.style.height = '100px';
                ne.className = 'mceVisualAid';

                if (!h)
                        h = tinyMCE.getLang('lang_layer_content');

                ne.innerHTML = h;

                // Add it
                d.body.appendChild(ne);
        },

        _toggleAbsolute : function() {
                var inst = tinyMCE.selectedInstance;
                var le = this._getParentLayer(inst.getFocusElement());

                if (le == null)
                        le = tinyMCE.getParentElement(inst.getFocusElement(), 'div,p,img');

                if (le) {
                        if (le.style.position.toLowerCase() == "absolute") {
                                le.style.position = "";
                                le.style.left = "";
                                le.style.top = "";
                        } else {
                                le.style.position = "absolute";

                                if (le.style.left == "")
                                        le.style.left = 20 + 'px';

                                if (le.style.top == "")
                                        le.style.top = 20 + 'px';

                                if (le.style.width == "")
                                        le.style.width = le.width ? (le.width + 'px') : '100px';

                                if (le.style.height == "")
                                        le.style.height = le.height ? (le.height + 'px') : '100px';

                                tinyMCE.handleVisualAid(inst.getBody(), true, inst.visualAid, inst);
                        }

                        inst.repaint();
                        tinyMCE.triggerNodeChange();
                }
        }
};

tinyMCE.addPlugin("layer", TinyMCE_LayerPlugin);