From 7a7bcda9d75c951df9c911ce60d5b0551765daf2 Mon Sep 17 00:00:00 2001 From: mark Date: Tue, 16 Mar 2010 07:49:38 +0000 Subject: FCKeditor 2.6.6 --- .../fckeditor/editor/plugins/autogrow/fckplugin.js | 119 +++-- .../fckeditor/editor/plugins/bbcode/fckplugin.js | 123 +++++ .../editor/plugins/dragresizetable/fckplugin.js | 529 +++++++++++++++++++++ .../plugins/placeholder/fck_placeholder.html | 15 +- .../editor/plugins/placeholder/fckplugin.js | 8 +- .../editor/plugins/placeholder/lang/de.js | 4 +- .../editor/plugins/placeholder/lang/en.js | 4 +- .../editor/plugins/placeholder/lang/es.js | 27 ++ .../editor/plugins/placeholder/lang/fr.js | 2 +- .../editor/plugins/placeholder/lang/it.js | 2 +- .../editor/plugins/placeholder/lang/pl.js | 4 +- .../editor/plugins/simplecommands/fckplugin.js | 2 +- .../editor/plugins/tablecommands/fckplugin.js | 21 +- 13 files changed, 782 insertions(+), 78 deletions(-) create mode 100644 httemplate/elements/fckeditor/editor/plugins/bbcode/fckplugin.js create mode 100644 httemplate/elements/fckeditor/editor/plugins/dragresizetable/fckplugin.js create mode 100644 httemplate/elements/fckeditor/editor/plugins/placeholder/lang/es.js (limited to 'httemplate/elements/fckeditor/editor/plugins') diff --git a/httemplate/elements/fckeditor/editor/plugins/autogrow/fckplugin.js b/httemplate/elements/fckeditor/editor/plugins/autogrow/fckplugin.js index 7ce1c1cc2..1df2d0ffd 100644 --- a/httemplate/elements/fckeditor/editor/plugins/autogrow/fckplugin.js +++ b/httemplate/elements/fckeditor/editor/plugins/autogrow/fckplugin.js @@ -1,6 +1,6 @@ /* * FCKeditor - The text editor for Internet - http://www.fckeditor.net - * Copyright (C) 2003-2007 Frederico Caldeira Knabben + * Copyright (C) 2003-2010 Frederico Caldeira Knabben * * == BEGIN LICENSE == * @@ -22,71 +22,90 @@ * height (FCKConfig.AutoGrowMax), based on its contents. */ -var FCKAutoGrow_Min = window.frameElement.offsetHeight ; +var FCKAutoGrow = { + MIN_HEIGHT : window.frameElement.offsetHeight, -function FCKAutoGrow_Check() -{ - var oInnerDoc = FCK.EditorDocument ; + Check : function() + { + var delta = FCKAutoGrow.GetHeightDelta() ; + if ( delta != 0 ) + { + var newHeight = window.frameElement.offsetHeight + delta ; + + newHeight = FCKAutoGrow.GetEffectiveHeight( newHeight ) ; - var iFrameHeight, iInnerHeight ; + if ( newHeight != window.frameElement.height ) + { + window.frameElement.style.height = newHeight + "px" ; + + // Gecko browsers use an onresize handler to update the innermost + // IFRAME's height. If the document is modified before the onresize + // is triggered, the plugin will miscalculate the new height. Thus, + // forcibly trigger onresize. #1336 + if ( typeof window.onresize == 'function' ) + { + window.onresize() ; + } + } + } + }, - if ( FCKBrowserInfo.IsIE ) + CheckEditorStatus : function( sender, status ) { - iFrameHeight = FCK.EditorWindow.frameElement.offsetHeight ; - iInnerHeight = oInnerDoc.body.scrollHeight ; - } - else + if ( status == FCK_STATUS_COMPLETE ) + FCKAutoGrow.Check() ; + }, + + GetEffectiveHeight : function( height ) { - iFrameHeight = FCK.EditorWindow.innerHeight ; - iInnerHeight = oInnerDoc.body.offsetHeight ; - } + if ( height < FCKAutoGrow.MIN_HEIGHT ) + height = FCKAutoGrow.MIN_HEIGHT; + else + { + var max = FCKConfig.AutoGrowMax; + if ( max && max > 0 && height > max ) + height = max; + } - var iDiff = iInnerHeight - iFrameHeight ; + return height; + }, - if ( iDiff != 0 ) + GetHeightDelta : function() { - var iMainFrameSize = window.frameElement.offsetHeight ; + var oInnerDoc = FCK.EditorDocument ; + + var iFrameHeight ; + var iInnerHeight ; - if ( iDiff > 0 && iMainFrameSize < FCKConfig.AutoGrowMax ) + if ( FCKBrowserInfo.IsIE ) { - iMainFrameSize += iDiff ; - if ( iMainFrameSize > FCKConfig.AutoGrowMax ) - iMainFrameSize = FCKConfig.AutoGrowMax ; + iFrameHeight = FCK.EditorWindow.frameElement.offsetHeight ; + iInnerHeight = oInnerDoc.body.scrollHeight ; } - else if ( iDiff < 0 && iMainFrameSize > FCKAutoGrow_Min ) + else { - iMainFrameSize += iDiff ; - if ( iMainFrameSize < FCKAutoGrow_Min ) - iMainFrameSize = FCKAutoGrow_Min ; + iFrameHeight = FCK.EditorWindow.innerHeight ; + iInnerHeight = oInnerDoc.body.offsetHeight + + ( parseInt( FCKDomTools.GetCurrentElementStyle( oInnerDoc.body, 'margin-top' ), 10 ) || 0 ) + + ( parseInt( FCKDomTools.GetCurrentElementStyle( oInnerDoc.body, 'margin-bottom' ), 10 ) || 0 ) ; } - else - return ; - window.frameElement.height = iMainFrameSize ; - } -} + return iInnerHeight - iFrameHeight ; + }, -FCK.AttachToOnSelectionChange( FCKAutoGrow_Check ) ; + SetListeners : function() + { + if ( FCK.EditMode != FCK_EDITMODE_WYSIWYG ) + return ; -function FCKAutoGrow_SetListeners() -{ - if ( FCK.EditMode != FCK_EDITMODE_WYSIWYG ) - return ; + FCK.EditorWindow.attachEvent( 'onscroll', FCKAutoGrow.Check ) ; + FCK.EditorDocument.attachEvent( 'onkeyup', FCKAutoGrow.Check ) ; + } +}; - FCK.EditorWindow.attachEvent( 'onscroll', FCKAutoGrow_Check ) ; - FCK.EditorDocument.attachEvent( 'onkeyup', FCKAutoGrow_Check ) ; -} +FCK.AttachToOnSelectionChange( FCKAutoGrow.Check ) ; if ( FCKBrowserInfo.IsIE ) -{ -// FCKAutoGrow_SetListeners() ; - FCK.Events.AttachEvent( 'OnAfterSetHTML', FCKAutoGrow_SetListeners ) ; -} - -function FCKAutoGrow_CheckEditorStatus( sender, status ) -{ - if ( status == FCK_STATUS_COMPLETE ) - FCKAutoGrow_Check() ; -} - -FCK.Events.AttachEvent( 'OnStatusChange', FCKAutoGrow_CheckEditorStatus ) ; \ No newline at end of file + FCK.Events.AttachEvent( 'OnAfterSetHTML', FCKAutoGrow.SetListeners ) ; + +FCK.Events.AttachEvent( 'OnStatusChange', FCKAutoGrow.CheckEditorStatus ) ; diff --git a/httemplate/elements/fckeditor/editor/plugins/bbcode/fckplugin.js b/httemplate/elements/fckeditor/editor/plugins/bbcode/fckplugin.js new file mode 100644 index 000000000..f9521ddac --- /dev/null +++ b/httemplate/elements/fckeditor/editor/plugins/bbcode/fckplugin.js @@ -0,0 +1,123 @@ +/* + * FCKeditor - The text editor for Internet - http://www.fckeditor.net + * Copyright (C) 2003-2010 Frederico Caldeira Knabben + * + * == BEGIN LICENSE == + * + * Licensed under the terms of any of the following licenses at your + * choice: + * + * - GNU General Public License Version 2 or later (the "GPL") + * http://www.gnu.org/licenses/gpl.html + * + * - GNU Lesser General Public License Version 2.1 or later (the "LGPL") + * http://www.gnu.org/licenses/lgpl.html + * + * - Mozilla Public License Version 1.1 or later (the "MPL") + * http://www.mozilla.org/MPL/MPL-1.1.html + * + * == END LICENSE == + * + * This is a sample implementation for a custom Data Processor for basic BBCode. + */ + +FCK.DataProcessor = +{ + /* + * Returns a string representing the HTML format of "data". The returned + * value will be loaded in the editor. + * The HTML must be from to , eventually including + * the DOCTYPE. + * @param {String} data The data to be converted in the + * DataProcessor specific format. + */ + ConvertToHtml : function( data ) + { + // Convert < and > to their HTML entities. + data = data.replace( //g, '>' ) ; + + // Convert line breaks to
. + data = data.replace( /(?:\r\n|\n|\r)/g, '
' ) ; + + // [url] + data = data.replace( /\[url\](.+?)\[\/url]/gi, '$1' ) ; + data = data.replace( /\[url\=([^\]]+)](.+?)\[\/url]/gi, '$2' ) ; + + // [b] + data = data.replace( /\[b\](.+?)\[\/b]/gi, '$1' ) ; + + // [i] + data = data.replace( /\[i\](.+?)\[\/i]/gi, '$1' ) ; + + // [u] + data = data.replace( /\[u\](.+?)\[\/u]/gi, '$1' ) ; + + return '' + data + '' ; + }, + + /* + * Converts a DOM (sub-)tree to a string in the data format. + * @param {Object} rootNode The node that contains the DOM tree to be + * converted to the data format. + * @param {Boolean} excludeRoot Indicates that the root node must not + * be included in the conversion, only its children. + * @param {Boolean} format Indicates that the data must be formatted + * for human reading. Not all Data Processors may provide it. + */ + ConvertToDataFormat : function( rootNode, excludeRoot, ignoreIfEmptyParagraph, format ) + { + var data = rootNode.innerHTML ; + + // Convert
to line breaks. + data = data.replace( /]).*?>/gi, '\r\n') ; + + // [url] + data = data.replace( /(.+?)<\/a>/gi, '[url=$2]$3[/url]') ; + + // [b] + data = data.replace( /<(?:b|strong)>/gi, '[b]') ; + data = data.replace( /<\/(?:b|strong)>/gi, '[/b]') ; + + // [i] + data = data.replace( /<(?:i|em)>/gi, '[i]') ; + data = data.replace( /<\/(?:i|em)>/gi, '[/i]') ; + + // [u] + data = data.replace( //gi, '[u]') ; + data = data.replace( /<\/u>/gi, '[/u]') ; + + // Remove remaining tags. + data = data.replace( /<[^>]+>/g, '') ; + + return data ; + }, + + /* + * Makes any necessary changes to a piece of HTML for insertion in the + * editor selection position. + * @param {String} html The HTML to be fixed. + */ + FixHtml : function( html ) + { + return html ; + } +} ; + +// This Data Processor doesn't support

, so let's use
. +FCKConfig.EnterMode = 'br' ; + +// To avoid pasting invalid markup (which is discarded in any case), let's +// force pasting to plain text. +FCKConfig.ForcePasteAsPlainText = true ; + +// Rename the "Source" buttom to "BBCode". +FCKToolbarItems.RegisterItem( 'Source', new FCKToolbarButton( 'Source', 'BBCode', null, FCK_TOOLBARITEM_ICONTEXT, true, true, 1 ) ) ; + +// Let's enforce the toolbar to the limits of this Data Processor. A custom +// toolbar set may be defined in the configuration file with more or less entries. +FCKConfig.ToolbarSets["Default"] = [ + ['Source'], + ['Bold','Italic','Underline','-','Link'], + ['About'] +] ; diff --git a/httemplate/elements/fckeditor/editor/plugins/dragresizetable/fckplugin.js b/httemplate/elements/fckeditor/editor/plugins/dragresizetable/fckplugin.js new file mode 100644 index 000000000..87061ff64 --- /dev/null +++ b/httemplate/elements/fckeditor/editor/plugins/dragresizetable/fckplugin.js @@ -0,0 +1,529 @@ +var FCKDragTableHandler = +{ + "_DragState" : 0, + "_LeftCell" : null, + "_RightCell" : null, + "_MouseMoveMode" : 0, // 0 - find candidate cells for resizing, 1 - drag to resize + "_ResizeBar" : null, + "_OriginalX" : null, + "_MinimumX" : null, + "_MaximumX" : null, + "_LastX" : null, + "_TableMap" : null, + "_doc" : document, + "_IsInsideNode" : function( w, domNode, pos ) + { + var myCoords = FCKTools.GetWindowPosition( w, domNode ) ; + var xMin = myCoords.x ; + var yMin = myCoords.y ; + var xMax = parseInt( xMin, 10 ) + parseInt( domNode.offsetWidth, 10 ) ; + var yMax = parseInt( yMin, 10 ) + parseInt( domNode.offsetHeight, 10 ) ; + if ( pos.x >= xMin && pos.x <= xMax && pos.y >= yMin && pos.y <= yMax ) + return true; + return false; + }, + "_GetBorderCells" : function( w, tableNode, tableMap, mouse ) + { + // Enumerate all the cells in the table. + var cells = [] ; + for ( var i = 0 ; i < tableNode.rows.length ; i++ ) + { + var r = tableNode.rows[i] ; + for ( var j = 0 ; j < r.cells.length ; j++ ) + cells.push( r.cells[j] ) ; + } + + if ( cells.length < 1 ) + return null ; + + // Get the cells whose right or left border is nearest to the mouse cursor's x coordinate. + var minRxDist = null ; + var lxDist = null ; + var minYDist = null ; + var rbCell = null ; + var lbCell = null ; + for ( var i = 0 ; i < cells.length ; i++ ) + { + var pos = FCKTools.GetWindowPosition( w, cells[i] ) ; + var rightX = pos.x + parseInt( cells[i].clientWidth, 10 ) ; + var rxDist = mouse.x - rightX ; + var yDist = mouse.y - ( pos.y + ( cells[i].clientHeight / 2 ) ) ; + if ( minRxDist == null || + ( Math.abs( rxDist ) <= Math.abs( minRxDist ) && + ( minYDist == null || Math.abs( yDist ) <= Math.abs( minYDist ) ) ) ) + { + minRxDist = rxDist ; + minYDist = yDist ; + rbCell = cells[i] ; + } + } + /* + var rowNode = FCKTools.GetElementAscensor( rbCell, "tr" ) ; + var cellIndex = rbCell.cellIndex + 1 ; + if ( cellIndex >= rowNode.cells.length ) + return null ; + lbCell = rowNode.cells.item( cellIndex ) ; + */ + var rowIdx = rbCell.parentNode.rowIndex ; + var colIdx = FCKTableHandler._GetCellIndexSpan( tableMap, rowIdx, rbCell ) ; + var colSpan = isNaN( rbCell.colSpan ) ? 1 : rbCell.colSpan ; + lbCell = tableMap[rowIdx][colIdx + colSpan] ; + + if ( ! lbCell ) + return null ; + + // Abort if too far from the border. + lxDist = mouse.x - FCKTools.GetWindowPosition( w, lbCell ).x ; + if ( lxDist < 0 && minRxDist < 0 && minRxDist < -2 ) + return null ; + if ( lxDist > 0 && minRxDist > 0 && lxDist > 3 ) + return null ; + + return { "leftCell" : rbCell, "rightCell" : lbCell } ; + }, + "_GetResizeBarPosition" : function() + { + var row = FCKTools.GetElementAscensor( this._RightCell, "tr" ) ; + return FCKTableHandler._GetCellIndexSpan( this._TableMap, row.rowIndex, this._RightCell ) ; + }, + "_ResizeBarMouseDownListener" : function( evt ) + { + if ( FCKDragTableHandler._LeftCell ) + FCKDragTableHandler._MouseMoveMode = 1 ; + if ( FCKBrowserInfo.IsIE ) + FCKDragTableHandler._ResizeBar.filters.item("DXImageTransform.Microsoft.Alpha").opacity = 50 ; + else + FCKDragTableHandler._ResizeBar.style.opacity = 0.5 ; + FCKDragTableHandler._OriginalX = evt.clientX ; + + // Calculate maximum and minimum x-coordinate delta. + var borderIndex = FCKDragTableHandler._GetResizeBarPosition() ; + var offset = FCKDragTableHandler._GetIframeOffset(); + var table = FCKTools.GetElementAscensor( FCKDragTableHandler._LeftCell, "table" ); + var minX = null ; + var maxX = null ; + for ( var r = 0 ; r < FCKDragTableHandler._TableMap.length ; r++ ) + { + var leftCell = FCKDragTableHandler._TableMap[r][borderIndex - 1] ; + var rightCell = FCKDragTableHandler._TableMap[r][borderIndex] ; + var leftPosition = FCKTools.GetWindowPosition( FCK.EditorWindow, leftCell ) ; + var rightPosition = FCKTools.GetWindowPosition( FCK.EditorWindow, rightCell ) ; + var leftPadding = FCKDragTableHandler._GetCellPadding( table, leftCell ) ; + var rightPadding = FCKDragTableHandler._GetCellPadding( table, rightCell ) ; + if ( minX == null || leftPosition.x + leftPadding > minX ) + minX = leftPosition.x + leftPadding ; + if ( maxX == null || rightPosition.x + rightCell.clientWidth - rightPadding < maxX ) + maxX = rightPosition.x + rightCell.clientWidth - rightPadding ; + } + + FCKDragTableHandler._MinimumX = minX + offset.x ; + FCKDragTableHandler._MaximumX = maxX + offset.x ; + FCKDragTableHandler._LastX = null ; + + if (evt.preventDefault) + evt.preventDefault(); + else + evt.returnValue = false; + }, + "_ResizeBarMouseUpListener" : function( evt ) + { + FCKDragTableHandler._MouseMoveMode = 0 ; + FCKDragTableHandler._HideResizeBar() ; + + if ( FCKDragTableHandler._LastX == null ) + return ; + + // Calculate the delta value. + var deltaX = FCKDragTableHandler._LastX - FCKDragTableHandler._OriginalX ; + + // Then, build an array of current column width values. + // This algorithm can be very slow if the cells have insane colSpan values. (e.g. colSpan=1000). + var table = FCKTools.GetElementAscensor( FCKDragTableHandler._LeftCell, "table" ) ; + var colArray = [] ; + var tableMap = FCKDragTableHandler._TableMap ; + for ( var i = 0 ; i < tableMap.length ; i++ ) + { + for ( var j = 0 ; j < tableMap[i].length ; j++ ) + { + var cell = tableMap[i][j] ; + var width = FCKDragTableHandler._GetCellWidth( table, cell ) ; + var colSpan = isNaN( cell.colSpan) ? 1 : cell.colSpan ; + if ( colArray.length <= j ) + colArray.push( { width : width / colSpan, colSpan : colSpan } ) ; + else + { + var guessItem = colArray[j] ; + if ( guessItem.colSpan > colSpan ) + { + guessItem.width = width / colSpan ; + guessItem.colSpan = colSpan ; + } + } + } + } + + // Find out the equivalent column index of the two cells selected for resizing. + colIndex = FCKDragTableHandler._GetResizeBarPosition() ; + + // Note that colIndex must be at least 1 here, so it's safe to subtract 1 from it. + colIndex-- ; + + // Modify the widths in the colArray according to the mouse coordinate delta value. + colArray[colIndex].width += deltaX ; + colArray[colIndex + 1].width -= deltaX ; + + // Clear all cell widths, delete all elements from the table. + for ( var r = 0 ; r < table.rows.length ; r++ ) + { + var row = table.rows.item( r ) ; + for ( var c = 0 ; c < row.cells.length ; c++ ) + { + var cell = row.cells.item( c ) ; + cell.width = "" ; + cell.style.width = "" ; + } + } + var colElements = table.getElementsByTagName( "col" ) ; + for ( var i = colElements.length - 1 ; i >= 0 ; i-- ) + colElements[i].parentNode.removeChild( colElements[i] ) ; + + // Set new cell widths. + var processedCells = [] ; + for ( var i = 0 ; i < tableMap.length ; i++ ) + { + for ( var j = 0 ; j < tableMap[i].length ; j++ ) + { + var cell = tableMap[i][j] ; + if ( cell._Processed ) + continue ; + if ( tableMap[i][j-1] != cell ) + cell.width = colArray[j].width ; + else + cell.width = parseInt( cell.width, 10 ) + parseInt( colArray[j].width, 10 ) ; + if ( tableMap[i][j+1] != cell ) + { + processedCells.push( cell ) ; + cell._Processed = true ; + } + } + } + for ( var i = 0 ; i < processedCells.length ; i++ ) + { + if ( FCKBrowserInfo.IsIE ) + processedCells[i].removeAttribute( '_Processed' ) ; + else + delete processedCells[i]._Processed ; + } + + FCKDragTableHandler._LastX = null ; + }, + "_ResizeBarMouseMoveListener" : function( evt ) + { + if ( FCKDragTableHandler._MouseMoveMode == 0 ) + return FCKDragTableHandler._MouseFindHandler( FCK, evt ) ; + else + return FCKDragTableHandler._MouseDragHandler( FCK, evt ) ; + }, + // Calculate the padding of a table cell. + // It returns the value of paddingLeft + paddingRight of a table cell. + // This function is used, in part, to calculate the width parameter that should be used for setting cell widths. + // The equation in question is clientWidth = paddingLeft + paddingRight + width. + // So that width = clientWidth - paddingLeft - paddingRight. + // The return value of this function must be pixel accurate acorss all supported browsers, so be careful if you need to modify it. + "_GetCellPadding" : function( table, cell ) + { + var attrGuess = parseInt( table.cellPadding, 10 ) * 2 ; + var cssGuess = null ; + if ( typeof( window.getComputedStyle ) == "function" ) + { + var styleObj = window.getComputedStyle( cell, null ) ; + cssGuess = parseInt( styleObj.getPropertyValue( "padding-left" ), 10 ) + + parseInt( styleObj.getPropertyValue( "padding-right" ), 10 ) ; + } + else + cssGuess = parseInt( cell.currentStyle.paddingLeft, 10 ) + parseInt (cell.currentStyle.paddingRight, 10 ) ; + + var cssRuntime = cell.style.padding ; + if ( isFinite( cssRuntime ) ) + cssGuess = parseInt( cssRuntime, 10 ) * 2 ; + else + { + cssRuntime = cell.style.paddingLeft ; + if ( isFinite( cssRuntime ) ) + cssGuess = parseInt( cssRuntime, 10 ) ; + cssRuntime = cell.style.paddingRight ; + if ( isFinite( cssRuntime ) ) + cssGuess += parseInt( cssRuntime, 10 ) ; + } + + attrGuess = parseInt( attrGuess, 10 ) ; + cssGuess = parseInt( cssGuess, 10 ) ; + if ( isNaN( attrGuess ) ) + attrGuess = 0 ; + if ( isNaN( cssGuess ) ) + cssGuess = 0 ; + return Math.max( attrGuess, cssGuess ) ; + }, + // Calculate the real width of the table cell. + // The real width of the table cell is the pixel width that you can set to the width attribute of the table cell and after + // that, the table cell should be of exactly the same width as before. + // The real width of a table cell can be calculated as: + // width = clientWidth - paddingLeft - paddingRight. + "_GetCellWidth" : function( table, cell ) + { + var clientWidth = cell.clientWidth ; + if ( isNaN( clientWidth ) ) + clientWidth = 0 ; + return clientWidth - this._GetCellPadding( table, cell ) ; + }, + "MouseMoveListener" : function( FCK, evt ) + { + if ( FCKDragTableHandler._MouseMoveMode == 0 ) + return FCKDragTableHandler._MouseFindHandler( FCK, evt ) ; + else + return FCKDragTableHandler._MouseDragHandler( FCK, evt ) ; + }, + "_MouseFindHandler" : function( FCK, evt ) + { + if ( FCK.MouseDownFlag ) + return ; + var node = evt.srcElement || evt.target ; + try + { + if ( ! node || node.nodeType != 1 ) + { + this._HideResizeBar() ; + return ; + } + } + catch ( e ) + { + this._HideResizeBar() ; + return ; + } + + // Since this function might be called from the editing area iframe or the outer fckeditor iframe, + // the mouse point coordinates from evt.clientX/Y can have different reference points. + // We need to resolve the mouse pointer position relative to the editing area iframe. + var mouseX = evt.clientX ; + var mouseY = evt.clientY ; + if ( FCKTools.GetElementDocument( node ) == document ) + { + var offset = this._GetIframeOffset() ; + mouseX -= offset.x ; + mouseY -= offset.y ; + } + + + if ( this._ResizeBar && this._LeftCell ) + { + var leftPos = FCKTools.GetWindowPosition( FCK.EditorWindow, this._LeftCell ) ; + var rightPos = FCKTools.GetWindowPosition( FCK.EditorWindow, this._RightCell ) ; + var rxDist = mouseX - ( leftPos.x + this._LeftCell.clientWidth ) ; + var lxDist = mouseX - rightPos.x ; + var inRangeFlag = false ; + if ( lxDist >= 0 && rxDist <= 0 ) + inRangeFlag = true ; + else if ( rxDist > 0 && lxDist <= 3 ) + inRangeFlag = true ; + else if ( lxDist < 0 && rxDist >= -2 ) + inRangeFlag = true ; + if ( inRangeFlag ) + { + this._ShowResizeBar( FCK.EditorWindow, + FCKTools.GetElementAscensor( this._LeftCell, "table" ), + { "x" : mouseX, "y" : mouseY } ) ; + return ; + } + } + + var tagName = node.tagName.toLowerCase() ; + if ( tagName != "table" && tagName != "td" && tagName != "th" ) + { + if ( this._LeftCell ) + this._LeftCell = this._RightCell = this._TableMap = null ; + this._HideResizeBar() ; + return ; + } + node = FCKTools.GetElementAscensor( node, "table" ) ; + var tableMap = FCKTableHandler._CreateTableMap( node ) ; + var cellTuple = this._GetBorderCells( FCK.EditorWindow, node, tableMap, { "x" : mouseX, "y" : mouseY } ) ; + + if ( cellTuple == null ) + { + if ( this._LeftCell ) + this._LeftCell = this._RightCell = this._TableMap = null ; + this._HideResizeBar() ; + } + else + { + this._LeftCell = cellTuple["leftCell"] ; + this._RightCell = cellTuple["rightCell"] ; + this._TableMap = tableMap ; + this._ShowResizeBar( FCK.EditorWindow, + FCKTools.GetElementAscensor( this._LeftCell, "table" ), + { "x" : mouseX, "y" : mouseY } ) ; + } + }, + "_MouseDragHandler" : function( FCK, evt ) + { + var mouse = { "x" : evt.clientX, "y" : evt.clientY } ; + + // Convert mouse coordinates in reference to the outer iframe. + var node = evt.srcElement || evt.target ; + if ( FCKTools.GetElementDocument( node ) == FCK.EditorDocument ) + { + var offset = this._GetIframeOffset() ; + mouse.x += offset.x ; + mouse.y += offset.y ; + } + + // Calculate the mouse position delta and see if we've gone out of range. + if ( mouse.x >= this._MaximumX - 5 ) + mouse.x = this._MaximumX - 5 ; + if ( mouse.x <= this._MinimumX + 5 ) + mouse.x = this._MinimumX + 5 ; + + var docX = mouse.x + FCKTools.GetScrollPosition( window ).X ; + this._ResizeBar.style.left = ( docX - this._ResizeBar.offsetWidth / 2 ) + "px" ; + this._LastX = mouse.x ; + }, + "_ShowResizeBar" : function( w, table, mouse ) + { + if ( this._ResizeBar == null ) + { + this._ResizeBar = this._doc.createElement( "div" ) ; + var paddingBar = this._ResizeBar ; + var paddingStyles = { 'position' : 'absolute', 'cursor' : 'e-resize' } ; + if ( FCKBrowserInfo.IsIE ) + paddingStyles.filter = "progid:DXImageTransform.Microsoft.Alpha(opacity=10,enabled=true)" ; + else + paddingStyles.opacity = 0.10 ; + FCKDomTools.SetElementStyles( paddingBar, paddingStyles ) ; + this._avoidStyles( paddingBar ); + paddingBar.setAttribute('_fcktemp', true); + this._doc.body.appendChild( paddingBar ) ; + FCKTools.AddEventListener( paddingBar, "mousemove", this._ResizeBarMouseMoveListener ) ; + FCKTools.AddEventListener( paddingBar, "mousedown", this._ResizeBarMouseDownListener ) ; + FCKTools.AddEventListener( document, "mouseup", this._ResizeBarMouseUpListener ) ; + FCKTools.AddEventListener( FCK.EditorDocument, "mouseup", this._ResizeBarMouseUpListener ) ; + + // IE doesn't let the tranparent part of the padding block to receive mouse events unless there's something inside. + // So we need to create a spacer image to fill the block up. + var filler = this._doc.createElement( "img" ) ; + filler.setAttribute('_fcktemp', true); + filler.border = 0 ; + filler.src = FCKConfig.BasePath + "images/spacer.gif" ; + filler.style.position = "absolute" ; + paddingBar.appendChild( filler ) ; + + // Disable drag and drop, and selection for the filler image. + var disabledListener = function( evt ) + { + if ( evt.preventDefault ) + evt.preventDefault() ; + else + evt.returnValue = false ; + } + FCKTools.AddEventListener( filler, "dragstart", disabledListener ) ; + FCKTools.AddEventListener( filler, "selectstart", disabledListener ) ; + } + + var paddingBar = this._ResizeBar ; + var offset = this._GetIframeOffset() ; + var tablePos = this._GetTablePosition( w, table ) ; + var barHeight = table.offsetHeight ; + var barTop = offset.y + tablePos.y ; + // Do not let the resize bar intrude into the toolbar area. + if ( tablePos.y < 0 ) + { + barHeight += tablePos.y ; + barTop -= tablePos.y ; + } + var bw = parseInt( table.border, 10 ) ; + if ( isNaN( bw ) ) + bw = 0 ; + var cs = parseInt( table.cellSpacing, 10 ) ; + if ( isNaN( cs ) ) + cs = 0 ; + var barWidth = Math.max( bw+100, cs+100 ) ; + var paddingStyles = + { + 'top' : barTop + 'px', + 'height' : barHeight + 'px', + 'width' : barWidth + 'px', + 'left' : ( offset.x + mouse.x + FCKTools.GetScrollPosition( w ).X - barWidth / 2 ) + 'px' + } ; + if ( FCKBrowserInfo.IsIE ) + paddingBar.filters.item("DXImageTransform.Microsoft.Alpha").opacity = 10 ; + else + paddingStyles.opacity = 0.1 ; + + FCKDomTools.SetElementStyles( paddingBar, paddingStyles ) ; + var filler = paddingBar.getElementsByTagName( "img" )[0] ; + + FCKDomTools.SetElementStyles( filler, + { + width : paddingBar.offsetWidth + 'px', + height : barHeight + 'px' + } ) ; + + barWidth = Math.max( bw, cs, 3 ) ; + var visibleBar = null ; + if ( paddingBar.getElementsByTagName( "div" ).length < 1 ) + { + visibleBar = this._doc.createElement( "div" ) ; + this._avoidStyles( visibleBar ); + visibleBar.setAttribute('_fcktemp', true); + paddingBar.appendChild( visibleBar ) ; + } + else + visibleBar = paddingBar.getElementsByTagName( "div" )[0] ; + + FCKDomTools.SetElementStyles( visibleBar, + { + position : 'absolute', + backgroundColor : 'blue', + width : barWidth + 'px', + height : barHeight + 'px', + left : '50px', + top : '0px' + } ) ; + }, + "_HideResizeBar" : function() + { + if ( this._ResizeBar ) + // IE bug: display : none does not hide the resize bar for some reason. + // so set the position to somewhere invisible. + FCKDomTools.SetElementStyles( this._ResizeBar, + { + top : '-100000px', + left : '-100000px' + } ) ; + }, + "_GetIframeOffset" : function () + { + return FCKTools.GetDocumentPosition( window, FCK.EditingArea.IFrame ) ; + }, + "_GetTablePosition" : function ( w, table ) + { + return FCKTools.GetWindowPosition( w, table ) ; + }, + "_avoidStyles" : function( element ) + { + FCKDomTools.SetElementStyles( element, + { + padding : '0', + backgroundImage : 'none', + border : '0' + } ) ; + }, + "Reset" : function() + { + FCKDragTableHandler._LeftCell = FCKDragTableHandler._RightCell = FCKDragTableHandler._TableMap = null ; + } + +}; + +FCK.Events.AttachEvent( "OnMouseMove", FCKDragTableHandler.MouseMoveListener ) ; +FCK.Events.AttachEvent( "OnAfterSetHTML", FCKDragTableHandler.Reset ) ; diff --git a/httemplate/elements/fckeditor/editor/plugins/placeholder/fck_placeholder.html b/httemplate/elements/fckeditor/editor/plugins/placeholder/fck_placeholder.html index a334206a5..df8c563d6 100644 --- a/httemplate/elements/fckeditor/editor/plugins/placeholder/fck_placeholder.html +++ b/httemplate/elements/fckeditor/editor/plugins/placeholder/fck_placeholder.html @@ -1,7 +1,7 @@