import torrus 1.0.9
[freeside.git] / rt / share / html / NoAuth / RichText / FCKeditor / editor / _source / internals / fckselection_ie.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  * Active selection functions. (IE specific implementation)\r
22  */\r
23 \r
24 // Get the selection type.\r
25 FCKSelection.GetType = function()\r
26 {\r
27         // It is possible that we can still get a text range object even when type=='None' is returned by IE.\r
28         // So we'd better check the object returned by createRange() rather than by looking at the type.\r
29         try\r
30         {\r
31                 var ieType = FCKSelection.GetSelection().type ;\r
32                 if ( ieType == 'Control' || ieType == 'Text' )\r
33                         return ieType ;\r
34 \r
35                 if ( this.GetSelection().createRange().parentElement )\r
36                         return 'Text' ;\r
37         }\r
38         catch(e)\r
39         {\r
40                 // Nothing to do, it will return None properly.\r
41         }\r
42 \r
43         return 'None' ;\r
44 } ;\r
45 \r
46 // Retrieves the selected element (if any), just in the case that a single\r
47 // element (object like and image or a table) is selected.\r
48 FCKSelection.GetSelectedElement = function()\r
49 {\r
50         if ( this.GetType() == 'Control' )\r
51         {\r
52                 var oRange = this.GetSelection().createRange() ;\r
53 \r
54                 if ( oRange && oRange.item )\r
55                         return this.GetSelection().createRange().item(0) ;\r
56         }\r
57         return null ;\r
58 } ;\r
59 \r
60 FCKSelection.GetParentElement = function()\r
61 {\r
62         switch ( this.GetType() )\r
63         {\r
64                 case 'Control' :\r
65                         var el = FCKSelection.GetSelectedElement() ;\r
66                         return el ? el.parentElement : null ;\r
67 \r
68                 case 'None' :\r
69                         return null ;\r
70 \r
71                 default :\r
72                         return this.GetSelection().createRange().parentElement() ;\r
73         }\r
74 } ;\r
75 \r
76 FCKSelection.GetBoundaryParentElement = function( startBoundary )\r
77 {\r
78         switch ( this.GetType() )\r
79         {\r
80                 case 'Control' :\r
81                         var el = FCKSelection.GetSelectedElement() ;\r
82                         return el ? el.parentElement : null ;\r
83 \r
84                 case 'None' :\r
85                         return null ;\r
86 \r
87                 default :\r
88                         var doc = FCK.EditorDocument ;\r
89 \r
90                         var range = doc.selection.createRange() ;\r
91                         range.collapse( startBoundary !== false ) ;\r
92 \r
93                         var el = range.parentElement() ;\r
94 \r
95                         // It may happen that range is comming from outside "doc", so we\r
96                         // must check it (#1204).\r
97                         return FCKTools.GetElementDocument( el ) == doc ? el : null ;\r
98         }\r
99 } ;\r
100 \r
101 FCKSelection.SelectNode = function( node )\r
102 {\r
103         FCK.Focus() ;\r
104         this.GetSelection().empty() ;\r
105         var oRange ;\r
106         try\r
107         {\r
108                 // Try to select the node as a control.\r
109                 oRange = FCK.EditorDocument.body.createControlRange() ;\r
110                 oRange.addElement( node ) ;\r
111         }\r
112         catch(e)\r
113         {\r
114                 // If failed, select it as a text range.\r
115                 oRange = FCK.EditorDocument.body.createTextRange() ;\r
116                 oRange.moveToElementText( node ) ;\r
117         }\r
118 \r
119         oRange.select() ;\r
120 } ;\r
121 \r
122 FCKSelection.Collapse = function( toStart )\r
123 {\r
124         FCK.Focus() ;\r
125         if ( this.GetType() == 'Text' )\r
126         {\r
127                 var oRange = this.GetSelection().createRange() ;\r
128                 oRange.collapse( toStart == null || toStart === true ) ;\r
129                 oRange.select() ;\r
130         }\r
131 } ;\r
132 \r
133 // The "nodeTagName" parameter must be Upper Case.\r
134 FCKSelection.HasAncestorNode = function( nodeTagName )\r
135 {\r
136         var oContainer ;\r
137 \r
138         if ( this.GetSelection().type == "Control" )\r
139         {\r
140                 oContainer = this.GetSelectedElement() ;\r
141         }\r
142         else\r
143         {\r
144                 var oRange  = this.GetSelection().createRange() ;\r
145                 oContainer = oRange.parentElement() ;\r
146         }\r
147 \r
148         while ( oContainer )\r
149         {\r
150                 if ( oContainer.nodeName.IEquals( nodeTagName ) ) return true ;\r
151                 oContainer = oContainer.parentNode ;\r
152         }\r
153 \r
154         return false ;\r
155 } ;\r
156 \r
157 // The "nodeTagName" parameter must be UPPER CASE.\r
158 // It can be also an array of names\r
159 FCKSelection.MoveToAncestorNode = function( nodeTagName )\r
160 {\r
161         var oNode, oRange ;\r
162 \r
163         if ( ! FCK.EditorDocument )\r
164                 return null ;\r
165 \r
166         if ( this.GetSelection().type == "Control" )\r
167         {\r
168                 oRange = this.GetSelection().createRange() ;\r
169                 for ( i = 0 ; i < oRange.length ; i++ )\r
170                 {\r
171                         if (oRange(i).parentNode)\r
172                         {\r
173                                 oNode = oRange(i).parentNode ;\r
174                                 break ;\r
175                         }\r
176                 }\r
177         }\r
178         else\r
179         {\r
180                 oRange  = this.GetSelection().createRange() ;\r
181                 oNode = oRange.parentElement() ;\r
182         }\r
183 \r
184         while ( oNode && !oNode.nodeName.Equals( nodeTagName ) )\r
185                 oNode = oNode.parentNode ;\r
186 \r
187         return oNode ;\r
188 } ;\r
189 \r
190 FCKSelection.Delete = function()\r
191 {\r
192         // Gets the actual selection.\r
193         var oSel = this.GetSelection() ;\r
194 \r
195         // Deletes the actual selection contents.\r
196         if ( oSel.type.toLowerCase() != "none" )\r
197         {\r
198                 oSel.clear() ;\r
199         }\r
200 \r
201         return oSel ;\r
202 } ;\r
203 \r
204 /**\r
205  * Returns the native selection object.\r
206  */\r
207 FCKSelection.GetSelection = function()\r
208 {\r
209         this.Restore() ;\r
210         return FCK.EditorDocument.selection ;\r
211 }\r
212 \r
213 FCKSelection.Save = function( lock )\r
214 {\r
215         var editorDocument = FCK.EditorDocument ;\r
216 \r
217         if ( !editorDocument )\r
218                 return ;\r
219 \r
220         // Avoid saving again a selection while a dialog is open #2616\r
221         if ( this.locked )\r
222                 return ;\r
223         this.locked = !!lock ;\r
224 \r
225         var selection = editorDocument.selection ;\r
226         var range ;\r
227 \r
228         if ( selection )\r
229         {\r
230                 // The call might fail if the document doesn't have the focus (#1801),\r
231                 // but we don't want to modify the current selection (#2495) with a call to FCK.Focus() ;\r
232                 try {\r
233                         range = selection.createRange() ;\r
234                 }\r
235                 catch(e) {}\r
236 \r
237                 // Ensure that the range comes from the editor document.\r
238                 if ( range )\r
239                 {\r
240                         if ( range.parentElement && FCKTools.GetElementDocument( range.parentElement() ) != editorDocument )\r
241                                 range = null ;\r
242                         else if ( range.item && FCKTools.GetElementDocument( range.item(0) )!= editorDocument )\r
243                                 range = null ;\r
244                 }\r
245         }\r
246 \r
247         this.SelectionData = range ;\r
248 }\r
249 \r
250 FCKSelection._GetSelectionDocument = function( selection )\r
251 {\r
252         var range = selection.createRange() ;\r
253         if ( !range )\r
254                 return null;\r
255         else if ( range.item )\r
256                 return FCKTools.GetElementDocument( range.item( 0 ) ) ;\r
257         else\r
258                 return FCKTools.GetElementDocument( range.parentElement() ) ;\r
259 }\r
260 \r
261 FCKSelection.Restore = function()\r
262 {\r
263         if ( this.SelectionData )\r
264         {\r
265                 FCK.IsSelectionChangeLocked = true ;\r
266 \r
267                 try\r
268                 {\r
269                         // Don't repeat the restore process if the editor document is already selected.\r
270                         if ( String( this._GetSelectionDocument( FCK.EditorDocument.selection ).body.contentEditable ) == 'true' )\r
271                         {\r
272                                 FCK.IsSelectionChangeLocked = false ;\r
273                                 return ;\r
274                         }\r
275                         this.SelectionData.select() ;\r
276                 }\r
277                 catch ( e ) {}\r
278 \r
279                 FCK.IsSelectionChangeLocked = false ;\r
280         }\r
281 }\r
282 \r
283 FCKSelection.Release = function()\r
284 {\r
285         this.locked = false ;\r
286         delete this.SelectionData ;\r
287 }\r