1(function (document, Joomla) { 2 "use strict"; 3 4 var options = Joomla.getOptions("plg_system_mcnsystem"); 5 var $token = options.token + "=1"; 6 var $userid = options.userid; 7 var $site_path = options.site_path; 8 var $login_text = options.login_text; 9 var $follow_enabled_action_text = options.follow_enabled_action_text; 10 var $follow_disabled_action_text = options.follow_disabled_action_text; 11 var $block_enabled_action_text = options.block_enabled_action_text; 12 var $block_disabled_action_text = options.block_disabled_action_text; 13 var $emails_enabled_action_text = options.emails_enabled_action_text; 14 var $emails_disabled_action_text = options.emails_disabled_action_text; 15 var $children_enabled_action_text = options.children_enabled_action_text; 16 var $children_disabled_action_text = options.children_disabled_action_text; 17 var $operation_failed_action_text = options.operation_failed_action_text; 18 var $no_access_action_text = options.no_access_action_text; 19 var $item_text = options.item_text; 20 var $category_text = options.category_text; 21 var $tag_text = options.tag_text; 22 var $author_text = options.author_text; 23 var $email_verification_text = options.email_verification_text; 24 var $subscription_exists_action_text = 25 options.subscription_exists_action_text; 26 var $name_validation_text = options.name_validation_text; 27 var $email_validation_text = options.email_validation_text; 28 var $unsubscribe_verification_text = options.unsubscribe_verification_text; 29 30 function isValidEmailAddress(emailAddress) { 31 var pattern = 32 /^([a-z\d!#$%&'*+\-\/=?^_`{|}~\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]+(\.[a-z\d!#$%&'*+\-\/=?^_`{|}~\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]+)*|"((([ \t]*\r\n)?[ \t]+)?([\x01-\x08\x0b\x0c\x0e-\x1f\x7f\x21\x23-\x5b\x5d-\x7e\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]|\\[\x01-\x09\x0b\x0c\x0d-\x7f\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]))*(([ \t]*\r\n)?[ \t]+)?")@(([a-z\d\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]|[a-z\d\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF][a-z\d\-._~\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]*[a-z\d\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])\.)+([a-z\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]|[a-z\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF][a-z\d\-._~\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]*[a-z\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])\.?$/i; 33 34 return pattern.test(emailAddress); 35 } 36 37 document.addEventListener("DOMContentLoaded", function () { 38 const mcn_btn_action = document.querySelectorAll(".mcn-btn-action"); 39 40 if (mcn_btn_action) { 41 mcn_btn_action.forEach(function (a) { 42 a.addEventListener("click", function (e) { 43 e.preventDefault(); 44 45 if (!e.target.classList.contains("mcn-btn-action")) 46 var $this = e.target.closest(".mcn-btn-action"); 47 else var $this = e.target; 48 49 // Check if there is a pending action 50 if (!$this.closest(".mcn-group").classList.contains("mcn-loading")) { 51 // Check if user is logged in 52 if ($userid > 0) { 53 var $component = $this.getAttribute("data-component"); 54 var $objecttype = $this.getAttribute("data-objecttype"); 55 var $objectid = $this.getAttribute("data-object"); 56 var $action = $this.getAttribute("data-action"); 57 var $emails = $this.getAttribute("data-emails"); 58 var $value = $this.getAttribute("data-value"); 59 var $title = $this.getAttribute("data-title"); 60 var $view; 61 62 if ( 63 $action === "followObject" || 64 $action === "setEmails" || 65 $action === "setChildren" 66 ) { 67 $view = "follow"; 68 } else { 69 $view = "block"; 70 } 71 72 // Add loading class 73 $this.closest(".mcn-group").classList.add("mcn-loading"); 74 75 // Show loader 76 $this 77 .closest(".mcn-group") 78 .querySelector(".mcn-loader").style.display = "inline-block"; 79 80 Joomla.request({ 81 url: 82 $site_path + 83 "index.php?option=com_contentnotifications&task=" + 84 $view + 85 "." + 86 $action + 87 "&emails=" + 88 $emails + 89 "&component=" + 90 $component + 91 "&objecttype=" + 92 $objecttype + 93 "&objectid=" + 94 $objectid + 95 "&userid=" + 96 $userid + 97 "&value=" + 98 $value + 99 "&" + 100 $token, 101 method: "POST", 102 onSuccess: (msg, xhr) => { 103 if (msg === "1") { 104 // controller returns true 105 // Reset buttons classes 106 if ($this.closest(".btn-group")) { 107 $this 108 .closest(".btn-group") 109 .querySelectorAll(".btn") 110 .forEach(function (a) { 111 a.classList.remove("btn-success", "btn-danger"); 112 }); 113 } 114 115 if ($this.closest(".btn-group")) { 116 $this 117 .closest(".btn-group") 118 .querySelectorAll(".btn") 119 .forEach(function (a) { 120 a.classList.add("btn-outline-secondary"); 121 }); 122 } 123 124 if ($this.querySelector(".mcn-i")) { 125 $this 126 .querySelector(".mcn-i") 127 .classList.remove("fa-check-square", "fa-square"); 128 } 129 130 // Get object type translation 131 var $objecttype_text; 132 133 switch ($objecttype) { 134 case "item": 135 $objecttype_text = $item_text; 136 break; 137 case "category": 138 $objecttype_text = $category_text; 139 break; 140 case "tag": 141 $objecttype_text = $tag_text; 142 break; 143 case "author": 144 $objecttype_text = $author_text; 145 break; 146 } 147 148 // Switch action tasks and values 149 switch ($action) { 150 case "followObject": 151 if ($value == "1") { 152 // Enable follow 153 $this.classList.remove("btn-outline-secondary"); 154 $this.classList.add("btn-success"); 155 $this.setAttribute("data-value", "0"); 156 157 // Reset block value 158 if ( 159 $this 160 .closest(".btn-group") 161 .querySelector(".mcn-block") 162 ) { 163 $this 164 .closest(".btn-group") 165 .querySelector(".mcn-block") 166 .setAttribute("data-value", "1"); 167 } 168 169 // Show checkboxes, reset checkboxes values 170 if ( 171 $this 172 .closest(".mcn-group") 173 .querySelector(".mcn-li-item-updates") 174 ) { 175 $this 176 .closest(".mcn-group") 177 .querySelector(".mcn-li-item-updates") 178 .classList.remove("d-none"); 179 } 180 181 if ( 182 $this 183 .closest(".mcn-group") 184 .querySelector(".mcn-li-item-notify") 185 ) { 186 $this 187 .closest(".mcn-group") 188 .querySelector(".mcn-li-item-notify") 189 .classList.remove("d-none"); 190 } 191 192 if ( 193 $this 194 .closest(".mcn-group") 195 .querySelector(".mcn-li-item-notify .btn") 196 ) { 197 $this 198 .closest(".mcn-group") 199 .querySelector(".mcn-li-item-notify .btn") 200 .setAttribute("data-value", "0"); 201 } 202 203 if ( 204 $this 205 .closest(".mcn-group") 206 .querySelector(".mcn-li-item-notify .mcn-i") 207 ) { 208 $this 209 .closest(".mcn-group") 210 .querySelector(".mcn-li-item-notify .mcn-i") 211 .classList.replace( 212 "fa-square", 213 "fa-check-square" 214 ); 215 } 216 217 if ( 218 $this 219 .closest(".mcn-group") 220 .querySelector(".mcn-li-item-children") 221 ) { 222 $this 223 .closest(".mcn-group") 224 .querySelector(".mcn-li-item-children") 225 .classList.remove("d-none"); 226 } 227 228 if ( 229 $this 230 .closest(".mcn-group") 231 .querySelector(".mcn-li-item-children .btn") 232 ) { 233 $this 234 .closest(".mcn-group") 235 .querySelector(".mcn-li-item-children .btn") 236 .setAttribute("data-value", "1"); 237 } 238 239 if ( 240 $this 241 .closest(".mcn-group") 242 .querySelector(".mcn-li-item-children .mcn-i") 243 ) { 244 $this 245 .closest(".mcn-group") 246 .querySelector(".mcn-li-item-children .mcn-i") 247 .classList.replace( 248 "fa-check-square", 249 "fa-square" 250 ); 251 } 252 253 // Success message 254 var $action_text = 255 $follow_enabled_action_text + 256 " " + 257 $objecttype_text + 258 ": <b>" + 259 $title + 260 "</b>"; 261 var messages = { 262 message: [$action_text], 263 }; 264 Joomla.renderMessages(messages); 265 } else if ($value == "0") { 266 // Reset follow value 267 $this.setAttribute("data-value", "1"); 268 269 // Hide checkboxes, reset checkboxes values 270 if ( 271 $this 272 .closest(".mcn-group") 273 .querySelector(".mcn-li-item-updates") 274 ) { 275 $this 276 .closest(".mcn-group") 277 .querySelector(".mcn-li-item-updates") 278 .classList.add("d-none"); 279 } 280 281 if ( 282 $this 283 .closest(".mcn-group") 284 .querySelector(".mcn-li-item-notify") 285 ) { 286 $this 287 .closest(".mcn-group") 288 .querySelector(".mcn-li-item-notify") 289 .classList.add("d-none"); 290 } 291 292 if ( 293 $this 294 .closest(".mcn-group") 295 .querySelector(".mcn-li-item-notify .btn") 296 ) { 297 $this 298 .closest(".mcn-group") 299 .querySelector(".mcn-li-item-notify .btn") 300 .setAttribute("data-value", "0"); 301 } 302 303 if ( 304 $this 305 .closest(".mcn-group") 306 .querySelector(".mcn-li-item-notify .mcn-i") 307 ) { 308 $this 309 .closest(".mcn-group") 310 .querySelector(".mcn-li-item-notify .mcn-i") 311 .classList.replace( 312 "fa-square", 313 "fa-check-square" 314 ); 315 } 316 317 if ( 318 $this 319 .closest(".mcn-group") 320 .querySelector(".mcn-li-item-children") 321 ) { 322 $this 323 .closest(".mcn-group") 324 .querySelector(".mcn-li-item-children") 325 .classList.add("d-none"); 326 } 327 328 if ( 329 $this 330 .closest(".mcn-group") 331 .querySelector(".mcn-li-item-children .btn") 332 ) { 333 $this 334 .closest(".mcn-group") 335 .querySelector(".mcn-li-item-children .btn") 336 .setAttribute("data-value", "1"); 337 } 338 339 if ( 340 $this 341 .closest(".mcn-group") 342 .querySelector(".mcn-li-item-children .mcn-i") 343 ) { 344 $this 345 .closest(".mcn-group") 346 .querySelector(".mcn-li-item-children .mcn-i") 347 .classList.replace( 348 "fa-check-square", 349 "fa-square" 350 ); 351 } 352 353 // Success message 354 var $action_text = 355 $follow_disabled_action_text + 356 " " + 357 $objecttype_text + 358 ": <b>" + 359 $title + 360 "</b>"; 361 var messages = { 362 message: [$action_text], 363 }; 364 Joomla.renderMessages(messages); 365 } 366 367 // Remove loading class 368 $this 369 .closest(".mcn-group") 370 .classList.remove("mcn-loading"); 371
372 break; 373 374 case "blockObject": 375 if ($value == "1") { 376 // Enable block 377 $this.classList.remove("btn-outline-secondary"); 378 $this.classList.add("btn-danger"); 379 $this.setAttribute("data-value", "0"); 380 381 // Reset follow value 382 $this 383 .closest(".btn-group") 384 .querySelector(".mcn-follow") 385 .setAttribute("data-value", "1"); 386 387 // Hide checkboxes, reset checkboxes values 388 if ( 389 $this 390 .closest(".mcn-group") 391 .querySelector(".mcn-li-item-updates") 392 ) { 393 $this 394 .closest(".mcn-group") 395 .querySelector(".mcn-li-item-updates") 396 .classList.add("d-none"); 397 } 398 399 if ( 400 $this 401 .closest(".mcn-group") 402 .querySelector(".mcn-li-item-notify") 403 ) { 404 $this 405 .closest(".mcn-group") 406 .querySelector(".mcn-li-item-notify") 407 .classList.add("d-none"); 408 } 409 410 if ( 411 $this 412 .closest(".mcn-group") 413 .querySelector(".mcn-li-item-notify .btn") 414 ) { 415 $this 416 .closest(".mcn-group") 417 .querySelector(".mcn-li-item-notify .btn") 418 .setAttribute("data-value", "0"); 419 } 420 421 if ( 422 $this 423 .closest(".mcn-group") 424 .querySelector(".mcn-li-item-notify .mcn-i") 425 ) { 426 $this 427 .closest(".mcn-group") 428 .querySelector(".mcn-li-item-notify .mcn-i") 429 .classList.replace( 430 "fa-square", 431 "fa-check-square" 432 ); 433 } 434 435 if ( 436 $this 437 .closest(".mcn-group") 438 .querySelector(".mcn-li-item-children") 439 ) { 440 $this 441 .closest(".mcn-group") 442 .querySelector(".mcn-li-item-children") 443 .classList.add("d-none"); 444 } 445 446 if ( 447 $this 448 .closest(".mcn-group") 449 .querySelector(".mcn-li-item-children .btn") 450 ) { 451 $this 452 .closest(".mcn-group") 453 .querySelector(".mcn-li-item-children .btn") 454 .setAttribute("data-value", "1"); 455 } 456 457 if ( 458 $this 459 .closest(".mcn-group") 460 .querySelector(".mcn-li-item-children .mcn-i") 461 ) { 462 $this 463 .closest(".mcn-group") 464 .querySelector(".mcn-li-item-children .mcn-i") 465 .classList.replace( 466 "fa-check-square", 467 "fa-square" 468 ); 469 } 470 471 // Success message 472 var $action_text = 473 $block_enabled_action_text + 474 " " + 475 $objecttype_text + 476 ": <b>" + 477 $title + 478 "</b>"; 479 var messages = { 480 message: [$action_text], 481 }; 482 Joomla.renderMessages(messages); 483 } else if ($value == "0") { 484 // Reset block value 485 $this.setAttribute("data-value", "1"); 486 487 // Success message 488 var $action_text = 489 $block_disabled_action_text + 490 " " + 491 $objecttype_text + 492 ": <b>" + 493 $title + 494 "</b>"; 495 var messages = { 496 message: [$action_text], 497 }; 498 Joomla.renderMessages(messages); 499 } 500 501 // Remove loading class 502 $this 503 .closest(".mcn-group") 504 .classList.remove("mcn-loading"); 505 506 break; 507 508 case "setEmails": 509 if ($value == "1") { 510 $this 511 .querySelector(".mcn-i") 512 .classList.add("fa-check-square"); 513 $this.setAttribute("data-value", "0"); 514 515 // Success message 516 var $action_text = 517 $emails_enabled_action_text + 518 " " + 519 $objecttype_text + 520 ": <b>" + 521 $title + 522 "</b>"; 523 var messages = { 524 message: [$action_text], 525 }; 526 Joomla.renderMessages(messages); 527 } else if ($value == "0") { 528 $this 529 .querySelector(".mcn-i") 530 .classList.add("fa-square"); 531 $this.setAttribute("data-value", "1"); 532 533 // Success message 534 var $action_text = 535 $emails_disabled_action_text + 536 " " + 537 $objecttype_text + 538 ": <b>" + 539 $title + 540 "</b>"; 541 var messages = { 542 message: [$action_text], 543 }; 544 Joomla.renderMessages(messages); 545 } 546 547 // Remove loading class 548 $this 549 .closest(".mcn-group") 550 .classList.remove("mcn-loading"); 551 552 break; 553 554 case "setChildren": 555 if ($value == "1") { 556 $this 557 .querySelector(".mcn-i") 558 .classList.add("fa-check-square"); 559 $this.setAttribute("data-value", "0"); 560 561 // Success message 562 var $action_text = 563 $children_enabled_action_text + 564 " " + 565 $objecttype_text + 566 ": <b>" + 567 $title + 568 "</b>"; 569 var messages = { 570 message: [$action_text], 571 }; 572 Joomla.renderMessages(messages); 573 } else if ($value == "0") { 574 $this 575 .querySelector(".mcn-i") 576 .classList.add("fa-square"); 577 $this.setAttribute("data-value", "1"); 578 579 // Success message 580 var $action_text = 581 $children_disabled_action_text + 582 " " + 583 $objecttype_text + 584 ": <b>" + 585 $title + 586 "</b>"; 587 var messages = { 588 message: [$action_text], 589 }; 590 Joomla.renderMessages(messages); 591 } 592 593 // Remove loading class 594 $this 595 .closest(".mcn-group") 596 .classList.remove("mcn-loading"); 597 598 break; 599 } 600 } else if (msg === "noaccess") { 601 // controller returns 'noaccess' 602 // Log error in console 603 console.log(msg); 604 605 // Remove loading class 606 $this.closest(".mcn-group").classList.remove("mcn-loading"); 607 608 // Error message 609 var $action_text = $no_access_action_text; 610 var messages = { 611 error: [$action_text], 612 }; 613 Joomla.renderMessages(messages); 614 } // controller returns false - model failed 615 else { 616 // Log error in console 617 console.log(msg); 618 619 // Remove loading class 620 $this.closest(".mcn-group").classList.remove("mcn-loading"); 621 622 // Error message 623 var $action_text = $operation_failed_action_text; 624 var messages = { 625 error: [$action_text], 626 }; 627 Joomla.renderMessages(messages); 628 } 629 630 // Hide loader 631 if ( 632 !$this.closest(".mcn-group").querySelector(".mcn-loading") 633 ) { 634 $this 635 .closest(".mcn-group") 636 .querySelector(".mcn-loader").style.display = "none"; 637 } 638 }, 639 onError: (xhr) => { 640 console.log(xhr); 641 }, 642 }); 643 } else { 644 // Login message 645 var messages = { 646 error: [$login_text], 647 }; 648 Joomla.renderMessages(messages); 649 } 650 } 651 }); 652 }); 653 } 654 655 // Guest form 656 const mcn_btn_guest_action = document.querySelectorAll( 657 ".mcn-btn-guest-action" 658 ); 659 660 if (mcn_btn_guest_action) { 661 mcn_btn_guest_action.forEach(function (a) { 662 a.addEventListener("click", function (e) { 663 e.preventDefault(); 664 var $this = e.target; 665 var $action = $this.getAttribute("data-action"); 666 667 // Check if there is a pending action 668 if (!$this.closest(".mcn-group").classList.contains("mcn-loading")) {
669 var $name = $this 670 .closest(".mcn-form") 671 .querySelector('input[name="mcn_guest_name"]').value; 672 $name = $name.substring(0, 100); 673 $name = $name.replace(/[&\/\\#,+()$~%.'":*?<>{}]/g, ""); 674 675 if ($action != "unsubscribeGuest") { 676 // Validate name 677 if (!$name || $name == "") { 678 var messages = { 679 error: [$name_validation_text], 680 }; 681 Joomla.renderMessages(messages); 682 683 return false; 684 } 685 } 686 687 // Validate email 688 var $email = $this 689 .closest(".mcn-form") 690 .querySelector('input[name="mcn_guest_email"]').value; 691 $email = $email.substring(0, 100); 692 693 if (!isValidEmailAddress($email) || !$email || $email == "") { 694 var messages = { 695 error: [$email_validation_text], 696 }; 697 Joomla.renderMessages(messages); 698 699 return false; 700 } 701 702 $email = encodeURIComponent($email); 703 704 var $component = $this.getAttribute("data-component"); 705 var $objecttype = $this.getAttribute("data-objecttype"); 706 var $objectid = $this.getAttribute("data-object"); 707 var $title = $this.getAttribute("data-title"); 708 var $return = $this.getAttribute("data-return"); 709 710 // Add loading class 711 $this.closest(".mcn-group").classList.add("mcn-loading"); 712 713 // Show loader 714 $this 715 .closest(".mcn-group") 716 .querySelector(".mcn-loader").style.display = "inline-block"; 717 718 // Perform ajax actions 719 Joomla.request({ 720 url: 721 $site_path + 722 "index.php?option=com_contentnotifications&task=follow." + 723 $action + 724 "&redirect=" + 725 $return + 726 "&component=" + 727 $component + 728 "&objecttype=" + 729 $objecttype + 730 "&objectid=" + 731 $objectid + 732 "&username=" + 733 $name + 734 "&useremail=" + 735 $email + 736 "&" + 737 $token, 738 method: "POST", 739 onSuccess: (msg, xhr) => { 740 // Get object type translation 741 var $objecttype_text; 742 743 switch ($objecttype) { 744 case "item": 745 $objecttype_text = $item_text; 746 break; 747 case "category": 748 $objecttype_text = $category_text; 749 break; 750 case "tag": 751 $objecttype_text = $tag_text; 752 break; 753 case "author": 754 $objecttype_text = $author_text; 755 break; 756 } 757 758 // subscribeGuest: Subscription exists 759 if (msg === "2") { 760 // Remove loading class 761 $this.closest(".mcn-group").classList.remove("mcn-loading"); 762 763 // Success message 764 var $action_text = 765 $subscription_exists_action_text + " " + $objecttype_text; 766 var messages = { 767 message: [$action_text], 768 }; 769 Joomla.renderMessages(messages); 770 } // subscribeGuest: Controller returns true 771 else if (msg === "1") { 772 // Remove loading class 773 $this.closest(".mcn-group").classList.remove("mcn-loading"); 774 775 // Success message 776 var $action_text = 777 $follow_enabled_action_text + 778 " " + 779 $objecttype_text + 780 ": <b>" + 781 $title + 782 "</b><br>" + 783 $email_verification_text; 784 var messages = { 785 message: [$action_text], 786 }; 787 Joomla.renderMessages(messages); 788 } // unsubscribeGuest: Controller returns success message '3' 789 else if (msg === "3") { 790 // Remove loading class 791 $this.closest(".mcn-group").classList.remove("mcn-loading"); 792 793 // Success message 794 var $action_text = $unsubscribe_verification_text; 795 var messages = { 796 message: [$action_text], 797 }; 798 Joomla.renderMessages(messages); 799 } // Controller returns false - model failed 800 else { 801 // Log error in console 802 console.log(msg); 803 804 // Remove loading class 805 $this.closest(".mcn-group").classList.remove("mcn-loading"); 806 807 // Error message 808 var $action_text = $operation_failed_action_text; 809 var messages = { 810 error: [$action_text], 811 }; 812 Joomla.renderMessages(messages); 813 } 814 815 // Hide loader 816 if ( 817 !$this.closest(".mcn-group").querySelector(".mcn-loading") 818 ) { 819 $this 820 .closest(".mcn-group") 821 .querySelector(".mcn-loader").style.display = "none"; 822 } 823 }, 824 onError: (xhr) => { 825 console.log(xhr); 826 }, 827 }); 828 } 829 }); 830 }); 831 } 832 }); 833})(document, Joomla);
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.