fckplugin.js
上传用户:saigedz
上传日期:2019-10-14
资源大小:997k
文件大小:18k
源码类别:

中间件编程

开发平台:

HTML/CSS

  1. var FCKDragTableHandler =
  2. {
  3. "_DragState" : 0,
  4. "_LeftCell" : null,
  5. "_RightCell" : null,
  6. "_MouseMoveMode" : 0, // 0 - find candidate cells for resizing, 1 - drag to resize
  7. "_ResizeBar" : null,
  8. "_OriginalX" : null,
  9. "_MinimumX" : null,
  10. "_MaximumX" : null,
  11. "_LastX" : null,
  12. "_TableMap" : null,
  13. "_doc" : document,
  14. "_IsInsideNode" : function( w, domNode, pos )
  15. {
  16. var myCoords = FCKTools.GetWindowPosition( w, domNode ) ;
  17. var xMin = myCoords.x ;
  18. var yMin = myCoords.y ;
  19. var xMax = parseInt( xMin, 10 ) + parseInt( domNode.offsetWidth, 10 ) ;
  20. var yMax = parseInt( yMin, 10 ) + parseInt( domNode.offsetHeight, 10 ) ;
  21. if ( pos.x >= xMin && pos.x <= xMax && pos.y >= yMin && pos.y <= yMax )
  22. return true;
  23. return false;
  24. },
  25. "_GetBorderCells" : function( w, tableNode, tableMap, mouse )
  26. {
  27. // Enumerate all the cells in the table.
  28. var cells = [] ;
  29. for ( var i = 0 ; i < tableNode.rows.length ; i++ )
  30. {
  31. var r = tableNode.rows[i] ;
  32. for ( var j = 0 ; j < r.cells.length ; j++ )
  33. cells.push( r.cells[j] ) ;
  34. }
  35. if ( cells.length < 1 )
  36. return null ;
  37. // Get the cells whose right or left border is nearest to the mouse cursor's x coordinate.
  38. var minRxDist = null ;
  39. var lxDist = null ;
  40. var minYDist = null ;
  41. var rbCell = null ;
  42. var lbCell = null ;
  43. for ( var i = 0 ; i < cells.length ; i++ )
  44. {
  45. var pos = FCKTools.GetWindowPosition( w, cells[i] ) ;
  46. var rightX = pos.x + parseInt( cells[i].clientWidth, 10 ) ;
  47. var rxDist = mouse.x - rightX ;
  48. var yDist = mouse.y - ( pos.y + ( cells[i].clientHeight / 2 ) ) ;
  49. if ( minRxDist == null ||
  50. ( Math.abs( rxDist ) <= Math.abs( minRxDist ) &&
  51.   ( minYDist == null || Math.abs( yDist ) <= Math.abs( minYDist ) ) ) )
  52. {
  53. minRxDist = rxDist ;
  54. minYDist = yDist ;
  55. rbCell = cells[i] ;
  56. }
  57. }
  58. /*
  59. var rowNode = FCKTools.GetElementAscensor( rbCell, "tr" ) ;
  60. var cellIndex = rbCell.cellIndex + 1 ;
  61. if ( cellIndex >= rowNode.cells.length )
  62. return null ;
  63. lbCell = rowNode.cells.item( cellIndex ) ;
  64. */
  65. var rowIdx = rbCell.parentNode.rowIndex ;
  66. var colIdx = FCKTableHandler._GetCellIndexSpan( tableMap, rowIdx, rbCell ) ;
  67. var colSpan = isNaN( rbCell.colSpan ) ? 1 : rbCell.colSpan ;
  68. lbCell = tableMap[rowIdx][colIdx + colSpan] ;
  69. if ( ! lbCell )
  70. return null ;
  71. // Abort if too far from the border.
  72. lxDist = mouse.x - FCKTools.GetWindowPosition( w, lbCell ).x ;
  73. if ( lxDist < 0 && minRxDist < 0 && minRxDist < -2 )
  74. return null ;
  75. if ( lxDist > 0 && minRxDist > 0 && lxDist > 3 )
  76. return null ;
  77. return { "leftCell" : rbCell, "rightCell" : lbCell } ;
  78. },
  79. "_GetResizeBarPosition" : function()
  80. {
  81. var row = FCKTools.GetElementAscensor( this._RightCell, "tr" ) ;
  82. return FCKTableHandler._GetCellIndexSpan( this._TableMap, row.rowIndex, this._RightCell ) ;
  83. },
  84. "_ResizeBarMouseDownListener" : function( evt )
  85. {
  86. if ( FCKDragTableHandler._LeftCell )
  87. FCKDragTableHandler._MouseMoveMode = 1 ;
  88. if ( FCKBrowserInfo.IsIE )
  89. FCKDragTableHandler._ResizeBar.filters.item("DXImageTransform.Microsoft.Alpha").opacity = 50 ;
  90. else
  91. FCKDragTableHandler._ResizeBar.style.opacity = 0.5 ;
  92. FCKDragTableHandler._OriginalX = evt.clientX ;
  93. // Calculate maximum and minimum x-coordinate delta.
  94. var borderIndex = FCKDragTableHandler._GetResizeBarPosition() ;
  95. var offset = FCKDragTableHandler._GetIframeOffset();
  96. var table = FCKTools.GetElementAscensor( FCKDragTableHandler._LeftCell, "table" );
  97. var minX = null ;
  98. var maxX = null ;
  99. for ( var r = 0 ; r < FCKDragTableHandler._TableMap.length ; r++ )
  100. {
  101. var leftCell = FCKDragTableHandler._TableMap[r][borderIndex - 1] ;
  102. var rightCell = FCKDragTableHandler._TableMap[r][borderIndex] ;
  103. var leftPosition = FCKTools.GetWindowPosition( FCK.EditorWindow, leftCell ) ;
  104. var rightPosition = FCKTools.GetWindowPosition( FCK.EditorWindow, rightCell ) ;
  105. var leftPadding = FCKDragTableHandler._GetCellPadding( table, leftCell ) ;
  106. var rightPadding = FCKDragTableHandler._GetCellPadding( table, rightCell ) ;
  107. if ( minX == null || leftPosition.x + leftPadding > minX )
  108. minX = leftPosition.x + leftPadding ;
  109. if ( maxX == null || rightPosition.x + rightCell.clientWidth - rightPadding < maxX )
  110. maxX = rightPosition.x + rightCell.clientWidth - rightPadding ;
  111. }
  112. FCKDragTableHandler._MinimumX = minX + offset.x ;
  113. FCKDragTableHandler._MaximumX = maxX + offset.x ;
  114. FCKDragTableHandler._LastX = null ;
  115. if (evt.preventDefault)
  116. evt.preventDefault();
  117. else
  118. evt.returnValue = false;
  119. },
  120. "_ResizeBarMouseUpListener" : function( evt )
  121. {
  122. FCKDragTableHandler._MouseMoveMode = 0 ;
  123. FCKDragTableHandler._HideResizeBar() ;
  124. if ( FCKDragTableHandler._LastX == null )
  125. return ;
  126. // Calculate the delta value.
  127. var deltaX = FCKDragTableHandler._LastX - FCKDragTableHandler._OriginalX ;
  128. // Then, build an array of current column width values.
  129. // This algorithm can be very slow if the cells have insane colSpan values. (e.g. colSpan=1000).
  130. var table = FCKTools.GetElementAscensor( FCKDragTableHandler._LeftCell, "table" ) ;
  131. var colArray = [] ;
  132. var tableMap = FCKDragTableHandler._TableMap ;
  133. for ( var i = 0 ; i < tableMap.length ; i++ )
  134. {
  135. for ( var j = 0 ; j < tableMap[i].length ; j++ )
  136. {
  137. var cell = tableMap[i][j] ;
  138. var width = FCKDragTableHandler._GetCellWidth( table, cell ) ;
  139. var colSpan = isNaN( cell.colSpan) ? 1 : cell.colSpan ;
  140. if ( colArray.length <= j )
  141. colArray.push( { width : width / colSpan, colSpan : colSpan } ) ;
  142. else
  143. {
  144. var guessItem = colArray[j] ;
  145. if ( guessItem.colSpan > colSpan )
  146. {
  147. guessItem.width = width / colSpan ;
  148. guessItem.colSpan = colSpan ;
  149. }
  150. }
  151. }
  152. }
  153. // Find out the equivalent column index of the two cells selected for resizing.
  154. colIndex = FCKDragTableHandler._GetResizeBarPosition() ;
  155. // Note that colIndex must be at least 1 here, so it's safe to subtract 1 from it.
  156. colIndex-- ;
  157. // Modify the widths in the colArray according to the mouse coordinate delta value.
  158. colArray[colIndex].width += deltaX ;
  159. colArray[colIndex + 1].width -= deltaX ;
  160. // Clear all cell widths, delete all <col> elements from the table.
  161. for ( var r = 0 ; r < table.rows.length ; r++ )
  162. {
  163. var row = table.rows.item( r ) ;
  164. for ( var c = 0 ; c < row.cells.length ; c++ )
  165. {
  166. var cell = row.cells.item( c ) ;
  167. cell.width = "" ;
  168. cell.style.width = "" ;
  169. }
  170. }
  171. var colElements = table.getElementsByTagName( "col" ) ;
  172. for ( var i = colElements.length - 1 ; i >= 0 ; i-- )
  173. colElements[i].parentNode.removeChild( colElements[i] ) ;
  174. // Set new cell widths.
  175. var processedCells = [] ;
  176. for ( var i = 0 ; i < tableMap.length ; i++ )
  177. {
  178. for ( var j = 0 ; j < tableMap[i].length ; j++ )
  179. {
  180. var cell = tableMap[i][j] ;
  181. if ( cell._Processed )
  182. continue ;
  183. if ( tableMap[i][j-1] != cell )
  184. cell.width = colArray[j].width ;
  185. else
  186. cell.width = parseInt( cell.width, 10 ) + parseInt( colArray[j].width, 10 ) ;
  187. if ( tableMap[i][j+1] != cell )
  188. {
  189. processedCells.push( cell ) ;
  190. cell._Processed = true ;
  191. }
  192. }
  193. }
  194. for ( var i = 0 ; i < processedCells.length ; i++ )
  195. {
  196. if ( FCKBrowserInfo.IsIE )
  197. processedCells[i].removeAttribute( '_Processed' ) ;
  198. else
  199. delete processedCells[i]._Processed ;
  200. }
  201. FCKDragTableHandler._LastX = null ;
  202. },
  203. "_ResizeBarMouseMoveListener" : function( evt )
  204. {
  205. if ( FCKDragTableHandler._MouseMoveMode == 0 )
  206. return FCKDragTableHandler._MouseFindHandler( FCK, evt ) ;
  207. else
  208. return FCKDragTableHandler._MouseDragHandler( FCK, evt ) ;
  209. },
  210. // Calculate the padding of a table cell.
  211. // It returns the value of paddingLeft + paddingRight of a table cell.
  212. // This function is used, in part, to calculate the width parameter that should be used for setting cell widths.
  213. // The equation in question is clientWidth = paddingLeft + paddingRight + width.
  214. // So that width = clientWidth - paddingLeft - paddingRight.
  215. // The return value of this function must be pixel accurate acorss all supported browsers, so be careful if you need to modify it.
  216. "_GetCellPadding" : function( table, cell )
  217. {
  218. var attrGuess = parseInt( table.cellPadding, 10 ) * 2 ;
  219. var cssGuess = null ;
  220. if ( typeof( window.getComputedStyle ) == "function" )
  221. {
  222. var styleObj = window.getComputedStyle( cell, null ) ;
  223. cssGuess = parseInt( styleObj.getPropertyValue( "padding-left" ), 10 ) +
  224. parseInt( styleObj.getPropertyValue( "padding-right" ), 10 ) ;
  225. }
  226. else
  227. cssGuess = parseInt( cell.currentStyle.paddingLeft, 10 ) + parseInt (cell.currentStyle.paddingRight, 10 ) ;
  228. var cssRuntime = cell.style.padding ;
  229. if ( isFinite( cssRuntime ) )
  230. cssGuess = parseInt( cssRuntime, 10 ) * 2 ;
  231. else
  232. {
  233. cssRuntime = cell.style.paddingLeft ;
  234. if ( isFinite( cssRuntime ) )
  235. cssGuess = parseInt( cssRuntime, 10 ) ;
  236. cssRuntime = cell.style.paddingRight ;
  237. if ( isFinite( cssRuntime ) )
  238. cssGuess += parseInt( cssRuntime, 10 ) ;
  239. }
  240. attrGuess = parseInt( attrGuess, 10 ) ;
  241. cssGuess = parseInt( cssGuess, 10 ) ;
  242. if ( isNaN( attrGuess ) )
  243. attrGuess = 0 ;
  244. if ( isNaN( cssGuess ) )
  245. cssGuess = 0 ;
  246. return Math.max( attrGuess, cssGuess ) ;
  247. },
  248. // Calculate the real width of the table cell.
  249. // 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
  250. // that, the table cell should be of exactly the same width as before.
  251. // The real width of a table cell can be calculated as:
  252. // width = clientWidth - paddingLeft - paddingRight.
  253. "_GetCellWidth" : function( table, cell )
  254. {
  255. var clientWidth = cell.clientWidth ;
  256. if ( isNaN( clientWidth ) )
  257. clientWidth = 0 ;
  258. return clientWidth - this._GetCellPadding( table, cell ) ;
  259. },
  260. "MouseMoveListener" : function( FCK, evt )
  261. {
  262. if ( FCKDragTableHandler._MouseMoveMode == 0 )
  263. return FCKDragTableHandler._MouseFindHandler( FCK, evt ) ;
  264. else
  265. return FCKDragTableHandler._MouseDragHandler( FCK, evt ) ;
  266. },
  267. "_MouseFindHandler" : function( FCK, evt )
  268. {
  269. if ( FCK.MouseDownFlag )
  270. return ;
  271. var node = evt.srcElement || evt.target ;
  272. try
  273. {
  274. if ( ! node || node.nodeType != 1 )
  275. {
  276. this._HideResizeBar() ;
  277. return ;
  278. }
  279. }
  280. catch ( e )
  281. {
  282. this._HideResizeBar() ;
  283. return ;
  284. }
  285. // Since this function might be called from the editing area iframe or the outer fckeditor iframe,
  286. // the mouse point coordinates from evt.clientX/Y can have different reference points.
  287. // We need to resolve the mouse pointer position relative to the editing area iframe.
  288. var mouseX = evt.clientX ;
  289. var mouseY = evt.clientY ;
  290. if ( FCKTools.GetElementDocument( node ) == document )
  291. {
  292. var offset = this._GetIframeOffset() ;
  293. mouseX -= offset.x ;
  294. mouseY -= offset.y ;
  295. }
  296. if ( this._ResizeBar && this._LeftCell )
  297. {
  298. var leftPos = FCKTools.GetWindowPosition( FCK.EditorWindow, this._LeftCell ) ;
  299. var rightPos = FCKTools.GetWindowPosition( FCK.EditorWindow, this._RightCell ) ;
  300. var rxDist = mouseX - ( leftPos.x + this._LeftCell.clientWidth ) ;
  301. var lxDist = mouseX - rightPos.x ;
  302. var inRangeFlag = false ;
  303. if ( lxDist >= 0 && rxDist <= 0 )
  304. inRangeFlag = true ;
  305. else if ( rxDist > 0 && lxDist <= 3 )
  306. inRangeFlag = true ;
  307. else if ( lxDist < 0 && rxDist >= -2 )
  308. inRangeFlag = true ;
  309. if ( inRangeFlag )
  310. {
  311. this._ShowResizeBar( FCK.EditorWindow,
  312. FCKTools.GetElementAscensor( this._LeftCell, "table" ),
  313. { "x" : mouseX, "y" : mouseY } ) ;
  314. return ;
  315. }
  316. }
  317. var tagName = node.tagName.toLowerCase() ;
  318. if ( tagName != "table" && tagName != "td" && tagName != "th" )
  319. {
  320. if ( this._LeftCell )
  321. this._LeftCell = this._RightCell = this._TableMap = null ;
  322. this._HideResizeBar() ;
  323. return ;
  324. }
  325. node = FCKTools.GetElementAscensor( node, "table" ) ;
  326. var tableMap = FCKTableHandler._CreateTableMap( node ) ;
  327. var cellTuple = this._GetBorderCells( FCK.EditorWindow, node, tableMap, { "x" : mouseX, "y" : mouseY } ) ;
  328. if ( cellTuple == null )
  329. {
  330. if ( this._LeftCell )
  331. this._LeftCell = this._RightCell = this._TableMap = null ;
  332. this._HideResizeBar() ;
  333. }
  334. else
  335. {
  336. this._LeftCell = cellTuple["leftCell"] ;
  337. this._RightCell = cellTuple["rightCell"] ;
  338. this._TableMap = tableMap ;
  339. this._ShowResizeBar( FCK.EditorWindow,
  340. FCKTools.GetElementAscensor( this._LeftCell, "table" ),
  341. { "x" : mouseX, "y" : mouseY } ) ;
  342. }
  343. },
  344. "_MouseDragHandler" : function( FCK, evt )
  345. {
  346. var mouse = { "x" : evt.clientX, "y" : evt.clientY } ;
  347. // Convert mouse coordinates in reference to the outer iframe.
  348. var node = evt.srcElement || evt.target ;
  349. if ( FCKTools.GetElementDocument( node ) == FCK.EditorDocument )
  350. {
  351. var offset = this._GetIframeOffset() ;
  352. mouse.x += offset.x ;
  353. mouse.y += offset.y ;
  354. }
  355. // Calculate the mouse position delta and see if we've gone out of range.
  356. if ( mouse.x >= this._MaximumX - 5 )
  357. mouse.x = this._MaximumX - 5 ;
  358. if ( mouse.x <= this._MinimumX + 5 )
  359. mouse.x = this._MinimumX + 5 ;
  360. var docX = mouse.x + FCKTools.GetScrollPosition( window ).X ;
  361. this._ResizeBar.style.left = ( docX - this._ResizeBar.offsetWidth / 2 ) + "px" ;
  362. this._LastX = mouse.x ;
  363. },
  364. "_ShowResizeBar" : function( w, table, mouse )
  365. {
  366. if ( this._ResizeBar == null )
  367. {
  368. this._ResizeBar = this._doc.createElement( "div" ) ;
  369. var paddingBar = this._ResizeBar ;
  370. var paddingStyles = { 'position' : 'absolute', 'cursor' : 'e-resize' } ;
  371. if ( FCKBrowserInfo.IsIE )
  372. paddingStyles.filter = "progid:DXImageTransform.Microsoft.Alpha(opacity=10,enabled=true)" ;
  373. else
  374. paddingStyles.opacity = 0.10 ;
  375. FCKDomTools.SetElementStyles( paddingBar, paddingStyles ) ;
  376. this._avoidStyles( paddingBar );
  377. paddingBar.setAttribute('_fcktemp', true);
  378. this._doc.body.appendChild( paddingBar ) ;
  379. FCKTools.AddEventListener( paddingBar, "mousemove", this._ResizeBarMouseMoveListener ) ;
  380. FCKTools.AddEventListener( paddingBar, "mousedown", this._ResizeBarMouseDownListener ) ;
  381. FCKTools.AddEventListener( document, "mouseup", this._ResizeBarMouseUpListener ) ;
  382. FCKTools.AddEventListener( FCK.EditorDocument, "mouseup", this._ResizeBarMouseUpListener ) ;
  383. // IE doesn't let the tranparent part of the padding block to receive mouse events unless there's something inside.
  384. // So we need to create a spacer image to fill the block up.
  385. var filler = this._doc.createElement( "img" ) ;
  386. filler.setAttribute('_fcktemp', true);
  387. filler.border = 0 ;
  388. filler.src = FCKConfig.BasePath + "images/spacer.gif" ;
  389. filler.style.position = "absolute" ;
  390. paddingBar.appendChild( filler ) ;
  391. // Disable drag and drop, and selection for the filler image.
  392. var disabledListener = function( evt )
  393. {
  394. if ( evt.preventDefault )
  395. evt.preventDefault() ;
  396. else
  397. evt.returnValue = false ;
  398. }
  399. FCKTools.AddEventListener( filler, "dragstart", disabledListener ) ;
  400. FCKTools.AddEventListener( filler, "selectstart", disabledListener ) ;
  401. }
  402. var paddingBar = this._ResizeBar ;
  403. var offset = this._GetIframeOffset() ;
  404. var tablePos = this._GetTablePosition( w, table ) ;
  405. var barHeight = table.offsetHeight ;
  406. var barTop = offset.y + tablePos.y ;
  407. // Do not let the resize bar intrude into the toolbar area.
  408. if ( tablePos.y < 0 )
  409. {
  410. barHeight += tablePos.y ;
  411. barTop -= tablePos.y ;
  412. }
  413. var bw = parseInt( table.border, 10 ) ;
  414. if ( isNaN( bw ) )
  415. bw = 0 ;
  416. var cs = parseInt( table.cellSpacing, 10 ) ;
  417. if ( isNaN( cs ) )
  418. cs = 0 ;
  419. var barWidth = Math.max( bw+100, cs+100 ) ;
  420. var paddingStyles =
  421. {
  422. 'top' : barTop + 'px',
  423. 'height' : barHeight + 'px',
  424. 'width' : barWidth + 'px',
  425. 'left' : ( offset.x + mouse.x + FCKTools.GetScrollPosition( w ).X - barWidth / 2 ) + 'px'
  426. } ;
  427. if ( FCKBrowserInfo.IsIE )
  428. paddingBar.filters.item("DXImageTransform.Microsoft.Alpha").opacity = 10 ;
  429. else
  430. paddingStyles.opacity = 0.1 ;
  431. FCKDomTools.SetElementStyles( paddingBar, paddingStyles ) ;
  432. var filler = paddingBar.getElementsByTagName( "img" )[0] ;
  433. FCKDomTools.SetElementStyles( filler,
  434. {
  435. width : paddingBar.offsetWidth + 'px',
  436. height : barHeight + 'px'
  437. } ) ;
  438. barWidth = Math.max( bw, cs, 3 ) ;
  439. var visibleBar = null ;
  440. if ( paddingBar.getElementsByTagName( "div" ).length < 1 )
  441. {
  442. visibleBar = this._doc.createElement( "div" ) ;
  443. this._avoidStyles( visibleBar );
  444. visibleBar.setAttribute('_fcktemp', true);
  445. paddingBar.appendChild( visibleBar ) ;
  446. }
  447. else
  448. visibleBar = paddingBar.getElementsByTagName( "div" )[0] ;
  449. FCKDomTools.SetElementStyles( visibleBar,
  450. {
  451. position : 'absolute',
  452. backgroundColor : 'blue',
  453. width : barWidth + 'px',
  454. height : barHeight + 'px',
  455. left : '50px',
  456. top : '0px'
  457. } ) ;
  458. },
  459. "_HideResizeBar" : function()
  460. {
  461. if ( this._ResizeBar )
  462. // IE bug: display : none does not hide the resize bar for some reason.
  463. // so set the position to somewhere invisible.
  464. FCKDomTools.SetElementStyles( this._ResizeBar,
  465. {
  466. top : '-100000px',
  467. left : '-100000px'
  468. } ) ;
  469. },
  470. "_GetIframeOffset" : function ()
  471. {
  472. return FCKTools.GetDocumentPosition( window, FCK.EditingArea.IFrame ) ;
  473. },
  474. "_GetTablePosition" : function ( w, table )
  475. {
  476. return FCKTools.GetWindowPosition( w, table ) ;
  477. },
  478. "_avoidStyles" : function( element )
  479. {
  480. FCKDomTools.SetElementStyles( element,
  481. {
  482. padding : '0',
  483. backgroundImage : 'none',
  484. border : '0'
  485. } ) ;
  486. }
  487. };
  488. FCK.Events.AttachEvent( "OnMouseMove", FCKDragTableHandler.MouseMoveListener ) ;