FCKeditor 2.6.6
[freeside.git] / httemplate / elements / fckeditor / editor / dialog / fck_div.html
1 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" >\r
2 <!--\r
3  * FCKeditor - The text editor for Internet - http://www.fckeditor.net\r
4  * Copyright (C) 2003-2010 Frederico Caldeira Knabben\r
5  *\r
6  * == BEGIN LICENSE ==\r
7  *\r
8  * Licensed under the terms of any of the following licenses at your\r
9  * choice:\r
10  *\r
11  *  - GNU General Public License Version 2 or later (the "GPL")\r
12  *    http://www.gnu.org/licenses/gpl.html\r
13  *\r
14  *  - GNU Lesser General Public License Version 2.1 or later (the "LGPL")\r
15  *    http://www.gnu.org/licenses/lgpl.html\r
16  *\r
17  *  - Mozilla Public License Version 1.1 or later (the "MPL")\r
18  *    http://www.mozilla.org/MPL/MPL-1.1.html\r
19  *\r
20  * == END LICENSE ==\r
21  *\r
22  * Form dialog window.\r
23 -->\r
24 <html xmlns="http://www.w3.org/1999/xhtml">\r
25 <head>\r
26         <title></title>\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
43 \r
44 String.prototype.IEquals = function()\r
45 {\r
46         var thisUpper = this.toUpperCase() ;\r
47 \r
48         var aArgs = arguments ;\r
49 \r
50         // The arguments could also be a single array.\r
51         if ( aArgs.length == 1 && aArgs[0].pop )\r
52                 aArgs = aArgs[0] ;\r
53 \r
54         for ( var i = 0 ; i < aArgs.length ; i++ )\r
55         {\r
56                 if ( thisUpper == aArgs[i].toUpperCase() )\r
57                         return true ;\r
58         }\r
59         return false ;\r
60 }\r
61 \r
62 var CurrentContainers = [] ;\r
63 if ( !AlwaysCreate )\r
64 {\r
65         dialog.Selection.EnsureSelection() ;\r
66         CurrentContainers = FCKDomTools.GetSelectedDivContainers() ;\r
67 }\r
68 \r
69 // Add some tabs\r
70 dialog.AddTab( 'General', FCKLang.DlgDivGeneralTab );\r
71 dialog.AddTab( 'Advanced', FCKLang.DlgDivAdvancedTab ) ;\r
72 \r
73 function AddStyleOption( styleName )\r
74 {\r
75         var el = GetE( 'selStyle' ) ;\r
76         var opt = document.createElement( 'option' ) ;\r
77         opt.text = opt.value = styleName ;\r
78 \r
79         if ( FCKBrowserInfo.IsIE )\r
80                 el.add( opt ) ;\r
81         else\r
82                 el.add( opt, null ) ;\r
83 }\r
84 \r
85 function OnDialogTabChange( tabCode )\r
86 {\r
87         ShowE( 'divGeneral', tabCode == 'General' ) ;\r
88         ShowE( 'divAdvanced', tabCode == 'Advanced' ) ;\r
89         dialog.SetAutoSize( true ) ;\r
90 }\r
91 \r
92 function GetNearestAncestorDirection( node )\r
93 {\r
94         var dir = 'ltr' ;       // HTML default.\r
95         while ( ( node = node.parentNode ) )\r
96         {\r
97                 if ( node.dir )\r
98                         dir = node.dir ;\r
99         }\r
100         return dir ;\r
101 }\r
102 \r
103 window.onload = function()\r
104 {\r
105         // First of all, translate the dialog box texts\r
106         oEditor.FCKLanguageManager.TranslatePage(document) ;\r
107 \r
108         dialog.SetOkButton( true ) ;\r
109         dialog.SetAutoSize( true ) ;\r
110 \r
111         // Popuplate the style menu\r
112         var styles = FCKStyles.GetStyles() ;\r
113         var selectableStyles = {} ;\r
114         for ( var i in styles )\r
115         {\r
116                 if ( ! /^_FCK_/.test( i ) && styles[i].Element == 'div' )\r
117                         selectableStyles[i] = styles[i] ;\r
118         }\r
119         if ( CurrentContainers.length <= 1 )\r
120         {\r
121                 var target = CurrentContainers[0] ;\r
122                 var match = null ;\r
123                 for ( var i in selectableStyles )\r
124                 {\r
125                         if ( target && styles[i].CheckElementRemovable( target, true ) )\r
126                                 match = i ;\r
127                 }\r
128                 if ( !match )\r
129                         AddStyleOption( "" ) ;\r
130                 for ( var i in selectableStyles )\r
131                         AddStyleOption( i ) ;\r
132                 if ( match )\r
133                         GetE( 'selStyle' ).value = match ;\r
134 \r
135                 // Set the value for other inputs\r
136                 if ( target )\r
137                 {\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
144                 }\r
145         }\r
146         else\r
147         {\r
148                 GetE( 'txtId' ).disabled = true ;\r
149                 AddStyleOption( "" ) ;\r
150                 for ( var i in selectableStyles )\r
151                         AddStyleOption( i ) ;\r
152         }\r
153 }\r
154 \r
155 function CreateDiv()\r
156 {\r
157         var newBlocks = [] ;\r
158         var range = new FCKDomRange( FCK.EditorWindow ) ;\r
159         range.MoveToSelection() ;\r
160 \r
161         var bookmark = range.CreateBookmark() ;\r
162 \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
165         // $tagName.\r
166         if ( FCKBrowserInfo.IsIE )\r
167         {\r
168                 var bStart      = range.GetBookmarkNode( bookmark, true ) ;\r
169                 var bEnd        = range.GetBookmarkNode( bookmark, false ) ;\r
170 \r
171                 var cursor ;\r
172 \r
173                 if ( bStart\r
174                                 && bStart.parentNode.nodeName.IEquals( 'div' )\r
175                                 && !bStart.previousSibling )\r
176                 {\r
177                         cursor = bStart ;\r
178                         while ( ( cursor = cursor.nextSibling ) )\r
179                         {\r
180                                 if ( FCKListsLib.BlockElements[ cursor.nodeName.toLowerCase() ] )\r
181                                         FCKDomTools.MoveNode( bStart, cursor, true ) ;\r
182                         }\r
183                 }\r
184 \r
185                 if ( bEnd\r
186                                 && bEnd.parentNode.nodeName.IEquals( 'div' )\r
187                                 && !bEnd.previousSibling )\r
188                 {\r
189                         cursor = bEnd ;\r
190                         while ( ( cursor = cursor.nextSibling ) )\r
191                         {\r
192                                 if ( FCKListsLib.BlockElements[ cursor.nodeName.toLowerCase() ] )\r
193                                 {\r
194                                         if ( cursor.firstChild == bStart )\r
195                                                 FCKDomTools.InsertAfterNode( bStart, bEnd ) ;\r
196                                         else\r
197                                                 FCKDomTools.MoveNode( bEnd, cursor, true ) ;\r
198                                 }\r
199                         }\r
200                 }\r
201         }\r
202 \r
203         var iterator = new FCKDomRangeIterator( range ) ;\r
204         var block ;\r
205 \r
206         var paragraphs = [] ;\r
207         while ( ( block = iterator.GetNextParagraph() ) )\r
208                 paragraphs.push( block ) ;\r
209 \r
210         // Make sure all paragraphs have the same parent.\r
211         var commonParent = paragraphs[0].parentNode ;\r
212         var tmp = [] ;\r
213         for ( var i = 0 ; i < paragraphs.length ; i++ )\r
214         {\r
215                 block = paragraphs[i] ;\r
216                 commonParent = FCKDomTools.GetCommonParents( block.parentNode, commonParent ).pop() ;\r
217         }\r
218 \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
222 \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
227         {\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
234         }\r
235         paragraphs = tmp ;\r
236 \r
237         // Split the paragraphs into groups depending on their BlockLimit element.\r
238         var groups = [] ;\r
239         var lastBlockLimit = null ;\r
240         for ( var i = 0 ; i < paragraphs.length ; i++ )\r
241         {\r
242                 block = paragraphs[i] ;\r
243                 var elementPath = new FCKElementPath( block ) ;\r
244                 if ( elementPath.BlockLimit != lastBlockLimit )\r
245                 {\r
246                         groups.push( [] ) ;\r
247                         lastBlockLimit = elementPath.BlockLimit ;\r
248                 }\r
249                 groups[groups.length - 1].push( block ) ;\r
250         }\r
251 \r
252         // Create a DIV container for each group.\r
253         for ( var i = 0 ; i < groups.length ; i++ )\r
254         {\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
260         }\r
261 \r
262         range.MoveToBookmark( bookmark ) ;\r
263         range.Select() ;\r
264 \r
265         FCK.Focus() ;\r
266         FCK.Events.FireEvent( 'OnSelectionChange' ) ;\r
267 \r
268         return newBlocks ;\r
269 }\r
270 \r
271 function Ok()\r
272 {\r
273         oEditor.FCKUndo.SaveUndoStep() ;\r
274 \r
275         if ( CurrentContainers.length < 1 )\r
276                 CurrentContainers = CreateDiv();\r
277 \r
278         var setValue = function( attrName, inputName )\r
279         {\r
280                 var val = GetE( inputName ).value ;\r
281                 for ( var i = 0 ; i < CurrentContainers.length ; i++ )\r
282                 {\r
283                         if ( val == '' )\r
284                                 CurrentContainers[i].removeAttribute( attrName ) ;\r
285                         else\r
286                                 CurrentContainers[i].setAttribute( attrName, val ) ;\r
287                 }\r
288         }\r
289 \r
290         // Apply modifications to the DIV container according to dialog inputs.\r
291         if ( CurrentContainers.length == 1 )\r
292         {\r
293                 setValue( 'class', 'txtClass' ) ;\r
294                 setValue( 'id', 'txtId' ) ;\r
295         }\r
296         setValue( 'lang', 'txtLang' ) ;\r
297         if ( FCKBrowserInfo.IsIE )\r
298         {\r
299                 for ( var i = 0 ; i < CurrentContainers.length ; i++ )\r
300                         CurrentContainers[i].style.cssText = GetE( 'txtInlineStyle' ).value ;\r
301         }\r
302         else\r
303                 setValue( 'style', 'txtInlineStyle' ) ;\r
304         setValue( 'title', 'txtTitle' ) ;\r
305         for ( var i = 0 ; i < CurrentContainers.length ; i++ )\r
306         {\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
311                 else\r
312                         CurrentContainers[i].removeAttribute( 'dir' ) ;\r
313 \r
314                 if ( styleName )\r
315                         FCKStyles.GetStyle( styleName ).ApplyToObject( CurrentContainers[i] ) ;\r
316         }\r
317 \r
318         return true ;\r
319 }\r
320 \r
321         </script>\r
322 </head>\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
328                                 <col width="2%" />\r
329                                 <col width="49%" />\r
330                         </colgroup>\r
331                         <tr>\r
332                                 <td>\r
333                                         <span fcklang="DlgDivStyle">Style</span><br />\r
334                                         <select id="selStyle" style="width: 100%;">\r
335                                         </select>\r
336                                 </td>\r
337                                 <td>&nbsp;</td>\r
338                                 <td>\r
339                                         <span fcklang="DlgGenClass">Stylesheet Classes</span><br />\r
340                                         <input id="txtClass" style="width: 100%" type="text" />\r
341                                 </td>\r
342                         </tr>\r
343                 </table>\r
344         </div>\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
349                                 <col width="2%" />\r
350                                 <col width="49%" />\r
351                         </colgroup>\r
352                         <tr>\r
353                                 <td>\r
354                                         <span fcklang="DlgGenId">Id</span><br />\r
355                                         <input style="width: 100%" type="text" id="txtId" />\r
356                                 </td>\r
357                                 <td>&nbsp;</td>\r
358                                 <td>\r
359                                         <span fcklang="DlgGenLangCode">Language Code</span><br />\r
360                                         <input style="width: 100%" type="text" id="txtLang" />\r
361                                 </td>\r
362                         </tr>\r
363                         <tr>\r
364                                 <td colspan="3">&nbsp;</td>\r
365                         </tr>\r
366                         <tr>\r
367                                 <td colspan="3">\r
368                                         <span fcklang="DlgDivInlineStyle">Inline Style</span><br />\r
369                                         <input style="width: 100%" type="text" id="txtInlineStyle" />\r
370                                 </td>\r
371                         </tr>\r
372                         <tr>\r
373                                 <td colspan="3">&nbsp;</td>\r
374                         </tr>\r
375                         <tr>\r
376                                 <td colspan="3">\r
377                                         <span fcklang="DlgGenTitle">Advisory Title</span><br />\r
378                                         <input style="width: 100%" type="text" id="txtTitle" />\r
379                                 </td>\r
380                         </tr>\r
381                         <tr>\r
382                                 <td>&nbsp;</td>\r
383                         </tr>\r
384                         <tr>\r
385                                 <td>\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
390                                         </select>\r
391                                 </td>\r
392                         </tr>\r
393                 </table>\r
394         </div>\r
395 </body>\r
396 </html>\r