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

Actually use TinyMCE 3.4.8 for TinyMCE3 option instead of original 2.0.1; that version is moved to 'tinymce2' directory

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