--- /dev/null
+/*\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