import rt 3.8.7
[freeside.git] / rt / share / html / NoAuth / RichText / FCKeditor / editor / _source / commandclasses / fckjustifycommands.js
1 /*\r
2  * FCKeditor - The text editor for Internet - http://www.fckeditor.net\r
3  * Copyright (C) 2003-2009 Frederico Caldeira Knabben\r
4  *\r
5  * == BEGIN LICENSE ==\r
6  *\r
7  * Licensed under the terms of any of the following licenses at your\r
8  * choice:\r
9  *\r
10  *  - GNU General Public License Version 2 or later (the "GPL")\r
11  *    http://www.gnu.org/licenses/gpl.html\r
12  *\r
13  *  - GNU Lesser General Public License Version 2.1 or later (the "LGPL")\r
14  *    http://www.gnu.org/licenses/lgpl.html\r
15  *\r
16  *  - Mozilla Public License Version 1.1 or later (the "MPL")\r
17  *    http://www.mozilla.org/MPL/MPL-1.1.html\r
18  *\r
19  * == END LICENSE ==\r
20  *\r
21  * FCKJustifyCommand Class: controls block justification.\r
22  */\r
23 \r
24 var FCKJustifyCommand = function( alignValue )\r
25 {\r
26         this.AlignValue = alignValue ;\r
27 \r
28         // Detect whether this is the instance for the default alignment.\r
29         var contentDir = FCKConfig.ContentLangDirection.toLowerCase() ;\r
30         this.IsDefaultAlign = ( alignValue == 'left' && contentDir == 'ltr' ) ||\r
31                                                   ( alignValue == 'right' && contentDir == 'rtl' ) ;\r
32 \r
33         // Get the class name to be used by this instance.\r
34         var cssClassName = this._CssClassName = ( function()\r
35         {\r
36                 var classes = FCKConfig.JustifyClasses ;\r
37                 if ( classes )\r
38                 {\r
39                         switch ( alignValue )\r
40                         {\r
41                                 case 'left' :\r
42                                         return classes[0] || null ;\r
43                                 case 'center' :\r
44                                         return classes[1] || null ;\r
45                                 case 'right' :\r
46                                         return classes[2] || null ;\r
47                                 case 'justify' :\r
48                                         return classes[3] || null ;\r
49                         }\r
50                 }\r
51                 return null ;\r
52         } )() ;\r
53 \r
54         if ( cssClassName && cssClassName.length > 0 )\r
55                 this._CssClassRegex = new RegExp( '(?:^|\\s+)' + cssClassName + '(?=$|\\s)' ) ;\r
56 }\r
57 \r
58 FCKJustifyCommand._GetClassNameRegex = function()\r
59 {\r
60         var regex = FCKJustifyCommand._ClassRegex ;\r
61         if ( regex != undefined )\r
62                 return regex ;\r
63 \r
64         var names = [] ;\r
65 \r
66         var classes = FCKConfig.JustifyClasses ;\r
67         if ( classes )\r
68         {\r
69                 for ( var i = 0 ; i < 4 ; i++ )\r
70                 {\r
71                         var className = classes[i] ;\r
72                         if ( className && className.length > 0 )\r
73                                 names.push( className ) ;\r
74                 }\r
75         }\r
76 \r
77         if ( names.length > 0 )\r
78                 regex = new RegExp( '(?:^|\\s+)(?:' + names.join( '|' ) + ')(?=$|\\s)' ) ;\r
79         else\r
80                 regex = null ;\r
81 \r
82         return FCKJustifyCommand._ClassRegex = regex ;\r
83 }\r
84 \r
85 FCKJustifyCommand.prototype =\r
86 {\r
87         Execute : function()\r
88         {\r
89                 // Save an undo snapshot before doing anything.\r
90                 FCKUndo.SaveUndoStep() ;\r
91 \r
92                 var range = new FCKDomRange( FCK.EditorWindow ) ;\r
93                 range.MoveToSelection() ;\r
94 \r
95                 var currentState = this.GetState() ;\r
96                 if ( currentState == FCK_TRISTATE_DISABLED )\r
97                         return ;\r
98 \r
99                 // Store a bookmark of the selection since the paragraph iterator might\r
100                 // change the DOM tree and break selections.\r
101                 var bookmark = range.CreateBookmark() ;\r
102 \r
103                 var cssClassName = this._CssClassName ;\r
104 \r
105                 // Apply alignment setting for each paragraph.\r
106                 var iterator = new FCKDomRangeIterator( range ) ;\r
107                 var block ;\r
108                 while ( ( block = iterator.GetNextParagraph() ) )\r
109                 {\r
110                         block.removeAttribute( 'align' ) ;\r
111 \r
112                         if ( cssClassName )\r
113                         {\r
114                                 // Remove the any of the alignment classes from the className.\r
115                                 var className = block.className.replace( FCKJustifyCommand._GetClassNameRegex(), '' ) ;\r
116 \r
117                                 // Append the desired class name.\r
118                                 if ( currentState == FCK_TRISTATE_OFF )\r
119                                 {\r
120                                         if ( className.length > 0 )\r
121                                                 className += ' ' ;\r
122                                         block.className = className + cssClassName ;\r
123                                 }\r
124                                 else if ( className.length == 0 )\r
125                                         FCKDomTools.RemoveAttribute( block, 'class' ) ;\r
126                         }\r
127                         else\r
128                         {\r
129                                 var style = block.style ;\r
130                                 if ( currentState == FCK_TRISTATE_OFF )\r
131                                         style.textAlign = this.AlignValue ;\r
132                                 else\r
133                                 {\r
134                                         style.textAlign = '' ;\r
135                                         if ( style.cssText.length == 0 )\r
136                                                 block.removeAttribute( 'style' ) ;\r
137                                 }\r
138                         }\r
139                 }\r
140 \r
141                 // Restore previous selection.\r
142                 range.MoveToBookmark( bookmark ) ;\r
143                 range.Select() ;\r
144 \r
145                 FCK.Focus() ;\r
146                 FCK.Events.FireEvent( 'OnSelectionChange' ) ;\r
147         },\r
148 \r
149         GetState : function()\r
150         {\r
151                 // Disabled if not WYSIWYG.\r
152                 if ( FCK.EditMode != FCK_EDITMODE_WYSIWYG || ! FCK.EditorWindow )\r
153                         return FCK_TRISTATE_DISABLED ;\r
154 \r
155                 // Retrieve the first selected block.\r
156                 var path = new FCKElementPath( FCKSelection.GetBoundaryParentElement( true ) ) ;\r
157                 var firstBlock = path.Block || path.BlockLimit ;\r
158 \r
159                 if ( !firstBlock || firstBlock.nodeName.toLowerCase() == 'body' )\r
160                         return FCK_TRISTATE_OFF ;\r
161 \r
162                 // Check if the desired style is already applied to the block.\r
163                 var currentAlign ;\r
164                 if ( FCKBrowserInfo.IsIE )\r
165                         currentAlign = firstBlock.currentStyle.textAlign ;\r
166                 else\r
167                         currentAlign = FCK.EditorWindow.getComputedStyle( firstBlock, '' ).getPropertyValue( 'text-align' );\r
168                 currentAlign = currentAlign.replace( /(-moz-|-webkit-|start|auto)/i, '' );\r
169                 if ( ( !currentAlign && this.IsDefaultAlign ) || currentAlign == this.AlignValue )\r
170                         return FCK_TRISTATE_ON ;\r
171                 return FCK_TRISTATE_OFF ;\r
172         }\r
173 } ;\r