--- /dev/null
+/*\r
+Copyright (c) 2003-2011, CKSource - Frederico Knabben. All rights reserved.\r
+For licensing, see LICENSE.html or http://ckeditor.com/license\r
+*/\r
+\r
+/**\r
+ * @fileOverview The "placeholder" plugin.\r
+ *\r
+ */\r
+\r
+(function()\r
+{\r
+ var placeholderReplaceRegex = /\[\[[^\]]+\]\]/g;\r
+ CKEDITOR.plugins.add( 'placeholder',\r
+ {\r
+ requires : [ 'dialog' ],\r
+ lang : [ 'en', 'he' ],\r
+ init : function( editor )\r
+ {\r
+ var lang = editor.lang.placeholder;\r
+\r
+ editor.addCommand( 'createplaceholder', new CKEDITOR.dialogCommand( 'createplaceholder' ) );\r
+ editor.addCommand( 'editplaceholder', new CKEDITOR.dialogCommand( 'editplaceholder' ) );\r
+\r
+ editor.ui.addButton( 'CreatePlaceholder',\r
+ {\r
+ label : lang.toolbar,\r
+ command :'createplaceholder',\r
+ icon : this.path + 'placeholder.gif'\r
+ });\r
+\r
+ if ( editor.addMenuItems )\r
+ {\r
+ editor.addMenuGroup( 'placeholder', 20 );\r
+ editor.addMenuItems(\r
+ {\r
+ editplaceholder :\r
+ {\r
+ label : lang.edit,\r
+ command : 'editplaceholder',\r
+ group : 'placeholder',\r
+ order : 1,\r
+ icon : this.path + 'placeholder.gif'\r
+ }\r
+ } );\r
+\r
+ if ( editor.contextMenu )\r
+ {\r
+ editor.contextMenu.addListener( function( element, selection )\r
+ {\r
+ if ( !element || !element.data( 'cke-placeholder' ) )\r
+ return null;\r
+\r
+ return { editplaceholder : CKEDITOR.TRISTATE_OFF };\r
+ } );\r
+ }\r
+ }\r
+\r
+ editor.on( 'doubleclick', function( evt )\r
+ {\r
+ if ( CKEDITOR.plugins.placeholder.getSelectedPlaceHoder( editor ) )\r
+ evt.data.dialog = 'editplaceholder';\r
+ });\r
+\r
+ editor.addCss(\r
+ '.cke_placeholder' +\r
+ '{' +\r
+ 'background-color: #ffff00;' +\r
+ ( CKEDITOR.env.gecko ? 'cursor: default;' : '' ) +\r
+ '}'\r
+ );\r
+\r
+ editor.on( 'contentDom', function()\r
+ {\r
+ editor.document.getBody().on( 'resizestart', function( evt )\r
+ {\r
+ if ( editor.getSelection().getSelectedElement().data( 'cke-placeholder' ) )\r
+ evt.data.preventDefault();\r
+ });\r
+ });\r
+\r
+ CKEDITOR.dialog.add( 'createplaceholder', this.path + 'dialogs/placeholder.js' );\r
+ CKEDITOR.dialog.add( 'editplaceholder', this.path + 'dialogs/placeholder.js' );\r
+ },\r
+ afterInit : function( editor )\r
+ {\r
+ var dataProcessor = editor.dataProcessor,\r
+ dataFilter = dataProcessor && dataProcessor.dataFilter,\r
+ htmlFilter = dataProcessor && dataProcessor.htmlFilter;\r
+\r
+ if ( dataFilter )\r
+ {\r
+ dataFilter.addRules(\r
+ {\r
+ text : function( text )\r
+ {\r
+ return text.replace( placeholderReplaceRegex, function( match )\r
+ {\r
+ return CKEDITOR.plugins.placeholder.createPlaceholder( editor, null, match, 1 );\r
+ });\r
+ }\r
+ });\r
+ }\r
+\r
+ if ( htmlFilter )\r
+ {\r
+ htmlFilter.addRules(\r
+ {\r
+ elements :\r
+ {\r
+ 'span' : function( element )\r
+ {\r
+ if ( element.attributes && element.attributes[ 'data-cke-placeholder' ] )\r
+ delete element.name;\r
+ }\r
+ }\r
+ });\r
+ }\r
+ }\r
+ });\r
+})();\r
+\r
+CKEDITOR.plugins.placeholder =\r
+{\r
+ createPlaceholder : function( editor, oldElement, text, isGet )\r
+ {\r
+ var element = new CKEDITOR.dom.element( 'span', editor.document );\r
+ element.setAttributes(\r
+ {\r
+ contentEditable : 'false',\r
+ 'data-cke-placeholder' : 1,\r
+ 'class' : 'cke_placeholder'\r
+ }\r
+ );\r
+\r
+ text && element.setText( text );\r
+\r
+ if ( isGet )\r
+ return element.getOuterHtml();\r
+\r
+ if ( oldElement )\r
+ {\r
+ if ( CKEDITOR.env.ie )\r
+ {\r
+ element.insertAfter( oldElement );\r
+ // Some time is required for IE before the element is removed.\r
+ setTimeout( function()\r
+ {\r
+ oldElement.remove();\r
+ element.focus();\r
+ }, 10 );\r
+ }\r
+ else\r
+ element.replace( oldElement );\r
+ }\r
+ else\r
+ editor.insertElement( element );\r
+\r
+ return null;\r
+ },\r
+\r
+ getSelectedPlaceHoder : function( editor )\r
+ {\r
+ var range = editor.getSelection().getRanges()[ 0 ];\r
+ range.shrink( CKEDITOR.SHRINK_TEXT );\r
+ var node = range.startContainer;\r
+ while( node && !( node.type == CKEDITOR.NODE_ELEMENT && node.data( 'cke-placeholder' ) ) )\r
+ node = node.getParent();\r
+ return node;\r
+ }\r
+};\r