/static/scripts/tiny_mce/plugins/layer/editor_plugin_src.js

http://n23.googlecode.com/ · JavaScript · 209 lines · 153 code · 40 blank · 16 comment · 40 complexity · f5ba1d8dc06bae2a9fb67c7317a90458 MD5 · raw file

  1. /**
  2. * $Id: editor_plugin_src.js 652 2008-02-29 13:09:46Z spocke $
  3. *
  4. * @author Moxiecode
  5. * @copyright Copyright Š 2004-2008, Moxiecode Systems AB, All rights reserved.
  6. */
  7. (function() {
  8. tinymce.create('tinymce.plugins.Layer', {
  9. init : function(ed, url) {
  10. var t = this;
  11. t.editor = ed;
  12. // Register commands
  13. ed.addCommand('mceInsertLayer', t._insertLayer, t);
  14. ed.addCommand('mceMoveForward', function() {
  15. t._move(1);
  16. });
  17. ed.addCommand('mceMoveBackward', function() {
  18. t._move(-1);
  19. });
  20. ed.addCommand('mceMakeAbsolute', function() {
  21. t._toggleAbsolute();
  22. });
  23. // Register buttons
  24. ed.addButton('moveforward', {title : 'layer.forward_desc', cmd : 'mceMoveForward'});
  25. ed.addButton('movebackward', {title : 'layer.backward_desc', cmd : 'mceMoveBackward'});
  26. ed.addButton('absolute', {title : 'layer.absolute_desc', cmd : 'mceMakeAbsolute'});
  27. ed.addButton('insertlayer', {title : 'layer.insertlayer_desc', cmd : 'mceInsertLayer'});
  28. ed.onInit.add(function() {
  29. if (tinymce.isIE)
  30. ed.getDoc().execCommand('2D-Position', false, true);
  31. });
  32. ed.onNodeChange.add(t._nodeChange, t);
  33. ed.onVisualAid.add(t._visualAid, t);
  34. },
  35. getInfo : function() {
  36. return {
  37. longname : 'Layer',
  38. author : 'Moxiecode Systems AB',
  39. authorurl : 'http://tinymce.moxiecode.com',
  40. infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/layer',
  41. version : tinymce.majorVersion + "." + tinymce.minorVersion
  42. };
  43. },
  44. // Private methods
  45. _nodeChange : function(ed, cm, n) {
  46. var le, p;
  47. le = this._getParentLayer(n);
  48. p = ed.dom.getParent(n, 'DIV,P,IMG');
  49. if (!p) {
  50. cm.setDisabled('absolute', 1);
  51. cm.setDisabled('moveforward', 1);
  52. cm.setDisabled('movebackward', 1);
  53. } else {
  54. cm.setDisabled('absolute', 0);
  55. cm.setDisabled('moveforward', !le);
  56. cm.setDisabled('movebackward', !le);
  57. cm.setActive('absolute', le && le.style.position.toLowerCase() == "absolute");
  58. }
  59. },
  60. // Private methods
  61. _visualAid : function(ed, e, s) {
  62. var dom = ed.dom;
  63. tinymce.each(dom.select('div,p', e), function(e) {
  64. if (/^(absolute|relative|static)$/i.test(e.style.position)) {
  65. if (s)
  66. dom.addClass(e, 'mceItemVisualAid');
  67. else
  68. dom.removeClass(e, 'mceItemVisualAid');
  69. }
  70. });
  71. },
  72. _move : function(d) {
  73. var ed = this.editor, i, z = [], le = this._getParentLayer(ed.selection.getNode()), ci = -1, fi = -1, nl;
  74. nl = [];
  75. tinymce.walk(ed.getBody(), function(n) {
  76. if (n.nodeType == 1 && /^(absolute|relative|static)$/i.test(n.style.position))
  77. nl.push(n);
  78. }, 'childNodes');
  79. // Find z-indexes
  80. for (i=0; i<nl.length; i++) {
  81. z[i] = nl[i].style.zIndex ? parseInt(nl[i].style.zIndex) : 0;
  82. if (ci < 0 && nl[i] == le)
  83. ci = i;
  84. }
  85. if (d < 0) {
  86. // Move back
  87. // Try find a lower one
  88. for (i=0; i<z.length; i++) {
  89. if (z[i] < z[ci]) {
  90. fi = i;
  91. break;
  92. }
  93. }
  94. if (fi > -1) {
  95. nl[ci].style.zIndex = z[fi];
  96. nl[fi].style.zIndex = z[ci];
  97. } else {
  98. if (z[ci] > 0)
  99. nl[ci].style.zIndex = z[ci] - 1;
  100. }
  101. } else {
  102. // Move forward
  103. // Try find a higher one
  104. for (i=0; i<z.length; i++) {
  105. if (z[i] > z[ci]) {
  106. fi = i;
  107. break;
  108. }
  109. }
  110. if (fi > -1) {
  111. nl[ci].style.zIndex = z[fi];
  112. nl[fi].style.zIndex = z[ci];
  113. } else
  114. nl[ci].style.zIndex = z[ci] + 1;
  115. }
  116. ed.execCommand('mceRepaint');
  117. },
  118. _getParentLayer : function(n) {
  119. return this.editor.dom.getParent(n, function(n) {
  120. return n.nodeType == 1 && /^(absolute|relative|static)$/i.test(n.style.position);
  121. });
  122. },
  123. _insertLayer : function() {
  124. var ed = this.editor, p = ed.dom.getPos(ed.dom.getParent(ed.selection.getNode(), '*'));
  125. ed.dom.add(ed.getBody(), 'div', {
  126. style : {
  127. position : 'absolute',
  128. left : p.x,
  129. top : (p.y > 20 ? p.y : 20),
  130. width : 100,
  131. height : 100
  132. },
  133. 'class' : 'mceItemVisualAid'
  134. }, ed.selection.getContent() || ed.getLang('layer.content'));
  135. },
  136. _toggleAbsolute : function() {
  137. var ed = this.editor, le = this._getParentLayer(ed.selection.getNode());
  138. if (!le)
  139. le = ed.dom.getParent(ed.selection.getNode(), 'DIV,P,IMG');
  140. if (le) {
  141. if (le.style.position.toLowerCase() == "absolute") {
  142. ed.dom.setStyles(le, {
  143. position : '',
  144. left : '',
  145. top : '',
  146. width : '',
  147. height : ''
  148. });
  149. ed.dom.removeClass(le, 'mceItemVisualAid');
  150. } else {
  151. if (le.style.left == "")
  152. le.style.left = 20 + 'px';
  153. if (le.style.top == "")
  154. le.style.top = 20 + 'px';
  155. if (le.style.width == "")
  156. le.style.width = le.width ? (le.width + 'px') : '100px';
  157. if (le.style.height == "")
  158. le.style.height = le.height ? (le.height + 'px') : '100px';
  159. le.style.position = "absolute";
  160. ed.addVisual(ed.getBody());
  161. }
  162. ed.execCommand('mceRepaint');
  163. ed.nodeChanged();
  164. }
  165. }
  166. });
  167. // Register plugin
  168. tinymce.PluginManager.add('layer', tinymce.plugins.Layer);
  169. })();