import rt 3.8.7
[freeside.git] / rt / share / html / NoAuth / RichText / FCKeditor / editor / _source / internals / fckselection_ie.js
diff --git a/rt/share/html/NoAuth/RichText/FCKeditor/editor/_source/internals/fckselection_ie.js b/rt/share/html/NoAuth/RichText/FCKeditor/editor/_source/internals/fckselection_ie.js
new file mode 100644 (file)
index 0000000..7dc180f
--- /dev/null
@@ -0,0 +1,287 @@
+/*\r
+ * FCKeditor - The text editor for Internet - http://www.fckeditor.net\r
+ * Copyright (C) 2003-2009 Frederico Caldeira Knabben\r
+ *\r
+ * == BEGIN LICENSE ==\r
+ *\r
+ * Licensed under the terms of any of the following licenses at your\r
+ * choice:\r
+ *\r
+ *  - GNU General Public License Version 2 or later (the "GPL")\r
+ *    http://www.gnu.org/licenses/gpl.html\r
+ *\r
+ *  - GNU Lesser General Public License Version 2.1 or later (the "LGPL")\r
+ *    http://www.gnu.org/licenses/lgpl.html\r
+ *\r
+ *  - Mozilla Public License Version 1.1 or later (the "MPL")\r
+ *    http://www.mozilla.org/MPL/MPL-1.1.html\r
+ *\r
+ * == END LICENSE ==\r
+ *\r
+ * Active selection functions. (IE specific implementation)\r
+ */\r
+\r
+// Get the selection type.\r
+FCKSelection.GetType = function()\r
+{\r
+       // It is possible that we can still get a text range object even when type=='None' is returned by IE.\r
+       // So we'd better check the object returned by createRange() rather than by looking at the type.\r
+       try\r
+       {\r
+               var ieType = FCKSelection.GetSelection().type ;\r
+               if ( ieType == 'Control' || ieType == 'Text' )\r
+                       return ieType ;\r
+\r
+               if ( this.GetSelection().createRange().parentElement )\r
+                       return 'Text' ;\r
+       }\r
+       catch(e)\r
+       {\r
+               // Nothing to do, it will return None properly.\r
+       }\r
+\r
+       return 'None' ;\r
+} ;\r
+\r
+// Retrieves the selected element (if any), just in the case that a single\r
+// element (object like and image or a table) is selected.\r
+FCKSelection.GetSelectedElement = function()\r
+{\r
+       if ( this.GetType() == 'Control' )\r
+       {\r
+               var oRange = this.GetSelection().createRange() ;\r
+\r
+               if ( oRange && oRange.item )\r
+                       return this.GetSelection().createRange().item(0) ;\r
+       }\r
+       return null ;\r
+} ;\r
+\r
+FCKSelection.GetParentElement = function()\r
+{\r
+       switch ( this.GetType() )\r
+       {\r
+               case 'Control' :\r
+                       var el = FCKSelection.GetSelectedElement() ;\r
+                       return el ? el.parentElement : null ;\r
+\r
+               case 'None' :\r
+                       return null ;\r
+\r
+               default :\r
+                       return this.GetSelection().createRange().parentElement() ;\r
+       }\r
+} ;\r
+\r
+FCKSelection.GetBoundaryParentElement = function( startBoundary )\r
+{\r
+       switch ( this.GetType() )\r
+       {\r
+               case 'Control' :\r
+                       var el = FCKSelection.GetSelectedElement() ;\r
+                       return el ? el.parentElement : null ;\r
+\r
+               case 'None' :\r
+                       return null ;\r
+\r
+               default :\r
+                       var doc = FCK.EditorDocument ;\r
+\r
+                       var range = doc.selection.createRange() ;\r
+                       range.collapse( startBoundary !== false ) ;\r
+\r
+                       var el = range.parentElement() ;\r
+\r
+                       // It may happen that range is comming from outside "doc", so we\r
+                       // must check it (#1204).\r
+                       return FCKTools.GetElementDocument( el ) == doc ? el : null ;\r
+       }\r
+} ;\r
+\r
+FCKSelection.SelectNode = function( node )\r
+{\r
+       FCK.Focus() ;\r
+       this.GetSelection().empty() ;\r
+       var oRange ;\r
+       try\r
+       {\r
+               // Try to select the node as a control.\r
+               oRange = FCK.EditorDocument.body.createControlRange() ;\r
+               oRange.addElement( node ) ;\r
+       }\r
+       catch(e)\r
+       {\r
+               // If failed, select it as a text range.\r
+               oRange = FCK.EditorDocument.body.createTextRange() ;\r
+               oRange.moveToElementText( node ) ;\r
+       }\r
+\r
+       oRange.select() ;\r
+} ;\r
+\r
+FCKSelection.Collapse = function( toStart )\r
+{\r
+       FCK.Focus() ;\r
+       if ( this.GetType() == 'Text' )\r
+       {\r
+               var oRange = this.GetSelection().createRange() ;\r
+               oRange.collapse( toStart == null || toStart === true ) ;\r
+               oRange.select() ;\r
+       }\r
+} ;\r
+\r
+// The "nodeTagName" parameter must be Upper Case.\r
+FCKSelection.HasAncestorNode = function( nodeTagName )\r
+{\r
+       var oContainer ;\r
+\r
+       if ( this.GetSelection().type == "Control" )\r
+       {\r
+               oContainer = this.GetSelectedElement() ;\r
+       }\r
+       else\r
+       {\r
+               var oRange  = this.GetSelection().createRange() ;\r
+               oContainer = oRange.parentElement() ;\r
+       }\r
+\r
+       while ( oContainer )\r
+       {\r
+               if ( oContainer.nodeName.IEquals( nodeTagName ) ) return true ;\r
+               oContainer = oContainer.parentNode ;\r
+       }\r
+\r
+       return false ;\r
+} ;\r
+\r
+// The "nodeTagName" parameter must be UPPER CASE.\r
+// It can be also an array of names\r
+FCKSelection.MoveToAncestorNode = function( nodeTagName )\r
+{\r
+       var oNode, oRange ;\r
+\r
+       if ( ! FCK.EditorDocument )\r
+               return null ;\r
+\r
+       if ( this.GetSelection().type == "Control" )\r
+       {\r
+               oRange = this.GetSelection().createRange() ;\r
+               for ( i = 0 ; i < oRange.length ; i++ )\r
+               {\r
+                       if (oRange(i).parentNode)\r
+                       {\r
+                               oNode = oRange(i).parentNode ;\r
+                               break ;\r
+                       }\r
+               }\r
+       }\r
+       else\r
+       {\r
+               oRange  = this.GetSelection().createRange() ;\r
+               oNode = oRange.parentElement() ;\r
+       }\r
+\r
+       while ( oNode && !oNode.nodeName.Equals( nodeTagName ) )\r
+               oNode = oNode.parentNode ;\r
+\r
+       return oNode ;\r
+} ;\r
+\r
+FCKSelection.Delete = function()\r
+{\r
+       // Gets the actual selection.\r
+       var oSel = this.GetSelection() ;\r
+\r
+       // Deletes the actual selection contents.\r
+       if ( oSel.type.toLowerCase() != "none" )\r
+       {\r
+               oSel.clear() ;\r
+       }\r
+\r
+       return oSel ;\r
+} ;\r
+\r
+/**\r
+ * Returns the native selection object.\r
+ */\r
+FCKSelection.GetSelection = function()\r
+{\r
+       this.Restore() ;\r
+       return FCK.EditorDocument.selection ;\r
+}\r
+\r
+FCKSelection.Save = function( lock )\r
+{\r
+       var editorDocument = FCK.EditorDocument ;\r
+\r
+       if ( !editorDocument )\r
+               return ;\r
+\r
+       // Avoid saving again a selection while a dialog is open #2616\r
+       if ( this.locked )\r
+               return ;\r
+       this.locked = !!lock ;\r
+\r
+       var selection = editorDocument.selection ;\r
+       var range ;\r
+\r
+       if ( selection )\r
+       {\r
+               // The call might fail if the document doesn't have the focus (#1801),\r
+               // but we don't want to modify the current selection (#2495) with a call to FCK.Focus() ;\r
+               try {\r
+                       range = selection.createRange() ;\r
+               }\r
+               catch(e) {}\r
+\r
+               // Ensure that the range comes from the editor document.\r
+               if ( range )\r
+               {\r
+                       if ( range.parentElement && FCKTools.GetElementDocument( range.parentElement() ) != editorDocument )\r
+                               range = null ;\r
+                       else if ( range.item && FCKTools.GetElementDocument( range.item(0) )!= editorDocument )\r
+                               range = null ;\r
+               }\r
+       }\r
+\r
+       this.SelectionData = range ;\r
+}\r
+\r
+FCKSelection._GetSelectionDocument = function( selection )\r
+{\r
+       var range = selection.createRange() ;\r
+       if ( !range )\r
+               return null;\r
+       else if ( range.item )\r
+               return FCKTools.GetElementDocument( range.item( 0 ) ) ;\r
+       else\r
+               return FCKTools.GetElementDocument( range.parentElement() ) ;\r
+}\r
+\r
+FCKSelection.Restore = function()\r
+{\r
+       if ( this.SelectionData )\r
+       {\r
+               FCK.IsSelectionChangeLocked = true ;\r
+\r
+               try\r
+               {\r
+                       // Don't repeat the restore process if the editor document is already selected.\r
+                       if ( String( this._GetSelectionDocument( FCK.EditorDocument.selection ).body.contentEditable ) == 'true' )\r
+                       {\r
+                               FCK.IsSelectionChangeLocked = false ;\r
+                               return ;\r
+                       }\r
+                       this.SelectionData.select() ;\r
+               }\r
+               catch ( e ) {}\r
+\r
+               FCK.IsSelectionChangeLocked = false ;\r
+       }\r
+}\r
+\r
+FCKSelection.Release = function()\r
+{\r
+       this.locked = false ;\r
+       delete this.SelectionData ;\r
+}\r