includes/clientside/tinymce/plugins/layer/editor_plugin_src.js
changeset 335 67bd3121a12e
parent 1 fe660c52c48f
child 395 fa4c5ecb7c9a
equal deleted inserted replaced
334:c72b545f1304 335:67bd3121a12e
     1 /**
     1 /**
     2  * $Id: editor_plugin_src.js 201 2007-02-12 15:56:56Z spocke $
     2  * $Id: editor_plugin_src.js 372 2007-11-11 18:38:50Z spocke $
     3  *
     3  *
     4  * @author Moxiecode
     4  * @author Moxiecode
     5  * @copyright Copyright © 2004-2007, Moxiecode Systems AB, All rights reserved.
     5  * @copyright Copyright © 2004-2007, Moxiecode Systems AB, All rights reserved.
     6  */
     6  */
     7 
     7 
     8 /* Import plugin specific language pack */
     8 (function() {
     9 tinyMCE.importPluginLanguagePack('layer');
     9 	tinymce.create('tinymce.plugins.Layer', {
    10 
    10 		init : function(ed, url) {
    11 var TinyMCE_LayerPlugin = {
    11 			var t = this;
    12 	getInfo : function() {
    12 
    13 		return {
    13 			t.editor = ed;
    14 			longname : 'Layer',
    14 
    15 			author : 'Moxiecode Systems AB',
    15 			// Register commands
    16 			authorurl : 'http://tinymce.moxiecode.com',
    16 			ed.addCommand('mceInsertLayer', t._insertLayer, t);
    17 			infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/layer',
    17 
    18 			version : tinyMCE.majorVersion + "." + tinyMCE.minorVersion
    18 			ed.addCommand('mceMoveForward', function() {
    19 		};
    19 				t._move(1);
    20 	},
    20 			});
    21 
    21 
    22 	initInstance : function(inst) {
    22 			ed.addCommand('mceMoveBackward', function() {
    23 		if (tinyMCE.isMSIE && !tinyMCE.isOpera)
    23 				t._move(-1);
    24 			inst.getDoc().execCommand('2D-Position');
    24 			});
    25 	},
    25 
    26 
    26 			ed.addCommand('mceMakeAbsolute', function() {
    27 	handleEvent : function(e) {
    27 				t._toggleAbsolute();
    28 		var inst = tinyMCE.selectedInstance;
    28 			});
    29 		var w = inst.getWin(), le = inst._lastStyleElm, e;
    29 
    30 
    30 			// Register buttons
    31 		if (tinyMCE.isGecko) {
    31 			ed.addButton('moveforward', {title : 'layer.forward_desc', cmd : 'mceMoveForward'});
    32 			e = this._getParentLayer(inst.getFocusElement());
    32 			ed.addButton('movebackward', {title : 'layer.backward_desc', cmd : 'mceMoveBackward'});
    33 
    33 			ed.addButton('absolute', {title : 'layer.absolute_desc', cmd : 'mceMakeAbsolute'});
    34 			if (e) {
    34 			ed.addButton('insertlayer', {title : 'layer.insertlayer_desc', cmd : 'mceInsertLayer'});
    35 				if (!inst._lastStyleElm) {
    35 
    36 					e.style.overflow = 'auto';
    36 			ed.onInit.add(function() {
    37 					inst._lastStyleElm = e;
    37 				if (tinymce.isIE)
    38 				}
    38 					ed.execCommand('2D-Position');
    39 			} else if (le) {
    39 			});
    40 				le = inst._lastStyleElm;
    40 
    41 				le.style.width = le.scrollWidth + 'px';
    41 			ed.onNodeChange.add(t._nodeChange, t);
    42 				le.style.height = le.scrollHeight + 'px';
    42 			ed.onVisualAid.add(t._visualAid, t);
    43 				le.style.overflow = '';
    43 		},
    44 				inst._lastStyleElm = null;
    44 
       
    45 		getInfo : function() {
       
    46 			return {
       
    47 				longname : 'Layer',
       
    48 				author : 'Moxiecode Systems AB',
       
    49 				authorurl : 'http://tinymce.moxiecode.com',
       
    50 				infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/layer',
       
    51 				version : tinymce.majorVersion + "." + tinymce.minorVersion
       
    52 			};
       
    53 		},
       
    54 
       
    55 		// Private methods
       
    56 
       
    57 		_nodeChange : function(ed, cm, n) {
       
    58 			var le, p;
       
    59 
       
    60 			le = this._getParentLayer(n);
       
    61 			p = ed.dom.getParent(n, 'DIV,P,IMG');
       
    62 
       
    63 			if (!p) {
       
    64 				cm.setDisabled('absolute', 1);
       
    65 				cm.setDisabled('moveforward', 1);
       
    66 				cm.setDisabled('movebackward', 1);
       
    67 			} else {
       
    68 				cm.setDisabled('absolute', 0);
       
    69 				cm.setDisabled('moveforward', !le);
       
    70 				cm.setDisabled('movebackward', !le);
       
    71 				cm.setActive('absolute', le && le.style.position.toLowerCase() == "absolute");
       
    72 			}
       
    73 		},
       
    74 
       
    75 		// Private methods
       
    76 
       
    77 		_visualAid : function(ed, e, s) {
       
    78 			var dom = ed.dom;
       
    79 
       
    80 			tinymce.each(dom.select('div,p', e), function(e) {
       
    81 				if (/^(absolute|relative|static)$/i.test(e.style.position)) {
       
    82 					if (s)
       
    83 						dom.addClass(e, 'mceVisualAid');
       
    84 					else
       
    85 						dom.removeClass(e, 'mceVisualAid');	
       
    86 				}
       
    87 			});
       
    88 		},
       
    89 
       
    90 		_move : function(d) {
       
    91 			var ed = this.editor, i, z = [], le = this._getParentLayer(ed.selection.getNode()), ci = -1, fi = -1, nl;
       
    92 
       
    93 			nl = [];
       
    94 			tinymce.walk(ed.getBody(), function(n) {
       
    95 				if (n.nodeType == 1 && /^(absolute|relative|static)$/i.test(n.style.position))
       
    96 					nl.push(n); 
       
    97 			}, 'childNodes');
       
    98 
       
    99 			// Find z-indexes
       
   100 			for (i=0; i<nl.length; i++) {
       
   101 				z[i] = nl[i].style.zIndex ? parseInt(nl[i].style.zIndex) : 0;
       
   102 
       
   103 				if (ci < 0 && nl[i] == le)
       
   104 					ci = i;
       
   105 			}
       
   106 
       
   107 			if (d < 0) {
       
   108 				// Move back
       
   109 
       
   110 				// Try find a lower one
       
   111 				for (i=0; i<z.length; i++) {
       
   112 					if (z[i] < z[ci]) {
       
   113 						fi = i;
       
   114 						break;
       
   115 					}
       
   116 				}
       
   117 
       
   118 				if (fi > -1) {
       
   119 					nl[ci].style.zIndex = z[fi];
       
   120 					nl[fi].style.zIndex = z[ci];
       
   121 				} else {
       
   122 					if (z[ci] > 0)
       
   123 						nl[ci].style.zIndex = z[ci] - 1;
       
   124 				}
       
   125 			} else {
       
   126 				// Move forward
       
   127 
       
   128 				// Try find a higher one
       
   129 				for (i=0; i<z.length; i++) {
       
   130 					if (z[i] > z[ci]) {
       
   131 						fi = i;
       
   132 						break;
       
   133 					}
       
   134 				}
       
   135 
       
   136 				if (fi > -1) {
       
   137 					nl[ci].style.zIndex = z[fi];
       
   138 					nl[fi].style.zIndex = z[ci];
       
   139 				} else
       
   140 					nl[ci].style.zIndex = z[ci] + 1;
       
   141 			}
       
   142 
       
   143 			ed.execCommand('mceRepaint');
       
   144 		},
       
   145 
       
   146 		_getParentLayer : function(n) {
       
   147 			return this.editor.dom.getParent(n, function(n) {
       
   148 				return n.nodeType == 1 && /^(absolute|relative|static)$/i.test(n.style.position);
       
   149 			});
       
   150 		},
       
   151 
       
   152 		_insertLayer : function() {
       
   153 			var ed = this.editor, p = ed.dom.getPos(ed.dom.getParent(ed.selection.getNode(), '*'));
       
   154 
       
   155 			ed.dom.add(ed.getBody(), 'div', {
       
   156 				style : {
       
   157 					position : 'absolute',
       
   158 					left : p.x,
       
   159 					top : (p.y > 20 ? p.y : 20),
       
   160 					width : 100,
       
   161 					height : 100
       
   162 				},
       
   163 				'class' : 'mceVisualAid'
       
   164 			}, ed.selection.getContent() || ed.getLang('layer.content'));
       
   165 		},
       
   166 
       
   167 		_toggleAbsolute : function() {
       
   168 			var ed = this.editor, le = this._getParentLayer(ed.selection.getNode());
       
   169 
       
   170 			if (!le)
       
   171 				le = ed.dom.getParent(ed.selection.getNode(), 'DIV,P,IMG');
       
   172 
       
   173 			if (le) {
       
   174 				if (le.style.position.toLowerCase() == "absolute") {
       
   175 					ed.dom.setStyles(le, {
       
   176 						position : '',
       
   177 						left : '',
       
   178 						top : '',
       
   179 						width : '',
       
   180 						height : ''
       
   181 					});
       
   182 
       
   183 					ed.dom.removeClass(le, 'mceVisualAid');
       
   184 				} else {
       
   185 					if (le.style.left == "")
       
   186 						le.style.left = 20 + 'px';
       
   187 
       
   188 					if (le.style.top == "")
       
   189 						le.style.top = 20 + 'px';
       
   190 
       
   191 					if (le.style.width == "")
       
   192 						le.style.width = le.width ? (le.width + 'px') : '100px';
       
   193 
       
   194 					if (le.style.height == "")
       
   195 						le.style.height = le.height ? (le.height + 'px') : '100px';
       
   196 
       
   197 					le.style.position = "absolute";
       
   198 					ed.addVisual(ed.getBody());
       
   199 				}
       
   200 
       
   201 				ed.execCommand('mceRepaint');
       
   202 				ed.nodeChanged();
    45 			}
   203 			}
    46 		}
   204 		}
    47 
   205 	});
    48 		return true;
   206 
    49 	},
   207 	// Register plugin
    50 
   208 	tinymce.PluginManager.add('layer', tinymce.plugins.Layer);
    51 	handleVisualAid : function(el, deep, state, inst) {
   209 })();
    52 		var nl = inst.getDoc().getElementsByTagName("div"), i;
       
    53 
       
    54 		for (i=0; i<nl.length; i++) {
       
    55 			if (new RegExp('absolute|relative|static', 'gi').test(nl[i].style.position)) {
       
    56 				if (state)
       
    57 					tinyMCE.addCSSClass(nl[i], 'mceVisualAid');
       
    58 				else
       
    59 					tinyMCE.removeCSSClass(nl[i], 'mceVisualAid');					
       
    60 			}
       
    61 		}
       
    62 	},
       
    63 
       
    64 	getControlHTML : function(cn) {
       
    65 		switch (cn) {
       
    66 			case "moveforward":
       
    67 				return tinyMCE.getButtonHTML(cn, 'lang_layer_forward_desc', '{$pluginurl}/images/moveforward.gif', 'mceMoveForward', true);
       
    68 
       
    69 			case "movebackward":
       
    70 				return tinyMCE.getButtonHTML(cn, 'lang_layer_backward_desc', '{$pluginurl}/images/movebackward.gif', 'mceMoveBackward', true);
       
    71 
       
    72 			case "absolute":
       
    73 				return tinyMCE.getButtonHTML(cn, 'lang_layer_absolute_desc', '{$pluginurl}/images/absolute.gif', 'mceMakeAbsolute', true);
       
    74 
       
    75 			case "insertlayer":
       
    76 				return tinyMCE.getButtonHTML(cn, 'lang_layer_insertlayer_desc', '{$pluginurl}/images/insertlayer.gif', 'mceInsertLayer', true);
       
    77 		}
       
    78 
       
    79 		return "";
       
    80 	},
       
    81 
       
    82 	execCommand : function(editor_id, element, command, user_interface, value) {
       
    83 		// Handle commands
       
    84 		switch (command) {
       
    85 			case "mceInsertLayer":
       
    86 				this._insertLayer();
       
    87 				return true;
       
    88 
       
    89 			case "mceMoveForward":
       
    90 				this._move(1);
       
    91 				return true;
       
    92 
       
    93 			case "mceMoveBackward":
       
    94 				this._move(-1);
       
    95 				return true;
       
    96 
       
    97 			case "mceMakeAbsolute":
       
    98 				this._toggleAbsolute();
       
    99 				return true;
       
   100 		}
       
   101 
       
   102 		// Pass to next handler in chain
       
   103 		return false;
       
   104 	},
       
   105 
       
   106 	handleNodeChange : function(editor_id, node, undo_index, undo_levels, visual_aid, any_selection) {
       
   107 		var inst = tinyMCE.getInstanceById(editor_id);
       
   108 		var le = this._getParentLayer(inst.getFocusElement());
       
   109 		var p = tinyMCE.getParentElement(inst.getFocusElement(), 'div,p,img');
       
   110 
       
   111 		tinyMCE.switchClass(editor_id + '_absolute', 'mceButtonDisabled');
       
   112 		tinyMCE.switchClass(editor_id + '_moveforward', 'mceButtonDisabled');
       
   113 		tinyMCE.switchClass(editor_id + '_movebackward', 'mceButtonDisabled');
       
   114 
       
   115 		if (p)
       
   116 			tinyMCE.switchClass(editor_id + '_absolute', 'mceButtonNormal');
       
   117 
       
   118 		if (le && le.style.position.toLowerCase() == "absolute") {
       
   119 			tinyMCE.switchClass(editor_id + '_absolute', 'mceButtonSelected');
       
   120 			tinyMCE.switchClass(editor_id + '_moveforward', 'mceButtonNormal');
       
   121 			tinyMCE.switchClass(editor_id + '_movebackward', 'mceButtonNormal');
       
   122 		}
       
   123 	},
       
   124 
       
   125 	// Private plugin specific methods
       
   126 
       
   127 	_move : function(d) {
       
   128 		var inst = tinyMCE.selectedInstance, i, z = new Array();
       
   129 		var le = this._getParentLayer(inst.getFocusElement()), ci = -1, fi = -1;
       
   130 		var nl = tinyMCE.selectNodes(inst.getBody(), function(n) {
       
   131 			return n.nodeType == 1 && new RegExp('absolute|relative|static', 'gi').test(n.style.position);
       
   132 		});
       
   133 
       
   134 		// Find z-indexes
       
   135 		for (i=0; i<nl.length; i++) {
       
   136 			z[i] = nl[i].style.zIndex ? parseInt(nl[i].style.zIndex) : 0;
       
   137 
       
   138 			if (ci < 0 && nl[i] == le)
       
   139 				ci = i;
       
   140 		}
       
   141 
       
   142 		if (d < 0) {
       
   143 			// Move back
       
   144 
       
   145 			// Try find a lower one
       
   146 			for (i=0; i<z.length; i++) {
       
   147 				if (z[i] < z[ci]) {
       
   148 					fi = i;
       
   149 					break;
       
   150 				}
       
   151 			}
       
   152 
       
   153 			if (fi > -1) {
       
   154 				nl[ci].style.zIndex = z[fi];
       
   155 				nl[fi].style.zIndex = z[ci];
       
   156 			} else {
       
   157 				if (z[ci] > 0)
       
   158 					nl[ci].style.zIndex = z[ci] - 1;
       
   159 			}
       
   160 		} else {
       
   161 			// Move forward
       
   162 
       
   163 			// Try find a higher one
       
   164 			for (i=0; i<z.length; i++) {
       
   165 				if (z[i] > z[ci]) {
       
   166 					fi = i;
       
   167 					break;
       
   168 				}
       
   169 			}
       
   170 
       
   171 			if (fi > -1) {
       
   172 				nl[ci].style.zIndex = z[fi];
       
   173 				nl[fi].style.zIndex = z[ci];
       
   174 			} else
       
   175 				nl[ci].style.zIndex = z[ci] + 1;
       
   176 		}
       
   177 
       
   178 		inst.repaint();
       
   179 	},
       
   180 
       
   181 	_getParentLayer : function(n) {
       
   182 		return tinyMCE.getParentNode(n, function(n) {
       
   183 			return n.nodeType == 1 && new RegExp('absolute|relative|static', 'gi').test(n.style.position);
       
   184 		});
       
   185 	},
       
   186 
       
   187 	_insertLayer : function() {
       
   188 		var inst = tinyMCE.selectedInstance;
       
   189 		var e = tinyMCE.getParentElement(inst.getFocusElement());
       
   190 		var p = tinyMCE.getAbsPosition(e);
       
   191 		var d = inst.getDoc();
       
   192 		var ne = d.createElement('div');
       
   193 		var h = inst.selection.getSelectedHTML();
       
   194 
       
   195 		// Move div
       
   196 		ne.style.position = 'absolute';
       
   197 		ne.style.left = p.absLeft + 'px';
       
   198 		ne.style.top = (p.absTop > 20 ? p.absTop : 20) + 'px';
       
   199 		ne.style.width = '100px';
       
   200 		ne.style.height = '100px';
       
   201 		ne.className = 'mceVisualAid';
       
   202 
       
   203 		if (!h)
       
   204 			h = tinyMCE.getLang('lang_layer_content');
       
   205 
       
   206 		ne.innerHTML = h;
       
   207 
       
   208 		// Add it
       
   209 		d.body.appendChild(ne);
       
   210 	},
       
   211 
       
   212 	_toggleAbsolute : function() {
       
   213 		var inst = tinyMCE.selectedInstance;
       
   214 		var le = this._getParentLayer(inst.getFocusElement());
       
   215 
       
   216 		if (le == null)
       
   217 			le = tinyMCE.getParentElement(inst.getFocusElement(), 'div,p,img');
       
   218 
       
   219 		if (le) {
       
   220 			if (le.style.position.toLowerCase() == "absolute") {
       
   221 				le.style.position = "";
       
   222 				le.style.left = "";
       
   223 				le.style.top = "";
       
   224 			} else {
       
   225 				le.style.position = "absolute";
       
   226 
       
   227 				if (le.style.left == "")
       
   228 					le.style.left = 20 + 'px';
       
   229 
       
   230 				if (le.style.top == "")
       
   231 					le.style.top = 20 + 'px';
       
   232 
       
   233 				if (le.style.width == "")
       
   234 					le.style.width = le.width ? (le.width + 'px') : '100px';
       
   235 
       
   236 				if (le.style.height == "")
       
   237 					le.style.height = le.height ? (le.height + 'px') : '100px';
       
   238 
       
   239 				tinyMCE.handleVisualAid(inst.getBody(), true, inst.visualAid, inst);
       
   240 			}
       
   241 
       
   242 			inst.repaint();
       
   243 			tinyMCE.triggerNodeChange();
       
   244 		}
       
   245 	}
       
   246 };
       
   247 
       
   248 tinyMCE.addPlugin("layer", TinyMCE_LayerPlugin);