Browse code

TinyMCE version directories relocated to /tinymce/ directory, each with its own version numbers: 2, 3, 4 - Slight naming tweak to TinyMCE dropdown in site settings

Clarissa Walker authored on 2026/07/27 13:46:03
Showing 1 changed files
1 1
deleted file mode 100644
... ...
@@ -1,539 +0,0 @@
1
-/* Functions for the advlink plugin popup */
2
-
3
-tinyMCEPopup.requireLangPack();
4
-
5
-var templates = {
6
-	"window.open" : "window.open('${url}','${target}','${options}')"
7
-};
8
-
9
-function preinit() {
10
-	var url;
11
-
12
-	if (url = tinyMCEPopup.getParam("external_link_list_url"))
13
-		document.write('<script language="javascript" type="text/javascript" src="' + tinyMCEPopup.editor.documentBaseURI.toAbsolute(url) + '"></script>');
14
-}
15
-
16
-function changeClass() {
17
-	var f = document.forms[0];
18
-
19
-	f.classes.value = getSelectValue(f, 'classlist');
20
-}
21
-
22
-function init() {
23
-	tinyMCEPopup.resizeToInnerSize();
24
-
25
-	var formObj = document.forms[0];
26
-	var inst = tinyMCEPopup.editor;
27
-	var elm = inst.selection.getNode();
28
-	var action = "insert";
29
-	var html;
30
-
31
-	document.getElementById('hrefbrowsercontainer').innerHTML = getBrowserHTML('hrefbrowser','href','file','advlink');
32
-	document.getElementById('popupurlbrowsercontainer').innerHTML = getBrowserHTML('popupurlbrowser','popupurl','file','advlink');
33
-	document.getElementById('targetlistcontainer').innerHTML = getTargetListHTML('targetlist','target');
34
-
35
-	// Link list
36
-	html = getLinkListHTML('linklisthref','href');
37
-	if (html == "")
38
-		document.getElementById("linklisthrefrow").style.display = 'none';
39
-	else
40
-		document.getElementById("linklisthrefcontainer").innerHTML = html;
41
-
42
-	// Anchor list
43
-	html = getAnchorListHTML('anchorlist','href');
44
-	if (html == "")
45
-		document.getElementById("anchorlistrow").style.display = 'none';
46
-	else
47
-		document.getElementById("anchorlistcontainer").innerHTML = html;
48
-
49
-	// Resize some elements
50
-	if (isVisible('hrefbrowser'))
51
-		document.getElementById('href').style.width = '260px';
52
-
53
-	if (isVisible('popupurlbrowser'))
54
-		document.getElementById('popupurl').style.width = '180px';
55
-
56
-	elm = inst.dom.getParent(elm, "A");
57
-	if (elm == null) {
58
-		var prospect = inst.dom.create("p", null, inst.selection.getContent());
59
-		if (prospect.childNodes.length === 1) {
60
-			elm = prospect.firstChild;
61
-		}
62
-	}
63
-
64
-	if (elm != null && elm.nodeName == "A")
65
-		action = "update";
66
-
67
-	formObj.insert.value = tinyMCEPopup.getLang(action, 'Insert', true); 
68
-
69
-	setPopupControlsDisabled(true);
70
-
71
-	if (action == "update") {
72
-		var href = inst.dom.getAttrib(elm, 'href');
73
-		var onclick = inst.dom.getAttrib(elm, 'onclick');
74
-
75
-		// Setup form data
76
-		setFormValue('href', href);
77
-		setFormValue('title', inst.dom.getAttrib(elm, 'title'));
78
-		setFormValue('id', inst.dom.getAttrib(elm, 'id'));
79
-		setFormValue('style', inst.dom.getAttrib(elm, "style"));
80
-		setFormValue('rel', inst.dom.getAttrib(elm, 'rel'));
81
-		setFormValue('rev', inst.dom.getAttrib(elm, 'rev'));
82
-		setFormValue('charset', inst.dom.getAttrib(elm, 'charset'));
83
-		setFormValue('hreflang', inst.dom.getAttrib(elm, 'hreflang'));
84
-		setFormValue('dir', inst.dom.getAttrib(elm, 'dir'));
85
-		setFormValue('lang', inst.dom.getAttrib(elm, 'lang'));
86
-		setFormValue('tabindex', inst.dom.getAttrib(elm, 'tabindex', typeof(elm.tabindex) != "undefined" ? elm.tabindex : ""));
87
-		setFormValue('accesskey', inst.dom.getAttrib(elm, 'accesskey', typeof(elm.accesskey) != "undefined" ? elm.accesskey : ""));
88
-		setFormValue('type', inst.dom.getAttrib(elm, 'type'));
89
-		setFormValue('onfocus', inst.dom.getAttrib(elm, 'onfocus'));
90
-		setFormValue('onblur', inst.dom.getAttrib(elm, 'onblur'));
91
-		setFormValue('onclick', onclick);
92
-		setFormValue('ondblclick', inst.dom.getAttrib(elm, 'ondblclick'));
93
-		setFormValue('onmousedown', inst.dom.getAttrib(elm, 'onmousedown'));
94
-		setFormValue('onmouseup', inst.dom.getAttrib(elm, 'onmouseup'));
95
-		setFormValue('onmouseover', inst.dom.getAttrib(elm, 'onmouseover'));
96
-		setFormValue('onmousemove', inst.dom.getAttrib(elm, 'onmousemove'));
97
-		setFormValue('onmouseout', inst.dom.getAttrib(elm, 'onmouseout'));
98
-		setFormValue('onkeypress', inst.dom.getAttrib(elm, 'onkeypress'));
99
-		setFormValue('onkeydown', inst.dom.getAttrib(elm, 'onkeydown'));
100
-		setFormValue('onkeyup', inst.dom.getAttrib(elm, 'onkeyup'));
101
-		setFormValue('target', inst.dom.getAttrib(elm, 'target'));
102
-		setFormValue('classes', inst.dom.getAttrib(elm, 'class'));
103
-
104
-		// Parse onclick data
105
-		if (onclick != null && onclick.indexOf('window.open') != -1)
106
-			parseWindowOpen(onclick);
107
-		else
108
-			parseFunction(onclick);
109
-
110
-		// Select by the values
111
-		selectByValue(formObj, 'dir', inst.dom.getAttrib(elm, 'dir'));
112
-		selectByValue(formObj, 'rel', inst.dom.getAttrib(elm, 'rel'));
113
-		selectByValue(formObj, 'rev', inst.dom.getAttrib(elm, 'rev'));
114
-		selectByValue(formObj, 'linklisthref', href);
115
-
116
-		if (href.charAt(0) == '#')
117
-			selectByValue(formObj, 'anchorlist', href);
118
-
119
-		addClassesToList('classlist', 'advlink_styles');
120
-
121
-		selectByValue(formObj, 'classlist', inst.dom.getAttrib(elm, 'class'), true);
122
-		selectByValue(formObj, 'targetlist', inst.dom.getAttrib(elm, 'target'), true);
123
-	} else
124
-		addClassesToList('classlist', 'advlink_styles');
125
-}
126
-
127
-function checkPrefix(n) {
128
-	if (n.value && Validator.isEmail(n) && !/^\s*mailto:/i.test(n.value) && confirm(tinyMCEPopup.getLang('advlink_dlg.is_email')))
129
-		n.value = 'mailto:' + n.value;
130
-
131
-	if (/^\s*www\./i.test(n.value) && confirm(tinyMCEPopup.getLang('advlink_dlg.is_external')))
132
-		n.value = 'http://' + n.value;
133
-}
134
-
135
-function setFormValue(name, value) {
136
-	document.forms[0].elements[name].value = value;
137
-}
138
-
139
-function parseWindowOpen(onclick) {
140
-	var formObj = document.forms[0];
141
-
142
-	// Preprocess center code
143
-	if (onclick.indexOf('return false;') != -1) {
144
-		formObj.popupreturn.checked = true;
145
-		onclick = onclick.replace('return false;', '');
146
-	} else
147
-		formObj.popupreturn.checked = false;
148
-
149
-	var onClickData = parseLink(onclick);
150
-
151
-	if (onClickData != null) {
152
-		formObj.ispopup.checked = true;
153
-		setPopupControlsDisabled(false);
154
-
155
-		var onClickWindowOptions = parseOptions(onClickData['options']);
156
-		var url = onClickData['url'];
157
-
158
-		formObj.popupname.value = onClickData['target'];
159
-		formObj.popupurl.value = url;
160
-		formObj.popupwidth.value = getOption(onClickWindowOptions, 'width');
161
-		formObj.popupheight.value = getOption(onClickWindowOptions, 'height');
162
-
163
-		formObj.popupleft.value = getOption(onClickWindowOptions, 'left');
164
-		formObj.popuptop.value = getOption(onClickWindowOptions, 'top');
165
-
166
-		if (formObj.popupleft.value.indexOf('screen') != -1)
167
-			formObj.popupleft.value = "c";
168
-
169
-		if (formObj.popuptop.value.indexOf('screen') != -1)
170
-			formObj.popuptop.value = "c";
171
-
172
-		formObj.popuplocation.checked = getOption(onClickWindowOptions, 'location') == "yes";
173
-		formObj.popupscrollbars.checked = getOption(onClickWindowOptions, 'scrollbars') == "yes";
174
-		formObj.popupmenubar.checked = getOption(onClickWindowOptions, 'menubar') == "yes";
175
-		formObj.popupresizable.checked = getOption(onClickWindowOptions, 'resizable') == "yes";
176
-		formObj.popuptoolbar.checked = getOption(onClickWindowOptions, 'toolbar') == "yes";
177
-		formObj.popupstatus.checked = getOption(onClickWindowOptions, 'status') == "yes";
178
-		formObj.popupdependent.checked = getOption(onClickWindowOptions, 'dependent') == "yes";
179
-
180
-		buildOnClick();
181
-	}
182
-}
183
-
184
-function parseFunction(onclick) {
185
-	var formObj = document.forms[0];
186
-	var onClickData = parseLink(onclick);
187
-
188
-	// TODO: Add stuff here
189
-}
190
-
191
-function getOption(opts, name) {
192
-	return typeof(opts[name]) == "undefined" ? "" : opts[name];
193
-}
194
-
195
-function setPopupControlsDisabled(state) {
196
-	var formObj = document.forms[0];
197
-
198
-	formObj.popupname.disabled = state;
199
-	formObj.popupurl.disabled = state;
200
-	formObj.popupwidth.disabled = state;
201
-	formObj.popupheight.disabled = state;
202
-	formObj.popupleft.disabled = state;
203
-	formObj.popuptop.disabled = state;
204
-	formObj.popuplocation.disabled = state;
205
-	formObj.popupscrollbars.disabled = state;
206
-	formObj.popupmenubar.disabled = state;
207
-	formObj.popupresizable.disabled = state;
208
-	formObj.popuptoolbar.disabled = state;
209
-	formObj.popupstatus.disabled = state;
210
-	formObj.popupreturn.disabled = state;
211
-	formObj.popupdependent.disabled = state;
212
-
213
-	setBrowserDisabled('popupurlbrowser', state);
214
-}
215
-
216
-function parseLink(link) {
217
-	link = link.replace(new RegExp('&#39;', 'g'), "'");
218
-
219
-	var fnName = link.replace(new RegExp("\\s*([A-Za-z0-9\.]*)\\s*\\(.*", "gi"), "$1");
220
-
221
-	// Is function name a template function
222
-	var template = templates[fnName];
223
-	if (template) {
224
-		// Build regexp
225
-		var variableNames = template.match(new RegExp("'?\\$\\{[A-Za-z0-9\.]*\\}'?", "gi"));
226
-		var regExp = "\\s*[A-Za-z0-9\.]*\\s*\\(";
227
-		var replaceStr = "";
228
-		for (var i=0; i<variableNames.length; i++) {
229
-			// Is string value
230
-			if (variableNames[i].indexOf("'${") != -1)
231
-				regExp += "'(.*)'";
232
-			else // Number value
233
-				regExp += "([0-9]*)";
234
-
235
-			replaceStr += "$" + (i+1);
236
-
237
-			// Cleanup variable name
238
-			variableNames[i] = variableNames[i].replace(new RegExp("[^A-Za-z0-9]", "gi"), "");
239
-
240
-			if (i != variableNames.length-1) {
241
-				regExp += "\\s*,\\s*";
242
-				replaceStr += "<delim>";
243
-			} else
244
-				regExp += ".*";
245
-		}
246
-
247
-		regExp += "\\);?";
248
-
249
-		// Build variable array
250
-		var variables = [];
251
-		variables["_function"] = fnName;
252
-		var variableValues = link.replace(new RegExp(regExp, "gi"), replaceStr).split('<delim>');
253
-		for (var i=0; i<variableNames.length; i++)
254
-			variables[variableNames[i]] = variableValues[i];
255
-
256
-		return variables;
257
-	}
258
-
259
-	return null;
260
-}
261
-
262
-function parseOptions(opts) {
263
-	if (opts == null || opts == "")
264
-		return [];
265
-
266
-	// Cleanup the options
267
-	opts = opts.toLowerCase();
268
-	opts = opts.replace(/;/g, ",");
269
-	opts = opts.replace(/[^0-9a-z=,]/g, "");
270
-
271
-	var optionChunks = opts.split(',');
272
-	var options = [];
273
-
274
-	for (var i=0; i<optionChunks.length; i++) {
275
-		var parts = optionChunks[i].split('=');
276
-
277
-		if (parts.length == 2)
278
-			options[parts[0]] = parts[1];
279
-	}
280
-
281
-	return options;
282
-}
283
-
284
-function buildOnClick() {
285
-	var formObj = document.forms[0];
286
-
287
-	if (!formObj.ispopup.checked) {
288
-		formObj.onclick.value = "";
289
-		return;
290
-	}
291
-
292
-	var onclick = "window.open('";
293
-	var url = formObj.popupurl.value;
294
-
295
-	onclick += url + "','";
296
-	onclick += formObj.popupname.value + "','";
297
-
298
-	if (formObj.popuplocation.checked)
299
-		onclick += "location=yes,";
300
-
301
-	if (formObj.popupscrollbars.checked)
302
-		onclick += "scrollbars=yes,";
303
-
304
-	if (formObj.popupmenubar.checked)
305
-		onclick += "menubar=yes,";
306
-
307
-	if (formObj.popupresizable.checked)
308
-		onclick += "resizable=yes,";
309
-
310
-	if (formObj.popuptoolbar.checked)
311
-		onclick += "toolbar=yes,";
312
-
313
-	if (formObj.popupstatus.checked)
314
-		onclick += "status=yes,";
315
-
316
-	if (formObj.popupdependent.checked)
317
-		onclick += "dependent=yes,";
318
-
319
-	if (formObj.popupwidth.value != "")
320
-		onclick += "width=" + formObj.popupwidth.value + ",";
321
-
322
-	if (formObj.popupheight.value != "")
323
-		onclick += "height=" + formObj.popupheight.value + ",";
324
-
325
-	if (formObj.popupleft.value != "") {
326
-		if (formObj.popupleft.value != "c")
327
-			onclick += "left=" + formObj.popupleft.value + ",";
328
-		else
329
-			onclick += "left='+(screen.availWidth/2-" + (formObj.popupwidth.value/2) + ")+',";
330
-	}
331
-
332
-	if (formObj.popuptop.value != "") {
333
-		if (formObj.popuptop.value != "c")
334
-			onclick += "top=" + formObj.popuptop.value + ",";
335
-		else
336
-			onclick += "top='+(screen.availHeight/2-" + (formObj.popupheight.value/2) + ")+',";
337
-	}
338
-
339
-	if (onclick.charAt(onclick.length-1) == ',')
340
-		onclick = onclick.substring(0, onclick.length-1);
341
-
342
-	onclick += "');";
343
-
344
-	if (formObj.popupreturn.checked)
345
-		onclick += "return false;";
346
-
347
-	// tinyMCE.debug(onclick);
348
-
349
-	formObj.onclick.value = onclick;
350
-
351
-	if (formObj.href.value == "")
352
-		formObj.href.value = url;
353
-}
354
-
355
-function setAttrib(elm, attrib, value) {
356
-	var formObj = document.forms[0];
357
-	var valueElm = formObj.elements[attrib.toLowerCase()];
358
-	var dom = tinyMCEPopup.editor.dom;
359
-
360
-	if (typeof(value) == "undefined" || value == null) {
361
-		value = "";
362
-
363
-		if (valueElm)
364
-			value = valueElm.value;
365
-	}
366
-
367
-	// Clean up the style
368
-	if (attrib == 'style')
369
-		value = dom.serializeStyle(dom.parseStyle(value), 'a');
370
-
371
-	dom.setAttrib(elm, attrib, value);
372
-}
373
-
374
-function getAnchorListHTML(id, target) {
375
-	var ed = tinyMCEPopup.editor, nodes = ed.dom.select('a'), name, i, len, html = "";
376
-
377
-	for (i=0, len=nodes.length; i<len; i++) {
378
-		if ((name = ed.dom.getAttrib(nodes[i], "name")) != "")
379
-			html += '<option value="#' + name + '">' + name + '</option>';
380
-	}
381
-
382
-	if (html == "")
383
-		return "";
384
-
385
-	html = '<select id="' + id + '" name="' + id + '" class="mceAnchorList"'
386
-		+ ' onchange="this.form.' + target + '.value=this.options[this.selectedIndex].value"'
387
-		+ '>'
388
-		+ '<option value="">---</option>'
389
-		+ html
390
-		+ '</select>';
391
-
392
-	return html;
393
-}
394
-
395
-function insertAction() {
396
-	var inst = tinyMCEPopup.editor;
397
-	var elm, elementArray, i;
398
-
399
-	elm = inst.selection.getNode();
400
-	checkPrefix(document.forms[0].href);
401
-
402
-	elm = inst.dom.getParent(elm, "A");
403
-
404
-	// Remove element if there is no href
405
-	if (!document.forms[0].href.value) {
406
-		i = inst.selection.getBookmark();
407
-		inst.dom.remove(elm, 1);
408
-		inst.selection.moveToBookmark(i);
409
-		tinyMCEPopup.execCommand("mceEndUndoLevel");
410
-		tinyMCEPopup.close();
411
-		return;
412
-	}
413
-
414
-	// Create new anchor elements
415
-	if (elm == null) {
416
-		inst.getDoc().execCommand("unlink", false, null);
417
-		tinyMCEPopup.execCommand("mceInsertLink", false, "#mce_temp_url#", {skip_undo : 1});
418
-
419
-		elementArray = tinymce.grep(inst.dom.select("a"), function(n) {return inst.dom.getAttrib(n, 'href') == '#mce_temp_url#';});
420
-		for (i=0; i<elementArray.length; i++)
421
-			setAllAttribs(elm = elementArray[i]);
422
-	} else
423
-		setAllAttribs(elm);
424
-
425
-	// Don't move caret if selection was image
426
-	if (elm.childNodes.length != 1 || elm.firstChild.nodeName != 'IMG') {
427
-		inst.focus();
428
-		inst.selection.select(elm);
429
-		inst.selection.collapse(0);
430
-		tinyMCEPopup.storeSelection();
431
-	}
432
-
433
-	tinyMCEPopup.execCommand("mceEndUndoLevel");
434
-	tinyMCEPopup.close();
435
-}
436
-
437
-function setAllAttribs(elm) {
438
-	var formObj = document.forms[0];
439
-	var href = formObj.href.value.replace(/ /g, '%20');
440
-	var target = getSelectValue(formObj, 'targetlist');
441
-
442
-	setAttrib(elm, 'href', href);
443
-	setAttrib(elm, 'title');
444
-	setAttrib(elm, 'target', target == '_self' ? '' : target);
445
-	setAttrib(elm, 'id');
446
-	setAttrib(elm, 'style');
447
-	setAttrib(elm, 'class', getSelectValue(formObj, 'classlist'));
448
-	setAttrib(elm, 'rel');
449
-	setAttrib(elm, 'rev');
450
-	setAttrib(elm, 'charset');
451
-	setAttrib(elm, 'hreflang');
452
-	setAttrib(elm, 'dir');
453
-	setAttrib(elm, 'lang');
454
-	setAttrib(elm, 'tabindex');
455
-	setAttrib(elm, 'accesskey');
456
-	setAttrib(elm, 'type');
457
-	setAttrib(elm, 'onfocus');
458
-	setAttrib(elm, 'onblur');
459
-	setAttrib(elm, 'onclick');
460
-	setAttrib(elm, 'ondblclick');
461
-	setAttrib(elm, 'onmousedown');
462
-	setAttrib(elm, 'onmouseup');
463
-	setAttrib(elm, 'onmouseover');
464
-	setAttrib(elm, 'onmousemove');
465
-	setAttrib(elm, 'onmouseout');
466
-	setAttrib(elm, 'onkeypress');
467
-	setAttrib(elm, 'onkeydown');
468
-	setAttrib(elm, 'onkeyup');
469
-
470
-	// Refresh in old MSIE
471
-	if (tinyMCE.isMSIE5)
472
-		elm.outerHTML = elm.outerHTML;
473
-}
474
-
475
-function getSelectValue(form_obj, field_name) {
476
-	var elm = form_obj.elements[field_name];
477
-
478
-	if (!elm || elm.options == null || elm.selectedIndex == -1)
479
-		return "";
480
-
481
-	return elm.options[elm.selectedIndex].value;
482
-}
483
-
484
-function getLinkListHTML(elm_id, target_form_element, onchange_func) {
485
-	if (typeof(tinyMCELinkList) == "undefined" || tinyMCELinkList.length == 0)
486
-		return "";
487
-
488
-	var html = "";
489
-
490
-	html += '<select id="' + elm_id + '" name="' + elm_id + '"';
491
-	html += ' class="mceLinkList" onfoc2us="tinyMCE.addSelectAccessibility(event, this, window);" onchange="this.form.' + target_form_element + '.value=';
492
-	html += 'this.options[this.selectedIndex].value;';
493
-
494
-	if (typeof(onchange_func) != "undefined")
495
-		html += onchange_func + '(\'' + target_form_element + '\',this.options[this.selectedIndex].text,this.options[this.selectedIndex].value);';
496
-
497
-	html += '"><option value="">---</option>';
498
-
499
-	for (var i=0; i<tinyMCELinkList.length; i++)
500
-		html += '<option value="' + tinyMCELinkList[i][1] + '">' + tinyMCELinkList[i][0] + '</option>';
501
-
502
-	html += '</select>';
503
-
504
-	return html;
505
-
506
-	// tinyMCE.debug('-- image list start --', html, '-- image list end --');
507
-}
508
-
509
-function getTargetListHTML(elm_id, target_form_element) {
510
-	var targets = tinyMCEPopup.getParam('theme_advanced_link_targets', '').split(';');
511
-	var html = '';
512
-
513
-	html += '<select id="' + elm_id + '" name="' + elm_id + '" onfocus="tinyMCE.addSelectAccessibility(event, this, window);" onchange="this.form.' + target_form_element + '.value=';
514
-	html += 'this.options[this.selectedIndex].value;">';
515
-	html += '<option value="_self">' + tinyMCEPopup.getLang('advlink_dlg.target_same') + '</option>';
516
-	html += '<option value="_blank">' + tinyMCEPopup.getLang('advlink_dlg.target_blank') + ' (_blank)</option>';
517
-	html += '<option value="_parent">' + tinyMCEPopup.getLang('advlink_dlg.target_parent') + ' (_parent)</option>';
518
-	html += '<option value="_top">' + tinyMCEPopup.getLang('advlink_dlg.target_top') + ' (_top)</option>';
519
-
520
-	for (var i=0; i<targets.length; i++) {
521
-		var key, value;
522
-
523
-		if (targets[i] == "")
524
-			continue;
525
-
526
-		key = targets[i].split('=')[0];
527
-		value = targets[i].split('=')[1];
528
-
529
-		html += '<option value="' + key + '">' + value + ' (' + key + ')</option>';
530
-	}
531
-
532
-	html += '</select>';
533
-
534
-	return html;
535
-}
536
-
537
-// While loading
538
-preinit();
539
-tinyMCEPopup.onInit.add(init);
Browse code

Re-add TinyMCE 2.0.1 to the site settings list - TinyMCE directoy names changed - installer submission settings layout dirty fix

Clarissa Walker authored on 2026/07/27 11:20:38
Showing 1 changed files
1 1
new file mode 100644
... ...
@@ -0,0 +1,539 @@
1
+/* Functions for the advlink plugin popup */
2
+
3
+tinyMCEPopup.requireLangPack();
4
+
5
+var templates = {
6
+	"window.open" : "window.open('${url}','${target}','${options}')"
7
+};
8
+
9
+function preinit() {
10
+	var url;
11
+
12
+	if (url = tinyMCEPopup.getParam("external_link_list_url"))
13
+		document.write('<script language="javascript" type="text/javascript" src="' + tinyMCEPopup.editor.documentBaseURI.toAbsolute(url) + '"></script>');
14
+}
15
+
16
+function changeClass() {
17
+	var f = document.forms[0];
18
+
19
+	f.classes.value = getSelectValue(f, 'classlist');
20
+}
21
+
22
+function init() {
23
+	tinyMCEPopup.resizeToInnerSize();
24
+
25
+	var formObj = document.forms[0];
26
+	var inst = tinyMCEPopup.editor;
27
+	var elm = inst.selection.getNode();
28
+	var action = "insert";
29
+	var html;
30
+
31
+	document.getElementById('hrefbrowsercontainer').innerHTML = getBrowserHTML('hrefbrowser','href','file','advlink');
32
+	document.getElementById('popupurlbrowsercontainer').innerHTML = getBrowserHTML('popupurlbrowser','popupurl','file','advlink');
33
+	document.getElementById('targetlistcontainer').innerHTML = getTargetListHTML('targetlist','target');
34
+
35
+	// Link list
36
+	html = getLinkListHTML('linklisthref','href');
37
+	if (html == "")
38
+		document.getElementById("linklisthrefrow").style.display = 'none';
39
+	else
40
+		document.getElementById("linklisthrefcontainer").innerHTML = html;
41
+
42
+	// Anchor list
43
+	html = getAnchorListHTML('anchorlist','href');
44
+	if (html == "")
45
+		document.getElementById("anchorlistrow").style.display = 'none';
46
+	else
47
+		document.getElementById("anchorlistcontainer").innerHTML = html;
48
+
49
+	// Resize some elements
50
+	if (isVisible('hrefbrowser'))
51
+		document.getElementById('href').style.width = '260px';
52
+
53
+	if (isVisible('popupurlbrowser'))
54
+		document.getElementById('popupurl').style.width = '180px';
55
+
56
+	elm = inst.dom.getParent(elm, "A");
57
+	if (elm == null) {
58
+		var prospect = inst.dom.create("p", null, inst.selection.getContent());
59
+		if (prospect.childNodes.length === 1) {
60
+			elm = prospect.firstChild;
61
+		}
62
+	}
63
+
64
+	if (elm != null && elm.nodeName == "A")
65
+		action = "update";
66
+
67
+	formObj.insert.value = tinyMCEPopup.getLang(action, 'Insert', true); 
68
+
69
+	setPopupControlsDisabled(true);
70
+
71
+	if (action == "update") {
72
+		var href = inst.dom.getAttrib(elm, 'href');
73
+		var onclick = inst.dom.getAttrib(elm, 'onclick');
74
+
75
+		// Setup form data
76
+		setFormValue('href', href);
77
+		setFormValue('title', inst.dom.getAttrib(elm, 'title'));
78
+		setFormValue('id', inst.dom.getAttrib(elm, 'id'));
79
+		setFormValue('style', inst.dom.getAttrib(elm, "style"));
80
+		setFormValue('rel', inst.dom.getAttrib(elm, 'rel'));
81
+		setFormValue('rev', inst.dom.getAttrib(elm, 'rev'));
82
+		setFormValue('charset', inst.dom.getAttrib(elm, 'charset'));
83
+		setFormValue('hreflang', inst.dom.getAttrib(elm, 'hreflang'));
84
+		setFormValue('dir', inst.dom.getAttrib(elm, 'dir'));
85
+		setFormValue('lang', inst.dom.getAttrib(elm, 'lang'));
86
+		setFormValue('tabindex', inst.dom.getAttrib(elm, 'tabindex', typeof(elm.tabindex) != "undefined" ? elm.tabindex : ""));
87
+		setFormValue('accesskey', inst.dom.getAttrib(elm, 'accesskey', typeof(elm.accesskey) != "undefined" ? elm.accesskey : ""));
88
+		setFormValue('type', inst.dom.getAttrib(elm, 'type'));
89
+		setFormValue('onfocus', inst.dom.getAttrib(elm, 'onfocus'));
90
+		setFormValue('onblur', inst.dom.getAttrib(elm, 'onblur'));
91
+		setFormValue('onclick', onclick);
92
+		setFormValue('ondblclick', inst.dom.getAttrib(elm, 'ondblclick'));
93
+		setFormValue('onmousedown', inst.dom.getAttrib(elm, 'onmousedown'));
94
+		setFormValue('onmouseup', inst.dom.getAttrib(elm, 'onmouseup'));
95
+		setFormValue('onmouseover', inst.dom.getAttrib(elm, 'onmouseover'));
96
+		setFormValue('onmousemove', inst.dom.getAttrib(elm, 'onmousemove'));
97
+		setFormValue('onmouseout', inst.dom.getAttrib(elm, 'onmouseout'));
98
+		setFormValue('onkeypress', inst.dom.getAttrib(elm, 'onkeypress'));
99
+		setFormValue('onkeydown', inst.dom.getAttrib(elm, 'onkeydown'));
100
+		setFormValue('onkeyup', inst.dom.getAttrib(elm, 'onkeyup'));
101
+		setFormValue('target', inst.dom.getAttrib(elm, 'target'));
102
+		setFormValue('classes', inst.dom.getAttrib(elm, 'class'));
103
+
104
+		// Parse onclick data
105
+		if (onclick != null && onclick.indexOf('window.open') != -1)
106
+			parseWindowOpen(onclick);
107
+		else
108
+			parseFunction(onclick);
109
+
110
+		// Select by the values
111
+		selectByValue(formObj, 'dir', inst.dom.getAttrib(elm, 'dir'));
112
+		selectByValue(formObj, 'rel', inst.dom.getAttrib(elm, 'rel'));
113
+		selectByValue(formObj, 'rev', inst.dom.getAttrib(elm, 'rev'));
114
+		selectByValue(formObj, 'linklisthref', href);
115
+
116
+		if (href.charAt(0) == '#')
117
+			selectByValue(formObj, 'anchorlist', href);
118
+
119
+		addClassesToList('classlist', 'advlink_styles');
120
+
121
+		selectByValue(formObj, 'classlist', inst.dom.getAttrib(elm, 'class'), true);
122
+		selectByValue(formObj, 'targetlist', inst.dom.getAttrib(elm, 'target'), true);
123
+	} else
124
+		addClassesToList('classlist', 'advlink_styles');
125
+}
126
+
127
+function checkPrefix(n) {
128
+	if (n.value && Validator.isEmail(n) && !/^\s*mailto:/i.test(n.value) && confirm(tinyMCEPopup.getLang('advlink_dlg.is_email')))
129
+		n.value = 'mailto:' + n.value;
130
+
131
+	if (/^\s*www\./i.test(n.value) && confirm(tinyMCEPopup.getLang('advlink_dlg.is_external')))
132
+		n.value = 'http://' + n.value;
133
+}
134
+
135
+function setFormValue(name, value) {
136
+	document.forms[0].elements[name].value = value;
137
+}
138
+
139
+function parseWindowOpen(onclick) {
140
+	var formObj = document.forms[0];
141
+
142
+	// Preprocess center code
143
+	if (onclick.indexOf('return false;') != -1) {
144
+		formObj.popupreturn.checked = true;
145
+		onclick = onclick.replace('return false;', '');
146
+	} else
147
+		formObj.popupreturn.checked = false;
148
+
149
+	var onClickData = parseLink(onclick);
150
+
151
+	if (onClickData != null) {
152
+		formObj.ispopup.checked = true;
153
+		setPopupControlsDisabled(false);
154
+
155
+		var onClickWindowOptions = parseOptions(onClickData['options']);
156
+		var url = onClickData['url'];
157
+
158
+		formObj.popupname.value = onClickData['target'];
159
+		formObj.popupurl.value = url;
160
+		formObj.popupwidth.value = getOption(onClickWindowOptions, 'width');
161
+		formObj.popupheight.value = getOption(onClickWindowOptions, 'height');
162
+
163
+		formObj.popupleft.value = getOption(onClickWindowOptions, 'left');
164
+		formObj.popuptop.value = getOption(onClickWindowOptions, 'top');
165
+
166
+		if (formObj.popupleft.value.indexOf('screen') != -1)
167
+			formObj.popupleft.value = "c";
168
+
169
+		if (formObj.popuptop.value.indexOf('screen') != -1)
170
+			formObj.popuptop.value = "c";
171
+
172
+		formObj.popuplocation.checked = getOption(onClickWindowOptions, 'location') == "yes";
173
+		formObj.popupscrollbars.checked = getOption(onClickWindowOptions, 'scrollbars') == "yes";
174
+		formObj.popupmenubar.checked = getOption(onClickWindowOptions, 'menubar') == "yes";
175
+		formObj.popupresizable.checked = getOption(onClickWindowOptions, 'resizable') == "yes";
176
+		formObj.popuptoolbar.checked = getOption(onClickWindowOptions, 'toolbar') == "yes";
177
+		formObj.popupstatus.checked = getOption(onClickWindowOptions, 'status') == "yes";
178
+		formObj.popupdependent.checked = getOption(onClickWindowOptions, 'dependent') == "yes";
179
+
180
+		buildOnClick();
181
+	}
182
+}
183
+
184
+function parseFunction(onclick) {
185
+	var formObj = document.forms[0];
186
+	var onClickData = parseLink(onclick);
187
+
188
+	// TODO: Add stuff here
189
+}
190
+
191
+function getOption(opts, name) {
192
+	return typeof(opts[name]) == "undefined" ? "" : opts[name];
193
+}
194
+
195
+function setPopupControlsDisabled(state) {
196
+	var formObj = document.forms[0];
197
+
198
+	formObj.popupname.disabled = state;
199
+	formObj.popupurl.disabled = state;
200
+	formObj.popupwidth.disabled = state;
201
+	formObj.popupheight.disabled = state;
202
+	formObj.popupleft.disabled = state;
203
+	formObj.popuptop.disabled = state;
204
+	formObj.popuplocation.disabled = state;
205
+	formObj.popupscrollbars.disabled = state;
206
+	formObj.popupmenubar.disabled = state;
207
+	formObj.popupresizable.disabled = state;
208
+	formObj.popuptoolbar.disabled = state;
209
+	formObj.popupstatus.disabled = state;
210
+	formObj.popupreturn.disabled = state;
211
+	formObj.popupdependent.disabled = state;
212
+
213
+	setBrowserDisabled('popupurlbrowser', state);
214
+}
215
+
216
+function parseLink(link) {
217
+	link = link.replace(new RegExp('&#39;', 'g'), "'");
218
+
219
+	var fnName = link.replace(new RegExp("\\s*([A-Za-z0-9\.]*)\\s*\\(.*", "gi"), "$1");
220
+
221
+	// Is function name a template function
222
+	var template = templates[fnName];
223
+	if (template) {
224
+		// Build regexp
225
+		var variableNames = template.match(new RegExp("'?\\$\\{[A-Za-z0-9\.]*\\}'?", "gi"));
226
+		var regExp = "\\s*[A-Za-z0-9\.]*\\s*\\(";
227
+		var replaceStr = "";
228
+		for (var i=0; i<variableNames.length; i++) {
229
+			// Is string value
230
+			if (variableNames[i].indexOf("'${") != -1)
231
+				regExp += "'(.*)'";
232
+			else // Number value
233
+				regExp += "([0-9]*)";
234
+
235
+			replaceStr += "$" + (i+1);
236
+
237
+			// Cleanup variable name
238
+			variableNames[i] = variableNames[i].replace(new RegExp("[^A-Za-z0-9]", "gi"), "");
239
+
240
+			if (i != variableNames.length-1) {
241
+				regExp += "\\s*,\\s*";
242
+				replaceStr += "<delim>";
243
+			} else
244
+				regExp += ".*";
245
+		}
246
+
247
+		regExp += "\\);?";
248
+
249
+		// Build variable array
250
+		var variables = [];
251
+		variables["_function"] = fnName;
252
+		var variableValues = link.replace(new RegExp(regExp, "gi"), replaceStr).split('<delim>');
253
+		for (var i=0; i<variableNames.length; i++)
254
+			variables[variableNames[i]] = variableValues[i];
255
+
256
+		return variables;
257
+	}
258
+
259
+	return null;
260
+}
261
+
262
+function parseOptions(opts) {
263
+	if (opts == null || opts == "")
264
+		return [];
265
+
266
+	// Cleanup the options
267
+	opts = opts.toLowerCase();
268
+	opts = opts.replace(/;/g, ",");
269
+	opts = opts.replace(/[^0-9a-z=,]/g, "");
270
+
271
+	var optionChunks = opts.split(',');
272
+	var options = [];
273
+
274
+	for (var i=0; i<optionChunks.length; i++) {
275
+		var parts = optionChunks[i].split('=');
276
+
277
+		if (parts.length == 2)
278
+			options[parts[0]] = parts[1];
279
+	}
280
+
281
+	return options;
282
+}
283
+
284
+function buildOnClick() {
285
+	var formObj = document.forms[0];
286
+
287
+	if (!formObj.ispopup.checked) {
288
+		formObj.onclick.value = "";
289
+		return;
290
+	}
291
+
292
+	var onclick = "window.open('";
293
+	var url = formObj.popupurl.value;
294
+
295
+	onclick += url + "','";
296
+	onclick += formObj.popupname.value + "','";
297
+
298
+	if (formObj.popuplocation.checked)
299
+		onclick += "location=yes,";
300
+
301
+	if (formObj.popupscrollbars.checked)
302
+		onclick += "scrollbars=yes,";
303
+
304
+	if (formObj.popupmenubar.checked)
305
+		onclick += "menubar=yes,";
306
+
307
+	if (formObj.popupresizable.checked)
308
+		onclick += "resizable=yes,";
309
+
310
+	if (formObj.popuptoolbar.checked)
311
+		onclick += "toolbar=yes,";
312
+
313
+	if (formObj.popupstatus.checked)
314
+		onclick += "status=yes,";
315
+
316
+	if (formObj.popupdependent.checked)
317
+		onclick += "dependent=yes,";
318
+
319
+	if (formObj.popupwidth.value != "")
320
+		onclick += "width=" + formObj.popupwidth.value + ",";
321
+
322
+	if (formObj.popupheight.value != "")
323
+		onclick += "height=" + formObj.popupheight.value + ",";
324
+
325
+	if (formObj.popupleft.value != "") {
326
+		if (formObj.popupleft.value != "c")
327
+			onclick += "left=" + formObj.popupleft.value + ",";
328
+		else
329
+			onclick += "left='+(screen.availWidth/2-" + (formObj.popupwidth.value/2) + ")+',";
330
+	}
331
+
332
+	if (formObj.popuptop.value != "") {
333
+		if (formObj.popuptop.value != "c")
334
+			onclick += "top=" + formObj.popuptop.value + ",";
335
+		else
336
+			onclick += "top='+(screen.availHeight/2-" + (formObj.popupheight.value/2) + ")+',";
337
+	}
338
+
339
+	if (onclick.charAt(onclick.length-1) == ',')
340
+		onclick = onclick.substring(0, onclick.length-1);
341
+
342
+	onclick += "');";
343
+
344
+	if (formObj.popupreturn.checked)
345
+		onclick += "return false;";
346
+
347
+	// tinyMCE.debug(onclick);
348
+
349
+	formObj.onclick.value = onclick;
350
+
351
+	if (formObj.href.value == "")
352
+		formObj.href.value = url;
353
+}
354
+
355
+function setAttrib(elm, attrib, value) {
356
+	var formObj = document.forms[0];
357
+	var valueElm = formObj.elements[attrib.toLowerCase()];
358
+	var dom = tinyMCEPopup.editor.dom;
359
+
360
+	if (typeof(value) == "undefined" || value == null) {
361
+		value = "";
362
+
363
+		if (valueElm)
364
+			value = valueElm.value;
365
+	}
366
+
367
+	// Clean up the style
368
+	if (attrib == 'style')
369
+		value = dom.serializeStyle(dom.parseStyle(value), 'a');
370
+
371
+	dom.setAttrib(elm, attrib, value);
372
+}
373
+
374
+function getAnchorListHTML(id, target) {
375
+	var ed = tinyMCEPopup.editor, nodes = ed.dom.select('a'), name, i, len, html = "";
376
+
377
+	for (i=0, len=nodes.length; i<len; i++) {
378
+		if ((name = ed.dom.getAttrib(nodes[i], "name")) != "")
379
+			html += '<option value="#' + name + '">' + name + '</option>';
380
+	}
381
+
382
+	if (html == "")
383
+		return "";
384
+
385
+	html = '<select id="' + id + '" name="' + id + '" class="mceAnchorList"'
386
+		+ ' onchange="this.form.' + target + '.value=this.options[this.selectedIndex].value"'
387
+		+ '>'
388
+		+ '<option value="">---</option>'
389
+		+ html
390
+		+ '</select>';
391
+
392
+	return html;
393
+}
394
+
395
+function insertAction() {
396
+	var inst = tinyMCEPopup.editor;
397
+	var elm, elementArray, i;
398
+
399
+	elm = inst.selection.getNode();
400
+	checkPrefix(document.forms[0].href);
401
+
402
+	elm = inst.dom.getParent(elm, "A");
403
+
404
+	// Remove element if there is no href
405
+	if (!document.forms[0].href.value) {
406
+		i = inst.selection.getBookmark();
407
+		inst.dom.remove(elm, 1);
408
+		inst.selection.moveToBookmark(i);
409
+		tinyMCEPopup.execCommand("mceEndUndoLevel");
410
+		tinyMCEPopup.close();
411
+		return;
412
+	}
413
+
414
+	// Create new anchor elements
415
+	if (elm == null) {
416
+		inst.getDoc().execCommand("unlink", false, null);
417
+		tinyMCEPopup.execCommand("mceInsertLink", false, "#mce_temp_url#", {skip_undo : 1});
418
+
419
+		elementArray = tinymce.grep(inst.dom.select("a"), function(n) {return inst.dom.getAttrib(n, 'href') == '#mce_temp_url#';});
420
+		for (i=0; i<elementArray.length; i++)
421
+			setAllAttribs(elm = elementArray[i]);
422
+	} else
423
+		setAllAttribs(elm);
424
+
425
+	// Don't move caret if selection was image
426
+	if (elm.childNodes.length != 1 || elm.firstChild.nodeName != 'IMG') {
427
+		inst.focus();
428
+		inst.selection.select(elm);
429
+		inst.selection.collapse(0);
430
+		tinyMCEPopup.storeSelection();
431
+	}
432
+
433
+	tinyMCEPopup.execCommand("mceEndUndoLevel");
434
+	tinyMCEPopup.close();
435
+}
436
+
437
+function setAllAttribs(elm) {
438
+	var formObj = document.forms[0];
439
+	var href = formObj.href.value.replace(/ /g, '%20');
440
+	var target = getSelectValue(formObj, 'targetlist');
441
+
442
+	setAttrib(elm, 'href', href);
443
+	setAttrib(elm, 'title');
444
+	setAttrib(elm, 'target', target == '_self' ? '' : target);
445
+	setAttrib(elm, 'id');
446
+	setAttrib(elm, 'style');
447
+	setAttrib(elm, 'class', getSelectValue(formObj, 'classlist'));
448
+	setAttrib(elm, 'rel');
449
+	setAttrib(elm, 'rev');
450
+	setAttrib(elm, 'charset');
451
+	setAttrib(elm, 'hreflang');
452
+	setAttrib(elm, 'dir');
453
+	setAttrib(elm, 'lang');
454
+	setAttrib(elm, 'tabindex');
455
+	setAttrib(elm, 'accesskey');
456
+	setAttrib(elm, 'type');
457
+	setAttrib(elm, 'onfocus');
458
+	setAttrib(elm, 'onblur');
459
+	setAttrib(elm, 'onclick');
460
+	setAttrib(elm, 'ondblclick');
461
+	setAttrib(elm, 'onmousedown');
462
+	setAttrib(elm, 'onmouseup');
463
+	setAttrib(elm, 'onmouseover');
464
+	setAttrib(elm, 'onmousemove');
465
+	setAttrib(elm, 'onmouseout');
466
+	setAttrib(elm, 'onkeypress');
467
+	setAttrib(elm, 'onkeydown');
468
+	setAttrib(elm, 'onkeyup');
469
+
470
+	// Refresh in old MSIE
471
+	if (tinyMCE.isMSIE5)
472
+		elm.outerHTML = elm.outerHTML;
473
+}
474
+
475
+function getSelectValue(form_obj, field_name) {
476
+	var elm = form_obj.elements[field_name];
477
+
478
+	if (!elm || elm.options == null || elm.selectedIndex == -1)
479
+		return "";
480
+
481
+	return elm.options[elm.selectedIndex].value;
482
+}
483
+
484
+function getLinkListHTML(elm_id, target_form_element, onchange_func) {
485
+	if (typeof(tinyMCELinkList) == "undefined" || tinyMCELinkList.length == 0)
486
+		return "";
487
+
488
+	var html = "";
489
+
490
+	html += '<select id="' + elm_id + '" name="' + elm_id + '"';
491
+	html += ' class="mceLinkList" onfoc2us="tinyMCE.addSelectAccessibility(event, this, window);" onchange="this.form.' + target_form_element + '.value=';
492
+	html += 'this.options[this.selectedIndex].value;';
493
+
494
+	if (typeof(onchange_func) != "undefined")
495
+		html += onchange_func + '(\'' + target_form_element + '\',this.options[this.selectedIndex].text,this.options[this.selectedIndex].value);';
496
+
497
+	html += '"><option value="">---</option>';
498
+
499
+	for (var i=0; i<tinyMCELinkList.length; i++)
500
+		html += '<option value="' + tinyMCELinkList[i][1] + '">' + tinyMCELinkList[i][0] + '</option>';
501
+
502
+	html += '</select>';
503
+
504
+	return html;
505
+
506
+	// tinyMCE.debug('-- image list start --', html, '-- image list end --');
507
+}
508
+
509
+function getTargetListHTML(elm_id, target_form_element) {
510
+	var targets = tinyMCEPopup.getParam('theme_advanced_link_targets', '').split(';');
511
+	var html = '';
512
+
513
+	html += '<select id="' + elm_id + '" name="' + elm_id + '" onfocus="tinyMCE.addSelectAccessibility(event, this, window);" onchange="this.form.' + target_form_element + '.value=';
514
+	html += 'this.options[this.selectedIndex].value;">';
515
+	html += '<option value="_self">' + tinyMCEPopup.getLang('advlink_dlg.target_same') + '</option>';
516
+	html += '<option value="_blank">' + tinyMCEPopup.getLang('advlink_dlg.target_blank') + ' (_blank)</option>';
517
+	html += '<option value="_parent">' + tinyMCEPopup.getLang('advlink_dlg.target_parent') + ' (_parent)</option>';
518
+	html += '<option value="_top">' + tinyMCEPopup.getLang('advlink_dlg.target_top') + ' (_top)</option>';
519
+
520
+	for (var i=0; i<targets.length; i++) {
521
+		var key, value;
522
+
523
+		if (targets[i] == "")
524
+			continue;
525
+
526
+		key = targets[i].split('=')[0];
527
+		value = targets[i].split('=')[1];
528
+
529
+		html += '<option value="' + key + '">' + value + ' (' + key + ')</option>';
530
+	}
531
+
532
+	html += '</select>';
533
+
534
+	return html;
535
+}
536
+
537
+// While loading
538
+preinit();
539
+tinyMCEPopup.onInit.add(init);