1/* global wpforo */ 2var $wpf = Object.assign(window.jQuery); 3 4// Mute jQuery Migrate Warnings 5$wpf.migrateMute = true; 6 7$wpf.fn.extend({ 8 visible: function () { 9 return this.css('visibility', 'visible'); 10 }, 11 invisible: function () { 12 return this.css('visibility', 'hidden'); 13 }, 14 visibilityToggle: function () { 15 return this.css('visibility', function (i, visibility) { 16 return (visibility === 'visible') ? 'hidden' : 'visible'; 17 }); 18 }, 19 showFlex: function () { 20 return this.css('display', 'flex'); 21 }, 22 wpfInsertAtCaret: function (myValue) { 23 return this.each(function () { 24 if (document.selection) { 25 //For browsers like Internet Explorer 26 this.focus(); 27 var sel = document.selection.createRange(); 28 sel.text = myValue; 29 } else if (this.selectionStart || this.selectionStart === 0) { 30 //For browsers like Firefox and Webkit based 31 var startPos = this.selectionStart; 32 var endPos = this.selectionEnd; 33 this.value = this.value.substring(0, startPos) + myValue + this.value.substring(endPos, this.value.length); 34 this.selectionStart = startPos + myValue.length; 35 this.selectionEnd = startPos + myValue.length; 36 } else { 37 this.value += myValue; 38 } 39 }); 40 }, 41 isOnScreen: function (cbTrue, cbFalse) { 42 var win = $wpf(window); 43 44 var viewport = { 45 top: win.scrollTop(), 46 left: win.scrollLeft(), 47 }; 48 viewport.right = viewport.left + win.width(); 49 viewport.bottom = viewport.top + win.height(); 50 51 var bounds = this.offset(); 52 bounds.right = bounds.left + this.outerWidth(); 53 bounds.bottom = bounds.top + this.outerHeight(); 54 55 var isOnScreen = (!(viewport.right < bounds.left || viewport.left > bounds.right || viewport.bottom < bounds.top || viewport.top > bounds.bottom)); 56 57 if (!cbTrue && !cbFalse) { 58 return isOnScreen; 59 } else { 60 return isOnScreen 61 ? cbTrue && cbTrue(viewport, bounds) 62 : cbFalse && cbFalse(viewport, bounds); 63 } 64 }, 65}); 66 67// returns the cookie with the given name, 68// or undefined if not found 69function wpforo_getCookie (name) { 70 let matches = document.cookie.match(new RegExp( 71 '(?:^|; )' + name.replace(/([\.$?*|{}\(\)\[\]\\\/\+^])/g, '\\$1') + '=([^;]*)', 72 )); 73 return matches ? decodeURIComponent(matches[1]) : undefined; 74} 75 76function wpforo_setCookie (name, value, options = {}) { 77 78 options = { 79 path: '/', 80 // add other defaults here if necessary 81 ...options, 82 }; 83 84 if (options.expires instanceof Date) { 85 options.expires = options.expires.toUTCString(); 86 } 87 88 let updatedCookie = encodeURIComponent(name) + '=' + encodeURIComponent(value); 89 90 for (let optionKey in options) { 91 updatedCookie += '; ' + optionKey; 92 let optionValue = options[optionKey]; 93 if (optionValue !== true) { 94 updatedCookie += '=' + optionValue; 95 } 96 } 97 98 document.cookie = updatedCookie; 99} 100 101function wpforo_deleteCookie (name) { 102 wpforo_setCookie(name, '', { 103 'max-age': -1, 104 }); 105} 106 107function wpforo_get_browser_timezone () { 108 if (typeof Intl === 'object' && typeof Intl.DateTimeFormat === 'function') { 109 try { 110 const timeZone = Intl.DateTimeFormat().resolvedOptions().timeZone; 111 if (timeZone !== undefined && timeZone !== null) return timeZone; 112 } catch (error) { 113 console.error('Error accessing time zone:', error); 114 } 115 } else { 116 console.error('Intl.DateTimeFormat is not supported in this environment.'); 117 } 118 119 return ''; 120} 121 122/** 123 * Trigger a custom event. 124 * 125 * @param {Element|Document} target HTML element to dispatch the event on. 126 * @param {string} name Event name. 127 * @param [detail = null] Event addintional data information. 128 */ 129function wpforo_trigger_custom_event (target, name, detail) { 130 if (typeof detail === 'undefined') detail = null; 131 var event; 132 if (typeof CustomEvent === 'function') { 133 event = new CustomEvent(name, { bubbles: true, cancelable: true, detail: detail }); 134 } else { 135 event = document.createEvent('Event'); 136 event.initEvent(name, true, true); 137 event.detail = detail; 138 } 139 140 target.dispatchEvent(event); 141 window['wpforo_break_after_custom_event_'.name] = false; 142} 143 144function wpforo_tinymce_initializeIt (selector, do_not_focus) { 145 if (wpforo_editor.is_tinymce_loaded()) { 146 $wpf(selector).each(function () {
147 if (this.id) { 148 var editor_settings = window['wpforo_editor_settings_' + this.id] || wpforo['editor_settings']; 149 var settings = { 150 selector: '#' + this.id, 151 relative_urls: false, 152 remove_script_host: false, 153 convert_urls: false, 154 keep_styles: false, 155 end_container_on_empty_block: true, 156 wpeditimage_html5_captions: true, 157 force_br_newlines: false, 158 force_p_newlines: true, 159 menubar: false, 160 branding: false, 161 elementpath: true, 162 statusbar: true, 163 fix_list_elements: true, 164 browser_spellcheck: true, 165 entities: '38,amp,60,lt,62,gt', 166 entity_encoding: 'raw', 167 resize: 'vertical', 168 preview_styles: 'font-family font-size font-weight font-style text-decoration text-transform', 169 forced_root_block: '', 170 plugins: editor_settings['plugins'], 171 external_plugins: editor_settings['external_plugins'], 172 min_height: editor_settings['editor_height'], 173 indent: editor_settings['indent'], 174 height: editor_settings['editor_height'], 175 wpautop: editor_settings['wpautop'], 176 wp_keep_scroll_position: editor_settings['wp_keep_scroll_position'], 177 add_unload_trigger: editor_settings['add_unload_trigger'], 178 }; 179 settings = Object.assign(settings, editor_settings['tinymce']); 180 tinymce.init(settings).then(function (e) { 181 if (!do_not_focus && e.length) { 182 wpforo_editor.focus(e[0].id); 183 wpforo_editor.set_active(e[0].id); 184 } 185 }); 186 187 } 188 }); 189 } 190} 191 192function wpforo_tinymce_setup (editor) { 193 editor.on('init', function (e) { 194 wpforo_trigger_custom_event(document, 'wpforo_tinymce_init', e); 195 }); 196 editor.on('focus', function (e) { 197 wpforo_trigger_custom_event(document, 'wpforo_tinymce_focus', e); 198 wpforo_editor.set_active(editor.id); 199 }); 200 editor.on('Dirty ExecCommand KeyPress SetContent', function (e) { 201 wpforo_trigger_custom_event(document, 'wpforo_tinymce_content_changed', e); 202 }); 203 editor.on('paste', function (e) { 204 wpforo_trigger_custom_event(document, 'wpforo_tinymce_paste', e); 205 }); 206 editor.shortcuts.add('ctrl+13', 'submit', function (e) { 207 wpforo_trigger_custom_event(document, 'wpforo_tinymce_ctrl_enter', e); 208 $wpf('form[data-textareaid="' + editor.id + '"]').find('[type=submit]').trigger('click'); 209 }); 210 editor.shortcuts.add('ctrl+s', 'Save Draft', function (e) { 211 wpforo_trigger_custom_event(document, 'wpforo_tinymce_ctrl_s', e); 212 }); 213} 214 215var wpforo_editor = { 216 active_textareaid: '', 217 main_textareaid: '', 218 fix_textareaid: function (textareaid) { 219 if (typeof textareaid !== 'undefined') { 220 return textareaid; 221 } else if (this.active_textareaid) { 222 return this.active_textareaid; 223 } else { 224 var tinymce_active_editor_id = this.get_tinymce_active_editor_id(); 225 if (tinymce_active_editor_id) { 226 this.active_textareaid = tinymce_active_editor_id; 227 return tinymce_active_editor_id; 228 } 229 } 230 return ''; 231 }, 232 get_active_textareaid: function () { 233 return this.fix_textareaid(); 234 }, 235 set_active: function (textareaid) { 236 if (this.is_exists(textareaid)) { 237 this.active_textareaid = textareaid; 238 if (this.is_tinymce(textareaid)) tinymce.setActive(tinymce.get(textareaid)); 239 } 240 }, 241 clear_active: function () { 242 this.active_textareaid = ''; 243 }, 244 set_main: function (textareaid, also_set_active) { 245 if (!textareaid) { 246 var wpforo_main_form = $wpf('form.wpforo-main-form[data-textareaid]'); 247 if (wpforo_main_form.length) textareaid = wpforo_main_form.data('textareaid'); 248 } 249 if (this.is_exists(textareaid)) { 250 this.main_textareaid = textareaid; 251 if (also_set_active) this.set_active(textareaid); 252 } 253 }, 254 get_main: function () { 255 if (!this.main_textareaid) this.set_main(); 256 return this.main_textareaid; 257 }, 258 clear_main: function () { 259 this.main_textareaid = ''; 260 }, 261 get_tinymce_active_editor_id: function () { 262 if (this.is_tinymce_loaded() && typeof tinymce.activeEditor === 'object' && tinymce.activeEditor && tinymce.activeEditor.id) { 263 return tinymce.activeEditor.id; 264 } 265 return ''; 266 }, 267 is_tinymce_loaded: function () { 268 return typeof tinymce !== 'undefined'; 269 }, 270 is_tinymce: function (textareaid) { 271 textareaid = this.fix_textareaid(textareaid);
272 return !!(textareaid && this.is_tinymce_loaded() && tinymce.get(textareaid)); 273 }, 274 is_textarea: function (textareaid) { 275 textareaid = this.fix_textareaid(textareaid); 276 return !!(textareaid && !this.is_tinymce(textareaid) && $wpf('textarea#' + textareaid).length); 277 }, 278 is_exists: function (textareaid) { 279 return !!(textareaid && this.is_tinymce(textareaid) || this.is_textarea(textareaid)); 280 }, 281 get_form: function (textareaid) { 282 textareaid = this.fix_textareaid(textareaid); 283 var textarea = $wpf('textarea[id="' + textareaid + '"]'); 284 if (textarea.length) { 285 var form = textarea.closest('form'); 286 if (form.length) return form; 287 } 288 return null; 289 }, 290 get_form_body_wrap: function (textareaid) { 291 textareaid = this.fix_textareaid(textareaid); 292 var ed; 293 var body_wrap = null; 294 if (this.is_tinymce(textareaid)) { 295 ed = tinymce.get(textareaid); 296 if (ed && ed.iframeElement) { 297 body_wrap = ed.iframeElement.parentElement; 298 } 299 } else { 300 ed = document.getElementById(textareaid); 301 if (ed) { 302 body_wrap = ed.parentElement; 303 } 304 } 305 return body_wrap ? $wpf(body_wrap) : null; 306 }, 307 scrollto: function (textareaid) { 308 textareaid = this.fix_textareaid(textareaid); 309 var scrollto = null; 310 var bodyWrap = this.get_form_body_wrap(textareaid); 311 if (bodyWrap !== null) scrollto = bodyWrap.offset().top - 100; 312 if (scrollto !== null && !bodyWrap.isOnScreen()) { 313 $wpf('html').scrollTop(scrollto); 314 } 315 }, 316 tinymce_focus: function (textareaid, caret_to_end) { 317 textareaid = this.fix_textareaid(textareaid); 318 if (this.is_tinymce(textareaid)) { 319 this.scrollto(textareaid); 320 var focus_mce = tinymce.get(textareaid); 321 focus_mce.focus(); 322 if (caret_to_end) { 323 focus_mce.selection.select(focus_mce.getBody(), true); 324 focus_mce.selection.collapse(false); 325 } 326 } 327 }, 328 textarea_focus: function (textareaid, caret_to_end) { 329 textareaid = this.fix_textareaid(textareaid); 330 if (this.is_textarea(textareaid)) { 331 this.scrollto(textareaid); 332 var textarea = $wpf('textarea#' + textareaid); 333 var textarea_val = textarea.val(); 334 textarea.trigger('focus'); 335 if (caret_to_end) { 336 textarea.val(''); 337 textarea.val(textarea_val); 338 } 339 } 340 }, 341 focus: function (textareaid, caret_to_end) { 342 textareaid = this.fix_textareaid(textareaid); 343 if (this.is_tinymce(textareaid)) { 344 this.tinymce_focus(textareaid, caret_to_end); 345 } else if (this.is_textarea(textareaid)) { 346 this.textarea_focus(textareaid, caret_to_end); 347 } 348 }, 349 insert_content: function (content, textareaid, format, focus) { 350 textareaid = this.fix_textareaid(textareaid); 351 format = format ? format : 'raw'; 352 if (focus === undefined) focus = true; 353 if (this.is_tinymce(textareaid)) { 354 tinymce.get(textareaid).insertContent(content, { format: format }); 355 if (focus) this.tinymce_focus(textareaid); 356 } else if (this.is_textarea(textareaid)) { 357 $wpf('textarea#' + textareaid).wpfInsertAtCaret(content); 358 if (focus) this.textarea_focus(textareaid); 359 } 360 }, 361 set_content: function (content, textareaid, format, focus) { 362 textareaid = this.fix_textareaid(textareaid); 363 format = format ? format : 'raw'; 364 if (focus === undefined) focus = true; 365 if (this.is_tinymce(textareaid)) { 366 tinymce.get(textareaid).setContent(content, { format: format }); 367 if (focus) this.tinymce_focus(textareaid, true); 368 } else if (this.is_textarea(textareaid)) { 369 $wpf('textarea#' + textareaid).val(content); 370 if (focus) this.textarea_focus(textareaid, true); 371 } 372 }, 373 get_content: function (format, textareaid) { 374 textareaid = this.fix_textareaid(textareaid); 375 format = format ? format : 'text'; 376 var content = ''; 377 if (this.is_tinymce(textareaid)) { 378 content = tinymce.get(textareaid).getContent({ format: format }); 379 } else if (this.is_textarea(textareaid)) { 380 content = $wpf('textarea#' + textareaid).val(); 381 if (format === 'text' && content) { 382 content = content.replace(/<(iframe|embed)[^<>]*?>.*?<\/\1>/gi, ''); 383 content = content.replace(/(<([^<>]+?)>)/gi, ''); 384 } 385 } 386 return content.trim(); 387 }, 388 get_stats: function (textareaid) { 389 textareaid = this.fix_textareaid(textareaid); 390 391 var text = this.get_content('text', textareaid); 392 var raw_text = this.get_content('raw', textareaid); 393 var chars = text.length; 394 var words = text.split(/[\w\u2019'-]+/).length - 1; 395 var imgs = (raw_text.match(/<img[^<>]*?src=['"][^'"]+?['"][^<>]*?>/gi) || []).length; 396 var links = (raw_text.match(/<a[^<>]*?href=['"][^'"]+?['"][^<>]*?>.+?<\/a>/gi) || []).length; 397 var embeds = (raw_text.match(/<(iframe|embed)[^<>]*?>.*?<\/\1>/gi) || []).length; 398 399 return { 400 chars: chars, 401 words: words, 402 imgs: imgs, 403 links: links, 404 embeds: embeds, 405 has_content: !!(chars || imgs || links || embeds), 406 }; 407 }, 408}; 409 410function wpforo_notice_get_timeout (type) { 411 if (!type) type = 'neutral'; 412 if (wpforo.notice.timeouts[type] !== undefined) return parseInt(wpforo.notice.timeouts[type]); 413 return 8000; 414} 415 416function wpforo_notice_clear () { 417 var msg_box = $wpf('#wpf-msg-box'); 418 msg_box.hide(); 419 msg_box.empty(); 420} 421 422function wpforo_notice_show (notice, type) { 423 if (!notice) return; 424 type = (type === 'success' || type === 'error' ? type : 'neutral'); 425 426 var n = notice.search(/<p(?:\s[^<>]*?)?>/i); 427 if (n < 0) { 428 var phrase = wpforo_phrase(notice); 429 if (arguments.length > 2) { 430 for (var i = 2; i < arguments.length; i++) { 431 if (arguments[i] !== undefined) phrase = phrase.replace(/%[dfs]/, arguments[i]); 432 } 433 } 434 notice = '<p class="' + type + '">' + phrase + '</p>'; 435 } 436 437 notice = $wpf(notice); 438 $wpf('#wpforo-notifications-bar').appendTo('body'); 439 var msg_box = $wpf('#wpf-msg-box'); 440 msg_box.append(notice); 441 msg_box.show(150); 442 var timeout = wpforo_notice_get_timeout(type); 443 if (timeout) { 444 notice.delay(timeout).fadeOut(200, function () { 445 $wpf(this).remove(); 446 }); 447 } 448} 449 450function wpforo_notice_hide () { 451 $wpf('#wpf-msg-box').hide(); 452} 453 454function wpforo_load_show (msg) { 455 msg = typeof msg !== 'undefined' ? msg : 'Working'; 456 msg = String(msg); 457 msg = wpforo_phrase(msg); 458 $wpf('#wpforo-notifications-bar').appendTo('body'); 459 var load = $wpf('#wpforo-load'); 460 $wpf('.loadtext', load).text(msg); 461 load.showFlex(); 462} 463 464function wpforo_load_hide () { 465 $wpf('#wpforo-load').hide(); 466} 467 468function wpforo_init_dialog () { 469 $wpf('#wpforo-dialog-extra-wrap').on('click', '#wpforo-dialog-close', function () { 470 wpforo_dialog_hide(); 471 }); 472 $wpf(document).on('mousedown', '#wpforo-dialog-extra-wrap', function (e) { 473 if (!$wpf(e.target).closest('#wpforo-dialog').length) wpforo_dialog_hide(); 474 }); 475 $wpf(document).on('keydown', function (e) { 476 if (e.code === 'Escape') wpforo_dialog_hide(); 477 }); 478} 479 480function wpforo_dialog_show (title, content, w, h) { 481 var dialog = $wpf('#wpforo-dialog'); 482 if (content) { 483 var dialog_body = $wpf('#wpforo-dialog-body', dialog); 484 dialog_body.children().appendTo('#wpforo-dialog-backups'); 485 dialog_body.empty(); 486 if (content instanceof $wpf || content instanceof Element) { 487 content = $wpf(content); 488 content.appendTo(dialog_body); 489 content.show(); 490 content.css('visibility', 'visible'); 491 if (!title) title = content.data('title'); 492 } else if (typeof content === 'string') { 493 dialog_body.html(content); 494 } 495 } 496 if (title) $wpf('#wpforo-dialog-title', dialog).html(wpforo_phrase(title)); 497 if (w) dialog.css('width', w); 498 if (h) dialog.css('height', h); 499 $wpf('#wpforo-dialog-extra-wrap').appendTo('body'); 500 $wpf('html').addClass('wpforo-dialog-visible'); 501 $wpf('body').addClass('wpforo-dialog-visible animated fadeIn'); 502} 503 504function wpforo_dialog_hide () { 505 $wpf('html').removeClass('wpforo-dialog-visible'); 506 $wpf('body').removeClass('wpforo-dialog-visible animated fadeIn'); 507} 508 509function wpforo_phrase (phrase_key) { 510 // if( !(window.wpforo_phrases && typeof window.wpforo_phrases === 'object' && Object.keys(window.wpforo_phrases).length) ) wpforo_init_phrases(); 511 if (window.wpforo_phrases && typeof window.wpforo_phrases === 'object' && Object.keys(window.wpforo_phrases).length) { 512 var phrase_key_lower = phrase_key.toLowerCase(); 513 if (window.wpforo_phrases[phrase_key_lower] !== undefined) phrase_key = window.wpforo_phrases[phrase_key_lower]; 514 } 515 return phrase_key; 516} 517 518function wpforo_getTextSelection () { 519 $wpf('#wpf_multi_quote').remove(); 520 if (window.getSelection) { 521 var sel = window.getSelection(); 522 if (sel && sel.anchorNode && sel.anchorNode.parentNode && sel.anchorNode.parentNode.tagName !== 'A') { 523 var selectedText = sel.toString().trim(); 524 if (sel.rangeCount && selectedText.length) { 525 var getRangeAt_0 = sel.getRangeAt(0); 526 var rangeBounding = getRangeAt_0.getBoundingClientRect(); 527 var bodyBounding = document.documentElement.getBoundingClientRect(); 528 var left = rangeBounding.left + rangeBounding.width / 2 + Math.abs(bodyBounding.left) - 15; 529 var top = rangeBounding.bottom + Math.abs(bodyBounding.top) + 50; 530 531 var parent = $wpf(getRangeAt_0.commonAncestorContainer).closest('.wpforo-post-content, .wpforo-comment-content'); 532 var noNeedParent = $wpf(getRangeAt_0.commonAncestorContainer).closest('.wpforo-post-signature, .wpforo-post-content-bottom, .wpf-post-button-actions'); 533 var noNeedChild = $wpf(getRangeAt_0.endContainer).closest('.wpforo-post-signature, .wpforo-post-content-bottom, .wpf-post-button-actions'); 534 535 if (parent.length && !noNeedParent.length && !noNeedChild.length) { 536 var toolTip = $wpf('<div id="wpf_multi_quote"></div>'); 537 toolTip.css({ top: top, left: left }); 538 var link = $wpf('<span class="wpf-multi-quote" title="' + wpforo_phrase('Quote this text') + '"><i class="fas fa-quote-left"></i></span>').on('mousedown touchstart', function () { 539 var container = document.createElement('div'); 540 for (var i = 0; i < sel.rangeCount; ++i) container.appendChild(sel.getRangeAt(i).cloneContents()); 541 var post_wrap = $wpf(getRangeAt_0.startContainer).parents('[data-postid]'); 542 var userid = post_wrap.data('userid'); 543 if (!userid) userid = 0; 544 var postid = post_wrap.data('postid'); 545 if (!postid) postid = 0; 546 var editorContent = ''; 547 if (wpforo_editor.is_tinymce()) { 548 editorContent = '[quote data-userid="' + userid + '" data-postid="' + postid + '"]<p>' + container.innerHTML.replace(/\s*data-[\w-]+="[^"]*?"/gi, '') + '</p>[/quote]<p></p>'; 549 } else { 550 editorContent = '[quote data-userid="' + userid + '" data-postid="' + postid + '"]' + container.innerHTML.replace(/\s*data-[\w-]+="[^"]*?"/gi, '') + '[/quote]'; 551 } 552 wpforo_editor.insert_content(editorContent); 553 $wpf(this).remove(); 554 }); 555 toolTip.append(link); 556 $wpf('body').append(toolTip); 557 } 558 } 559 560 } 561 } 562} 563 564window.wpforo_fix_form_data_attributes = function () { 565 $wpf('form textarea[data-isbody=1]:first').each(function () { 566 var form = $wpf(this).closest('form'); 567 var id = $wpf(this).attr('id'); 568 form.attr('data-textareaid', id); 569 form.prop('data-textareaid', id); 570 form.data('textareaid', id); 571 }); 572}; 573 574$wpf(document).ready(function ($) {
575 var iwpfp = $('body.is_wpforo_page-1'); 576 if (iwpfp.length) $('html').addClass('is_wpforo_page-1'); 577 578 var wpforo_wrap = $('#wpforo-wrap'); 579 580 wpforo_setCookie('wpforo_browser_timezone', wpforo_get_browser_timezone(), { secure: true, 'max-age': 86400 }); 581 582 var scroll_to; 583 var exreg = new RegExp('\/' + wpforo.settings_slugs['postid'] + '\/(\\d+)\/?$', 'i'); 584 var match = location.pathname.match(exreg); 585 if (match) { 586 scroll_to = $('#post-' + match[1]); 587 } else { 588 //scroll_to = $("#m_, .wpforo-members-content, .wpforo-search-content", wpforo_wrap); 589 } 590 if (scroll_to !== undefined && scroll_to.length) { 591 $('html, body').scrollTop(scroll_to.offset().top - 25); 592 } 593 594 wpforo_init_dialog(); 595 596 if ($('form.wpforo-main-form').length) { 597 document.onselectionchange = function () { 598 wpforo_getTextSelection(); 599 }; 600 } 601 602 window.onbeforeunload = function (e) { 603 var forms = $('form[data-textareaid]').not(':hidden'); 604 if (forms.length) { 605 var i, textareaid; 606 for (i = 0; i < forms.length; i++) { 607 textareaid = $(forms[i]).data('textareaid'); 608 if (wpforo_editor.get_stats(textareaid).has_content) { 609 e = e || window.event; 610 e.returnValue = wpforo_phrase('Write something clever here..'); 611 return wpforo_phrase('Write something clever here..'); 612 } 613 } 614 } 615 }; 616 617 window.wpforo_fix_form_data_attributes(); 618 wpforo_tinymce_initializeIt('[data-wpforoeditor="tinymce"]', true); 619 620 setTimeout(function () { 621 wpforo_editor.fix_textareaid(); 622 wpforo_editor.set_main('', true); 623 624 var forum_sels = $('.wpf-topic-form-extra-wrap .wpf-topic-form-forumid', wpforo_wrap); 625 if (forum_sels.length) { 626 forum_sels.each(function (i, f) { 627 f = $(f); 628 var forum_opts = $('option:not([value="0"]):not([disabled])', f); 629 if (forum_opts.length === 1) { 630 631 var wpf_topic_form_extra_wrap = f.closest('.wpf-topic-form-extra-wrap'); 632 wpf_topic_form_extra_wrap.attr('data-is_just_one_forum', true); 633 wpf_topic_form_extra_wrap.prop('data-is_just_one_forum', true); 634 wpf_topic_form_extra_wrap.data('is_just_one_forum', true); 635 636 f.val(forum_opts[0].getAttribute('value')).trigger('change'); 637 } 638 }); 639 } 640 641 }, 1000); 642 643 wpforo_wrap.on('click drop', 'form[data-textareaid]', function () { 644 var textareaid = $(this).data('textareaid'); 645 wpforo_editor.set_active(textareaid); 646 }); 647 648 wpforo_wrap.on('focus', 'form[data-textareaid] textarea', function () { 649 var textareaid = $(this).parents('form[data-textareaid]').data('textareaid'); 650 if (textareaid === this.id) wpforo_editor.set_active(this.id); 651 }); 652 653 wpforo_wrap.on('keydown', 'form[data-textareaid]', function (e) { 654 if ((e.ctrlKey || e.metaKey) && (e.code === 'Enter' || e.code === 'NumpadEnter')) { 655 $('[type=submit]', $(this)).trigger('click'); 656 } else if (((e.ctrlKey || e.metaKey) && e.code === 'KeyS') || e.code === 'Pause' || e.code === 'MediaPlayPause') { 657 wpforo_trigger_custom_event(document, 'wpforo_textarea_ctrl_s', e); 658 e.preventDefault(); 659 return false; 660 } 661 }); 662 663 if ($('.wpforo-recent-content .wpf-p-error', wpforo_wrap).length) { $('.wpf-navi', wpforo_wrap).remove(); } 664 665 /** 666 * prevent multi submitting 667 * disable form elements for 10 seconds 668 */ 669 window.wpforo_prev_submit_time = 0; 670 wpforo_wrap.on('submit', 'form', function (e) { 671 if (window.wpforo_prev_submit_time) { 672 if (Date.now() - window.wpforo_prev_submit_time < 10000) return false; 673 } else { 674 var textareaid = $(this).data('textareaid'); 675 if (textareaid) { 676 var bodyminlength = $(this).data('bodyminlength'); 677 var bodymaxlength = $(this).data('bodymaxlength'); 678 if (bodyminlength || bodymaxlength) { 679 var body_stat = wpforo_editor.get_stats(textareaid); 680 if (bodyminlength) { 681 if (body_stat.chars < bodyminlength && !body_stat.embeds && !body_stat.links && !body_stat.imgs) { 682 wpforo_notice_show('Content characters length must be greater than %d', 'error', bodyminlength); 683 return false; 684 } 685 } 686 if (bodymaxlength) { 687 if (body_stat.chars > bodymaxlength) { 688 wpforo_notice_show('Content characters length must be smaller than %d', 'error', bodymaxlength); 689 return false;
690 } 691 } 692 } 693 694 wpforo_trigger_custom_event(document, 'wpforo_post_submit', { e, textareaid }); 695 if (window['wpforo_break_after_custom_event_wpforo_post_submit']) { 696 window['wpforo_break_after_custom_event_wpforo_post_submit'] = false; 697 return false; 698 } 699 } 700 701 wpforo_load_show(); 702 window.wpforo_prev_submit_time = Date.now(); 703 window.onbeforeunload = null; 704 setTimeout(function () { 705 window.wpforo_prev_submit_time = 0; 706 wpforo_load_hide(); 707 }, 10000); 708 } 709 }); 710 711 wpforo_wrap.on('click', '.wpf-spoiler-head', function () { 712 var spoiler_wrap = $(this).parents('.wpf-spoiler-wrap'); 713 if (spoiler_wrap.length) { 714 spoiler_wrap = $(spoiler_wrap[0]); 715 if (!spoiler_wrap.hasClass('wpf-spoiler-processing')) { 716 spoiler_wrap.toggleClass('wpf-spoiler-open').addClass('wpf-spoiler-processing'); 717 var spoiler_body = $('.wpf-spoiler-body', spoiler_wrap); 718 if (spoiler_body.length) { 719 var spoiler_chevron = $('.wpf-spoiler-chevron', spoiler_wrap); 720 $(spoiler_chevron[0]).toggleClass('fa-chevron-down fa-chevron-up'); 721 $(spoiler_body[0]).slideToggle(500, function () { 722 spoiler_wrap.removeClass('wpf-spoiler-processing'); 723 if (!spoiler_wrap.hasClass('wpf-spoiler-open')) { 724 $('.wpf-spoiler-wrap.wpf-spoiler-open .wpf-spoiler-head', spoiler_wrap).trigger('click'); 725 } 726 }); 727 } 728 } 729 } 730 }); 731 732 wpforo_wrap.on('click', '#add_wpftopic:not(.not_reg_user)', function () { 733 var form = $('.wpf-topic-create'); 734 $(this).attr('disabled', 'disabled'); 735 form.slideToggle('slow', () => { 736 var stat = form.is(':hidden'); 737 if (!window.add_wpftopic_phrase) window.add_wpftopic_phrase = $(this).html(); 738 var add_wpftopic = (stat ? window.add_wpftopic_phrase : '<i class="fas fa-times" aria-hidden="true"></i>'); 739 $(this).html(add_wpftopic); 740 wpforo_editor.set_content(''); 741 $('[name="thread[title]"]').trigger('focus'); 742 $('html').scrollTop(($(this).offset().top - 35)); 743 $(this).removeAttr('disabled'); 744 }); 745 }); 746 747 wpforo_wrap.on('click', '.wpf-answer-button .wpf-button:not(.not_reg_user)', function () { 748 $(this).closest('.wpf-bottom-bar').hide(); 749 }); 750 751 wpforo_wrap.on('click', '.wpforo-section .add_wpftopic:not(.not_reg_user)', function () { 752 var wrap = $(this).parents('div.wpforo-section'); 753 var form_wrap = $('.wpf-topic-form-extra-wrap', wrap); 754 755 var is_just_one_forum = form_wrap.data('is_just_one_forum'); 756 if (!is_just_one_forum) $('.wpf-topic-form-ajax-wrap').empty(); 757 var stat = form_wrap.is(':hidden'); 758 $('.wpf-topic-form-extra-wrap').slideUp('slow'); 759 var add_wpftopic; 760 if (stat) { 761 add_wpftopic = '<i class="fas fa-times" aria-hidden="true"></i>'; 762 form_wrap.slideDown('slow'); 763 } else { 764 add_wpftopic = '<i class="fas fa-feather-alt" aria-hidden="true"></i>' + $(this).data('phrase'); 765 form_wrap.slideUp('slow'); 766 } 767 if (!is_just_one_forum) { 768 var option_no_selected = $('option.wpf-topic-form-no-selected-forum'); 769 option_no_selected.show(); 770 option_no_selected.prop('selected', true); 771 } 772 $(this).html(add_wpftopic); 773 $('html').scrollTop((wrap.offset().top - 30)); 774 }); 775 776 wpforo_wrap.on('click', '.not_reg_user', function () { 777 wpforo_load_show(); 778 wpforo_notice_show(wpforo.notice.login_or_register); 779 wpforo_load_hide(); 780 }); 781 782 $(document).on('click', '#wpf-msg-box p', function () { 783 $(this).remove(); 784 }); 785 786 /* Home page loyouts toipcs toglle */ 787 wpforo_wrap.on('click', '.topictoggle', function () { 788 wpforo_load_show(); 789 790 var id = $(this).attr('id'); 791 792 id = id.replace('img-arrow-', ''); 793 $('.wpforo-last-topics-' + id).slideToggle('slow'); 794 if ($(this).hasClass('topictoggle') && $(this).hasClass('fa-chevron-down')) { 795 $('#img-arrow-' + id).removeClass('fa-chevron-down').addClass('fa-chevron-up'); 796 } else { 797 $('#img-arrow-' + id).removeClass('fa-chevron-up').addClass('fa-chevron-down'); 798 } 799 800 id = id.replace('button-arrow-', ''); 801 $('.wpforo-last-posts-' + id).slideToggle('slow'); 802 if ($(this).hasClass('topictoggle') && $(this).hasClass('wpfcl-0') && $(this).hasClass('fa-chevron-down')) { 803 $('#button-arrow-' + id).removeClass('fa-chevron-down').addClass('fa-chevron-up'); 804 } else { 805 $('#button-arrow-' + id).removeClass('fa-chevron-up').addClass('fa-chevron-down'); 806 } 807 808 wpforo_load_hide(); 809 }); 810 811 /* Home page loyouts toipcs toglle */ 812 wpforo_wrap.on('click', '.wpforo-membertoggle', function () { 813 var id = $(this).attr('id'); 814 id = id.replace('wpforo-memberinfo-toggle-', ''); 815 $('#wpforo-memberinfo-' + id).slideToggle('slow'); 816 if ($(this).find('i').hasClass('fa-caret-down')) { 817 $(this).find('i').removeClass('fa-caret-down').addClass('fa-caret-up'); 818 } else { 819 $(this).find('i').removeClass('fa-caret-up').addClass('fa-caret-down'); 820 } 821 }); 822 823 /* Threaded Layout Hide Replies */ 824 wpforo_wrap.on('click', '.wpf-post-replies-bar', function () { 825 var id = $(this).attr('id'); 826 id = id.replace('wpf-ttgg-', ''); 827 $('#wpf-post-replies-' + id).slideToggle('slow'); 828 var $angleIcon = $(this).find('.wpforo-ttgg i'); 829 if ($angleIcon.hasClass('fa-angle-down')) { 830 $angleIcon.removeClass('fa-angle-down').addClass('fa-angle-up'); 831 $(this).find('.wpforo-ttgg').attr('wpf-tooltip', wpforo_phrase('Hide Replies')); 832 } else { 833 $angleIcon.removeClass('fa-angle-up').addClass('fa-angle-down'); 834 $(this).find('.wpforo-ttgg').attr('wpf-tooltip', wpforo_phrase('Show Replies')); 835 } 836 }); 837 838 //Reply 839 wpforo_wrap.on('click', '.wpforo-reply:not(.wpforo_layout_4)', function () { 840 wpforo_load_show(); 841 842 var main_form = $('form.wpforo-main-form[data-textareaid]'); 843 var wrap = main_form.closest('.wpf-form-wrapper'); 844 wrap.show(); 845 846 $('.wpf-reply-form-title').html(wpforo_phrase('Leave a reply')); 847 848 var post_wrap = $(this).closest('[id^=post-][data-postid]'); 849 var parentpostid = post_wrap.data('postid'); 850 if (!parentpostid) parentpostid = 0; 851 $('.wpf-form-post-parentid', main_form).val(parentpostid); 852 853 var userid = parseInt(post_wrap.data('userid')); 854 var mention = post_wrap.data('mention'); 855 var isowner = parseInt(post_wrap.data('isowner')); 856 var content = (!isowner && userid && mention ? '@' + mention + (wpforo_editor.is_tinymce(wpforo_editor.get_main()) ? ' ' : ' ') : ''); 857 858 wpforo_editor.set_content(content, wpforo_editor.get_main()); 859 860 $('html').scrollTop(wrap.offset().top); 861 862 wpforo_load_hide(); 863 864 }); 865 866 //Answer 867 wpforo_wrap.on('click', '.wpforo-answer', function () { 868 wpforo_load_show(); 869 870 var main_form = $('form.wpforo-main-form[data-textareaid]'); 871 var wrap = main_form.closest('.wpf-form-wrapper'); 872 wrap.show(); 873 874 $('.wpf-reply-form-title').html(wpforo_phrase('Your answer')); 875 876 $('.wpf-form-postid', main_form).val(0); 877 $('.wpf-form-post-parentid', main_form).val(0); 878 879 var post_wrap = $(this).closest('[id^=post-][data-postid]'); 880 881 var userid = parseInt(post_wrap.data('userid')); 882 var mention = post_wrap.data('mention'); 883 var isowner = parseInt(post_wrap.data('isowner')); 884 var content = (!isowner && userid && mention ? '@' + mention + (wpforo_editor.is_tinymce(wpforo_editor.get_main()) ? ' ' : ' ') : ''); 885 886 wpforo_editor.set_content(content, wpforo_editor.get_main()); 887 888 $('html').scrollTop(wrap.offset().top); 889 890 wpforo_load_hide(); 891 892 }); 893 894 wpforo_wrap.on('click', '.wpforo-qa-comment, .wpforo-reply.wpf-action.wpforo_layout_4', function () { 895 var wrap = $(this).parents('.reply-wrap,.wpforo-qa-item-wrap'); 896 var post_wrap = $('.post-wrap', wrap); 897 if (!post_wrap.length) post_wrap = wrap; 898 var parentid = post_wrap.data('postid'); 899 if (!parentid) parentid = post_wrap.attr('id').replace('post-', ''); 900 if (!parentid) parentid = 0; 901 var form = $('.wpforo-post-form'); 902 var textareaid = form.data('textareaid'); 903 var textarea_wrap = $('.wpf_post_form_textarea_wrap', form); 904 var textarea = $('#' + textareaid, textarea_wrap); 905 var textareatype = textarea_wrap.data('textareatype'); 906 $('.wpf_post_parentid').val(parentid); 907 $('.wpforo-qa-comment,.wpforo-reply.wpf-action.wpforo_layout_4').show(); 908 $(this).hide(); 909 $('.wpforo-portable-form-wrap', wrap).show(); 910 if (!$('.wpforo-post-form', wrap).length) form.appendTo($('.wpforo-portable-form-wrap', wrap)); 911 912 form.show(); 913 if (textareatype && textareatype === 'rich_editor') { 914 textarea_wrap.html('<textarea id="' + textareaid + '" class="wpf_post_body" name="post[body]"></textarea>'); 915 wpforo_tinymce_initializeIt('#' + textareaid); 916 } else { 917 textarea.val(''); 918 textarea.trigger('focus'); 919 } 920 921 var userid = parseInt(post_wrap.data('userid')); 922 var mention = post_wrap.data('mention'); 923 var isowner = parseInt(post_wrap.data('isowner')); 924 var content = (!isowner && userid && mention ? '@' + mention + (wpforo_editor.is_tinymce(textareaid) ? ' ' : ' ') : ''); 925 926 wpforo_editor.set_content(content, textareaid); 927 }); 928 929 wpforo_wrap.on('click', '.wpf-button-close-form', function () { 930 $(this).parents('.wpforo-portable-form-wrap').hide(); 931 $('.wpforo-post-form').hide(); 932 $('.wpforo-qa-comment,.wpforo-reply.wpf-action.wpforo_layout_4').show(); 933 wpforo_editor.set_content(''); 934 }); 935 936 //mobile menu responsive toggle 937 wpforo_wrap.on('click', '#wpforo-menu .wpf-res-menu', function () { 938 $('#wpforo-menu .wpf-menu').toggle(); 939 }); 940 var wpfwin = $(window).width(); 941 var wpfwrap = wpforo_wrap.width(); 942 if (wpfwin >= 602 && wpfwrap < 800) { 943 wpforo_wrap.on('focus', '#wpforo-menu .wpf-search-field', function () { 944 $('#wpforo-menu .wpf-menu li').hide(); 945 wpforo_wrap.find('#wpforo-menu .wpf-res-menu').show(); 946 $('#wpforo-menu .wpf-search-field').css('transition-duration', '0s'); 947 }); 948 wpforo_wrap.on('blur', '#wpforo-menu .wpf-search-field', function () { 949 wpforo_wrap.find('#wpforo-menu .wpf-res-menu').hide(); 950 $('#wpforo-menu .wpf-menu li').show(); 951 $('#wpforo-menu .wpf-search-field').css('transition-duration', '0.4s'); 952 }); 953 } 954 955 // password show/hide switcher */ 956 wpforo_wrap.on('click', '.wpf-show-password', function () { 957 var btn = $(this); 958 var parent = btn.parents('.wpf-field-wrap'); 959 var input = $(':input', parent); 960 if (input.attr('type') === 'password') { 961 input.attr('type', 'text');
962 btn.removeClass('fa-eye-slash'); 963 btn.addClass('fa-eye'); 964 } else { 965 input.attr('type', 'password'); 966 btn.removeClass('fa-eye'); 967 btn.addClass('fa-eye-slash'); 968 } 969 }); 970 971 //Turn off on dev mode 972 //$(window).on('resize', function(){ if (window.RT) { clearTimeout(window.RT); } window.RT = setTimeout(function(){ this.location.reload(false);}, 100); }); 973 974 wpforo_wrap.on('change', '#wpforo_split_form #wpf_split_create_new', function () { 975 var checked = $('#wpf_split_create_new').is(':checked'), 976 target_url = $('#wpf_split_target_url'), 977 append = $('#wpf_split_append'), 978 new_title = $('#wpf_split_new_title'), 979 forumid = $('#wpf_split_forumid'); 980 if (checked) { 981 target_url.children('input').prop('disabled', true); 982 target_url.hide(); 983 append.children('input').prop('disabled', true); 984 append.hide(); 985 new_title.children('input').prop('disabled', false); 986 new_title.show(); 987 forumid.children('select').prop('disabled', false); 988 forumid.show(); 989 } else { 990 target_url.children('input').prop('disabled', false); 991 target_url.show(); 992 append.children('input').prop('disabled', false); 993 append.show(); 994 new_title.children('input').prop('disabled', true); 995 new_title.hide(); 996 forumid.children('select').prop('disabled', true); 997 forumid.hide(); 998 } 999 }); 1000 1001 //Facebook Share Buttons 1002 wpforo_wrap.on('click', '.wpf-fb', function () { 1003 var item_url = $(this).data('wpfurl'); 1004 // Facebook deprecated custom parameters - content comes from Open Graph meta tags 1005 var share_url = 'https://www.facebook.com/sharer/sharer.php?u=' + encodeURIComponent(item_url); 1006 window.open(share_url, 'facebook-share', 'width=580,height=400'); 1007 }); 1008 //Share Buttons Toggle 1009 wpforo_wrap.on('mouseover', '.wpf-sb', function () { 1010 $(this).find('.wpf-sb-toggle').find('i').addClass('wpfsa'); 1011 $(this).find('.wpf-sb-buttons').show(); 1012 }); 1013 wpforo_wrap.on('mouseout', '.wpf-sb', function () { 1014 $(this).find('.wpf-sb-toggle').find('i').removeClass('wpfsa'); 1015 $(this).find('.wpf-sb-buttons').hide(); 1016 }); 1017 wpforo_wrap.on('mouseover', '.wpf-sb-toggle', function () { 1018 $(this).next().filter('.wpf-sb-buttons').parent().find('i').addClass('wpfsa'); 1019 }); 1020 wpforo_wrap.on('mouseout', '.wpf-sb-toggle', function () { 1021 $(this).next().filter('.wpf-sb-buttons').parent().find('i').removeClass('wpfsa'); 1022 }); 1023 1024 //Forum Rules 1025 wpforo_wrap.on('click', '#wpf-open-rules', function () { 1026 $('.wpforo-legal-rules').toggle(); 1027 return false; 1028 }); 1029 wpforo_wrap.on('click', '#wpflegal-rules-yes', function () { 1030 $('#wpflegal_rules').prop('checked', true); 1031 $('#wpflegal-rules-not').removeClass('wpflb-active-not'); 1032 $(this).addClass('wpflb-active-yes'); 1033 setTimeout(function () { $('.wpforo-legal-rules').slideToggle('slow'); }, 500); 1034 }); 1035 wpforo_wrap.on('click', '#wpflegal-rules-not', function () { 1036 $('#wpflegal_rules').prop('checked', false); 1037 $('#wpflegal-rules-yes').removeClass('wpflb-active-yes'); 1038 $(this).addClass('wpflb-active-not'); 1039 }); 1040 1041 //Forum Privacy Buttons 1042 wpforo_wrap.on('click', '#wpf-open-privacy', function () { 1043 $('.wpforo-legal-privacy').toggle(); 1044 return false; 1045 }); 1046 wpforo_wrap.on('click', '#wpflegal-privacy-yes', function () { 1047 $('#wpflegal_privacy').prop('checked', true); 1048 $('#wpflegal-privacy-not').removeClass('wpflb-active-not'); 1049 $(this).addClass('wpflb-active-yes'); 1050 setTimeout(function () { $('.wpforo-legal-privacy').slideToggle('slow'); }, 500); 1051 }); 1052 wpforo_wrap.on('click', '#wpflegal-privacy-not', function () { 1053 $('#wpflegal_privacy').prop('checked', false); 1054 $('#wpflegal-privacy-yes').removeClass('wpflb-active-yes'); 1055 $(this).addClass('wpflb-active-not'); 1056 }); 1057 1058 //Facebook Login Button 1059 wpforo_wrap.on('click', '#wpflegal_fblogin', function () { 1060 if ($(this).is(':checked')) { 1061 $('.wpforo_fb-button').attr('style', 'pointer-events:auto; opacity:1;'); 1062 } else { 1063 $('.wpforo_fb-button').attr('style', 'pointer-events: none; opacity:0.6;'); 1064 } 1065 }); 1066 1067 wpforo_wrap.on('click', '.wpf-load-threads .wpf-forums', function () { 1068 $('.wpf-cat-forums', $(this).parents('div.wpfl-4')).slideToggle('slow'); 1069 $('i', $(this)).toggleClass('fa-chevron-down fa-chevron-up'); 1070 }); 1071 1072 wpforo_wrap.on('click', '[data-copy-wpf-furl], [data-copy-wpf-shurl]', function () { 1073 var urls = []; 1074 var full_url = $(this).data('copy-wpf-furl'); 1075 if (full_url) urls.push(decodeURIComponent(full_url)); 1076 var short_url = $(this).data('copy-wpf-shurl'); 1077 if (short_url) urls.push(decodeURIComponent(short_url)); 1078 if (urls.length) { 1079 var label = ''; 1080 var html = '';
1081 urls.forEach(function (url, i) { 1082 label = (urls.length === 2 && i === 1) ? wpforo_phrase('Short') : wpforo_phrase('Full'); 1083 html += '<div class="wpforo-copy-url-wrap">' + 1084 '<div class="wpforo-copy-input">' + 1085 '<div class="wpforo-copy-input-header">' + 1086 '<label class="wpforo-copy-url-label">' + 1087 '<i class="fas fa-link wpfsx"></i>' + 1088 '<span class="wpforo-copy-url-label-txt">' + label + '</span>' + 1089 '</label>' + 1090 '</div>' + 1091 '<div class="wpforo-copy-input-body">' + 1092 '<input dir="ltr" readonly class="wpforo-copy-url" type="text" value="' + url + '">' + 1093 '</div>' + 1094 '</div>' + 1095 '<div class="wpforo-copied-txt"><span>' + wpforo_phrase('Copied') + '</span></div>' + 1096 '</div>'; 1097 }); 1098 var title = wpforo_phrase('Share Urls'); 1099 wpforo_dialog_show(title, html, '40%', '260px'); 1100 } 1101 }); 1102 1103 // Topic ID copy to clipboard 1104 wpforo_wrap.on('click', '.wpf-topic-id[data-topicid]', function () { 1105 var $el = $(this); 1106 var topicid = $el.data('topicid'); 1107 if (topicid) { 1108 var originalTooltip = $el.attr('wpf-tooltip'); 1109 navigator.clipboard.writeText(topicid.toString()).then(function () { 1110 $el.attr('wpf-tooltip', wpforo_phrase('Copied!')); 1111 setTimeout(function () { 1112 $el.attr('wpf-tooltip', originalTooltip); 1113 }, 1500); 1114 }).catch(function () { 1115 // Fallback for older browsers 1116 var temp = $('<input>'); 1117 $('body').append(temp); 1118 temp.val(topicid).select(); 1119 document.execCommand('copy'); 1120 temp.remove(); 1121 $el.attr('wpf-tooltip', wpforo_phrase('Copied!')); 1122 setTimeout(function () { 1123 $el.attr('wpf-tooltip', originalTooltip); 1124 }, 1500); 1125 }); 1126 } 1127 }); 1128 1129 $(document).on('click', '.wpforo-copy-url-wrap', function () { 1130 var wrap = $(this); 1131 var input = $('input.wpforo-copy-url', wrap); 1132 if (input.length) { 1133 input[0].select(); 1134 if (document.execCommand('copy')) { 1135 wrap.addClass('wpforo-copy-animate'); 1136 setTimeout(function () { 1137 wrap.removeClass('wpforo-copy-animate'); 1138 }, 1000); 1139 } 1140 } 1141 }); 1142 1143 wpforo_wrap.on('click', '.wpf-toggle .wpf-toggle-advanced', function () { 1144 var wrap = $(this).closest('.wpf-toggle-wrap'); 1145 $('.wpf-ico', $(this)).toggleClass('fa-chevron-down fa-chevron-up'); 1146 $('.wpf-search-advanced-fields', wrap).slideToggle(350); 1147 }); 1148 1149 wpforo_wrap.on('click', '.wpf-toggle .wpf-toggle-custom', function () { 1150 var wrap = $(this).closest('.wpf-toggle-wrap'); 1151 $('.wpf-ico', $(this)).toggleClass('fa-chevron-down fa-chevron-up'); 1152 $('.wpf-search-custom-fields', wrap).slideToggle(350); 1153 }); 1154 1155 wpforo_wrap.on('click', 'form[data-textareaid] .wpforo-delete-custom-file', function () { 1156 if (confirm(wpforo_phrase('Are you sure you want to delete this file?'))) { 1157 var wrap = $(this).closest('.wpf-field-file-wrap'); 1158 var fieldKey = $(this).data('fieldkey'); 1159 if (fieldKey) wrap.html('<input type="hidden" name="wpftcf_delete[]" value="' + fieldKey + '">'); 1160 } 1161 }); 1162 1163 wpforo_wrap.on('change', '#wpf-profile-action', function () { 1164 var val = $(this).val(); 1165 var exreg = new RegExp('^https?://', 'i'); 1166 if (val.match(exreg)) location.href = val; 1167 }); 1168}); 1169 1170/** 1171 * 1172 * @param { jQuery|Element|Document } element 1173 * @param { string } name 1174 * @param { string|number|integer } value 1175 */ 1176function wpforo_setAttr (element, name, value) { 1177 if (element instanceof $wpf || element instanceof Element) { 1178 element = $wpf(element); 1179 element.prop(name, value); 1180 element.attr(name, value); 1181 1182 var match = name.match(new RegExp('^data-(.+)', 'i')); 1183 if (match) element.data(match[1], value); 1184 } 1185} 1186 1187function wpforo_confirm (msg, e) { 1188 if (!confirm(msg)) { 1189 e = e || window.event; 1190 e.stopPropagation(); 1191 e.preventDefault(); 1192 return false; 1193 } 1194 1195 return true; 1196} 1197 1198class wpfMultiInput extends HTMLElement { 1199 constructor () { 1200 super(); 1201 this.innerHTML += `<style> 1202 wpf-multi-input input::-webkit-calendar-picker-indicator, 1203 wpf-multi-input datalist{ 1204 display: none !important; 1205 } 1206 #wpforo #wpforo-wrap wpf-multi-input .wpf-invalid-msg{ 1207 display: none; 1208 color: red; 1209 font-weight: bold; 1210 } 1211 #wpforo #wpforo-wrap .wpf-multi-item > .wpf-multi-item-action{ 1212 margin: 0 3px; 1213 cursor: pointer; 1214 } 1215 #wpforo #wpforo-wrap .wpf-multi-item > .wpf-multi-item-action:hover > i{ 1216 color: black; 1217 transform: scale(1.2); 1218 } 1219 #wpforo #wpforo-wrap .wpf-multi-item.wpf-multi-item-known-1 > .wpf-save-variant{ 1220 display: none !important; 1221 } 1222 </style>`; 1223 this._shadowRoot = this.attachShadow({ mode: 'open' }); 1224 this._shadowRoot.innerHTML = `<style> 1225 /* NB use of pointer-events to only allow events from the à icon */ 1226 ::slotted(div.wpf-multi-item) { 1227 background-color: var(--wpf-multi-input-item-bg-color, #dedede) !important; 1228 border: var(--wpf-multi-input-item-border, 1px solid #ccc) !important; 1229 border-radius: 2px !important; 1230 color: #222 !important; 1231 display: inline-block !important; 1232 font-size: var(--wpf-multi-input-item-font-size, 14px) !important; 1233 margin: 5px !important; 1234 padding: 2px 5px 2px 5px !important; 1235 position: relative !important; 1236 top: -1px !important; 1237 } 1238 ::slotted(div.wpf-multi-item:hover) { 1239 background-color: #eee !important; 1240 color: black !important; 1241 } 1242 ::slotted(div.wpf-multi-item > .wpf-multi-item-action){ 1243 margin: 0 3px; 1244 cursor: pointer; 1245 } 1246 ::slotted(.wpf-multi-item.wpf-multi-item-known-1 > .wpf-save-variant){ 1247 display: none !important; 1248 } 1249 ::slotted(div.wpf-multi-item > .wpf-multi-item-action:hover > i){ 1250 color: black; 1251 transform: scale(1.2); 1252 } 1253 ::slotted(input){ 1254 border: 2px solid transparent !important; 1255 } 1256 ::slotted(input.wpf-invalid){ 1257 border-color: red !important; 1258 } 1259 </style><slot></slot>`; 1260 1261 this._datalist = this.querySelector('datalist');
1262 this._dbVariants = []; 1263 const dbvariants = this.dataset['dbvariants']; 1264 if (dbvariants) this._dbVariants = JSON.parse(dbvariants); 1265 1266 this._input = this.querySelector('input'); 1267 this._input.onblur = this._handleBlur.bind(this); 1268 this._input.oninput = this._handleInput.bind(this); 1269 this._input.onkeyup = (event) => { 1270 this._handleKeyup(event); 1271 }; 1272 this._input.form.onsubmit = (event) => { 1273 this._handleSubmit(event); 1274 }; 1275 this._items = [...this.querySelectorAll('.wpf-multi-item')]; 1276 this._items.forEach((item) => { 1277 item.querySelector('.wpf-del').onclick = () => { 1278 this._deleteItem(item); 1279 }; 1280 const save_button = item.querySelector('.wpf-save-variant'); 1281 if (save_button) { 1282 save_button.onclick = () => { 1283 this._saveItem(item); 1284 }; 1285 } 1286 }); 1287 1288 this._allowDuplicates = this.hasAttribute('allow-duplicates') || this._input.hasAttribute('allow-duplicates'); 1289 this._allowCustomValues = this.hasAttribute('allow-custom-values') || this._input.hasAttribute('allow-custom-values'); 1290 this._isRequired = this.hasAttribute('required') || this._input.hasAttribute('required'); 1291 this._input.removeAttribute('required'); 1292 1293 this._invalidMsg = this.querySelector('.wpf-invalid-msg'); 1294 } 1295 1296 // Called by _handleKeydown() when the value of the input is an allowed value. 1297 _addItem (value) { 1298 if (!value.trim()) return; 1299 if (!this._allowCustomValues && !this._dbVariants.includes(value)) return; 1300 if (!this._allowDuplicates && this.getValues().includes(value)) return; 1301 this._input.value = ''; 1302 const item = document.querySelector('template#wpf-multi-item-template').cloneNode(true).content.firstChild; 1303 item.classList.remove('wpf-multi-item-known-0', 'wpf-multi-item-known-1'); 1304 item.classList.add((this._dbVariants.includes(value) ? 'wpf-multi-item-known-1' : 'wpf-multi-item-known-0')); 1305 item.querySelector('.wpf-multi-item-value').textContent = value; 1306 item.querySelector('.wpf-del').onclick = () => { 1307 this._deleteItem(item); 1308 }; 1309 const save_button = item.querySelector('.wpf-save-variant'); 1310 if (save_button) { 1311 save_button.onclick = () => { 1312 this._saveItem(item); 1313 }; 1314 } 1315 this.insertBefore(item, this._input); 1316 1317 // Remove value from datalist options and from _allowedValues array. 1318 // Value is added back if an item is deleted (see _deleteItem()). 1319 if (!this._allowDuplicates && this._dbVariants.includes(value)) { 1320 for (const option of this._datalist.options) { 1321 if (option.value === value) { 1322 option.remove(); 1323 } 1324 } 1325 } 1326 } 1327 1328 // Called when the à icon is tapped/clicked or 1329 // by _handleKeydown() when Backspace is entered. 1330 _deleteItem (item) { 1331 if (!item.classList.contains('wpf-multi-item')) return; 1332 const value = item.querySelector('.wpf-multi-item-value').textContent; 1333 item.remove(); 1334 // If duplicates aren't allowed, value is removed (in _addItem()) 1335 // as a datalist option and from the _allowedValues array. 1336 // So â need to add it back here. 1337 if (!this._allowDuplicates && this._dbVariants.includes(value)) { 1338 const option = document.createElement('option'); 1339 option.value = value; 1340 // Insert as first option seems reasonable... 1341 this._datalist.insertBefore(option, this._datalist.firstChild); 1342 } 1343 } 1344 1345 _saveItem (item) { 1346 if (!item.classList.contains('wpf-multi-item')) return; 1347 const value = item.querySelector('.wpf-multi-item-value').textContent; 1348 1349 if (typeof value === 'string') { 1350 if (item.parentNode instanceof Node && item.parentNode.dataset && typeof item.parentNode.dataset['fieldkey'] === 'string') { 1351 this._ajaxSaveItem(+item.parentNode.dataset['formid'], item.parentNode.dataset['fieldkey'].trim(), value, () => { 1352 item.classList.remove('wpf-multi-item-known-0'); 1353 item.classList.add('wpf-multi-item-known-1'); 1354 }); 1355 } 1356 } 1357 } 1358 1359 _ajaxSaveItem (formid, fieldKey, value, resolve, reject) { 1360 if (!value.trim()) return; 1361 wpforo_load_show('Saving...'); 1362 1363 $wpf.ajax({ 1364 type: 'POST', 1365 data: { 1366 formid, 1367 fieldKey, 1368 value, 1369 action: 'wpforotcf_append_field_values', 1370 _wpfnonce: wpforo['nonces']['wpforotcf_append_field_values'], 1371 }, 1372 }).done(function (r) { 1373 if (r.success) { 1374 if (resolve) resolve(); 1375 } else { 1376 if (reject) reject(); 1377 } 1378 }).always(function () { 1379 wpforo_load_hide(); 1380 }); 1381 } 1382 1383 // Avoid stray text remaining in the input element that's not in a div.item. 1384 _handleBlur () { 1385 this._input.value = ''; 1386 } 1387 1388 // Called when input text changes, 1389 // either by entering text or selecting a datalist option. 1390 _handleInput () { 1391 // Add a div.item, but only if the current value 1392 // of the input is an allowed value
1393 const match = this._dbVariants.find(v => v.toLowerCase() === this._input.value.toLowerCase()); 1394 if (match !== undefined) this._addItem(match); 1395 } 1396 1397 // Called when text is entered or keys pressed in the input element. 1398 _handleKeyup (event) { 1399 const itemToDelete = event.target.previousElementSibling; 1400 const value = this._input.value; 1401 1402 // On Backspace, delete the div.item to the left of the input 1403 if (value === '' && event.key === 'Backspace' && itemToDelete) { 1404 this._deleteItem(itemToDelete); 1405 // Add a div.item, but only if the current value 1406 // of the input is an allowed value 1407 } else if (event.key === 'Enter' && value.trim()) { 1408 if (this._allowCustomValues) { 1409 event.preventDefault(); 1410 this._addItem(value); 1411 } else if (this._dbVariants.includes(value) && !this.getValues().includes(value)) { 1412 event.preventDefault(); 1413 this._addItem(value); 1414 } 1415 } 1416 } 1417 1418 _handleSubmit (event) { 1419 if (this._input.value) { 1420 event.preventDefault(); 1421 setTimeout(wpforo_load_hide, 100); 1422 if (this._allowCustomValues) this._addItem(this._input.value); 1423 this._input.value = ''; 1424 return; 1425 } 1426 1427 const values = this.getValues(); 1428 if (this._isRequired && !values.length) { 1429 event.preventDefault(); 1430 this._input.classList.add('wpf-invalid'); 1431 this._invalidMsg.style = 'display: inline-block'; 1432 let i = 0; 1433 const intervalHendler = setInterval(() => { 1434 this._input.classList.toggle('wpf-invalid'); 1435 if (i++ >= 4) { 1436 this._input.classList.add('wpf-invalid'); 1437 wpforo_load_hide(); 1438 clearInterval(intervalHendler); 1439 setTimeout(() => { 1440 this._input.classList.remove('wpf-invalid'); 1441 this._invalidMsg.style = 'display: none;'; 1442 }, 3000); 1443 } 1444 }, 50); 1445 } else if (values.length) { 1446 const name = this._input.name; 1447 this._input.removeAttribute('name'); 1448 values.forEach((val) => { 1449 const hidden = document.createElement('input'); 1450 hidden.type = 'hidden'; 1451 hidden.name = name; 1452 hidden.value = val; 1453 this._input.form.append(hidden); 1454 }); 1455 } 1456 } 1457 1458 // Public method for getting item values as an array. 1459 getValues () { 1460 const values = []; 1461 const items = this.querySelectorAll('.wpf-multi-item'); 1462 for (const item of items) { 1463 values.push(item.querySelector('.wpf-multi-item-value').textContent); 1464 } 1465 return values; 1466 } 1467} 1468 1469window.customElements.define('wpf-multi-input', wpfMultiInput); 1470 1471class wpfAutocompleteInput extends HTMLElement { 1472 constructor () { 1473 super(); 1474 this.innerHTML += `<style> 1475 wpf-autocomplete-input input::-webkit-calendar-picker-indicator, 1476 wpf-autocomplete-input datalist{ 1477 display: none !important; 1478 } 1479 #wpforo #wpforo-wrap wpf-autocomplete-input .wpf-invalid-msg{ 1480 display: none; 1481 color: red; 1482 font-weight: bold; 1483 } 1484 </style>`; 1485 this._shadowRoot = this.attachShadow({ mode: 'open' }); 1486 this._shadowRoot.innerHTML = `<style> 1487 ::slotted(input){ 1488 border: 2px solid transparent !important; 1489 } 1490 ::slotted(input.wpf-invalid){ 1491 border-color: red !important; 1492 } 1493 </style><slot></slot>`; 1494 this._datalist = this.querySelector('datalist'); 1495 this._dbVariants = []; 1496 const dbvariants = this.dataset['dbvariants']; 1497 if (dbvariants) this._dbVariants = JSON.parse(dbvariants); 1498 1499 this._input = this.querySelector('input'); 1500 this._input.form.onsubmit = (event) => { 1501 this._handleSubmit(event); 1502 }; 1503 1504 this._allowCustomValues = this.hasAttribute('allow-custom-values') || this._input.hasAttribute('allow-custom-values'); 1505 this._isRequired = this.hasAttribute('required') || this._input.hasAttribute('required'); 1506 this._invalidMsgRequired = this.querySelector('.wpf-invalid-msg.wpf-required'); 1507 this._invalidMsgNotAllowedValue = this.querySelector('.wpf-invalid-msg.wpf-not-allowed-value'); 1508 } 1509 1510 _handleSubmit (event) { 1511 const value = this._input.value; 1512 if (!this._isRequired && !value) return; 1513 let prevent = false; 1514 if (this._isRequired && !value) { 1515 this._invalidMsg = this._invalidMsgRequired; 1516 prevent = true; 1517 }
1517 else if (!this._allowCustomValues && !this._dbVariants.includes(value)) { 1518 this._invalidMsg = this._invalidMsgNotAllowedValue; 1519 prevent = true; 1520 } 1521 if (prevent) { 1522 event.preventDefault(); 1523 wpforo_load_hide(); 1524 this._input.classList.add('wpf-invalid'); 1525 this._invalidMsg.style = 'display: inline-block'; 1526 let i = 0; 1527 const intervalHendler = setInterval(() => { 1528 this._input.classList.toggle('wpf-invalid'); 1529 if (i++ >= 4) { 1530 this._input.classList.add('wpf-invalid'); 1531 wpforo_load_hide(); 1532 clearInterval(intervalHendler); 1533 setTimeout(() => { 1534 this._input.classList.remove('wpf-invalid'); 1535 this._invalidMsg.style = 'display: none;'; 1536 }, 3000); 1537 } 1538 }, 50); 1539 } 1540 } 1541} 1542 1543window.customElements.define('wpf-autocomplete-input', wpfAutocompleteInput); 1544 1545
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.