--- /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
+ * 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