--- /dev/null
+/*\r
+Copyright (c) 2003-2009, CKSource - Frederico Knabben. All rights reserved.\r
+For licensing, see LICENSE.html or http://ckeditor.com/license\r
+*/\r
+\r
+/**\r
+ * @file Justify commands.\r
+ */\r
+\r
+(function()\r
+{\r
+ var alignRemoveRegex = /(-moz-|-webkit-|start|auto)/i;\r
+\r
+ function getState( editor, path )\r
+ {\r
+ var firstBlock = path.block || path.blockLimit;\r
+\r
+ if ( !firstBlock || firstBlock.getName() == 'body' )\r
+ return CKEDITOR.TRISTATE_OFF;\r
+\r
+ var currentAlign = firstBlock.getComputedStyle( 'text-align' ).replace( alignRemoveRegex, '' );\r
+ if ( ( !currentAlign && this.isDefaultAlign ) || currentAlign == this.value )\r
+ return CKEDITOR.TRISTATE_ON;\r
+ return CKEDITOR.TRISTATE_OFF;\r
+ }\r
+\r
+ function onSelectionChange( evt )\r
+ {\r
+ var command = evt.editor.getCommand( this.name );\r
+ command.state = getState.call( this, evt.editor, evt.data.path );\r
+ command.fire( 'state' );\r
+ }\r
+\r
+ function justifyCommand( editor, name, value )\r
+ {\r
+ this.name = name;\r
+ this.value = value;\r
+\r
+ var contentDir = editor.config.contentsLangDirection;\r
+ this.isDefaultAlign = ( value == 'left' && contentDir == 'ltr' ) ||\r
+ ( value == 'right' && contentDir == 'rtl' );\r
+\r
+ var classes = editor.config.justifyClasses;\r
+ if ( classes )\r
+ {\r
+ switch ( value )\r
+ {\r
+ case 'left' :\r
+ this.cssClassName = classes[0];\r
+ break;\r
+ case 'center' :\r
+ this.cssClassName = classes[1];\r
+ break;\r
+ case 'right' :\r
+ this.cssClassName = classes[2];\r
+ break;\r
+ case 'justify' :\r
+ this.cssClassName = classes[3];\r
+ break;\r
+ }\r
+\r
+ this.cssClassRegex = new RegExp( '(?:^|\\s+)(?:' + classes.join( '|' ) + ')(?=$|\\s)' );\r
+ }\r
+ }\r
+\r
+ justifyCommand.prototype = {\r
+ exec : function( editor )\r
+ {\r
+ var selection = editor.getSelection();\r
+ if ( !selection )\r
+ return;\r
+\r
+ var bookmarks = selection.createBookmarks(),\r
+ ranges = selection.getRanges();\r
+\r
+\r
+ var cssClassName = this.cssClassName,\r
+ iterator,\r
+ block;\r
+ for ( var i = ranges.length - 1 ; i >= 0 ; i-- )\r
+ {\r
+ iterator = ranges[ i ].createIterator();\r
+ while ( ( block = iterator.getNextParagraph() ) )\r
+ {\r
+ block.removeAttribute( 'align' );\r
+\r
+ if ( cssClassName )\r
+ {\r
+ // Remove any of the alignment classes from the className.\r
+ var className = block.$.className =\r
+ CKEDITOR.tools.ltrim( block.$.className.replace( this.cssClassRegex, '' ) );\r
+\r
+ // Append the desired class name.\r
+ if ( this.state == CKEDITOR.TRISTATE_OFF && !this.isDefaultAlign )\r
+ block.addClass( cssClassName );\r
+ else if ( !className )\r
+ block.removeAttribute( 'class' );\r
+ }\r
+ else\r
+ {\r
+ if ( this.state == CKEDITOR.TRISTATE_OFF && !this.isDefaultAlign )\r
+ block.setStyle( 'text-align', this.value );\r
+ else\r
+ block.removeStyle( 'text-align' );\r
+ }\r
+ }\r
+\r
+ }\r
+\r
+ editor.focus();\r
+ editor.forceNextSelectionCheck();\r
+ selection.selectBookmarks( bookmarks );\r
+ }\r
+ };\r
+\r
+ CKEDITOR.plugins.add( 'justify',\r
+ {\r
+ init : function( editor )\r
+ {\r
+ var left = new justifyCommand( editor, 'justifyleft', 'left' ),\r
+ center = new justifyCommand( editor, 'justifycenter', 'center' ),\r
+ right = new justifyCommand( editor, 'justifyright', 'right' ),\r
+ justify = new justifyCommand( editor, 'justifyblock', 'justify' );\r
+\r
+ editor.addCommand( 'justifyleft', left );\r
+ editor.addCommand( 'justifycenter', center );\r
+ editor.addCommand( 'justifyright', right );\r
+ editor.addCommand( 'justifyblock', justify );\r
+\r
+ editor.ui.addButton( 'JustifyLeft',\r
+ {\r
+ label : editor.lang.justify.left,\r
+ command : 'justifyleft'\r
+ } );\r
+ editor.ui.addButton( 'JustifyCenter',\r
+ {\r
+ label : editor.lang.justify.center,\r
+ command : 'justifycenter'\r
+ } );\r
+ editor.ui.addButton( 'JustifyRight',\r
+ {\r
+ label : editor.lang.justify.right,\r
+ command : 'justifyright'\r
+ } );\r
+ editor.ui.addButton( 'JustifyBlock',\r
+ {\r
+ label : editor.lang.justify.block,\r
+ command : 'justifyblock'\r
+ } );\r
+\r
+ editor.on( 'selectionChange', CKEDITOR.tools.bind( onSelectionChange, left ) );\r
+ editor.on( 'selectionChange', CKEDITOR.tools.bind( onSelectionChange, right ) );\r
+ editor.on( 'selectionChange', CKEDITOR.tools.bind( onSelectionChange, center ) );\r
+ editor.on( 'selectionChange', CKEDITOR.tools.bind( onSelectionChange, justify ) );\r
+ },\r
+\r
+ requires : [ 'domiterator' ]\r
+ });\r
+})();\r
+\r
+CKEDITOR.tools.extend( CKEDITOR.config,\r
+ {\r
+ justifyClasses : null\r
+ } );\r