Added initial avatar support. Currently rather feature complete except for admin controls for avatar.
/**
* $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);