1
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
3
* FCKeditor - The text editor for Internet - http://www.fckeditor.net
4
* Copyright (C) 2003-2007 Frederico Caldeira Knabben
8
* Licensed under the terms of any of the following licenses at your
11
* - GNU General Public License Version 2 or later (the "GPL")
12
* http://www.gnu.org/licenses/gpl.html
14
* - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
15
* http://www.gnu.org/licenses/lgpl.html
17
* - Mozilla Public License Version 1.1 or later (the "MPL")
18
* http://www.mozilla.org/MPL/MPL-1.1.html
22
* Category dialog window.
26
<title>Categories</title>
27
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
28
<meta name="robots" content="noindex, nofollow" />
29
<script type="text/javascript">
30
var oEditor = window.parent.InnerDialogLoaded();
31
var FCK = oEditor.FCK;
32
var FCKLang = oEditor.FCKLang;
33
var FCKConfig = oEditor.FCKConfig;
34
var FCKRegexLib = oEditor.FCKRegexLib;
35
var FCKTools = oEditor.FCKTools;
36
var FCKBrowserInfo = oEditor.FCKBrowserInfo;
37
var EditorDocument = oEditor.FCK.EditorDocument;
39
document.write( '<script src="' + FCKConfig.BasePath + 'dialog/common/fck_dialog_common.js" type="text/javascript"><\/script>' );
41
window.onload = function()
43
// Translate the dialog box texts.
44
oEditor.FCKLanguageManager.TranslatePage( document );
46
// Load the selected link information (if any).
48
SetSearchMessage( FCKLang.wikiLoadingCategories || 'loading categories...' );
49
oEditor.window.parent.sajax_request_type = 'GET';
50
oEditor.window.parent.sajax_do_call( 'wfSajaxSearchCategoryFCKeditor', [], InitCategoryTree );
52
// Activate the "OK" button.
53
window.parent.SetOkButton( true );
54
window.parent.SetAutoSize( true );
59
function InitSelected()
61
selectedCats = new Array();
62
var node = EditorDocument;
65
if ( node.nodeType == 1 && node.tagName.toLowerCase() == 'a' )
67
// Get the actual Link href.
68
var sHRef = node.getAttribute( '_fcksavedurl' );
70
sHRef = node.getAttribute( 'href', 2 ) || '';
71
if ( sHRef.StartsWith( 'Category:' ) )
73
var select = GetE( 'xCategories' );
74
var cat = sHRef.slice( 9 );
75
SelectCategory( cat, -1 );
78
node = FCKTools.GetNextNode( node, EditorDocument );
82
function SelectCategory( cat, catTreeRow )
84
var select, row = parseInt( catTreeRow );
87
select = GetE( 'xWikiResults' );
88
cat = select.options[ row ].text;
90
while ( cat.charAt( lvl ) == placeholder )
92
cat = cat.slice( lvl );
93
if ( cat.charAt( 0 ) == '[' && cat.charAt( cat.length - 1 ) == ']' )
94
cat = cat.substring( 1, cat.length - 1 );
97
if ( selectedCats[ cat ] )
98
delete selectedCats[ cat ];
100
selectedCats[ cat ] = cat;
102
select = GetE( 'xCategories' );
104
while ( select.options.length > 0 )
107
for ( cat in selectedCats )
108
FCKTools.AddSelectOption( select, cat, cat );
113
function InitCategoryTree( result )
115
SetSearchMessage( FCKLang.wikiLnkStartTyping || 'start typing in the above field' );
117
catTree = new Object();
118
var levelsHead = new Array( 'root' );
119
var levelsBody = new Array( '' );
121
var results = result.responseText.Trim().split( '\n' );
122
var previousLvl = -1;
123
for ( var i = 0 ; i < results.length ; i++ )
126
while ( results[ i ].charAt( lvl ) == ' ' )
128
var t = results[ i ].slice( lvl );
129
for ( var j = previousLvl ; j > lvl - 1 ; j-- )
132
if ( levelsBody[ j + 1 ] != '' )
133
catTree[ levelsHead[ j + 1 ] ] = levelsBody[ j + 1 ];
134
delete levelsHead[ j + 1 ];
135
delete levelsBody[ j + 1 ];
137
if ( lvl > previousLvl )
138
levelsBody[ lvl ] = t;
140
levelsBody[ lvl ] = levelsBody[ lvl ] + ' ' + t;
141
levelsHead[ lvl + 1 ] = t;
142
levelsBody[ lvl + 1 ] = '';
145
for ( var j = previousLvl ; j >= -1 ; j-- )
147
if ( levelsBody[ j + 1 ] != '' )
148
catTree[ levelsHead[ j + 1 ] ] = levelsBody[ j + 1 ];
149
delete levelsHead[ j + 1 ];
150
delete levelsBody[ j + 1 ];
153
ShowCategoriesSubTree( -1 );
156
var placeholder = '.';
158
//draw category subtree
159
function ShowCategoriesSubTree( rowInTree )
161
var row = parseInt( rowInTree );
162
var select = GetE( 'xWikiResults' );
168
root = select.options[ row ].text;
170
while ( root.charAt( lvl ) == placeholder )
172
root = root.slice( lvl );
173
if ( root.charAt( 0 ) == '[' && root.charAt( root.length - 1 ) == ']' )
174
root = root.substring( 1, root.length - 1 );
175
prefix = new Array( lvl + 1 + 3 ).join( placeholder );
177
if ( !catTree[ root ] )
180
var itCount = select.options.length;
181
var itSkip = row + 1;
182
var opts = new Array();
183
for ( var i = row + 1 ; i < itCount ; i++ )
185
var t = select.options[ i ].text;
187
while ( t.charAt( sublvl ) == placeholder )
194
for ( var i = itCount - 1 ; i > row ; i-- )
196
var t = select.options[ i ].text;
201
if ( itSkip == row + 1 )
203
var cats = catTree[ root ].split( ' ' );
205
for ( var k in cats )
208
if ( catTree[ cats[ k ] ] )
210
var e = FCKTools.AddSelectOption( select, prefix + p, ++row );
211
if ( catTree[ cats[ k ] ] )
212
e.style.color = '#00f';
216
for ( var i = opts.length - 1 ; i >= 0 ; i-- )
218
var e = FCKTools.AddSelectOption( select, opts[ i ], ++row );
219
if ( opts[ i ].indexOf( '[' ) >= 0 )
220
e.style.color = '#00f';
226
function ShowFilteredCategories( filter )
228
var select = GetE( 'xWikiResults' );
229
while ( select.options.length > 0 )
231
var found = new Object();
232
if ( filter.length == 0 )
234
ShowCategoriesSubTree( -1 );
237
filter = filter.toLowerCase();
239
for ( var folder in catTree )
241
var cats = catTree[ folder ].split( ' ' );
242
for ( var k in cats )
244
var p = cats[ k ].toLowerCase();
245
if ( p.indexOf( filter ) >= 0 )
247
if ( found[ cats[ k ] ] )
251
found[ cats[ k ] ] = cats[ k ];
252
FCKTools.AddSelectOption( select, cats[ k ], ++row );
261
var select = GetE( 'txtUrl' );
262
if ( select.value.Trim() )
263
SelectCategory( select.value, -1 );
267
//#### The OK button was hit.
270
var nodes = new Array();
271
var node = EditorDocument;
277
nodeNext = FCKTools.GetNextNode( node, EditorDocument );
278
if ( node.nodeType == 1 && node.tagName.toLowerCase() == 'a' )
280
// Get the actual Link href.
281
var sHRef = node.getAttribute( '_fcksavedurl' );
283
sHRef = node.getAttribute( 'href', 2 ) || '';
284
if ( sHRef.StartsWith( 'Category:' ) )
289
for ( var i = 0 ; i < nodes.length ; i++ )
290
nodes[ i ].parentNode.removeChild( nodes[ i ] );
292
for ( var cat in selectedCats )
293
AddCategoryLink( cat );
295
CleanUpCategoryLinks();
300
function CleanUpCategoryLinks()
302
var node = EditorDocument;
306
if ( node.nodeType == 1 && node.tagName.toLowerCase() == 'a' )
308
// Get the actual Link href.
309
var sHRef = node.getAttribute( '_fcksavedurl' );
311
sHRef = node.getAttribute( 'href', 2 ) || '';
312
if ( sHRef.StartsWith( 'Category:' ) )
315
node = FCKTools.GetNextNode( node, EditorDocument );
318
for ( var i = 0; i < nodes.length ; i++ )
319
EditorDocument.body.appendChild( nodes[i] );
322
function AddCategoryLink( cat )
324
var sUri = 'Category:' + cat;
327
// If no link is selected, create a new one (it may result in more than one link creation - #220).
328
var aLinks = oEditor.FCK.CreateLink( sUri );
330
// If no selection, no links are created, so use the uri as the link text (by dom, 2006-05-26)
331
var aHasSelection = (aLinks.length > 0);
332
if ( !aHasSelection )
336
var oLinkPathRegEx = new RegExp( "//?([^?\"']+)([?].*)?$" );
337
var asLinkPath = oLinkPathRegEx.exec( sUri );
338
if ( asLinkPath != null )
339
sInnerHtml = asLinkPath[ 1 ]; // use matched path
341
// Create a new (empty) anchor.
342
aLinks = [ oEditor.FCK.InsertElement( 'a' ) ];
345
oEditor.FCKUndo.SaveUndoStep();
347
for ( var i = 0 ; i < aLinks.length ; i++ )
352
sInnerHtml = oLink.innerHTML; // Save the innerHTML (IE changes it if it is like an URL).
355
SetAttribute( oLink, '_fcksavedurl', sUri );
357
oLink.innerHTML = sInnerHtml; // Set (or restore) the innerHTML
363
//#### Called while the user types the URL.
364
function OnUrlChange()
366
var link = GetE( 'txtUrl' ).value.Trim();
367
ShowFilteredCategories( link );
371
function SetSearchMessage( message )
373
GetE( 'xWikiSearchStatus' ).innerHTML = message;
377
<body scroll="no" style="overflow: hidden">
379
<div id="divLinkTypeUrl"><span fcklang="wikiSelectedCategories">Selected categories</span><br />
380
<select id="xCategories" size="10" style="width: 100%; height: 70px"
381
ondblclick="SelectCategory( this.value,-1);">
383
<span fcklang="wikiSearchCategory">Search category</span><br />
384
<input id="txtUrl" style="width: 76%" type="text"
385
onkeyup="OnUrlChange();" /> <input id="btnNew" style="width: 22%"
386
type="button" onclick="AddNew();" value="Add new" fcklang="wikiAddNewCategory"/> <br />
387
<span fcklang="wikiCategoryTree">Category tree</span> (<span fcklang="wikiLnkStartTyping" id="xWikiSearchStatus">start typing in the
388
above field</span>)<br />
389
<select id="xWikiResults" size="10" style="width: 100%; height: 300px"
390
onclick="ShowCategoriesSubTree( this.value );"
391
ondblclick="SelectCategory('', this.value );">