Open-Source PHP Framework - Designed for rapid development of performance-oriented scalable applications

/webroot/js/tinymce/plugins/advlink/js/advlink.js

[return to app]
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 
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(namevalue) {
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(optsname) {
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=0i<variableNames.lengthi++) {
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(eventthiswindow);" 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=0i<elementArray.lengthi++)
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 != || 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_objfield_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_idtarget_form_elementonchange_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=0i<tinyMCELinkList.lengthi++)
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_idtarget_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=0i<targets.lengthi++) {
510         var 
keyvalue;
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);
529