phpgroupware-cvs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Phpgroupware-cvs] news_admin/js/fckeditor/editor/_source/internals fcks


From: skwashd
Subject: [Phpgroupware-cvs] news_admin/js/fckeditor/editor/_source/internals fckselection_gecko.js, 1.1 fckselection_ie.js, 1.1 fcktablehandler.js, 1.1 fcktablehandler_gecko.js, 1.1 fckselection.js, 1.1 fckscriptloader.js, 1.1 fckdialog_ie.js, 1.1 fcklanguagemanager.js, 1.1 fckplugins.js, 1.1 fckregexlib.js, 1.1 fcktablehandler_ie.js, 1.1 fcktoolbaritems.js, 1.1 fckxhtml.js, 1.1 fckxhtml_gecko.js, 1.1 fckxhtml_ie.js, 1.1 fckxhtmlentities.js, 1.1 fckurlparams.js, 1.1 fcktools_ie.js, 1.1 fcktoolbarset.js, 1.1 fcktools.js, 1.1 fcktools_gecko.js, 1.1 fckdialog_gecko.js, 1.1 fckdialog.js, 1.1 fck_1_ie.js, 1.1 fck_2.js, 1.1 fck_2_gecko.js, 1.1 fck_2_ie.js, 1.1 fck_1_gecko.js, 1.1 fck_1.js, 1.1 fck.js, 1.1 fck_last.js, 1.1 fck_onload.js, 1.1 fckcontextmenu_gecko.js, 1.1 fckcontextmenu_ie.js, 1.1 fckcoreextensions.js, 1.1 fckdebug.js, 1.1 fckcontextmenu.js, 1.1 fckconfig.js, 1.1 fckbrowserinfo.js, 1.1 fckcodeformatter.js, 1.1 fckcommands.js, 1.1
Date: Tue, 24 May 2005 16:32:00 +0200

Update of news_admin/js/fckeditor/editor/_source/internals

Added Files:
     Branch: MAIN
            fckselection_gecko.js 
            fckselection_ie.js 
            fcktablehandler.js 
            fcktablehandler_gecko.js 
            fckselection.js 
            fckscriptloader.js 
            fckdialog_ie.js 
            fcklanguagemanager.js 
            fckplugins.js 
            fckregexlib.js 
            fcktablehandler_ie.js 
            fcktoolbaritems.js 
            fckxhtml.js 
            fckxhtml_gecko.js 
            fckxhtml_ie.js 
            fckxhtmlentities.js 
            fckurlparams.js 
            fcktools_ie.js 
            fcktoolbarset.js 
            fcktools.js 
            fcktools_gecko.js 
            fckdialog_gecko.js 
            fckdialog.js 
            fck_1_ie.js 
            fck_2.js 
            fck_2_gecko.js 
            fck_2_ie.js 
            fck_1_gecko.js 
            fck_1.js 
            fck.js 
            fck_last.js 
            fck_onload.js 
            fckcontextmenu_gecko.js 
            fckcontextmenu_ie.js 
            fckcoreextensions.js 
            fckdebug.js 
            fckcontextmenu.js 
            fckconfig.js 
            fckbrowserinfo.js 
            fckcodeformatter.js 
            fckcommands.js 

Log Message:
I am working on a much better version of news_admin, this is just a taste of 
what is coming.

Adding FCKeditor, which has the following issues:
* Images and files support FCKd
* Spellcheck FCKing up

Didn't include non php code or samples other unneeded crap

====================================================
Index: fckselection_gecko.js
/*
 * FCKeditor - The text editor for internet
 * Copyright (C) 2003-2004 Frederico Caldeira Knabben
 *
 * Licensed under the terms of the GNU Lesser General Public License:
 *              http://www.opensource.org/licenses/lgpl-license.php
 *
 * For further information visit:
 *              http://www.fckeditor.net/
 *
 * File Name: fckselection_gecko.js
 *      Active selection functions. (Gecko specific implementation)
 *
 * Version:  2.0 RC3
 * Modified: 2005-01-19 07:50:24
 *
 * File Authors:
 *              Frederico Caldeira Knabben (address@hidden)
 */

// Get the selection type (like document.select.type in IE).
FCKSelection.GetType = function()
{
//      if ( ! this._Type )
//      {
                // By default set the type to "Text".
                this._Type = 'Text' ;

                // Check if the actual selection is a Control (IMG, TABLE, HR, 
etc...).
                var oSel = FCK.EditorWindow.getSelection() ;
                if ( oSel && oSel.rangeCount == 1 )
                {
                        var oRange = oSel.getRangeAt(0) ;
                        if ( oRange.startContainer == oRange.endContainer && 
(oRange.endOffset - oRange.startOffset) == 1 )
                                this._Type = 'Control' ;
                }
//      }
        return this._Type ;
}

// Retrieves the selected element (if any), just in the case that a single
// element (object like and image or a table) is selected.
FCKSelection.GetSelectedElement = function()
{
        if ( this.GetType() == 'Control' )
        {
                var oSel = FCK.EditorWindow.getSelection() ;
                return oSel.anchorNode.childNodes[ oSel.anchorOffset ] ;
        }
}

FCKSelection.GetParentElement = function()
{
        if ( this.GetType() == 'Control' )
                return FCKSelection.GetSelectedElement().parentElement ;
        else
        {
                var oSel = FCK.EditorWindow.getSelection() ;
                if ( oSel )
                {
                        var oNode = oSel.anchorNode ;

                        while ( oNode && oNode.nodeType != 1 )
                                oNode = oNode.parentNode ;

                        return oNode ;
                }
        }
}

FCKSelection.MoveToNode = function( node )
{
        var oSel = FCK.EditorWindow.getSelection() ;

        for ( i = oSel.rangeCount - 1 ; i >= 0 ; i-- )
        {
                if ( i == 0 )
                        oSel.getRangeAt(i).selectNodeContents( node ) ;
                else
                        oSel.removeRange( oSel.getRangeAt(i) ) ;
        }
}

// The "nodeTagName" parameter must be Upper Case.
FCKSelection.HasAncestorNode = function( nodeTagName )
{
        var oContainer = this.GetSelectedElement() ;
        if ( ! oContainer && FCK.EditorWindow )
        {
                try             { oContainer = 
FCK.EditorWindow.getSelection().getRangeAt(0).startContainer ; }
                catch(e){}
        }

        while ( oContainer )
        {
                if ( oContainer.tagName == nodeTagName ) return true ;
                oContainer = oContainer.parentNode ;
        }

        return false ;
}

// The "nodeTagName" parameter must be Upper Case.
FCKSelection.MoveToAncestorNode = function( nodeTagName )
{
        var oNode ;

        var oContainer = this.GetSelectedElement() ;
        if ( ! oContainer )
                oContainer = 
FCK.EditorWindow.getSelection().getRangeAt(0).startContainer ;

        while ( oContainer )
        {
                if ( oContainer.tagName == nodeTagName ) return oContainer ;
                oContainer = oContainer.parentNode ;
        }
}

FCKSelection.Delete = function()
{
        // Gets the actual selection.
        var oSel = FCK.EditorWindow.getSelection() ;

        // Deletes the actual selection contents.
        for ( var i = 0 ; i < oSel.rangeCount ; i++ )
        {
                oSel.getRangeAt(i).deleteContents() ;
        }

        return oSel ;
}

FCKSelection.SelectElement = function( element )
{
        var oRange = FCK.EditorDocument.createRange() ;
        oRange.selectNode( element ) ;

        var oSel = FCK.EditorWindow.getSelection() ;
        oSel.removeAllRanges() ;
        oSel.addRange( oRange ) ;
}

====================================================
Index: fckselection_ie.js
/*
 * FCKeditor - The text editor for internet
 * Copyright (C) 2003-2004 Frederico Caldeira Knabben
 *
 * Licensed under the terms of the GNU Lesser General Public License:
 *              http://www.opensource.org/licenses/lgpl-license.php
 *
 * For further information visit:
 *              http://www.fckeditor.net/
 *
 * File Name: fckselection_ie.js
 *      Active selection functions. (IE specific implementation)
 *
 * Version:  2.0 RC3
 * Modified: 2005-03-02 08:24:15
 *
 * File Authors:
 *              Frederico Caldeira Knabben (address@hidden)
 */

// Get the selection type.
FCKSelection.GetType = function()
{
        return FCK.EditorDocument.selection.type ;
}

// Retrieves the selected element (if any), just in the case that a single
// element (object like and image or a table) is selected.
FCKSelection.GetSelectedElement = function()
{
        if ( this.GetType() == 'Control' )
        {
                var oRange = FCK.EditorDocument.selection.createRange() ;

                if ( oRange && oRange.item )
                        return 
FCK.EditorDocument.selection.createRange().item(0) ;
        }
}

FCKSelection.GetParentElement = function()
{
        if ( this.GetType() == 'Control' )
                return FCKSelection.GetSelectedElement().parentElement ;
        else
                return 
FCK.EditorDocument.selection.createRange().parentElement() ;
}

FCKSelection.MoveToNode = function( node )
{
        FCK.Focus() ;
        FCK.EditorDocument.selection.empty() ;
        var oRange = FCK.EditorDocument.selection.createRange() ;
        oRange.moveToElementText( node ) ;
        oRange.select() ;
}

// The "nodeTagName" parameter must be Upper Case.
FCKSelection.HasAncestorNode = function( nodeTagName )
{
        var oContainer ;

        if ( FCK.EditorDocument.selection.type == "Control" )
        {
                oContainer = this.GetSelectedElement() ;
        }
        else
        {
                var oRange  = FCK.EditorDocument.selection.createRange() ;
                oContainer = oRange.parentElement() ;
        }

        while ( oContainer )
        {
                if ( oContainer.tagName == nodeTagName ) return true ;
                oContainer = oContainer.parentNode ;
        }

        return false ;
}

// The "nodeTagName" parameter must be UPPER CASE.
FCKSelection.MoveToAncestorNode = function( nodeTagName )
{
        var oNode ;

        if ( FCK.EditorDocument.selection.type == "Control" )
        {
                var oRange = FCK.EditorDocument.selection.createRange() ;
                for ( i = 0 ; i < oRange.length ; i++ )
                {
                        if (oRange(i).parentNode)
                        {
                                oNode = oRange(i).parentNode ;
                                break ;
                        }
                }
        }
        else
        {
                var oRange  = FCK.EditorDocument.selection.createRange() ;
                oNode = oRange.parentElement() ;
        }

        while ( oNode && oNode.nodeName != nodeTagName )
                oNode = oNode.parentNode ;

        return oNode ;
}

FCKSelection.Delete = function()
{
        // Gets the actual selection.
        var oSel = FCK.EditorDocument.selection ;

        // Deletes the actual selection contents.
        if ( oSel.type.toLowerCase() != "none" )
        {
                oSel.clear() ;
        }

        return oSel ;
}

====================================================
Index: fcktablehandler.js
/*
 * FCKeditor - The text editor for internet
 * Copyright (C) 2003-2004 Frederico Caldeira Knabben
 *
 * Licensed under the terms of the GNU Lesser General Public License:
 *              http://www.opensource.org/licenses/lgpl-license.php
 *
 * For further information visit:
 *              http://www.fckeditor.net/
 *
 * File Name: fcktablehandler.js
 *      Manage table operations.
 *
 * Version:  2.0 RC3
 * Modified: 2004-12-16 00:41:05
 *
 * File Authors:
 *              Frederico Caldeira Knabben (address@hidden)
 */

var FCKTableHandler = new Object() ;

FCKTableHandler.InsertRow = function()
{
        // Get the row where the selection is placed in.
        var oRow = FCKSelection.MoveToAncestorNode("TR") ;
        if ( !oRow ) return ;

        // Create a clone of the row.
        var oNewRow = oRow.cloneNode( true ) ;

        // Insert the new row (copy) before of it.
        oRow.parentNode.insertBefore( oNewRow, oRow ) ;

        // Clean the row (it seems that the new row has been added after it).
        FCKTableHandler.ClearRow( oRow ) ;
}

FCKTableHandler.DeleteRows = function( row )
{
        // If no row has been passed as a parameer,
        // then get the row where the selection is placed in.
        if ( !row )
                row = FCKSelection.MoveToAncestorNode("TR") ;
        if ( !row ) return ;

        // Get the row's table.
        var oTable = FCKTools.GetElementAscensor( row, 'TABLE' ) ;

        // If just one row is available then delete the entire table.
        if ( oTable.rows.length == 1 )
        {
                FCKTableHandler.DeleteTable( oTable ) ;
                return ;
        }

        // Delete the row.
        row.parentNode.removeChild( row ) ;
}

FCKTableHandler.DeleteTable = function( table )
{
        // If no table has been passed as a parameer,
        // then get the table where the selection is placed in.
        if ( !table )
                table = FCKSelection.MoveToAncestorNode("TABLE") ;
        if ( !table ) return ;

        // Delete the table.
        table.parentNode.removeChild( table ) ;
}

FCKTableHandler.InsertColumn = function()
{
        // Get the cell where the selection is placed in.
        var oCell = FCKSelection.MoveToAncestorNode("TD") ;
        if ( !oCell ) return ;

        // Get the cell's table.
        var oTable = FCKTools.GetElementAscensor( oCell, 'TABLE' ) ;

        // Get the index of the column to be created (based on the cell).
        var iIndex = oCell.cellIndex + 1 ;

        // Loop throw all rows available in the table.
        for ( var i = 0 ; i < oTable.rows.length ; i++ )
        {
                // Get the row.
                var oRow = oTable.rows[i] ;

                // If the row doens't have enought cells, ignore it.
                if ( oRow.cells.length < iIndex )
                        continue ;

                // Create the new cell element to be added.
                oCell = FCK.EditorDocument.createElement('TD') ;
                oCell.innerHTML = '&nbsp;' ;

                // Get the cell that is placed in the new cell place.
                var oBaseCell = oRow.cells[iIndex] ;

                // If the cell is available (we are not in the last cell of the 
row).
                if ( oBaseCell )
                {
                        // Insert the new cell just before of it.
                        oRow.insertBefore( oCell, oBaseCell ) ;
                }
                else
                {
                        // Append the cell at the end of the row.
                        oRow.appendChild( oCell ) ;
                }
        }
}

FCKTableHandler.DeleteColumns = function()
{
        // Get the cell where the selection is placed in.
        var oCell = FCKSelection.MoveToAncestorNode("TD") ;
        if ( !oCell ) return ;

        // Get the cell's table.
        var oTable = FCKTools.GetElementAscensor( oCell, 'TABLE' ) ;

        // Get the cell index.
        var iIndex = oCell.cellIndex ;

        // Loop throw all rows (from down to up, because it's possible that some
        // rows will be deleted).
        for ( var i = oTable.rows.length - 1 ; i >= 0 ; i-- )
        {
                // Get the row.
                var oRow = oTable.rows[i] ;

                // If the cell to be removed is the first one and the row has 
just one cell.
                if ( iIndex == 0 && oRow.cells.length == 1 )
                {
                        // Remove the entire row.
                        FCKTableHandler.DeleteRows( oRow ) ;
                        continue ;
                }

                // If the cell to be removed exists the delete it.
                if ( oRow.cells[iIndex] )
                        oRow.removeChild( oRow.cells[iIndex] ) ;
        }
}

FCKTableHandler.InsertCell = function( cell )
{
        // Get the cell where the selection is placed in.
        var oCell = cell ? cell : FCKSelection.MoveToAncestorNode("TD") ;
        if ( !oCell ) return ;

        // Create the new cell element to be added.
        var oNewCell = FCK.EditorDocument.createElement("TD");
        oNewCell.innerHTML = "&nbsp;" ;

        // If it is the last cell in the row.
        if ( oCell.cellIndex == oCell.parentNode.cells.lenght - 1 )
        {
                // Add the new cell at the end of the row.
                oCell.parentNode.appendChild( oNewCell ) ;
        }
        else
        {
                // Add the new cell before the next cell (after the active one).
                oCell.parentNode.insertBefore( oNewCell, oCell.nextSibling ) ;
        }

        return oNewCell ;
}

FCKTableHandler.DeleteCell = function( cell )
{
        // If this is the last cell in the row.
        if ( cell.parentNode.cells.length == 1 )
        {
                // Delete the entire row.
                FCKTableHandler.DeleteRows( FCKTools.GetElementAscensor( cell, 
'TR' ) ) ;
                return ;
        }

        // Delete the cell from the row.
        cell.parentNode.removeChild( cell ) ;
}

FCKTableHandler.DeleteCells = function()
{
        var aCells = FCKTableHandler.GetSelectedCells() ;

        for ( var i = aCells.length - 1 ; i >= 0  ; i-- )
        {
                FCKTableHandler.DeleteCell( aCells[i] ) ;
        }
}

FCKTableHandler.MergeCells = function()
{
        // Get all selected cells.
        var aCells = FCKTableHandler.GetSelectedCells() ;

        // At least 2 cells must be selected.
        if ( aCells.length < 2 )
                return ;

        // The merge can occour only if the selected cells are from the same 
row.
        if ( aCells[0].parentNode != aCells[aCells.length-1].parentNode )
                return ;

        // Calculate the new colSpan for the first cell.
        var iColSpan = isNaN( aCells[0].colSpan ) ? 1 : aCells[0].colSpan ;

        var sHtml = '' ;

        for ( var i = aCells.length - 1 ; i > 0  ; i-- )
        {
                iColSpan += isNaN( aCells[i].colSpan ) ? 1 : aCells[i].colSpan ;

                // Append the HTML of each cell.
                sHtml = aCells[i].innerHTML + sHtml ;

                // Delete the cell.
                FCKTableHandler.DeleteCell( aCells[i] ) ;
        }

        // Set the innerHTML of the remaining cell (the first one).
        aCells[0].colSpan = iColSpan ;
        aCells[0].innerHTML += sHtml ;
}

FCKTableHandler.SplitCell = function()
{
        // Check that just one cell is selected, otherwise return.
        var aCells = FCKTableHandler.GetSelectedCells() ;
        if ( aCells.length != 1 )
                return ;

        var aMap = this._CreateTableMap( aCells[0].parentNode.parentNode ) ;
        var iCellIndex = FCKTableHandler._GetCellIndexSpan( aMap, 
aCells[0].parentNode.rowIndex , aCells[0] ) ;

        var aCollCells = this._GetCollumnCells( aMap, iCellIndex ) ;

        for ( var i = 0 ; i < aCollCells.length ; i++ )
        {
                if ( aCollCells[i] == aCells[0] )
                {
                        var oNewCell = this.InsertCell( aCells[0] ) ;
                        if ( !isNaN( aCells[0].rowSpan ) && aCells[0].rowSpan > 
1 )
                                oNewCell.rowSpan = aCells[0].rowSpan ;
                }
                else
                {
                        if ( isNaN( aCollCells[i].colSpan ) )
                                aCollCells[i].colSpan = 2 ;
                        else
                                aCollCells[i].colSpan += 1 ;
                }
        }
}

// Get the cell index from a TableMap.
FCKTableHandler._GetCellIndexSpan = function( tableMap, rowIndex, cell )
{
        if ( tableMap.length < rowIndex + 1 )
                return ;

        var oRow = tableMap[ rowIndex ] ;

        for ( var c = 0 ; c < oRow.length ; c++ )
        {
                if ( oRow[c] == cell )
                        return c ;
        }
}

// Get the cells available in a collumn of a TableMap.
FCKTableHandler._GetCollumnCells = function( tableMap, collumnIndex )
{
        var aCollCells = new Array() ;

        for ( var r = 0 ; r < tableMap.length ; r++ )
        {
                var oCell = tableMap[r][collumnIndex] ;
                if ( oCell && ( aCollCells.length == 0 || aCollCells[ 
aCollCells.length - 1 ] != oCell ) )
                        aCollCells[ aCollCells.length ] = oCell ;
        }

        return aCollCells ;
}

// This function is quite hard to explain. It creates a matrix representing all 
cells in a table.
// The difference here is that the "spanned" cells (colSpan and rowSpan) are 
duplicated on the matrix
// cells that are "spanned". For example, a row with 3 cells where the second 
cell has colSpan=2 and rowSpan=3
// will produce a bi-dimensional matrix with the following values (representing 
the cells):
//              Cell1, Cell2, Cell2, Cell 3
//              Cell4, Cell2, Cell2, Cell 5
FCKTableHandler._CreateTableMap = function( table )
{
        var aRows = table.rows ;

        // Row and Collumn counters.
        var r = -1 ;

        var aMap = new Array() ;

        for ( var i = 0 ; i < aRows.length ; i++ )
        {
                r++ ;
                if ( !aMap[r] )
                        aMap[r] = new Array() ;

                var c = -1 ;

                for ( var j = 0 ; j < aRows[i].cells.length ; j++ )
                {
                        var oCell = aRows[i].cells[j] ;

                        c++ ;
                        while ( aMap[r][c] )
                                c++ ;

                        var iColSpan = isNaN( oCell.colSpan ) ? 1 : 
oCell.colSpan ;
                        var iRowSpan = isNaN( oCell.rowSpan ) ? 1 : 
oCell.rowSpan ;

                        for ( var rs = 0 ; rs < iRowSpan ; rs++ )
                        {
                                if ( !aMap[r + rs] )
                                        aMap[r + rs] = new Array() ;

                                for ( var cs = 0 ; cs < iColSpan ; cs++ )
                                {
                                        aMap[r + rs][c + cs] = 
aRows[i].cells[j] ;
                                }
                        }

                        c += iColSpan - 1 ;
                }
        }
        return aMap ;
}

FCKTableHandler.ClearRow = function( tr )
{
        // Get the array of row's cells.
        var aCells = tr.cells ;

        // Replace the contents of each cell with "nbsp;".
        for ( var i = 0 ; i < aCells.length ; i++ )
        {
                aCells[i].innerHTML = '&nbsp;' ;
        }
}

====================================================
Index: fcktablehandler_gecko.js
/*
 * FCKeditor - The text editor for internet
 * Copyright (C) 2003-2004 Frederico Caldeira Knabben
 *
 * Licensed under the terms of the GNU Lesser General Public License:
 *              http://www.opensource.org/licenses/lgpl-license.php
 *
 * For further information visit:
 *              http://www.fckeditor.net/
 *
 * File Name: fcktablehandler_gecko.js
 *      Manage table operations (IE specific).
 *
 * Version:  2.0 RC3
 * Modified: 2004-09-07 00:52:56
 *
 * File Authors:
 *              Frederico Caldeira Knabben (address@hidden)
 */

FCKTableHandler.GetSelectedCells = function()
{
        var aCells = new Array() ;

        var oSelection = FCK.EditorWindow.getSelection() ;

        // If the selection is a text.
        if ( oSelection.rangeCount == 1 && oSelection.anchorNode.nodeType == 3 )
        {
                var oParent = FCKTools.GetElementAscensor( 
oSelection.anchorNode, 'TD' ) ;

                if ( oParent )
                {
                        aCells[0] = oParent ;
                        return aCells ;
                }
        }

        for ( var i = 0 ; i < oSelection.rangeCount ; i++ )
        {
                var oRange = oSelection.getRangeAt(i) ;
                var oCell = oRange.startContainer.childNodes[ 
oRange.startOffset ] ;

                if ( oCell.tagName == 'TD' )
                        aCells[aCells.length] = oCell ;
        }

        return aCells ;
}

====================================================
Index: fckselection.js
/*
 * FCKeditor - The text editor for internet
 * Copyright (C) 2003-2004 Frederico Caldeira Knabben
 *
 * Licensed under the terms of the GNU Lesser General Public License:
 *              http://www.opensource.org/licenses/lgpl-license.php
 *
 * For further information visit:
 *              http://www.fckeditor.net/
 *
 * File Name: fckselection.js
 *      Active selection functions.
 *
 * Version:  2.0 RC3
 * Modified: 2004-11-22 11:03:02
 *
 * File Authors:
 *              Frederico Caldeira Knabben (address@hidden)
 */

var FCKSelection = new Object() ;

FCK.Selection = FCKSelection ;

====================================================
Index: fckscriptloader.js
/*
 * FCKeditor - The text editor for internet
 * Copyright (C) 2003-2004 Frederico Caldeira Knabben
 *
 * Licensed under the terms of the GNU Lesser General Public License:
 *              http://www.opensource.org/licenses/lgpl-license.php
 *
 * For further information visit:
 *              http://www.fckeditor.net/
 *
 * File Name: fckscriptloader.js
 *      Defines the FCKScriptLoader object that is used to dynamically load
 *      scripts in the editor.
 *
 * Version:  2.0 RC3
 * Modified: 2004-05-31 23:07:50
 *
 * File Authors:
 *              Frederico Caldeira Knabben (address@hidden)
 */

// This object is used to download scripts and css files sequentialy.
// A file download is not started until the previous file was not completelly
// downloaded.
var FCKScriptLoader = new Object() ;
FCKScriptLoader.IsLoading = false ;
FCKScriptLoader.Queue = new Array() ;

// Adds a script or css to the queue.
FCKScriptLoader.AddScript = function( scriptPath )
{
        FCKScriptLoader.Queue[ FCKScriptLoader.Queue.length ] = scriptPath ;

        if ( !this.IsLoading )
                this.CheckQueue() ;
}

// Checks the queue to see if there is something to load.
// This function should not be called by code. It's a internal function
// that's called recursively.
FCKScriptLoader.CheckQueue = function()
{
        // Check if the queue is not empty.
        if ( this.Queue.length > 0 )
        {
                this.IsLoading = true ;

                // Get the first item in the queue
                var sScriptPath = this.Queue[0] ;

                // Removes the first item from the queue
                var oTempArray = new Array() ;
                for ( i = 1 ; i < this.Queue.length ; i++ )
                        oTempArray[ i - 1 ] = this.Queue[ i ] ;
                this.Queue = oTempArray ;

//              window.status = ( 'Loading ' + sScriptPath + '...' ) ;

                // Dynamically load the file (it can be a CSS or a JS)
                var e ;

                // If is a CSS
                if ( sScriptPath.lastIndexOf( '.css' ) > 0 )
                {
                        e = document.createElement( 'LINK' ) ;
                        e.rel   = 'stylesheet' ;
                        e.type  = 'text/css' ;
                }
                // It is a JS
                else
                {
                        e = document.createElement( "script" ) ;
                        e.type  = "text/javascript" ;
                }

                // Add the new object to the HEAD.
                document.getElementsByTagName("head")[0].appendChild( e ) ;

                var oEvent = function()
                {
                        // Gecko doesn't have a "readyState" property
                        if ( this.tagName == 'LINK' || !this.readyState || 
this.readyState == 'loaded' )
                                // Load the next script available in the queue
                                FCKScriptLoader.CheckQueue() ;
                }

                // Start downloading it.
                if ( e.tagName == 'LINK' )
                {
                        // IE must wait for the file to be downloaded.
                        if ( FCKBrowserInfo.IsIE )
                                e.onload = oEvent ;
                        // Gecko doens't fire any event when the CSS is loaded, 
so we
                        // can't wait for it.
                        else
                                FCKScriptLoader.CheckQueue() ;

                        e.href = sScriptPath ;
                }
                else
                {
                        // Gecko fires the "onload" event and IE fires 
"onreadystatechange"
                        e.onload = e.onreadystatechange = oEvent ;
                        e.src = sScriptPath ;
                }
        }
        else
        {
                this.IsLoading = false ;

                // Call the "OnEmpty" event.
                if ( this.OnEmpty )
                        this.OnEmpty() ;
        }
}

====================================================
Index: fckdialog_ie.js
/*
 * FCKeditor - The text editor for internet
 * Copyright (C) 2003-2004 Frederico Caldeira Knabben
 *
 * Licensed under the terms of the GNU Lesser General Public License:
 *              http://www.opensource.org/licenses/lgpl-license.php
 *
 * For further information visit:
 *              http://www.fckeditor.net/
 *
 * File Name: fckdialog_ie.js
 *      Dialog windows operations. (IE specific implementations)
 *
 * Version:  2.0 RC3
 * Modified: 2004-12-19 23:28:42
 *
 * File Authors:
 *              Frederico Caldeira Knabben (address@hidden)
 */

FCKDialog.Show = function( dialogInfo, dialogName, pageUrl, dialogWidth, 
dialogHeight, parentWindow )
{
        if ( !parentWindow )
                parentWindow = window ;

        parentWindow.showModalDialog( pageUrl, dialogInfo, "dialogWidth:" + 
dialogWidth + "px;dialogHeight:" + dialogHeight + 
"px;help:no;scroll:no;status:no") ;
}


====================================================
Index: fcklanguagemanager.js
/*
 * FCKeditor - The text editor for internet
 * Copyright (C) 2003-2004 Frederico Caldeira Knabben
 *
 * Licensed under the terms of the GNU Lesser General Public License:
 *              http://www.opensource.org/licenses/lgpl-license.php
 *
 * For further information visit:
 *              http://www.fckeditor.net/
 *
 * File Name: fcklanguagemanager.js
 *      Defines the FCKLanguageManager object that is used for language
 *      operations.
 *
 * Version:  2.0 RC3
 * Modified: 2005-03-02 10:25:49
 *
 * File Authors:
 *              Frederico Caldeira Knabben (address@hidden)
 */

FCKLanguageManager.GetActiveLanguage = function()
{
        if ( FCKConfig.AutoDetectLanguage )
        {
                var sUserLang ;

                // IE accepts "navigator.userLanguage" while Gecko 
"navigator.language".
                if ( navigator.userLanguage )
                        sUserLang = navigator.userLanguage.toLowerCase() ;
                else if ( navigator.language )
                        sUserLang = navigator.language.toLowerCase() ;
                else
                {
                        // Firefox 1.0 PR has a bug: it doens't support the 
"language" property.
                        return FCKConfig.DefaultLanguage ;
                }

                FCKDebug.Output( 'Navigator Language = ' + sUserLang ) ;

                // Some language codes are set in 5 characters,
                // like "pt-br" for Brasilian Portuguese.
                if ( sUserLang.length >= 5 )
                {
                        sUserLang = sUserLang.substr(0,5) ;
                        if ( this.AvailableLanguages[sUserLang] ) return 
sUserLang ;
                }

                // If the user's browser is set to, for example, "pt-br" but 
only the
                // "pt" language file is available then get that file.
                if ( sUserLang.length >= 2 )
                {
                        sUserLang = sUserLang.substr(0,2) ;
                        if ( this.AvailableLanguages[sUserLang] ) return 
sUserLang ;
                }
        }

        return this.DefaultLanguage ;
}

FCKLanguageManager.TranslateElements = function( targetDocument, tag, 
propertyToSet )
{
        var aInputs = targetDocument.getElementsByTagName(tag) ;

        for ( var i = 0 ; i < aInputs.length ; i++ )
        {
                var sKey = aInputs[i].getAttribute( 'fckLang' ) ;

                if ( sKey )
                {
                        var s = FCKLang[ sKey ] ;
                        if ( s )
                                eval( 'aInputs[i].' + propertyToSet + ' = s' ) ;
                }
        }
}

FCKLanguageManager.TranslatePage = function( targetDocument )
{
        this.TranslateElements( targetDocument, 'INPUT', 'value' ) ;
        this.TranslateElements( targetDocument, 'SPAN', 'innerHTML' ) ;
        this.TranslateElements( targetDocument, 'LABEL', 'innerHTML' ) ;
        this.TranslateElements( targetDocument, 'OPTION', 'innerHTML' ) ;
}

if ( FCKLanguageManager.AvailableLanguages[ FCKConfig.DefaultLanguage ] )
        FCKLanguageManager.DefaultLanguage = FCKConfig.DefaultLanguage ;
else
        FCKLanguageManager.DefaultLanguage = 'en' ;

FCKLanguageManager.ActiveLanguage = new Object() ;
FCKLanguageManager.ActiveLanguage.Code = FCKLanguageManager.GetActiveLanguage() 
;
FCKLanguageManager.ActiveLanguage.Name = FCKLanguageManager.AvailableLanguages[ 
FCKLanguageManager.ActiveLanguage.Code ] ;

FCK.Language = FCKLanguageManager ;


// Load the language file and start the editor.
LoadLanguageFile() ;

====================================================
Index: fckplugins.js
/*
 * FCKeditor - The text editor for internet
 * Copyright (C) 2003-2004 Frederico Caldeira Knabben
 *
 * Licensed under the terms of the GNU Lesser General Public License:
 *              http://www.opensource.org/licenses/lgpl-license.php
 *
 * For further information visit:
 *              http://www.fckeditor.net/
 *
 * File Name: fckplugins.js
 *      Defines the FCKPlugins object that is responsible for loading the 
Plugins.
 *
 * Version:  2.0 RC3
 * Modified: 2005-01-19 17:36:21
 *
 * File Authors:
 *              Frederico Caldeira Knabben (address@hidden)
 */

var FCKPlugins = FCK.Plugins = new Object() ;
FCKPlugins.ItemsCount = 0 ;
FCKPlugins.Loaded = false ;
FCKPlugins.Items = new Object() ;

// Set the defined plugins scripts paths.
for ( var i = 0 ; i < FCKConfig.Plugins.Items.length ; i++ )
{
        var oItem = FCKConfig.Plugins.Items[i] ;
        FCKPlugins.Items[ oItem[0] ] = new FCKPlugin( oItem[0], oItem[1], 
oItem[2] ) ;
        FCKPlugins.ItemsCount++ ;
}

FCKPlugins.Load = function()
{
        // Load all items.
        for ( var s in this.Items )
                this.Items[s].Load() ;

        // Mark as loaded.
        this.Loaded = true ;

        // This is a self destroyable function (must be called once).
        FCKPlugins.Load = null ;
}

====================================================
Index: fckregexlib.js
/*
 * FCKeditor - The text editor for internet
 * Copyright (C) 2003-2004 Frederico Caldeira Knabben
 *
 * Licensed under the terms of the GNU Lesser General Public License:
 *              http://www.opensource.org/licenses/lgpl-license.php
 *
 * For further information visit:
 *              http://www.fckeditor.net/
 *
 * File Name: fckregexlib.js
 *      These are some Regular Expresions used by the editor.
 *
 * Version:  2.0 RC3
 * Modified: 2005-01-22 17:36:28
 *
 * File Authors:
 *              Frederico Caldeira Knabben (address@hidden)
 */

var FCKRegexLib = new Object() ;

// This is the Regular expression used by the SetHTML method for the "&apos;" 
entity.
FCKRegexLib.AposEntity          = /&apos;/gi ;

// Used by the Styles combo to identify styles that can't be applied to text.
FCKRegexLib.ObjectElements      = 
/^(?:IMG|TABLE|TR|TD|INPUT|SELECT|TEXTAREA|HR|OBJECT)$/i ;

// Block Elements.
FCKRegexLib.BlockElements       = 
/^(?:P|DIV|H1|H2|H3|H4|H5|H6|ADDRESS|PRE|OL|UL|LI)$/i ;

// Elements marked as empty "Empty" in the XHTML DTD.
FCKRegexLib.EmptyElements       = 
/^(?:BASE|META|LINK|HR|BR|PARAM|IMG|AREA|INPUT)$/i ;

// List all named commands (commands that can be interpreted by the browser 
"execCommand" method.
FCKRegexLib.NamedCommands       = 
/^(?:Cut|Copy|Paste|Print|SelectAll|RemoveFormat|Unlink|Undo|Redo|Bold|Italic|Underline|StrikeThrough|Subscript|Superscript|JustifyLeft|JustifyCenter|JustifyRight|JustifyFull|Outdent|Indent|InsertOrderedList|InsertUnorderedList|InsertHorizontalRule)$/i
 ;

FCKRegexLib.BodyContents        = 
/([\s\S]*\<body[^\>]*\>)([\s\S]*)(\<\/body\>[\s\S]*)/i ;

// Temporary text used to solve some browser specific limitations.
FCKRegexLib.ToReplace           = /___fcktoreplace:([\w]+)/ig ;

// Get the META http-equiv attribute from the tag.
FCKRegexLib.MetaHttpEquiv       = /http-equiv\s*=\s*["']?([^"' ]+)/i ;

FCKRegexLib.HasBaseTag          = /<base /i ;

FCKRegexLib.HeadCloser          = /<\/head\s*>/i ;

FCKRegexLib.TableBorderClass = /\s*FCK__ShowTableBorders\s*/ ;

====================================================
Index: fcktablehandler_ie.js
/*
 * FCKeditor - The text editor for internet
 * Copyright (C) 2003-2004 Frederico Caldeira Knabben
 *
 * Licensed under the terms of the GNU Lesser General Public License:
 *              http://www.opensource.org/licenses/lgpl-license.php
 *
 * For further information visit:
 *              http://www.fckeditor.net/
 *
 * File Name: fcktablehandler_ie.js
 *      Manage table operations (IE specific).
 *
 * Version:  2.0 RC3
 * Modified: 2004-09-05 02:17:58
 *
 * File Authors:
 *              Frederico Caldeira Knabben (address@hidden)
 */

FCKTableHandler.GetSelectedCells = function()
{
        var aCells = new Array() ;

        var oRange = FCK.EditorDocument.selection.createRange() ;
        var oParent = oRange.parentElement() ;

        if ( oParent && oParent.tagName == "TD" )
                aCells[0] = oParent ;
        else
        {
                var oParent = FCKSelection.MoveToAncestorNode( "TABLE" ) ;

                if ( oParent )
                {
                        // Loops throw all cells checking if the cell is, or 
part of it, is inside the selection
                        // and then add it to the selected cells collection.
                        for ( var i = 0 ; i < oParent.cells.length ; i++ )
                        {
                                var oCellRange = 
FCK.EditorDocument.selection.createRange() ;
                                oCellRange.moveToElementText( oParent.cells[i] 
) ;

                                if ( oRange.inRange( oCellRange )
                                        || ( 
oRange.compareEndPoints('StartToStart',oCellRange) >= 0 &&  
oRange.compareEndPoints('StartToEnd',oCellRange) <= 0 )
                                        || ( 
oRange.compareEndPoints('EndToStart',oCellRange) >= 0 &&  
oRange.compareEndPoints('EndToEnd',oCellRange) <= 0 ) )
                                {
                                        aCells[aCells.length] = 
oParent.cells[i] ;
                                }
                        }
                }
        }

        return aCells ;
}

====================================================
Index: fcktoolbaritems.js
/*
 * FCKeditor - The text editor for internet
 * Copyright (C) 2003-2004 Frederico Caldeira Knabben
 *
 * Licensed under the terms of the GNU Lesser General Public License:
 *              http://www.opensource.org/licenses/lgpl-license.php
 *
 * For further information visit:
 *              http://www.fckeditor.net/
 *
 * File Name: fcktoolbaritems.js
 *      Toolbar items definitions.
 *
 * Version:  2.0 RC3
 * Modified: 2005-02-16 19:59:20
 *
 * File Authors:
 *              Frederico Caldeira Knabben (address@hidden)
 */

var FCKToolbarItems = new Object() ;
FCKToolbarItems.LoadedItems = new Object() ;

FCKToolbarItems.RegisterItem = function( itemName, item )
{
        this.LoadedItems[ itemName ] = item ;
}

FCKToolbarItems.GetItem = function( itemName )
{
        var oItem = FCKToolbarItems.LoadedItems[ itemName ] ;

        if ( oItem )
                return oItem ;

        switch ( itemName )
        {
                case 'Source'                   : oItem = new FCKToolbarButton( 
'Source'        , FCKLang.Source, null, FCK_TOOLBARITEM_ICONTEXT, true, true ) 
; break ;
                case 'DocProps'                 : oItem = new FCKToolbarButton( 
'DocProps'      , FCKLang.DocProps ) ; break ;
                case 'Save'                             : oItem = new 
FCKToolbarButton( 'Save'          , FCKLang.Save, null, null, true ) ; break ;
                case 'NewPage'                  : oItem = new FCKToolbarButton( 
'NewPage'       , FCKLang.NewPage, null, null, true  ) ; break ;
                case 'Preview'                  : oItem = new FCKToolbarButton( 
'Preview'       , FCKLang.Preview, null, null, true  ) ; break ;
                case 'About'                    : oItem = new FCKToolbarButton( 
'About'         , FCKLang.About, null, null, true  ) ; break ;

                case 'Cut'                              : oItem = new 
FCKToolbarButton( 'Cut'           , FCKLang.Cut, null, null, false, true ) ; 
break ;
                case 'Copy'                             : oItem = new 
FCKToolbarButton( 'Copy'          , FCKLang.Copy, null, null, false, true ) ; 
break ;
                case 'Paste'                    : oItem = new FCKToolbarButton( 
'Paste'         , FCKLang.Paste, null, null, false, true ) ; break ;
                case 'PasteText'                : oItem = new FCKToolbarButton( 
'PasteText'     , FCKLang.PasteText, null, null, false, true ) ; break ;
                case 'PasteWord'                : oItem = new FCKToolbarButton( 
'PasteWord'     , FCKLang.PasteWord, null, null, false, true ) ; break ;
                case 'Print'                    : oItem = new FCKToolbarButton( 
'Print'         , FCKLang.Print ) ; break ;
                case 'SpellCheck'               : oItem = new FCKToolbarButton( 
'SpellCheck', FCKLang.SpellCheck ) ; break ;
                case 'Undo'                             : oItem = new 
FCKToolbarButton( 'Undo'          , FCKLang.Undo, null, null, false, true ) ; 
break ;
                case 'Redo'                             : oItem = new 
FCKToolbarButton( 'Redo'          , FCKLang.Redo, null, null, false, true ) ; 
break ;
                case 'SelectAll'                : oItem = new FCKToolbarButton( 
'SelectAll'     , FCKLang.SelectAll ) ; break ;
                case 'RemoveFormat'             : oItem = new FCKToolbarButton( 
'RemoveFormat', FCKLang.RemoveFormat, null, null, false, true ) ; break ;

                case 'Bold'                             : oItem = new 
FCKToolbarButton( 'Bold'          , FCKLang.Bold, null, null, false, true ) ; 
break ;
                case 'Italic'                   : oItem = new FCKToolbarButton( 
'Italic'        , FCKLang.Italic, null, null, false, true  ) ; break ;
                case 'Underline'                : oItem = new FCKToolbarButton( 
'Underline'     , FCKLang.Underline, null, null, false, true ) ; break ;
                case 'StrikeThrough'    : oItem = new FCKToolbarButton( 
'StrikeThrough' , FCKLang.StrikeThrough, null, null, false, true ) ; break ;
                case 'Subscript'                : oItem = new FCKToolbarButton( 
'Subscript'             , FCKLang.Subscript, null, null, false, true ) ; break ;
                case 'Superscript'              : oItem = new FCKToolbarButton( 
'Superscript'   , FCKLang.Superscript, null, null, false, true ) ; break ;

                case 'OrderedList'              : oItem = new FCKToolbarButton( 
'InsertOrderedList'             , FCKLang.NumberedListLbl, 
FCKLang.NumberedList, null, false, true ) ; break ;
                case 'UnorderedList'    : oItem = new FCKToolbarButton( 
'InsertUnorderedList'   , FCKLang.BulletedListLbl, FCKLang.BulletedList, null, 
false, true ) ; break ;
                case 'Outdent'                  : oItem = new FCKToolbarButton( 
'Outdent'       , FCKLang.DecreaseIndent, null, null, false, true ) ; break ;
                case 'Indent'                   : oItem = new FCKToolbarButton( 
'Indent'        , FCKLang.IncreaseIndent, null, null, false, true ) ; break ;

                case 'Link'                             : oItem = new 
FCKToolbarButton( 'Link'          , FCKLang.InsertLinkLbl, FCKLang.InsertLink, 
null, false, true ) ; break ;
                case 'Unlink'                   : oItem = new FCKToolbarButton( 
'Unlink'        , FCKLang.RemoveLink, null, null, false, true ) ; break ;
                case 'Anchor'                   : oItem = new FCKToolbarButton( 
'Anchor'        , FCKLang.Anchor ) ; break ;

                case 'Image'                    : oItem = new FCKToolbarButton( 
'Image'                 , FCKLang.InsertImageLbl, FCKLang.InsertImage ) ; break 
;
                case 'Table'                    : oItem = new FCKToolbarButton( 
'Table'                 , FCKLang.InsertTableLbl, FCKLang.InsertTable ) ; break 
;
                case 'SpecialChar'              : oItem = new FCKToolbarButton( 
'SpecialChar'   , FCKLang.InsertSpecialCharLbl, FCKLang.InsertSpecialChar ) ; 
break ;
                case 'Smiley'                   : oItem = new FCKToolbarButton( 
'Smiley'                , FCKLang.InsertSmileyLbl, FCKLang.InsertSmiley ) ; 
break ;
                case 'UniversalKey'             : oItem = new FCKToolbarButton( 
'UniversalKey'  , FCKLang.UniversalKeyboard ) ; break ;

                case 'Rule'                             : oItem = new 
FCKToolbarButton( 'InsertHorizontalRule', FCKLang.InsertLineLbl, 
FCKLang.InsertLine ) ; break ;

                case 'JustifyLeft'              : oItem = new FCKToolbarButton( 
'JustifyLeft'   , FCKLang.LeftJustify, null, null, false, true ) ; break ;
                case 'JustifyCenter'    : oItem = new FCKToolbarButton( 
'JustifyCenter' , FCKLang.CenterJustify, null, null, false, true ) ; break ;
                case 'JustifyRight'             : oItem = new FCKToolbarButton( 
'JustifyRight'  , FCKLang.RightJustify, null, null, false, true ) ; break ;
                case 'JustifyFull'              : oItem = new FCKToolbarButton( 
'JustifyFull'   , FCKLang.BlockJustify, null, null, false, true ) ; break ;

                case 'Style'                    : oItem = new 
FCKToolbarStyleCombo() ; break ;
                case 'FontName'                 : oItem = new 
FCKToolbarFontsCombo() ; break ;
                case 'FontSize'                 : oItem = new 
FCKToolbarFontSizeCombo() ; break ;
                case 'FontFormat'               : oItem = new 
FCKToolbarFontFormatCombo() ; break ;

                case 'TextColor'                : oItem = new 
FCKToolbarPanelButton( 'TextColor', FCKLang.TextColor ) ; break ;
                case 'BGColor'                  : oItem = new 
FCKToolbarPanelButton( 'BGColor'  , FCKLang.BGColor ) ; break ;

                case 'Find'                             : oItem = new 
FCKToolbarButton( 'Find'          , FCKLang.Find ) ; break ;
                case 'Replace'                  : oItem = new FCKToolbarButton( 
'Replace'       , FCKLang.Replace ) ; break ;

                case 'Form'                             : oItem = new 
FCKToolbarButton( 'Form'                  , FCKLang.Form ) ; break ;
                case 'Checkbox'                 : oItem = new FCKToolbarButton( 
'Checkbox'              , FCKLang.Checkbox ) ; break ;
                case 'Radio'                    : oItem = new FCKToolbarButton( 
'Radio'                 , FCKLang.RadioButton ) ; break ;
                case 'TextField'                : oItem = new FCKToolbarButton( 
'TextField'             , FCKLang.TextField ) ; break ;
                case 'Textarea'                 : oItem = new FCKToolbarButton( 
'Textarea'              , FCKLang.Textarea ) ; break ;
                case 'HiddenField'              : oItem = new FCKToolbarButton( 
'HiddenField'   , FCKLang.HiddenField ) ; break ;
                case 'Button'                   : oItem = new FCKToolbarButton( 
'Button'                , FCKLang.Button ) ; break ;
                case 'Select'                   : oItem = new FCKToolbarButton( 
'Select'                , FCKLang.SelectionField ) ; break ;
                case 'ImageButton'              : oItem = new FCKToolbarButton( 
'ImageButton'   , FCKLang.ImageButton ) ; break ;

                default:
                        alert( FCKLang.UnknownToolbarItem.replace( /%1/g, 
itemName ) ) ;
                        return ;
        }

        FCKToolbarItems.LoadedItems[ itemName ] = oItem ;

        return oItem ;
}

====================================================
Index: fckxhtml.js
/*
 * FCKeditor - The text editor for internet
 * Copyright (C) 2003-2004 Frederico Caldeira Knabben
 *
 * Licensed under the terms of the GNU Lesser General Public License:
 *              http://www.opensource.org/licenses/lgpl-license.php
 *
 * For further information visit:
 *              http://www.fckeditor.net/
 *
 * File Name: fckxhtml.js
 *      Defines the FCKXHtml object, responsible for the XHTML operations.
 *
 * Version:  2.0 RC3
 * Modified: 2005-03-02 11:17:23
 *
 * File Authors:
 *              Frederico Caldeira Knabben (address@hidden)
 */

var FCKXHtml = new Object() ;

FCKXHtml.CurrentJobNum = 0 ;

FCKXHtml.GetXHTML = function( node, includeNode, format )
{
        // Special blocks are blocks of content that remain untouched during the
        // process. It is used for SCRIPTs and STYLEs.
        FCKXHtml.SpecialBlocks = new Array() ;

        // Create the XML DOMDocument object.
        this.XML = FCKTools.CreateXmlObject( 'DOMDocument' ) ;

        // Add a root element that holds all child nodes.
        this.MainNode = this.XML.appendChild( this.XML.createElement( 'xhtml' ) 
) ;

        FCKXHtml.CurrentJobNum++ ;

        if ( includeNode )
                this._AppendNode( this.MainNode, node ) ;
        else
                this._AppendChildNodes( this.MainNode, node, false ) ;

        // Get the resulting XHTML as a string.
        var sXHTML = this._GetMainXmlString() ;

        // Strip the "XHTML" root node.
        sXHTML = sXHTML.substr( 7, sXHTML.length - 15 ).trim() ;

        if ( FCKConfig.ForceSimpleAmpersand )
                sXHTML = sXHTML.replace( /___FCKAmp___/g, '&' ) ;

        if ( format )
                sXHTML = FCKCodeFormatter.Format( sXHTML ) ;

        // Now we put back the SpecialBlocks contents.
        for ( var i = 0 ; i < FCKXHtml.SpecialBlocks.length ; i++ )
        {
                var oRegex = new RegExp( '___FCKsi___' + i ) ;
                sXHTML = sXHTML.replace( oRegex, FCKXHtml.SpecialBlocks[i] ) ;
        }

        this.XML = null ;

        return sXHTML
}

FCKXHtml._AppendAttribute = function( xmlNode, attributeName, attributeValue )
{
        try
        {
                // Create the attribute.
                var oXmlAtt = this.XML.createAttribute( attributeName ) ;

                oXmlAtt.value = attributeValue ? attributeValue : '' ;

                // Set the attribute in the node.
                xmlNode.attributes.setNamedItem( oXmlAtt ) ;
        }
        catch (e)
        {}
}

FCKXHtml._AppendChildNodes = function( xmlNode, htmlNode, isBlockElement )
{
        if ( htmlNode.hasChildNodes() )
        {
                // Get all children nodes.
                var oChildren = htmlNode.childNodes ;

                for ( var i = 0 ; i < oChildren.length ; i++ )
                        this._AppendNode( xmlNode, oChildren[i] ) ;
        }
        else
        {
                if ( isBlockElement && FCKConfig.FillEmptyBlocks )
                {
                        this._AppendEntity( xmlNode, 'nbsp' ) ;
                        return ;
                }

                // We can't use short representation of empty elements that are 
not marked
                // as empty in th XHTML DTD.
                if ( ! FCKRegexLib.EmptyElements.test( htmlNode.nodeName ) )
                        xmlNode.appendChild( this.XML.createTextNode('') ) ;
        }
}

FCKXHtml._AppendNode = function( xmlNode, htmlNode )
{
        switch ( htmlNode.nodeType )
        {
                // Element Node.
                case 1 :
                        // Mozilla insert custom nodes in the DOM.
                        if ( FCKBrowserInfo.IsGecko && 
htmlNode.hasAttribute('_moz_editor_bogus_node') )
                                return ;

                        // Create the Element.
                        var sNodeName = htmlNode.nodeName.toLowerCase() ;

                        if ( FCKBrowserInfo.IsGecko && sNodeName == 'br' && 
htmlNode.hasAttribute('type') && htmlNode.getAttribute( 'type', 2 ) == '_moz' )
                                return ;

                        // The already processed nodes must be marked to avoid 
then to be duplicated (bad formatted HTML).
                        // So here, the "mark" is checked... if the element is 
Ok, then mark it.
                        if ( htmlNode._fckxhtmljob == FCKXHtml.CurrentJobNum )
                                return ;
                        else
                                htmlNode._fckxhtmljob = FCKXHtml.CurrentJobNum ;

                        // If the nodeName starts with a slash, it is a orphan 
closing tag.
                        // On some strange cases, the nodeName is empty, even 
if the node exists.
                        if ( sNodeName.length == 0 || sNodeName.substr(0,1) == 
'/' )
                                break ;

                        var oNode = this.XML.createElement( sNodeName ) ;

                        // Add all attributes.
                        FCKXHtml._AppendAttributes( xmlNode, htmlNode, oNode, 
sNodeName ) ;

                        // Tag specific processing.
                        var oTagProcessor = FCKXHtml.TagProcessors[ sNodeName ] 
;

                        if ( oTagProcessor )
                        {
                                oNode = oTagProcessor( oNode, htmlNode ) ;
                                if ( !oNode ) break ;
                        }
                        else
                                this._AppendChildNodes( oNode, htmlNode, 
FCKRegexLib.BlockElements.test( sNodeName ) ) ;

                        xmlNode.appendChild( oNode ) ;

                        break ;

                // Text Node.
                case 3 :
                        // We can't just replace the special chars with 
entities and create a
                        // text node with it. We must split the text isolating 
the special chars
                        // and add each piece a time.
                        var asPieces = htmlNode.nodeValue.replaceNewLineChars(' 
').match( FCKXHtmlEntities.EntitiesRegex ) ;

                        if ( asPieces )
                        {
                                for ( var i = 0 ; i < asPieces.length ; i++ )
                                {
                                        if ( asPieces[i].length == 1 )
                                        {
                                                var sEntity = 
FCKXHtmlEntities.Entities[ asPieces[i] ] ;
                                                if ( sEntity != null )
                                                {
                                                        this._AppendEntity( 
xmlNode, sEntity ) ;
                                                        continue ;
                                                }
                                        }
                                        xmlNode.appendChild( 
this.XML.createTextNode( asPieces[i] ) ) ;
                                }
                        }

                        // This is the original code. It doesn't care about the 
entities.
                        //xmlNode.appendChild( this.XML.createTextNode( 
htmlNode.nodeValue ) ) ;

                        break ;

                // Comment
                case 8 :
                        xmlNode.appendChild( this.XML.createComment( 
htmlNode.nodeValue ) ) ;
                        break ;

                // Unknown Node type.
                default :
                        xmlNode.appendChild( this.XML.createComment( "Element 
not supported - Type: " + htmlNode.nodeType + " Name: " + htmlNode.nodeName ) ) 
;
                        break ;
        }
}

// Append an item to the SpecialBlocks array and returns the tag to be used.
FCKXHtml._AppendSpecialItem = function( item )
{
        return '___FCKsi___' + FCKXHtml.SpecialBlocks.addItem( item ) ;
}

// An object that hold tag specific operations.
FCKXHtml.TagProcessors = new Object() ;

FCKXHtml.TagProcessors['img'] = function( node )
{
        // The "ALT" attribute is required in XHTML.
        if ( ! node.attributes.getNamedItem( 'alt' ) )
                FCKXHtml._AppendAttribute( node, 'alt', '' ) ;

        return node ;
}

FCKXHtml.TagProcessors['script'] = function( node, htmlNode )
{
        // The "TYPE" attribute is required in XHTML.
        if ( ! node.attributes.getNamedItem( 'type' ) )
                FCKXHtml._AppendAttribute( node, 'type', 'text/javascript' ) ;

        node.appendChild( FCKXHtml.XML.createTextNode( 
FCKXHtml._AppendSpecialItem( htmlNode.text ) ) ) ;

        return node ;
}

FCKXHtml.TagProcessors['style'] = function( node, htmlNode )
{
        // The "_fcktemp" attribute is used to mark the <STYLE> used by the 
editor
        // to set some behaviors.
        if ( htmlNode.getAttribute( '_fcktemp' ) )
                return null ;

        // The "TYPE" attribute is required in XHTML.
        if ( ! node.attributes.getNamedItem( 'type' ) )
                FCKXHtml._AppendAttribute( node, 'type', 'text/css' ) ;

        node.appendChild( FCKXHtml.XML.createTextNode( 
FCKXHtml._AppendSpecialItem( htmlNode.innerHTML ) ) ) ;

        return node ;
}

FCKXHtml.TagProcessors['title'] = function( node, htmlNode )
{
        node.appendChild( FCKXHtml.XML.createTextNode( FCK.EditorDocument.title 
) ) ;

        return node ;
}

FCKXHtml.TagProcessors['base'] = function( node, htmlNode )
{
        // The "_fcktemp" attribute is used to mark the <BASE> tag when the 
editor
        // automatically sets it using the FCKConfig.BaseHref configuration.
        if ( htmlNode.getAttribute( '_fcktemp' ) )
                return null ;

        // IE duplicates the BODY inside the <BASE /> tag (don't ask me why!).
        // This tag processor does nothing... in this way, no child nodes are 
added
        // (also because the BASE tag must be empty).
        return node ;
}

FCKXHtml.TagProcessors['link'] = function( node, htmlNode )
{
        // The "_fcktemp" attribute is used to mark the fck_internal.css <LINK>
        // reference.
        if ( htmlNode.getAttribute( '_fcktemp' ) )
                return null ;

        return node ;
}

FCKXHtml.TagProcessors['table'] = function( node, htmlNode )
{
        // There is a trick to show table borders when border=0. We add to the
        // table class the FCK__ShowTableBorders rule. So now we must remove it.

        var oClassAtt = node.attributes.getNamedItem( 'class' ) ;

        if ( oClassAtt && FCKRegexLib.TableBorderClass.test( 
oClassAtt.nodeValue ) )
        {
                var sClass = oClassAtt.nodeValue.replace( 
FCKRegexLib.TableBorderClass, '' ) ;

                if ( sClass.length == 0 )
                        node.attributes.removeNamedItem( 'class' ) ;
                else
                        FCKXHtml._AppendAttribute( node, 'class', sClass ) ;
        }

        FCKXHtml._AppendChildNodes( node, htmlNode, false ) ;

        return node ;
}

====================================================
Index: fckxhtml_gecko.js
/*
 * FCKeditor - The text editor for internet
 * Copyright (C) 2003-2004 Frederico Caldeira Knabben
 *
 * Licensed under the terms of the GNU Lesser General Public License:
 *              http://www.opensource.org/licenses/lgpl-license.php
 *
 * For further information visit:
 *              http://www.fckeditor.net/
 *
 * File Name: fckxhtml_gecko.js
 *      Defines the FCKXHtml object, responsible for the XHTML operations.
 *      Gecko specific.
 *
 * Version:  2.0 RC3
 * Modified: 2005-02-24 00:20:55
 *
 * File Authors:
 *              Frederico Caldeira Knabben (address@hidden)
 */

FCKXHtml._GetMainXmlString = function()
{
        // Create the XMLSerializer.
        var oSerializer = new XMLSerializer() ;

        // Return the serialized XML as a string.
        // Due to a BUG on Gecko, the special chars sequence "#?-:" must be 
replaced with "&"
        // for the XHTML entities.
        return oSerializer.serializeToString( this.MainNode ).replace( 
FCKXHtmlEntities.GeckoEntitiesMarkerRegex, '&' ) ;
}

// There is a BUG on Gecko... createEntityReference returns null.
// So we use a trick to append entities on it.
FCKXHtml._AppendEntity = function( xmlNode, entity )
{
        xmlNode.appendChild( this.XML.createTextNode( '#?-:' + entity + ';' ) ) 
;
}

FCKXHtml._AppendAttributes = function( xmlNode, htmlNode, node )
{
        var aAttributes = htmlNode.attributes ;

        for ( var n = 0 ; n < aAttributes.length ; n++ )
        {
                var oAttribute = aAttributes[n] ;

                if ( oAttribute.specified )
                {
                        var sAttName = oAttribute.nodeName.toLowerCase() ;

                        // The "_fckxhtmljob" attribute is used to mark the 
already processed elements.
                        if ( sAttName == '_fckxhtmljob' )
                                continue ;
                        // There is a bug in Mozilla that returns '_moz_xxx' 
attributes as specified.
                        else if ( sAttName.indexOf( '_moz' ) == 0 )
                                continue ;
                        // There are one cases (on Gecko) when the 
oAttribute.nodeValue must be used:
                        //              - for the "class" attribute
                        else if ( sAttName == 'class' )
                                var sAttValue = oAttribute.nodeValue ;
                        // XHTML doens't support attribute minimization like 
"CHECKED". It must be trasformed to cheched="checked".
                        else if ( oAttribute.nodeValue === true )
                                sAttValue = sAttName ;
                        else
                                var sAttValue = htmlNode.getAttribute( 
sAttName, 2 ) ;  // We must use getAttribute to get it exactly as it is defined.

                        if ( FCKConfig.ForceSimpleAmpersand && 
sAttValue.replace )
                                sAttValue = sAttValue.replace( /&/g, 
'___FCKAmp___' ) ;

                        this._AppendAttribute( node, sAttName, sAttValue ) ;
                }
        }
}

====================================================
Index: fckxhtml_ie.js
/*
 * FCKeditor - The text editor for internet
 * Copyright (C) 2003-2004 Frederico Caldeira Knabben
 *
 * Licensed under the terms of the GNU Lesser General Public License:
 *              http://www.opensource.org/licenses/lgpl-license.php
 *
 * For further information visit:
 *              http://www.fckeditor.net/
 *
 * File Name: fckxhtml_ie.js
 *      Defines the FCKXHtml object, responsible for the XHTML operations.
 *      IE specific.
 *
 * Version:  2.0 RC3
 * Modified: 2005-02-24 00:20:19
 *
 * File Authors:
 *              Frederico Caldeira Knabben (address@hidden)
 */

FCKXHtml._GetMainXmlString = function()
{
        return this.MainNode.xml ;
}

FCKXHtml._AppendEntity = function( xmlNode, entity )
{
        xmlNode.appendChild( this.XML.createEntityReference( entity ) ) ;
}

FCKXHtml._AppendAttributes = function( xmlNode, htmlNode, node, nodeName )
{
        var aAttributes = htmlNode.attributes ;

        for ( var n = 0 ; n < aAttributes.length ; n++ )
        {
                var oAttribute = aAttributes[n] ;

                if ( oAttribute.specified )
                {
                        var sAttName = oAttribute.nodeName.toLowerCase() ;

                        // The "_fckxhtmljob" attribute is used to mark the 
already processed elements.
                        if ( sAttName == '_fckxhtmljob' )
                                continue ;
                        // The following must be done because of a bug on IE 
regarding the style
                        // attribute. It returns "null" for the nodeValue.
                        else if ( sAttName == 'style' )
                                var sAttValue = htmlNode.style.cssText ;
                        // There are two cases when the oAttribute.nodeValue 
must be used:
                        //              - for the "class" attribute
                        //              - for events attributes (on IE only).
                        else if ( sAttName == 'class' || sAttName.indexOf('on') 
== 0 )
                                var sAttValue = oAttribute.nodeValue ;
                        else if ( nodeName == 'body' && sAttName == 
'contenteditable' )
                                continue ;
                        // XHTML doens't support attribute minimization like 
"CHECKED". It must be trasformed to cheched="checked".
                        else if ( oAttribute.nodeValue === true )
                                sAttValue = sAttName ;
                        // We must use getAttribute to get it exactly as it is 
defined.
                        else
                                var sAttValue = htmlNode.getAttribute( 
sAttName, 2 ) ;

                        if ( FCKConfig.ForceSimpleAmpersand && 
sAttValue.replace )
                                sAttValue = sAttValue.replace( /&/g, 
'___FCKAmp___' ) ;

                        this._AppendAttribute( node, sAttName, sAttValue ) ;
                }
        }
}

FCKXHtml.TagProcessors['meta'] = function( node, htmlNode )
{
        var oHttpEquiv = node.attributes.getNamedItem( 'http-equiv' ) ;

        if ( oHttpEquiv == null || oHttpEquiv.value.length == 0 )
        {
                // Get the http-equiv value from the outerHTML.
                var sHttpEquiv = htmlNode.outerHTML.match( 
FCKRegexLib.MetaHttpEquiv ) ;

                if ( sHttpEquiv )
                {
                        sHttpEquiv = sHttpEquiv[1] ;
                        FCKXHtml._AppendAttribute( node, 'http-equiv', 
sHttpEquiv ) ;
                }
        }

        return node ;
}

// IE automaticaly changes <FONT> tags to <FONT size=+0>.
FCKXHtml.TagProcessors['font'] = function( node, htmlNode )
{
        if ( node.attributes.length == 0 )
                node = FCKXHtml.XML.createDocumentFragment() ;

        FCKXHtml._AppendChildNodes( node, htmlNode ) ;

        return node ;
}

// IE doens't see the value attribute as an attribute for the <INPUT> tag.
FCKXHtml.TagProcessors['input'] = function( node, htmlNode )
{
        if ( htmlNode.name )
                FCKXHtml._AppendAttribute( node, 'name', htmlNode.name ) ;

        if ( htmlNode.value && !node.attributes.getNamedItem( 'value' ) )
                FCKXHtml._AppendAttribute( node, 'value', htmlNode.value ) ;

        return node ;
}

// IE ignores the "SELECTED" attribute so we must add it manually.
FCKXHtml.TagProcessors['option'] = function( node, htmlNode )
{
        if ( htmlNode.selected && !node.attributes.getNamedItem( 'selected' ) )
                FCKXHtml._AppendAttribute( node, 'selected', 'selected' ) ;

        FCKXHtml._AppendChildNodes( node, htmlNode ) ;

        return node ;
}

// There is a BUG in IE regarding the ABBR tag.
FCKXHtml.TagProcessors['abbr'] = function( node, htmlNode )
{
        var oNextNode = htmlNode.nextSibling ;

        while ( true )
        {
                if ( oNextNode && oNextNode.nodeName != '/ABBR' )
                {
                        FCKXHtml._AppendNode( node, oNextNode ) ;
                        oNextNode = oNextNode.nextSibling ;
                }
                else
                        break ;
        }

        return node ;
}

// IE ignores the "COORDS" and "SHAPE" attribute so we must add it manually.
FCKXHtml.TagProcessors['area'] = function( node, htmlNode )
{
        if ( ! node.attributes.getNamedItem( 'coords' ) )
        {
                var sCoords = htmlNode.getAttribute( 'coords', 2 ) ;
                if ( sCoords && sCoords != '0,0,0' )
                        FCKXHtml._AppendAttribute( node, 'coords', sCoords ) ;
        }

        if ( ! node.attributes.getNamedItem( 'shape' ) )
        {
                var sCoords = htmlNode.getAttribute( 'shape', 2 ) ;
                if ( sCoords && sCoords.length > 0 )
                        FCKXHtml._AppendAttribute( node, 'shape', sCoords ) ;
        }

        return node ;
}

FCKXHtml.TagProcessors['label'] = function( node, htmlNode )
{
        if ( htmlNode.htmlFor.length > 0 )
                FCKXHtml._AppendAttribute( node, 'for', htmlNode.htmlFor ) ;

        FCKXHtml._AppendChildNodes( node, htmlNode ) ;

        return node ;
}

FCKXHtml.TagProcessors['form'] = function( node, htmlNode )
{
        if ( htmlNode.acceptCharset.length > 0 && htmlNode.acceptCharset != 
'UNKNOWN' )
                FCKXHtml._AppendAttribute( node, 'accept-charset', 
htmlNode.acceptCharset ) ;

        FCKXHtml._AppendChildNodes( node, htmlNode ) ;

        return node ;
}

====================================================
Index: fckxhtmlentities.js
/*
 * FCKeditor - The text editor for internet
 * Copyright (C) 2003-2004 Frederico Caldeira Knabben
 *
 * Licensed under the terms of the GNU Lesser General Public License:
 *              http://www.opensource.org/licenses/lgpl-license.php
 *
 * For further information visit:
 *              http://www.fckeditor.net/
 *
 * File Name: fckxhtmlentities.js
 *      This file define the HTML entities handled by the editor.
 *
 * Version:  2.0 RC3
 * Modified: 2004-11-22 16:23:11
 *
 * File Authors:
 *              Frederico Caldeira Knabben (address@hidden)
 */

FCKXHtmlEntities = new Object();

FCKXHtmlEntities.Entities = {
        // Latin-1 Entities
        ' ':'nbsp',
        '¡':'iexcl',
        '¢':'cent',
        '£':'pound',
        '¤':'curren',
        'Â¥':'yen',
        '¦':'brvbar',
        '§':'sect',
        '¨':'uml',
        '©':'copy',
        'ª':'ordf',
        '«':'laquo',
        '¬':'not',
        '­':'shy',
        '®':'reg',
        '¯':'macr',
        '°':'deg',
        '±':'plusmn',
        '²':'sup2',
        '³':'sup3',
        '´':'acute',
        'µ':'micro',
        '¶':'para',
        '·':'middot',
        '¸':'cedil',
        '¹':'sup1',
        'º':'ordm',
        '»':'raquo',
        '¼':'frac14',
        '½':'frac12',
        '¾':'frac34',
        '¿':'iquest',
        'À':'Agrave',
        'Á':'Aacute',
        'Â':'Acirc',
        'Ã':'Atilde',
        'Ä':'Auml',
        'Å':'Aring',
        'Æ':'AElig',
        'Ç':'Ccedil',
        'È':'Egrave',
        'É':'Eacute',
        'Ê':'Ecirc',
        'Ë':'Euml',
        'Ì':'Igrave',
        'Í':'Iacute',
        'Î':'Icirc',
        'Ï':'Iuml',
        'Ð':'ETH',
        'Ñ':'Ntilde',
        'Ò':'Ograve',
        'Ó':'Oacute',
        'Ô':'Ocirc',
        'Õ':'Otilde',
        'Ö':'Ouml',
        '×':'times',
        'Ø':'Oslash',
        'Ù':'Ugrave',
        'Ú':'Uacute',
        'Û':'Ucirc',
        'Ü':'Uuml',
        'Ý':'Yacute',
        'Þ':'THORN',
        'ß':'szlig',
        'à':'agrave',
        'á':'aacute',
        'â':'acirc',
        'ã':'atilde',
        'ä':'auml',
        'Ã¥':'aring',
        'æ':'aelig',
        'ç':'ccedil',
        'è':'egrave',
        'é':'eacute',
        'ê':'ecirc',
        'ë':'euml',
        'ì':'igrave',
        'í':'iacute',
        'î':'icirc',
        'ï':'iuml',
        'ð':'eth',
        'ñ':'ntilde',
        'ò':'ograve',
        'ó':'oacute',
        'ô':'ocirc',
        'õ':'otilde',
        'ö':'ouml',
        '÷':'divide',
        'ø':'oslash',
        'ù':'ugrave',
        'ú':'uacute',
        'û':'ucirc',
        'ü':'uuml',
        'ý':'yacute',
        'þ':'thorn',
        'ÿ':'yuml',

        // Symbols and Greek Letters

        'ƒ':'fnof',
        'Α':'Alpha',
        'Β':'Beta',
        'Γ':'Gamma',
        'Δ':'Delta',
        'Ε':'Epsilon',
        'Ζ':'Zeta',
        'Η':'Eta',
        'Θ':'Theta',
        'Ι':'Iota',
        'Κ':'Kappa',
        'Λ':'Lambda',
        'Μ':'Mu',
        'Ν':'Nu',
        'Ξ':'Xi',
        'Ο':'Omicron',
        'Π':'Pi',
        'Ρ':'Rho',
        'Σ':'Sigma',
        'Τ':'Tau',
        'Î¥':'Upsilon',
        'Φ':'Phi',
        'Χ':'Chi',
        'Ψ':'Psi',
        'Ω':'Omega',
        'α':'alpha',
        'β':'beta',
        'γ':'gamma',
        'δ':'delta',
        'ε':'epsilon',
        'ζ':'zeta',
        'η':'eta',
        'θ':'theta',
        'ι':'iota',
        'κ':'kappa',
        'λ':'lambda',
        'μ':'mu',
        'ν':'nu',
        'ξ':'xi',
        'ο':'omicron',
        'π':'pi',
        'ρ':'rho',
        'ς':'sigmaf',
        'σ':'sigma',
        'τ':'tau',
        'υ':'upsilon',
        'φ':'phi',
        'χ':'chi',
        'ψ':'psi',
        'ω':'omega',
        'ϑ':'thetasym',
        'ϒ':'upsih',
        'ϖ':'piv',
        '•':'bull',
        '…':'hellip',
        '′':'prime',
        '″':'Prime',
        '‾':'oline',
        '⁄':'frasl',
        '℘':'weierp',
        'ℑ':'image',
        'ℜ':'real',
        '™':'trade',
        'ℵ':'alefsym',
        '←':'larr',
        '↑':'uarr',
        '→':'rarr',
        '↓':'darr',
        '↔':'harr',
        '↵':'crarr',
        '⇐':'lArr',
        '⇑':'uArr',
        '⇒':'rArr',
        '⇓':'dArr',
        '⇔':'hArr',
        '∀':'forall',
        '∂':'part',
        '∃':'exist',
        '∅':'empty',
        '∇':'nabla',
        '∈':'isin',
        '∉':'notin',
        '∋':'ni',
        '∏':'prod',
        '∑':'sum',
        '−':'minus',
        '∗':'lowast',
        '√':'radic',
        '∝':'prop',
        '∞':'infin',
        '∠':'ang',
        '∧':'and',
        '∨':'or',
        '∩':'cap',
        '∪':'cup',
        '∫':'int',
        '∴':'there4',
        '∼':'sim',
        '≅':'cong',
        '≈':'asymp',
        '≠':'ne',
        '≡':'equiv',
        '≤':'le',
        '≥':'ge',
        '⊂':'sub',
        '⊃':'sup',
        '⊄':'nsub',
        '⊆':'sube',
        '⊇':'supe',
        '⊕':'oplus',
        '⊗':'otimes',
        '⊥':'perp',
        '⋅':'sdot',
        '⌈':'lceil',
        '⌉':'rceil',
        '⌊':'lfloor',
        '⌋':'rfloor',
        '〈':'lang',
        '〉':'rang',
        '◊':'loz',
        '♠':'spades',
        '♣':'clubs',
        '♥':'hearts',
        '♦':'diams',

        // Other Special Characters

        '"':'quot',
//      '&':'amp',              // This entity is automatically handled by the 
XHTML parser.
//      '<':'lt',               // This entity is automatically handled by the 
XHTML parser.
//      '>':'gt',               // This entity is automatically handled by the 
XHTML parser.
        'Œ':'OElig',
        'œ':'oelig',
        'Å ':'Scaron',
        'Å¡':'scaron',
        'Ÿ':'Yuml',
        'ˆ':'circ',
        '˜':'tilde',
        ' ':'ensp',
        ' ':'emsp',
        ' ':'thinsp',
        '‌':'zwnj',
        '‍':'zwj',
        '‎':'lrm',
        '‏':'rlm',
        '–':'ndash',
        '—':'mdash',
        '‘':'lsquo',
        '’':'rsquo',
        '‚':'sbquo',
        '“':'ldquo',
        '”':'rdquo',
        '„':'bdquo',
        '†':'dagger',
        '‡':'Dagger',
        '‰':'permil',
        '‹':'lsaquo',
        '›':'rsaquo',
        '€':'euro'

} ;

FCKXHtmlEntities.Chars = '' ;

for ( var e in FCKXHtmlEntities.Entities )
        FCKXHtmlEntities.Chars += e ;

FCKXHtmlEntities.EntitiesRegex = new RegExp('','') ;

FCKXHtmlEntities.EntitiesRegex.compile( '[' + FCKXHtmlEntities.Chars + ']|[^' + 
FCKXHtmlEntities.Chars + ']+', 'g' ) ;

FCKXHtmlEntities.GeckoEntitiesMarkerRegex = /#\?-\:/g ;

====================================================
Index: fckurlparams.js
/*
 * FCKeditor - The text editor for internet
 * Copyright (C) 2003-2004 Frederico Caldeira Knabben
 *
 * Licensed under the terms of the GNU Lesser General Public License:
 *              http://www.opensource.org/licenses/lgpl-license.php
 *
 * For further information visit:
 *              http://www.fckeditor.net/
 *
 * File Name: fckurlparams.js
 *      Defines the FCKURLParams object that is used to get all parameters
 *      passed by the URL QueryString (after the "?").
 *
 * Version:  2.0 RC3
 * Modified: 2004-05-31 23:07:51
 *
 * File Authors:
 *              Frederico Caldeira Knabben (address@hidden)
 */

// #### URLParams: holds all URL passed parameters (like 
?Param1=Value1&Param2=Value2)
var FCKURLParams = new Object() ;

var aParams = document.location.search.substr(1).split('&') ;
for ( i = 0 ; i < aParams.length ; i++ )
{
        var aParam = aParams[i].split('=') ;
        var sParamName  = aParam[0] ;
        var sParamValue = aParam[1] ;

        FCKURLParams[ sParamName ] = sParamValue ;
}

====================================================
Index: fcktools_ie.js
/*
 * FCKeditor - The text editor for internet
 * Copyright (C) 2003-2004 Frederico Caldeira Knabben
 *
 * Licensed under the terms of the GNU Lesser General Public License:
 *              http://www.opensource.org/licenses/lgpl-license.php
 *
 * For further information visit:
 *              http://www.fckeditor.net/
 *
 * File Name: fcktools_ie.js
 *      Utility functions. (IE version).
 *
 * Version:  2.0 RC3
 * Modified: 2005-02-23 00:43:29
 *
 * File Authors:
 *              Frederico Caldeira Knabben (address@hidden)
 */

// Appends a CSS file to a document.
FCKTools.AppendStyleSheet = function( documentElement, cssFileUrl )
{
        return documentElement.createStyleSheet( cssFileUrl ) ;
}

// Removes all attributes and values from the element.
FCKTools.ClearElementAttributes = function( element )
{
        element.clearAttributes() ;
}

FCKTools.GetAllChildrenIds = function( parentElement )
{
        var aIds = new Array() ;
        for ( var i = 0 ; i < parentElement.all.length ; i++ )
        {
                var sId = parentElement.all[i].id ;
                if ( sId && sId.length > 0 )
                        aIds[ aIds.length ] = sId ;
        }
        return aIds ;
}

FCKTools.RemoveOuterTags = function( e )
{
        e.insertAdjacentHTML( 'beforeBegin', e.innerHTML ) ;
        e.parentNode.removeChild( e ) ;
}

FCKTools.CreateXmlObject = function( object )
{
        var aObjs ;

        switch ( object )
        {
                case 'XmlHttp' :
                        aObjs = [ 'MSXML2.XmlHttp', 'Microsoft.XmlHttp' ] ;
                        break ;

                case 'DOMDocument' :
                        aObjs = [ 'MSXML2.DOMDocument', 'Microsoft.XmlDom' ] ;
                        break ;
        }

        for ( var i = 0 ; i < 2 ; i++ )
        {
                try { return new ActiveXObject( aObjs[i] ) ; }
                catch (e) {}
        }
}

====================================================
Index: fcktoolbarset.js
/*
 * FCKeditor - The text editor for internet
 * Copyright (C) 2003-2004 Frederico Caldeira Knabben
 *
 * Licensed under the terms of the GNU Lesser General Public License:
 *              http://www.opensource.org/licenses/lgpl-license.php
 *
 * For further information visit:
 *              http://www.fckeditor.net/
 *
 * File Name: fcktoolbarset.js
 *      Defines the FCKToolbarSet object that is used to load and draw the
 *      toolbar.
 *
 * Version:  2.0 RC3
 * Modified: 2005-02-09 17:39:32
 *
 * File Authors:
 *              Frederico Caldeira Knabben (address@hidden)
 */

var FCKToolbarSet = FCK.ToolbarSet = new Object() ;

document.getElementById( 'ExpandHandle' ).title         = FCKLang.ToolbarExpand 
;
document.getElementById( 'CollapseHandle' ).title       = 
FCKLang.ToolbarCollapse ;

FCKToolbarSet.Toolbars = new Array() ;

// Array of toolbat items that are active only on WYSIWYG mode.
FCKToolbarSet.ItemsWysiwygOnly = new Array() ;

// Array of toolbar items that are sensitive to the cursor position.
FCKToolbarSet.ItemsContextSensitive = new Array() ;

FCKToolbarSet.Expand = function()
{
        document.getElementById( 'Collapsed' ).style.display = 'none' ;
        document.getElementById( 'Expanded' ).style.display = '' ;

        if ( ! FCKBrowserInfo.IsIE )
        {
                // I had to use "setTimeout" because Gecko was not responding 
in a right
                // way when calling window.onresize() directly.
                window.setTimeout( "window.onresize()", 1 ) ;
        }
}

FCKToolbarSet.Collapse = function()
{
        document.getElementById( 'Collapsed' ).style.display = '' ;
        document.getElementById( 'Expanded' ).style.display = 'none' ;

        if ( ! FCKBrowserInfo.IsIE )
        {
                // I had to use "setTimeout" because Gecko was not responding 
in a right
                // way when calling window.onresize() directly.
                window.setTimeout( "window.onresize()", 1 ) ;
        }
}

FCKToolbarSet.Restart = function()
{
        if ( !FCKConfig.ToolbarCanCollapse || FCKConfig.ToolbarStartExpanded )
                this.Expand() ;
        else
                this.Collapse() ;

        document.getElementById( 'CollapseHandle' ).style.display = 
FCKConfig.ToolbarCanCollapse ? '' : 'none' ;
}

FCKToolbarSet.Load = function( toolbarSetName )
{
        this.DOMElement = document.getElementById( 'eToolbar' ) ;

        var ToolbarSet = FCKConfig.ToolbarSets[toolbarSetName] ;

        if (! ToolbarSet)
        {
                alert( FCKLang.UnknownToolbarSet.replace( /%1/g, toolbarSetName 
) ) ;
                return ;
        }

        this.Toolbars = new Array() ;

        for ( var x = 0 ; x < ToolbarSet.length ; x++ )
        {
                var oToolbarItems = ToolbarSet[x] ;

                var oToolbar ;

                if ( typeof( oToolbarItems ) == 'string' )
                {
                        if ( oToolbarItems == '/' )
                                oToolbar = new FCKToolbarBreak() ;
                }
                else
                {
                        var oToolbar = new FCKToolbar() ;

                        for ( var j = 0 ; j < oToolbarItems.length ; j++ )
                        {
                                var sItem = oToolbarItems[j] ;

                                if ( sItem == '-')
                                        oToolbar.AddSeparator() ;
                                else
                                {
                                        var oItem = FCKToolbarItems.GetItem( 
sItem ) ;
                                        if ( oItem )
                                        {
                                                oToolbar.AddItem( oItem ) ;

                                                if ( !oItem.SourceView )
                                                        
this.ItemsWysiwygOnly[this.ItemsWysiwygOnly.length] = oItem ;

                                                if ( oItem.ContextSensitive )
                                                        
this.ItemsContextSensitive[this.ItemsContextSensitive.length] = oItem ;
                                        }
                                }
                        }

                        oToolbar.AddTerminator() ;
                }

                this.Toolbars[ this.Toolbars.length ] = oToolbar ;
        }
}

FCKToolbarSet.RefreshModeState = function()
{
        if ( FCK.EditMode == FCK_EDITMODE_WYSIWYG )
        {
                // Enable all buttons that are available on WYSIWYG mode only.
                for ( var i = 0 ; i < FCKToolbarSet.ItemsWysiwygOnly.length ; 
i++ )
                        FCKToolbarSet.ItemsWysiwygOnly[i].Enable() ;

                // Refresh the buttons state.
                FCKToolbarSet.RefreshItemsState() ;
        }
        else
        {
                // Refresh the buttons state.
                FCKToolbarSet.RefreshItemsState() ;

                // Disable all buttons that are available on WYSIWYG mode only.
                for ( var i = 0 ; i < FCKToolbarSet.ItemsWysiwygOnly.length ; 
i++ )
                        FCKToolbarSet.ItemsWysiwygOnly[i].Disable() ;
        }
}

FCKToolbarSet.RefreshItemsState = function()
{

        for ( var i = 0 ; i < FCKToolbarSet.ItemsContextSensitive.length ; i++ )
                FCKToolbarSet.ItemsContextSensitive[i].RefreshState() ;
/*
        TODO: Delete this commented block on stable version.
        for ( var i = 0 ; i < FCKToolbarSet.Toolbars.length ; i++ )
        {
                var oToolbar = FCKToolbarSet.Toolbars[i] ;
                for ( var j = 0 ; j < oToolbar.Items.length ; j++ )
                {
                        oToolbar.Items[j].RefreshState() ;
                }
        }
*/
}


====================================================
Index: fcktools.js
/*
 * FCKeditor - The text editor for internet
 * Copyright (C) 2003-2004 Frederico Caldeira Knabben
 *
 * Licensed under the terms of the GNU Lesser General Public License:
 *              http://www.opensource.org/licenses/lgpl-license.php
 *
 * For further information visit:
 *              http://www.fckeditor.net/
 *
 * File Name: fcktools.js
 *      Utility functions.
 *
 * Version:  2.0 RC3
 * Modified: 2005-02-19 15:27:16
 *
 * File Authors:
 *              Frederico Caldeira Knabben (address@hidden)
 */

var FCKTools = new Object() ;

//**
// FCKTools.GetLinkedFieldValue: Gets the value of the hidden INPUT element
// that is associated to the editor. This element has its ID set to the
// editor's instance name so the user reffers to the instance name when getting
// the posted data.
FCKTools.GetLinkedFieldValue = function()
{
        return FCK.LinkedField.value ;
}

//**
// FCKTools.SetLinkedFieldValue: Sets the value of the hidden INPUT element
// that is associated to the editor. This element has its ID set to the
// editor's instance name so the user reffers to the instance name when getting
// the posted data.
FCKTools.SetLinkedFieldValue = function( value )
{
        if ( FCKConfig.FormatOutput )
                FCK.LinkedField.value = FCKCodeFormatter.Format( value ) ;
        else
                FCK.LinkedField.value = value ;
}

//**
// FCKTools.AttachToLinkedFieldFormSubmit: attaches a function call to the
// submit event of the linked field form. This function us generally used to
// update the linked field value before submitting the form.
FCKTools.AttachToLinkedFieldFormSubmit = function( functionPointer )
{
        // Gets the linked field form
        var oForm = FCK.LinkedField.form ;

        // Return now if no form is available
        if (!oForm) return ;

        // Attaches the functionPointer call to the onsubmit event
        if ( FCKBrowserInfo.IsIE )
                oForm.attachEvent( "onsubmit", functionPointer ) ;
        else
                oForm.addEventListener( 'submit', functionPointer, true ) ;

        //**
        // Attaches the functionPointer call to the submit method
        // This is done because IE doesn't fire onsubmit when the submit method 
is called
        // BEGIN --

        // Creates a Array in the form object that will hold all Attached 
function call
        // (in the case there are more than one editor in the same page)
        if (! oForm.updateFCKEditor) oForm.updateFCKEditor = new Array() ;

        // Adds the function pointer to the array of functions to call when 
"submit" is called
        oForm.updateFCKEditor[oForm.updateFCKEditor.length] = functionPointer ;

        // Switches the original submit method with a new one that first call 
all functions
        // on the above array and the call the original submit
        // IE sees it oForm.submit function as an 'object'.
        if (! oForm.originalSubmit && ( typeof( oForm.submit ) == 'function' || 
( !oForm.submit.tagName && !oForm.submit.length ) ) )
        {
                // Creates a copy of the original submit
                oForm.originalSubmit = oForm.submit ;

                // Creates our replacement for the submit
                oForm.submit = function()
                {
                        if (this.updateFCKEditor)
                        {
                                // Calls all functions in the functions array
                                for (var i = 0 ; i < 
this.updateFCKEditor.length ; i++)
                                        this.updateFCKEditor[i]() ;
                        }
                        // Calls the original "submit"
                        this.originalSubmit() ;
                }
        }
        // END --
}

//**
// FCKTools.AddSelectOption: Adds a option to a SELECT element.
FCKTools.AddSelectOption = function( targetDocument, selectElement, optionText, 
optionValue )
{
        var oOption = targetDocument.createElement("OPTION") ;

        oOption.text    = optionText ;
        oOption.value   = optionValue ;

        selectElement.options.add(oOption) ;

        return oOption ;
}

FCKTools.RemoveAllSelectOptions = function( selectElement )
{
        for ( var i = selectElement.options.length - 1 ; i >= 0 ; i-- )
        {
                selectElement.options.remove(i) ;
        }
}

FCKTools.SelectNoCase = function( selectElement, value, defaultValue )
{
        var sNoCaseValue = value.toString().toLowerCase() ;

        for ( var i = 0 ; i < selectElement.options.length ; i++ )
        {
                if ( sNoCaseValue == 
selectElement.options[i].value.toLowerCase() )
                {
                        selectElement.selectedIndex = i ;
                        return ;
                }
        }

        if ( defaultValue != null ) FCKTools.SelectNoCase( selectElement, 
defaultValue ) ;
}

FCKTools.HTMLEncode = function( text )
{
        text = text.replace( /&/g, "&amp;" ) ;
        text = text.replace( /"/g, "&quot;" ) ;
        text = text.replace( /</g, "&lt;" ) ;
        text = text.replace( />/g, "&gt;" ) ;
        text = text.replace( /'/g, "&#39;" ) ;

        return text ;
}

//**
// FCKTools.GetResultingArray: Gets a array from a string (where the elements
// are separated by a character), a fuction (that returns a array) or a array.
FCKTools.GetResultingArray = function( arraySource, separator )
{
        switch ( typeof( arraySource ) )
        {
                case "string" :
                        return arraySource.split( separator ) ;
                case "function" :
                        return separator() ;
                default :
                        if ( isArray( arraySource ) ) return arraySource ;
                        else return new Array() ;
        }
}

FCKTools.GetElementPosition = function( el )
{
        // Initializes the Coordinates object that will be returned by the 
function.
        var c = { X:0, Y:0 } ;

        // Loop throw the offset chain.
        while ( el )
        {
                c.X += el.offsetLeft ;
                c.Y += el.offsetTop ;

                el = el.offsetParent ;
        }

        // Return the Coordinates object
        return c ;
}

FCKTools.GetElementAscensor = function( element, ascensorTagName )
{
        var e = element.parentNode ;

        while ( e )
        {
                if ( e.nodeName == ascensorTagName )
                        return e ;

                e = e.parentNode ;
        }
}

FCKTools.Pause = function( miliseconds )
{
        var oStart = new Date() ;

        while (true)
        {
                var oNow = new Date() ;
                if ( miliseconds < oNow - oStart )
                        return ;
        }
}


====================================================
Index: fcktools_gecko.js
/*
 * FCKeditor - The text editor for internet
 * Copyright (C) 2003-2004 Frederico Caldeira Knabben
 *
 * Licensed under the terms of the GNU Lesser General Public License:
 *              http://www.opensource.org/licenses/lgpl-license.php
 *
 * For further information visit:
 *              http://www.fckeditor.net/
 *
 * File Name: fcktools_gecko.js
 *      Utility functions. (Gecko version).
 *
 * Version:  2.0 RC3
 * Modified: 2005-02-23 00:00:57
 *
 * File Authors:
 *              Frederico Caldeira Knabben (address@hidden)
 */

// Appends a CSS file to a document.
FCKTools.AppendStyleSheet = function( documentElement, cssFileUrl )
{
        var e = documentElement.createElement( 'LINK' ) ;
        e.rel   = 'stylesheet' ;
        e.type  = 'text/css' ;
        e.href  = cssFileUrl ;
        documentElement.getElementsByTagName("HEAD")[0].appendChild( e ) ;
}

// Removes all attributes and values from the element.
FCKTools.ClearElementAttributes = function( element )
{
        // Loop throw all attributes in the element
        for ( var i = 0 ; i < element.attributes.length ; i++ )
        {
                // Remove the element by name.
                element.removeAttribute( element.attributes[i].name, 0 ) ;      
// 0 : Case Insensitive
        }
}

// Returns an Array of strings with all defined in the elements inside another 
element.
FCKTools.GetAllChildrenIds = function( parentElement )
{
        // Create the array that will hold all Ids.
        var aIds = new Array() ;

        // Define a recursive function that search for the Ids.
        var fGetIds = function( parent )
        {
                for ( var i = 0 ; i < parent.childNodes.length ; i++ )
                {
                        var sId = parent.childNodes[i].id ;

                        // Check if the Id is defined for the element.
                        if ( sId && sId.length > 0 ) aIds[ aIds.length ] = sId ;

                        // Recursive call.
                        fGetIds( parent.childNodes[i] ) ;
                }
        }

        // Start the recursive calls.
        fGetIds( parentElement ) ;

        return aIds ;
}

FCKTools.RemoveOuterTags = function( e )
{
        var oFragment = e.ownerDocument.createDocumentFragment() ;

        for ( var i = 0 ; i < e.childNodes.length ; i++ )
                oFragment.appendChild( e.childNodes[i] ) ;

        e.parentNode.replaceChild( oFragment, e ) ;
}

FCKTools.CreateXmlObject = function( object )
{
        switch ( object )
        {
                case 'XmlHttp' :
                        return new XMLHttpRequest() ;
                case 'DOMDocument' :
                        return document.implementation.createDocument( '', '', 
null ) ;
        }
}

====================================================
Index: fckdialog_gecko.js
/*
 * FCKeditor - The text editor for internet
 * Copyright (C) 2003-2004 Frederico Caldeira Knabben
 *
 * Licensed under the terms of the GNU Lesser General Public License:
 *              http://www.opensource.org/licenses/lgpl-license.php
 *
 * For further information visit:
 *              http://www.fckeditor.net/
 *
 * File Name: fckdialog_gecko.js
 *      Dialog windows operations. (Gecko specific implementations)
 *
 * Version:  2.0 RC3
 * Modified: 2004-12-28 00:42:29
 *
 * File Authors:
 *              Frederico Caldeira Knabben (address@hidden)
 */

FCKDialog.Show = function( dialogInfo, dialogName, pageUrl, dialogWidth, 
dialogHeight, parentWindow )
{
        var iTop  = (screen.height - dialogHeight) / 2 ;
        var iLeft = (screen.width  - dialogWidth)  / 2 ;

        var sOption  = 
"location=no,menubar=no,resizable=no,toolbar=no,dependent=yes,dialog=yes,minimizable=no,modal=yes,alwaysRaised=yes"
 +
                ",width="  + dialogWidth +
                ",height=" + dialogHeight +
                ",top="  + iTop +
                ",left=" + iLeft ;

        if ( !parentWindow )
                parentWindow = window ;

        var oWindow = parentWindow.open( '', 'FCKEditorDialog_' + dialogName, 
sOption, true ) ;
        oWindow.moveTo( iLeft, iTop ) ;
        oWindow.resizeTo( dialogWidth, dialogHeight ) ;
        oWindow.focus() ;
        oWindow.location.href = pageUrl ;

        oWindow.dialogArguments = dialogInfo ;

        // On some Gecko browsers (probably over slow connections) the
        // "dialogArguments" are not set to the target window so we must
        // put it in the opener window so it can be used by the target one.
        parentWindow.FCKLastDialogInfo = dialogInfo ;

        this.Window = oWindow ;

        // Try/Catch must be used to avoit an error when using a frameset
        // on a different domain:
        // "Permission denied to get property Window.releaseEvents".
        try
        {
                window.top.captureEvents( Event.CLICK | Event.MOUSEDOWN | 
Event.MOUSEUP | Event.FOCUS ) ;
                window.top.parent.addEventListener( 'mousedown', 
this.CheckFocus, true ) ;
                window.top.parent.addEventListener( 'mouseup', this.CheckFocus, 
true ) ;
                window.top.parent.addEventListener( 'click', this.CheckFocus, 
true ) ;
                window.top.parent.addEventListener( 'focus', this.CheckFocus, 
true ) ;
        }
        catch (e)
        {}
}

FCKDialog.CheckFocus = function()
{
        // It is strange, but we have to check the FCKDialog existence to avoid 
a
        // random error: "FCKDialog is not defined".
        if ( typeof( FCKDialog ) != "object" )
                return ;

        if ( FCKDialog.Window && !FCKDialog.Window.closed )
        {
                FCKDialog.Window.focus() ;
                return false ;
        }
        else
        {
                // Try/Catch must be used to avoit an error when using a 
frameset
                // on a different domain:
                // "Permission denied to get property Window.releaseEvents".
                try
                {
                        window.top.releaseEvents(Event.CLICK | Event.MOUSEDOWN 
| Event.MOUSEUP | Event.FOCUS) ;
                        window.top.parent.removeEventListener( 'onmousedown', 
FCKDialog.CheckFocus, true ) ;
                        window.top.parent.removeEventListener( 'mouseup', 
FCKDialog.CheckFocus, true ) ;
                        window.top.parent.removeEventListener( 'click', 
FCKDialog.CheckFocus, true ) ;
                        window.top.parent.removeEventListener( 'onfocus', 
FCKDialog.CheckFocus, true ) ;
                }
                catch (e)
                {}
        }
}


====================================================
Index: fckdialog.js
/*
 * FCKeditor - The text editor for internet
 * Copyright (C) 2003-2004 Frederico Caldeira Knabben
 *
 * Licensed under the terms of the GNU Lesser General Public License:
 *              http://www.opensource.org/licenses/lgpl-license.php
 *
 * For further information visit:
 *              http://www.fckeditor.net/
 *
 * File Name: fckdialog.js
 *      Dialog windows operations.
 *
 * Version:  2.0 RC3
 * Modified: 2004-12-19 23:28:55
 *
 * File Authors:
 *              Frederico Caldeira Knabben (address@hidden)
 */

var FCKDialog = new Object() ;

// This method opens a dialog window using the standard dialog template.
FCKDialog.OpenDialog = function( dialogName, dialogTitle, dialogPage, width, 
height, customValue, parentWindow )
{
        // Setup the dialog info.
        var oDialogInfo = new Object() ;
        oDialogInfo.Title = dialogTitle ;
        oDialogInfo.Page = dialogPage ;
        oDialogInfo.Editor = window ;
        oDialogInfo.CustomValue = customValue ;         // Optional

        var sUrl = FCKConfig.BasePath + 'fckdialog.html' ;
        this.Show( oDialogInfo, dialogName, sUrl, width, height, parentWindow ) 
;
}


====================================================
Index: fck_1_ie.js
/*
 * FCKeditor - The text editor for internet
 * Copyright (C) 2003-2004 Frederico Caldeira Knabben
 *
 * Licensed under the terms of the GNU Lesser General Public License:
 *              http://www.opensource.org/licenses/lgpl-license.php
 *
 * For further information visit:
 *              http://www.fckeditor.net/
 *
 * File Name: fck_1_ie.js
 *      This is the first part of the "FCK" object creation. This is the main
 *      object that represents an editor instance.
 *      (IE specific implementations)
 *
 * Version:  2.0 RC3
 * Modified: 2005-03-02 08:58:17
 *
 * File Authors:
 *              Frederico Caldeira Knabben (address@hidden)
 */

FCK.Description = "FCKeditor for Internet Explorer 5.5+" ;

// The behaviors should be pointed using the FullBasePath to avoid security
// errors when using a differente BaseHref.
FCK._BehaviorsStyle =
        '<style type="text/css" _fcktemp="true"> \
                TABLE   { behavior: url(' + FCKConfig.FullBasePath + 
'css/behaviors/showtableborders.htc) ; } \
                A               { behavior: url(' + FCKConfig.FullBasePath + 
'css/behaviors/anchors.htc) ; } \
                INPUT   { behavior: url(' + FCKConfig.FullBasePath + 
'css/behaviors/hiddenfield.htc) ; } \
        </style>' ;

FCK.InitializeBehaviors = function( dontReturn )
{
        // Set the focus to the editable area when clicking in the document 
area.
        // TODO: The cursor must be positioned at the end.
        this.EditorDocument.onmousedown = this.EditorDocument.onmouseup = 
function()
        {
                FCK.Focus() ;

                FCK.EditorWindow.event.cancelBubble     = true ;
                FCK.EditorWindow.event.returnValue      = false ;
        }

        // Intercept pasting operations
        this.EditorDocument.body.onpaste = function()
        {
                if ( FCK.Status == FCK_STATUS_COMPLETE )
                        return FCK.Events.FireEvent( "OnPaste" ) ;
                else
                        return false ;
        }

        // Disable Right-Click and shows the context menu.
        this.EditorDocument.oncontextmenu = function()
        {
                var e = this.parentWindow.event ;
                FCK.ShowContextMenu( e.screenX, e.screenY ) ;
                return false ;
        }
        // Check if key strokes must be monitored.
        if ( FCKConfig.UseBROnCarriageReturn || FCKConfig.TabSpaces > 0 )
        {
                // Build the "TAB" key replacement.
                if ( FCKConfig.TabSpaces > 0 )
                {
                        window.FCKTabHTML = '' ;
                        for ( i = 0 ; i < FCKConfig.TabSpaces ; i++ )
                                window.FCKTabHTML += "&nbsp;" ;
                }

                this.EditorDocument.onkeydown = function()
                {
                        var e = FCK.EditorWindow.event ;

                        if ( e.keyCode == 13 && FCKConfig.UseBROnCarriageReturn 
)       // ENTER
                        {
                                if ( (e.ctrlKey || e.altKey || e.shiftKey) )
                                        return true ;
                                else
                                {
                                        // We must ignore it if we are inside a 
List.
                                        if ( 
FCK.EditorDocument.queryCommandState( 'InsertOrderedList' ) || 
FCK.EditorDocument.queryCommandState( 'InsertUnorderedList' ) )
                                                return true ;

                                        // Insert the <BR> (The &nbsp; must be 
also inserted to make it work)
                                        FCK.InsertHtml("<br>&nbsp;") ;

                                        // Remove the &nbsp;
                                        var oRange = 
FCK.EditorDocument.selection.createRange() ;
                                        oRange.moveStart('character',-1) ;
                                        oRange.select() ;
                                        FCK.EditorDocument.selection.clear() ;

                                        return false ;
                                }
                        }
                        else if ( e.keyCode == 9 && FCKConfig.TabSpaces > 0 && 
!(e.ctrlKey || e.altKey || e.shiftKey) ) // TAB
                        {
                                FCK.InsertHtml( window.FCKTabHTML ) ;
                                return false ;
                        }

                        return true ;
                }
        }

        this.EditorDocument.ondblclick = function()
        {
                FCK.OnDoubleClick( FCK.EditorWindow.event.srcElement ) ;
                FCK.EditorWindow.event.cancelBubble = true ;
        }

        // Catch cursor movements
        this.EditorDocument.onselectionchange = function()
        {
                FCK.Events.FireEvent( "OnSelectionChange" ) ;
        }

        //Enable editing
//      this.EditorDocument.body.contentEditable = true ;
}

FCK.Focus = function()
{
        try
        {
                if ( FCK.EditMode == FCK_EDITMODE_WYSIWYG )
                        FCK.EditorDocument.body.focus() ;
                else
                        document.getElementById('eSourceField').focus() ;
        }
        catch(e) {}
}

FCK.SetHTML = function( html, forceWYSIWYG )
{
        if ( forceWYSIWYG || FCK.EditMode == FCK_EDITMODE_WYSIWYG )
        {
                // TODO: Wait stable version and remove the following commented 
lines.
                // In IE, if you do document.body.innerHTML = '<p><hr></p>' it 
throws a "Unknow runtime error".
                // To solve it we must add a fake (safe) tag before it, and 
then remove it.
                // this.EditorDocument.body.innerHTML = '<div 
id="__fakeFCKRemove__">&nbsp;</div>' + html.replace( FCKRegexLib.AposEntity, 
'&#39;' ) ;
                // 
this.EditorDocument.getElementById('__fakeFCKRemove__').removeNode(true) ;

                this.EditorDocument.open() ;

                if ( FCKConfig.FullPage )
                {
                        var sExtraHtml =
                                FCK._BehaviorsStyle +
                                '<link href="' + FCKConfig.FullBasePath + 
'css/fck_internal.css' + '" rel="stylesheet" type="text/css" _fcktemp="true" 
/>' ;

                        if ( FCK.TempBaseTag.length > 0 && 
!FCKRegexLib.HasBaseTag.test( html ) )
                                sExtraHtml += FCK.TempBaseTag ;

                        html = html.replace( FCKRegexLib.HeadCloser, sExtraHtml 
+ '</head>' ) ;

                        this.EditorDocument.write( html ) ;
                }
                else
                {
                        var sHtml =
                                '<html dir="' + FCKConfig.ContentLangDirection 
+ '">' +
                                '<head><title></title>' +
                                '<link href="' + FCKConfig.EditorAreaCSS + '" 
rel="stylesheet" type="text/css" />' +
                                '<link href="' + FCKConfig.FullBasePath + 
'css/fck_internal.css' + '" rel="stylesheet" type="text/css" _fcktemp="true" 
/>' ;

                        sHtml += FCK._BehaviorsStyle ;
                        sHtml += FCK.TempBaseTag ;
                        sHtml += '</head><body>' + html  + '</body></html>' ;

                        this.EditorDocument.write( sHtml ) ;
                }

                this.EditorDocument.close() ;

                this.InitializeBehaviors() ;
                this.EditorDocument.body.contentEditable = true ;

                this.Events.FireEvent( 'OnAfterSetHTML' ) ;

                // TODO: Wait stable version and remove the following commented 
lines.
//              this.EditorDocument.body.innerHTML = '' ;
//              if ( html && html.length > 0 )
//                      this.EditorDocument.write( html ) ;

//              this.EditorDocument.dir = FCKConfig.ContentLangDirection ;
        }
        else
                document.getElementById('eSourceField').value = html ;
}

// TODO: Wait stable version and remove the following commented lines.
/*
FCK.CheckRelativeLinks = function()
{
        // IE automatically change relative URLs to absolute, so we use a trick
        // to solve this problem (the document base points to "fckeditor:".

        for ( var i = 0 ; i < this.EditorDocument.links.length ; i++ )
        {
                var e = this.EditorDocument.links[i] ;

                if ( e.href.startsWith( FCK.BaseUrl ) )
                        e.href = e.href.remove( 0, FCK.BaseUrl.length ) ;
        }

        for ( var i = 0 ; i < this.EditorDocument.images.length ; i++ )
        {
                var e = this.EditorDocument.images[i] ;

                if ( e.src.startsWith( FCK.BaseUrl ) )
                        e.src = e.src.remove( 0, FCK.BaseUrl.length ) ;
        }
}
*/

FCK.InsertHtml = function( html )
{
        FCK.Focus() ;

        // Gets the actual selection.
        var oSel = FCK.EditorDocument.selection ;

        // Deletes the actual selection contents.
        if ( oSel.type.toLowerCase() != "none" )
                oSel.clear() ;

        // Inset the HTML.
        oSel.createRange().pasteHTML( html ) ;
}


====================================================
Index: fck_2.js
/*
 * FCKeditor - The text editor for internet
 * Copyright (C) 2003-2004 Frederico Caldeira Knabben
 *
 * Licensed under the terms of the GNU Lesser General Public License:
 *              http://www.opensource.org/licenses/lgpl-license.php
 *
 * For further information visit:
 *              http://www.fckeditor.net/
 *
 * File Name: fck_2.js
 *      This is the second part of the "FCK" object creation. This is the main
 *      object that represents an editor instance.
 *
 * Version:  2.0 RC3
 * Modified: 2005-03-02 10:44:27
 *
 * File Authors:
 *              Frederico Caldeira Knabben (address@hidden)
 */

// This collection is used by the browser specific implementations to tell
// wich named commands must be handled separately.
FCK.RedirectNamedCommands = new Object() ;

FCK.ExecuteNamedCommand = function( commandName, commandParameter )
{
        if ( FCK.RedirectNamedCommands[ commandName ] != null )
                FCK.ExecuteRedirectedNamedCommand( commandName, 
commandParameter ) ;
        else
        {
                FCK.Focus() ;
                FCK.EditorDocument.execCommand( commandName, false, 
commandParameter ) ;
                FCK.Events.FireEvent( 'OnSelectionChange' ) ;
        }
}

FCK.GetNamedCommandState = function( commandName )
{
        try
        {
                if ( !FCK.EditorDocument.queryCommandEnabled( commandName ) )
                        return FCK_TRISTATE_DISABLED ;
                else
                        return FCK.EditorDocument.queryCommandState( 
commandName ) ? FCK_TRISTATE_ON : FCK_TRISTATE_OFF ;
        }
        catch ( e )
        {
                return FCK_TRISTATE_OFF ;
        }
}

FCK.GetNamedCommandValue = function( commandName )
{
        var sValue = '' ;
        var eState = FCK.GetNamedCommandState( commandName ) ;

        if ( eState == FCK_TRISTATE_DISABLED )
                return null ;

        try
        {
                sValue = this.EditorDocument.queryCommandValue( commandName ) ;
        }
        catch(e) {}

        return sValue ? sValue : '' ;
}

FCK.CleanAndPaste = function( html )
{
        // Remove all SPAN tags
        html = html.replace(/<\/?SPAN[^>]*>/gi, "" );
        // Remove Class attributes
        html = html.replace(/<(\w[^>]*) class=([^ |>]*)([^>]*)/gi, "<$1$3") ;
        // Remove Style attributes
        html = html.replace(/<(\w[^>]*) style="([^"]*)"([^>]*)/gi, "<$1$3") ;
        // Remove Lang attributes
        html = html.replace(/<(\w[^>]*) lang=([^ |>]*)([^>]*)/gi, "<$1$3") ;
        // Remove XML elements and declarations
        html = html.replace(/<\\?\?xml[^>]*>/gi, "") ;
        // Remove Tags with XML namespace declarations: <o:p></o:p>
        html = html.replace(/<\/?\w+:[^>]*>/gi, "") ;
        // Replace the &nbsp;
        html = html.replace(/&nbsp;/, " " );
        // Transform <P> to <DIV>
        var re = new RegExp("(<P)([^>]*>.*?)(<\/P>)","gi") ;    // Different 
because of a IE 5.0 error
        html = html.replace( re, "<div$2</div>" ) ;

        FCK.InsertHtml( html ) ;
}

FCK.Preview = function()
{
        var oWindow = window.open( '', null, 
'toolbar=yes,location=yes,status=yes,menubar=yes,scrollbars=yes,resizable=yes' 
) ;

        var sHTML = '<html><head><link href="' + FCKConfig.EditorAreaCSS + '" 
rel="stylesheet" type="text/css" /></head><body>' + FCK.GetHTML() + 
'</body></html>' ;

        oWindow.document.write( sHTML );
        oWindow.document.close();

        // TODO: The CSS of the editor area must be configurable.
        // oWindow.document.createStyleSheet( config.EditorAreaCSS );
}

FCK.SwitchEditMode = function()
{
        // Check if the actual mode is WYSIWYG.
        var bWYSIWYG = ( FCK.EditMode == FCK_EDITMODE_WYSIWYG ) ;

        // Display/Hide the TRs.
        document.getElementById('eWysiwyg').style.display       = bWYSIWYG ? 
'none' : '' ;
        document.getElementById('eSource').style.display        = bWYSIWYG ? '' 
: 'none' ;

        // Update the HTML in the view output to show.
        if ( bWYSIWYG )
                document.getElementById('eSourceField').value = ( 
FCKConfig.EnableXHTML && FCKConfig.EnableSourceXHTML ? FCK.GetXHTML( 
FCKConfig.FormatSource ) : FCK.GetHTML( FCKConfig.FormatSource ) ) ;
        else
                FCK.SetHTML( FCK.GetHTML(), true ) ;

        // Updates the actual mode status.
        FCK.EditMode = bWYSIWYG ? FCK_EDITMODE_SOURCE : FCK_EDITMODE_WYSIWYG ;

        // Update the toolbar.
        FCKToolbarSet.RefreshModeState() ;

        // Set the Focus.
        FCK.Focus() ;
}


FCK.CreateElement = function( tag )
{
        var e = FCK.EditorDocument.createElement( tag ) ;
        return FCK.InsertElementAndGetIt( e ) ;
}

FCK.InsertElementAndGetIt = function( e )
{
        e.setAttribute( '__FCKTempLabel', 1 ) ;

        this.InsertElement( e ) ;

        var aEls = FCK.EditorDocument.getElementsByTagName( e.tagName ) ;

        for ( var i = 0 ; i < aEls.length ; i++ )
        {
                if ( aEls[i].getAttribute( '__FCKTempLabel' ) )
                {
                        aEls[i].removeAttribute( '__FCKTempLabel' ) ;
                        return aEls[i] ;
                }
        }
}


====================================================
Index: fck_2_gecko.js
/*
 * FCKeditor - The text editor for internet
 * Copyright (C) 2003-2004 Frederico Caldeira Knabben
 *
 * Licensed under the terms of the GNU Lesser General Public License:
 *              http://www.opensource.org/licenses/lgpl-license.php
 *
 * For further information visit:
 *              http://www.fckeditor.net/
 *
 * File Name: fck_2_gecko.js
 *      This is the second part of the "FCK" object creation. This is the main
 *      object that represents an editor instance.
 *      (Gecko specific implementations)
 *
 * Version:  2.0 RC3
 * Modified: 2004-12-20 14:04:19
 *
 * File Authors:
 *              Frederico Caldeira Knabben (address@hidden)
 */

// GetNamedCommandState overload for Gecko.
FCK._BaseGetNamedCommandState = FCK.GetNamedCommandState ;
FCK.GetNamedCommandState = function( commandName )
{
        switch ( commandName )
        {
                case 'Unlink' :
                        return FCKSelection.HasAncestorNode('A') ? 
FCK_TRISTATE_OFF : FCK_TRISTATE_DISABLED ;
                default :
                        return FCK._BaseGetNamedCommandState( commandName ) ;
        }
}

// Named commands to be handled by this browsers specific implementation.
FCK.RedirectNamedCommands =
{
        Print   : true,
        Paste   : true,
        Cut             : true,
        Copy    : true
}

// ExecuteNamedCommand overload for Gecko.
FCK.ExecuteRedirectedNamedCommand = function( commandName, commandParameter )
{
        switch ( commandName )
        {
                case 'Print' :
                        FCK.EditorWindow.print() ;
                        break ;
                case 'Paste' :
                        try                     { if ( FCK.Paste() ) 
FCK._BaseExecuteNamedCommand( 'Paste' ) ; }
                        catch (e)       { alert( FCKLang.PasteErrorPaste ) ; }
                        break ;
                case 'Cut' :
                        try                     { FCK._BaseExecuteNamedCommand( 
'Cut' ) ; }
                        catch (e)       { alert( FCKLang.PasteErrorCut ) ; }
                        break ;
                case 'Copy' :
                        try                     { FCK._BaseExecuteNamedCommand( 
'Copy' ) ; }
                        catch (e)       { alert( FCKLang.PasteErrorCopy ) ; }
                        break ;
                default :
                        FCK.ExecuteNamedCommand( commandName, commandParameter 
) ;
        }
}

FCK.AttachToOnSelectionChange = function( functionPointer )
{
        this.Events.AttachEvent( 'OnSelectionChange', functionPointer ) ;
}

FCK.Paste = function()
{
        if ( FCKConfig.ForcePasteAsPlainText )
        {
                FCK.PasteAsPlainText() ;
                return false ;
        }
        else if ( FCKConfig.AutoDetectPasteFromWord && 
FCKBrowserInfo.IsIE55OrMore )
        {
                var sHTML = FCK.GetClipboardHTML() ;
                var re = /<\w[^>]* class="?MsoNormal"?/gi ;
                if ( re.test( sHTML ) )
                {
                        if ( confirm( FCKLang["PasteWordConfirm"] ) )
                        {
                                FCK.CleanAndPaste( sHTML ) ;
                                return false ;
                        }
                }
        }
        else
                return true ;
}

//**
// FCK.InsertHtml: Inserts HTML at the current cursor location. Deletes the
// selected content if any.
FCK.InsertHtml = function( html )
{
        // Delete the actual selection.
        var oSel = FCKSelection.Delete() ;

//      var oContainer  = oSel.getRangeAt(0).startContainer ;
//      var iOffSet             = oSel.getRangeAt(0).startOffset ;

        // Get the first available range.
        var oRange = oSel.getRangeAt(0) ;

//      var oRange = this.EditorDocument.createRange() ;
//      oRange.setStart( oContainer, iOffSet ) ;
//      oRange.setEnd( oContainer, iOffSet ) ;

        // Create a fragment with the input HTML.
        var oFragment = oRange.createContextualFragment( html ) ;

        // Get the last available node.
        var oLastNode = oFragment.lastChild ;

        // Insert the fragment in the range.
        oRange.insertNode(oFragment) ;

        // Set the cursor after the inserted fragment.
        oRange.setEndAfter( oLastNode ) ;
        oRange.setStartAfter( oLastNode ) ;

        oSel.removeAllRanges() ;
        oSel = FCK.EditorWindow.getSelection() ;
        oSel.addRange( oRange ) ;

        this.Focus() ;
}

FCK.InsertElement = function( element )
{
        // Deletes the actual selection.
        var oSel = FCKSelection.Delete() ;

        // Gets the first available range.
        var oRange = oSel.getRangeAt(0) ;

        // Inserts the element in the range.
        oRange.insertNode( element ) ;

        // Set the cursor after the inserted fragment.
        oRange.setEndAfter( element ) ;
        oRange.setStartAfter( element ) ;

        this.Focus() ;
}

FCK.PasteAsPlainText = function()
{
        // TODO: Implement the "Paste as Plain Text" code.

        FCKDialog.OpenDialog( 'FCKDialog_Paste', FCKLang.PasteAsText, 
'dialog/fck_paste.html', 400, 330, 'PlainText' ) ;

/*
        var sText = FCKTools.HTMLEncode( clipboardData.getData("Text") ) ;
        sText = sText.replace( /\n/g, '<BR>' ) ;
        this.InsertHtml( sText ) ;
*/
}

FCK.PasteFromWord = function()
{
        // TODO: Implement the "Paste as Plain Text" code.

        FCKDialog.OpenDialog( 'FCKDialog_Paste', FCKLang.PasteFromWord, 
'dialog/fck_paste.html', 400, 330, 'Word' ) ;

//      FCK.CleanAndPaste( FCK.GetClipboardHTML() ) ;
}

FCK.GetClipboardHTML = function()
{
        return '' ;
}

FCK.CreateLink = function( url )
{
        FCK.ExecuteNamedCommand( 'Unlink' ) ;

        if ( url.length > 0 )
        {
                // Generate a temporary name for the link.
                var sTempUrl = 'javascript:void(0);/*' + ( new Date().getTime() 
) + '*/' ;

                // Use the internal "CreateLink" command to create the link.
                FCK.ExecuteNamedCommand( 'CreateLink', sTempUrl ) ;

                // Retrieve the just created link using XPath.
                var oLink = document.evaluate("//address@hidden'" + sTempUrl + 
"']", this.EditorDocument.body, null, 9, null).singleNodeValue ;

                if ( oLink )
                {
                        oLink.href = url ;
                        return oLink ;
                }
        }
}


====================================================
Index: fck_2_ie.js
/*
 * FCKeditor - The text editor for internet
 * Copyright (C) 2003-2004 Frederico Caldeira Knabben
 *
 * Licensed under the terms of the GNU Lesser General Public License:
 *              http://www.opensource.org/licenses/lgpl-license.php
 *
 * For further information visit:
 *              http://www.fckeditor.net/
 *
 * File Name: fck_2_ie.js
 *      This is the second part of the "FCK" object creation. This is the main
 *      object that represents an editor instance.
 *      (IE specific implementations)
 *
 * Version:  2.0 RC3
 * Modified: 2005-01-11 15:45:01
 *
 * File Authors:
 *              Frederico Caldeira Knabben (address@hidden)
 */

/*
if ( FCKConfig.UseBROnCarriageReturn )
{
        // Named commands to be handled by this browsers specific 
implementation.
        FCK.RedirectNamedCommands =
        {
                InsertOrderedList       : true,
                InsertUnorderedList     : true
        }

        FCK.ExecuteRedirectedNamedCommand = function( commandName, 
commandParameter )
        {
                if ( commandName == 'InsertOrderedList' || commandName == 
'InsertUnorderedList' )
                {
                        if ( !(FCK.EditorDocument.queryCommandState( 
'InsertOrderedList' ) || FCK.EditorDocument.queryCommandState( 
'InsertUnorderedList' )) )
                        {
                        }
                }

                FCK.ExecuteNamedCommand( commandName, commandParameter ) ;
        }
}
*/

FCK.Paste = function()
{
        if ( FCKConfig.ForcePasteAsPlainText )
        {
                FCK.PasteAsPlainText() ;
                return false ;
        }
        else if ( FCKConfig.AutoDetectPasteFromWord && 
FCKBrowserInfo.IsIE55OrMore )
        {
                var sHTML = FCK.GetClipboardHTML() ;
                var re = /<\w[^>]* class="?MsoNormal"?/gi ;
                if ( re.test( sHTML ) )
                {
                        if ( confirm( FCKLang["PasteWordConfirm"] ) )
                        {
                                FCK.CleanAndPaste( sHTML ) ;
                                return false ;
                        }
                }
        }
        else
                return true ;
}

FCK.PasteAsPlainText = function()
{
        // Get the data available in the clipboard and encodes it in HTML.
        var sText = FCKTools.HTMLEncode( clipboardData.getData("Text") ) ;

        // Replace the carriage returns with <BR>
        sText = sText.replace( /\n/g, '<BR>' ) ;

        // Insert the resulting data in the editor.
        this.InsertHtml( sText ) ;
}

FCK.PasteFromWord = function()
{
        FCK.CleanAndPaste( FCK.GetClipboardHTML() ) ;
}

FCK.InsertElement = function( element )
{
        FCK.InsertHtml( element.outerHTML ) ;
}

FCK.GetClipboardHTML = function()
{
        var oDiv = document.getElementById( '___FCKHiddenDiv' ) ;

        if ( !oDiv )
        {
                var oDiv = document.createElement( 'DIV' ) ;
                oDiv.id = '___FCKHiddenDiv' ;
                oDiv.style.visibility   = 'hidden' ;
                oDiv.style.overflow             = 'hidden' ;
                oDiv.style.position             = 'absolute' ;
                oDiv.style.width                = 1 ;
                oDiv.style.height               = 1 ;

                document.body.appendChild( oDiv ) ;
        }

        oDiv.innerHTML = '' ;

        var oTextRange = document.body.createTextRange() ;
        oTextRange.moveToElementText( oDiv ) ;
        oTextRange.execCommand( 'Paste' ) ;

        var sData = oDiv.innerHTML ;
        oDiv.innerHTML = '' ;

        return sData ;
}

FCK.AttachToOnSelectionChange = function( functionPointer )
{
        this.Events.AttachEvent( 'OnSelectionChange', functionPointer ) ;
}

/*
FCK.AttachToOnSelectionChange = function( functionPointer )
{
        FCK.EditorDocument.attachEvent( 'onselectionchange', functionPointer ) ;
}
*/

FCK.CreateLink = function( url )
{
        FCK.ExecuteNamedCommand( 'Unlink' ) ;

        if ( url.length > 0 )
        {
                // Generate a temporary name for the link.
                var sTempUrl = 'javascript:void(0);/*' + ( new Date().getTime() 
) + '*/' ;

                // Use the internal "CreateLink" command to create the link.
                FCK.ExecuteNamedCommand( 'CreateLink', sTempUrl ) ;

                // Loof for the just create link.
                var oLinks = this.EditorDocument.links ;

                for ( i = 0 ; i < oLinks.length ; i++ )
                {
                        if ( oLinks[i].href == sTempUrl )
                        {
                                oLinks[i].href = url ;
                                return oLinks[i] ;
                        }
                }
        }
}


====================================================
Index: fck_1_gecko.js
/*
 * FCKeditor - The text editor for internet
 * Copyright (C) 2003-2004 Frederico Caldeira Knabben
 *
 * Licensed under the terms of the GNU Lesser General Public License:
 *              http://www.opensource.org/licenses/lgpl-license.php
 *
 * For further information visit:
 *              http://www.fckeditor.net/
 *
 * File Name: fck_1_gecko.js
 *      This is the first part of the "FCK" object creation. This is the main
 *      object that represents an editor instance.
 *      (Gecko specific implementations)
 *
 * Version:  2.0 RC3
 * Modified: 2005-02-23 18:27:28
 *
 * File Authors:
 *              Frederico Caldeira Knabben (address@hidden)
 */

FCK.Description = "FCKeditor for Gecko Browsers" ;

FCK.InitializeBehaviors = function()
{
        // Disable Right-Click
        var oOnContextMenu = function( e )
        {
                e.preventDefault() ;
                FCK.ShowContextMenu( e.clientX, e.clientY ) ;
        }
        this.EditorDocument.addEventListener( 'contextmenu', oOnContextMenu, 
true ) ;

        var oOnKeyDown = function( e )
        {
                if ( e.ctrlKey && !e.shiftKey && !e.altKey )
                {
                        // Char 86/118 = V/v
                        if ( e.which == 86 || e.which == 118 )
                        {
                                if ( FCK.Status == FCK_STATUS_COMPLETE )
                                {
                                        if ( !FCK.Events.FireEvent( "OnPaste" ) 
)
                                                e.preventDefault() ;
                                }
                                else
                                        e.preventDefault() ;
                        }
                }
        }
        this.EditorDocument.addEventListener( 'keydown', oOnKeyDown, true ) ;

        this.ExecOnSelectionChange = function()
        {
                FCK.Events.FireEvent( "OnSelectionChange" ) ;
        }

        this.ExecOnSelectionChangeTimer = function()
        {
                if ( FCK.LastOnChangeTimer )
                        window.clearTimeout( FCK.LastOnChangeTimer ) ;

                FCK.LastOnChangeTimer = window.setTimeout( 
FCK.ExecOnSelectionChange, 100 ) ;
        }

        this.EditorDocument.addEventListener( 'mouseup', 
this.ExecOnSelectionChange, false ) ;

        // On Gecko, firing the "OnSelectionChange" event on every key press 
started to be too much
        // slow. So, a timer has been implemented to solve performance issues 
when tipying to quickly.
        this.EditorDocument.addEventListener( 'keyup', 
this.ExecOnSelectionChangeTimer, false ) ;

        this._DblClickListener = function( e )
        {
                FCK.OnDoubleClick( e.target ) ;
                e.stopPropagation() ;
        }

        this.EditorDocument.addEventListener( 'dblclick', 
this._DblClickListener, true ) ;

        this._OnLoad = function()
        {
                if ( this._FCK_HTML )
                {
                        this.document.body.innerHTML = this._FCK_HTML ;
                        this._FCK_HTML = null ;
                }
        }

        this.EditorWindow.addEventListener( 'load', this._OnLoad, true ) ;
}

FCK.MakeEditable = function()
{
        this.EditorWindow.document.designMode = 'on' ;

        // Tell Gecko to use or not the <SPAN> tag for the bold, italic and 
underline.
        this.EditorWindow.document.execCommand( 'useCSS', false, 
!FCKConfig.GeckoUseSPAN ) ;
}

FCK.Focus = function()
{
        try
        {
                FCK.EditorWindow.focus() ;
        }
        catch(e) {}
}

FCK.SetHTML = function( html, forceWYSIWYG )
{
        if ( forceWYSIWYG || FCK.EditMode == FCK_EDITMODE_WYSIWYG )
        {
                // Gecko has a lot of bugs mainly when handling editing 
features.
                // To avoid an Aplication Exception (that closes the browser!) 
we
                // must first write the <HTML> contents with an empty body, and
                // then insert the body contents.
                // (Oh yes... it took me a lot of time to find out this 
workaround)

                this.EditorDocument.open() ;

                if ( FCKConfig.FullPage && FCKRegexLib.BodyContents.test( html 
) )
                {
                        // Add the <BASE> tag to the input HTML.
                        if ( FCK.TempBaseTag.length > 0 && 
!FCKRegexLib.HasBaseTag.test( html ) )
                                html = html.replace( FCKRegexLib.HeadCloser, 
FCK.TempBaseTag + '</head>' ) ;

                        html = html.replace( FCKRegexLib.HeadCloser, '<link 
href="' + FCKConfig.BasePath + 'css/fck_internal.css' + '" rel="stylesheet" 
type="text/css" _fcktemp="true" /></head>' ) ;

                        // Extract the BODY contents from the html.
                        var oMatch              = html.match( 
FCKRegexLib.BodyContents ) ;
                        var sOpener             = oMatch[1] ;   // This is the 
HTML until the <body...> tag, inclusive.
                        var sContents   = oMatch[2] ;   // This is the BODY tag 
contents.
                        var sCloser             = oMatch[3] ;   // This is the 
HTML from the </body> tag, inclusive.

                        this.EditorDocument.write( sOpener + '&nbsp;' + sCloser 
) ;
                }
                else
                {
                        var sHtml =
                                '<html dir="' + FCKConfig.ContentLangDirection 
+ '">' +
                                '<head><title></title>' +
                                '<link href="' + FCKConfig.EditorAreaCSS + '" 
rel="stylesheet" type="text/css" />' +
                                '<link href="' + FCKConfig.BasePath + 
'css/fck_internal.css' + '" rel="stylesheet" type="text/css" _fcktemp="true" 
/>' ;

                        sHtml += FCK.TempBaseTag ;

                        sHtml += '</head><body>&nbsp;</body></html>' ;

                        this.EditorDocument.write( sHtml ) ;
                }

                this.EditorDocument.close() ;

                if ( this.EditorDocument.body )
                        this.EditorDocument.body.innerHTML = sContents ?  
sContents : html ;
                else
                        this.EditorWindow._FCK_HTML = sContents ?  sContents : 
html ;

                // TODO: Wait stable version and remove the following commented 
lines.
                // We must load the CSS style after setting the innerHTML to 
avoid an error.
                // The body is not available is the style link tag is written 
inside the <html> tag.
//              if ( !FCKConfig.FullPage )
//              {
//                      FCKTools.AppendStyleSheet( this.EditorDocument, 
FCKConfig.EditorAreaCSS ) ;
//                      FCKTools.AppendStyleSheet( this.EditorDocument, 
FCKConfig.BasePath + 'css/fck_internal.css' ) ;
//              }

                this.InitializeBehaviors() ;

                this.Events.FireEvent( 'OnAfterSetHTML' ) ;
        }
        else
                document.getElementById('eSourceField').value = html ;
}


====================================================
Index: fck_1.js
/*
 * FCKeditor - The text editor for internet
 * Copyright (C) 2003-2004 Frederico Caldeira Knabben
 *
 * Licensed under the terms of the GNU Lesser General Public License:
 *              http://www.opensource.org/licenses/lgpl-license.php
 *
 * For further information visit:
 *              http://www.fckeditor.net/
 *
 * File Name: fck_1.js
 *      This is the first part of the "FCK" object creation. This is the main
 *      object that represents an editor instance.
 *
 * Version:  2.0 RC3
 * Modified: 2005-02-27 21:46:32
 *
 * File Authors:
 *              Frederico Caldeira Knabben (address@hidden)
 */

FCK.Events      = new FCKEvents( FCK ) ;
FCK.Toolbar     = null ;

FCK.TempBaseTag = FCKConfig.BaseHref.length > 0 ? '<base href="' + 
FCKConfig.BaseHref + '" _fcktemp="true"></base>' : '' ;

FCK.StartEditor = function()
{
        // Get the editor's window and document (DOM)
        this.EditorWindow       = window.frames[ 'eEditorArea' ] ;
        this.EditorDocument     = this.EditorWindow.document ;

        // TODO: Wait stable version and remove the following commented lines.
        // The Base Path of the editor is saved to rebuild relative URL (IE 
issue).
//      this.BaseUrl = this.EditorDocument.location.protocol + '//' + 
this.EditorDocument.location.host ;

        if ( FCKBrowserInfo.IsGecko )
                this.MakeEditable() ;

        // Set the editor's startup contents
        this.SetHTML( FCKTools.GetLinkedFieldValue() ) ;

        // Attach the editor to the form onsubmit event
        FCKTools.AttachToLinkedFieldFormSubmit( this.UpdateLinkedField ) ;

        this.SetStatus( FCK_STATUS_ACTIVE ) ;
}

FCK.SetStatus = function( newStatus )
{
        this.Status = newStatus ;

        if ( newStatus == FCK_STATUS_ACTIVE )
        {
                // Force the focus in the window to go to the editor.
                window.onfocus = window.document.body.onfocus = FCK.Focus ;

                // Force the focus in the editor.
                if ( FCKConfig.StartupFocus )
                        FCK.Focus() ;

                // @Packager.Compactor.Remove.Start
                var sBrowserSuffix = FCKBrowserInfo.IsIE ? "ie" : "gecko" ;

                FCKScriptLoader.AddScript( '_source/internals/fck_2.js' ) ;
                FCKScriptLoader.AddScript( '_source/internals/fck_2_' + 
sBrowserSuffix + '.js' ) ;
                FCKScriptLoader.AddScript( '_source/internals/fckselection.js' 
) ;
                FCKScriptLoader.AddScript( '_source/internals/fckselection_' + 
sBrowserSuffix + '.js' ) ;
                FCKScriptLoader.AddScript( '_source/classes/fckpanel_' + 
sBrowserSuffix + '.js' ) ;
                FCKScriptLoader.AddScript( 
'_source/internals/fcktablehandler.js' ) ;
                FCKScriptLoader.AddScript( '_source/internals/fcktablehandler_' 
+ sBrowserSuffix + '.js' ) ;
                FCKScriptLoader.AddScript( '_source/classes/fckxml_' + 
sBrowserSuffix + '.js' ) ;
                FCKScriptLoader.AddScript( '_source/classes/fckstyledef.js' ) ;
                FCKScriptLoader.AddScript( '_source/classes/fckstyledef_' + 
sBrowserSuffix + '.js' ) ;
                FCKScriptLoader.AddScript( '_source/classes/fckstylesloader.js' 
) ;

                FCKScriptLoader.AddScript( 
'_source/commandclasses/fcknamedcommand.js' ) ;
                FCKScriptLoader.AddScript( 
'_source/commandclasses/fck_othercommands.js' ) ;
                FCKScriptLoader.AddScript( 
'_source/commandclasses/fckspellcheckcommand_' + sBrowserSuffix + '.js' ) ;
                FCKScriptLoader.AddScript( 
'_source/commandclasses/fcktextcolorcommand.js' ) ;
                FCKScriptLoader.AddScript( 
'_source/commandclasses/fckpasteplaintextcommand.js' ) ;
                FCKScriptLoader.AddScript( 
'_source/commandclasses/fckpastewordcommand.js' ) ;
                FCKScriptLoader.AddScript( 
'_source/commandclasses/fcktablecommand.js' ) ;
                FCKScriptLoader.AddScript( 
'_source/commandclasses/fckstylecommand.js' ) ;

                FCKScriptLoader.AddScript( '_source/internals/fckcommands.js' ) 
;
                FCKScriptLoader.AddScript( 
'_source/classes/fcktoolbarbutton.js' ) ;
                FCKScriptLoader.AddScript( '_source/classes/fcktoolbarcombo.js' 
) ;
                FCKScriptLoader.AddScript( '_source/classes/fckspecialcombo.js' 
) ;
                FCKScriptLoader.AddScript( 
'_source/classes/fcktoolbarspecialcombo.js' ) ;
                FCKScriptLoader.AddScript( 
'_source/classes/fcktoolbarfontscombo.js' ) ;
                FCKScriptLoader.AddScript( 
'_source/classes/fcktoolbarfontsizecombo.js' ) ;
                FCKScriptLoader.AddScript( 
'_source/classes/fcktoolbarfontformatcombo.js' ) ;
                FCKScriptLoader.AddScript( 
'_source/classes/fcktoolbarstylecombo.js' ) ;
                FCKScriptLoader.AddScript( 
'_source/classes/fcktoolbarpanelbutton.js' ) ;
                FCKScriptLoader.AddScript( 
'_source/internals/fcktoolbaritems.js' ) ;
                FCKScriptLoader.AddScript( '_source/classes/fcktoolbar.js' ) ;
                FCKScriptLoader.AddScript( '_source/classes/fcktoolbarbreak_' + 
sBrowserSuffix + '.js' ) ;
                FCKScriptLoader.AddScript( '_source/internals/fcktoolbarset.js' 
) ;
                FCKScriptLoader.AddScript( '_source/internals/fckdialog.js' ) ;
                FCKScriptLoader.AddScript( '_source/internals/fckdialog_' + 
sBrowserSuffix + '.js' ) ;
                FCKScriptLoader.AddScript( 
'_source/classes/fckcontextmenuitem.js' ) ;
                FCKScriptLoader.AddScript( 
'_source/classes/fckcontextmenuseparator.js' ) ;
                FCKScriptLoader.AddScript( 
'_source/classes/fckcontextmenugroup.js' ) ;
                FCKScriptLoader.AddScript( 
'_source/internals/fckcontextmenu.js' ) ;
                FCKScriptLoader.AddScript( '_source/internals/fckcontextmenu_' 
+ sBrowserSuffix + '.js' ) ;
                FCKScriptLoader.AddScript( '_source/classes/fckplugin.js' ) ;
                FCKScriptLoader.AddScript( '_source/internals/fckplugins.js' ) ;
                FCKScriptLoader.AddScript( '_source/internals/fck_last.js' ) ;
                // @Packager.Compactor.Remove.End

                /* @Packager.Compactor.RemoveLine

                if ( FCKBrowserInfo.IsIE )
                        FCKScriptLoader.AddScript( 'js/fckeditorcode_ie_2.js' ) 
;
                else
                        FCKScriptLoader.AddScript( 
'js/fckeditorcode_gecko_2.js' ) ;

                @Packager.Compactor.RemoveLine */
        }

        this.Events.FireEvent( 'OnStatusChange', newStatus ) ;
        if ( this.OnStatusChange ) this.OnStatusChange( newStatus ) ;

}

FCK.GetHTML = function( format )
{
        var sHTML ;

        if ( FCK.EditMode == FCK_EDITMODE_WYSIWYG )
        {
                // TODO: Wait stable version and remove the following commented 
lines.
//              if ( FCKBrowserInfo.IsIE )
//                      FCK.CheckRelativeLinks() ;

                if ( FCKBrowserInfo.IsIE )
                        sHTML = this.EditorDocument.body.innerHTML.replace( 
FCKRegexLib.ToReplace, '$1' ) ;
                else
                        sHTML = this.EditorDocument.body.innerHTML ;
        }
        else
                sHTML = document.getElementById('eSourceField').value ;

        if ( format )
                return FCKCodeFormatter.Format( sHTML ) ;
        else
                return sHTML ;
}

FCK.GetXHTML = function( format )
{
        var bSource = ( FCK.EditMode == FCK_EDITMODE_SOURCE ) ;

        if ( bSource )
                this.SwitchEditMode() ;

        // TODO: Wait stable version and remove the following commented lines.
//      if ( FCKBrowserInfo.IsIE )
//              FCK.CheckRelativeLinks() ;

        if ( FCKConfig.FullPage )
                var sXHTML = FCKXHtml.GetXHTML( 
this.EditorDocument.getElementsByTagName( 'html' )[0], true, format ) ;
        else
                var sXHTML = FCKXHtml.GetXHTML( this.EditorDocument.body, 
false, format ) ;

        if ( bSource )
                this.SwitchEditMode() ;

        if ( FCKBrowserInfo.IsIE )
                sXHTML = sXHTML.replace( FCKRegexLib.ToReplace, '$1' ) ;

        if ( FCK.DocTypeDeclaration && FCK.DocTypeDeclaration.length > 0 )
                sXHTML = FCK.DocTypeDeclaration + '\n' + sXHTML ;

        if ( FCK.XmlDeclaration && FCK.XmlDeclaration.length > 0 )
                sXHTML = FCK.XmlDeclaration + '\n' + sXHTML ;

        return sXHTML ;
}

FCK.UpdateLinkedField = function()
{
        if ( FCKConfig.EnableXHTML )
                FCKTools.SetLinkedFieldValue( FCK.GetXHTML( 
FCKConfig.FormatOutput ) ) ;
        else
                FCKTools.SetLinkedFieldValue( FCK.GetHTML( 
FCKConfig.FormatOutput ) ) ;
}

FCK.ShowContextMenu = function( x, y )
{
        if ( this.Status != FCK_STATUS_COMPLETE )
                return ;

        FCKContextMenu.Show( x, y ) ;
        this.Events.FireEvent( "OnContextMenu" ) ;
}

FCK.RegisteredDoubleClickHandlers = new Object() ;

FCK.OnDoubleClick = function( element )
{
        var oHandler = FCK.RegisteredDoubleClickHandlers[ element.tagName ] ;
        if ( oHandler )
        {
                oHandler( element ) ;
        }
}

// Register objects that can handle double click operations.
FCK.RegisterDoubleClickHandler = function( handlerFunction, tag )
{
        FCK.RegisteredDoubleClickHandlers[ tag.toUpperCase() ] = 
handlerFunction ;
}


====================================================
Index: fck.js
/*
 * FCKeditor - The text editor for internet
 * Copyright (C) 2003-2004 Frederico Caldeira Knabben
 *
 * Licensed under the terms of the GNU Lesser General Public License:
 *              http://www.opensource.org/licenses/lgpl-license.php
 *
 * For further information visit:
 *              http://www.fckeditor.net/
 *
 * File Name: fck.js
 *      Creation and initialization of the "FCK" object. This is the main object
 *      that represents an editor instance.
 *
 * Version:  2.0 RC3
 * Modified: 2005-02-23 20:51:12
 *
 * File Authors:
 *              Frederico Caldeira Knabben (address@hidden)
 */

// FCK represents the active editor instance
var FCK = new Object() ;
FCK.Name                        = FCKURLParams[ 'InstanceName' ] ;

FCK.Status                      = FCK_STATUS_NOTLOADED ;
FCK.EditMode            = FCK_EDITMODE_WYSIWYG ;

FCK.PasteEnabled        = false ;

// First try to get the Linked field using its ID.
FCK.LinkedField = window.parent.document.getElementById( FCK.Name ) ;
// If no linked field is available with that ID, try with the "Name".
if ( !FCK.LinkedField )
        FCK.LinkedField = window.parent.document.getElementsByName( FCK.Name 
)[0] ;

====================================================
Index: fck_last.js
/*
 * FCKeditor - The text editor for internet
 * Copyright (C) 2003-2004 Frederico Caldeira Knabben
 *
 * Licensed under the terms of the GNU Lesser General Public License:
 *              http://www.opensource.org/licenses/lgpl-license.php
 *
 * For further information visit:
 *              http://www.fckeditor.net/
 *
 * File Name: fck_last.js
 *      These are the last script lines executed in the editor loading process.
 *
 * Version:  2.0 RC3
 * Modified: 2005-01-19 17:36:02
 *
 * File Authors:
 *              Frederico Caldeira Knabben (address@hidden)
 */

// This is the last file loaded to complete the editor initialization and 
activation

// Just check if the document direction has been correctly applied (at 
fck_onload.js).
if ( FCKLang && window.document.dir.toLowerCase() != FCKLang.Dir.toLowerCase() )
        window.document.dir = FCKLang.Dir ;

// Activate pasting operations.
if ( FCKConfig.ForcePasteAsPlainText )
        FCK.Events.AttachEvent( "OnPaste", FCK.Paste ) ;

// Load Plugins.
if ( FCKPlugins.ItemsCount > 0 )
{
        FCKScriptLoader.OnEmpty = CompleteLoading ;
        FCKPlugins.Load() ;
}
else
        CompleteLoading() ;

function CompleteLoading()
{
        // Load the Toolbar
        FCKToolbarSet.Name = FCKURLParams['Toolbar'] || 'Default' ;
        FCKToolbarSet.Load( FCKToolbarSet.Name ) ;
        FCKToolbarSet.Restart() ;

        FCK.AttachToOnSelectionChange( FCKToolbarSet.RefreshItemsState ) ;
        //FCK.AttachToOnSelectionChange( FCKSelection._Reset ) ;

        FCK.SetStatus( FCK_STATUS_COMPLETE ) ;

        // Call the special "FCKeditor_OnComplete" function that should be 
present in
        // the HTML page where the editor is located.
        if ( typeof( window.parent.FCKeditor_OnComplete ) == 'function' )
                window.parent.FCKeditor_OnComplete( FCK ) ;
}

====================================================
Index: fck_onload.js
/*
 * FCKeditor - The text editor for internet
 * Copyright (C) 2003-2004 Frederico Caldeira Knabben
 *
 * Licensed under the terms of the GNU Lesser General Public License:
 *              http://www.opensource.org/licenses/lgpl-license.php
 *
 * For further information visit:
 *              http://www.fckeditor.net/
 *
 * File Name: fck_onload.js
 *      This is the script that is called when the editor page is loaded inside
 *      its IFRAME. It's the editor startup.
 *
 * Version:  2.0 RC3
 * Modified: 2005-02-19 13:00:42
 *
 * File Authors:
 *              Frederico Caldeira Knabben (address@hidden)
 */

// Disable the context menu in the editor (areas outside the editor area).
window.document.oncontextmenu = function( e )
{
        if ( e )
                e.preventDefault() ;    // This is the Gecko way to do that.
        return false ;                          // This is the IE way to do 
that.
}

// Gecko browsers doens't calculate well that IFRAME size so we must
// recalculate it every time the window size changes.
if ( ! FCKBrowserInfo.IsIE )
{
        window.onresize = function()
        {
                var oFrame = document.getElementById('eEditorArea') ;
                oFrame.height = 0 ;

                var oCell = document.getElementById( FCK.EditMode == 
FCK_EDITMODE_WYSIWYG ? 'eWysiwygCell' : 'eSource' ) ;
                var iHeight = oCell.offsetHeight ;

                oFrame.height = iHeight - 2 ;
        }
}

// Start the editor as soon as the window is loaded.
window.onload = function()
{
        // There is a bug on Netscape when rendering the frame. It goes over the
        // right border. So we must correct it.
        if ( FCKBrowserInfo.IsNetscape )
                document.getElementById('eWysiwygCell').style.paddingRight = 
'2px' ;

        FCKScriptLoader.OnEmpty = function()
        {
                FCKScriptLoader.OnEmpty = null ;

                // Override the configurations passed throw the hidden field.
                FCKConfig.LoadHiddenField() ;

                // Load the custom configurations file (if defined).
                if ( FCKConfig.CustomConfigurationsPath.length > 0 )
                        FCKScriptLoader.AddScript( 
FCKConfig.CustomConfigurationsPath ) ;

                // Load the styles for the configured skin.
                LoadStyles() ;
        }

        // First of all load the configuration file.
        FCKScriptLoader.AddScript( '../fckconfig.js' ) ;
}

function LoadStyles()
{
        FCKScriptLoader.OnEmpty = LoadScripts ;

        // Load the active skin CSS.
        FCKScriptLoader.AddScript( FCKConfig.SkinPath + 'fck_editor.css' ) ;
        FCKScriptLoader.AddScript( FCKConfig.SkinPath + 'fck_contextmenu.css' ) 
;
}

function LoadScripts()
{
        FCKScriptLoader.OnEmpty = null ;

        // @Packager.Compactor.Remove.Start
        var sSuffix = FCKBrowserInfo.IsIE ? 'ie' : 'gecko' ;

        with ( FCKScriptLoader )
        {
                AddScript( '_source/internals/fckdebug.js' ) ;
                AddScript( '_source/internals/fcktools.js' ) ;
                AddScript( '_source/internals/fcktools_' + sSuffix + '.js' ) ;
                AddScript( '_source/internals/fckregexlib.js' ) ;
                AddScript( '_source/internals/fcklanguagemanager.js' ) ;
                AddScript( '_source/classes/fckevents.js' ) ;
                AddScript( '_source/internals/fckxhtmlentities.js' ) ;
                AddScript( '_source/internals/fckxhtml.js' ) ;
                AddScript( '_source/internals/fckxhtml_' + sSuffix + '.js' ) ;
                AddScript( '_source/internals/fckcodeformatter.js' ) ;
                AddScript( '_source/internals/fck_1.js' ) ;
                AddScript( '_source/internals/fck_1_' + sSuffix + '.js' ) ;
        }
        // @Packager.Compactor.Remove.End

        /* @Packager.Compactor.RemoveLine
        if ( FCKBrowserInfo.IsIE )
                FCKScriptLoader.AddScript( 'js/fckeditorcode_ie_1.js' ) ;
        else
                FCKScriptLoader.AddScript( 'js/fckeditorcode_gecko_1.js' ) ;
        @Packager.Compactor.RemoveLine */
}

function LoadLanguageFile()
{
        FCKScriptLoader.OnEmpty = function()
        {
                // Removes the OnEmpty listener.
                FCKScriptLoader.OnEmpty = null ;

                // Correct the editor layout to the correct language direction.
                if ( FCKLang )
                        window.document.dir = FCKLang.Dir ;

                // Starts the editor.
                FCK.StartEditor() ;
        }

        FCKScriptLoader.AddScript( 'lang/' + 
FCKLanguageManager.ActiveLanguage.Code + '.js' ) ;
}

====================================================
Index: fckcontextmenu_gecko.js
/*
 * FCKeditor - The text editor for internet
 * Copyright (C) 2003-2004 Frederico Caldeira Knabben
 *
 * Licensed under the terms of the GNU Lesser General Public License:
 *              http://www.opensource.org/licenses/lgpl-license.php
 *
 * For further information visit:
 *              http://www.fckeditor.net/
 *
 * File Name: fckcontextmenu_gecko.js
 *      Context Menu operations. (Gecko specific implementations)
 *
 * Version:  2.0 RC3
 * Modified: 2004-08-27 16:58:07
 *
 * File Authors:
 *              Frederico Caldeira Knabben (address@hidden)
 */

// The Context Menu CSS must be added to the parent document.
FCKTools.AppendStyleSheet( window.parent.document, FCKConfig.SkinPath + 
'fck_contextmenu.css' ) ;

FCKContextMenu.Show = function( x, y )
{
        if ( ! this._Document )
        {
                this._Document = window.parent.document ;
        }

        // Create the context menu if needed.
        if ( !this._IsLoaded )
        {
                this.Reload() ;
                this._Div.style.zIndex = 10000 ;
                this._Div.oncontextmenu = function() { return false ; }
        }

        this.RefreshState() ;

        // Get the editor area and editor frames positions.
        var oCoordsA = FCKTools.GetElementPosition( 
FCK.EditorWindow.frameElement ) ;
        var oCoordsB = FCKTools.GetElementPosition( window.frameElement ) ;

        x += oCoordsA.X + oCoordsB.X ;
        y += oCoordsA.Y + oCoordsB.Y ;

        // Verifies if the context menu is completely visible.
        var iXSpace = x + this._Div.offsetWidth - 
this._Div.ownerDocument.defaultView.innerWidth ;
        var iYSpace = y + this._Div.offsetHeight - 
this._Div.ownerDocument.defaultView.innerHeight ;

        if ( iXSpace > 0 ) x -= this._Div.offsetWidth ;
        if ( iYSpace > 0 ) y -= this._Div.offsetHeight ;

        // Set the context menu DIV in the specified location.
        this._Div.style.left    = x + 'px' ;
        this._Div.style.top             = y + 'px' ;

        // Watch the "OnClick" event for all windows to close the Context Menu.
        var oActualWindow = FCK.EditorWindow ;
        while ( oActualWindow )
        {
                oActualWindow.document.addEventListener( 'click', 
FCKContextMenu._OnDocumentClick, false ) ;
                if ( oActualWindow != oActualWindow.parent )
                        oActualWindow = oActualWindow.parent ;
                else if ( oActualWindow.opener == null )
                        oActualWindow = oActualWindow.opener ;
                else
                        break ;
        }

        // Show it.
        this._Div.style.visibility      = '' ;
}

FCKContextMenu._OnDocumentClick = function( event )
{
        var e = event.target ;
        while ( e )
        {
                if ( e == FCKContextMenu._Div ) return ;
                e = e.parentNode ;
        }
        FCKContextMenu.Hide() ;
}

FCKContextMenu.Hide = function()
{
        this._Div.style.visibility = 'hidden' ;
        this._Div.style.left = this._Div.style.top = '1px' ;
}

====================================================
Index: fckcontextmenu_ie.js
/*
 * FCKeditor - The text editor for internet
 * Copyright (C) 2003-2004 Frederico Caldeira Knabben
 *
 * Licensed under the terms of the GNU Lesser General Public License:
 *              http://www.opensource.org/licenses/lgpl-license.php
 *
 * For further information visit:
 *              http://www.fckeditor.net/
 *
 * File Name: fckcontextmenu_ie.js
 *      Context Menu operations. (IE specific implementations)
 *
 * Version:  2.0 RC3
 * Modified: 2004-08-20 22:58:12
 *
 * File Authors:
 *              Frederico Caldeira Knabben (address@hidden)
 */

FCKContextMenu.Show = function( x, y )
{
        // Create the Popup used to show the menu (this is a IE 5.5+ feature).
        if ( ! this._Popup )
        {
                this._Popup = window.createPopup() ;
                this._Document = this._Popup.document ;
                this._Document.createStyleSheet( FCKConfig.SkinPath + 
'fck_contextmenu.css' ) ;
                this._Document.oncontextmenu = function() { return false ; }
        }

        // Create the context menu if needed.
        if ( !this._IsLoaded )
        {
                this.Reload() ;
                this._Div.style.visibility = '' ;
        }

        this.RefreshState() ;

        // IE doens't get the offsetWidth and offsetHeight values if the 
element is not visible.
        // So the Popup must be "shown" with no size to be able to get these 
values.
        this._Popup.show( x, y, 0, 0 ) ;

        // This was the previous solution. It works well to.
        // So a temporary element is created to get this for us.
        /*
        if ( !this._DivCopy )
        {
                this._DivCopy = document.createElement( 'DIV' ) ;
                this._DivCopy.className                 = 'CM_ContextMenu' ;
                this._DivCopy.style.position    = 'absolute' ;
                this._DivCopy.style.visibility  = 'hidden' ;
                document.body.appendChild( this._DivCopy );
        }

        this._DivCopy.innerHTML = this._Div.innerHTML ;
        */

        // Show the Popup at the specified location.
        this._Popup.show( x, y, this._Div.offsetWidth, this._Div.offsetHeight ) 
;
}

FCKContextMenu.Hide = function()
{
        if ( this._Popup )
                this._Popup.hide() ;
}

====================================================
Index: fckcoreextensions.js
/*
 * FCKeditor - The text editor for internet
 * Copyright (C) 2003-2004 Frederico Caldeira Knabben
 *
 * Licensed under the terms of the GNU Lesser General Public License:
 *              http://www.opensource.org/licenses/lgpl-license.php
 *
 * For further information visit:
 *              http://www.fckeditor.net/
 *
 * File Name: fckcoreextensions.js
 *      Some extensions to the Javascript Core.
 *
 * Version:  2.0 RC3
 * Modified: 2005-02-20 00:54:00
 *
 * File Authors:
 *              Frederico Caldeira Knabben (address@hidden)
 */

// Extends the Array object, creating a "addItem" method on it.
Array.prototype.addItem = function( item )
{
        var i = this.length ;
        this[ i ] = item ;
        return i ;
}

Array.prototype.indexOf = function( value )
{
        for ( var i = 0 ; i < this.length ; i++ )
        {
                if ( this[i] == value )
                        return i ;
        }
        return -1 ;
}

String.prototype.startsWith = function( value )
{
        return ( this.substr( 0, value.length ) == value ) ;
}

// Extends the String object, creating a "endsWith" method on it.
String.prototype.endsWith = function( value )
{
        var L1 = this.length ;
        var L2 = value.length ;

        if ( L2 > L1 )
                return false ;

        return ( L2 == 0 || this.substr( L1 - L2, L2 ) == value ) ;
}

String.prototype.remove = function( start, length )
{
        var s = '' ;

        if ( start > 0 )
                s = this.substring( 0, start ) ;

        if ( start + length < this.length )
                s += this.substring( start + length , this.length ) ;

        return s ;
}

String.prototype.trim = function()
{
        return this.replace( /(^\s*)|(\s*$)/g, '' ) ;
}

String.prototype.ltrim = function()
{
        return this.replace( /^\s*/g, '' ) ;
}

String.prototype.rtrim = function()
{
        return this.replace( /\s*$/g, '' ) ;
}

String.prototype.replaceNewLineChars = function( replacement )
{
        return this.replace( /\n/g, replacement ) ;
}

====================================================
Index: fckdebug.js
/*
 * FCKeditor - The text editor for internet
 * Copyright (C) 2003-2004 Frederico Caldeira Knabben
 *
 * Licensed under the terms of the GNU Lesser General Public License:
 *              http://www.opensource.org/licenses/lgpl-license.php
 *
 * For further information visit:
 *              http://www.fckeditor.net/
 *
 * File Name: fckdebug.js
 *      Debug window control and operations.
 *
 * Version:  2.0 RC3
 * Modified: 2004-11-08 18:34:12
 *
 * File Authors:
 *              Frederico Caldeira Knabben (address@hidden)
 */

var FCKDebug = new Object() ;

if ( FCKConfig.Debug )
{
        FCKDebug.Output = function( message, color )
        {
                if ( ! FCKConfig.Debug ) return ;

                if ( message != null && isNaN( message ) )
                        message = message.replace(/</g, "&lt;") ;

                if ( !this.DebugWindow || this.DebugWindow.closed )
                        this.DebugWindow = window.open( 'fckdebug.html', 
'FCKeditorDebug', 
'menubar=no,scrollbars=no,resizable=yes,location=no,toolbar=no,width=600,height=500',
 true ) ;

                if ( this.DebugWindow.Output)
                        this.DebugWindow.Output( message, color ) ;
        }
}
else
        FCKDebug.Output = function() {}


====================================================
Index: fckcontextmenu.js
/*
 * FCKeditor - The text editor for internet
 * Copyright (C) 2003-2004 Frederico Caldeira Knabben
 *
 * Licensed under the terms of the GNU Lesser General Public License:
 *              http://www.opensource.org/licenses/lgpl-license.php
 *
 * For further information visit:
 *              http://www.fckeditor.net/
 *
 * File Name: fckcontextmenu.js
 *      Defines the FCKContextMenu object that is responsible for all
 *      Context Menu operations.
 *
 * Version:  2.0 RC3
 * Modified: 2005-02-16 20:34:58
 *
 * File Authors:
 *              Frederico Caldeira Knabben (address@hidden)
 */

var FCKContextMenu = new Object() ;

// This property is internally used to indicate that the context menu has been 
created.
FCKContextMenu._IsLoaded = false ;

// This method creates the context menu inside a DIV tag. Take a look at the 
end of this file for a sample output.
FCKContextMenu.Reload = function()
{
        // Create the Main DIV that holds the Context Menu.
        this._Div = this._Document.createElement( 'DIV' ) ;
        this._Div.className                     = 'CM_ContextMenu' ;
        this._Div.style.position        = 'absolute' ;
        this._Div.style.visibility      = 'hidden' ;
        this._Document.body.appendChild( this._Div );

        // Create the main table for the menu items.
        var oTable = this._Document.createElement( 'TABLE' ) ;
        oTable.cellSpacing = 0 ;
        oTable.cellPadding = 0 ;
        oTable.border = 0 ;
        this._Div.appendChild( oTable ) ;

        // Load all configured groups.
        this.Groups = new Object() ;

        for ( var i = 0 ; i < FCKConfig.ContextMenu.length ; i++ )
        {
                var sGroup = FCKConfig.ContextMenu[i] ;
                this.Groups[ sGroup ] = this._GetGroup( sGroup ) ;
                this.Groups[ sGroup ].CreateTableRows( oTable ) ;
        }

        this._IsLoaded = true ;
}

FCKContextMenu._GetGroup = function( groupName )
{
        var oGroup ;

        switch ( groupName )
        {
                case 'Generic' :
                        // Generic items that are always available.
                        oGroup = new FCKContextMenuGroup() ;
                        with ( oGroup )
                        {
                                Add( new FCKContextMenuItem( this, 'Cut'        
, FCKLang.Cut   , true ) ) ;
                                Add( new FCKContextMenuItem( this, 'Copy'       
, FCKLang.Copy  , true ) ) ;
                                Add( new FCKContextMenuItem( this, 'Paste'      
, FCKLang.Paste , true ) ) ;
                        }

                        break ;

                case 'Link' :
                        oGroup = new FCKContextMenuGroup() ;
                        with ( oGroup )
                        {
                                Add( new FCKContextMenuSeparator() ) ;
                                Add( new FCKContextMenuItem( this, 'Link'       
, FCKLang.EditLink      , true ) ) ;
                                Add( new FCKContextMenuItem( this, 'Unlink'     
, FCKLang.RemoveLink, true ) ) ;
                        }

                        break ;

                case 'TableCell' :
                        oGroup = new FCKContextMenuGroup() ;
                        with ( oGroup )
                        {
                                Add( new FCKContextMenuSeparator() ) ;
                                Add( new FCKContextMenuItem( this, 
'TableInsertRow'             , FCKLang.InsertRow, true ) ) ;
                                Add( new FCKContextMenuItem( this, 
'TableDeleteRows'    , FCKLang.DeleteRows, true ) ) ;
                                Add( new FCKContextMenuSeparator() ) ;
                                Add( new FCKContextMenuItem( this, 
'TableInsertColumn'  , FCKLang.InsertColumn, true ) ) ;
                                Add( new FCKContextMenuItem( this, 
'TableDeleteColumns' , FCKLang.DeleteColumns, true ) ) ;
                                Add( new FCKContextMenuSeparator() ) ;
                                Add( new FCKContextMenuItem( this, 
'TableInsertCell'    , FCKLang.InsertCell, true ) ) ;
                                Add( new FCKContextMenuItem( this, 
'TableDeleteCells'   , FCKLang.DeleteCells, true ) ) ;
                                Add( new FCKContextMenuItem( this, 
'TableMergeCells'    , FCKLang.MergeCells, true ) ) ;
                                Add( new FCKContextMenuItem( this, 
'TableSplitCell'             , FCKLang.SplitCell, true ) ) ;
                                Add( new FCKContextMenuSeparator() ) ;
                                Add( new FCKContextMenuItem( this, 
'TableCellProp'              , FCKLang.CellProperties, true ) ) ;
                                Add( new FCKContextMenuItem( this, 'TableProp'  
                , FCKLang.TableProperties, true ) ) ;
                        }

                        break ;

                case 'Table' :
                        return new FCKContextMenuGroup( true, this, 'Table', 
FCKLang.TableProperties, true ) ;

                case 'Image' :
                        return new FCKContextMenuGroup( true, this, 'Image', 
FCKLang.ImageProperties, true ) ;

                case 'Form' :
                        return new FCKContextMenuGroup( true, this, 'Form', 
FCKLang.FormProp, true ) ;

                case 'Checkbox' :
                        return new FCKContextMenuGroup( true, this, 'Checkbox', 
FCKLang.CheckboxProp, true ) ;

                case 'Radio' :
                        return new FCKContextMenuGroup( true, this, 'Radio', 
FCKLang.RadioButtonProp, true ) ;

                case 'TextField' :
                        return new FCKContextMenuGroup( true, this, 
'TextField', FCKLang.TextFieldProp, true ) ;

                case 'HiddenField' :
                        return new FCKContextMenuGroup( true, this, 
'HiddenField', FCKLang.HiddenFieldProp, true ) ;

                case 'ImageButton' :
                        return new FCKContextMenuGroup( true, this, 
'ImageButton', FCKLang.ImageButtonProp, true ) ;

                case 'Button' :
                        return new FCKContextMenuGroup( true, this, 'Button', 
FCKLang.ButtonProp, true ) ;

                case 'Select' :
                        return new FCKContextMenuGroup( true, this, 'Select', 
FCKLang.SelectionFieldProp, true ) ;

                case 'Textarea' :
                        return new FCKContextMenuGroup( true, this, 'Textarea', 
FCKLang.TextareaProp, true ) ;

                case 'BulletedList' :
                        return new FCKContextMenuGroup( true, this, 
'BulletedList', FCKLang.BulletedListProp, true ) ;

                case 'NumberedList' :
                        return new FCKContextMenuGroup( true, this, 
'NumberedList', FCKLang.NumberedListProp, true ) ;

                case 'Anchor' :
                        return new FCKContextMenuGroup( true, this, 'Anchor', 
FCKLang.AnchorProp, true ) ;
        }

        return oGroup ;
}

FCKContextMenu.RefreshState = function()
{
        // Get the actual selected tag (if any).
        var oTag = FCKSelection.GetSelectedElement() ;
        var sTagName ;

        if ( oTag )
        {
                sTagName = oTag.tagName ;
        }

        // Set items visibility.

        var bIsAnchor = ( sTagName == 'A' && oTag.name.length > 0 && 
oTag.href.length == 0 ) ;

        if ( this.Groups['Anchor'] )            
this.Groups['Anchor'].SetVisible( bIsAnchor ) ;
        if ( this.Groups['Link'] )                      
this.Groups['Link'].SetVisible( !bIsAnchor && FCK.GetNamedCommandState( 
'Unlink' ) != FCK_TRISTATE_DISABLED ) ;

        if ( this.Groups['TableCell'] )         
this.Groups['TableCell'].SetVisible( sTagName != 'TABLE' && 
FCKSelection.HasAncestorNode('TABLE') ) ;
        if ( this.Groups['Table'] )                     
this.Groups['Table'].SetVisible( sTagName == 'TABLE' ) ;
        if ( this.Groups['Image'] )                     
this.Groups['Image'].SetVisible( sTagName == 'IMG' ) ;

        if ( this.Groups['BulletedList'] )      
this.Groups['BulletedList'].SetVisible( FCKSelection.HasAncestorNode('UL') ) ;
        if ( this.Groups['NumberedList'] )      
this.Groups['NumberedList'].SetVisible( FCKSelection.HasAncestorNode('OL') ) ;

        if ( this.Groups['Select'] )            
this.Groups['Select'].SetVisible( sTagName == 'SELECT' ) ;
        if ( this.Groups['Textarea'] )          
this.Groups['Textarea'].SetVisible( sTagName == 'TEXTAREA' ) ;
        if ( this.Groups['Form'] )                      
this.Groups['Form'].SetVisible( FCKSelection.HasAncestorNode('FORM') ) ;
        if ( this.Groups['Checkbox'] )          
this.Groups['Checkbox'].SetVisible(             sTagName == 'INPUT' && 
oTag.type == 'checkbox' ) ;
        if ( this.Groups['Radio'] )                     
this.Groups['Radio'].SetVisible(                sTagName == 'INPUT' && 
oTag.type == 'radio' ) ;
        if ( this.Groups['TextField'] )         
this.Groups['TextField'].SetVisible(    sTagName == 'INPUT' && ( oTag.type == 
'text' || oTag.type == 'password' ) ) ;
        if ( this.Groups['HiddenField'] )       
this.Groups['HiddenField'].SetVisible(  sTagName == 'INPUT' && oTag.type == 
'hidden' ) ;
        if ( this.Groups['ImageButton'] )       
this.Groups['ImageButton'].SetVisible(  sTagName == 'INPUT' && oTag.type == 
'image' ) ;
        if ( this.Groups['Button'] )            
this.Groups['Button'].SetVisible(               sTagName == 'INPUT' && ( 
oTag.type == 'button' || oTag.type == 'submit' || oTag.type == 'reset' ) ) ;

        // Refresh the state of all visible items (active/disactive)
        for ( var o in this.Groups )
        {
                this.Groups[o].RefreshState() ;
        }
}

/*
Sample Context Menu Output
-----------------------------------------
<div class="CM_ContextMenu">
        <table cellSpacing="0" cellPadding="0" border="0">
                <tr class="CM_Disabled">
                        <td class="CM_Icon"><img alt="" src="icons/cut.gif" 
width="21" height="20" unselectable="on"></td>
                        <td class="CM_Label" unselectable="on">Cut</td>
                </tr>
                <tr class="CM_Disabled">
                        <td class="CM_Icon"><img height="20" alt="" 
src="icons/copy.gif" width="21"></td>
                        <td class="CM_Label">Copy</td>
                </tr>
                <tr class="CM_Option" onmouseover="OnOver(this);" 
onmouseout="OnOut(this);">
                        <td class="CM_Icon"><img height="20" alt="" 
src="icons/paste.gif" width="21"></td>
                        <td class="CM_Label">Paste</td>
                </tr>
                <tr class="CM_Separator">
                        <td class="CM_Icon"></td>
                        <td class="CM_Label"><div></div></td>
                </tr>
                <tr class="CM_Option" onmouseover="OnOver(this);" 
onmouseout="OnOut(this);">
                        <td class="CM_Icon"><img height="20" alt="" 
src="icons/print.gif" width="21"></td>
                        <td class="CM_Label">Print</td>
                </tr>
                <tr class="CM_Separator">
                        <td class="CM_Icon"></td>
                        <td class="CM_Label"><div></div></td>
                </tr>
                <tr class="CM_Option" onmouseover="OnOver(this);" 
onmouseout="OnOut(this);">
                        <td class="CM_Icon"></td>
                        <td class="CM_Label">Do Something</td>
                </tr>
                <tr class="CM_Option" onmouseover="OnOver(this);" 
onmouseout="OnOut(this);">
                        <td class="CM_Icon"></td>
                        <td class="CM_Label">Just Testing</td>
                </tr>
        </table>
</div>
*/

====================================================
Index: fckconfig.js
/*
 * FCKeditor - The text editor for internet
 * Copyright (C) 2003-2004 Frederico Caldeira Knabben
 *
 * Licensed under the terms of the GNU Lesser General Public License:
 *              http://www.opensource.org/licenses/lgpl-license.php
 *
 * For further information visit:
 *              http://www.fckeditor.net/
 *
 * File Name: fckconfig.js
 *      Creates and initializes the FCKConfig object.
 *
 * Version:  2.0 RC3
 * Modified: 2005-02-02 14:02:33
 *
 * File Authors:
 *              Frederico Caldeira Knabben (address@hidden)
 */

var FCKConfig = FCK.Config = new Object() ;

// Editor Base Path
if ( document.location.protocol == 'file:' )
{
        FCKConfig.BasePath = document.location.pathname.substr(1) ;
        FCKConfig.BasePath = FCKConfig.BasePath.replace( /\\/gi, '/' ) ;
        FCKConfig.BasePath = 'file://' + 
FCKConfig.BasePath.substring(0,FCKConfig.BasePath.lastIndexOf('/')+1) ;
}
else
{
        FCKConfig.BasePath = 
document.location.pathname.substring(0,document.location.pathname.lastIndexOf('/')+1)
 ;
        FCKConfig.FullBasePath = document.location.protocol + '//' + 
document.location.host + FCKConfig.BasePath ;
}

// Override the actual configuration values with the values passed throw the
// hidden field "<InstanceName>___Config".
FCKConfig.LoadHiddenField = function()
{
        // Get the hidden field.
        var oConfigField = window.parent.document.getElementById( FCK.Name + 
'___Config' ) ;

        // Do nothing if the config field was not defined.
        if ( ! oConfigField ) return ;

        var aCouples = oConfigField.value.split('&') ;

        for ( var i = 0 ; i < aCouples.length ; i++ )
        {
                if ( aCouples[i].length == 0 )
                        continue ;

                var aConfig = aCouples[i].split('=') ;
                var sConfigName  = unescape( aConfig[0] ) ;
                var sConfigValue = unescape( aConfig[1] ) ;

                if ( sConfigValue.toLowerCase() == "true" )                     
// If it is a boolean TRUE.
                        FCKConfig[sConfigName] = true ;
                else if ( sConfigValue.toLowerCase() == "false" )       // If 
it is a boolean FALSE.
                        FCKConfig[sConfigName] = false ;
                else if ( ! isNaN(sConfigValue) )               // If it is a 
number.
                        FCKConfig[sConfigName] = parseInt( sConfigValue ) ;
                else                                                            
        // In any other case it is a string.
                        FCKConfig[sConfigName] = sConfigValue ;
        }
}

// Define toolbar sets collection.
FCKConfig.ToolbarSets = new Object() ;

// Defines the plugins collection.
FCKConfig.Plugins = new Object() ;
FCKConfig.Plugins.Items = new Array() ;

FCKConfig.Plugins.Add = function( name, langs, path )
{
        FCKConfig.Plugins.Items.addItem( [name, langs, path] ) ;
}

====================================================
Index: fckbrowserinfo.js
/*
 * FCKeditor - The text editor for internet
 * Copyright (C) 2003-2004 Frederico Caldeira Knabben
 *
 * Licensed under the terms of the GNU Lesser General Public License:
 *              http://www.opensource.org/licenses/lgpl-license.php
 *
 * For further information visit:
 *              http://www.fckeditor.net/
 *
 * File Name: fckbrowserinfo.js
 *      Defines the FCKBrowserInfo object that hold some browser informations.
 *
 * Version:  2.0 RC3
 * Modified: 2005-02-23 00:43:57
 *
 * File Authors:
 *              Frederico Caldeira Knabben (address@hidden)
 */

var FCKBrowserInfo = new Object() ;

var sAgent = navigator.userAgent.toLowerCase() ;

FCKBrowserInfo.IsIE                     = sAgent.indexOf("msie") != -1 ;
FCKBrowserInfo.IsGecko          = !FCKBrowserInfo.IsIE ;
FCKBrowserInfo.IsNetscape       = sAgent.indexOf("netscape") != -1 ;

if ( FCKBrowserInfo.IsIE )
{
        FCKBrowserInfo.MajorVer = navigator.appVersion.match(/MSIE (.)/)[1] ;
        FCKBrowserInfo.MinorVer = navigator.appVersion.match(/MSIE .\.(.)/)[1] ;
}
else
{
        // TODO: Other browsers
        FCKBrowserInfo.MajorVer = 0 ;
        FCKBrowserInfo.MinorVer = 0 ;
}

FCKBrowserInfo.IsIE55OrMore = FCKBrowserInfo.IsIE && ( FCKBrowserInfo.MajorVer 
> 5 || FCKBrowserInfo.MinorVer >= 5 ) ;

====================================================
Index: fckcodeformatter.js
/*
 * FCKeditor - The text editor for internet
 * Copyright (C) 2003-2004 Frederico Caldeira Knabben
 *
 * Licensed under the terms of the GNU Lesser General Public License:
 *              http://www.opensource.org/licenses/lgpl-license.php
 *
 * For further information visit:
 *              http://www.fckeditor.net/
 *
 * File Name: fckcodeformatter.js
 *      Format the HTML.
 *
 * Version:  2.0 RC3
 * Modified: 2005-02-07 19:48:21
 *
 * File Authors:
 *              Frederico Caldeira Knabben (address@hidden)
 */

var FCKCodeFormatter = new Object() ;

FCKCodeFormatter.Regex = new Object() ;

// Regex for line breaks.
FCKCodeFormatter.Regex.BlocksOpener = 
/\<(P|DIV|H1|H2|H3|H4|H5|H6|ADDRESS|PRE|OL|UL|LI|TITLE|META|LINK|BASE|SCRIPT|LINK|TD|AREA|OPTION)[^\>]*\>/gi
 ;
FCKCodeFormatter.Regex.BlocksCloser = 
/\<\/(P|DIV|H1|H2|H3|H4|H5|H6|ADDRESS|PRE|OL|UL|LI|TITLE|META|LINK|BASE|SCRIPT|LINK|TD|AREA|OPTION)[^\>]*\>/gi
 ;

FCKCodeFormatter.Regex.NewLineTags      = /\<(BR|HR)[^\>]\>/gi ;

FCKCodeFormatter.Regex.MainTags = 
/\<\/?(HTML|HEAD|BODY|FORM|TABLE|TBODY|THEAD|TR)[^\>]*\>/gi ;

FCKCodeFormatter.Regex.LineSplitter = /\s*\n+\s*/g ;

// Regex for indentation.
FCKCodeFormatter.Regex.IncreaseIndent = 
/^\<(HTML|HEAD|BODY|FORM|TABLE|TBODY|THEAD|TR|UL|OL)[ \/\>]/i ;
FCKCodeFormatter.Regex.DecreaseIndent = 
/^\<\/(HTML|HEAD|BODY|FORM|TABLE|TBODY|THEAD|TR|UL|OL)[ \>]/i ;
FCKCodeFormatter.Regex.FormatIndentatorRemove = new RegExp( 
FCKConfig.FormatIndentator ) ;

FCKCodeFormatter.Format = function( html )
{
        // Line breaks.
        var sFormatted  = html.replace( this.Regex.BlocksOpener, '\n$&' ) ; ;
        sFormatted              = sFormatted.replace( this.Regex.BlocksCloser, 
'$&\n' ) ;
        sFormatted              = sFormatted.replace( this.Regex.NewLineTags, 
'$&\n' ) ;
        sFormatted              = sFormatted.replace( this.Regex.MainTags, 
'\n$&\n' ) ;

        // Indentation.
        var sIndentation = '' ;

        var asLines = sFormatted.split( this.Regex.LineSplitter ) ;
        sFormatted = '' ;

        for ( var i = 0 ; i < asLines.length ; i++ )
        {
                var sLine = asLines[i] ;

                if ( sLine.length == 0 )
                        continue ;

                if ( this.Regex.DecreaseIndent.test( sLine ) )
                        sIndentation = sIndentation.replace( 
this.Regex.FormatIndentatorRemove, '' ) ;

                sFormatted += sIndentation + sLine + '\n' ;

                if ( this.Regex.IncreaseIndent.test( sLine ) )
                        sIndentation += FCKConfig.FormatIndentator ;
        }

        return sFormatted.trim() ;
}

====================================================
Index: fckcommands.js
/*
 * FCKeditor - The text editor for internet
 * Copyright (C) 2003-2004 Frederico Caldeira Knabben
 *
 * Licensed under the terms of the GNU Lesser General Public License:
 *              http://www.opensource.org/licenses/lgpl-license.php
 *
 * For further information visit:
 *              http://www.fckeditor.net/
 *
 * File Name: fckcommands.js
 *      Define all commands available in the editor.
 *
 * Version:  2.0 RC3
 * Modified: 2005-03-02 08:22:35
 *
 * File Authors:
 *              Frederico Caldeira Knabben (address@hidden)
 */

var FCKCommands = FCK.Commands = new Object() ;
FCKCommands.LoadedCommands = new Object() ;

FCKCommands.RegisterCommand = function( commandName, command )
{
        this.LoadedCommands[ commandName ] = command ;
}

FCKCommands.GetCommand = function( commandName )
{
        var oCommand = FCKCommands.LoadedCommands[ commandName ] ;

        if ( oCommand )
                return oCommand ;

        switch ( commandName )
        {
                case 'DocProps'         : oCommand = new FCKDialogCommand( 
'DocProps'   , FCKLang.DocProps                              , 
'dialog/fck_docprops.html'    , 400, 390, FCKCommands.GetFullPageState ) ; 
break ;
                case 'Link'                     : oCommand = new 
FCKDialogCommand( 'Link'               , FCKLang.DlgLnkWindowTitle             
, 'dialog/fck_link.html'                , 400, 330, FCK.GetNamedCommandState, 
'CreateLink' ) ; break ;
                case 'Anchor'           : oCommand = new FCKDialogCommand( 
'Anchor'             , FCKLang.DlgAnchorTitle                , 
'dialog/fck_anchor.html'              , 370, 170 ) ; break ;
                case 'BulletedList'     : oCommand = new FCKDialogCommand( 
'BulletedList', FCKLang.BulletedListProp             , 
'dialog/fck_listprop.html'    , 370, 170 ) ; break ;
                case 'NumberedList'     : oCommand = new FCKDialogCommand( 
'NumberedList', FCKLang.NumberedListProp             , 
'dialog/fck_listprop.html'    , 370, 170 ) ; break ;
                case 'About'            : oCommand = new FCKDialogCommand( 
'About'              , FCKLang.About                                 , 
'dialog/fck_about.html'               , 400, 330 ) ; break ;

                case 'Find'                     : oCommand = new 
FCKDialogCommand( 'Find'               , FCKLang.DlgFindTitle                  
, 'dialog/fck_find.html'                , 340, 170 ) ; break ;
                case 'Replace'          : oCommand = new FCKDialogCommand( 
'Replace'    , FCKLang.DlgReplaceTitle               , 
'dialog/fck_replace.html'             , 340, 200 ) ; break ;

                case 'Image'            : oCommand = new FCKDialogCommand( 
'Image'              , FCKLang.DlgImgTitle                   , 
'dialog/fck_image.html'               , 450, 400 ) ; break ;
                case 'SpecialChar'      : oCommand = new FCKDialogCommand( 
'SpecialChar', FCKLang.DlgSpecialCharTitle   , 'dialog/fck_specialchar.html' , 
400, 300 ) ; break ;
                case 'Smiley'           : oCommand = new FCKDialogCommand( 
'Smiley'             , FCKLang.DlgSmileyTitle                , 
'dialog/fck_smiley.html'              , FCKConfig.SmileyWindowWidth, 
FCKConfig.SmileyWindowHeight ) ; break ;
                case 'Table'            : oCommand = new FCKDialogCommand( 
'Table'              , FCKLang.DlgTableTitle                 , 
'dialog/fck_table.html'               , 400, 250 ) ; break ;
                case 'TableProp'        : oCommand = new FCKDialogCommand( 
'Table'              , FCKLang.DlgTableTitle                 , 
'dialog/fck_table.html?Parent', 400, 250 ) ; break ;
                case 'TableCellProp': oCommand = new FCKDialogCommand( 
'TableCell'      , FCKLang.DlgCellTitle                  , 
'dialog/fck_tablecell.html'   , 500, 250 ) ; break ;
                case 'UniversalKey'     : oCommand = new FCKDialogCommand( 
'UniversalKey', FCKLang.UniversalKeyboard    , 'dialog/fck_universalkey.html', 
415, 300 ) ; break ;

                case 'Style'            : oCommand = new FCKStyleCommand() ; 
break ;

                case 'FontName'         : oCommand = new FCKFontNameCommand() ; 
break ;
                case 'FontSize'         : oCommand = new FCKFontSizeCommand() ; 
break ;
                case 'FontFormat'       : oCommand = new 
FCKFormatBlockCommand() ; break ;

                case 'Source'           : oCommand = new FCKSourceCommand() ; 
break ;
                case 'Preview'          : oCommand = new FCKPreviewCommand() ; 
break ;
                case 'Save'                     : oCommand = new 
FCKSaveCommand() ; break ;
                case 'NewPage'          : oCommand = new FCKNewPageCommand() ; 
break ;

                case 'TextColor'        : oCommand = new 
FCKTextColorCommand('ForeColor') ; break ;
                case 'BGColor'          : oCommand = new 
FCKTextColorCommand('BackColor') ; break ;

                case 'PasteText'        : oCommand = new 
FCKPastePlainTextCommand() ; break ;
                case 'PasteWord'        : oCommand = new FCKPasteWordCommand() 
; break ;

                case 'TableInsertRow'           : oCommand = new 
FCKTableCommand('TableInsertRow') ; break ;
                case 'TableDeleteRows'          : oCommand = new 
FCKTableCommand('TableDeleteRows') ; break ;
                case 'TableInsertColumn'        : oCommand = new 
FCKTableCommand('TableInsertColumn') ; break ;
                case 'TableDeleteColumns'       : oCommand = new 
FCKTableCommand('TableDeleteColumns') ; break ;
                case 'TableInsertCell'          : oCommand = new 
FCKTableCommand('TableInsertCell') ; break ;
                case 'TableDeleteCells'         : oCommand = new 
FCKTableCommand('TableDeleteCells') ; break ;
                case 'TableMergeCells'          : oCommand = new 
FCKTableCommand('TableMergeCells') ; break ;
                case 'TableSplitCell'           : oCommand = new 
FCKTableCommand('TableSplitCell') ; break ;

                case 'Form'                     : oCommand = new 
FCKDialogCommand( 'Form'               , FCKLang.Form                  , 
'dialog/fck_form.html'                , 380, 230 ) ; break ;
                case 'Checkbox'         : oCommand = new FCKDialogCommand( 
'Checkbox'   , FCKLang.Checkbox              , 'dialog/fck_checkbox.html'    , 
380, 230 ) ; break ;
                case 'Radio'            : oCommand = new FCKDialogCommand( 
'Radio'              , FCKLang.RadioButton   , 'dialog/fck_radiobutton.html' , 
380, 230 ) ; break ;
                case 'TextField'        : oCommand = new FCKDialogCommand( 
'TextField'  , FCKLang.TextField             , 'dialog/fck_textfield.html'   , 
380, 230 ) ; break ;
                case 'Textarea'         : oCommand = new FCKDialogCommand( 
'Textarea'   , FCKLang.Textarea              , 'dialog/fck_textarea.html'    , 
380, 230 ) ; break ;
                case 'HiddenField'      : oCommand = new FCKDialogCommand( 
'HiddenField', FCKLang.HiddenField   , 'dialog/fck_hiddenfield.html' , 380, 230 
) ; break ;
                case 'Button'           : oCommand = new FCKDialogCommand( 
'Button'             , FCKLang.Button                , 'dialog/fck_button.html' 
             , 380, 230 ) ; break ;
                case 'Select'           : oCommand = new FCKDialogCommand( 
'Select'             , FCKLang.SelectionField, 'dialog/fck_select.html'         
     , 400, 380 ) ; break ;
                case 'ImageButton'      : oCommand = new FCKDialogCommand( 
'ImageButton', FCKLang.ImageButton   , 'dialog/fck_image.html?ImageButton', 
450, 400 ) ; break ;

                case 'SpellCheck'       : oCommand = new FCKSpellCheckCommand() 
; break ;

                // Generic Undefined command (usually used when a command is 
under development).
                case 'Undefined'        : oCommand = new FCKUndefinedCommand() 
; break ;

                // By default we assume that it is a named command.
                default:
                        if ( FCKRegexLib.NamedCommands.test( commandName ) )
                                oCommand = new FCKNamedCommand( commandName ) ;
                        else
                        {
                                alert( FCKLang.UnknownCommand.replace( /%1/g, 
commandName ) ) ;
                                return ;
                        }
        }

        FCKCommands.LoadedCommands[ commandName ] = oCommand ;

        return oCommand ;
}

// Gets the state of the "Document Properties" button. It must be enabled only
// when "Full Page" editing is available.
FCKCommands.GetFullPageState = function()
{
        return FCKConfig.FullPage ? FCK_TRISTATE_OFF : FCK_TRISTATE_DISABLED ;
}







reply via email to

[Prev in Thread] Current Thread [Next in Thread]