Вход Регистрация
Файл: mailist/wys/jscripts/tiny_mce/plugins/layer/editor_plugin_src.js
Строк: 302
<?php
/**
 * $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);
?>
Онлайн: 1
Реклама