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