import rt 3.8.7
[freeside.git] / rt / share / html / NoAuth / RichText / FCKeditor / editor / _source / internals / fckdocumentprocessor.js
diff --git a/rt/share/html/NoAuth/RichText/FCKeditor/editor/_source/internals/fckdocumentprocessor.js b/rt/share/html/NoAuth/RichText/FCKeditor/editor/_source/internals/fckdocumentprocessor.js
new file mode 100644 (file)
index 0000000..55fd117
--- /dev/null
@@ -0,0 +1,270 @@
+/*\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
+ * Advanced document processors.\r
+ */\r
+\r
+var FCKDocumentProcessor = new Object() ;\r
+FCKDocumentProcessor._Items = new Array() ;\r
+\r
+FCKDocumentProcessor.AppendNew = function()\r
+{\r
+       var oNewItem = new Object() ;\r
+       this._Items.push( oNewItem ) ;\r
+       return oNewItem ;\r
+}\r
+\r
+FCKDocumentProcessor.Process = function( document )\r
+{\r
+       var bIsDirty = FCK.IsDirty() ;\r
+       var oProcessor, i = 0 ;\r
+       while( ( oProcessor = this._Items[i++] ) )\r
+               oProcessor.ProcessDocument( document ) ;\r
+       if ( !bIsDirty )\r
+               FCK.ResetIsDirty() ;\r
+}\r
+\r
+var FCKDocumentProcessor_CreateFakeImage = function( fakeClass, realElement )\r
+{\r
+       var oImg = FCKTools.GetElementDocument( realElement ).createElement( 'IMG' ) ;\r
+       oImg.className = fakeClass ;\r
+       oImg.src = FCKConfig.BasePath + 'images/spacer.gif' ;\r
+       oImg.setAttribute( '_fckfakelement', 'true', 0 ) ;\r
+       oImg.setAttribute( '_fckrealelement', FCKTempBin.AddElement( realElement ), 0 ) ;\r
+       return oImg ;\r
+}\r
+\r
+// Link Anchors\r
+if ( FCKBrowserInfo.IsIE || FCKBrowserInfo.IsOpera )\r
+{\r
+       var FCKAnchorsProcessor = FCKDocumentProcessor.AppendNew() ;\r
+       FCKAnchorsProcessor.ProcessDocument = function( document )\r
+       {\r
+               var aLinks = document.getElementsByTagName( 'A' ) ;\r
+\r
+               var oLink ;\r
+               var i = aLinks.length - 1 ;\r
+               while ( i >= 0 && ( oLink = aLinks[i--] ) )\r
+               {\r
+                       // If it is anchor. Doesn't matter if it's also a link (even better: we show that it's both a link and an anchor)\r
+                       if ( oLink.name.length > 0 )\r
+                       {\r
+                               //if the anchor has some content then we just add a temporary class\r
+                               if ( oLink.innerHTML !== '' )\r
+                               {\r
+                                       if ( FCKBrowserInfo.IsIE )\r
+                                               oLink.className += ' FCK__AnchorC' ;\r
+                               }\r
+                               else\r
+                               {\r
+                                       var oImg = FCKDocumentProcessor_CreateFakeImage( 'FCK__Anchor', oLink.cloneNode(true) ) ;\r
+                                       oImg.setAttribute( '_fckanchor', 'true', 0 ) ;\r
+\r
+                                       oLink.parentNode.insertBefore( oImg, oLink ) ;\r
+                                       oLink.parentNode.removeChild( oLink ) ;\r
+                               }\r
+                       }\r
+               }\r
+       }\r
+}\r
+\r
+// Page Breaks\r
+var FCKPageBreaksProcessor = FCKDocumentProcessor.AppendNew() ;\r
+FCKPageBreaksProcessor.ProcessDocument = function( document )\r
+{\r
+       var aDIVs = document.getElementsByTagName( 'DIV' ) ;\r
+\r
+       var eDIV ;\r
+       var i = aDIVs.length - 1 ;\r
+       while ( i >= 0 && ( eDIV = aDIVs[i--] ) )\r
+       {\r
+               if ( eDIV.style.pageBreakAfter == 'always' && eDIV.childNodes.length == 1 && eDIV.childNodes[0].style && eDIV.childNodes[0].style.display == 'none' )\r
+               {\r
+                       var oFakeImage = FCKDocumentProcessor_CreateFakeImage( 'FCK__PageBreak', eDIV.cloneNode(true) ) ;\r
+\r
+                       eDIV.parentNode.insertBefore( oFakeImage, eDIV ) ;\r
+                       eDIV.parentNode.removeChild( eDIV ) ;\r
+               }\r
+       }\r
+/*\r
+       var aCenters = document.getElementsByTagName( 'CENTER' ) ;\r
+\r
+       var oCenter ;\r
+       var i = aCenters.length - 1 ;\r
+       while ( i >= 0 && ( oCenter = aCenters[i--] ) )\r
+       {\r
+               if ( oCenter.style.pageBreakAfter == 'always' && oCenter.innerHTML.Trim().length == 0 )\r
+               {\r
+                       var oFakeImage = FCKDocumentProcessor_CreateFakeImage( 'FCK__PageBreak', oCenter.cloneNode(true) ) ;\r
+\r
+                       oCenter.parentNode.insertBefore( oFakeImage, oCenter ) ;\r
+                       oCenter.parentNode.removeChild( oCenter ) ;\r
+               }\r
+       }\r
+*/\r
+}\r
+\r
+// EMBED and OBJECT tags.\r
+var FCKEmbedAndObjectProcessor = (function()\r
+{\r
+       var customProcessors = [] ;\r
+\r
+       var processElement = function( el )\r
+       {\r
+               var clone = el.cloneNode( true ) ;\r
+               var replaceElement ;\r
+               var fakeImg = replaceElement = FCKDocumentProcessor_CreateFakeImage( 'FCK__UnknownObject', clone ) ;\r
+               FCKEmbedAndObjectProcessor.RefreshView( fakeImg, el ) ;\r
+\r
+               for ( var i = 0 ; i < customProcessors.length ; i++ )\r
+                       replaceElement = customProcessors[i]( el, replaceElement ) || replaceElement ;\r
+\r
+               if ( replaceElement != fakeImg )\r
+                       FCKTempBin.RemoveElement( fakeImg.getAttribute( '_fckrealelement' ) ) ;\r
+\r
+               el.parentNode.replaceChild( replaceElement, el ) ;\r
+       }\r
+\r
+       var processElementsByName = function( elementName, doc )\r
+       {\r
+               var aObjects = doc.getElementsByTagName( elementName );\r
+               for ( var i = aObjects.length - 1 ; i >= 0 ; i-- )\r
+                       processElement( aObjects[i] ) ;\r
+       }\r
+\r
+       var processObjectAndEmbed = function( doc )\r
+       {\r
+               processElementsByName( 'object', doc );\r
+               processElementsByName( 'embed', doc );\r
+       }\r
+\r
+       return FCKTools.Merge( FCKDocumentProcessor.AppendNew(),\r
+                      {\r
+                               ProcessDocument : function( doc )\r
+                               {\r
+                                       // Firefox 3 would sometimes throw an unknown exception while accessing EMBEDs and OBJECTs\r
+                                       // without the setTimeout().\r
+                                       if ( FCKBrowserInfo.IsGecko )\r
+                                               FCKTools.RunFunction( processObjectAndEmbed, this, [ doc ] ) ;\r
+                                       else\r
+                                               processObjectAndEmbed( doc ) ;\r
+                               },\r
+\r
+                               RefreshView : function( placeHolder, original )\r
+                               {\r
+                                       if ( original.getAttribute( 'width' ) > 0 )\r
+                                               placeHolder.style.width = FCKTools.ConvertHtmlSizeToStyle( original.getAttribute( 'width' ) ) ;\r
+\r
+                                       if ( original.getAttribute( 'height' ) > 0 )\r
+                                               placeHolder.style.height = FCKTools.ConvertHtmlSizeToStyle( original.getAttribute( 'height' ) ) ;\r
+                               },\r
+\r
+                               AddCustomHandler : function( func )\r
+                               {\r
+                                       customProcessors.push( func ) ;\r
+                               }\r
+                       } ) ;\r
+} )() ;\r
+\r
+FCK.GetRealElement = function( fakeElement )\r
+{\r
+       var e = FCKTempBin.Elements[ fakeElement.getAttribute('_fckrealelement') ] ;\r
+\r
+       if ( fakeElement.getAttribute('_fckflash') )\r
+       {\r
+               if ( fakeElement.style.width.length > 0 )\r
+                               e.width = FCKTools.ConvertStyleSizeToHtml( fakeElement.style.width ) ;\r
+\r
+               if ( fakeElement.style.height.length > 0 )\r
+                               e.height = FCKTools.ConvertStyleSizeToHtml( fakeElement.style.height ) ;\r
+       }\r
+\r
+       return e ;\r
+}\r
+\r
+// HR Processor.\r
+// This is a IE only (tricky) thing. We protect all HR tags before loading them\r
+// (see FCK.ProtectTags). Here we put the HRs back.\r
+if ( FCKBrowserInfo.IsIE )\r
+{\r
+       FCKDocumentProcessor.AppendNew().ProcessDocument = function( document )\r
+       {\r
+               var aHRs = document.getElementsByTagName( 'HR' ) ;\r
+\r
+               var eHR ;\r
+               var i = aHRs.length - 1 ;\r
+               while ( i >= 0 && ( eHR = aHRs[i--] ) )\r
+               {\r
+                       // Create the replacement HR.\r
+                       var newHR = document.createElement( 'hr' ) ;\r
+                       newHR.mergeAttributes( eHR, true ) ;\r
+\r
+                       // We must insert the new one after it. insertBefore will not work in all cases.\r
+                       FCKDomTools.InsertAfterNode( eHR, newHR ) ;\r
+\r
+                       eHR.parentNode.removeChild( eHR ) ;\r
+               }\r
+       }\r
+}\r
+\r
+// INPUT:hidden Processor.\r
+FCKDocumentProcessor.AppendNew().ProcessDocument = function( document )\r
+{\r
+       var aInputs = document.getElementsByTagName( 'INPUT' ) ;\r
+\r
+       var oInput ;\r
+       var i = aInputs.length - 1 ;\r
+       while ( i >= 0 && ( oInput = aInputs[i--] ) )\r
+       {\r
+               if ( oInput.type == 'hidden' )\r
+               {\r
+                       var oImg = FCKDocumentProcessor_CreateFakeImage( 'FCK__InputHidden', oInput.cloneNode(true) ) ;\r
+                       oImg.setAttribute( '_fckinputhidden', 'true', 0 ) ;\r
+\r
+                       oInput.parentNode.insertBefore( oImg, oInput ) ;\r
+                       oInput.parentNode.removeChild( oInput ) ;\r
+               }\r
+       }\r
+}\r
+\r
+// Flash handler.\r
+FCKEmbedAndObjectProcessor.AddCustomHandler( function( el, fakeImg )\r
+       {\r
+               if ( ! ( el.nodeName.IEquals( 'embed' ) && ( el.type == 'application/x-shockwave-flash' || /\.swf($|#|\?)/i.test( el.src ) ) ) )\r
+                       return ;\r
+               fakeImg.className = 'FCK__Flash' ;\r
+               fakeImg.setAttribute( '_fckflash', 'true', 0 );\r
+       } ) ;\r
+\r
+// Buggy <span class="Apple-style-span"> tags added by Safari.\r
+if ( FCKBrowserInfo.IsSafari )\r
+{\r
+       FCKDocumentProcessor.AppendNew().ProcessDocument = function( doc )\r
+       {\r
+               var spans = doc.getElementsByClassName ?\r
+                       doc.getElementsByClassName( 'Apple-style-span' ) :\r
+                       Array.prototype.filter.call(\r
+                                       doc.getElementsByTagName( 'span' ),\r
+                                       function( item ){ return item.className == 'Apple-style-span' ; }\r
+                                       ) ;\r
+               for ( var i = spans.length - 1 ; i >= 0 ; i-- )\r
+                       FCKDomTools.RemoveNode( spans[i], true ) ;\r
+       }\r
+}\r