Statistics
| Branch: | Tag: | Revision:

root / static / js / tinymce / plugins / advlink / js / advlink.js @ 6ecbf4ec

History | View | Annotate | Download (16.8 kB)

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), 'a');
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
                inst.getDoc().execCommand("unlink", false, null);
406
                tinyMCEPopup.execCommand("CreateLink", false, "#mce_temp_url#", {skip_undo : 1});
407

    
408
                elementArray = tinymce.grep(inst.dom.select("a"), function(n) {return inst.dom.getAttrib(n, 'href') == '#mce_temp_url#';});
409
                for (i=0; i<elementArray.length; i++)
410
                        setAllAttribs(elm = elementArray[i]);
411
        } else
412
                setAllAttribs(elm);
413

    
414
        // Don't move caret if selection was image
415
        if (elm.childNodes.length != 1 || elm.firstChild.nodeName != 'IMG') {
416
                inst.focus();
417
                inst.selection.select(elm);
418
                inst.selection.collapse(0);
419
                tinyMCEPopup.storeSelection();
420
        }
421

    
422
        tinyMCEPopup.execCommand("mceEndUndoLevel");
423
        tinyMCEPopup.close();
424
}
425

    
426
function setAllAttribs(elm) {
427
        var formObj = document.forms[0];
428
        var href = formObj.href.value;
429
        var target = getSelectValue(formObj, 'targetlist');
430

    
431
        setAttrib(elm, '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 || elm.options == null || elm.selectedIndex == -1)
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);