import rt 3.8.7
[freeside.git] / rt / share / html / NoAuth / RichText / FCKeditor / editor / _source / internals / fcklisthandler.js
diff --git a/rt/share/html/NoAuth/RichText/FCKeditor/editor/_source/internals/fcklisthandler.js b/rt/share/html/NoAuth/RichText/FCKeditor/editor/_source/internals/fcklisthandler.js
new file mode 100644 (file)
index 0000000..32c237f
--- /dev/null
@@ -0,0 +1,152 @@
+/*\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
+ * Tool object to manage HTML lists items (UL, OL and LI).\r
+ */\r
+\r
+var FCKListHandler =\r
+{\r
+       OutdentListItem : function( listItem )\r
+       {\r
+               var eParent = listItem.parentNode ;\r
+\r
+               // It may happen that a LI is not in a UL or OL (Orphan).\r
+               if ( eParent.tagName.toUpperCase().Equals( 'UL','OL' ) )\r
+               {\r
+                       var oDocument = FCKTools.GetElementDocument( listItem ) ;\r
+                       var oDogFrag = new FCKDocumentFragment( oDocument ) ;\r
+\r
+                       // All children and successive siblings will be moved to a a DocFrag.\r
+                       var eNextSiblings = oDogFrag.RootNode ;\r
+                       var eHasLiSibling = false ;\r
+\r
+                       // If we have nested lists inside it, let's move it to the list of siblings.\r
+                       var eChildList = FCKDomTools.GetFirstChild( listItem, ['UL','OL'] ) ;\r
+                       if ( eChildList )\r
+                       {\r
+                               eHasLiSibling = true ;\r
+\r
+                               var eChild ;\r
+                               // The extra () is to avoid a warning with strict error checking. This is ok.\r
+                               while ( (eChild = eChildList.firstChild) )\r
+                                       eNextSiblings.appendChild( eChildList.removeChild( eChild ) ) ;\r
+\r
+                               FCKDomTools.RemoveNode( eChildList ) ;\r
+                       }\r
+\r
+                       // Move all successive siblings.\r
+                       var eSibling ;\r
+                       var eHasSuccessiveLiSibling = false ;\r
+                       // The extra () is to avoid a warning with strict error checking. This is ok.\r
+                       while ( (eSibling = listItem.nextSibling) )\r
+                       {\r
+                               if ( !eHasLiSibling && eSibling.nodeType == 1 && eSibling.nodeName.toUpperCase() == 'LI' )\r
+                                       eHasSuccessiveLiSibling = eHasLiSibling = true ;\r
+\r
+                               eNextSiblings.appendChild( eSibling.parentNode.removeChild( eSibling ) ) ;\r
+\r
+                               // If a sibling is a incorrectly nested UL or OL, consider only its children.\r
+                               if ( !eHasSuccessiveLiSibling && eSibling.nodeType == 1 && eSibling.nodeName.toUpperCase().Equals( 'UL','OL' ) )\r
+                                       FCKDomTools.RemoveNode( eSibling, true ) ;\r
+                       }\r
+\r
+                       // If we are in a list chain.\r
+                       var sParentParentTag = eParent.parentNode.tagName.toUpperCase() ;\r
+                       var bWellNested = ( sParentParentTag == 'LI' ) ;\r
+                       if ( bWellNested || sParentParentTag.Equals( 'UL','OL' ) )\r
+                       {\r
+                               if ( eHasLiSibling )\r
+                               {\r
+                                       var eChildList = eParent.cloneNode( false ) ;\r
+                                       oDogFrag.AppendTo( eChildList ) ;\r
+                                       listItem.appendChild( eChildList ) ;\r
+                               }\r
+                               else if ( bWellNested )\r
+                                       oDogFrag.InsertAfterNode( eParent.parentNode ) ;\r
+                               else\r
+                                       oDogFrag.InsertAfterNode( eParent ) ;\r
+\r
+                               // Move the LI after its parent.parentNode (the upper LI in the hierarchy).\r
+                               if ( bWellNested )\r
+                                       FCKDomTools.InsertAfterNode( eParent.parentNode, eParent.removeChild( listItem ) ) ;\r
+                               else\r
+                                       FCKDomTools.InsertAfterNode( eParent, eParent.removeChild( listItem ) ) ;\r
+                       }\r
+                       else\r
+                       {\r
+                               if ( eHasLiSibling )\r
+                               {\r
+                                       var eNextList = eParent.cloneNode( false ) ;\r
+                                       oDogFrag.AppendTo( eNextList ) ;\r
+                                       FCKDomTools.InsertAfterNode( eParent, eNextList ) ;\r
+                               }\r
+\r
+                               var eBlock = oDocument.createElement( FCKConfig.EnterMode == 'p' ? 'p' : 'div' ) ;\r
+                               FCKDomTools.MoveChildren( eParent.removeChild( listItem ), eBlock ) ;\r
+                               FCKDomTools.InsertAfterNode( eParent, eBlock ) ;\r
+\r
+                               if ( FCKConfig.EnterMode == 'br' )\r
+                               {\r
+                                       // We need the bogus to make it work properly. In Gecko, we\r
+                                       // need it before the new block, on IE, after it.\r
+                                       if ( FCKBrowserInfo.IsGecko )\r
+                                               eBlock.parentNode.insertBefore( FCKTools.CreateBogusBR( oDocument ), eBlock ) ;\r
+                                       else\r
+                                               FCKDomTools.InsertAfterNode( eBlock, FCKTools.CreateBogusBR( oDocument ) ) ;\r
+\r
+                                       FCKDomTools.RemoveNode( eBlock, true ) ;\r
+                               }\r
+                       }\r
+\r
+                       if ( this.CheckEmptyList( eParent ) )\r
+                               FCKDomTools.RemoveNode( eParent, true ) ;\r
+               }\r
+       },\r
+\r
+       CheckEmptyList : function( listElement )\r
+       {\r
+               return ( FCKDomTools.GetFirstChild( listElement, 'LI' ) == null ) ;\r
+       },\r
+\r
+       // Check if the list has contents (excluding nested lists).\r
+       CheckListHasContents : function( listElement )\r
+       {\r
+               var eChildNode = listElement.firstChild ;\r
+\r
+               while ( eChildNode )\r
+               {\r
+                       switch ( eChildNode.nodeType )\r
+                       {\r
+                               case 1 :\r
+                                       if ( !eChildNode.nodeName.IEquals( 'UL','LI' ) )\r
+                                               return true ;\r
+                                       break ;\r
+\r
+                               case 3 :\r
+                                       if ( eChildNode.nodeValue.Trim().length > 0 )\r
+                                               return true ;\r
+                       }\r
+\r
+                       eChildNode = eChildNode.nextSibling ;\r
+               }\r
+\r
+               return false ;\r
+       }\r
+} ;\r