Вход Регистрация
Файл: plugins/p_fckeditor/fckeditor/editor/plugins/dragresizetable/fckplugin.js
Строк: 589
<?php
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( wdomNodepos )
    {
        var 
myCoords FCKTools.GetWindowPositionwdomNode ) ;
        var 
xMin myCoords.;
        var 
yMin myCoords.;
        var 
xMax parseIntxMin10 ) + parseIntdomNode.offsetWidth10 ) ;
        var 
yMax parseIntyMin10 ) + parseIntdomNode.offsetHeight10 ) ;
        if ( 
pos.>= xMin && pos.<= xMax && pos.>= yMin && pos.<= yMax )
            return 
true;
        return 
false;
    },
    
"_GetBorderCells" : function( wtableNodetableMapmouse )
    {
        
// Enumerate all the cells in the table.
        
var cells = [] ;
        for ( var 
tableNode.rows.length i++ )
        {
            var 
tableNode.rows[i] ;
            for ( var 
r.cells.length j++ )
                
cells.pushr.cells[j] ) ;
        }

        if ( 
cells.length )
            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 
cells.length i++ )
        {
            var 
pos FCKTools.GetWindowPositionwcells[i] ) ;
            var 
rightX pos.parseIntcells[i].clientWidth10 ) ;
            var 
rxDist mouse.rightX ;
            var 
yDist mouse.- ( pos.+ ( cells[i].clientHeight ) ) ;
            if ( 
minRxDist == null ||
                    ( 
Math.absrxDist ) <= Math.absminRxDist ) &&
                      ( 
minYDist == null || Math.absyDist ) <= Math.absminYDist ) ) ) )
            {
                
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._GetCellIndexSpantableMaprowIdxrbCell ) ;
        var 
colSpan isNaNrbCell.colSpan ) ? rbCell.colSpan ;
        
lbCell tableMap[rowIdx][colIdx colSpan] ;

        if ( ! 
lbCell )
            return 
null ;

        
// Abort if too far from the border.
        
lxDist mouse.FCKTools.GetWindowPositionwlbCell ).;
        if ( 
lxDist && minRxDist && minRxDist < -)
            return 
null ;
        if ( 
lxDist && minRxDist && lxDist )
            return 
null ;

        return { 
"leftCell" rbCell"rightCell" lbCell } ;
    },
    
"_GetResizeBarPosition" : function()
    {
        var 
row FCKTools.GetElementAscensorthis._RightCell"tr" ) ;
        return 
FCKTableHandler._GetCellIndexSpanthis._TableMaprow.rowIndexthis._RightCell ) ;
    },
    
"_ResizeBarMouseDownListener" : function( evt )
    {
        if ( 
FCKDragTableHandler._LeftCell )
            
FCKDragTableHandler._MouseMoveMode ;
        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.GetElementAscensorFCKDragTableHandler._LeftCell"table" );
        var 
minX null ;
        var 
maxX null ;
        for ( var 
FCKDragTableHandler._TableMap.length r++ )
        {
            var 
leftCell FCKDragTableHandler._TableMap[r][borderIndex 1] ;
            var 
rightCell FCKDragTableHandler._TableMap[r][borderIndex] ;
            var 
leftPosition FCKTools.GetWindowPositionFCK.EditorWindowleftCell ) ;
            var 
rightPosition FCKTools.GetWindowPositionFCK.EditorWindowrightCell ) ;
            var 
leftPadding FCKDragTableHandler._GetCellPaddingtableleftCell ) ;
            var 
rightPadding FCKDragTableHandler._GetCellPaddingtablerightCell ) ;
            if ( 
minX == null || leftPosition.leftPadding minX )
                
minX leftPosition.leftPadding ;
            if ( 
maxX == null || rightPosition.rightCell.clientWidth rightPadding maxX )
                
maxX rightPosition.rightCell.clientWidth rightPadding ;
        }

        
FCKDragTableHandler._MinimumX minX offset.;
        
FCKDragTableHandler._MaximumX maxX offset.;
        
FCKDragTableHandler._LastX null ;

        if (
evt.preventDefault)
            
evt.preventDefault();
        else
            
evt.returnValue false;
    },
    
"_ResizeBarMouseUpListener" : function( evt )
    {
        
FCKDragTableHandler._MouseMoveMode ;
        
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.GetElementAscensorFCKDragTableHandler._LeftCell"table" ) ;
        var 
colArray = [] ;
        var 
tableMap FCKDragTableHandler._TableMap ;
        for ( var 
tableMap.length i++ )
        {
            for ( var 
tableMap[i].length j++ )
            {
                var 
cell tableMap[i][j] ;
                var 
width FCKDragTableHandler._GetCellWidthtablecell ) ;
                var 
colSpan isNaNcell.colSpan) ? cell.colSpan ;
                if ( 
colArray.length <= )
                    
colArray.push( { width width colSpancolSpan 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 <col> elements from the table.
        
for ( var table.rows.length r++ )
        {
            var 
row table.rows.item) ;
            for ( var 
row.cells.length c++ )
            {
                var 
cell row.cells.item) ;
                
cell.width "" ;
                
cell.style.width "" ;
            }
        }
        var 
colElements table.getElementsByTagName"col" ) ;
        for ( var 
colElements.length >= i-- )
            
colElements[i].parentNode.removeChildcolElements[i] ) ;

        
// Set new cell widths.
        
var processedCells = [] ;
        for ( var 
tableMap.length i++ )
        {
            for ( var 
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 parseIntcell.width10 ) + parseIntcolArray[j].width10 ) ;
                if ( 
tableMap[i][j+1] != cell )
                {
                    
processedCells.pushcell ) ;
                    
cell._Processed true ;
                }
            }
        }
        for ( var 
processedCells.length i++ )
        {
            if ( 
FCKBrowserInfo.IsIE )
                
processedCells[i].removeAttribute'_Processed' ) ;
            else
                
delete processedCells[i]._Processed ;
        }

        
FCKDragTableHandler._LastX null ;
    },
    
"_ResizeBarMouseMoveListener" : function( evt )
    {
        if ( 
FCKDragTableHandler._MouseMoveMode == )
            return 
FCKDragTableHandler._MouseFindHandlerFCKevt ) ;
        else
            return 
FCKDragTableHandler._MouseDragHandlerFCKevt ) ;
    },
    
// 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( tablecell )
    {
        var 
attrGuess parseInttable.cellPadding10 ) * ;
        var 
cssGuess null ;
        if ( 
typeofwindow.getComputedStyle ) == "function" )
        {
            var 
styleObj window.getComputedStylecellnull ) ;
            
cssGuess parseIntstyleObj.getPropertyValue"padding-left" ), 10 ) +
                
parseIntstyleObj.getPropertyValue"padding-right" ), 10 ) ;
        }
        else
            
cssGuess parseIntcell.currentStyle.paddingLeft10 ) + parseInt (cell.currentStyle.paddingRight10 ) ;

        var 
cssRuntime cell.style.padding ;
        if ( 
isFinitecssRuntime ) )
            
cssGuess parseIntcssRuntime10 ) * ;
        else
        {
            
cssRuntime cell.style.paddingLeft ;
            if ( 
isFinitecssRuntime ) )
                
cssGuess parseIntcssRuntime10 ) ;
            
cssRuntime cell.style.paddingRight ;
            if ( 
isFinitecssRuntime ) )
                
cssGuess += parseIntcssRuntime10 ) ;
        }

        
attrGuess parseIntattrGuess10 ) ;
        
cssGuess parseIntcssGuess10 ) ;
        if ( 
isNaNattrGuess ) )
            
attrGuess ;
        if ( 
isNaNcssGuess ) )
            
cssGuess ;
        return 
Math.maxattrGuesscssGuess ) ;
    },
    
// 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( tablecell )
    {
        var 
clientWidth cell.clientWidth ;
        if ( 
isNaNclientWidth ) )
            
clientWidth ;
        return 
clientWidth this._GetCellPaddingtablecell ) ;
    },
    
"MouseMoveListener" : function( FCKevt )
    {
        if ( 
FCKDragTableHandler._MouseMoveMode == )
            return 
FCKDragTableHandler._MouseFindHandlerFCKevt ) ;
        else
            return 
FCKDragTableHandler._MouseDragHandlerFCKevt ) ;
    },
    
"_MouseFindHandler" : function( FCKevt )
    {
        if ( 
FCK.MouseDownFlag )
            return ;
        var 
node evt.srcElement || evt.target ;
        try
        {
            if ( ! 
node || node.nodeType != )
            {
                
this._HideResizeBar() ;
                return ;
            }
        }
        catch ( 
)
        {
            
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.GetElementDocumentnode ) == document )
        {
            var 
offset this._GetIframeOffset() ;
            
mouseX -= offset.;
            
mouseY -= offset.;
        }


        if ( 
this._ResizeBar && this._LeftCell )
        {
            var 
leftPos FCKTools.GetWindowPositionFCK.EditorWindowthis._LeftCell ) ;
            var 
rightPos FCKTools.GetWindowPositionFCK.EditorWindowthis._RightCell ) ;
            var 
rxDist mouseX - ( leftPos.this._LeftCell.clientWidth ) ;
            var 
lxDist mouseX rightPos.;
            var 
inRangeFlag false ;
            if ( 
lxDist >= && rxDist <= )
                
inRangeFlag true ;
            else if ( 
rxDist && lxDist <= )
                
inRangeFlag true ;
            else if ( 
lxDist && rxDist >= -)
                
inRangeFlag true ;
            if ( 
inRangeFlag )
            {
                
this._ShowResizeBarFCK.EditorWindow,
                    
FCKTools.GetElementAscensorthis._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.GetElementAscensornode"table" ) ;
        var 
tableMap FCKTableHandler._CreateTableMapnode ) ;
        var 
cellTuple this._GetBorderCellsFCK.EditorWindownodetableMap, { "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._ShowResizeBarFCK.EditorWindow,
                    
FCKTools.GetElementAscensorthis._LeftCell"table" ),
                    { 
"x" mouseX"y" mouseY } ) ;
        }
    },
    
"_MouseDragHandler" : function( FCKevt )
    {
        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.GetElementDocumentnode ) == FCK.EditorDocument )
        {
            var 
offset this._GetIframeOffset() ;
            
mouse.+= offset.;
            
mouse.+= offset.;
        }

        
// Calculate the mouse position delta and see if we've gone out of range.
        
if ( mouse.>= this._MaximumX )
            
mouse.this._MaximumX ;
        if ( 
mouse.<= this._MinimumX )
            
mouse.this._MinimumX ;

        var 
docX mouse.FCKTools.GetScrollPositionwindow ).;
        
this._ResizeBar.style.left = ( docX this._ResizeBar.offsetWidth ) + "px" ;
        
this._LastX mouse.;
    },
    
"_ShowResizeBar" : function( wtablemouse )
    {
        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.SetElementStylespaddingBarpaddingStyles ) ;
            
this._avoidStylespaddingBar );
            
paddingBar.setAttribute('_fcktemp'true);
            
this._doc.body.appendChildpaddingBar ) ;
            
FCKTools.AddEventListenerpaddingBar"mousemove"this._ResizeBarMouseMoveListener ) ;
            
FCKTools.AddEventListenerpaddingBar"mousedown"this._ResizeBarMouseDownListener ) ;
            
FCKTools.AddEventListenerdocument"mouseup"this._ResizeBarMouseUpListener ) ;
            
FCKTools.AddEventListenerFCK.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 ;
            
filler.src FCKConfig.BasePath "images/spacer.gif" ;
            
filler.style.position "absolute" ;
            
paddingBar.appendChildfiller ) ;

            
// Disable drag and drop, and selection for the filler image.
            
var disabledListener = function( evt )
            {
                if ( 
evt.preventDefault )
                    
evt.preventDefault() ;
                else
                    
evt.returnValue false ;
            }
            
FCKTools.AddEventListenerfiller"dragstart"disabledListener ) ;
            
FCKTools.AddEventListenerfiller"selectstart"disabledListener ) ;
        }

        var 
paddingBar this._ResizeBar ;
        var 
offset this._GetIframeOffset() ;
        var 
tablePos this._GetTablePositionwtable ) ;
        var 
barHeight table.offsetHeight ;
        var 
barTop offset.tablePos.;
        
// Do not let the resize bar intrude into the toolbar area.
        
if ( tablePos.)
        {
            
barHeight += tablePos.;
            
barTop -= tablePos.;
        }
        var 
bw parseInttable.border10 ) ;
        if ( 
isNaNbw ) )
            
bw ;
        var 
cs parseInttable.cellSpacing10 ) ;
        if ( 
isNaNcs ) )
            
cs ;
        var 
barWidth Math.maxbw+100cs+100 ) ;
        var 
paddingStyles =
        {
            
'top'        barTop 'px',
            
'height'    barHeight 'px',
            
'width'        barWidth 'px',
            
'left'        : ( offset.mouse.FCKTools.GetScrollPosition).barWidth ) + 'px'
        
} ;
        if ( 
FCKBrowserInfo.IsIE )
            
paddingBar.filters.item("DXImageTransform.Microsoft.Alpha").opacity 10 ;
        else
            
paddingStyles.opacity 0.1 ;

        
FCKDomTools.SetElementStylespaddingBarpaddingStyles ) ;
        var 
filler paddingBar.getElementsByTagName"img" )[0] ;

        
FCKDomTools.SetElementStylesfiller,
            {
                
width    paddingBar.offsetWidth 'px',
                
height    barHeight 'px'
            
} ) ;

        
barWidth Math.maxbwcs) ;
        var 
visibleBar null ;
        if ( 
paddingBar.getElementsByTagName"div" ).length )
        {
            
visibleBar this._doc.createElement"div" ) ;
            
this._avoidStylesvisibleBar );
            
visibleBar.setAttribute('_fcktemp'true);
            
paddingBar.appendChildvisibleBar ) ;
        }
        else
            
visibleBar paddingBar.getElementsByTagName"div" )[0] ;

        
FCKDomTools.SetElementStylesvisibleBar,
            {
                
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.SetElementStylesthis._ResizeBar,
                {
                    
top        '-100000px',
                    
left    '-100000px'
                
} ) ;
    },
    
"_GetIframeOffset" : function ()
    {
        return 
FCKTools.GetDocumentPositionwindowFCK.EditingArea.IFrame ) ;
    },
    
"_GetTablePosition" : function ( wtable )
    {
        return 
FCKTools.GetWindowPositionwtable ) ;
    },
    
"_avoidStyles" : function( element )
    {
        
FCKDomTools.SetElementStyleselement,
            {
                
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 ) ;
?>
Онлайн: 2
Реклама