/*
* MindTouch Deki - enterprise collaboration and integration platform
* Copyright (C) 2006-2009 MindTouch, Inc.
* www.mindtouch.com oss@mindtouch.com
*
* For community documentation and downloads visit www.opengarden.org;
* please review the licensing section.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along
* with this program; if not, write to the Free Software Foundation, Inc.,
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
* http://www.gnu.org/copyleft/gpl.html
*/
DimensionPicker = function(element, command, onPick) {
this._minCols = 5;
this._minRows = 5;
this.show = function ( panelX, panelY, relElement )
{
this._panelX = panelX ;
this._panelY = panelY ;
this._relEl = relElement ;
this._pick( 0, 0 ) ;
};
this.onPick = onPick;
this._setDimensionInCells = function( element, cols, rows )
{
element.style.width = 18 * cols + 'px' ;
element.style.height = 18 * rows + 'px' ;
element.cols = cols ;
element.rows = rows ;
};
this._init = function()
{
this._targetDoc = FCKTools.GetElementDocument( element ) ;
this._picker = element ;
this._command = command ;
this._mouseDiv = this._targetDoc.createElement( 'div' ) ;
this._mouseDiv.className = 'dimension-picker-mouse' ;
this._uhDiv = this._targetDoc.createElement( 'div' ) ;
this._uhDiv.className = 'dimension-picker-unhighlighted' ;
this._hDiv = this._targetDoc.createElement( 'div' ) ;
this._hDiv.className = 'dimension-picker-highlighted' ;
this.statusDiv = this._targetDoc.createElement( 'div' ) ;
this.statusDiv.className = 'dimension-picker-status' ;
this._cellsDiv = this._targetDoc.createElement( 'div' ) ;
this._picker.appendChild( this._cellsDiv ) ;
this._picker.appendChild( this.statusDiv ) ;
this._cellsDiv.appendChild( this._mouseDiv ) ;
this._cellsDiv.appendChild( this._uhDiv ) ;
this._cellsDiv.appendChild( this._hDiv ) ;
var dimensionPicker = this ;
var k = 0 ;
FCKTools.AddEventListener(this._mouseDiv, 'mousemove', function ( event ) {
var current = dimensionPicker._getCurrent( event ) ;
if ( dimensionPicker._changed(current.cols, current.rows) )
{
dimensionPicker._pick( current.cols, current.rows ) ;
}
k++ ;
});
FCKTools.AddEventListener(this._picker, 'click', function ( event ) {
var current = dimensionPicker._getCurrent( event ) ;
dimensionPicker.onPick( command, { 'cols' : current.cols, 'rows' : current.rows } ) ;
});
};
this._pick = function( cols, rows )
{
this._setDimensionInCells( this._hDiv, cols, rows ) ;
var uhCols = Math.max( this._minCols, cols ) ;
var uhRows = Math.max( this._minRows, rows ) ;
this._setDimensionInCells( this._uhDiv, uhCols, uhRows ) ;
this.statusDiv.innerHTML = rows + 'x' + cols ;
if ( FCKBrowserInfo.IsIE )
{
this._mouseDiv.style.width = this._cellsDiv.offsetWidth + 18 + 'px' ;
this._mouseDiv.style.height = this._cellsDiv.offsetHeight + 18 + 'px' ;
}
var pickerWidth = this._uhDiv.offsetWidth ;
var pickerHeight = this._uhDiv.offsetHeight + this.statusDiv.offsetHeight ;
pickerWidth += 14 ;
pickerHeight += 14;
if ( FCKBrowserInfo.IsIE )
{
this._command._Panel.Show( this._panelX, this._panelY, this._relEl, pickerWidth + 6, pickerHeight + 6 ) ;
}
else
{
this._command._Panel._IFrame.style.width = pickerWidth + 6 + 'px' ;
this._command._Panel._IFrame.style.height = pickerHeight + 6 + 'px' ;
}
this._command._Panel.MainNode.style.width = pickerWidth + 'px' ;
this._command._Panel.MainNode.style.height = pickerHeight + 'px' ;
this._picker.style.width = pickerWidth ;
this._picker.style.height = pickerHeight ;
};
this._getCurrent = function( event )
{
var offset = FCKTools.GetElementPosition( this._cellsDiv, FCKTools.GetDocumentWindow(this._targetDoc) ) ;
var mousePos = FCKTools.GetMousePosition( event ) ;
var x = mousePos.X - offset.X ;
var y = mousePos.Y - offset.Y ;
if ( x <= 0 || y <= 0 )
{
x = y = 0 ;
}
var cols = Math.ceil( x / 18.0 ) ;
var rows = Math.ceil( y / 18.0 ) ;
return { cols: cols, rows: rows } ;
};
this._changed = function( cols, rows )
{
if ( cols != this._lastCols || rows != this._lastRows )
{
this._lastCols = cols ;
this._lastRows = rows ;
return true ;
}
return false ;
};
this._init();
this._lastCols = null;
this._lastRows = null;
};
// from quirksmode.org
FCKTools.GetEventTarget = function( e )
{
var target = null ;
if ( !e )
var e = window.event ;
if ( e.target )
target = e.target ;
else if ( e.srcElement )
target = e.srcElement ;
if ( target && target.nodeType == 3 ) // defeat Safari bug
target = target.parentNode ;
return target ;
}
// from quirksmode.org
FCKTools.GetMousePosition = function( e )
{
var posx = 0 ;
var posy = 0 ;
if ( !e )
var e = window.event ;
if ( e.pageX || e.pageY )
{
posx = e.pageX ;
posy = e.pageY ;
}
else if ( e.clientX || e.clientY )
{
posx = e.clientX + document.body.scrollLeft
+ document.documentElement.scrollLeft ;
posy = e.clientY + document.body.scrollTop
+ document.documentElement.scrollTop ;
}
return { X : posx, Y : posy } ;
}
var TableDimensionPickerCommand = function( oToolbarSet )
{
this.Name = 'TableOC' ;
this.Type = 'TableOC' ;
var oWindow ;
if ( FCKBrowserInfo.IsIE )
oWindow = window ;
else if ( oToolbarSet._IFrame )
oWindow = FCKTools.GetElementWindow( oToolbarSet._IFrame ) ;
else
oWindow = window.parent ;
this._Panel = new FCKPanel( oWindow ) ;
this._Panel.AppendStyleSheet( FCKConfig.SkinEditorCSS ) ;
this._Panel.AppendStyleSheet( FCKConfig.PluginsPath + 'tableoneclick/css/style.css' ) ;
this._Panel.MainNode.className = 'FCK_Panel' ;
this._CreatePanelBody( this._Panel.Document, this._Panel.MainNode ) ;
oToolbarSet.ToolbarItems.GetItem( this.Name ).RegisterPanel( this._Panel ) ;
FCKTools.DisableSelection( this._Panel.Document.body ) ;
}
TableDimensionPickerCommand.prototype.Execute = function( panelX, panelY, relElement )
{
this._Panel.Show( panelX, panelY, relElement ) ;
this._Picker.show( panelX, panelY, relElement ) ;
}
TableDimensionPickerCommand.prototype.GetState = function()
{
if ( FCK.EditMode != FCK_EDITMODE_WYSIWYG )
return FCK_TRISTATE_DISABLED ;
return FCK_TRISTATE_OFF ;
}
function TableDimensionPickerCommand_OnClick( command, dimension )
{
if ( dimension.cols > 0 && dimension.rows > 0 )
{
FCKUndo.SaveUndoStep() ;
var oDoc = FCK.EditorDocument ;
var oTable = oDoc.createElement( 'TABLE' ) ;
oTable.style.width = '100%' ;
oTable.style.tableLayout = 'fixed' ;
oTable.setAttribute( 'cellPadding', 1 ) ;
oTable.setAttribute( 'cellSpacing', 1 ) ;
oTable.setAttribute( 'border', 1 ) ;
oTable.setAttribute( '_fckstyle', oTable.style.cssText ) ;
var oTbody = oDoc.createElement( 'TBODY' ) ;
oTable.appendChild( oTbody ) ;
for ( var i = 0 ; i < dimension.rows ; i++ )
{
var oRow = oDoc.createElement( 'TR' ) ;
oTbody.appendChild( oRow ) ;
for ( var j = 0 ; j < dimension.cols ; j++ )
{
var oCell = oDoc.createElement( 'TD' ) ;
oRow.appendChild( oCell ) ;
if ( FCKBrowserInfo.IsGeckoLike )
FCKTools.AppendBogusBr( oCell ) ;
}
}
FCK.InsertElement( oTable ) ;
}
FCK.Focus() ;
if ( dimension.cols > 0 && dimension.rows > 0 )
FCK.Events.FireEvent( 'OnSelectionChange' ) ;
command._Panel.Hide() ;
}
TableDimensionPickerCommand.prototype._CreatePanelBody = function( targetDocument, targetDiv )
{
var oDiv = targetDiv.appendChild( targetDocument.createElement( "DIV" ) ) ;
oDiv.id = 'dimension-picker' ;
this._Picker = new DimensionPicker( oDiv, this, TableDimensionPickerCommand_OnClick ) ;
}
function FCKToolbarSet_Create( overhideLocation )
{
var oToolbarSet ;
var sLocation = overhideLocation || FCKConfig.ToolbarLocation ;
switch ( sLocation )
{
case 'In' :
document.getElementById( 'xToolbarRow' ).style.display = '' ;
oToolbarSet = new FCKToolbarSet( document ) ;
break ;
case 'None' :
oToolbarSet = new FCKToolbarSet( document ) ;
break ;
// case 'OutTop' :
// Not supported.
default :
FCK.Events.AttachEvent( 'OnBlur', FCK_OnBlur ) ;
FCK.Events.AttachEvent( 'OnFocus', FCK_OnFocus ) ;
var eToolbarTarget ;
// Out:[TargetWindow]([TargetId])
var oOutMatch = sLocation.match( /^Out:(.+)\((\w+)\)$/ ) ;
if ( oOutMatch )
{
if ( FCKBrowserInfo.IsAIR )
FCKAdobeAIR.ToolbarSet_GetOutElement( window, oOutMatch ) ;
else
eToolbarTarget = eval( 'parent.' + oOutMatch[1] ).document.getElementById( oOutMatch[2] ) ;
}
else
{
// Out:[TargetId]
oOutMatch = sLocation.match( /^Out:(\w+)$/ ) ;
if ( oOutMatch )
eToolbarTarget = parent.document.getElementById( oOutMatch[1] ) ;
}
if ( !eToolbarTarget )
{
alert( 'Invalid value for "ToolbarLocation"' ) ;
return arguments.callee( 'In' );
}
// If it is a shared toolbar, it may be already available in the target element.
oToolbarSet = eToolbarTarget.__FCKToolbarSet ;
if ( oToolbarSet )
break ;
// Create the IFRAME that will hold the toolbar inside the target element.
var eToolbarIFrame = FCKTools.GetElementDocument( eToolbarTarget ).createElement( 'iframe' ) ;
eToolbarIFrame.src = 'javascript:void(0)' ;
eToolbarIFrame.frameBorder = 0 ;
eToolbarIFrame.width = '100%' ;
eToolbarIFrame.height = '10' ;
eToolbarTarget.appendChild( eToolbarIFrame ) ;
eToolbarIFrame.unselectable = 'on' ;
// Write the basic HTML for the toolbar (copy from the editor main page).
var eTargetDocument = eToolbarIFrame.contentWindow.document ;
// Workaround for Safari 12256. Ticket #63
var sBase = '' ;
if ( FCKBrowserInfo.IsSafari )
sBase = '