1(function (window, document) { 2 var namespace = window.EditorumUi = window.EditorumUi || {}; 3 var internals = namespace.__internals = namespace.__internals || {}; 4 var bootstrapCompatInitialized = false; 5 var notifyCompatInitialized = false; 6 7 function normalizeNotifyType(type) { 8 if (type === 'error') { 9 return 'danger'; 10 } 11 12 if (type === 'notice' || type === 'message') { 13 return 'info'; 14 } 15 16 if (type === 'warn') { 17 return 'warning'; 18 } 19 20 return type || 'info'; 21 } 22 23 function collectNotifyMessages(value) { 24 var container; 25 var lines = []; 26 27 if (value === null || typeof value === 'undefined') { 28 return lines; 29 } 30 31 if (Array.isArray(value)) { 32 internals.each(value, function (entry) { 33 lines = lines.concat(collectNotifyMessages(entry)); 34 }); 35 36 return lines; 37 } 38 39 if (typeof value !== 'string') { 40 lines.push(String(value)); 41 return lines; 42 } 43 44 if (value.indexOf('<') === -1) { 45 lines.push(value); 46 return lines; 47 } 48 49 container = document.createElement('div'); 50 container.innerHTML = value 51 .replace(/<br\s*\/?>/gi, '\n') 52 .replace(/<\/p>\s*<p[^>]*>/gi, '\n'); 53 54 lines = String(container.textContent || container.innerText || '') 55 .split('\n') 56 .map(function (line) { 57 return line.replace(/\s+/g, ' ').trim(); 58 }) 59 .filter(function (line) { 60 return line.length > 0; 61 }); 62 63 return lines; 64 } 65 66 function normalizeNotifyGroup(payload, options) { 67 var settings = options || {}; 68 var data = payload; 69 var type; 70 var title = ''; 71 var messages = []; 72 var timer; 73 74 if (typeof data === 'string') { 75 data = { 76 message: data 77 }; 78 } 79 80 if (!data || typeof data !== 'object') { 81 data = { 82 message: data 83 }; 84 } 85 86 type = normalizeNotifyType(settings.type || data.type); 87 title = collectNotifyMessages(data.title || settings.title).join(' ').trim(); 88 messages = collectNotifyMessages(data.message || data.text || data.content || data.html); 89 90 if (!messages.length && title) { 91 messages = [title]; 92 title = ''; 93 } 94 95 timer = parseInt(settings.timer || settings.delay || data.timer || data.delay, 10); 96 97 return { 98 type: type, 99 title: title, 100 messages: messages.length ? messages : [''], 101 timer: isNaN(timer) ? 4000 : timer 102 }; 103 } 104 105 function installNotifyCompat() { 106 if (notifyCompatInitialized) { 107 return false; 108 } 109 110 notifyCompatInitialized = true; 111 return true; 112 } 113 114 function getTabTargetSelector(trigger) { 115 if (!trigger) { 116 return ''; 117 } 118 119 return trigger.getAttribute('data-target') || trigger.getAttribute('href') || ''; 120 } 121 122 function getTabTarget(trigger) { 123 var targetSelector = getTabTargetSelector(trigger); 124 125 if (targetSelector.charAt(0) !== '#') { 126 return null; 127 } 128 129 return internals.query(targetSelector); 130 } 131 132 function getActiveTabTrigger(nav) { 133 if (!nav) { 134 return null; 135 } 136 137 return internals.query('li.active > [data-toggle="tab"], [data-toggle="tab"].active', nav); 138 } 139 140 function appendBackdrop() { 141 var backdrop = internals.query('.modal-backdrop'); 142 143 if (backdrop) { 144 return backdrop; 145 } 146 147 backdrop = document.createElement('div'); 148 backdrop.className = 'modal-backdrop fade in'; 149 document.body.appendChild(backdrop); 150 151 return backdrop; 152 } 153 154 function ensureModalPortalState(modal) { 155 if (!modal || modal.__editorumModalPortalState) { 156 return modal && modal.__editorumModalPortalState; 157 } 158 159 modal.__editorumModalPortalState = { 160 parent: null, 161 nextSibling: null, 162 placeholder: null, 163 portalled: false 164 }; 165 166 return modal.__editorumModalPortalState; 167 } 168 169 function portalModalToBody(modal) { 170 var state = ensureModalPortalState(modal); 171 var placeholder; 172 173 if (!modal || !state || state.portalled) { 174 return; 175 } 176 177 state.parent = modal.parentNode; 178 state.nextSibling = modal.nextSibling; 179 180 if (!state.parent || state.parent === document.body) { 181 state.portalled = true; 182 return; 183 } 184 185 placeholder = document.createComment('editorum-modal-portal'); 186 state.placeholder = placeholder; 187 state.parent.insertBefore(placeholder, state.nextSibling); 188 document.body.appendChild(modal); 189 state.portalled = true; 190 } 191 192 function restoreModalFromBody(modal) { 193 var state = modal && modal.__editorumModalPortalState; 194 195 if (!modal || !state || !state.portalled) { 196 return; 197 } 198 199 if (state.parent && state.parent !== document.body) { 200 if (state.placeholder && state.placeholder.parentNode === state.parent) { 201 state.parent.insertBefore(modal, state.placeholder); 202 state.placeholder.parentNode.removeChild(state.placeholder); 203 } else if (state.nextSibling && state.nextSibling.parentNode === state.parent) { 204 state.parent.insertBefore(modal, state.nextSibling); 205 } else { 206 state.parent.appendChild(modal); 207 } 208 } 209 210 state.parent = null; 211 state.nextSibling = null; 212 state.placeholder = null; 213 state.portalled = false;
214 } 215 216 function closeModal(modal, relatedTarget) { 217 var backdrops = internals.queryAll('.modal-backdrop'); 218 var hideEvent; 219 220 if (!modal) { 221 return false; 222 } 223 224 hideEvent = internals.dispatch(modal, 'hide.bs.modal', { 225 cancelable: true, 226 relatedTarget: relatedTarget || null 227 }); 228 229 if (hideEvent.prevented) { 230 return false; 231 } 232 233 modal.classList.remove('in'); 234 modal.setAttribute('aria-hidden', 'true'); 235 internals.hide(modal); 236 237 internals.each(backdrops, function (backdrop) { 238 if (backdrop.parentNode) { 239 backdrop.parentNode.removeChild(backdrop); 240 } 241 }); 242 243 document.body.classList.remove('modal-open'); 244 restoreModalFromBody(modal); 245 internals.dispatch(modal, 'hidden.bs.modal', { 246 relatedTarget: relatedTarget || null 247 }); 248 249 return true; 250 } 251 252 function closeAlert(dismiss) { 253 var targetSelector; 254 var target; 255 var closeEvent; 256 257 if (!dismiss) { 258 return false; 259 } 260 261 targetSelector = dismiss.getAttribute('data-target') || dismiss.getAttribute('href') || ''; 262 if (targetSelector.length > 1 && targetSelector.charAt(0) === '#') { 263 target = internals.query(targetSelector); 264 } 265 266 if (!target) { 267 target = internals.closest(dismiss, '.alert'); 268 } 269 270 if (!target) { 271 return false; 272 } 273 274 closeEvent = internals.dispatch(target, 'close.bs.alert', { 275 cancelable: true, 276 relatedTarget: dismiss 277 }); 278 279 if (closeEvent.prevented) { 280 return false; 281 } 282 283 target.classList.remove('in'); 284 internals.hide(target); 285 internals.dispatch(target, 'closed.bs.alert', { 286 relatedTarget: dismiss 287 }); 288 289 if (target.parentNode) { 290 target.parentNode.removeChild(target); 291 } 292 293 return true; 294 } 295 296 function openModal(modal, relatedTarget) { 297 var showEvent; 298 299 if (!modal) { 300 return false; 301 } 302 303 showEvent = internals.dispatch(modal, 'show.bs.modal', { 304 cancelable: true, 305 relatedTarget: relatedTarget || null 306 }); 307 308 if (showEvent.prevented) { 309 return false; 310 } 311 312 portalModalToBody(modal); 313 appendBackdrop(); 314 internals.show(modal, 'block'); 315 modal.classList.add('in'); 316 modal.setAttribute('aria-hidden', 'false'); 317 document.body.classList.add('modal-open'); 318 internals.dispatch(modal, 'shown.bs.modal', { 319 relatedTarget: relatedTarget || null 320 }); 321 322 return true; 323 } 324 325 function activateTab(trigger, target, options) { 326 var settings = options || {}; 327 var nav = internals.closest(trigger, '.nav, .nav-tabs, .tab-bar, .tabs-section'); 328 var item = internals.closest(trigger, 'li'); 329 var paneRoot = internals.closest(target, '.tab-content') || target.parentNode; 330 var currentTrigger = getActiveTabTrigger(nav); 331 var currentPane = currentTrigger ? getTabTarget(currentTrigger) : null; 332 var hiddenEvent; 333 var showEvent; 334 335 if (currentTrigger === trigger && currentPane === target) { 336 return true; 337 } 338 339 if (!settings.silent && currentTrigger && currentTrigger !== trigger) { 340 hiddenEvent = internals.dispatch(currentTrigger, 'hide.bs.tab', { 341 cancelable: true, 342 relatedTarget: trigger 343 }); 344 345 if (hiddenEvent.prevented) { 346 return false; 347 } 348 } 349 350 if (!settings.silent) { 351 showEvent = internals.dispatch(trigger, 'show.bs.tab', { 352 cancelable: true, 353 relatedTarget: currentTrigger || null 354 }); 355 356 if (showEvent.prevented) { 357 return false; 358 } 359 } 360 361 if (nav) { 362 internals.each(internals.queryAll('li', nav), function (navItem) { 363 navItem.classList.remove('active'); 364 }); 365 366 internals.each(internals.queryAll('[data-toggle="tab"]', nav), function (navTr
366igger) { 367 navTrigger.classList.remove('active'); 368 navTrigger.setAttribute('aria-selected', 'false'); 369 }); 370 } 371 372 if (item) { 373 item.classList.add('active'); 374 } 375 376 trigger.classList.add('active'); 377 trigger.setAttribute('aria-selected', 'true'); 378 379 if (paneRoot) { 380 internals.each(internals.queryAll('.tab-pane', paneRoot), function (pane) { 381 if (internals.closest(pane.parentNode, '.tab-content') !== paneRoot) { 382 return; 383 } 384 pane.classList.remove('active'); 385 pane.classList.remove('in'); 386 pane.setAttribute('aria-hidden', 'true'); 387 }); 388 } 389 390 target.classList.add('active'); 391 target.classList.add('in'); 392 target.setAttribute('aria-hidden', 'false'); 393 394 if (!settings.silent && currentTrigger && currentTrigger !== trigger) { 395 internals.dispatch(currentTrigger, 'hidden.bs.tab', { 396 relatedTarget: trigger 397 }); 398 } 399 400 if (!settings.silent) { 401 internals.dispatch(trigger, 'shown.bs.tab', { 402 relatedTarget: currentTrigger || null 403 }); 404 } 405 406 return true; 407 } 408 409 function syncBootstrapTabs() { 410 internals.each(internals.queryAll('[data-toggle="tab"]'), function (trigger) { 411 trigger.classList.remove('active'); 412 trigger.setAttribute('aria-selected', 'false'); 413 }); 414 415 internals.each(internals.queryAll('li.active > [data-toggle="tab"]'), function (trigger) { 416 var targetSelector = trigger.getAttribute('data-target') || trigger.getAttribute('href') || ''; 417 var target; 418 419 if (targetSelector.charAt(0) !== '#') { 420 return; 421 } 422 423 target = internals.query(targetSelector); 424 if (!target) { 425 return; 426 } 427 428 activateTab(trigger, target, { 429 silent: true 430 }); 431 }); 432 } 433 434 function setCollapseState(trigger, panel, shouldOpen) { 435 var icon = internals.query('.ds-icon', trigger); 436 var use; 437 438 panel.classList.toggle('in', shouldOpen); 439 panel.setAttribute('aria-expanded', shouldOpen ? 'true' : 'false'); 440 internals.toggle(panel, shouldOpen); 441 442 trigger.classList.toggle('collapsed', !shouldOpen); 443 trigger.setAttribute('aria-expanded', shouldOpen ? 'true' : 'false'); 444 445 if (icon) { 446 use = icon.querySelector('use'); 447 if (use) { 448 use.setAttribute('href', '#icon-' + (shouldOpen ? 'chevron-up' : 'chevron-down')); 449 } 450 } 451 } 452 453 function syncButtonGroup(group) { 454 if (!group) { 455 return; 456 } 457 458 internals.each(internals.queryAll('.btn', group), function (button) { 459 var input = internals.query('input[type="radio"], input[type="checkbox"]', button); 460 var isActive = input ? !!input.checked : button.classList.contains('active'); 461 462 button.classList.toggle('active', isActive); 463 button.setAttribute('aria-pressed', isActive ? 'true' : 'false'); 464 }); 465 } 466 467 function syncBootstrapButtons() { 468 internals.each(internals.queryAll('[data-toggle="buttons"]'), function (group) { 469 syncButtonGroup(group); 470 }); 471 } 472 473 function toggleButtonGroup(button) { 474 var group = internals.closest(button, '[data-toggle="buttons"]'); 475 var input = group && internals.query('input[type="radio"], input[type="checkbox"]', button); 476 var type; 477 var didChange = false; 478 479 if (!group || !input || input.disabled) { 480 return false; 481 } 482 483 type = (input.getAttribute('type') || '').toLowerCase(); 484 485 if (type === 'radio') { 486 if (!input.checked) { 487 internals.each(internals.queryAll('input[type="radio"]', group), function (radio) { 488 radio.checked = false; 489 }); 490 491 input.checked = true; 492 didChange = true; 493 } 494 } else if (type === 'checkbox') { 495 input.checked = !input.checked; 496 didChange = true; 497 } else { 498 return false;
499 } 500 501 syncButtonGroup(group); 502 503 if (didChange) { 504 input.dispatchEvent(new Event('change', { bubbles: true })); 505 } 506 507 input.dispatchEvent(new Event('input', { bubbles: true })); 508 return true; 509 } 510 511 function installJQueryBootstrapCompat() { 512 return false; 513 } 514 515 function initBootstrapCompat() { 516 if (bootstrapCompatInitialized) { 517 return true; 518 } 519 520 internals.initTooltipCompat(); 521 installNotifyCompat(); 522 installJQueryBootstrapCompat(); 523 bootstrapCompatInitialized = true; 524 syncBootstrapTabs(); 525 syncBootstrapButtons(); 526 527 document.addEventListener('click', function (event) { 528 var modalDismiss = internals.closest(event.target, '[data-dismiss="modal"]'); 529 var alertDismiss = internals.closest(event.target, '[data-dismiss="alert"]'); 530 var buttonGroupTrigger = internals.closest(event.target, '[data-toggle="buttons"] .btn'); 531 var tabTrigger = internals.closest(event.target, '[data-toggle="tab"]'); 532 var dropdownTrigger = internals.closest(event.target, '[data-toggle="dropdown"]'); 533 var collapseTrigger = internals.closest(event.target, '[data-toggle="collapse"]'); 534 var modalTrigger = internals.closest(event.target, '[data-toggle="modal"]'); 535 var dropdownRoot; 536 var targetSelector; 537 var target; 538 var parentSelector; 539 540 if (modalDismiss) { 541 target = internals.closest(modalDismiss, '.modal'); 542 if (!target && modalDismiss.getAttribute('data-target')) { 543 target = internals.query(modalDismiss.getAttribute('data-target')); 544 } 545 546 if (target) { 547 event.preventDefault(); 548 closeModal(target, modalDismiss); 549 } 550 551 return; 552 } 553 554 if (alertDismiss) { 555 event.preventDefault(); 556 closeAlert(alertDismiss); 557 return; 558 } 559 560 if (buttonGroupTrigger) { 561 event.preventDefault(); 562 toggleButtonGroup(buttonGroupTrigger); 563 return; 564 } 565 566 if (tabTrigger) { 567 targetSelector = tabTrigger.getAttribute('data-target') || tabTrigger.getAttribute('href') || ''; 568 if (targetSelector.charAt(0) !== '#') { 569 return; 570 } 571 572 target = internals.query(targetSelector); 573 if (!target) { 574 return; 575 } 576 577 event.preventDefault(); 578 activateTab(tabTrigger, target); 579 return; 580 } 581 582 if (dropdownTrigger) { 583 dropdownRoot = internals.closest(dropdownTrigger, '.dropdown'); 584 if (!dropdownRoot) { 585 return; 586 } 587 588 event.preventDefault(); 589 event.stopPropagation(); 590 591 internals.each(internals.queryAll('.dropdown.open, .open.dropdown'), function (dropdown) { 592 if (dropdown !== dropdownRoot) { 593 dropdown.classList.remove('open'); 594 } 595 }); 596 597 dropdownRoot.classList.toggle('open'); 598 return; 599 } 600 601 if (collapseTrigger) { 602 targetSelector = collapseTrigger.getAttribute('data-target') || collapseTrigger.getAttribute('href') || ''; 603 if (targetSelector.charAt(0) !== '#') { 604 return; 605 } 606 607 target = internals.query(targetSelector); 608 if (!target) { 609 return; 610 } 611 612 event.preventDefault(); 613 614 parentSelector = collapseTrigger.getAttribute('data-parent'); 615 if (!target.classList.contains('in') && parentSelector) { 616 internals.each(internals.queryAll('[data-toggle="collapse"]', internals.query(parentSelector) || document), function (openedTrigger) { 617 var openedTargetSelector; 618 var openedTarget; 619 620 if (openedTrigger === collapseTrigger) { 621 return; 622 } 623 624 openedTargetSelector = openedTrigger.getAttribute('data-target') || openedTrigger.getAttribute('href') || ''; 625 if (openedTargetSelector.charAt(0) !== '#') { 626 return; 627 } 628 629 openedTarget = internals.query(openedTargetSelector); 630 if (openedTarget) { 631 setCollapseState(openedTrigger, openedTarget, false); 632 } 633 }); 634 } 635 636 setCollapseState(collapseTrigger, target, !target.classList.contains('in')); 637 return; 638 } 639 640 if (modalTrigger) { 641 targetSelector = modalTrigger.getAttribute('data-target') || modalTrigger.getAttribute('href') || '';
642 if (targetSelector.charAt(0) !== '#') { 643 return; 644 } 645 646 target = internals.query(targetSelector); 647 if (!target) { 648 return; 649 } 650 651 event.preventDefault(); 652 openModal(target, modalTrigger); 653 } 654 }); 655 656 document.addEventListener('click', function (event) { 657 var dropdown = internals.closest(event.target, '.dropdown'); 658 659 if (!dropdown) { 660 internals.each(internals.queryAll('.dropdown.open, .open.dropdown'), function (opened) { 661 opened.classList.remove('open'); 662 }); 663 } 664 }); 665 666 document.addEventListener('click', function (event) { 667 var modal = internals.closest(event.target, '.modal'); 668 669 if (modal && event.target === modal) { 670 closeModal(modal); 671 } 672 673 if (internals.matches(event.target, '.modal-backdrop')) { 674 internals.each(internals.queryAll('.modal.in'), function (openModalElement) { 675 closeModal(openModalElement); 676 }); 677 } 678 }); 679 680 document.addEventListener('keydown', function (event) { 681 var openModalElement; 682 683 if (event.key === 'Escape' || event.keyCode === 27) { 684 openModalElement = internals.query('.modal.in'); 685 if (openModalElement) { 686 closeModal(openModalElement); 687 } 688 } 689 }); 690 691 document.addEventListener('change', function (event) { 692 var group = internals.closest(event.target, '[data-toggle="buttons"]'); 693 694 if (group && internals.matches(event.target, 'input[type="radio"], input[type="checkbox"]')) { 695 syncButtonGroup(group); 696 } 697 }); 698 699 return true; 700 } 701 702 internals.getTabTarget = getTabTarget; 703 internals.closeModal = closeModal; 704 internals.closeAlert = closeAlert; 705 internals.openModal = openModal; 706 internals.activateTab = activateTab; 707 internals.syncBootstrapTabs = syncBootstrapTabs; 708 internals.syncBootstrapButtons = syncBootstrapButtons; 709 internals.setCollapseState = setCollapseState; 710 internals.initBootstrapCompat = initBootstrapCompat; 711})(window, document);
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.