A tumblelog CMS built on AJAX, PHP and MySQL.

functions.js 18KB

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