1 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" >
\r
3 * FCKeditor - The text editor for Internet - http://www.fckeditor.net
\r
4 * Copyright (C) 2003-2010 Frederico Caldeira Knabben
\r
6 * == BEGIN LICENSE ==
\r
8 * Licensed under the terms of any of the following licenses at your
\r
11 * - GNU General Public License Version 2 or later (the "GPL")
\r
12 * http://www.gnu.org/licenses/gpl.html
\r
14 * - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
\r
15 * http://www.gnu.org/licenses/lgpl.html
\r
17 * - Mozilla Public License Version 1.1 or later (the "MPL")
\r
18 * http://www.mozilla.org/MPL/MPL-1.1.html
\r
22 * Form dialog window.
\r
24 <html xmlns="http://www.w3.org/1999/xhtml">
\r
27 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
\r
28 <meta content="noindex, nofollow" name="robots" />
\r
29 <script src="common/fck_dialog_common.js" type="text/javascript"></script>
\r
30 <script type="text/javascript">
\r
31 var dialog = window.parent ;
\r
32 var oEditor = dialog.InnerDialogLoaded() ;
\r
33 var FCK = oEditor.FCK ;
\r
34 var FCKLang = oEditor.FCKLang ;
\r
35 var FCKBrowserInfo = oEditor.FCKBrowserInfo ;
\r
36 var FCKStyles = oEditor.FCKStyles ;
\r
37 var FCKElementPath = oEditor.FCKElementPath ;
\r
38 var FCKDomRange = oEditor.FCKDomRange ;
\r
39 var FCKDomTools = oEditor.FCKDomTools ;
\r
40 var FCKDomRangeIterator = oEditor.FCKDomRangeIterator ;
\r
41 var FCKListsLib = oEditor.FCKListsLib ;
\r
42 var AlwaysCreate = dialog.Args().CustomValue ;
\r
44 String.prototype.IEquals = function()
\r
46 var thisUpper = this.toUpperCase() ;
\r
48 var aArgs = arguments ;
\r
50 // The arguments could also be a single array.
\r
51 if ( aArgs.length == 1 && aArgs[0].pop )
\r
54 for ( var i = 0 ; i < aArgs.length ; i++ )
\r
56 if ( thisUpper == aArgs[i].toUpperCase() )
\r
62 var CurrentContainers = [] ;
\r
63 if ( !AlwaysCreate )
\r
65 dialog.Selection.EnsureSelection() ;
\r
66 CurrentContainers = FCKDomTools.GetSelectedDivContainers() ;
\r
70 dialog.AddTab( 'General', FCKLang.DlgDivGeneralTab );
\r
71 dialog.AddTab( 'Advanced', FCKLang.DlgDivAdvancedTab ) ;
\r
73 function AddStyleOption( styleName )
\r
75 var el = GetE( 'selStyle' ) ;
\r
76 var opt = document.createElement( 'option' ) ;
\r
77 opt.text = opt.value = styleName ;
\r
79 if ( FCKBrowserInfo.IsIE )
\r
82 el.add( opt, null ) ;
\r
85 function OnDialogTabChange( tabCode )
\r
87 ShowE( 'divGeneral', tabCode == 'General' ) ;
\r
88 ShowE( 'divAdvanced', tabCode == 'Advanced' ) ;
\r
89 dialog.SetAutoSize( true ) ;
\r
92 function GetNearestAncestorDirection( node )
\r
94 var dir = 'ltr' ; // HTML default.
\r
95 while ( ( node = node.parentNode ) )
\r
103 window.onload = function()
\r
105 // First of all, translate the dialog box texts
\r
106 oEditor.FCKLanguageManager.TranslatePage(document) ;
\r
108 dialog.SetOkButton( true ) ;
\r
109 dialog.SetAutoSize( true ) ;
\r
111 // Popuplate the style menu
\r
112 var styles = FCKStyles.GetStyles() ;
\r
113 var selectableStyles = {} ;
\r
114 for ( var i in styles )
\r
116 if ( ! /^_FCK_/.test( i ) && styles[i].Element == 'div' )
\r
117 selectableStyles[i] = styles[i] ;
\r
119 if ( CurrentContainers.length <= 1 )
\r
121 var target = CurrentContainers[0] ;
\r
123 for ( var i in selectableStyles )
\r
125 if ( target && styles[i].CheckElementRemovable( target, true ) )
\r
129 AddStyleOption( "" ) ;
\r
130 for ( var i in selectableStyles )
\r
131 AddStyleOption( i ) ;
\r
133 GetE( 'selStyle' ).value = match ;
\r
135 // Set the value for other inputs
\r
138 GetE( 'txtClass' ).value = target.className ;
\r
139 GetE( 'txtId' ).value = target.id ;
\r
140 GetE( 'txtLang' ).value = target.lang ;
\r
141 GetE( 'txtInlineStyle').value = target.style.cssText ;
\r
142 GetE( 'txtTitle' ).value = target.title ;
\r
143 GetE( 'selLangDir').value = target.dir || GetNearestAncestorDirection( target ) ;
\r
148 GetE( 'txtId' ).disabled = true ;
\r
149 AddStyleOption( "" ) ;
\r
150 for ( var i in selectableStyles )
\r
151 AddStyleOption( i ) ;
\r
155 function CreateDiv()
\r
157 var newBlocks = [] ;
\r
158 var range = new FCKDomRange( FCK.EditorWindow ) ;
\r
159 range.MoveToSelection() ;
\r
161 var bookmark = range.CreateBookmark() ;
\r
163 // Kludge for #1592: if the bookmark nodes are in the beginning of
\r
164 // $tagName, then move them to the nearest block element in the
\r
166 if ( FCKBrowserInfo.IsIE )
\r
168 var bStart = range.GetBookmarkNode( bookmark, true ) ;
\r
169 var bEnd = range.GetBookmarkNode( bookmark, false ) ;
\r
174 && bStart.parentNode.nodeName.IEquals( 'div' )
\r
175 && !bStart.previousSibling )
\r
178 while ( ( cursor = cursor.nextSibling ) )
\r
180 if ( FCKListsLib.BlockElements[ cursor.nodeName.toLowerCase() ] )
\r
181 FCKDomTools.MoveNode( bStart, cursor, true ) ;
\r
186 && bEnd.parentNode.nodeName.IEquals( 'div' )
\r
187 && !bEnd.previousSibling )
\r
190 while ( ( cursor = cursor.nextSibling ) )
\r
192 if ( FCKListsLib.BlockElements[ cursor.nodeName.toLowerCase() ] )
\r
194 if ( cursor.firstChild == bStart )
\r
195 FCKDomTools.InsertAfterNode( bStart, bEnd ) ;
\r
197 FCKDomTools.MoveNode( bEnd, cursor, true ) ;
\r
203 var iterator = new FCKDomRangeIterator( range ) ;
\r
206 var paragraphs = [] ;
\r
207 while ( ( block = iterator.GetNextParagraph() ) )
\r
208 paragraphs.push( block ) ;
\r
210 // Make sure all paragraphs have the same parent.
\r
211 var commonParent = paragraphs[0].parentNode ;
\r
213 for ( var i = 0 ; i < paragraphs.length ; i++ )
\r
215 block = paragraphs[i] ;
\r
216 commonParent = FCKDomTools.GetCommonParents( block.parentNode, commonParent ).pop() ;
\r
219 // The common parent must not be the following tags: table, tbody, tr, ol, ul.
\r
220 while ( commonParent.nodeName.IEquals( 'table', 'tbody', 'tr', 'ol', 'ul' ) )
\r
221 commonParent = commonParent.parentNode ;
\r
223 // Reconstruct the block list to be processed such that all resulting blocks
\r
224 // satisfy parentNode == commonParent.
\r
225 var lastBlock = null ;
\r
226 while ( paragraphs.length > 0 )
\r
228 block = paragraphs.shift() ;
\r
229 while ( block.parentNode != commonParent )
\r
230 block = block.parentNode ;
\r
231 if ( block != lastBlock )
\r
232 tmp.push( block ) ;
\r
233 lastBlock = block ;
\r
237 // Split the paragraphs into groups depending on their BlockLimit element.
\r
239 var lastBlockLimit = null ;
\r
240 for ( var i = 0 ; i < paragraphs.length ; i++ )
\r
242 block = paragraphs[i] ;
\r
243 var elementPath = new FCKElementPath( block ) ;
\r
244 if ( elementPath.BlockLimit != lastBlockLimit )
\r
246 groups.push( [] ) ;
\r
247 lastBlockLimit = elementPath.BlockLimit ;
\r
249 groups[groups.length - 1].push( block ) ;
\r
252 // Create a DIV container for each group.
\r
253 for ( var i = 0 ; i < groups.length ; i++ )
\r
255 var divNode = FCK.EditorDocument.createElement( 'div' ) ;
\r
256 groups[i][0].parentNode.insertBefore( divNode, groups[i][0] ) ;
\r
257 for ( var j = 0 ; j < groups[i].length ; j++ )
\r
258 FCKDomTools.MoveNode( groups[i][j], divNode ) ;
\r
259 newBlocks.push( divNode ) ;
\r
262 range.MoveToBookmark( bookmark ) ;
\r
266 FCK.Events.FireEvent( 'OnSelectionChange' ) ;
\r
273 oEditor.FCKUndo.SaveUndoStep() ;
\r
275 if ( CurrentContainers.length < 1 )
\r
276 CurrentContainers = CreateDiv();
\r
278 var setValue = function( attrName, inputName )
\r
280 var val = GetE( inputName ).value ;
\r
281 for ( var i = 0 ; i < CurrentContainers.length ; i++ )
\r
284 CurrentContainers[i].removeAttribute( attrName ) ;
\r
286 CurrentContainers[i].setAttribute( attrName, val ) ;
\r
290 // Apply modifications to the DIV container according to dialog inputs.
\r
291 if ( CurrentContainers.length == 1 )
\r
293 setValue( 'class', 'txtClass' ) ;
\r
294 setValue( 'id', 'txtId' ) ;
\r
296 setValue( 'lang', 'txtLang' ) ;
\r
297 if ( FCKBrowserInfo.IsIE )
\r
299 for ( var i = 0 ; i < CurrentContainers.length ; i++ )
\r
300 CurrentContainers[i].style.cssText = GetE( 'txtInlineStyle' ).value ;
\r
303 setValue( 'style', 'txtInlineStyle' ) ;
\r
304 setValue( 'title', 'txtTitle' ) ;
\r
305 for ( var i = 0 ; i < CurrentContainers.length ; i++ )
\r
307 var dir = GetE( 'selLangDir' ).value ;
\r
308 var styleName = GetE( 'selStyle' ).value ;
\r
309 if ( GetNearestAncestorDirection( CurrentContainers[i] ) != dir )
\r
310 CurrentContainers[i].dir = dir ;
\r
312 CurrentContainers[i].removeAttribute( 'dir' ) ;
\r
315 FCKStyles.GetStyle( styleName ).ApplyToObject( CurrentContainers[i] ) ;
\r
323 <body style="overflow: hidden">
\r
324 <div id="divGeneral">
\r
325 <table cellspacing="0" cellpadding="0" width="100%" border="0">
\r
326 <colgroup span="2">
\r
327 <col width="49%" />
\r
329 <col width="49%" />
\r
333 <span fcklang="DlgDivStyle">Style</span><br />
\r
334 <select id="selStyle" style="width: 100%;">
\r
339 <span fcklang="DlgGenClass">Stylesheet Classes</span><br />
\r
340 <input id="txtClass" style="width: 100%" type="text" />
\r
345 <div id="divAdvanced" style="display: none">
\r
346 <table cellspacing="0" cellpadding="0" width="100%" border="0">
\r
347 <colgroup span="2">
\r
348 <col width="49%" />
\r
350 <col width="49%" />
\r
354 <span fcklang="DlgGenId">Id</span><br />
\r
355 <input style="width: 100%" type="text" id="txtId" />
\r
359 <span fcklang="DlgGenLangCode">Language Code</span><br />
\r
360 <input style="width: 100%" type="text" id="txtLang" />
\r
364 <td colspan="3"> </td>
\r
368 <span fcklang="DlgDivInlineStyle">Inline Style</span><br />
\r
369 <input style="width: 100%" type="text" id="txtInlineStyle" />
\r
373 <td colspan="3"> </td>
\r
377 <span fcklang="DlgGenTitle">Advisory Title</span><br />
\r
378 <input style="width: 100%" type="text" id="txtTitle" />
\r
386 <span fcklang="DlgGenLangDir">Language Direction</span><br />
\r
387 <select id="selLangDir">
\r
388 <option fcklang="DlgGenLangDirLtr" value="ltr">Left to Right (LTR)
\r
389 <option fcklang="DlgGenLangDirRtl" value="rtl">Right to Left (RTL)
\r