1const utils = {} 2utils.bnewsslider = function () { 3 $('.cmp-breaking-news__ul').slick({ 4 slidesToScroll: 1, 5 autoplay: true, 6 autoplaySpeed: 3500, 7 vertical: true, 8 infinite: false, 9 arrows: false, 10 centerMode: false, 11 adaptiveHeight: true, 12 pauseOnFocus: false, 13 }); 14 $('.cmp-breaking-news__close').on("click", function () { 15 $('.cmp-breaking-news').slideUp(200); 16 }); 17} 18// Mega menu 19function menuMoreAdjust() { 20 if ($(window).width() > 991) { 21 let navwidth = 0; 22 const morewidth = $('.main-nav .main-nav__ul .main-nav__li--sub-nav').outerWidth(true); 23 $('.main-nav .main-nav__ul > li.main-nav__li:not(.main-nav__li--sub-nav)').each(function () { 24 navwidth += $(this).children('.main-nav__a').outerWidth(true) + 5; 25 }); 26 const availablespace = $('.main-nav__in').width() - morewidth; 27 if (navwidth > availablespace) { 28 const lastItem = $('.main-nav .main-nav__ul > li.main-nav__li:not(.main-nav__li--sub-nav)').last(); 29 lastItem.attr('data-width', lastItem.outerWidth(true)); 30 lastItem.prependTo($('.main-nav .main-nav__ul .main-nav__li--sub-nav .main-nav__subnav-ul')); 31 $('.main-nav .main-nav__ul').addClass("nav-visible"); 32 menuMoreAdjust(); 33 } else { 34 $('.main-nav .main-nav__ul').addClass("nav-visible"); 35 const firstMoreElement = $('.main-nav .main-nav__ul li.main-nav__li--sub-nav li').first(); 36 if (navwidth + firstMoreElement.data('width') < availablespace) { 37 firstMoreElement.insertBefore($('.main-nav .main-nav__ul .main-nav__li--sub-nav')); 38 } 39 } 40 } 41 if ($('.main-nav__li--sub-nav li').length > 0) { 42 $('.main-nav__li--sub-nav').css('display', 'inline-block'); 43 } else { 44 $('.main-nav__li--sub-nav').css('display', 'none'); 45 } 46} 47 48function calcWidth2() { 49 50 $('.cmp-channel-block__nav').each(function () { 51 52 53 const $this = $(this); 54 55 if ($(window).width() > 991) { 56 let navwidth2 = 0; 57 const morewidth2 = $this.find('.cmp-channel-block__nav-ul .cmp-channel-block__nav-li--more').outerWidth(true); 58 $this.find('.cmp-channel-block__nav-ul > li:not(.cmp-channel-block__nav-li--more)').each(function () { 59 navwidth2 += $(this).children('a').outerWidth(true) + 5; 60 }); 61 const availablespace2 = $this.width() - morewidth2; 62 if (navwidth2 > availablespace2) { 63 const lastItem2 = $this.find('.cmp-channel-block__nav-ul > li:not(.cmp-channel-block__nav-li--more)').last(); 64 lastItem2.attr('data-width', lastItem2.outerWidth(true)); 65 lastItem2.prependTo($this.find('.cmp-channel-block__nav-ul .cmp-channel-block__nav-li--more ul')); 66 $this.find('.cmp-channel-block__nav-ul').addClass("nav-visible"); 67 calcWidth2(); 68 } else { 69 $this.find('.cmp-channel-block__nav-ul').addClass("nav-visible"); 70 const firstMoreElement2 = $this.find('.cmp-channel-block__nav-ul li.cmp-channel-block__nav-li--more li').first(); 71 if (navwidth2 + firstMoreElement2.data('width') < availablespace2) { 72 firstMoreElement2.insertBefore($this.find('.cmp-channel-block__nav-ul .cmp-channel-block__nav-li--more')); 73 } 74 } 75 } 76 if ($this.find('.cmp-channel-block__nav-li--more li').length > 0) { 77 $this.find('.cmp-channel-block__nav-li--more').css('display', 'inline-block'); 78 $this.find('.cmp-channel-block__nav-ul').addClass("channel-block__more-menu"); 79 80 81 82 } else { 83 $this.find('.cmp-channel-block__nav-li--more').css('display', 'none'); 84 $this.find('.cmp-channel-block__nav-ul').removeClass("channel-block__more-menu"); 85 } 86 87 88 }); 89} 90function wrapMoremenu(){ 91 $('.cmp-channel-block__nav').each(function () { 92 $(this).find('.cmp-channel-block__navsub-Ul').wrap("<div class='cmp-channel-block__navsub-Ul-wraper'></div>"); 93 }); 94} 95 96function modalPopup() { 97 let appendthis = ("<div class='modal-overlay js-modal-close'></div>"); 98 $('.open-modal[data-target]').off().on("click", function (e) { 99 e.preventDefault(); 100 let modalBox = $(this).attr("data-target"); 101 let docWidth = $(window).width(); 102 if (docWidth <= 991 && modalBox == "shareModelObitLst") { 103 let $obtBlock = $(this).closest(".obt-lst-blk__in"); 104 let fragmentUrl = $obtBlock.data("fragment-encodedurl"); 105 let titleText = $obtBlock.data("fragment-name"); 106 fragmentUrl = decodeURIComponent(fragmentUrl); 107 navigator 108 .share({ 109 title : titleText, 110 text : titleText, 111 url : fragmentUrl, 112 }) 113 .then(() => {}) 114 .catch((error) => {}); 115 } 116 else if(docWidth <= 991 && modalBox == "announcementShareModel"){ 117 let $obtBlock = $(this).closest(".cmp-announcment__item"); 118 let fragmentUrl = $obtBlock.data("fragment-encodedurl"); 119 fragmentUrl = decodeURIComponent(fragmentUrl); 120 let titleText = $obtBlock.data("fragment-name"); 121 let district = $obtBlock.data('fragment-district'); 122 let formattedDistrict = district ? district.replace(/-/g, ' ').split(' ') 123 .map(word => word.charAt(0).toUpperCase() + word.slice(1).toLowerCase()).join(' ') : ''; 124 let description = stripHtml($obtBlock.data('fragment-description')); 125 let truncatedDescription = description.length > 120 ? description.substring(0, 120) + '...' : description; 126 let isGlobalMalayali = window.location.pathname.includes('global-malayali'); 127 let subject = isGlobalMalayali ? `${formattedDistrict} Community News` : `${formattedDistrict} Announcement`; 128 let body = titleText || truncatedDescription; 129 130 navigator 131 .share({ 132 title : subject, 133 text : body, 134 url : fragmentUrl, 135 }) 136 .then(() => {}) 137 .catch((error) => {}); 138 } 139 else {
140 $(".cmp-modal-box, .modal-overlay").fadeOut(200, function () { 141 $('body').removeClass("overflow-hidden"); 142 }).removeClass("active"); 143 $('[data-id=' + modalBox + ']').append(appendthis); 144 $(".modal-overlay").fadeIn(200); 145 $('body').addClass("overflow-hidden"); 146 $('[data-id=' + modalBox + ']').fadeIn($(this).data()).addClass("active"); 147 } 148 }); 149 $('body').on("click", ".js-modal-close, .modal-overlay", function () { 150 $(".cmp-modal-box, .modal-overlay").fadeOut(200, function () { 151 $(".modal-overlay").remove(); 152 $('body').removeClass("overflow-hidden"); 153 }).removeClass("active"); 154 }); 155} 156 157function headerDropdowns() { 158 const appendthis = ("<div class='modal-overlay js-modal-close'></div>"); 159 $('.open-headerpop[data-target]').click(function (e) { 160 $(".cmp-header-dropdown, .modal-overlay").fadeOut(); 161 $('.cmp-header-dropdown').removeClass("active"); 162 e.preventDefault(); 163 const modalBox = $(this).attr('data-target'); 164 $('#' + modalBox).append(appendthis); 165 $('#' + modalBox).addClass("active"); 166 $('#' + modalBox).fadeIn($(this).data()); 167 $(".modal-overlay").fadeIn(200); 168 }); 169 $('body').on("click", ".js-modal-close, .modal-overlay", function () { 170 $(".cmp-header-dropdown, .modal-overlay").fadeOut(200, function () { 171 $(".modal-overlay").remove(); 172 }); 173 $('.cmp-header-dropdown').removeClass("active"); 174 }); 175} 176 177 178function headerDropdownsPosition() { 179 180 181 182 $('.open-headerpop[data-target]').each(function (e) { 183 const $hdrpstn = $(this); 184 function headerDropdownsIn(){ 185 const dropYpstn = $hdrpstn.offset().top + 50; 186 const modalBoxpstn = $hdrpstn.attr('data-target'); 187 const modelBoxwidth = $('#' + modalBoxpstn).width(); 188 const dropoffsetLeft = $hdrpstn.offset().left; 189 const dropXpstn = dropoffsetLeft - (modelBoxwidth - 60); 190 const dropXpstn2 = dropoffsetLeft - 60; 191 const containerLWidth = $hdrpstn.closest(".container").offset().left; 192 193 194 195 196 if ($(window).width() > 991) { 197 198 if(dropXpstn < containerLWidth){ 199 $('#' + modalBoxpstn).css({ 200 "top": dropYpstn, 201 "left": dropXpstn2 202 }).addClass('headerDropdownleft'); 203 } 204 else{ 205 $('#' + modalBoxpstn).css({ 206 "top": dropYpstn, 207 "left": dropXpstn 208 }); 209 } 210 211 212 213 214 215 } else { 216 $(".cmp-header-dropdown").css({ 217 "top": 0, 218 "left": 0 219 }); 220 } 221 222 } 223 headerDropdownsIn(); 224 225 $(this).click(function(){ 226 227 headerDropdownsIn(); 228 229 230 231 232 }); 233 234 235 236 237 238 239 }); 240 241} 242 243 244function mmDropDOwn() { 245 $('.open-dropDown[data-target]').click(function (e) { 246 e.preventDefault(); 247 const $clickedDropdown = $(this); 248 const dropDownBox = $(this).attr('data-target'); 249 if ($clickedDropdown.hasClass("inBrief__btn")) { 250 $('body').addClass("inbriefbodyHidden"); 251 } else { 252 $('body').removeClass("inbriefbodyHidden"); 253 } 254 255 if ($clickedDropdown.hasClass("active")) { 256 $clickedDropdown.removeClass("active"); 257 $('[data-id=' + dropDownBox + ']').removeClass("active").fadeOut(100); 258 $('body').removeClass("inbriefbodyHidden"); 259 260 } else { 261 $('.open-dropDown').removeClass("active"); 262 $(".mm-drop-down").removeClass("active").fadeOut(100); 263 $clickedDropdown.addClass("active"); 264 $('[data-id=' + dropDownBox + ']').fadeIn(10).delay(100).addClass("active"); 265 } 266 }); 267 268 $(document).on("click", function () { 269 $(".mm-drop-down").removeClass("active").fadeOut(100); 270 $('.open-dropDown').removeClass("active"); 271 $('body').removeClass("inbriefbodyHidden"); 272}); 273 274 $('.close-dropDown').on("click", function () { 275 $(".mm-drop-down").removeClass("active").fadeOut(100); 276 $('.open-dropDown').removeClass("active"); 277 $('body').removeClass("inbriefbodyHidden"); 278 279}); 280 281 $('.open-dropDown, .mm-drop-down').on("click", function (event) { 282 event.stopPropagation(); 283 }); 284} 285 286 287function mmFilter() { 288 289 $('.open-filter[data-target]').click(function (e) { 290 291 e.preventDefault(); 292 const $clickedOpenFilter = $(this); 293 const filterBox = $(this).attr('data-target'); 294 if ($clickedOpenFilter.hasClass("active")) { 295 $clickedOpenFilter.removeClass("active"); 296 $('[data-id=' + filterBox + ']').removeClass("active").fadeOut(100); 297 } else { 298 $('.open-filter').removeClass("active"); 299 $(".mm-filter-box").removeClass("active").fadeOut(100); 300 $clickedOpenFilter.addClass("active"); 301 $('[data-id=' + filterBox + ']').fadeIn(10).delay(100).addClass("active"); 302 $('.overlay').addClass('open-filter__overlay').fadeIn(300); 303 $('body').addClass("scroll-disabled"); 304 305 } 306 }); 307 308 $('body').on("click", ".open-filter__overlay, .close-filter", function () { 309 $(".mm-filter-box").removeClass("active").fadeOut(100); 310 $('.open-filter').removeClass("active"); 311 $('.overlay').removeClass('open-filter__overlay').fadeOut(300); 312 $('body').removeClass("scroll-disabled"); 313 }); 314} 315function mmFilterSub() { 316 317 $('.open-filterSub[data-target]').click(function (e) { 318 319 e.preventDefault(); 320 const $clickedOpenFilterSub = $(this); 321 const filterBoxSub = $(this).attr('data-target'); 322 if (!$clickedOpenFilterSub.hasClass("active")) { 323 $('.open-filterSub').removeClass("active"); 324 $(".mm-filter-boxSub").removeClass("active").fadeOut(100); 325 $clickedOpenFilterSub.addClass("active"); 326 $('[data-id=' + filterBoxSub + ']').fadeIn(10).delay(100).addClass("active"); 327 } 328 }); 329} 330 331function themechange() { 332 const themeValue = $("input[name='theme']:checked").val();
333 $('body').removeClass('mm-light-theme mm-dark-theme mm-sepia-theme').addClass(themeValue); 334 $(".cmp-theme__label").click(function () { 335 const themeValueselected = $(this).find("input[name='theme']:checked").val(); 336 $('body').removeClass('mm-light-theme mm-dark-theme mm-sepia-theme').addClass(themeValueselected); 337 }); 338} 339utils.fontSizeChange = function () { 340 const fontSizevalue = $("input[name='fontSize']:checked").val(); 341 $('body').removeClass('small-font medium-font large-font').addClass(fontSizevalue); 342 $(".cmp-font-size__label").click(function () { 343 const fontValueselected = $(this).find("input[name='fontSize']:checked").val(); 344 $('body').removeClass('small-font medium-font large-font').addClass(fontValueselected); 345 }); 346} 347 348function mmTab() { 349 $('.cmp-tab-block').each(function () { 350 const tabThis = $(this); 351 tabThis.find('.cmp-tab-block__nav-li:first-child').addClass('active'); 352 tabThis.find('.cmp-tab-block__item').hide(); 353 tabThis.find('.cmp-tab-block__item:first').show(); 354 // Click function 355 tabThis.find('.cmp-tab-block__nav-li a').on("click", function () { 356 tabThis.find('.cmp-tab-block__nav-li').removeClass('active'); 357 $(this).parent('.cmp-tab-block__nav-li').addClass('active'); 358 tabThis.find('.cmp-tab-block__item').hide().removeClass('active'); 359 const activeTab = $(this).attr('href'); 360 $(activeTab).fadeIn().addClass('active'); 361 return false; 362 }); 363 }); 364} 365 366function megaMenusub() { 367 $('.cmp-mega-menu__arrow-btn, .cmp-mega-menu__sub-web-title').on("click", function () { 368 $(this).closest('.cmp-mega-menu__ul').toggleClass("cmp-mega-menu__ul-sub-active"); 369 const $subsidemenu = $(this).closest(".cmp-mega-menu__li"); 370 if ($subsidemenu.hasClass("active")) { 371 $subsidemenu.removeClass("active"); 372 $subsidemenu.find(".cmp-mega-menu__sub").hide(); 373 } else { 374 $(".cmp-mega-menu__li").removeClass("active"); 375 $(".cmp-mega-menu__sub").hide(); 376 $subsidemenu.addClass("active"); 377 378 $subsidemenu.find(".cmp-mega-menu__sub").show(200, function () { 379 // for scroll to correct postion 380 }); 381 } 382 }); 383 384 385 386 $('.cmp-mega-menu__navigation .cmp-tab-block__nav-a').on("click", function(){ 387 $('.cmp-mega-menu__ul').removeClass('cmp-mega-menu__ul-sub-active'); 388 $('.cmp-mega-menu__li').removeClass("active"); 389 $('.cmp-mega-menu__sub').removeAttr("style"); 390 391 392 393 }); 394 395 396 397} 398 399function menuClick() { 400 $('.cmp-header__section-nav').on("click", function () { 401 $('.cmp-mega-menu').addClass("active"); 402 $('.overlay').addClass('cmp-mega-menu__overlay').fadeIn(300); 403 404 $('body').addClass("scroll-disabled"); 405 406 }); 407 $('body').on("click", ".cmp-mega-menu__close-btn, .cmp-mega-menu__overlay", function () { 408 $('.cmp-mega-menu').removeClass("active"); 409 $('.overlay').removeClass('cmp-mega-menu__overlay').fadeOut(300); 410 // sub menu hide if opend 411 $(".cmp-mega-menu__li").removeClass("active"); 412 $(".cmp-mega-menu__sub").hide(); 413 $('.cmp-mega-menu__ul').removeClass('cmp-mega-menu__ul-sub-active'); 414 if ($('body').hasClass("scroll-disabled")) { 415 $('body').removeClass("scroll-disabled"); 416 } 417 }); 418} 419 420function searchClick() { 421 $('.cmp-header--search-click').on("click", function () { 422 $('.cmp-search-popup').addClass("active"); 423 $('.overlay').addClass('cmp-search-popup__overlay').fadeIn(300); 424 $('body').addClass("scroll-disabled"); 425 $('.cmp-search-popup__input').focus(); 426 }); 427 $('body').on("click", ".cmp-search-popup__close-btn, .cmp-search-popup__overlay", function () { 428 $('.cmp-search-popup').removeClass("active"); 429 $('.overlay').removeClass('cmp-search-popup__overlay').fadeOut(300); 430 $('body').removeClass("scroll-disabled"); 431 }); 432} 433 434function callQRNotifications(){ 435 try { 436 let api = qrApi; 437 function isMobileView() { 438 const mobileQuery = window.matchMedia("(max-width: 767px)"); 439 return mobileQuery.matches; 440 } 441 let quickReadIcon = document.querySelectorAll(".mm-icon__quickread,.quikreadfloating__in .mm-icon__flash"); 442 if (isMobileView && quickReadIcon.length && api) { 443 quickReadIcon.forEach(function(element,index){ 444 element.closest("a").addEventListener("click", function (e) { 445 document.cookie = "qrOrigin="+encodeURIComponent(window.location.href)+";domain=.manoramaonline.com;path=/"; 446 }); 447 }) 448 async function getQRUpdates() { 449 let response; 450 response = await fetch(api); 451 let resp = await response.json(); 452 let data = resp.componentConfigs && resp.componentConfigs[0] ? resp.componentConfigs[0].contents : []; 453 let createdDates = ""; 454 data.forEach((element, index) => { 455 if (index < 10) { 456 createdDates += element.createdDate; 457 } 458 }); 459 return createdDates; 460 } 461 async function checkQRNotification() { 462 let initData = await getQRUpdates(); 463 setInterval(async () => { 464 let currData = await getQRUpdates(); 465 if (initData && currData && initData != currData) { 466 let notification = document.createElement("span"); 467 notification.classList.add("notifcation__alert"); 468 quickReadIcon.insertAdjacentElement("afterend", notification); 469 initData=currData; 470 } 471 }, 60000); 472 } 473 checkQRNotification(); 474 } 475 } catch (err) {console.log("Error while fetching quickread notifications"+err)} 476} 477 478utils.bannerfourstorySlider = function () { 479$('.story-slider-block__four-story-banner .cmp-story-list--slider').not('.slick-initialized').slick({ 480 dots: true, 481 arrows: true, 482 infinite: true, 483 speed: 300, 484 slidesToShow: 4, 485 slidesToScroll: 4, 486 autoplay: true, 487 autoplaySpeed: 4000, 488 pauseOnHover: true, 489 prevArrow: '<button class="slide-arrow prev-arrow"><i class="mm-icon mm-icon__arrow-right-lg"></i> </button>', 490 nextArrow: '<button class="slide-arrow next-arrow"><i class="mm-icon mm-icon__arrow-left-lg"></i> </button>', 491 492 responsive: [ 493 { 494 breakpoint: 1300, 495 settings: { 496 slidesToShow: 3, 497 slidesToScroll:3, 498 dots: true, 499 } 500 }, 501 { 502 breakpoint: 992, 503 settings: { 504 slidesToShow: 2, 505 slidesToScroll: 2, 506 dots: true, 507 } 508 }, 509 { 510 breakpoint: 768, 511 settings: { 512 slidesToShow: 1, 513 slidesToScroll: 1, 514 dots: true, 515 } 516 }, 517 { 518 breakpoint: 576, 519 settings: { 520 centerPadding: '40px', 521 slidesToShow: 1, 522 slidesToScroll: 1, 523 dots: true, 524 infinite: true, 525 } 526 } 527 528 ] 529 }); 530} 531 532utils.bannerSlider = function () { 533 $('.cmp-editable-banner--slider, .editable-banner--text-only .cmp-story-list--slider').not('.slick-initialized').slick({ 534 slidesToScroll: 1, 535 autoplay: true, 536 autoplaySpeed: 4000, 537 dots: true,
538 arrows: false, 539 }); 540} 541utils.singleCommonSlider = function () { 542 $('.single-common-slider').slick({ 543 slidesToScroll: 1, 544 autoplay: true, 545 autoplaySpeed: 5000, 546 dots: true, 547 arrows: false, 548 }); 549} 550utils.singleSlider = function () { 551 $('.cmp-story-list--single-slider, .cartoon-block .cmp-story-list--slider, .stories-promo-block .cmp-story-list--slider').not('.slick-initialized').slick({ 552 slidesToScroll: 1, 553 autoplay: true, 554 infinite: true, 555 autoplaySpeed: 4000, 556 dots: true, 557 arrows: false, 558 }); 559} 560utils.imageBlockSlider = function () { 561 $('.cmp-story-list__img-slider').not('.slick-initialized').slick({ 562 slidesToScroll: 1, 563 slidesToShow: 1, 564 autoplay: true, 565 infinite: false, 566 autoplaySpeed: 4000, 567 fade: true, 568 dots: true, 569 prevArrow: '<button class="slide-arrow prev-arrow"><i class="mm-icon mm-icon__arrow-right-lg"></i> </button>', 570 nextArrow: '<button class="slide-arrow next-arrow"><i class="mm-icon mm-icon__arrow-left-lg"></i> </button>', 571 }); 572} 573utils.gameSlider = function () { 574 $('.mm-game-block .cmp-story-list--slider').not('.slick-initialized').slick({ 575 centerPadding: '0px', 576 slidesToShow: 1, 577 slidesToScroll: 1, 578 autoplay: true, 579 autoplaySpeed: 4000, 580 dots: true, 581 prevArrow: '<button class="slide-arrow prev-arrow"><i class="mm-icon mm-icon__arrow-right-lg"></i> </button>', 582 nextArrow: '<button class="slide-arrow next-arrow"><i class="mm-icon mm-icon__arrow-left-lg"></i> </button>', 583 responsive: [{ 584 breakpoint: 1200, 585 settings: { 586 centerPadding: '40px', 587 slidesToShow: 3, 588 infinite: true, 589 } 590 }, { 591 breakpoint: 992, 592 settings: { 593 centerPadding: '40px', 594 slidesToShow: 2, 595 infinite: true, 596 } 597 }, { 598 breakpoint: 576, 599 settings: { 600 centerPadding: '40px', 601 slidesToShow: 1, 602 infinite: true, 603 } 604 }, ] 605 }); 606} 607utils.fullwidthBackground = function () { 608 if ($(".fullwidth-bg").length > 0) { 609 $(".fullwidth-bg").each(function () { 610 const windwidth = $(window).width(); 611 const fullwidtharea = $('.fullwidth-bg').closest('.container').width(); 612 const fullwidthvalue = (windwidth - fullwidtharea) / 2; 613 if(windwidth > 575){ 614 $('.fullwidth-bg').css({ 615 left: -fullwidthvalue, 616 right: -fullwidthvalue 617 }); 618 } 619 else{ 620 $('.fullwidth-bg').css({ 621 left: -15, 622 right: -15 623 }); 624 } 625 }) 626 } 627} 628// four-colom slider 629utils.fourClmSlider = function () { 630 $('.story-card-list-block .cmp-story-list--slider, .story-our-serivces-block .cmp-story-list--slider, .following-topics-block .cmp-story-list--slider').not(".slick-initialized").slick({ 631 632 centerMode: false, 633 centerPadding: '0px', 634 infinite: false, 635 slidesToShow: 4, 636 slidesToScroll: 1, 637 dots: true, 638 prevArrow: '<button class="slide-arrow prev-arrow"><i class="mm-icon mm-icon__arrow-right-lg"></i> </button>', 639 nextArrow: '<button class="slide-arrow next-arrow"><i class="mm-icon mm-icon__arrow-left-lg"></i> </button>', 640 responsive: [{ 641 breakpoint: 1200, 642 settings: { 643 centerPadding: '40px', 644 slidesToShow: 3, 645 infinite: true, 646 } 647 }, { 648 breakpoint: 992, 649 settings: { 650 centerPadding: '40px', 651 slidesToShow: 2, 652 infinite: true, 653 } 654 }, { 655 breakpoint: 576, 656 settings: { 657 centerPadding: '40px', 658 slidesToShow: 1, 659 infinite: true, 660 } 661 }, ] 662 }); 663 $('.four-colom-slider').each(function () {}); 664} 665 666// three-colom slider 667utils.threeClmSlider = function () { 668 $('.story-multimedia-list-block .cmp-story-list--slider').not('.slick-initialized').slick({ 669 centerPadding: '0px', 670 infinite: false, 671 slidesToShow: 3, 672 slidesToScroll: 3, 673 dots: true, 674 variableWidth: false, 675 prevArrow: '<button class="slide-arrow prev-arrow"><i class="mm-icon mm-icon__arrow-right-lg"></i> </button>', 676 nextArrow: '<button class="slide-arrow next-arrow"><i class="mm-icon mm-icon__arrow-left-lg"></i> </button>', 677 responsive: [{ 678 breakpoint: 1200, 679 settings: { 680 centerPadding: '40px', 681 slidesToShow: 3, 682 slidesToScroll: 1, 683 infinite: true, 684 variableWidth: false, 685 } 686 }, { 687 breakpoint: 992, 688 settings: { 689 centerPadding: '40px', 690 slidesToShow: 2, 691 slidesToScroll: 1, 692 infinite: true, 693 variableWidth: false, 694 } 695 }, { 696 breakpoint: 576, 697 settings: { 698 centerPadding: '40px', 699 slidesToShow: 1, 700 slidesToScroll: 1, 701 infinite: true, 702 variableWidth: false, 703 } 704 }, ] 705 }); 706 $('.four-colom-slider').each(function () {}); 707} 708utils.vslShrtsSlider = function () { 709 710 $('.visual-stories-block .cmp-story-list--slider, .shots-stories-block .cmp-story-list--slider').each(function () { 711 const $slider = $(this); 712 713 // Check if any parent has the class 'col-xl-8'
714 const isInsideColXl8 = $slider.closest('.col-xl-8').length > 0; 715 716 // Determine number of slides based on the condition 717 const slidesToShow = isInsideColXl8 ? 4 : 6; 718 719 // Initialize Slick only if not already initialized 720 if (!$slider.hasClass('slick-initialized')) { 721 $slider.slick({ 722 centerMode: false, 723 centerPadding: '0px', 724 infinite: false, 725 slidesToShow: slidesToShow, 726 slidesToScroll: 1, 727 dots: true, 728 prevArrow: '<button class="slide-arrow prev-arrow"><i class="mm-icon mm-icon__arrow-right-lg"></i></button>', 729 nextArrow: '<button class="slide-arrow next-arrow"><i class="mm-icon mm-icon__arrow-left-lg"></i></button>', 730 responsive: [{ 731 breakpoint: 1200, 732 settings: { 733 centerPadding: '40px', 734 slidesToShow: isInsideColXl8 ? 3 : 4, 735 infinite: true, 736 } 737 }, { 738 breakpoint: 992, 739 settings: { 740 centerPadding: '40px', 741 slidesToShow: 3, 742 infinite: true, 743 } 744 }, { 745 breakpoint: 768, 746 settings: { 747 centerPadding: '40px', 748 slidesToShow: 2, 749 infinite: true, 750 } 751 }, { 752 breakpoint: 576, 753 settings: { 754 centerPadding: '40px', 755 slidesToShow: 2, 756 infinite: true, 757 } 758 }] 759 }); 760 } 761}); 762 763} 764 765// left-colom slider 766utils.leftClmSlider = function () { 767 $('.story-slider-block--3 .cmp-story-list--slider').not('.slick-initialized').slick({ 768 centerPadding: '100px', 769 infinite: false, 770 slidesToShow: 2, 771 slidesToScroll:2, 772 dots: true, 773 variableWidth: false, 774 prevArrow: '<button class="slide-arrow prev-arrow"><i class="mm-icon mm-icon__arrow-right-lg"></i> </button>', 775 nextArrow: '<button class="slide-arrow next-arrow"><i class="mm-icon mm-icon__arrow-left-lg"></i> </button>', 776 responsive: [{ 777 breakpoint: 1200, 778 settings: { 779 centerPadding: '40px', 780 slidesToShow: 2, 781 slidesToScroll: 1, 782 infinite: true, 783 variableWidth: false, 784 } 785 }, { 786 breakpoint: 992, 787 settings: { 788 centerPadding: '40px', 789 slidesToShow: 2, 790 slidesToScroll: 2, 791 infinite: true, 792 variableWidth: false, 793 } 794 }, { 795 breakpoint: 576, 796 settings: { 797 centerPadding: '40px', 798 variableWidth: false, 799 slidesToShow: 1, 800 slidesToScroll: 1, 801 infinite: true, 802 } 803 }, ] 804 }); 805 806} 807 808 809utils.videoplayHover = function () { 810 // video play 811 if ($(window).width() > 575) { 812 $(".cmp-story-list--video-block").hover(hoverVideoPlay, restVideo); 813 function hoverVideoPlay(e) { 814 $("video", this).get(0).play(); 815 } 816 817 function restVideo(e) { 818 $("video", this).get(0).load(); 819 } 820 } else { 821 // change functionality for larger screens 822 } 823} 824utils.videoplayMobile = function () { 825 const winscrollTop = $(window).scrollTop(); 826 if ($(window).width() < 575) { 827 $('.cmp-story-list--video-block').each(function () { 828 const $thisvideo = $(this); 829 const videoToppstn = $thisvideo.offset().top; 830 const videoHeight = $thisvideo.find('video.cmp-story-list__img').height(); 831 const screenHeightHalf = $(window).height() / 2; 832 if (winscrollTop > videoToppstn - screenHeightHalf && winscrollTop < (videoToppstn + videoHeight / 2)) { 833 $thisvideo.find('video.cmp-story-list__img').trigger('play'); 834 } else { 835 $thisvideo.find('video.cmp-story-list__img').trigger('load'); 836 } 837 }); 838 } 839} 840utils.shotsiconposition = function () { 841 if ($(".shots-stories-block .cmp-story-list__item").length > 0) { 842 $(".shots-stories-block .cmp-story-list__item").each(function () { 843 const contarea = $(this).find('.cmp-story-list__content').height() + 30; 844 $(this).find('.cmp-story-list__media-icon').css({ 845 "bottom": contarea 846 }); 847 }); 848 } 849}
850utils.daypitcurecontent = function () { 851 $('.day-in-picture-block .cmp-story-list__title').on("click", function () { 852 $(this).addClass("content-show"); 853 }); 854} 855utils.mobileNavarrow = function () { 856 $('.main-nav--arrow-click').on("click", function () { 857 if ($(window).width() < 992) { 858 $(this).remove(); 859 const nvscrollpostion = $(window).width(); 860 $(".main-nav__ul").scrollLeft(nvscrollpostion); 861 } 862 }); 863 $(".main-nav__ul").scroll(function () { 864 if ($(window).width() < 992) { 865 const navpostion = $(".main-nav__ul").scrollLeft(); 866 if (navpostion > 4) { 867 $('.main-nav--arrow-click').remove(); 868 } 869 } 870 }); 871 // find active position 872 const scrollWinwidth = $(window).width(); 873 $('.main-nav__ul').each(function () { 874 const thisnavli = $(this).find('.main-nav__li'); 875 if ($(thisnavli).hasClass("active")) { 876 const navActivepostion = $(this).find('.main-nav__li.active').offset().left; 877 const navsc = (navActivepostion - scrollWinwidth / 2) + $('.main-nav__li.active').width() / 2; 878 if (scrollWinwidth < 992 && navActivepostion > (scrollWinwidth / 2)) { 879 $('.main-nav__ul').scrollLeft(navsc); 880 $('.main-nav--arrow-click').remove(); 881 } 882 } 883 }); 884} 885utils.livupdatescrollbar = function () { 886 const ps = new 887 PerfectScrollbar('.live-update-timeline-content', { 888 wheelSpeed: 2, 889 wheelPropagation: true, 890 minScrollbarLength: 20 891 }); 892 if ($(window).width() > 992) { 893 ps.update(); 894 } else { 895 ps.destroy(); 896 } 897} 898utils.scorecardwidth = function () { 899 $('.score-card-block').each(function () { 900 const $livescoreThis = $(this).find('.cmp-score-card__item'); 901 $livescoreThis.removeClass("cmp-score-card__item--fullsize"); 902 $livescoreThis.removeClass("cmp-score-card__item--smallsize"); 903 const scorecardwidth = $livescoreThis.width(); 904 if (scorecardwidth >= 400) { 905 $livescoreThis.addClass("cmp-score-card__item--fullsize"); 906 $livescoreThis.removeClass("cmp-score-card__item--smallsize"); 907 } else { 908 $livescoreThis.removeClass("cmp-score-card__item--fullsize"); 909 $livescoreThis.addClass("cmp-score-card__item--smallsize"); 910 } 911 }); 912} 913 914function scorcardGoalinfo() { 915 if ($('.cmp-score-card__golBy').length > 0) { 916 $('.cmp-score-card__golBy ul').each(function (i) { 917 $(this).attr('id', 'goal-by' + i); 918 $(this).append("<li class='empty'> </li>"); 919 }); 920 setInterval(function () { 921 $('.cmp-score-card__golBy ul').each(function (i) { 922 if ($(this).find('li.cmp-score-card__golBy-li').length > 1) { 923 if (this.id){ 924 scroll_down(this.id); 925 } 926 } 927 }); 928 }, 2000); 929 } 930} 931 932const mxdmultimediaSlider = function () { 933 934 $('.mixed-multimedia-block .cmp-story-list--slider').each(function () { 935 const $mxdMultmediaSlider = $(this); 936 937 938 939 // Initialize Slick only if not already initialized 940 if (!$mxdMultmediaSlider.hasClass('slick-initialized')) { 941 $mxdMultmediaSlider.slick({ 942 centerMode: false, 943 centerPadding: '0px', 944 infinite: true, 945 // slidesToShow: slidesToShow, 946 slidesToScroll: 1, 947 variableWidth: true, 948 dots: false, 949 prevArrow: '<button class="slide-arrow prev-arrow"><i class="mm-icon mm-icon__arrow-right-lg"></i></button>', 950 nextArrow: '<button class="slide-arrow next-arrow"><i class="mm-icon mm-icon__arrow-left-lg"></i></button>', 951 952 }); 953 } 954}); 955 956} 957 958function scroll_down(val) { 959 const current = $('#' + val); 960 const listID = current.attr('id'); 961 current.css({ 962 'opacity': '0' 963 }); 964 $('#' + listID + ':not(:animated)').animate({ 965 'top': parseInt(current.css('top')) - current.find('li').outerHeight() - 10 966 }, 500, function () { 967 let cars = current.find('li');
968 cars.last().before(cars.first()); 969 current.css({ 970 'top': '0px', 971 'opacity': '1' 972 }); 973 }); 974} 975utils.articleGallery = function () { 976 $('.cmp-list-gallery a').simpleLightbox({ 977 navText: ['<i class="mm-icon mm-white-icon mm-icon__arrow-right-lg"></i>', '<i class="mm-icon mm-white-icon mm-icon__arrow-left-lg"></i>'], 978 closeText: 'Ã', 979 className: 'cmp-list-gallery__lightbox', 980 widthRatio: 1, 981 captions: true, 982 captionPosition: 'bottom', 983 captionDelay: .3, 984 }); 985} 986utils.articleSlider = function () { 987 $('.cmp-article-slider__large').slick({ 988 asNavFor: '.cmp-article-slider__thumb', 989 centerPadding: '0px', 990 infinite: false, 991 slidesToShow: 1, 992 slidesToScroll: 1, 993 dots: false, 994 995 prevArrow: '<button class="slide-arrow prev-arrow"><i class="mm-icon mm-icon__arrow-right-lg"></i> </button>', 996 nextArrow: '<button class="slide-arrow next-arrow"><i class="mm-icon mm-icon__arrow-left-lg"></i> </button>', 997 }); 998 $('.cmp-article-slider__thumb').slick({ 999 slidesToShow: 4, 1000 slidesToScroll: 1, 1001 centerPadding: '40px', 1002 asNavFor: '.cmp-article-slider__large', 1003 infinite: false, 1004 dots: false, 1005 focusOnSelect: true, 1006 prevArrow: '<button class="cmp-article-slider__thumb-arrow prev-arrow"><i class="mm-icon mm-icon__arrow-right-lg"></i> </button>', 1007 nextArrow: '<button class="cmp-article-slider__thumb-arrow next-arrow"><i class="mm-icon mm-icon__arrow-left-lg"></i> </button>', 1008 responsive: [{ 1009 breakpoint: 576, 1010 settings: { 1011 slidesToShow: 3, 1012 slidesToScroll: 1, 1013 } 1014 }, ] 1015 }); 1016} 1017utils.storylistMore = function () { 1018 $(document).on("click", '.cmp-story-list__control-btn--more-menu', function (event) { 1019 event.stopPropagation(); 1020 const $storylistMore = $(this).closest('.cmp-story-list__control-li').find(".cmp-story-list__drop-down"); 1021 if ($storylistMore.hasClass("active")) { 1022 $storylistMore.removeClass("active").fadeOut(100); 1023 } else { 1024 $(".cmp-story-list__drop-down").removeClass("active").fadeOut(100); 1025 $storylistMore.fadeIn(100).delay(100).addClass("active"); 1026 } 1027 }); 1028 $(document).on("click", '.cmp-story-list__drop-down', function (event) { 1029 event.stopPropagation(); 1030 }); 1031 $(document).on("click", function () { 1032 $(".cmp-story-list__drop-down").removeClass("active").fadeOut(100); 1033 }); 1034} 1035utils.fullwidtharticle = function () { 1036 if ($(window).width() > 768 && $(' .cmp-fullwidth-image-block, .article-gallery-wrapper').length >= 1) { 1037 1038 const fullcontinerMargin = ($(window).width() - $('.article-body__content-top').width()) / 2; 1039 $('.article-body .cmp-fullwidth-image-block, .article-body .article-gallery-wrapper').css({ 1040 "margin-left": -fullcontinerMargin, 1041 "margin-right": -fullcontinerMargin 1042 }); 1043 1044 } else { 1045 $('.article-body .cmp-fullwidth-image-block, .article-body .article-gallery-wrapper').removeAttr('style'); 1046 } 1047} 1048utils.artcleSimpleslider = function () { 1049 $('.cmp-simple-slider-block__main').not('.slick-initialized').slick({ 1050 dots: false, 1051 lazyLoad: 'ondemand', 1052 autoplay: true, 1053 autoplaySpeed: 3000, 1054 fade: true, 1055 cssEase: 'linear', 1056 slidesToShow: 1, 1057 slidesToScroll: 1, 1058 infinite: false, 1059 arrows: true, 1060 pauseOnHover: false, 1061 pauseOnFocus: false, 1062 prevArrow: '<button class="slide-arrow prev-arrow"><i class="mm-icon mm-icon__arrow-right-lg"></i> </button>', 1063 nextArrow: '<button class="slide-arrow next-arrow"><i class="mm-icon mm-icon__arrow-left-lg"></i> </button>', 1064 }); 1065 // swipe : false 1066 $('.cmp-simple-slider-block__main').slick('slickPlay'); 1067 } 1068// popup image Height set 1069 utils.mmpopgalleryHeight = function() { 1070 const popwindowHeight = $(window).height(); 1071 $('.cmp-gallery-block__popup-item').each(function () { 1072 if ($(window).width() >= 991) { 1073 1074 const popimgheight = (popwindowHeight - 20); 1075
1076 $('.cmp-gallery-block__popup-details').css({ 1077 "height": popimgheight 1078 }); 1079 } 1080 else{ 1081 const popimgheight2 = (popwindowHeight - 55); 1082 $('.cmp-gallery-block__popup-details').css({ 1083 "height": popimgheight2 1084 }); 1085 1086 } 1087 1088 }); 1089 } 1090 utils.mmPopupgallery = function () { 1091 $('.cmp-gallery-block').each(function(){ 1092 const $thisGallery = $(this); 1093 $(this).find('.cmp-gallery-block__open').on("click", function () { 1094 $thisGallery.find('.cmp-gallery-block__popup').fadeIn(200); 1095 $thisGallery.find('.cmp-gallery-block__popup-slider').slick({ 1096 lazyLoad: 'ondemand', 1097 centerPadding: '20px', 1098 infinite: false, 1099 slidesToShow: 1, 1100 slidesToScroll: 1, 1101 dots: false, 1102 prevArrow: '<button class="slide-arrow slick-custom-arrow slick-prev"><i class="mm-icon mm-white-icon mm-icon__arrow-right-sm"></i> </button>', 1103 nextArrow: '<button class="slide-arrow slick-custom-arrow slick-next"><i class="mm-icon mm-white-icon mm-icon__arrow-left-sm"></i> </button>' 1104 }); 1105 $('body').addClass("overflow-hidden"); 1106 }); 1107 1108 1109 1110 1111 $thisGallery.find('.cmp-gallery-block__item:nth-child(2) .cmp-gallery-block__open').click(function(){ 1112 const slider = $thisGallery.find( '.cmp-gallery-block__popup-slider' ); 1113 slider[0].slick.slickGoTo(parseInt(1)); 1114 }); 1115 $thisGallery.find('.cmp-gallery-block__item:nth-child(3) .cmp-gallery-block__open').click(function(){ 1116 const slider = $thisGallery.find( '.cmp-gallery-block__popup-slider' ); 1117 slider[0].slick.slickGoTo(parseInt(2)); 1118 }); 1119 1120 1121 1122 // close gallery 1123 $thisGallery.find('.cmp-gallery-block__popup-close').on("click", function () { 1124 $thisGallery.find('.cmp-gallery-block__popup').fadeOut(200); 1125 $('body').removeClass("overflow-hidden"); 1126 $thisGallery.find('.cmp-gallery-block__popup-slider').slick('unslick'); 1127 }); 1128 $thisGallery.find('.cmp-gallery-block__popup-info').on("click", function(){ 1129 $(this).closest('.cmp-gallery-block').toggleClass("galleryDispnhide"); 1130 }); 1131 1132 }); 1133 1134 } 1135 1136 1137 utils.backtoTop = function () { 1138 1139 1140 1141 $('.back-to-top-button').on("click", function(){ 1142 $("html, body").animate({scrollTop: 0}, 1000); 1143 1144 }); 1145 1146 1147 // back button postion set 1148 let lastBackScrollTop = 0; 1149 1150$(window).scroll(function(event){ 1151 const st = $(this).scrollTop(); 1152 if (st > lastBackScrollTop || st < $(window).height() ){ 1153 1154 $('.backto-top').addClass('scrolling_down'); 1155 $('.backto-top').removeClass('active scrolling_up'); 1156 $('.backto-top').removeAttr("style") 1157 } else { 1158 $('.backto-top').addClass('active scrolling_up'); 1159 $('.backto-top').removeClass(' scrolling_down'); 1160 } 1161 lastBackScrollTop = st; 1162}); 1163 1164 1165 1166 1167 } 1168 1169 1170 function authorTabactive(){ 1171 if ($(window).width() < 992) { 1172 1173 1174 1175 const resultnvscrollpostion = $('.author-results .cmp-resulttab-block__nav-li.active').offset().left; 1176 $(".author-results .cmp-resulttab-block__nav-ul").scrollLeft(resultnvscrollpostion); 1177 1178$('.author-results .cmp-resulttab-block__nav-li a').on("click", function(){ 1179 const rstclcikpst = $(this).offset().left; 1180 const rstclcikwidth = $(this).outerWidth(); 1181 const rstclcikpstwidth = $(window).width()/2; 1182 1183 if(rstclcikpst > rstclcikpstwidth){ 1184 $(".author-results .cmp-resulttab-block__nav-ul").scrollLeft(rstclcikpst + rstclcikwidth); 1185 } 1186 else if(rstclcikpst < rstclcikpstwidth){ 1187 $(".author-results .cmp-resulttab-block__nav-ul").scrollLeft(rstclcikpst); 1188 } 1189 }); 1190 } 1191 1192} 1193 1194$(function () { 1195 mmTab(); 1196 megaMenusub(); 1197 // mmDropDOwn(); 1198 mmFilter(); 1199 mmFilterSub(); 1200 themechange(); 1201 menuMoreAdjust(); 1202 calcWidth2(); 1203 1204 headerDropdowns(); 1205 headerDropdownsPosition(); 1206 menuClick(); 1207 searchClick(); 1208 modalPopup(); 1209 utils.bannerfourstorySlider(); 1210 utils.singleSlider(); 1211 utils.fourClmSlider(); 1212 utils.vslShrtsSlider(); 1213 utils.threeClmSlider(); 1214 utils.leftClmSlider();
1215 utils.fullwidthBackground(); 1216 utils.daypitcurecontent(); 1217 utils.gameSlider(); 1218 utils.mobileNavarrow(); 1219 utils.scorecardwidth(); 1220 utils.imageBlockSlider(); 1221 utils.singleCommonSlider(); 1222 utils.storylistMore(); 1223 scorcardGoalinfo(); 1224 utils.bannerSlider(); 1225 mxdmultimediaSlider(); 1226 utils.backtoTop(); 1227 // article page 1228 callQRNotifications(); 1229}); 1230$(window).on('resize load', function () { 1231 headerDropdownsPosition(); 1232 menuMoreAdjust(); 1233 calcWidth2(); 1234 utils.fullwidthBackground(); 1235 utils.scorecardwidth(); 1236}); 1237$(window).scroll(function () { 1238 1239 headerDropdownsPosition(); 1240}); 1241class ObituaryBlock { 1242 constructor() { 1243 this.obitDate = document.querySelector(".cmp-obituary-block__date"); 1244 this.selectedDistrict = document.getElementById("obituaryDistrictSelect"); 1245 1246 // if (this.obitDate) { 1247 // this.updateObitDate(); 1248 // } 1249 1250 if (this.selectedDistrict) { 1251 this.selectedDistrict.addEventListener("change", () => { 1252 this.handleDistrictChange(); 1253 }); 1254 } 1255 } 1256 1257 updateObitDate() { 1258 const currentDate = new Date(); 1259 const day = currentDate.getDate().toString().padStart(2, '0');
1260 const month = (currentDate.getMonth() + 1).toString().padStart(2, '0'); 1261 const year = currentDate.getFullYear(); 1262 1263 const formattedDate = `${day}-${month}-${year}`; 1264 this.obitDate.innerHTML = formattedDate; 1265 } 1266 1267 handleDistrictChange() { 1268 const selectedOption = this.selectedDistrict.options[this.selectedDistrict.selectedIndex]; 1269 const landingPageUrl = selectedOption.getAttribute("data-obituary-landingpage"); 1270 const linkTarget = selectedOption.getAttribute("data-obituary-linktarget"); 1271 1272 if (landingPageUrl) { 1273 if (/iPhone|iPad|iPod|Android/i.test(navigator.userAgent)) { 1274 const hiddenLink = document.createElement("a"); 1275 hiddenLink.style.display = "none"; 1276 hiddenLink.target = "_top"; 1277 const selectElement = document.getElementById("obituaryDistrictSelect"); 1278 selectElement.parentNode.insertBefore(hiddenLink, selectElement.nextSibling); 1279 hiddenLink.href = landingPageUrl; 1280 hiddenLink.click(); 1281 } else if (linkTarget === "_blank") { 1282 window.parent.open(landingPageUrl, "_blank"); 1283 } else { 1284 window.parent.location.href = landingPageUrl; 1285 } 1286 } 1287 } 1288} 1289 1290const obituaryBlock = new ObituaryBlock(); 1291 1292// Auto select district from obituary dropdown 1293document.addEventListener('DOMContentLoaded', () => { 1294 const selectElement = document.getElementById('obituaryDistrictSelect'); 1295 if (selectElement) { 1296 const currentPath = window.location.pathname; 1297 let match = false; 1298 1299 for (const option of selectElement.options) { 1300 const landingPage = option.getAttribute('data-obituary-landingpage'); 1301 if (landingPage && landingPage.includes(currentPath)) { 1302 option.defaultSelected = true; 1303 option.selected = true; 1304 option.disabled = true; 1305 match = true; 1306 break; 1307 } 1308 } 1309 1310 if (match) { 1311 for (const option of selectElement.options) { 1312 if (option.label !== selectElement.selectedOptions[0].label && option.defaultSelected) { 1313 option.defaultSelected = false; 1314 option.selected = false; 1315 option.disabled = false; 1316 } 1317 } 1318 } 1319 } 1320}); 1321 1322 1323function MMEditorSearch(c,dId,iwrap) { 1324 function m() { 1325 var a = "Unknown"; - 1 != navigator.userAgent.indexOf("MSIE") ? a = "MSIE" : -1 != navigator.userAgent.indexOf("Firefox") ? a = "Firefox" : -1 != navigator.userAgent.indexOf("Opera") ? a = "Opera" : -1 != navigator.userAgent.indexOf("Chrome") ? a = "Chrome" : -1 != navigator.userAgent.indexOf("Safari") && (a = "Safari"); 1326 return a 1327 } 1328 void 0 == c.getAttribute("data-language") || c.getAttribute("data-language"); 1329 var v = void 0 == c.getAttribute("data-keyboard") ? "malayalaminscript" : c.getAttribute("data-keyboard"); 1330 void 0 == c.getAttribute("toolbar") || 1331 c.getAttribute("toolbar"); 1332 //var w = void 0 == c.getAttribute("height") ? " " : c.getAttribute("height"), 1333 // x = void 0 == c.getAttribute("width") ? " " : c.getAttribute("width"); 1334 void 0 == c.getAttribute("css") || c.getAttribute("css"); 1335 var q = void 0 == c.getAttribute("data-font-family") ? "" : c.getAttribute("data-font-family"); 1336 void 0 == c.getAttribute("headline") || c.getAttribute("headline"); 1337 var n = document.createElement("div"); 1338 n.setAttribute("id", iwrap); 1339 var h = document.querySelector('#'+dId+' input'); 1340 h.focus(); 1341 var malPlaceHold = h.getAttribute("data-mlplacehold") || "à´àµà´µàµà´¡àµà´àµ¾, തലà´àµà´àµà´àµà´àµà´àµ¾ à´®àµà´¤à´²à´¾à´¯à´µ തിരയàµà´"; 1342 //h.setAttribute("type", "text"); 1343 h.setAttribute("placeholder", malPlaceHold); 1344 //alert("inside mm editor"); 1345 h.setAttribute("id", "searchMalText"); 1346 //h.setAttribute("class", cl); 1347 h.setAttribute("onclick", "event.stopPropagation()"); 1348 //h.style.fontSize = y + "px"; 1349 "" != q && (h.style.fontFamily = q); 1350 var b = this; 1351 this.textEditor = h; 1352 b.Languages = []; 1353 b.Encodings = []; 1354 b.Keyboards = []; 1355 b.conjuncts = [];
1356 b.AlternateKeyBoatdDetails = []; 1357 b.elem = h; 1358 this.LangList = []; 1359 this.KeyboardsDetails = []; 1360 b.chatType = []; 1361 b.languagePosition = []; 1362 b.toggle = !1; 1363 b.CTRL = 0; 1364 b.ALT = 0; 1365 this.inputText = ""; 1366 this.textEditor.onkeydown = function (a) { 1367 a = b.getKeyCode(a); 1368 String.fromCharCode(a).bold = !0; 1369 window.event || 17 != a || (b.CTRL = a); 1370 18 == a && (b.ALT = a); 1371 "Safari" === m() && 91 === a && (b.COMMAND = a); 1372 switch (a) { 1373 case 119: 1374 b.toggle = b.toggle ? !1 : !0 1375 } 1376 }; 1377 this.textEditor.onkeypress = function (a) { 1378 var d = b.getKeyCode(a); 1379 if ("Netscape" == window.navigator.appName && 26 == d && 0 <= window.navigator.vendor.indexOf("Google")) undoChromeSafari(b.elem); 1380 else if(!window.event && 17 == b.CTRL){ 1381 if(115 === d){ 1382 b.CTRL = 0; 1383 } 1384 } 1385 else if (!("Safari" === m() && 0 < b.COMMAND)) switch (d) { 1386 case 9: 1387 case 27: 1388 case 0: 1389 case 16: 1390 break; 1391 case 8: 1392 break; 1393 case 13: 1394 return !0; 1395 default: 1396 var keyboardType = v; 1397 var f = b.KeyboardsDetails()[keyboardType.toLowerCase()]; 1398 1399 if (void 0 == f) { 1400 console.log("KeyBoard for " + keyboardType + " is undefined"); 1401 return !1; 1402 } 1403 d = String.fromCharCode(d); 1404 f = f[d]; 1405 if (void 0 == f) break; 1406 b.toggle && (f = d); 1407 b.insertAtCursorPosition(b.elem, f); 1408 b.setConjuncts(b.elem, f, keyboardType); 1409 let elem = b.elem; 1410 if(document.selection){ 1411 elem.focus(); 1412 b.textEditor.focus(); 1413 document.selection.createRange().parentElement(); 1414 } 1415 1416 1417 return !1 1418 } 1419 }; 1420 this.textEditor.onkeyup = function (a) { 1421 a = b.getKeyCode(a); 1422 window.event || 17 != a || (b.CTRL = 0); 1423 "Safari" === m() && 0 < b.COMMAND && (b.COMMAND = 0); 1424 console.log(String.fromCharCode(a)); 1425 return !1 1426 }; 1427 this.getKeyCode = function (a) { 1428 if (a) return a.which; 1429 if (window.event) return window.event.keyCode 1430 }; 1431 this.getEventSource = function (a) { 1432 if (a) return a.target; 1433 if (window.event) return window.event.srcElement 1434 }; 1435 this.cancelEvent = function (a) { 1436 if (a) { 1437 a.preventDefault(); 1438 a.stopPropagation(); 1439 } 1440 1441 window.event && 1442 (window.event.returnValue = !1) 1443 }; 1444 var r, s, t, u; 1445 t = { 1446 "!": "!", 1447 '"': "\u2019", 1448 "#": "#", 1449 $: "$", 1450 "%": "%", 1451 "&": "&", 1452 "'": "\u2018", 1453 "(": "(", 1454 ")": ")", 1455 "*": "*", 1456 "+": "+", 1457 "-": "\u2013", 1458 ".": ".", 1459 "/": "/", 1460 0: "0", 1461 1: "1", 1462 2: "2", 1463 3: "3", 1464 4: "4", 1465 5: "5", 1466 6: "6", 1467 7: "7", 1468 8: "8", 1469 9: "9", 1470 ":": ":", 1471 ";": ";", 1472 "<": "<", 1473 "=": "=", 1474 ">": ">", 1475 "?": "?", 1476 "@": "@", 1477 A: "\u0d06", 1478 B: "\u0d2c\u0d4d", 1479 C: "\u0d15\u0d4d", 1480 D: "\u0d21\u0d4d", 1481 E: "\u0d0f", 1482 F: "\u0d2b\u0d4d", 1483 G: "\u0d17\u0d4d\u0d17\u0d4d", 1484 H: "\u0d03", 1485 I: "\u0d08", 1486 J: "\u0d1c\u0d4d\u0d1c\u0d4d", 1487 K: "\u0d15\u0d4d\u200c\u200c", 1488 L: "\u0d33\u0d4d", 1489 M: "\u0d02", 1490 N: "\u0d23\u0d4d", 1491 O: "\u0d13", 1492 P: "\u0d2a\u0d4d", 1493 Q: "\u0d15\u0d4d", 1494 R: "\u0d31\u0d4d", 1495 S: "\u0d36\u0d4d", 1496 T: "\u0d1f\u0d4d", 1497 U: "\u0d0a", 1498 V: "\u0d35\u0d4d", 1499 W: "\u0d35\u0d4d", 1500 X: "\u0d15\u0d4d\u0d37\u0d4d", 1501 Y: "\u0d2f\u0d4d", 1502 Z: "\u0d1c\u0d4d", 1503 "[": "[", 1504 "\\": "", 1505 "]": "]", 1506 "^": "^", 1507 _: "_", 1508 "`": "\u20a8", 1509 a: "\u0d05", 1510 b: "\u0d2c\u0d4d", 1511 c: "\u0d15\u0d4d\u200c", 1512 d: "\u0d26\u0d4d", 1513 e: "\u0d0e", 1514 f: "\u0d2b\u0d4d", 1515 g: "\u0d17\u0d4d", 1516 h: "\u0d39\u0d4d", 1517 i: "\u0d07", 1518 j: "\u0d1c\u0d4d", 1519 k: "\u0d15\u0d4d", 1520 l: "\u0d32\u0d4d", 1521 m: "\u0d2e\u0d4d", 1522 n: "\u0d28\u0d4d", 1523 o: "\u0d12", 1524 p: "\u0d2a\u0d4d", 1525 q: "\u0d15\u0d4d", 1526 r: "\u0d30\u0d4d", 1527 s: "\u0d38\u0d4d", 1528 t: "\u0d31\u0d4d\u0d31\u0d4d", 1529 u: "\u0d09", 1530 v: "\u0d35\u0d4d", 1531 w: "\u0d35\u0d4d", 1532 x: "\u0d15\u0d4d\u0d38\u0d4d", 1533 y: "\u0d2f\u0d4d", 1534 z: "\u0d1c\u0d4d\u200c", 1535 "{": "{", 1536 "|": "", 1537 "}": "}", 1538 "~": "~", 1539 " ": " " 1540 }; 1541 s = { 1542 "\u0003\u0d05": "\u0d3e:1", 1543 "\u0003\u0d07": "\u0d48:1", 1544 "\u0003\u0d09": "\u0d57:1", 1545 "\u0003\u0d3f\u0d07": "\u0d40:2", 1546 "\u0003\u0d41\u0d09": "\u0d42:2", 1547 "\u0d4d\u0d05": ":2", 1548 "\u0d4d\u200c\u0d05": ":3", 1549 "\u0d4d\u200c\u200c\u0d06": "\u0d3e:4", 1550 "\u0d4d\u200c\u0d06": "\u0d3e:3", 1551 "\u0d4d\u0d06": "\u0d3e:2", 1552 "\u0d4d\u200c\u0d07": "\u0d3f:3", 1553 "\u0d4d\u0d07": "\u0d3f:2", 1554 "\u0d4d\u200c\u0d08": "\u0d40:3", 1555 "\u0d4d\u0d08": "\u0d40:2", 1556 "\u0d4d\u200c\u0d09": "\u0d41:3", 1557 "\u0d4d\u0d09": "\u0d41:2", 1558 "\u0d4d\u200c\u0d0a": "\u0d42:3", 1559 "\u0d4d\u0d0a": "\u0d42:2", 1560 "\u0d4d\u200c\u0d30\u0d4d^": "\u0d43:5", 1561 "\u0d4d\u0d30\u0d4d^": "\u0d43:4", 1562 "\u0d4d\u200c\u0d0e": "\u0d46:3", 1563 "\u0d4d\u0d0e": "\u0d46:2", 1564 "\u0d4d\u200c\u0d0f": "\u0d47:3", 1565 "\u0d4d\u0d0f": "\u0d47:2", 1566 "\u0d4d\u0d10": "\u0d48:2", 1567 "\u0d4d\u200c\u0d10": "\u0d48:3", 1568 "\u0d47\u200c\u0d0f": "\u0d40:3", 1569 "\u0d47\u0d0f": "\u0d40:2", 1570 "\u0d4d\u200c\u0d12": "\u0d4a:3", 1571 "\u0d4d\u0d12": "\u0d4a:2",
1572 "\u0d4d\u200c\u0d13": "\u0d4b:3", 1573 "\u0d4d\u0d13": "\u0d4b:2", 1574 "\u0d4d\u0d14": "\u0d57:2", 1575 "\u0d4d\u200c\u0d14": "\u0d57:3", 1576 "\u0d4d\u0d02": "\u0d02:2", 1577 "\u0d4d\u0d03": "\u0d03:2", 1578 "\u0d30\u0d4d^": "\u0d0b:3", 1579 "\u0d4b\u0d13": "\u0d42:2", 1580 "\u0d05\u0d07": "\u0d10:2", 1581 "\u0d05\u0d05": "\u0d06:2", 1582 "\u0d05\u0d09": "\u0d14:2", 1583 "\u0d07\u0d07": "\u0d08:2", 1584 "\u0d09\u0d09": "\u0d0a:2", 1585 "\u0d28\u0d4d\u0d15\u0d4d\u200c\u0d39\u0d4d": "\u0d1e\u0d4d\u0d1a\u0d4d:7", 1586 "\u0d15\u0d4d\u0d39\u0d4d": "\u0d16\u0d4d:4", 1587 "\u0d17\u0d4d\u0d39\u0d4d": "\u0d18\u0d4d:4", 1588 "\u0d28\u0d4d\u0d17\u0d4d": "\u0d19\u0d4d:4", 1589 "\u0d15\u0d4d\u200c\u0d39\u0d4d": "\u0d1a\u0d4d:5", 1590 "\u0d1a\u0d4d\u0d39\u0d4d": "\u0d1b\u0d4d:4", 1591 "\u0d1c\u0d4d\u0d39\u0d4d": "\u0d1d\u0d4d:4", 1592 "\u0d28\u0d4d\u0d1c\u0d4d": "\u0d1e\u0d4d:4", 1593 "\u0d17\u0d4d\u200c\u0d2f\u0d4d": "\u0d1c\u0d4d\u0d1e\u0d4d:5", 1594 "\u0d31\u0d4d\u0d31\u0d4d\u0d31\u0d4d\u0d31\u0d4d": "\u0d1f\u0d4d\u0d1f\u0d4d:8", 1595 "\u0d1f\u0d4d\u0d39\u0d4d": "\u0d20\u0d4d:4", 1596 "\u0d21\u0d4d\u0d39\u0d4d": "\u0d22\u0d4d:4", 1597 "\u0d31\u0d4d\u0d31\u0d4d\u0d39\u0d4d": "\u0d24\u0d4d:6", 1598 "\u0d24\u0d4d\u0d39\u0d4d": "\u0d25\u0d4d:4", 1599 "\u0d26\u0d4d\u0d39\u0d4d": "\u0d27\u0d4d:4", 1600 "\u0d2a\u0d4d\u0d39\u0d4d": "\u0d2b\u0d4d:4", 1601 "\u0d2c\u0d4d\u0d39\u0d4d": "\u0d2d\u0d4d:4", 1602 "\u0d15\u0d4d\u0d38\u0d4d\u0d39\u0d4d": "\u0d37\u0d4d:4", 1603 "\u0d38\u0d4d\u0d39\u0d4d": "\u0d36\u0d4d:4", 1604 "\u0d36\u0d4d\u0d39\u0d4d": "\u0d37\u0d4d:4", 1605 "\u0d1c\u0d4d\u200c\u0d39\u0d4d": "\u0d34\u0d4d:5", 1606 "\u0d30\u0d41\u200d": "\u20a8:3", 1607 "\u0d28\u0d4d\u0d15\u0d4d": "\u0d19\u0d4d\u0d15\u0d4d:4", 1608 "\u0d28\u0d4d\u0d1f\u0d4d": "\u0d23\u0d4d\u0d1f\u0d4d:4", 1609 "\u0d30\u0d4d_": "\u0d7c:3", 1610 "\u0d28\u0d4d_": "\u0d7b:3", 1611 "\u0d23\u0d4d_": "\u0d7a:3", 1612 "\u0d33\u0d4d_": "\u0d7e:3", 1613 "\u0d32\u0d4d_": "\u0d7d:3", 1614 "\u0d15\u0d4d_": "\u0d7f:3", 1615 "\u0d28\u0d4d\u0d31\u0d4d\u0d31\u0d4d": "\u0d28\u0d4d\u0d31\u0d4d:6", 1616 "\u0d28\u0d4d\u0d31\u0d4d\u0d39\u0d4d": "\u0d28\u0d4d\u0d24\u0d4d:6", 1617 "\u0d28\u0d4d\u0d31\u0d4d\u0d39\u0d4d\u0d39\u0d4d": "\u0d28\u0d4d\u0d25\u0d4d:8" 1618 }; 1619 u = { 1620 "!": "!", 1621 '"': "\u0d20", 1622 "#": "\u0d4d\u0d30", 1623 $: ":", 1624 "%": ";", 1625 "&": "\u0d15\u0d4d\u0d37", 1626 "'": "\u0d1f", 1627 "(": "(", 1628 ")": ")", 1629 "*": "*", 1630 "+": "\u0d0b", 1631 "-": "\u2013", 1632 ".": ".", 1633 "/": "\u0d2f", 1634 0: "0", 1635 1: "1", 1636 2: "2", 1637 3: "3", 1638 4: "4", 1639 5: "5", 1640 6: "6", 1641 7: "7", 1642 8: "8", 1643 9: "9", 1644 ":": "\u0d1b", 1645 ";": "\u0d1a", 1646 "<": "\u0d37", 1647 "=": "\u0d43", 1648 ">": "\u2022", 1649 "?": "?", 1650 "@": "\u2018", 1651 A: "\u0d13", 1652 B: "\u0d33", 1653 C: "\u0d23", 1654 D: "\u0d05", 1655 E: "\u0d06", 1656 F: "\u0d07", 1657 G: "\u0d09", 1658 H: "\u0d2b", 1659 I: "\u0d18", 1660 J: "\u0d31", 1661 K: "\u0d16", 1662 L: "\u0d25", 1663 M: "\u0d36", 1664 N: "\u0d34", 1665 O: "\u0d27", 1666 P: "\u0d1d", 1667 Q: "\u0d14", 1668 R: "\u0d08", 1669 S: "\u0d0f", 1670 T: "\u0d0a", 1671 U: "\u0d19", 1672 V: "\u0d03", 1673 W: "\u0d10", 1674 X: "=", 1675 Y: "\u0d2d", 1676 Z: "\u0d0e", 1677 "[": "\u0d21", 1678 "\\": "\u200c", 1679 "]": "\u200d", 1680 "^": "\u2019", 1681 _: "%", 1682 "`": "\u0d4a", 1683 a: "\u0d4b", 1684 b: "\u0d35", 1685 c: "\u0d2e", 1686 d: "\u0d4d", 1687 e: "\u0d3e", 1688 f: "\u0d3f", 1689 g: "\u0d41", 1690 h: "\u0d2a", 1691 i: "\u0d17", 1692 j: "\u0d30", 1693 k: "\u0d15", 1694 l: "\u0d24", 1695 m: "\u0d38", 1696 n: "\u0d32", 1697 o: "\u0d26", 1698 p: "\u0d1c", 1699 q: "\u0d57", 1700 r: "\u0d40", 1701 s: "\u0d47", 1702 t: "\u0d42", 1703 u: "\u0d39", 1704 v: "\u0d28", 1705 w: "\u0d48", 1706 x: "\u0d02", 1707 y: "\u0d2c", 1708 z: "\u0d46", 1709 "{": "\u0d22", 1710 "|": "", 1711 "}": "\u0d1e", 1712 "~": "\u0d12", 1713 " ": " " 1714 }; 1715 r = { 1716 "\u0d46\u0d46": "\u0d48:2", 1717 "\u0d46\u0d3e": "\u0d4a:2", 1718 "\u0d47\u0d3e": "\u0d4b:2", 1719 "\u0d46\u0d57": "\u0d4c:2", 1720 "\u0d07\u0d57": "\u0d08:2", 1721 "\u0d09\u0d57": "\u0d0a:2", 1722 "\u0d0e\u0d46": "\u0d10:2", 1723 "\u0d12\u0d3e": "\u0d13:2", 1724 "\u0d12\u0d57": "\u0d14:2", 1725 "\u0d30\u0d4d\u200d": "\u0d7c:3", 1726 "\u0d28\u0d4d\u200d": "\u0d7b:3", 1727 "\u0d23\u0d4d\u200d": "\u0d7a:3", 1728 "\u0d32\u0d4d\u200d": "\u0d7d:3", 1729 "\u0d33\u0d4d\u200d": "\u0d7e:3", 1730 "\u0d15\u0d4d\u200d": "\u0d7f:3" 1731 }; 1732 let hindiRemingtonCharType = "0000000000000000000000000000000050500005050050500000000000550005000000000000000000000000000000000000000000000000000000000000000001110222222222222222233333333333333333333333333333333333334410444444444444444000000000003333333022440000000000000000000000000000"; 1733 this.LangList = function () { 1734 return { 1735 Malayalam: 2 1736 } 1737 }; 1738 this.Keyboards = function () { 1739 return { 1740 Malayalam: ["malayalaminscript", "phonetic-mal", "malayalam-linotype"] 1741 } 1742 }; 1743 this.KeyboardsDetails = function () { 1744 return { 1745 malayalaminscript: u, 1746 "phonetic-mal": t 1747 } 1748 }; 1749 b.chatType = function () { 1750 return { 1751 remington: hindiRemingtonCharType, 1752 malayalaminscript: "0000000000000000000000000000000050500005050050500000000000550005000000000000000000000000000000000000000000000000000000000000000001110222222222222222233333333333333333333333333333333333334410444444444444444000000000003333333022440000000000000000000000000000", 1753 "phonetic-mal": "0000000000000000000000000000000050500005050050500000000000550005000000000000000000000000000000000000000000000000000000000000000001110222222222222222233333333333333333333333333333333333334410444444444444444000000000003333333022440000000000000000000000000000" 1754 } 1755 }; 1756 b.languagePosition = function () { 1757 return { 1758 remington: "2304:2431", 1759 malayalaminscript: "3328:3440", 1760 "phonetic-mal": "3328:3440" 1761 } 1762 }; 1763 this.conjuncts = function () { 1764 return { 1765 malayalaminscript: r, 1766 "phonetic-mal": s 1767 } 1768 }; 1769 n.appendChild(this.textEditor); 1770 c.appendChild(n); 1771 this.setConjuncts = function (a, d, f) { 1772 d = b.conjuncts()[f]; 1773 var e = document.getElementById('searchMalText').value.length; 1774 e = 9 > parseInt(e) ? parseInt(e) : 9; 1775 var p = ""; 1776 if (document.selection) { 1777 a.focus(); 1778 let sel = document.selection.createRange(); 1779 sel.moveStart("character", -e); 1780 p = 9 < sel.text.length ? sel.text.substring(parseInt(sel.text.length) - 9, parseInt(sel.text.length)) : sel.text; 1781 var g = 0; 1782 f = compareStrings(d, p, f); 1783 e = f[0]; 1784 g = f[1]; 1785 let mySel = document.selection.createRange(); 1786 if(void 0 != d && "" != d && void 0 != g && "" != g && 0 < parseInt(g)){ 1787 mySel.moveStart("character", -parseInt(g)); 1788 mySel.select(); 1789 mySel.text = e; 1790 mySel.select(); 1791 } 1792 } else if (a.selectionStart || "0" == a.selectionStart) { 1793 var k = a.selectionStart, 1794 h = a.selectionEnd; 1795 p = a.value.substring(0 < k - 9 ? k - 9 : 0, k); 1796 f = compareStrings(d, p, f); 1797 e = f[0]; 1798 g = f[1]; 1799 if (void 0 != d && "" != d && void 0 != g && "" != g && 0 < parseInt(g)) { 1800 a.value = a.value.substring(0, k - g) + e + a.value.substring(h, a.value.length); 1801 a.selectionStart = k - g + parseInt(e.length); 1802 a.selectionEnd = k - g + parseInt(e.length); 1803 } 1804 1805 } 1806 }; 1807 const undoChromeSafari = function (a) { 1808 if (!document.selection) { 1809 var d = 1810 a.selectionStart; 1811 if (0 < d) { 1812 a.value = a.value.substring(0, a.value.length - 1); 1813 a.selectionStart = d; 1814 a.selectionEnd = d; 1815 } 1816 1817 } 1818 }; 1819 const compareType = function (a, d, f) { 1820 d = d.charCodeAt(0); 1821 a = a.replace("\\", ""); 1822 a = a.charCodeAt(0); 1823 var e = 0, 1824 langPosition = b.languagePosition(), 1825 g = b.chatType(), 1826 k = langPosition[f].split(":")[0], 1827 c = langPosition[f].split(":")[1]; 1828 f = g[f]; 1829 g = parseInt(d) - parseInt(k) + 128; 1830 parseInt(d) > parseInt(k) && parseInt(d) < parseInt(c) && (e = f.replace(",", "").charAt(g)); 1831 return e && !isNaN(e) && e == a; 1832 }; 1833 const compareStrings = function (a, d, b) { 1834 var e = "", 1835 c = 0, 1836 k; 1837 for (k in a) { 1838 var g = "", 1839 h = d.substring(d.length - 1840 k.length, d.length); 1841 if (0 <= h.toString().lastIndexOf(k)) { 1842 a = a[k]; 1843 e = a.split(":")[0]; 1844 c = a.split(":")[1]; 1845 break 1846 } else { 1847 for (var m = !0, l = 0; l < k.length; l++){ 1848 if (void 0 == h.charAt(l)) { 1849 m = !1; 1850 break 1851 } else { 1852 if (k.charAt(l) != h.charAt(l)) { 1853 console.log(`Mismatch at position ${l}: ${k.charAt(l)} != ${h.charAt(l)}`); 1854 } 1855 } 1856 if (compareType(k.charAt(l), h.charAt(l), b)) { 1857 g = (g === "" ? h.charAt(l) : g + "," + h.charAt(l)); 1858 } 1859 else { 1860 m = !1; 1861 break 1862 } 1863 } 1864 if (m) { 1865 a = a[k]; 1866 e = a.split(":")[0]; 1867 d = ""; 1868 for (b = 0; c < e.length; c++) {
1869 if (3 == e.charAt(c).charCodeAt(0) || 4 == e.charAt(c).charCodeAt(0)) { 1870 d += g.split(",")[b]; 1871 b++; 1872 } else { 1873 d += e.charAt(c); 1874 } 1875 } 1876 e = d; 1877 c = a.split(":")[1]; 1878 break 1879 } 1880 } 1881 } 1882 return [e, c] 1883 }; 1884 this.insertAtCursorPosition = function (a, b) { 1885 if (document.selection) {a.focus(); let sel = document.selection.createRange(); sel.text = b; sel.select();} 1886 else if (a.selectionStart || "0" == a.selectionStart) { 1887 var c = a.selectionStart, 1888 e = a.selectionEnd; 1889 e = (a.value.substring(0, c) + b + a.value.substring(e, a.value.length)).replace("", ""); 1890 a.value = e; 1891 a.selectionStart = c + b.length; 1892 a.selectionEnd = c + b.length 1893 } else a.value += b 1894 } 1895} 1896 1897const revampCustomutils = {}; 1898let hasPageScrolled = false; 1899 1900// breaking news 1901revampCustomutils.bnewsslider = function () { 1902 $('.cmp-breaking-news__ul').each(function () { 1903 let timeInterval = $(this).data('id'); 1904 let randomSpeed = 1000 * parseInt(timeInterval); 1905 $(this).not('.slick-initialized').slick({ 1906 slidesToScroll: 1, 1907 autoplay: true, 1908 autoplaySpeed: randomSpeed, 1909 vertical: true, 1910 infinite: false, 1911 arrows: false, 1912 centerMode: false, 1913 adaptiveHeight: true, 1914 pauseOnFocus: false, 1915 }); 1916 }) 1917 $('.cmp-breaking-news__close').on("click", function () { 1918 $('.cmp-breaking-news').slideUp(200); 1919 let storeLastDateTime = $(this).data('attribute'); 1920 localStorage.setItem("lastDateTime", storeLastDateTime); 1921 }); 1922 1923} 1924 1925revampCustomutils.loadBreakingNews = function () { 1926 $.ajax({ 1927 dataType: "html", 1928 type: "GET", 1929 url: $("#breaking-news-url").attr("data-url"), 1930 success: function (response) { 1931 const value = localStorage.getItem('lastDateTime'); 1932 if (value) { 1933 const storedDateTime = Math.floor(new Date(value).getTime() / 1000); 1934 const NewDateTime = Math.floor(new Date($("#breaking-news-url").attr("data-modified")).getTime() / 1000); 1935 if (NewDateTime > storedDateTime || $('#bknews').hasClass('bknews-author')) { 1936 $('#bknews').html(response); 1937 revampCustomutils.bnewsslider(); 1938 } 1939 } else { 1940 $('#bknews').html(response); 1941 revampCustomutils.bnewsslider(); 1942 } 1943 revampCustomutils.fullwidthBackground(); 1944 }, 1945 error: function (error) { 1946 console.log(error); 1947 } 1948 }); 1949} 1950 1951revampCustomutils.fullwidthBackground = function () { 1952 if ($(".fullwidth-bg").length > 0) { 1953 $(".fullwidth-bg").each(function () { 1954 let windwidth = $(window).width(); 1955 let fullwidtharea = $('.fullwidth-bg').closest('.container').width(); 1956 1957 let fullwidthvalue = (windwidth - fullwidtharea) / 2; 1958 if(windwidth > 575){ 1959 $('.fullwidth-bg').css({ 1960 left: -fullwidthvalue, 1961 right: -fullwidthvalue 1962 }); 1963 } else { 1964 $('.fullwidth-bg').css({ 1965 left: -15, 1966 right: -15 1967 }); 1968 } 1969 }) 1970 } 1971} 1972 1973// Today's epaper 1974revampCustomutils.todaysEpaper = function () { 1975 let today = new Date(); 1976 let dd = String(today.getDate()).padStart(2, '0'); 1977 let mm = String(today.getMonth() + 1).padStart(2, '0'); //January is 0! 1978 let yyyy = today.getFullYear(); 1979 let loaction = 'Kottayam'; 1980 const url = 'https://static-editions.manoramaonline.com/EDaily_Data/MMDaily/' + loaction + '/' + yyyy + '/' + mm + '/' + dd + '/F/MMDaily_' + loaction + '_' + yyyy + '_' + mm + '_' + dd + '_F_FP_001_Th.jpg' 1981 $.ajax({ 1982 dataType: "html", 1983 type: "GET", 1984 url: url, 1985 success: function (response) { 1986 console.log(response); 1987 }, 1988 error: function (error) { 1989 console.log(error); 1990 } 1991 }); 1992} 1993 1994 1995// Cartoon Slider 1996revampCustomutils.cartoonSlider = function () { 1997 $('.cartooncarousel').each(function () { 1998 let carouselId = $(this).find('.cartoon-block').attr('id'); 1999 let carouselSize = $('#' + carouselId + '.cartoon-block').data('carousel-size'); 2000 let cartoonBlock = $('#' + carouselId + '.cartoon-block .cmp-story-list--slider'); 2001 const dotStatus = carouselSize > 1 ? true : false;
2002 $(cartoonBlock).not('.slick-initialized').slick({ 2003 slidesToScroll: 1, 2004 autoplay: true, 2005 infinite: false, 2006 autoplaySpeed: 4000, 2007 dots: dotStatus, 2008 pauseOnFocus: false, 2009 arrows: false, 2010 }); 2011 }); 2012} 2013 2014// Game Slider 2015revampCustomutils.gameSlider = function () { 2016 let sliderAutoPlay = $('.mm-game-block').data('slider-autoplay'); 2017 let timeInterval = $('.mm-game-block').data('slider-delay'); 2018 let sliderSpeed = 1000 * parseInt(timeInterval); 2019 $('.mm-game-block .cmp-story-list--slider').not('.slick-initialized').slick({ 2020 centerPadding: '0px', 2021 slidesToShow: 1, 2022 slidesToScroll: 1, 2023 autoplay: sliderAutoPlay, 2024 autoplaySpeed: sliderSpeed, 2025 dots: true, 2026 pauseOnFocus: false, 2027 prevArrow: '<button class="slide-arrow prev-arrow"><i class="mm-icon mm-icon__arrow-right-lg"></i> </button>', 2028 nextArrow: '<button class="slide-arrow next-arrow"><i class="mm-icon mm-icon__arrow-left-lg"></i> </button>', 2029 responsive: [{ 2030 breakpoint: 1200, 2031 settings: { 2032 centerPadding: '40px', 2033 slidesToShow: 3, 2034 infinite: true, 2035 } 2036 }, 2037 { 2038 breakpoint: 992, 2039 settings: { 2040 centerPadding: '40px', 2041 slidesToShow: 2, 2042 infinite: true, 2043 } 2044 }, 2045 { 2046 breakpoint: 576, 2047 settings: { 2048 centerPadding: '40px', 2049 slidesToShow: 1, 2050 infinite: true, 2051 } 2052 }, 2053 ] 2054 }); 2055} 2056 2057// embed videos 2058revampCustomutils.videoPlayer = function () { 2059 if ($('.cmp-section-title-block').length > 0) { 2060 $('.cmp-video-block__icon-top').click(function () { 2061 const $videoBlock = $(this).closest('.cmp-video-block'); 2062 2063 const $videoContent = $videoBlock.find('.cmp-video-block__inner'); 2064 $videoContent.css("display", "block"); 2065 2066 const $playButton = $videoBlock.find(".vjs-big-play-button"); 2067 if ($playButton.length > 0) { 2068 $playButton.click(); 2069 } 2070 2071 const $overlay = $videoBlock.find('.cmp-video-block__overlay'); 2072 $overlay.css("display", "none"); 2073 }); 2074 } 2075} 2076revampCustomutils.scoreBoardSlider = function () { 2077 $('.single-common-slider').each(function () { 2078 let autoPlay = $(this).data('autoplay'); 2079 let timeInterval = $(this).data('delay'); 2080 let randomSpeed = 1000 * parseInt(timeInterval); 2081 $(this).not('.slick-initialized').slick({ 2082 slidesToScroll: 1, 2083 autoplay: autoPlay, 2084 autoplaySpeed: randomSpeed, 2085 dots: true, 2086 arrows: false, 2087 }); 2088 }) 2089} 2090revampCustomutils.mmScoreBoardDateTab = function () { 2091 $('.mmscoreboarditem').each(function () { 2092 let hidetabvalue = $(this).find('.hidetab'); 2093 if (hidetabvalue.length) { 2094 let index = $(this).index(); 2095 $(this).closest('.cmp-tab-block').find('.cmp-tab-block__nav .cmp-tab-block__nav-ul .cmp-tab-block__nav-li').eq(index).remove(); 2096 $(this).remove(); 2097 } 2098 }); 2099 $('.cmp-tab-block').each(function () { 2100 let tabThis = $(this); 2101 if(!tabThis.find('.cmp-tab-block__nav-li').hasClass('active')) 2102 { 2103 tabThis.find('.cmp-tab-block__nav-li:first-child').addClass('active'); 2104 tabThis.find('.cmp-tab-block__item:first').addClass('active'); 2105 tabThis.find('.cmp-tab-block__item').hide(); 2106 tabThis.find('.cmp-tab-block__item:first').show(); 2107 tabThis.find('.cmp-mm-score-full__content-in').css("display", "none"); 2108 tabThis.find('.cmp-tab-block__item:first .cmp-mm-score-full__content').find('.cmp-mm-score-full__content-in').eq(0).css("display", "block"); 2109 }else{ 2110 let index = tabThis.find('.cmp-tab-block__nav-li.active').index(); 2111 tabThis.find('.cmp-tab-block__item').hide(); 2112 tabThis.find('.cmp-tab-block__item').eq(index).show(); 2113 tabThis.find('.cmp-mm-score-full__content-in').css("display", "none"); 2114 tabThis.find('.cmp-tab-block__item').eq(index).find('.cmp-mm-score-full__content .cmp-mm-score-full__content-in').eq(0).css("display", "block"); 2115 2116 } 2117 tabThis.find('.cmp-tab-block__nav-li a').on("click", function () { 2118 tabThis.find('.cmp-tab-block__nav-li').removeClass('active'); 2119 $(this).parent('.cmp-tab-block__nav-li').addClass('active'); 2120 tabThis.find('.cmp-tab-block__item').hide().removeClass('active'); 2121 let activeIndex = $(this).parent('.cmp-tab-block__nav-li').index(); 2122 tabThis.find('.cmp-tab-block__item').eq(activeIndex).fadeIn().addClass('active'); 2123 $('.cmp-mm-score-full__date-ul li').find('.cmp-mm-score-full__date-btn').removeClass('cmp-mm-score-full__date-btn--active'); 2124 let cmpBlockItemActive = $('.cmp-tab-block__item.active') 2125 $('.cmp-mm-score-full__content-in').css("display", "none"); 2126 $(cmpBlockItemActive).find('.cmp-mm-score-full__date-btn').eq(0).addClass("cmp-mm-score-full__date-btn--active"); 2127 $(cmpBlockItemActive).find('.cmp-mm-score-full__content .cmp-mm-score-full__content-in').eq(0).css("display", "block"); 2128 return false;
2129 }); 2130 }); 2131 $('.cmp-mm-score-full__date-ul li').on("click", function () { 2132 $('.cmp-mm-score-full__date-ul li').find('.cmp-mm-score-full__date-btn').removeClass('cmp-mm-score-full__date-btn--active'); 2133 $(this).children('.cmp-mm-score-full__date-btn').addClass('cmp-mm-score-full__date-btn--active'); 2134 let mmScoreDateHref = $(this).find('.cmp-mm-score-full__date-btn--active').attr('data-id'); 2135 $('.cmp-mm-score-full__content-in').css("display", "none"); 2136 $('#' + mmScoreDateHref + '.cmp-mm-score-full__content-in').css("display", "block"); 2137 }); 2138 2139} 2140revampCustomutils.articleGallery = function () { 2141 let sliderSrc="src"; 2142 if(screen.width>=991){ 2143 sliderSrc="data-fullwidth"; 2144 } 2145 else if (screen.width<991 && screen.width>=575){ 2146 sliderSrc="data-tabsrc"; 2147 } 2148 else{ 2149 sliderSrc="data-mobsrc"; 2150 } 2151 2152 $('.cmp-list-gallery').each(function (key, data) { 2153 try{ 2154 let image = $(data).find("img"); 2155 2156 image.each(function() { 2157 const webSrc = $(this).attr('data-websrc'); 2158 if (webSrc) { 2159 const fullWidthSrc = webSrc.split('?')[0]; 2160 $(this).attr('data-fullwidth', fullWidthSrc); 2161 } 2162 }); 2163 2164 let gallery = $(data).find(".mm-icon__zoom"); 2165 gallery.on('click', function (e) { 2166 e.preventDefault(); 2167 $(this).parent().siblings('img').click(); 2168 }); 2169 image.simpleLightbox({ 2170 navText: ['<i class="mm-icon mm-white-icon mm-icon__arrow-right-lg"></i>', '<i class="mm-icon mm-white-icon mm-icon__arrow-left-lg"></i>'], 2171 closeText: 'Ã', 2172 className: 'cmp-list-gallery__lightbox', 2173 widthRatio: 1, 2174 captions: true, 2175 captionPosition: 'bottom', 2176 captionDelay: .3, 2177 sourceAttr: sliderSrc, 2178 fileExt: false, 2179 2180 }); 2181 }catch(err){} 2182 }); 2183 2184} 2185revampCustomutils.articleSlider = function () { 2186 $('.cmp-article-slider__large').each(function () { 2187 $(this).not('.slick-initialized').slick({ 2188 asNavFor: '.cmp-article-slider__thumb', 2189 centerPadding: '0px', 2190 infinite: false, 2191 slidesToShow: 1, 2192 slidesToScroll: 1, 2193 dots: false, 2194 prevArrow: '<button class="slide-arrow prev-arrow"><i class="mm-icon mm-icon__arrow-right-lg"></i> </button>', 2195 nextArrow: '<button class="slide-arrow next-arrow"><i class="mm-icon mm-icon__arrow-left-lg"></i> </button>', 2196 }); 2197 }); 2198 $('.cmp-article-slider__thumb').each(function () { 2199 $(this).not('.slick-initialized').slick({ 2200 slidesToShow: 4, 2201 slidesToScroll: 1, 2202 centerPadding: '40px', 2203 asNavFor: '.cmp-article-slider__large', 2204 infinite: false, 2205 dots: false, 2206 focusOnSelect: true, 2207 prevArrow: '<button class="cmp-article-slider__thumb-arrow prev-arrow"><i class="mm-icon mm-icon__arrow-right-lg"></i> </button>', 2208 nextArrow: '<button class="cmp-article-slider__thumb-arrow next-arrow"><i class="mm-icon mm-icon__arrow-left-lg"></i> </button>', 2209 responsive: [{ 2210 breakpoint: 576, 2211 settings: { 2212 slidesToShow: 3, 2213 slidesToScroll: 1, 2214 } 2215 }, ] 2216 }); 2217 }); 2218} 2219revampCustomutils.artcleSimpleslider = function () { 2220 $('.cmp-simple-slider-block__main').each(function () { 2221 let timeInterval = $(this).data('id'); 2222 let randomSpeed = 1000 * parseInt(timeInterval); // code to calculate random speed here 2223 $(this).not('.slick-initialized').slick({ 2224 dots: false, 2225 lazyLoad: 'ondemand', 2226 autoplay: true, 2227 autoplaySpeed: randomSpeed, 2228 fade: true, 2229 cssEase: 'linear', 2230 slidesToShow: 1, 2231 slidesToScroll: 1, 2232 infinite: false, 2233 arrows: true, 2234 pauseOnHover: false, 2235 pauseOnFocus: false, 2236 prevArrow: '<button class="slide-arrow prev-arrow slick-arrow"><i class="mm-icon mm-icon__arrow-right-lg"></i> </button>', 2237 nextArrow: '<button class="slide-arrow next-arrow slick-arrow"><i class="mm-icon mm-icon__arrow-left-lg"></i> </button>' 2238 2239 }); 2240 }) 2241 $('.cmp-simple-slider-block__main').not('.slick-initialized').slick('slickPlay'); 2242} 2243 2244// ImageSlideShow 2245revampCustomutils.premiumImageSlideShow = function () { 2246 $('.cmp-gallery-block').each(function () { 2247 let $thisGallery = $(this); 2248 $(this).find('.cmp-gallery-block__open').on("click", function () { 2249 $thisGallery.find('.cmp-gallery-block__popup').fadeIn(200); 2250 $thisGallery.find('.cmp-gallery-block__popup-slider').not('.slick-initialized').slick({ 2251 centerPadding: '20px', 2252 infinite: false, 2253 slidesToShow: 1, 2254 slidesToScroll: 1, 2255 dots: false,
2256 prevArrow: '<button class="slide-arrow slick-custom-arrow slick-prev"><i class="mm-icon mm-white-icon mm-icon__arrow-right-sm"></i> </button>', 2257 nextArrow: '<button class="slide-arrow slick-custom-arrow slick-next"><i class="mm-icon mm-white-icon mm-icon__arrow-left-sm"></i> </button>' 2258 }); 2259 $('body').addClass("overflow-hidden"); 2260 $(".lazyload").unveil(); 2261 }); 2262 2263 $thisGallery.find('.cmp-gallery-block__item:nth-child(2) .cmp-gallery-block__open').click(function () { 2264 let slider = $thisGallery.find('.cmp-gallery-block__popup-slider'); 2265 slider[0].slick.slickGoTo(parseInt(1)); 2266 }); 2267 $thisGallery.find('.cmp-gallery-block__item:nth-child(3) .cmp-gallery-block__open').click(function () { 2268 let slider = $thisGallery.find('.cmp-gallery-block__popup-slider'); 2269 slider[0].slick.slickGoTo(parseInt(2)); 2270 }); 2271 2272 // close gallery 2273 $thisGallery.find('.cmp-gallery-block__popup-close').on("click", function () { 2274 $thisGallery.find('.cmp-gallery-block__popup').fadeOut(200); 2275 $('body').removeClass("overflow-hidden"); 2276 $thisGallery.find('.cmp-gallery-block__popup-slider').slick('unslick'); 2277 }); 2278 $thisGallery.find('.cmp-gallery-block__popup-info').on("click", function () { 2279 $(this).closest('.cmp-gallery-block').toggleClass("galleryDispnhide"); 2280 }); 2281 2282 }); 2283 2284 2285} 2286 2287// Search component 2288revampCustomutils.searchComponent = function () { 2289 const $switchLanguage = $('.cmp-search-popup__switch-language input[type="checkbox"]'); 2290 const $searchInput = $('.cmp-search-popup__input'); 2291 const $searchButton = $('.cmp-search-popup__btn'); 2292 let enPlaceHold; 2293 let searchURL; 2294 let searchVal; 2295 $switchLanguage.on('change', function() { 2296 console.log('clicked') 2297 const $ele = $(this); 2298 const isChecked = $ele.is(':checked'); 2299 const wrap = $ele.closest('.cmp-search-popup__filed-block'); 2300 const inputWrp = wrap.find('.cmp-search-popup__input-wrp'); 2301 const indicaElement = inputWrp.find('[id^="Indica_Wrapper"]'); 2302 if (isChecked) { 2303 let randNum = Math.floor(Math.random() * 1000); 2304 let newWrapId = 'search-mal-' + randNum; 2305 let Indica_Wrapper = 'Indica_Wrapper-' + randNum; 2306 2307 if(!inputWrp.attr('id')) { 2308 2309 wrap.find('.cmp-search-popup__input-wrp').attr({ 2310 'id': newWrapId, 2311 'data-language': 'malayalam', 2312 'data-keyboard': 'phonetic-mal' 2313 }); 2314 wrap.find('.cmp-search-popup__input-wrp input').val('') 2315 enPlaceHold = wrap.find('.cmp-search-popup__input-wrp input').attr('placeholder') 2316 2317 if(document.getElementById(Indica_Wrapper) === null){ 2318 new MMEditorSearch(document.getElementById(newWrapId), newWrapId, Indica_Wrapper); 2319 2320 } 2321 2322 } 2323 2324 }else{ 2325 inputWrp.find('.cmp-search-popup__input').removeAttr('id').removeAttr('placeholder'); 2326 inputWrp.find('.cmp-search-popup__input').attr('placeholder', enPlaceHold) 2327 inputWrp.removeAttr('id').removeAttr('data-language').removeAttr('data-keyboard'); 2328 const indicaCont = indicaElement.html(); 2329 indicaElement.replaceWith(indicaCont); 2330 } 2331 inputWrp.find('.cmp-search-popup__input').focus(); 2332 2333 }); 2334 $searchInput.on('keypress', function(e) { 2335 if (e.keyCode === 13) { 2336 searchVal = $(this).val(); 2337 searchURL = $(this).data('url'); 2338 searchResult(searchVal, searchURL, $(this)); 2339 } 2340 }); 2341 $searchButton.on('click', function() { 2342 const inpEle = $(this).closest('.cmp-search-popup__input-wrp').find('.cmp-search-popup__input'); 2343 searchVal = inpEle.val(); 2344 searchURL = inpEle.data('url'); 2345 searchResult(searchVal, searchURL, $(this)); 2346 }); 2347 function searchResult(val,url,ele) { 2348 if (val && url) { 2349 const redirectUrl = url + encodeURI(val); 2350 window.location.href = redirectUrl; 2351 } 2352 } 2353} 2354 2355 2356// 404 page listing tab 2357revampCustomutils.errorPageListingTab = function () { 2358 $('.listing-nav-tab').each(function () { 2359 const tabThis = $(this); 2360 tabThis.find('.cmp-nav-tab__li:first-child').addClass('active'); 2361 tabThis.find('.cmp-nav-tab__item').hide(); 2362 tabThis.find('.cmp-nav-tab__item:first').show(); 2363 tabThis.find('.cmp-nav-tab__li a').on("click", function (e) { 2364 e.preventDefault(); 2365 const clickedTab = $(this).parent('.cmp-nav-tab__li'); 2366 tabThis.find('.cmp-nav-tab__li').removeClass('active'); 2367 clickedTab.addClass('active'); 2368 tabThis.find('.cmp-nav-tab__item').hide().removeClass('active'); 2369 const activeTab = $(this).attr('href'); 2370 $(activeTab).fadeIn().addClass('active'); 2371 try { 2372 if($('.story-card-list-block .cmp-story-list--slider').not('.slick-initialized').slick('refresh')){ 2373 $('.story-card-list-block .cmp-story-list--slider').on('afterChange', function(e, slick, currentSlide){ 2374 $(".lazyload").unveil(); 2375 }); 2376 } 2377 } 2378 catch (err) { 2379 } 2380 }); 2381 }); 2382} 2383 2384// added MMO25-1156 story-card-list-block slick slider 2385revampCustomutils.storyCardSlickSlider = function () { 2386 $('.story-card-list-block .cmp-story-list--slider').not('.slick-initialized').not('.slick-initialized').slick({ 2387 centerMode: false, 2388 centerPadding: '0px', 2389 infinite: false, 2390 slidesToShow: 4, 2391 slidesToScroll: 1, 2392 dots: true, 2393 prevArrow: '<button class="slide-arrow prev-arrow"><i class="mm-icon mm-icon__arrow-right-lg"></i> </button>', 2394 nextArrow: '<button class="slide-arrow next-arrow"><i class="mm-icon mm-icon__arrow-left-lg"></i> </button>', 2395 responsive: [{ 2396 breakpoint: 1200, 2397 settings: { 2398 centerPadding: '40px', 2399 slidesToShow: 3, 2400 infinite: true, 2401 } 2402 }, { 2403 breakpoint: 992, 2404 settings: { 2405 centerPadding: '40px', 2406 slidesToShow: 2, 2407 infinite: true, 2408 } 2409 }, { 2410 breakpoint: 576, 2411 settings: { 2412 centerPadding: '40px', 2413 slidesToShow: 1, 2414 infinite: true, 2415 } 2416 }] 2417 }); 2418} 2419 2420 2421 2422// Scroll bottom - comment section 2423revampCustomutils.vuukleComment = function () { 2424 $("#vuukleComment").on('click', function () { 2425 $('html, body').animate({ 2426 'scrollTop': $('#comments').offset().top 2427 }, 2000); 2428 }); 2429} 2430 2431//Indepth list hide 2432revampCustomutils.indepthListHide = function () { 2433 $('div.cmp-story-list__component-slot-in').each(function() { 2434 if($.trim($(this).text()) === '' && $(this).children().length == 0) { 2435 $(this).parent().hide(); 2436 } 2437 }); 2438} 2439 2440// MMO25-1615 List show more 2441revampCustomutils.listShowMore = function () { 2442 try { 2443 if ($(".moreInarticle-story-block").find(".cmp-story-list").hasClass("listshowmore")){ 2444 let currentURL = window.location.href; 2445 let listlen = $(".moreInarticle-story-block").find(".cmp-story-list.listshowmore li.cmp-story-list__item").length-1; 2446 let duplicate = false;
2447 $(".moreInarticle-story-block").find(".cmp-story-list.listshowmore li.cmp-story-list__item").each(function (index, element) { 2448 let hrefValue = $(this).find("a.cmp-story-list__title-link").attr("href"); 2449 if (currentURL.indexOf(hrefValue) !== -1) { 2450 $(this).remove(); 2451 duplicate = true; 2452 }else if(index==listlen && duplicate== false){ 2453 $(".moreInarticle-story-block").find(".cmp-story-list.listshowmore li.cmp-story-list__item:last"). remove(); 2454 } 2455 2456 $(this).addClass("smhidden"); 2457 }); 2458 if($(".moreInarticle-story-block li.cmp-story-list__item").length===0){ 2459 $(".moreInarticle-story-block .cmp-section-title-block").remove(); 2460 } 2461 2462 // Set the number of items to show initially and the step size for each "Show More" click 2463 let itemsToShow = $(".cmp-story-list.listshowmore").attr("data-onloadlimit"); 2464 2465 // Show the first set of items 2466 $(".cmp-story-list.listshowmore li.cmp-story-list__item").slice(0, itemsToShow).removeClass("smhidden"); 2467 if ($(".cmp-story-list.listshowmore li.cmp-story-list__item").slice(0, itemsToShow).addClass("show")) { 2468 $(".lazyload").unveil(); 2469 if ($(".cmp-story-list.listshowmore li.cmp-story-list__item.smhidden").length === 0) { 2470 $('.moreInarticle-story-block').find('.cmp-more-stories').hide(); 2471 } 2472 } 2473 2474 // Handle the "Show More" button click 2475 // To avoid live update show more conflict, below line updated 2476 // To avoid premium block show more conflict, below line updated 2477 $(".moreInarticle-story-block").find(".cmp-more-stories").click(function () { 2478 let $hiddenItems = $(".cmp-story-list.listshowmore li.cmp-story-list__item.smhidden"); 2479 let stepSize = $(".cmp-story-list.listshowmore").attr("data-pagelimit"); 2480 let numItemsToShow = Math.min(stepSize, $hiddenItems.length); 2481 2482 $hiddenItems.slice(0, numItemsToShow).removeClass("smhidden"); 2483 $hiddenItems.slice(0, numItemsToShow).addClass("show"); 2484 2485 // Hide the "Show More" button if there are no more hidden items 2486 if ($(".cmp-story-list.listshowmore li.cmp-story-list__item.smhidden").length === 0) { 2487 $(this).hide(); 2488 } 2489 $(".lazyload").unveil(); 2490 }); 2491 } 2492 } catch (err) { } 2493} 2494 2495//reporters corner share 2496revampCustomutils.reportersShare = function () { 2497 $('.rprtr-item-sharebtn').on("click", function(e){ 2498 e.stopPropagation(); 2499 var thispop = $(this).siblings('.rprtr-share-pop'); 2500 if (thispop.hasClass("shareActive")) { 2501 thispop.removeClass("shareActive"); 2502 } else { 2503 $('.rprtr-share-pop').removeClass("shareActive"); 2504 thispop.addClass("shareActive"); 2505 } 2506 2507 }); 2508} 2509revampCustomutils.searchPopupScroll = function () { 2510 $('body').append($('.cmp-search-popup')); 2511 hasPageScrolled = true; 2512} 2513 2514 2515//remove watch next block when no articles are listed by default 2516revampCustomutils.removeWatchNext = function () { 2517 if($(".cmp-video-list-block.publish-mode li.cmp-story-list__item").length === 0 && $(".cmp-video-list-block .cmp-video-list-block__nav").length === 0) { 2518 $(".cmp-video-list-block.publish-mode").closest('.mmcontainer').remove(); 2519 } 2520} 2521 2522// MMO25-3649 Display Time stamp 2523revampCustomutils.displayPublishDate = function () { 2524 const appendTimestamp = className => { 2525 const elements = document.querySelectorAll(`p.${className}`); 2526 const time = respDate => { 2527 const sec = Math.floor((Date.now() - respDate) / 1000); 2528 if (!isNaN(sec)) { 2529 if (sec >= 86400) { 2530 const date = new Date(respDate); 2531 return date.toLocaleDateString('en-US', { month: 'short', day: 'numeric', year: 'numeric'}); 2532 } else if (sec >= 3600) { 2533 const hours = Math.floor(sec / 3600); 2534 return hours + (hours > 1 ? " hours ago" : " hour ago"); 2535 } else if (sec >= 60 && sec < 120) { 2536 return "Just now"; 2537 } else if (sec >= 120) { 2538 const minutes = Math.floor(sec / 60); 2539 return minutes + " minutes ago"; 2540 } else if (sec < 120){ 2541 return "Just now"; 2542 } else {
2543 return "invalid timestamp"; 2544 } 2545 } 2546 }; 2547 elements.forEach(element => { 2548 const publishDateAttr = element.getAttribute('data-publish-date'); 2549 const timestamp = parseInt(publishDateAttr, 10); 2550 if (!isNaN(timestamp)) { 2551 const formattedTime = time(timestamp); 2552 if (publishDateAttr !== "") { 2553 element.innerHTML = formattedTime; 2554 } 2555 } else if (publishDateAttr === null) { 2556 element.classList.remove('cmp-story-list__date'); 2557 } 2558 }); 2559 }; 2560 appendTimestamp('cmp-story-list__date'); 2561} 2562 2563// MMO25-3716 User Interaction Opinion Polling 2564revampCustomutils.userInteractionPollingBlock = function () { 2565 const articleBodySlots = $('.article-body__component-slot[data-pollingUrl]'); 2566 articleBodySlots.each(function (index) { 2567 let pollingUrl = $(this).attr('data-pollingUrl'); 2568 const opinionPollBlockId = `opinionPollBlock_${(index + 1).toString().padStart(2, '0')}`; 2569 $(this).attr('id', opinionPollBlockId); 2570 const opinionPollBlock = $(`#${opinionPollBlockId}`); 2571 let multipleOptionAllowed = false; 2572 let responseData; 2573 let voteButtonText = "VOTE NOW"; 2574 let questionTitleColor; 2575 let buttonColor; 2576 const errorBlockHide = () => { 2577 opinionPollBlock.on('click', '.cmp-polling-block__li', function () { 2578 let errorBlock = $(this).closest('.polling-block').find('.cmp-polling-block__error'); 2579 errorBlock.hide(); 2580 }); 2581 }; 2582 const getAndAppendPollingData = async () => { 2583 if (opinionPollBlock.find('.polling-block').length === 0) { 2584 const pollDataUrl = opinionPollBlock.attr('data-pollingurl'); 2585 pollingUrl = `${pollDataUrl}.json`; 2586 try { 2587 const resultData = await $.ajax({ 2588 url: pollingUrl, 2589 method: 'GET', 2590 dataType: 'json' 2591 }); 2592 responseData = resultData; 2593 if (resultData.opinionPollEventStatus !== 'Active') { 2594 opinionPollBlock.remove(); 2595 return; 2596 } 2597 if (resultData && resultData.opinionPollQuestion) { 2598 resultData.opinionPollQuestion.forEach((questionData) => { 2599 if (hasUserVoted(questionData.opinionPollQuestionId)) { 2600 displayResult(questionData.opinionPollQuestionId); 2601 } 2602 }); 2603 } 2604 questionTitleColor = resultData.opinionPollQuestionTitleColor; 2605 buttonColor = resultData.opinionPollButtonColor; 2606 const pollLanguage = resultData.opinionPollEventLanguage; 2607 const pollTitleName = resultData.opinionPollEventName; 2608 const opinionPollEventEndDate = new Date(resultData.opinionPollEventEndDate); 2609 const pollPoweredByImage = resultData.opinionPollEventPoweredByImage; 2610 const pollPoweredBy = resultData.opinionPollEventPoweredBy; 2611 const pollPoweredByWebsiteUrl = resultData.opinionPollEventPoweredByWebsiteUrl; 2612 const pollPoweredByNewTab = resultData.poweredByNewTab; 2613 const sectionTitleBlockExists = opinionPollBlock.find('.cmp-section-title-block').length > 0; 2614 opinionPollBlock.append('<div class="polling-block-outer"></div>'); 2615 if (!sectionTitleBlockExists) { 2616 let sectionTitleBlock = ` 2617 <div class="cmp-section-title-block"> 2618 <h3 class="cmp-section-title"><span class="cmp-section-shape"></span>${pollTitleName}</h3> 2619 `; 2620 if (pollPoweredByImage || pollPoweredBy || pollPoweredByWebsiteUrl) { 2621 sectionTitleBlock += ` 2622 <div class="cmp-sponser-block"> 2623 <div class="cmp-sponser-block__title">Powered By</div> 2624 <div class="cmp-sponser-block__logo"> 2625 <a tabindex="0" href="${pollPoweredByWebsiteUrl || '#'}" target="${pollPoweredByNewTab ? '_blank' : '_self'}"> 2626 ${pollPoweredByImage ? `<img src="${pollPoweredByImage}" alt="${pollPoweredBy}
2626">` : ''} 2627 </a> 2628 </div> 2629 </div> 2630 `; 2631 } 2632 2633 sectionTitleBlock += `</div>`; 2634 opinionPollBlock.find('.polling-block-outer').prepend(sectionTitleBlock); 2635 } 2636 2637 if (!opinionPollEventEndDate) { 2638 console.warn("The opinion poll event end date is not set."); 2639 } else { 2640 const eventEndDate = opinionPollEventEndDate instanceof Date ? opinionPollEventEndDate : new Date(opinionPollEventEndDate); 2641 2642 if (isNaN(eventEndDate.getTime())) { 2643 console.error("Invalid opinion poll event end date."); 2644 } else { 2645 const currentDate = new Date(); 2646 2647 if (currentDate > eventEndDate) { 2648 resultData.opinionPollQuestion.forEach((questionData) => { 2649 displayResult(questionData.opinionPollQuestionId); 2650 }); 2651 2652 const observer = new MutationObserver(() => { 2653 const pollingBlocks = document.querySelectorAll('.cmp-polling-block__alertmsg'); 2654 if (pollingBlocks.length > 0) { 2655 pollingBlocks.forEach((pollingBlock) => { 2656 pollingBlock.style.display = 'block'; 2657 }); 2658 observer.disconnect(); 2659 } 2660 }); 2661 observer.observe(document.body, { childList: true, subtree: true }); 2662 } 2663 } 2664 } 2665 2666 resultData.opinionPollQuestion.forEach((questionData) => { 2667 const opinionPollQuestionId = questionData.opinionPollQuestionId; 2668 let languageClass = ''; 2669 2670 if (pollLanguage === 'Malayalam') { 2671 languageClass = 'ml-font';
2672 } else if (pollLanguage === 'English') { 2673 languageClass = 'english-font'; 2674 } 2675 2676 const titleElement = $(`#pollingOuter-${opinionPollQuestionId} .cmp-section-title`); 2677 const spanElement = $(`#pollingOuter-${opinionPollQuestionId} .cmp-section-shape`); 2678 titleElement.append(spanElement, pollTitleName); 2679 2680 if (pollPoweredByWebsiteUrl) { 2681 $(`#pollingOuter-${opinionPollQuestionId} .cmp-sponser-block__title`).text('Powered By'); 2682 const sponsorLink = $(`#pollingOuter-${opinionPollQuestionId} .cmp-sponser-block__logo a`).attr('href', pollPoweredByWebsiteUrl); 2683 if (pollPoweredByNewTab == true) { 2684 sponsorLink.attr('target', '_blank'); 2685 } 2686 if (pollPoweredByImage) { 2687 $(`#pollingOuter-${opinionPollQuestionId} .cmp-sponser-block__logo img`).attr('src', pollPoweredByImage).attr('alt', pollPoweredBy); 2688 updatePollSponsorImageTheme(); 2689 } else { 2690 $(`#pollingOuter-${opinionPollQuestionId} .cmp-sponser-block__logo img`).remove(); 2691 } 2692 } else { 2693 $(`#pollingOuter-${opinionPollQuestionId} .cmp-sponser-block__logo a`).remove(); 2694 } 2695 2696 const pollingOuter = $(`#pollingOuter-${opinionPollQuestionId}`); 2697 2698 if (pollingOuter.length === 0) { 2699 $(opinionPollBlock).find('.polling-block-outer').append(` 2700 <div id="pollingBlock-${opinionPollQuestionId}" class="polling-block ${languageClass}"></div> 2701 `); 2702 } 2703 const pollMultipleChoiceBlk = $(`#pollingBlock-${opinionPollQuestionId}`); 2704 appendPollingBlock(questionData, pollMultipleChoiceBlk); 2705 }); 2706 } catch (error) { 2707 console.error('Error fetching data:', error); 2708 } 2709 updatePollSponsorImageTheme(); 2710 } 2711 opinionPollBlock.find('.cmp-polling-block__ul li').off('click'); 2712 errorBlockHide(); 2713 }; 2714 2715 const updatePollSponsorImageTheme = () => { 2716 $('.cmp-sponser-block__logo img').each(function() { 2717 var $parentDiv = $(this).closest('.article-body__component-slot'); 2718 if ($parentDiv.data('pollingurl')) { 2719 const sponsorImage = $(this); 2720 const pollPoweredByImage = sponsorImage.attr('src'); 2721 if ($('html').hasClass('mm-light-theme')) { 2722 sponsorImage.attr('src', pollPoweredByImage).removeClass('image-dark-theme').addClass('image-light-theme'); 2723 } else if ($('html').hasClass('mm-dark-theme')) { 2724 sponsorImage.attr('src', pollPoweredByImage).removeClass('image-light-theme').addClass('image-dark-theme'); 2725 } else { 2726 sponsorImage.attr('src', pollPoweredByImage).removeClass('image-dark-theme').addClass('image-light-theme'); 2727 } 2728 } 2729 }); 2730 }; 2731 2732 const isMultipleOptionAllowed = (responseData) => { 2733 return responseData.multipleOptionAllowed; 2734 }; 2735 const appendPollingBlock = (questionData, pollingBlock) => { 2736 const questionName = questionData.opinionPollQuestionName; 2737 const pollQuestionDescription = questionData.opinionPollQuestionDescription; 2738 const opinionPollQuestionId = questionData.opinionPollQuestionId; 2739 const pollOptions = questionData.opinionPollOption; 2740 multipleOptionAllowed = isMultipleOptionAllowed(responseData); 2741 let optionsHTML = ''; 2742 if (questionData.opinionPollVoteButtonText) { 2743 voteButtonText = questionData.opinionPollVoteButtonText; 2744 } 2745 2746 if (pollOptions && Array.isArray(pollOptions)) { 2747 pollOptions.forEach((option, optionIndex) => { 2748 let iconBlock = ''; 2749 if (option.opinionPollOptionImage) { 2750 iconBlock = `<div class="cmp-polling-block__icon"><img src="${option.opinionPollOptionImage}" alt="" title=""></div>`; 2751 } 2752 optionsHTML += `<li class="cmp-polling-block__li"> 2753 <label class="cmp-polling-block__option-label d-flex align-items-center"> 2754 ${iconBlock} 2755 <div class="cmp-polling-block__option-text">${option.opinionPollOptionValue}</div> 2756 <input type="${multipleOptionAllowed ? 'checkbox' : 'radio'}" data-pollQuestionId="${option.opinionPollOptionId}" id="option-${opinionPollQuestionId}-${optionIndex}" value="${option.opinionPollOptionValue}" name="pollingOption${opinionPollQuestionId}"> 2757 <div class="cmp-polling-block__ticker"> <i class="mm-icon mm-icon__check mm-white-icon"></i></div> 2758 </label> 2759 </li>`; 2760 }); 2761 } 2762 2763 pollingBlock.html(` 2764 <div class="cmp-polling-block mm-border-radius-8 card-gray-bg"> 2765 <div class="cmp-polling-block__option-block"> 2766 <div class="cmp-polling-block__head"> 2767 <h6 class="cmp-polling-block__title" ${questionTitleColor ? `style="color: ${questionTitleColor};"` : ''}>${questionName}</h6> 2768 <p class="cmp-polling-block__dispn">${pollQuestionDescription}</p> 2769 <p class="cmp-polling-block__alertmsg" style="display: none">Voting Completed</p> 2770 </div> 2771 <div class="cmp-polling-block__body"> 2772 <ul class="cmp-polling-block__ul d-flex flex-wrap"> 2773 ${optionsHTML} 2774 </ul> 2775 <div class="cmp-polling-block__footer d-flex justify-content-between"> 2776 <div class="cmp-polling-block__footer-left"> 2777 <div class="cmp-polling-block__error" style="display: none">Please Select an Option !</div> 2778 </div> 2779 <div id="locked-msg-loading-overlay" class="locked-msg-loading-overlay" style="display: none; text-align: center;"> 2780 <img src="/etc/designs/mmonline/cl
2780ientlibs/img/ajax-loader.gif" alt="loading" /> 2781 </div> 2782 <div class="cmp-polling-block__footer-right"> 2783 <button class="mm-btn mm-btn--primary vote-button" data-questionid="${opinionPollQuestionId}" ${buttonColor ? `style="background-color: ${buttonColor};border-color: ${buttonColor}"` : ''}><span>${voteButtonText}</span></button> 2784 </div> 2785 </div> 2786 </div> 2787 </div> 2788 </div> 2789 `); 2790 pollingBlock.find('.cmp-polling-block__icon').each(function () { 2791 if ($(this).children('img').length === 0) { 2792 $(this).hide(); 2793 } 2794 }) 2795 }; 2796 const displayResult = async (opinionPollQuestionId) => { 2797 const pollDataUrl = opinionPollBlock.attr('data-pollingurl'); 2798 const resultDataUrl = `${pollDataUrl}-Votes.json`; 2799 try { 2800 const resultData = await $.ajax({ 2801 url: resultDataUrl, 2802 method: 'GET', 2803 dataType: 'json' 2804 }); 2805 const pollingBlock = opinionPollBlock.find(`#pollingBlock-${opinionPollQuestionId}`); 2806 $('.locked-msg-loading-overlay').css('display','none'); 2807 pollingBlock.find('.cmp-polling-block__body').remove(); 2808 const resultBlock = ` 2809 <div class="cmp-polling-block__body cmp-polling-block__body--result"> 2810 <ul class="cmp-polling-block__ul d-flex flex-wrap"> 2811 2812 </ul> 2813 2814 </div>`; 2815 pollingBlock.find('.cmp-polling-block__option-block').append(resultBlock); 2816 const resultUl = pollingBlock.find('.cmp-polling-block__ul'); 2817 const resultDataList = resultData.opinionPollQuestion.find(q => q.opinionPollQuestionId === opinionPollQuestionId).opinionPollOption; 2818 if (Array.isArray(resultDataList) && resultDataList.length > 0) { 2819 resultDataList.forEach((option) => { 2820 const liElement = ` 2821 <li class="cmp-polling-block__li"> 2822 <div class="cmp-polling-block__prcntge"> 2823 <div class="cmp-polling-block__prcntge-title">${option.opinionPollOptionValue}</div> 2824 <div class="cmp-polling-block__prcntge-barblock d-flex align-items-center"> 2825 <div class="cmp-polling-block__prcntge-bar"> 2826 <div class="cmp-polling-block__voteprcntge" style="width: ${option.opinionPollOptionVoteCountPercentage}%"></div> 2827 </div> 2828 <div class="cmp-polling-block__prcntge-value">${option.opinionPollOptionVoteCountPercentage}%</div> 2829 </div> 2830 <div class="cmp-polling-block__prcntge-votecount">${option.opinionPollOptionVoteCount} VOTES</div> 2831 </div> 2832 </li>`; 2833 resultUl.append(liElement); 2834 }); 2835 } 2836 } catch (error) { 2837 console.error('Error fetching result data:', error); 2838 } 2839 }; 2840 2841 const getCookie = (name) => { 2842 let cookieArr = document.cookie.split(';'); 2843 for (let i = 0; i < cookieArr.length; i++) { 2844 let cookiePair = cookieArr[i].split('='); 2845 if (name === cookiePair[0].trim()) { 2846 return decodeURIComponent(cookiePair[1]); 2847 } 2848 } 2849 return null; 2850 }; 2851 2852 const storeVoteStatus = (opinionPollQuestionId) => { 2853 const userName = getUserName(); 2854 sessionStorage.setItem(`hasVoted_${opinionPollQuestionId}_${userName}`, 'true'); 2855 }; 2856 2857 const hasUserVoted = (opinionPollQuestionId) => { 2858 const userName = getUserName(); 2859 return sessionStorage.getItem(`hasVoted_${opinionPollQuestionId}_${userName}`) === 'true'; 2860 }; 2861 2862 const storeUserName = () => { 2863 const mmu_pn = getCookie('mmu_pn'); 2864 sessionStorage.setItem('userName', mmu_pn); 2865 }; 2866 2867 const getUserName = () => { 2868 return sessionStorage.getItem('userName'); 2869 }; 2870 2871 let sso_auth = { 2872 isLoggedIn: function () { 2873 let loginStatus = getCookieVal(login_stat)?.trim(); 2874 var loggedIn = false;
2875 if (loginStatus === 'userLoggedIn') { 2876 loggedIn = true; 2877 } 2878 return loggedIn; 2879 } 2880 } 2881 2882 const submitVote = (opinionPollQuestionId, errorBlock) => { 2883 const pollingUl = opinionPollBlock.find(`#pollingBlock-${opinionPollQuestionId} .cmp-polling-block__ul`); 2884 const selectedInputOption = pollingUl.find('li input:checked'); 2885 const signInValue = document.querySelector('.cmp-header__nav-button.sign-in-button').dataset.utmsource; 2886 const apiKeyVal = '2pJiKtQ64rJyjQNDDcrPxsefJ3AVmLemifVZOPLb5gQPPHex9qb5Zk1TrphUM8yydvr10vcfl8h5P8Y9NHKjlCIqRg2sN99Zwpcm3foCl8XdMk2MkYrSf34kRdwFVehe'; 2887 2888 if (selectedInputOption.length === 0) { 2889 $('.locked-msg-loading-overlay').css('display','none'); 2890 errorBlock.show(); 2891 return; 2892 } 2893 const requestData = []; 2894 selectedInputOption.each(function () { 2895 const selectedOption = $(this); 2896 const selectedOptionId = selectedOption.data('pollquestionid'); 2897 const selectedOptionVal = selectedOption.val(); 2898 requestData.push({ 2899 "opinionPollOptionId": selectedOptionId.toString(), 2900 "opinionPollOptionValue": selectedOptionVal.toString() 2901 }); 2902 }); 2903 if (sso_auth.isLoggedIn()) { 2904 const submitUrl = `https://events.manoramaonline.com/MMQuizAndOpinionPollApp/opinion-poll/submit-question/${opinionPollQuestionId}`; 2905 $.ajax({ 2906 url: submitUrl, 2907 method: 'POST', 2908 contentType: 'application/json', 2909 headers: { 2910 'apiKey': apiKeyVal 2911 }, 2912 data: JSON.stringify(requestData), 2913 success: function (responseData) { 2914 storeVoteStatus(opinionPollQuestionId); 2915 displayResult(opinionPollQuestionId); 2916 }, 2917 error: function (error) { 2918 console.error('Error submitting vote:', error); 2919 } 2920 }); 2921 } else { 2922 console.log('User is not logged in.'); 2923 $('.locked-msg-loading-overlay').css('display','none'); 2924 ssoIn(false, signInValue); 2925 } 2926 }; 2927 2928 function ssoIn(signUpFlag, utmsource) { 2929 let currLoc = encodeURIComponent(window.location.href); 2930 window.location.href = mmlog_path + "?a=in&pageURL=" + currLoc + "&signUpFlag=" + signUpFlag + "&utm_source=" + utmsource; 2931 } 2932 opinionPollBlock.on('click', '.vote-button', function (event) { 2933 event.preventDefault(); 2934 $('.locked-msg-loading-overlay').css('display','block'); 2935 const opinionPollQuestionId = $(this).data('questionid'); 2936 const errorBlock = $(this).closest('.polling-block').find('.cmp-polling-block__error'); 2937 if (sso_auth.isLoggedIn()) { 2938 storeUserName(); 2939 if (hasUserVoted(opinionPollQuestionId)) { 2940 $('.locked-msg-loading-overlay').css('display','none'); 2941 console.log('You have already voted on this question.'); 2942 return; 2943 } 2944 } 2945 submitVote(opinionPollQuestionId, errorBlock); 2946 }); 2947 2948 errorBlockHide(); 2949 getAndAppendPollingData(); 2950 }); 2951} 2952 2953//update SponsorImageTheme in UserInteractionBlock whenever the site theme changes. 2954revampCustomutils.themeLabelClickListener = function () { 2955 let themeLabels = document.querySelectorAll(".cmp-theme__label");
2956 themeLabels.forEach((label) => { 2957 label.addEventListener("click", function () { 2958 let themeValueselected = label.querySelector("input[name='theme']:checked"); 2959 if (themeValueselected) { 2960 $(".cmp-sponser-block__logo img").each(function () { 2961 var $parentDiv = $(this).closest(".article-body__component-slot"); 2962 if ($parentDiv.data("quizurl") || $parentDiv.data("pollingurl")) { 2963 const sponsorImage = $(this); 2964 const poweredByImage = sponsorImage.attr("src"); 2965 let themeClass = "light"; 2966 2967 if ($("html").hasClass("mm-dark-theme")) { 2968 themeClass = "dark"; 2969 } 2970 sponsorImage 2971 .attr("src", poweredByImage) 2972 .removeClass("image-light-theme image-dark-theme") 2973 .addClass("image-" + themeClass + "-theme"); 2974 } 2975 }); 2976 } 2977 }); 2978 }); 2979}; 2980// MMO25-3716 User Interaction Quiz 2981revampCustomutils.userInteractionQuizBlock = function () { 2982 const articleBodySlots = $('.article-body__component-slot[data-quizUrl]'); 2983 articleBodySlots.each(function (index) { 2984 let qaDataUrl = $(this).attr('data-quizUrl'); 2985 const qaBlockId = `quizBlock_${(index + 1).toString().padStart(2, '0')}`; 2986 $(this).attr('id', qaBlockId); 2987 const qaBlock = $(`#${qaBlockId}`); 2988 let currentQuestionIndex = 0; 2989 let isCarousel = false; 2990 let anyOptionSelected = false; 2991 let respData = []; 2992 const createDescriptionElement = (description) => { 2993 return $('<div>').addClass('cmp-multiple-choice__answerDispn').append($('<p>').html(description)); 2994 }; 2995 const userInteractionQaBlock = async () => { 2996 if (qaBlock.find('.multiple-choice-outer').length === 0) { 2997 let dataQuizCode = qaBlock.attr('data-quizUrl'); 2998 qaDataUrl = `${dataQuizCode}.json`; 2999 try { 3000 const responseData = await $.ajax({ 3001 url: qaDataUrl, 3002 method: 'GET', 3003 dataType: 'json' 3004 }); 3005 respData = responseData.quizQuestions; 3006 const quizLanguage = responseData.quizLanguage; 3007 const quizName = responseData.quizName; 3008 const quizPoweredByImage = responseData.quizPoweredByImage; 3009 const quizPoweredBy = responseData.quizPoweredBy; 3010 const quizPoweredByWebsiteUrl = responseData.quizPoweredByWebsiteUrl; 3011 const quizPoweredByNewTab = responseData.quizPoweredByNewTab; 3012 let languageClass = ''; 3013 3014 if (quizLanguage === 'Malayalam') { 3015 languageClass = 'ml-font';
3016 } else if (quizLanguage === 'English') { 3017 languageClass = 'english-font'; 3018 } 3019 qaBlock.append(` 3020 <div class="multiple-choice-outer "> 3021 <div class="cmp-section-title-block"> 3022 <h3 class="cmp-section-title"><span class="cmp-section-shape"></span></h3> 3023 <div class="cmp-sponser-block "> 3024 <div class="cmp-sponser-block__title"></div> 3025 <div class="cmp-sponser-block__logo"><a tabindex="0"> <img> </a> </div> 3026 </div> 3027 </div> 3028 <div class="multiple-choice-question-block ${languageClass}"></div> 3029 </div> 3030 `); 3031 if (responseData.quizStatus !== 'Active') { 3032 qaBlock.remove(); 3033 return; 3034 } 3035 const titleElement = $('<h3>').addClass('cmp-section-title').append( 3036 $('<span>').addClass('cmp-section-shape'), 3037 quizName, 3038 3039 ); 3040 qaBlock.find('.cmp-section-title').html(titleElement); 3041 if (quizPoweredByWebsiteUrl) { 3042 qaBlock.find('.cmp-sponser-block__title').text('Powered By'); 3043 const sponsorLink = qaBlock.find('.cmp-sponser-block__logo a').attr('href', quizPoweredByWebsiteUrl); 3044 if (quizPoweredByNewTab) { 3045 sponsorLink.attr('target', '_blank'); 3046 } 3047 if (quizPoweredByImage) { 3048 const sponsorImage = qaBlock.find('.cmp-sponser-block__logo img'); 3049 sponsorImage.attr('src', quizPoweredByImage).attr('alt', quizPoweredBy); 3050 updateSponsorImageTheme(sponsorImage); 3051 } else { 3052 qaBlock.find('.cmp-sponser-block__logo img').remove(); 3053 } 3054 } else { 3055 qaBlock.find('.cmp-sponser-block__logo a').remove(); 3056 } 3057 appendQABlocks(responseData.quizQuestions); 3058 if (responseData.quizDisplayType === 'horizontalVariant') { 3059 qaBlock.find('.multiple-choice-outer').addClass('multiple-choice-outer--carousal'); 3060 isCarousel = true; 3061 } else if (responseData.quizDisplayType === 'verticalVariant') { 3062 qaBlock.find('.multiple-choice-outer').removeClass('multiple-choice-outer--carousal'); 3063 qaBlock.find('.cmp-multiple-choice').show(); 3064 } 3065 3066 if (isCarousel) { 3067 createPrimaryButton(); 3068 } 3069 } catch (error) { 3070 console.error('Error fetching data:', error); 3071 } 3072 } 3073 3074 }; 3075 const updateSponsorImageTheme = () => { 3076 $('.cmp-sponser-block__logo img').each(function() { 3077 var $parentDiv = $(this).closest('.article-body__component-slot'); 3078 if ($parentDiv.data('quizurl')) { 3079 const sponsorImage = $(this); 3080 const quizPoweredByImage = sponsorImage.attr('src'); 3081 if ($('html').hasClass('mm-light-theme')) { 3082 sponsorImage.attr('src', quizPoweredByImage).removeClass('image-dark-theme').addClass('image-light-theme'); 3083 } else if ($('html').hasClass('mm-dark-theme')) { 3084 sponsorImage.attr('src', quizPoweredByImage).removeClass('image-light-theme').addClass('image-dark-theme'); 3085 } else { 3086 sponsorImage.attr('src', quizPoweredByImage).removeClass('image-dark-theme').addClass('image-light-theme'); 3087 } 3088 } 3089 }); 3090 }; 3091 const calculateScore = () => { 3092 let correctAnswers = 0; 3093 respData.forEach((qaData, index) => { 3094 const selectedOption = qaBlock.find('.cmp-multiple-choice').eq(index).find('.cmp-multiple-choice__answer.cmp-multiple-choice__selected'); 3095 if (selectedOption.length > 0 && selectedOption.index() === qaData.correctAnswer) { 3096 correctAnswers++; 3097 } 3098 }); 3099 return correctAnswers; 3100 }; 3101 const displayResult = () => { 3102 const score = calculateScore(); 3103 const totalQuestions = respData.length; 3104 const resultHTML = ` 3105 <div class="cmp-multiple-choice cmp-multiple-choice__result"> 3106 <div class="cmp-multiple-choice__result-title en-font">Thank you for participating...</div> 3107 <div class="cmp-multiple-choice__points en-font">Your score is <span class="total-count">${score}</span> of <span class="total-count">${totalQuestions}</span></div> 3108 <div style="width: 100%;margin-top: 10px;"><button class="mm-btn mm-btn--primary restartBtn"><span>Restart </span></button></div>
3109 </div> 3110 `; 3111 qaBlock.find('.cmp-multiple-choice__footer').before(resultHTML); 3112 }; 3113 3114 const createPrimaryButton = () => { 3115 qaBlock.find('.multiple-choice-question-block').append(` 3116 <div class="cmp-multiple-choice__footer d-flex justify-content-between"> 3117 <div class="cmp-multiple-choice__footer-left"> 3118 <div class="cmp-multiple-choice__error" style="display: none">Please Select an Option !</div> 3119 </div> 3120 <div class="cmp-multiple-choice__footer-right"> 3121 <button class="mm-btn mm-btn--primary" disabled> 3122 <span>Next <i class="mm-icon mm-white-icon mm-icon__arrow-left-sm-rounded"></i></span> 3123 </button> 3124 </div> 3125 </div> 3126 `); 3127 }; 3128 const createQABlock = (qaData, index, dataLength) => { 3129 let optionsHTML = ''; 3130 qaData.quizOptions.forEach((option, optionIndex) => { 3131 optionsHTML += `<button class="cmp-multiple-choice__answer cmp-multiple-choice__unanswered cmp-multiple-choice__not-selected"> 3132 <div class="cmp-multiple-choice__text">${option.quizOptionValue}</div> 3133 </button>`; 3134 }); 3135 3136 let imageHTML = ''; 3137 if (qaData.questionImage) { 3138 imageHTML = `<div class="cmp-story-figure"> 3139 <figure class="cmp-story-figure__in"> 3140 <div class="cmp-story-figure__image"> 3141 <div class="cmp-story-figure__web-image"><img src="${qaData.questionImage}" title="" alt=""></div> 3142 </div> 3143 </figure> 3144 </div>`; 3145 } 3146 3147 return ` 3148 <div class="cmp-multiple-choice"> 3149 <div class="cmp-multiple-choice__counter"> 3150 <span class="cmp-multiple-choice__counter-current">${index + 1}</span> of ${dataLength} 3151 </div> 3152 <h6 class="cmp-multiple-choice__question">${qaData.question}</h6> 3153 ${imageHTML} 3154 <div class="cmp-multiple-choice__option-block"> 3155 ${optionsHTML} 3156 </div> 3157 </div> 3158 `; 3159 }; 3160 const appendQABlocks = (data, isCarousel) => { 3161 3162 data.forEach((qaData, index) => { 3163 const qaBlockHTML = createQABlock(qaData, index, data.length); 3164 qaBlock.find('.multiple-choice-question-block').append(qaBlockHTML); 3165 if (!isCarousel && index !== currentQuestionIndex) { 3166 qaBlock.find('.cmp-multiple-choice').eq(index).hide(); 3167 } 3168 }); 3169 }; 3170 qaBlock.on('click', '.mm-btn--primary', (event) => { 3171 3172 let currentQuestion = qaBlock.find('.cmp-multiple-choice').eq(currentQuestionIndex); 3173 let isVisibleBlock = currentQuestion.is(':visible'); 3174 3175 if (isVisibleBlock) { 3176 if (!anyOptionSelected) { 3177 qaBlock.find('.cmp-multiple-choice__error').show(); 3178 } else { 3179 let currentError = currentQuestion.find('.cmp-multiple-choice__footer .cmp-multiple-choice__error'); 3180 currentError.hide(); 3181 currentQuestionIndex++; 3182 if (currentQuestionIndex < respData.length) { 3183 anyOptionSelected = false; 3184 showQuestion(currentQuestionIndex); 3185 } else { 3186 qaBlock.find('.cmp-multiple-choice').hide(); 3187 qaBlock.find('.cmp-multiple-choice__footer-right').hide(); 3188 displayResult(); 3189 } 3190 } 3191 } 3192 }); 3193 qaBlock.on('click', '.cmp-multiple-choice__answer', (event) => { 3194 let selectedButton = $(event.currentTarget); 3195 let multipleChoiceBlk = selectedButton.closest('.cmp-multiple-choice'); 3196 let questionAllOption = multipleChoiceBlk.find('.cmp-multiple-choice__answer'); 3197 let selectedBtnIndex = selectedButton.index(); 3198 let questionIndex = multipleChoiceBlk.index(); 3199 let qaData = respData[questionIndex]; 3200 let correctOptionIndex = qaData.correctAnswer; 3201 let isCorrectAnswer = selectedBtnIndex == correctOptionIndex; 3202 let correctOptionButton = questionAllOption[correctOptionIndex]; 3203 3204 for (let i = 0; i < questionAllOption.length; i++) { 3205 questionAllOption[i].classList.remove('cmp-multiple-choice__unanswered'); 3206 questionAllOption[i].classList.add('cmp-multiple-choice__answered'); 3207 } 3208 if (isCarousel) { 3209 qaBlock.find('.cmp-multiple-choice__error').hide(); 3210 } 3211 if (!selectedButton.hasClass('cmp-multiple-choice__selected')) { 3212 selectedButton.removeClass('cmp-multiple-choice__not-selected').addClass('cmp-multiple-choice__selected'); 3213 if (isCorrectAnswer) { 3214 selectedButton.addClass('cmp-multiple-choice__correct'); 3215 } else { 3216 selectedButton.addClass('cmp-multiple-choice__incorrect'); 3217 correctOptionButton.classList.add('cmp-multiple-choice__correct'); 3218 } 3219 if (qaData.correctAnswerExplanation || qaData.correctAnswerExplanation == '') { 3220 let descriptionElement = createDescriptionElement(qaData.correctAnswerExplanation); 3221 multipleChoiceBlk.find('.cmp-multiple-choice__answerDispn').remove(); 3222 multipleChoiceBlk.append(descriptionElement); 3223 } 3224 anyOptionSelected = true; 3225 qaBlock.find('.mm-btn--primary').attr('disabled', false); 3226 } 3227 }); 3228 qaBlock.on('click', '.restartBtn', () => { 3229 resetQuizState(); 3230 }); 3231 const resetQuizState = () => { 3232 currentQuestionIndex = 0; 3233 anyOptionSelected = false;
3234 let multipleChoiceOuter = qaBlock.find('.multiple-choice-outer'); 3235 if (multipleChoiceOuter) { 3236 multipleChoiceOuter.remove(); 3237 } 3238 userInteractionQaBlock(); 3239 }; 3240 const showQuestion = (index) => { 3241 qaBlock.find('.cmp-multiple-choice').hide(); 3242 qaBlock.find('.cmp-multiple-choice').eq(index).show(); 3243 }; 3244 userInteractionQaBlock(); 3245 }); 3246} 3247 3248$(function () { 3249 var bkElement = document.getElementById('breaking-news-url'); 3250 3251 if (bkElement) { 3252 revampCustomutils.loadBreakingNews(); 3253 } 3254 revampCustomutils.cartoonSlider(); 3255 revampCustomutils.gameSlider(); 3256 // revampCustomutils.todaysEpaper(); // command for next phase 3257 revampCustomutils.videoPlayer(); 3258 revampCustomutils.scoreBoardSlider(); 3259 revampCustomutils.mmScoreBoardDateTab(); 3260 revampCustomutils.articleSlider(); 3261 revampCustomutils.articleGallery(); 3262 revampCustomutils.artcleSimpleslider(); 3263 revampCustomutils.premiumImageSlideShow(); 3264 revampCustomutils.searchComponent(); 3265 revampCustomutils.errorPageListingTab(); 3266 revampCustomutils.storyCardSlickSlider(); 3267 revampCustomutils.vuukleComment(); 3268 revampCustomutils.indepthListHide(); 3269 revampCustomutils.listShowMore(); 3270 revampCustomutils.reportersShare(); 3271 revampCustomutils.displayPublishDate(); 3272 revampCustomutils.removeWatchNext(); 3273 handleUserInteractionsOnScroll(); 3274 mmTab(); 3275 revampCustomutils.storylistMore(); 3276 $('.cmp-pagination__btn--active, .cmp-pagination__btn--prev.hidden').on('click', function(e){ 3277 e.preventDefault(); 3278 }); 3279}); 3280 3281$(window).on('load resize scroll', function () { 3282 revampCustomutils.fullwidthBackground(); 3283 if (!hasPageScrolled) { 3284 revampCustomutils.searchPopupScroll(); 3285 } 3286}); 3287 3288// User Interaction Scroll to load 3289function handleUserInteractionsOnScroll() { 3290 let scrollCount = 0; 3291 function handleUserInteractions() { 3292 scrollCount++; 3293 if (scrollCount >= 2) { 3294 revampCustomutils.userInteractionPollingBlock(); 3295 revampCustomutils.userInteractionQuizBlock(); 3296 window.removeEventListener('scroll', handleUserInteractions); 3297 } 3298 } 3299 window.addEventListener('scroll', handleUserInteractions); 3300} 3301 3302/* Listcomponent Refresh */ 3303$(document).ready(function () { 3304 3305 let clearTimer; 3306 3307 clearTimer = setInterval(() => { 3308 updateLatestNews(); 3309 3310 }, 60000); 3311 3312 document.addEventListener("visibilitychange", () => { 3313 3314 if (document.hidden) { 3315 clearInterval(clearTimer); 3316 } else { 3317 3318 updateLatestNews(); 3319 clearTimer = setInterval(() => { 3320 updateLatestNews(); 3321 3322 }, 60000); 3323 } 3324 }); 3325 3326 }); 3327 3328 3329 3330 function updateLatestNews(){ 3331 3332 let refreshComp, datahtml = "",componentpath; 3333 $(".refreshComponent").each(function () { 3334 3335 componentpath = $(this).data("refreshurl"); 3336 refreshComp = $(this); 3337 (function(refreshComp){ 3338 $.ajax({ 3339 url: componentpath, 3340 type: "GET", 3341 dataType: 'html', 3342 3343 success: function(data, status,xhr){ 3344 3345 if(refreshComp.find(".recommendationListContainer").index() != -1){ 3346 froomleTopnews(data,refreshComp.find(".recommendationListContainer")); 3347 initiateSlidersAndWidgets(); 3348 } 3349 else{ 3350 3351 datahtml = $(data); 3352 recallAdEmbed(refreshComp,datahtml); 3353 recallLiveUpdate(refreshComp,datahtml); 3354 refreshComp.replaceWith(datahtml); 3355 revampCustomutils.displayPublishDate(); 3356 initiateSlidersAndWidgets(); 3357 3358 } 3359 if (typeof addSaveItemsEventListeners === "function") { 3360 addSaveItemsEventListeners(); 3361 let savedData = JSON.parse(localStorage.getItem("savedItems") || initData); 3362 activateSavedArticlesOnLoad(savedData["addedIds"], "add"); 3363 } 3364 if( (refreshComp.find(".trending-block").index() != -1) && checkMCookie("premium_token") && typeof handleTrendingNumber === 'function'){ 3365 handleAdReplace(document.querySelector(".trending-block")); 3366 handleTrendingNumber(); 3367 } 3368 3369 }, 3370 error: function(request, status, error){ 3371 console.log(data) 3372 } 3373 }); 3374 3375 })(refreshComp); 3376 3377 }); 3378 3379 3380 } 3381 3382 function initiateSlidersAndWidgets(){ 3383 revampCustomutils.scoreBoardSlider(); 3384 utils.imageBlockSlider(); 3385 setTimeout(function(){getDeviceType();},200) 3386 } 3387 3388 function recallAdEmbed(theComponent,datahtml) { 3389 3390 let pElement; 3391 3392 if (theComponent.find('.list-native-embed').length > 0) { 3393 pElement = theComponent.find(".list-native-embed"); 3394 datahtml.find(".list-native-embed").replaceWith(pElement.get(0)); 3395 3396 } 3397 3398 } 3399 3400 function recallLiveUpdate(theComponent,datahtml){ 3401 let pElement; 3402 3403 if (theComponent.find('#mm-live-update-content-list').length > 0) { 3404 pElement = theComponent.find("#mm-live-update-content-list"); 3405 datahtml.find("#mm-live-update-content-list").replaceWith(pElement.get(0)); 3406 3407 } 3408 3409 } 3410 function mainNavHover(){ 3411 var timeout; 3412 $('.main-nav__li--with-mega-menu').on('mouseenter', function () { 3413 var $thisElement = $(this); 3414 3415 if (timeout != null) { clearTimeout(timeout); } 3416 3417 timeout = setTimeout(function () { 3418 $('.main-nav__li--with-mega-menu').removeClass("hoverActive"); 3419 $thisElement.addClass("hoverActive"); 3420 $(".lazyload").unveil(); 3421 }, 100); 3422 }); 3423 3424 $('.main-nav__li--with-mega-menu').on('mouseleave', function () { 3425 if (timeout != null) { 3426 clearTimeout(timeout); 3427 3428 timeout = null; 3429 setTimeout(function() { 3430 $('.main-nav__li--with-mega-menu').removeClass("hoverActive"); 3431 }, 100); 3432 } 3433 }); 3434 3435 } 3436 3437 function mmTab() { 3438 $('.cmp-mega-menu .cmp-tab-block').each(function () { 3439 let tabThis = $(this); 3440 if (!tabThis.find('.cmp-tab-block__nav-li').hasClass('active')) { 3441 tabThis.find('.cmp-tab-block__nav-li:first-child').addClass('active'); 3442 tabThis.find('.cmp-tab-block__item:first').addClass('active'); 3443 tabThis.find('.cmp-tab-block__item').hide(); 3444 tabThis.find('.cmp-tab-block__item:first').show(); 3445 } else { 3446 let index = tabThis.find('.cmp-tab-block__nav-li.active').index(); 3447 tabThis.find('.cmp-tab-block__item').hide(); 3448 tabThis.find('.cmp-tab-block__item').eq(index).show(); 3449 3450 } 3451 tabThis.find('.cmp-tab-block__nav-li a').on("click", function () { 3452 tabThis.find('.cmp-tab-block__nav-li').removeClass('active'); 3453 $(this).parent('.cmp-tab-block__nav-li').addClass('active'); 3454 tabThis.find('.cmp-tab-block__item').hide().removeClass('active'); 3455 let activeIndex = $(this).parent('.cmp-tab-block__nav-li').index(); 3456 tabThis.find('.cmp-tab-block__item').eq(activeIndex).fadeIn().addClass('active'); 3457 return false;
3458 }); 3459 }); 3460 } 3461revampCustomutils.storylistMore = function () { 3462 $('.cmp-story-list__control-btn--more-menu.cmp-history-custom-dropdown').off("click").on("click", function () { 3463 var $storylistMore = $(this).closest('.cmp-story-list__control-li').find(".cmp-story-list__drop-down"); 3464 if ($storylistMore.hasClass("active")) { 3465 $storylistMore.removeClass("active").fadeOut(100); 3466 } else { 3467 $(".cmp-story-list__drop-down").removeClass("active").fadeOut(100); 3468 $storylistMore.fadeIn(100).delay(100).addClass("active"); 3469 } 3470 }); 3471 $(document).on("click", function () { 3472 $(".cmp-story-list__drop-down").removeClass("active").fadeOut(100); 3473 }); 3474 $('.cmp-story-list__control-btn--more-menu, .cmp-story-list__drop-down').on("click", function (event) { 3475 event.stopPropagation(); 3476 }); 3477} 3478 3479$(document).ready(function () { 3480 mainNavHover(); 3481 $(".mm-col-blk-3 .experiencefragment .cmp-container>.ad-premiumuser,.right-component-slot .experiencefragment .cmp-container>.ad-premiumuser").each(function (i, e) { !$(e).height() ? $(e).closest(".experiencefragment").remove() : "" }); 3482 $(".article-body__aside .cmp-container>.ad-premiumuser").each(function (i, e) { !$(e).height() ? $(e).closest(".ad-premiumuser").remove() : "" }); 3483 3484 /* Listingtab tab switching */ 3485 $(".cmp-nav-tab .cmp-nav-tab-menu .cmp-nav-tab__ul a.cmp-nav-tab__a").click(function (e) { 3486 e.preventDefault(); 3487 $(".cmp-nav-tab__li").removeClass("active"); 3488 let tab = $(this).closest("li"); 3489 tab.addClass("active"); 3490 let category = tab.attr("id"); 3491 if (category) { 3492 category = `[aria-labelledby='${category}']`; 3493 $(".cmp-nav-tab__content .cmp-tabs__tabpanel").removeClass("cmp-tabs__tabpanel--active").filter(category).addClass("cmp-tabs__tabpanel--active"); 3494 if($('.cmp-story-list.cmp-story-list--slider').slick('refresh')){ 3495 $('.cmp-story-list.cmp-story-list--slider').on('afterChange', function(e, slick, currentSlide){ 3496 $(".lazyload").unveil(); 3497 }); 3498 } 3499 } 3500 }); 3501 3502}); 3503 3504//podcastlisting 3505 3506const podcastListing = () => { 3507 3508 const podcastShowcaseListing = document.getElementById("podcast-showcase-listing"); 3509 const podcastCarouselListing = document.getElementById("podcast-carousel-listing"); 3510 const podcastPrograms = document.getElementById("podcastlisting"); 3511 let liHTMLtoAppend = ""; 3512 if (podcastShowcaseListing) { 3513 const playlistData = getPodcastPlaylistJSON(podcastShowcaseListing); 3514 if(playlistData !== null){ 3515 liHTMLtoAppend = generatePodcastShowcaseHTML(playlistData,podcastPrograms); 3516 } 3517 podcastShowcaseListing.innerHTML = liHTMLtoAppend; 3518 } 3519 if(podcastCarouselListing){ 3520 $(".podcastlisting").find(".cmp-story-list.cmp-podcast-list--slider.slick-initialized").slick('unslick'); 3521 const playlistDataCarousel = getPodcastPlaylistJSON(podcastCarouselListing); 3522 if(playlistDataCarousel !== null){ 3523 liHTMLtoAppend = generatePodcastCarouselHTML(playlistDataCarousel ,podcastPrograms); 3524 } 3525 podcastCarouselListing.innerHTML = liHTMLtoAppend; 3526 slickPodcastCarousel(); 3527 3528 } 3529 3530 3531 3532 } 3533 3534 function slickPodcastCarousel(){ 3535 if($('.podcast-main-slider-block .cmp-podcast-list--slider').length > 0) { 3536 $('.podcast-main-slider-block .cmp-podcast-list--slider').each(function () { 3537 $(this).slick({ 3538 infinite: true, 3539 centerMode: true, 3540 variableWidth: true, 3541 centerPadding: '50px', 3542 slidesToShow: 1, 3543 dots: true, 3544 prevArrow: '<button class="slide-arrow prev-arrow"><i class="mm-icon mm-icon__arrow-right-lg"></i> </button>', 3545 nextArrow: '<button class="slide-arrow next-arrow"><i class="mm-icon mm-icon__arrow-left-lg"></i> </button>', 3546 responsive: [ 3547 3548 { 3549 breakpoint: 836, 3550 settings: { 3551 centerPadding: '60px' 3552 } 3553 }, 3554 { 3555 breakpoint: 576, 3556 settings: { 3557 centerPadding: '30px' 3558 } 3559 } 3560 ] 3561 }); 3562 }); 3563 } 3564 } 3565 3566function getPodcastPlaylistJSON(podcastElement) { 3567 const playlistId = podcastElement.getAttribute("data-playlist-id"); 3568 const maxcount = podcastElement.getAttribute("data-listingcount"); 3569 3570 try { 3571 const response = $.ajax({ 3572 type: "GET", 3573 url: `https://api.omny.fm/orgs/38abe477-df60-4cf0-bd9f-b1fe00d0bda4/playlists/` + playlistId + `/clips?pageSize=`+maxcount, 3574 async: false, 3575 }); 3576 3577 if (response.status != 200) { 3578 throw Error(response.statusText); 3579 } 3580 3581 const allClips = response.responseJSON.Clips; 3582 if(allClips.length > 0){ 3583 return allClips; 3584 }else{ 3585 return null; 3586 } 3587 3588 3589 } catch (err) { 3590 console.error(err); 3591 return null; 3592 } 3593} 3594 3595function generatePodcastCarouselHTML(clipsArray,podcastElement){
3596 let carouselLiHTML = ""; 3597 const programData=JSON.parse(podcastElement.getAttribute("data-program")); 3598 for (const element of clipsArray) { 3599 let program = programData[element.ProgramId]; 3600 let programPath = program ? program.programPath : ''; 3601 let programTitle = program ? program.programTitle : ''; 3602 carouselLiHTML += ` 3603 <li class="cmp-story-list__item"> 3604 <div class="cmp-story-list__item-in"> 3605 <div class="cmp-story-list__content"> 3606 <h2 class="cmp-story-list__title"> <a href="${programPath}#podcast_playlist" 3607 class="cmp-story-list__title-link" title="${element.Title}"> ${element.Title} </a> </h2> 3608 <div class="cmp-story-list__content-bottom"> 3609 <div class="cmp-story-list__content-btm-left"> 3610 3611 <a href="${programPath}" class="cmp-story-list__pretitle" title="${programTitle}">${programTitle}</a> 3612 </div> 3613 <div class="cmp-story-list__content-btm-right"> 3614 <ul class="cmp-story-list__controls"> 3615 <li class="cmp-story-list__control-li"> 3616 <button class="cmp-story-list__control-btn" title=""><i 3617 class="mm-icon mm-gray-icon mm-icon__bookmark-sm"></i></button> 3618 </li> 3619 </ul> 3620 </div> 3621 </div> 3622 3623 </div> 3624 <div class="cmp-story-list__image-block"> <a class="cmp-story-list__image-link" 3625 href="${programPath}#podcast_playlist" title="${element.Title}"> 3626 <div class="cmp-story-list__media-icon"><i 3627 class="mm-icon mm-white-icon mm-icon__play-btn-icon"></i></div> 3628 <img src="${element.ImageUrl}" alt="" class="cmp-story-list__img"> 3629 </a> </div> 3630 </div> 3631 </li> 3632 3633 `; 3634 3635 } 3636 3637 return carouselLiHTML; 3638} 3639 3640 3641function generatePodcastShowcaseHTML(clipsArray,podcastElement){ 3642 let showcaseLiHTML = ""; 3643 const programData=JSON.parse(podcastElement.getAttribute("data-program")); 3644 for (const element of clipsArray) { 3645 let program = programData[element.ProgramId]; 3646 let programPath = program ? program.programPath : ''; 3647 let programTitle = program ? program.programTitle : ''; 3648 showcaseLiHTML += ` 3649 <li class="cmp-story-list__item"> 3650 <div class="cmp-story-list__item-in"> 3651 <div class="cmp-story-list__content"> 3652 <h2 class="cmp-story-list__title"> <a href="${programPath}#podcast_playlist" class="cmp-story-list__title-link" title="${element.Title}"> 3653 ${element.Title} 3654 </a> </h2> 3655 <div class="cmp-story-list__content-bottom"> 3656 <div class="cmp-story-list__content-btm-left"> <a href="${programPath}" 3657 class="cmp-story-list__pretitle" title="${programTitle}">${programTitle}</a> </div> 3658 <div class="cmp-story-list__content-btm-right"> 3659 <ul class="cmp-story-list__controls"> 3660 <li class="cmp-story-list__control-li"> 3661 <button class="cmp-story-list__control-btn" title=""><i 3662 class="mm-icon mm-gray-icon mm-icon__bookmark-sm"></i></button> 3663 </li> 3664 </ul> 3665 </div> 3666 </div> 3667 </div> 3668 <div class="cmp-story-list__image-block"> <a class="cmp-story-list__image-link" href="${programPath}#podcast_playlist" 3669 title="${element.Title}"> 3670 <div class="cmp-story-list__media-icon"><i 3671 class="mm-icon mm-white-icon mm-icon__podcast"></i> </div> 3672 <img src="${element.ImageUrl}" 3673 alt="" class="cmp-story-list__img"> 3674 </a> </div> 3675 </div> 3676 </li> 3677 3678 `; 3679 } 3680 3681 return showcaseLiHTML; 3682} 3683 3684
3685 podcastListing(); 3686 3687$('.podcast-page-block .mm-btn.mm-btn--primary-outline').each(function() { 3688 let currentHref = $(this).attr('href'); 3689 // For MMO25-5855, It will Only append if href exists and doesn't already contain the fragment identifier 3690 if (currentHref && !currentHref.includes('#podcast_playlist')) { 3691 let newHref = currentHref + '#podcast_playlist'; 3692 $(this).attr('href', newHref); 3693 } 3694}); 3695const revampHeaderutils = {}; 3696 3697 3698const LOGIN_STATUS_COOKIE = 'mmu_ls'; 3699const USER_LOGGED_IN = 'userLoggedIn'; 3700const login_userName = 'mmu_pn'; 3701const signInButton = document.querySelector('.cmp-header__nav-button.sign-in-button'); 3702const signInValue = signInButton ? signInButton.dataset.utmsource : null; 3703 3704// signin 3705revampHeaderutils.signIn = function () { 3706 $('.sign-in-button').on("click", function (e) { 3707 e.preventDefault(); 3708 if(signInValue != null){ 3709 ssoIn(false, signInValue); 3710 } 3711 }); 3712} 3713 3714// cookies 3715revampHeaderutils.getCookieByName = function (cookieName) { 3716 const cookie = document.cookie; 3717 try { 3718 let cookieValue = cookie.split(cookieName + '=')[1].split(';')[0].replace(/\+/g, '%20'); 3719 return decodeURIComponent(cookieValue); 3720 } catch (e) { 3721 console.log('Error reading cookie'); 3722 } 3723} 3724 3725// username 3726revampHeaderutils.getUserName = function () { 3727 let userName = revampHeaderutils.getCookieByName(login_userName); 3728 if (userName) { 3729 const firstName = userName.trim().split(' ')[0]; 3730 $('.cmp-login-block__after-head').attr('title', firstName); 3731 $('.cmp-login-block__user-letter').text(decodeURIComponent(userName).trim()); 3732 $('.cmp-login-block__user-name').text(decodeURIComponent(userName).trim()); 3733 } 3734} 3735 3736// myaccount check 3737revampHeaderutils.myAccount = function () { 3738 if (revampHeaderutils.isLoggedIn()) { 3739 $(".cmp-login-block__before-login").hide(); 3740 $(".cmp-login-block__after-login").show(); 3741 } 3742} 3743 3744revampHeaderutils.isLoggedIn = function () { 3745 const loginStatus = revampHeaderutils.getCookieByName(LOGIN_STATUS_COOKIE); 3746 return loginStatus === USER_LOGGED_IN; 3747} 3748 3749revampHeaderutils.redirectToHome = function () { 3750 window.location.href = window.location.origin; 3751} 3752$(window).resize(function () {}); 3753 3754// revampHeaderutils.handleHeaderOnScroll = function () { 3755// let firstScrollTop = 0; 3756// let headerTopAds = ($('.cmp-header').length > 0) ? $('.cmp-header').offset().top : 0; 3757// let headerTopOuter = $('.cmp-header__top').outerHeight(true) + 3; 3758// let headerMainOuter = $('.cmp-header__main').outerHeight(true); 3759// let headerFullHeight = $('.cmp-header').outerHeight(true); 3760// let mainNavHeight = headerFullHeight + headerTopAds; 3761// let footerNavOuter = $('.cmp-bottom-nav').outerHeight(true); 3762 3763// $(window).scroll(function (event) { 3764// let scrollTop = $(this).scrollTop(); 3765 3766// if (scrollTop > firstScrollTop && scrollTop > mainNavHeight) { 3767// $('.cmp-header').addClass('sticky-header'); 3768// $('.cmp-header').removeClass('scroll-up'); 3769// $('body').addClass("header-gap").css({ 3770// "padding-top": headerFullHeight 3771// }); 3772// if ($(window).width() > 991) { 3773// $('.cmp-header').css({ 3774// "top": -(headerTopOuter + headerMainOuter) 3775// }); 3776// } else { 3777// $('.cmp-header').css({ 3778// "top": -(headerTopOuter + headerMainOuter) 3779// }); 3780// } 3781// } else { 3782// if (scrollTop + $(window).height() < $(document).height() && scrollTop > mainNavHeight) { 3783// $('.cmp-header').addClass('sticky-header'); 3784// $('body').addClass("header-gap").css({ 3785// "padding-top": headerFullHeight 3786// }); 3787// if ($(window).width() > 991) { 3788// $('.cmp-header').css({ 3789// "top": -(headerTopOuter) 3790// }); 3791// } else { 3792// $('.cmp-header').css({
3793// "top": -(headerTopOuter) 3794// }).addClass("scroll-up"); 3795// if ($('.cmp-bottom-nav').length > 0) { 3796// $('.cmp-bottom-nav').removeClass('scroll-down'); 3797// } 3798// } 3799// } else { 3800// $('.cmp-header').removeClass('scroll-up sticky-header'); 3801// $('.cmp-header').css({ 3802// "top": -(headerFullHeight) 3803// }); 3804// $('body').removeClass("header-gap").css({ 3805// "padding-top": 0 3806// }); 3807// } 3808 3809// } 3810// if (scrollTop > firstScrollTop && scrollTop > footerNavOuter && $(window).width() < 991 && $('.cmp-bottom-nav').length > 0) { 3811// $('.cmp-bottom-nav').addClass('scroll-down'); 3812// $('.quikreadfloating').addClass('scroll-down-fixed'); 3813// } else { 3814// if (scrollTop + $(window).height() < $(document).height() && $(window).width() < 991 && $('.cmp-bottom-nav').length > 0) { 3815// $('.cmp-bottom-nav').removeClass('scroll-down'); 3816// $('.quikreadfloating').removeClass('scroll-down-fixed'); 3817// } 3818// } 3819// firstScrollTop = scrollTop; 3820// }); 3821// } 3822 3823// revampHeaderutils.handleTopAdBlockResize = function () { 3824// let topAdvtBlock = $(".top-advt-block .advtBlock__content")[0]; 3825// let resizeObserver = new ResizeObserver(() => { 3826// revampHeaderutils.handleHeaderOnScroll(); 3827// if ($(".top-advt-block .advtBlock__content").height() > 48) { 3828// $('.cmp-header').removeClass("sticky-header"); 3829// $('body').removeClass("header-gap").css({ 3830// "padding-top": 0 3831// }); 3832// revampHeaderutils.handleHeaderOnScroll(); 3833// } 3834// }); 3835// if (topAdvtBlock) { 3836// resizeObserver.observe(topAdvtBlock); 3837// } 3838// } 3839 3840 3841//Sets Current Date 3842revampHeaderutils.currentDate = function () { 3843 let formattedDate = new Date().toLocaleDateString('en-us', { weekday:"long", year:"numeric", month:"short", day:"numeric"}) ; 3844 document.querySelectorAll(".current-date").forEach(e => e.innerHTML = formattedDate); 3845} 3846 3847let navData = localStorage.getItem("NAV_CONTENT"); 3848if (navData) { 3849 navData = JSON.parse(navData); 3850} 3851 3852// Function to check if the nav data is already saved in localstorage 3853const checkForNavDataInLocalStorage = (url) => { 3854 3855 if (navData) { 3856 let lastStored = navData.storedAt; 3857 let now = new Date().getTime(); 3858 if (now - lastStored > 15 * 60 * 1000 || !navData.data[url]) { 3859 localStorage.removeItem("NAV_CONTENT"); 3860 return null; 3861 } else { 3862 return navData.data[url]; 3863 } 3864 } 3865 return null; 3866} 3867 3868const saveNavDataToLocalStorage = (key, data) => { 3869 let navData = { 3870 storedAt: new Date().getTime(), 3871 data: data 3872 } 3873 localStorage.setItem(key, JSON.stringify(navData)); 3874} 3875 3876const updateNavContent = (ele, content) => { 3877 ele.innerHTML = content; 3878 // if (ele.querySelector(".podcastlisting")) { 3879 // podcastListing(ele, "podcastnavlisting"); 3880 // } 3881 let navImg = document.querySelectorAll('.navlist-load img:not([data-src]'); 3882 navImg.forEach(function (img) { 3883 let dataWebsrc = img.getAttribute('data-websrc'); 3884 img.setAttribute('data-src', dataWebsrc); 3885 }); 3886 // For saved icons event handler register and indicators setting 3887 if (typeof addSaveItemsEventListeners === "function") { 3888 addSaveItemsEventListeners(); 3889 let savedData = JSON.parse(localStorage.getItem("savedItems") || initData); 3890 activateSavedArticlesOnLoad(savedData["addedIds"], "add"); 3891 } 3892} 3893 3894let navContent = {}; 3895 3896const loadNavContent = (ele) => { 3897 const url = ele.getAttribute('data-navlist-url'); 3898 3899 return new Promise((resolve, reject) => { 3900 let navData = checkForNavDataInLocalStorage(url); 3901 try { 3902 if (navData) { 3903 updateNavContent(ele, navData); 3904 resolve(); 3905 return; 3906 } 3907 3908 fetch(url) 3909 .then(response => response.text()) 3910 .then(content => { 3911 updateNavContent(ele, content); 3912 navContent[url] = content; 3913 resolve(); 3914 }) 3915 .catch(error => {console.error('Error fetching content:', error); reject(error);}); 3916 } catch (error) { 3917 console.error('Unexpected error:', error); 3918 reject(error); 3919 } 3920 }); 3921 3922}; 3923 3924const fetchNavlistCont = () => { 3925 const screenSize = window.innerWidth || document.documentElement.clientWidth || document.body.clientWidth; 3926 const DELAY_LOADING_MS = 500; 3927 if (screenSize > 991) { 3928 const navLists = document.querySelectorAll('.navlist-load'); 3929 3930 setTimeout(() => { 3931 const promises = Array.from(navLists).map(navList => { 3932 return loadNavContent(navList); 3933 }); 3934 console.log("Promises:", promises); 3935 Promise.all(promises).then(() => { 3936 if (Object.keys(navContent).length > 0) { 3937 saveNavDataToLocalStorage("NAV_CONTENT", navContent); 3938 } 3939 }); 3940 }, DELAY_LOADING_MS); 3941 3942 } 3943}; 3944 3945document.addEventListener('DOMContentLoaded', fetchNavlistCont); 3946 3947revampHeaderutils.headerfixedNew = function () { 3948 let lastScrollTopHeader = 0; 3949 const $header = $('.cmp-header'); 3950 if ($header.length === 0) return; 3951 const $headerSecondrow = $('.cmp-header__main'); 3952 const $headerThirdrow = $('.main-nav-outer'); 3953 let headerHeight = $header.outerHeight(); 3954 let headerBottom = $header.offset().top + headerHeight; 3955 3956 function getSecondRowHeight() { 3957 return $headerSecondrow.outerHeight() - 0.5; 3958 } 3959 3960 $(window).on('scroll', function () { 3961 const scrollTopHeader = $(this).scrollTop(); 3962 const secondRowHeight = getSecondRowHeight(); 3963 3964 if (scrollTopHeader >= headerHeight) { 3965 if (scrollTopHeader > lastScrollTopHeader) { 3966 // Scrolling down 3967 $header.addClass('sticky-down').removeClass('sticky-up'); 3968 $headerThirdrow.css('transform', ''); 3969 3970 if ($('.cmp-bottom-nav').length > 0) { 3971 $('.cmp-bottom-nav').addClass('scroll-down'); 3972 } 3973 } else { 3974 // Scrolling up 3975 $header.addClass('sticky-down sticky-up'); 3976 $headerThirdrow.css('transform', 'translateY(' + secondRowHeight + 'px)'); 3977 3978 if ($('.cmp-bottom-nav').length > 0) { 3979 $('.cmp-bottom-nav').removeClass('scroll-down'); 3980 } 3981 } 3982 } 3983 3984 if (scrollTopHeader <= headerBottom) { 3985 // Reached top of header again 3986 $header.removeClass('sticky-down sticky-up'); 3987 $headerThirdrow.css('transform', ''); 3988 } 3989 3990 lastScrollTopHeader = scrollTopHeader; 3991 }); 3992 3993 $(window).on('resize', function () { 3994 headerHeight = $header.outerHeight(); 3995 headerBottom = $header.offset().top + headerHeight; 3996 }); 3997} 3998 3999revampHeaderutils.quikereadscrolling = function () { 4000 let lastScrollTopquickread = 0; 4001 $(window).scroll(function (event) { 4002 quikreadscrolled(); 4003 }); 4004 4005 function quikreadscrolled() { 4006 let stquikread = $(this).scrollTop(); 4007 if (stquikread > lastScrollTopquickread && stquikread > 10 && $(window).width() < 991 ) { 4008 $('.quikreadfloating').addClass('scroll-down-fixed'); 4009 } else if (stquikread + $(window).height() < $(document).height() && $(window).width() < 991 ) { 4010 $('.quikreadfloating').removeClass('scroll-down-fixed'); 4011 } 4012 lastScrollTopquickread = stquikread; 4013 } 4014} 4015 4016// Call functions when the document is ready 4017$(function () {
4018 revampHeaderutils.signIn(); 4019 revampHeaderutils.myAccount(); 4020 revampHeaderutils.getUserName(); 4021 // revampHeaderutils.handleHeaderOnScroll(); 4022 // revampHeaderutils.handleTopAdBlockResize(); 4023 revampHeaderutils.headerfixedNew(); 4024 revampHeaderutils.quikereadscrolling(); 4025 revampHeaderutils.currentDate(); 4026}); 4027const closeBtn = document.querySelector('.planexprStrip__Clse'); 4028 4029if (closeBtn) { 4030 closeBtn.addEventListener('click', function () { 4031 const strip = document.querySelector('.planexprStrip'); 4032 4033 if (!strip) return; 4034 4035 setTimeout(() => { 4036 strip.classList.add('hide'); // trigger slide animation 4037 }, 10); 4038 4039 setTimeout(() => { 4040 strip.remove(); 4041 }, 400); 4042 }); 4043} 4044 4045const mmlog_path = '/sso'; 4046const login_stat = 'mmu_ls'; 4047const login_un = 'mmu_pn'; 4048const last_rf_time = 'mmu_lsrfd'; 4049const rf_int = 'mmu_rfinv'; 4050const rf_Int_default = 1500000; 4051const cool_down_default = 180000; //3 minutes = 3 * 60 * 1000; 4052let rfTknTimer; 4053let sso_auth = { 4054 isLoggedIn: function() { 4055 let loginStatus = getCookieVal(login_stat); 4056 var loggedIn = false; 4057 if (loginStatus === 'userLoggedIn') { 4058 loggedIn = true; 4059 } 4060 return loggedIn; 4061 } 4062} 4063 4064function getCookieVal(v){ 4065 var r = document.cookie.match('(^|[^;]+)\\s*' + v + '\\s*=\\s*([^;]+)'); 4066 r = r ? r.pop(): undefined; 4067 return r 4068} 4069 4070function ssoIn(signUpFlag, utmsource) { 4071 let currLoc = encodeURIComponent(window.location.href); 4072 window.location.href = mmlog_path + "?a=in&pageURL=" + currLoc + "&signUpFlag=" + signUpFlag + "&utm_source=" + utmsource; 4073} 4074 4075function googleSsoIn(response){ 4076 if(response.credential){ 4077 let idToken = response.credential; 4078 let currLoc = encodeURIComponent(window.location.href); 4079 window.location.href = mmlog_path+"?a=goog&pageURL="+currLoc+"&token="+idToken; 4080 } 4081} 4082 4083function ssoOut(cl) { 4084 let currLoc; 4085 let randNo = Math.floor((Math.random() * 1000000) + 1); 4086 try{ 4087 if(window.sessionStorage["evolok:ev_profile"]!=undefined){ 4088 delete window.sessionStorage["evolok:ev_profile"]; 4089 } 4090 if(window.localStorage["evolok:ev_session"]!=undefined){ 4091 delete window.localStorage["evolok:ev_session"]; 4092 } 4093 }catch(err){} 4094 if(cl){ 4095 currLoc = encodeURIComponent(cl); 4096 }else{ 4097 currLoc = encodeURIComponent(window.location.href); 4098 } 4099 google.accounts.id.disableAutoSelect(); 4100 window.location.href = mmlog_path+"?a=out&pageURL="+currLoc+"&random="+randNo; 4101 localStorage.removeItem("savedItems"); // removed saveditems on logout. 4102 localStorage.removeItem("historyItems"); // removed history items on logout. 4103 localStorage.removeItem("obitVotedIds"); // removed Obituary Reacted items on logout. 4104 localStorage.removeItem("victoryVotedIds"); 4105} 4106 4107function rfAccessTkn() { 4108 if(rfTknTimer) { 4109 clearInterval(rfTknTimer); 4110 } 4111/* 4112 $.ajax({ 4113 type : "GET", 4114 url : mmlog_path, 4115 dataType : 'text', 4116 data : { 4117 a : 'rf' 4118 }, 4119 success : function(response) { 4120 if(response=='true') { 4121 setRfTknInt(); 4122 try{ 4123 if(!getCookieVal(login_un) || !getCookieVal('ev_ss')){ 4124 dataLayer.push({'event': 'mo-loginrefresh-fail'}) ; 4125 //location.reload(); 4126 } 4127 } catch (err) {console.log("err"+err)} 4128 } 4129 }, 4130 error : function(xhr, err) { 4131 console.log("err" + JSON.stringify(err)); 4132 } 4133 }); 4134 */ 4135} 4136 4137function setLoggedInView() { 4138 try { 4139 if (sso_auth.isLoggedIn()) { 4140 let userName = getCookieVal(login_un); 4141 if (userName) { 4142 $('.profile_name_txt').text(decodeURIComponent(userName).trim()); 4143 } 4144 $('.sign_in_button').removeClass("user-not-signed"); 4145 $('.sign_in_button').addClass('user-signed-in'); 4146 4147 $('.ml-login-icon-blk').removeClass('user-not-signed'); 4148 $('.ml-login-icon-blk').addClass('user-signed-in'); 4149 } else { 4150 4151 $('.sign_in_button').addClass("user-not-signed"); 4152 $('.sign_in_button').removeClass('user-signed-in'); 4153 4154 $('.ml-login-icon-blk').addClass('user-not-signed'); 4155 $('.ml-login-icon-blk').removeClass('user-signed-in'); 4156 4157 $('.profile_name_txt').text(''); 4158 } 4159 } catch (err) {} 4160} 4161 4162 4163function invokeRfTknReq() { 4164 let rfInt = getCookieVal(rf_int); 4165 let rfIntVal = 0; 4166 if(rfInt) { 4167 rfIntVal = parseInt(rfInt); 4168 } 4169 let lastRfTime = getCookieVal(last_rf_time); 4170 if(lastRfTime) { 4171 let lastRfTimeVal = parseInt(lastRfTime); 4172 let cTimeVal = 0; 4173 let cDate = new Date(); 4174 4175 let cTimeInMs = cDate.getTime(); 4176 if(cTimeInMs) { 4177 cTimeVal = parseInt(cTimeInMs); 4178 } 4179 4180 let timeDiff = cTimeVal - (lastRfTimeVal - 60000); 4181 if(timeDiff >= rfIntVal) { 4182 rfAccessTkn(); 4183 } else { 4184 rfIntVal = rfIntVal - timeDiff; 4185 } 4186 } 4187 4188 if(!rfIntVal) { 4189 rfIntVal = rf_Int_default; 4190 } 4191 4192 if(rfTknTimer) { 4193 clearInterval(rfTknTimer); 4194 } 4195 rfTknTimer = setInterval('rfAccessTkn()', rfIntVal); 4196} 4197 4198function setRfTknInt() { 4199 let rfInt = getCookieVal(rf_int); 4200 if(!rfInt) { 4201 rfInt = rf_Int_default; 4202 } 4203 rfTknTimer = setInterval('rfAccessTkn()', rfInt); 4204} 4205 4206 4207$(document).ready(function() { 4208 $(".sso-signout-button").on("click", function(e){ 4209 ssoOut(); 4210 }); 4211 4212 setLoggedInView(); 4213 4214 if(sso_auth.isLoggedIn()) { 4215 loadGoogleScript().then(() => googleOneTapLibraryLoad()); 4216 invokeRfTknReq(); 4217 }
4217 else if (typeof enablePrestitial === 'undefined' || !enablePrestitial) { 4218 loadGoogleScript() 4219 .then(() => googleOneTapLibraryLoad()) 4220 .then((val) => { 4221 if(val === 1){ 4222 invokeGoogleOneTap(); 4223 } 4224 }) 4225 .catch((error) => { 4226 console.error("Error loading Google One Tap:", error); 4227 }); 4228 } 4229 4230}); 4231 4232function loadGoogleScript() { 4233 return new Promise((resolve, reject) => { 4234 const script = document.createElement('script'); 4235 script.src = 'https://accounts.google.com/gsi/client'; 4236 script.onload = () => { 4237 console.log('Google script loaded.'); 4238 resolve(); 4239 }; 4240 script.onerror = () => reject(new Error('Failed to load Google script')); 4241 document.head.appendChild(script); 4242 }); 4243} 4244 4245function googleOneTapLibraryLoad() { 4246 return new Promise((resolve, reject) => { 4247 if(typeof googleClientId !== 'undefined'){ 4248 try { 4249 google.accounts.id.initialize({ 4250 client_id: googleClientId, 4251 cancel_on_tap_outside: false, 4252 itp_support: true, 4253 use_fedcm_for_prompt: true, 4254 callback: googleSsoIn, 4255 }); 4256 console.log('Google One Tap initialized.'); 4257 4258 } catch (error) { 4259 reject(error); 4260 } 4261 resolve(1); 4262 } 4263 else{ 4264 resolve(0); 4265 } 4266 4267 4268 }); 4269} 4270 4271// Function to invoke Google One Tap 4272function invokeGoogleOneTap() { 4273 const isMobileView = window.matchMedia("(max-width: 768px)").matches; // Check if the view is mobile 4274 if (isMobileView) { 4275 const targetElement = document.querySelector('.cmp-header__main'); 4276 if (targetElement) { 4277 const observer = new IntersectionObserver((entries) => { 4278 entries.forEach(entry => { 4279 if (!entry.isIntersecting && entry.boundingClientRect.top < 0) { 4280 google.accounts.id.prompt(); // excluded setExpirationTime() 4281 observer.disconnect(); 4282 } 4283 }); 4284 }, { rootMargin: '0px', threshold: [1] }); 4285 observer.observe(targetElement); 4286 } else { 4287 console.error("Element with class 'cmp-header__main' not found."); 4288 } 4289 } else { 4290 google.accounts.id.prompt(); 4291 } 4292} 4293 4294// Function to get a cookie by name 4295function getCookie(cookieName) { 4296 var name = cookieName + "="; 4297 var decodedCookie = decodeURIComponent(document.cookie);
4297 // Decode the cookie string and split it into individual cookies 4298 var cookieArray = decodedCookie.split(';'); 4299 for (const cookie of cookieArray) { 4300 // Trim leading and trailing spaces from the cookie string 4301 var trimmedCookie = cookie.trim(); 4302 // Check if the cookie name matches the target name 4303 if (trimmedCookie.startsWith(name)) { 4304 return trimmedCookie.substring(name.length); 4305 } 4306 } 4307 return null; 4308} 4309 4310// Function to set the expiration time for 'g_state' cookie 4311function setExpirationTime() { 4312 var now = new Date(); 4313 var time = now.getTime(); 4314 var expireTime = time + cool_down_default; // 3 minutes in the future 4315 now.setTime(expireTime); 4316 var gStateValue = getCookie("g_state"); 4317 if (gStateValue !== null) { 4318 document.cookie = 'g_state='+gStateValue+';path=/;expires='+now.toUTCString(); //Set the updated expiration time to g_state cookie 4319 } else { 4320 console.log("Cookie 'g_state' not found."); 4321 } 4322} 4323/* function to initiate google subscription Integration */ 4324function loadSwgScript() { 4325 return new Promise((resolve, reject) => { 4326 const script = document.createElement('script'); 4327 script.src = 'https://news.google.com/swg/js/v1/swg.js'; 4328 script.async = true; 4329 script.type = 'application/javascript'; 4330 script.setAttribute('subscriptions-control', 'manual'); 4331 4332 script.onload = () => { 4333 resolve(); 4334 }; 4335 4336 script.onerror = () => reject(new Error('Failed to load SWG script')); 4337 document.head.appendChild(script); 4338 }); 4339} 4340 4341function initiateGoogleSubscription(){ 4342 let ppid = getCookie("ev_guid"); 4343 let isGoogleLinked = getCookie("ev_gsubscription"); 4344 let isPremium = getCookie("premium_user"); 4345 if (isPremium && (isGoogleLinked === "false" && ppid)) { 4346 getReaderFromGoogle(ppid); 4347 } 4348} 4349 4350function linkSubscription(ppid) { 4351 self.SWG.push(async (subscriptions) => { 4352 try { 4353 const result = await subscriptions.linkSubscription({ 4354 publisherProvidedId: ppid, 4355 }) 4356 console.log(result); 4357 } catch(e) { 4358 console.log(e) 4359 } 4360 }) 4361} 4362function getReaderFromGoogle(ppid){ 4363 let keyfile = getCookie("g_subscriptionKey"); 4364 $.ajax({ 4365 type: "GET", 4366 url: `https://readerrevenuesubscriptionlinking.googleapis.com/v1/publications/CAowyeKNCw/readers/${ppid}`, 4367 headers: { 4368 "Authorization": `Bearer ${keyfile}`, 4369 }, 4370 success: function (data) { 4371 console.log("Reader exists:", data); 4372 }, 4373 error: function (xhr, status, error) { 4374 if (xhr.status === 404) { 4375 linkSubscription(ppid); 4376 } else { 4377 console.error("Error:", error, xhr.responseText); 4378 } 4379 }, 4380 }); 4381} 4382 4383document.addEventListener('DOMContentLoaded', async function () { 4384 await loadSwgScript(); 4385 4386 self.SWG = self.SWG || []; 4387 self.SWG.push((subscriptions) => { 4388 subscriptions.init("CAowyeKNCw"); 4389 }); 4390 initiateGoogleSubscription(); 4391}); 4392 4393document.addEventListener('DOMContentLoaded', function () { 4394 const loginErrorRedirectUrl = new URL(window.location.href); 4395 const utmSource = loginErrorRedirectUrl.searchParams.get('utm_source'); 4396 4397 if (utmSource && utmSource.startsWith('loginError_')) { 4398 const [, errorCode] = utmSource.split('_'); 4399 4400 window.adobeDataLayer = window.adobeDataLayer || []; 4401 4402 window.adobeDataLayer.push({ 4403 event: 'unexpected_sso_redirect', 4404 current_page: window.location.pathname, 4405 redirect_reason: 'loginError', 4406 error_code: errorCode || '', 4407 is_user_logged_in: "false", 4408 subscriber_id: '' 4409 }); 4410 4411 loginErrorRedirectUrl.searchParams.delete('utm_source'); 4412 window.history.replaceState({}, '', loginErrorRedirectUrl.toString()); 4413 } 4414}); 4415 4416 4417const initData = JSON.stringify({ "updated": 0,"deleteMeta": {"counter":0,"timestamp":0,"isBatch":false,"batchTimestamp":0},"addMeta": {"counter":0,"timestamp":0,"isBatch":false,"batchTimestamp":0}, "source": "", "isLoggedIn": "", "addedIds": [], "articles": {}, "deletedIds": [] }); 4418const eventSelector = {"article":"article-save-btn--saved","list":"cmp-story-list__control-btn--saved","dropdown":"cmp-story-list___dropdown-btn--saved"}; 4419 4420const mainApiDomain = (typeof apiDomain !== "undefined" && apiDomain) ? apiDomain : "https://api.manoramaonline.com"; 4421const mainImgDomain = (typeof imgDomain !== "undefined" && imgDomain) ? imgDomain : "https://img-mm.manoramaonline.com"; 4422 4423/* Initial entry point. populate listing, setup event listeners and update with api calls */ 4424document.addEventListener("DOMContentLoaded" ,async function () { 4425 4426 let savedData = JSON.parse(localStorage.getItem("savedItems") || initData); 4427 let pendingArticle = localStorage.getItem("pendingSavedArticle"); 4428 if (pendingArticle && revampHeaderutils.isLoggedIn()) { 4429 4430 pendingArticle = JSON.parse(pendingArticle); 4431 4432 let articleData = pendingArticle.articleData; 4433 let articleId = articleData.id; 4434 4435 if (!savedData["addedIds"].includes(articleId)) { 4436 4437 savedData["source"] = "local"; 4438 savedData["updated"] = Date.now(); 4439 savedData["addedIds"].push(articleId); 4440 4441 savedData["articles"] = { 4442 [articleId]: articleData, 4443 ...savedData["articles"] 4444 }; 4445 4446 activateSavedArticlesOnLoad([articleId], "add"); 4447 4448 savedData = await addAndDeleteUpdateToAPI( 4449 savedData, 4450 articleId, 4451 true 4452 ); 4453 4454 localStorage.setItem( 4455 "savedItems", 4456 JSON.stringify(savedData) 4457 ); 4458 } 4459 4460 localStorage.removeItem("pendingSavedArticle"); 4461 } 4462 4463 let diffTime = Date.now() - savedData["updated"]; 4464 let fiveMins = 5 * 60 * 1000; 4465 if (diffTime > fiveMins && savedData["source"] !== "local" && !savedData["deleteMeta"]["isBatch"] && !savedData["addMeta"]["isBatch"]) { 4466 let apiData = await getSavedItems(); 4467 if (apiData !== 0) { 4468 savedData = processApiRequestData(apiData) 4469 savedData["updated"] = apiData["updatedOn"] || Date.now();
4470 savedData["source"] = "api"; 4471 localStorage.setItem("savedItems", JSON.stringify(savedData)); 4472 } 4473 } 4474 4475 savedData = JSON.parse(localStorage.getItem("savedItems") || initData); 4476 4477 populateSavedListing(savedData); 4478 4479 addSaveItemsEventListeners(); 4480 4481 if (!revampHeaderutils.isLoggedIn()) { 4482 localStorage.removeItem("savedItems"); 4483 return; 4484 } 4485 4486 savedData = await batchUpdateItems(savedData,true); 4487 4488 activateSavedArticlesOnLoad(savedData["addedIds"],"add"); 4489 4490}); 4491 4492/* Setup events listeners : Saved onlick and remove all button listeners */ 4493const addSaveItemsEventListeners = () =>{ 4494 4495 /* Delete listener for remove all button */ 4496 $(".saved-items__remove-btn").off("click").on("click",async function(){ 4497 let localStorageData = localStorage.getItem("savedItems") || initData; 4498 let savedData = JSON.parse(localStorageData); 4499 let addedIds = savedData["addedIds"]; 4500 let clonedAddedIds = JSON.parse(JSON.stringify(savedData["addedIds"])); // deep clone for an unaffected array for looping 4501 let deletedIds = savedData["deletedIds"]; 4502 if(addedIds.length > 0){ 4503 clonedAddedIds.forEach(articleId => { 4504 let dIdx = deletedIds.indexOf(articleId); 4505 if(dIdx === -1){ 4506 deletedIds.push(articleId); 4507 } 4508 let idx = addedIds.indexOf(articleId); 4509 if(idx !== -1){ 4510 addedIds.splice(idx,1); 4511 } 4512 delete savedData["articles"][articleId]; 4513 }); 4514 let forceTimeStamp = Date.now() - (2 * 60 * 1000); // force an earlier timestamp for removeall 4515 savedData["addedIds"] = []; 4516 savedData["deletedIds"] = deletedIds; 4517 savedData["deleteMeta"]["isBatch"] = true; 4518 savedData["deleteMeta"]["batchTimestamp"] = forceTimeStamp; 4519 4520 activateSavedArticlesOnLoad(savedData["deletedIds"],"remove"); 4521 $(".story-col-list-section.story-col-list-section--saved").css("display","none"); 4522 $(".saved-items__remove-btn").css("display","none"); 4523 $(".story-sort").css("display","none"); 4524 $(".list-noresult").css("display","block"); 4525 savedData = await batchUpdateItems(savedData,true); 4526 localStorage.setItem("savedItems", JSON.stringify(savedData)); 4527 } 4528 }); 4529 4530 /* On click listener for listing saved button */ 4531 $(".cmp-story-list__control-btn.cmp-save__btn,.cmp-story-list___dropdown-btn.cmp-save__btn").off("click").on("click", async function () { 4532 let listItem = $(this).closest(".cmp-story-list__item"); 4533 let titleLink = listItem.find(".cmp-story-list__title-link"); 4534 let articleId = listItem.find(".cmp-story-list__item-in").attr("data-itemid"); 4535 let articleLink = titleLink.attr("href"); 4536 let articleTitle = titleLink.attr("title"); 4537 let isPremium = listItem.find(".cmp-story-list__premium-icon").length; 4538 let hasVideoIcon = listItem.find(".mm-icon__play-sharp").length; 4539 let hasAudioIcon = listItem.find(".mm-icon__podcast").length; 4540 let stampLabel = listItem.find(".cmp-stamp-label").text().trim(); 4541 let liveLabel = listItem.find(".cmp-live-label").text().trim(); 4542 let imgEle = listItem.find(".cmp-story-list__img"); 4543 let videoBlock = listItem.find(".cmp-story-list__video.cmp-video-block"); 4544 let dataImgSrc = videoBlock?.data("imgSrc"); 4545 let articleImg = "" 4546 let squareImg = "" 4547 if (typeof dataImgSrc != 'undefined' && dataImgSrc.length > 0) { 4548 articleImg = mainImgDomain + dataImgSrc; 4549 squareImg = getSquareImg(articleImg); 4550 } else { 4551 articleImg = imgEle.attr("src")?.split("?")[0]; 4552 squareImg = getSquareImg(imgEle.attr("data-mobsrc") || imgEle.attr("src")); 4553 } 4554 4555 let sectionTitle = listItem.find(".cmp-story-list__pretitle").attr("title"); 4556 let sectionLink = listItem.find(".cmp-story-list__pretitle").attr("href"); 4557 let articleData = { "id": articleId, "sectionTitle": sectionTitle, "sectionLink": sectionLink, "title": articleTitle, "link": articleLink, "img": articleImg, "squareImg" : squareImg, "isPremium": isPremium, "stampLabel": stampLabel, "liveLabel": liveLabel, "hasVideoIcon": hasVideoIcon, "hasAudioIcon": hasAudioIcon }; 4558 let selector = "list"; 4559 if($(this).hasClass("cmp-story-list___dropdown-btn.cmp-save__btn")){ 4560 selector = "dropdown"; 4561 } 4562 await handleEventArticleData($(this),articleData,selector); 4563 }); 4564 4565 $(".article-header__action-block-li .article-save-btn").off("
4565click").on("click", async function () { 4566 if(typeof pageDl === 'undefined'){ 4567 return; 4568 } 4569 let pageData = JSON.parse(JSON.stringify(pageDl)); 4570 let articleId = pageData.articleId; 4571 let articleLink = window.location.href; 4572 let articleTitle = pageData.headline; 4573 let articleImg = $(".cmp-story-figure__web-image img").attr("src")?.split("?")[0] || $('meta[property="og:image"]').attr('content') || ""; 4574 let squareImg = getSquareImg(articleImg); 4575 let sectionTitle = pageData.sectionName; 4576 let sectionLink = $(".cmp-sectionpage-header__title a").attr("href")||""; 4577 let isPremium = pageData.articleType === "premium" ? 1 : 0; 4578 let stampLabel = $(".article-header .cmp-stamp-label").text().trim(); 4579 let liveLabel = $(".article-header .cmp-live-label").text().trim(); 4580 let hasVideoIcon = (pageData.ytVideoCount > 0 || pageData.bcVideoCount > 0) ? 1 : 0; 4581 let hasAudioIcon = 0; // WIP 4582 let articleData = { "id": articleId, "sectionTitle": sectionTitle, "sectionLink": sectionLink, "title": articleTitle, "link": articleLink, "img": articleImg, "squareImg" : squareImg, "isPremium": isPremium, "stampLabel": stampLabel, "liveLabel": liveLabel, "hasVideoIcon": hasVideoIcon, "hasAudioIcon": hasAudioIcon }; 4583 await handleEventArticleData($(this),articleData,"article"); 4584 }); 4585 4586} 4587 4588/** Article Data handler function: OnEvent */ 4589const handleEventArticleData = async (thisObj,articleData,selector) => { 4590 return new Promise(async(resolve, reject) => { 4591 let localStorageData = localStorage.getItem("savedItems") || initData; 4592 let isAdded = true; 4593 4594 let maxSavedItems = $('.cmp-modal-box.cmp-modal-box--save-article').attr("data-maxitems") || 20; 4595 4596 let articleId = articleData["id"]; 4597 if(!articleId){ 4598 return resolve(); 4599 } 4600 let isLoggedIn = revampHeaderutils.isLoggedIn(); 4601 if (!isLoggedIn) { 4602 localStorage.setItem("pendingSavedArticle", JSON.stringify({ 4603 articleData, 4604 selector 4605 })); 4606 ssoIn(false, signInValue); 4607 return resolve(); 4608 } 4609 let savedData = JSON.parse(localStorageData); 4610 if (savedData["addedIds"].length >= parseInt(maxSavedItems)) { 4611 if(!thisObj.hasClass(eventSelector[selector])){ 4612 console.log("Limit reached"); 4613 $(".cmp-modal-box.cmp-modal-box--save-article").css('display','block'); 4614 return resolve(); 4615 } 4616 } 4617 let dIdx = savedData["deletedIds"].indexOf(articleId); 4618 let idx = savedData["addedIds"].indexOf(articleId); 4619 if (thisObj.hasClass(eventSelector[selector])) { 4620 if (dIdx === -1) { 4621 savedData["deletedIds"].push(articleId); 4622 } 4623 if (idx !== -1) { 4624 savedData["addedIds"].splice(idx, 1); 4625 } 4626 delete savedData["articles"][articleId]; 4627 isAdded = false; 4628 activateSavedArticlesOnLoad([articleId],"remove"); 4629 } else { 4630 if (dIdx !== -1) { 4631 savedData["deletedIds"].splice(dIdx, 1); 4632 } 4633 if (idx === -1) { 4634 savedData["source"] = "local"; 4635 savedData["addedIds"].push(articleId); 4636 savedData["articles"]={[articleId] : articleData,...savedData["articles"]}; 4637 } 4638 activateSavedArticlesOnLoad([articleId],"add"); 4639 } 4640 savedData["isLoggedIn"] = isLoggedIn; 4641 localStorage.setItem("savedItems", JSON.stringify(savedData)); 4642 4643 savedData = await addAndDeleteUpdateToAPI(savedData, articleId, isAdded); 4644 4645 let savedContainerMain = $(".story-col-list-section.story-col-list-section--saved"); 4646 if(savedContainerMain.length){ 4647 populateSavedListing(savedData); 4648 activateSavedArticlesOnLoad(savedData["addedIds"],"add"); 4649 addSaveItemsEventListeners(); 4650 } 4651 return resolve(); 4652 }); 4653} 4654 4655const getCleanSectionUrl = (url) =>{ 4656 if(url){ 4657 let urlArray = url.split("/"); 4658 if(urlArray.length > 4){ 4659 urlArray.splice(1,3); 4660 } 4661 let sectionLink = urlArray.join("/") + ".html"; 4662 return sectionLink; 4663 } 4664 return ""; 4665} 4666 4667const getSquareImg = (url) => {
4668 let urlParams = new URLSearchParams(url); 4669 url = url.split("?")[0]; 4670 let rendition = "&w=100&h=100"; 4671 if (urlParams.has("crop")) { 4672 url = `${url}?crop=${urlParams.get("crop")}${rendition}`; 4673 } else { 4674 url = `${url}?crop=fc${rendition}` 4675 } 4676 return url; 4677} 4678 4679const getPublicUrl = (url) => { 4680 if (!url) { 4681 return ""; 4682 } 4683 url = url 4684 .replace(/^https?:\/\/[^\/]+/, "") 4685 .replace(/^\/content\/mm\/[^\/]+/, ""); 4686 return url.endsWith(".html") ? url : `${url}.html`; 4687} 4688 4689/* Helper function to process data coming from api */ 4690const processApiRequestData = (apiData) => { 4691 let savedData = JSON.parse(initData); 4692 4693 if(!apiData["data"] || apiData["data"]["contents"].length === 0){ 4694 return savedData; 4695 } 4696 4697 for (let data of apiData["data"]["contents"]) { 4698 let articleId = data.id; 4699 let articleLink = getPublicUrl(data.contentTitle.url); 4700 let articleTitle = data.contentTitle.title; 4701 const imgs = data.contentImgs && data.contentImgs.length > 0 4702 ? data.contentImgs 4703 : (data.thumbnailImgs || []); 4704 let articleImg = `${mainImgDomain}${imgs.filter(img => img.aspectratio === "image")[0]?.url || ''}`; 4705 let squareImg = getSquareImg(`${mainImgDomain}${imgs.filter(img => img.aspectratio === "square")[0]?.url || imgs.filter(img => img.aspectratio === "image")[0]?.url || ''}`); 4706 let sectionTitle = data.subSection.title; 4707 let sectionLink = getCleanSectionUrl(data.subSection.url); 4708 let isPremium = data.isPremium || false; 4709 let liveLabel = data.webExclusive || ''; 4710 let hasVideoIcon = data.icon === "video" ? 1 : 0; 4711 let hasAudioIcon = data.icon === "audio" ? 1 : 0; 4712 let stampLabel = data.configurableLabel || ''; 4713 let articleData = { "id": articleId, "sectionTitle": sectionTitle, "sectionLink": sectionLink, "title": articleTitle, "link": articleLink, "img": articleImg, "squareImg" : squareImg, "isPremium": isPremium, "stampLabel": stampLabel, "liveLabel": liveLabel, "hasVideoIcon": hasVideoIcon, "hasAudioIcon": hasAudioIcon }; 4714 savedData["articles"][articleId] = articleData; 4715 savedData["addedIds"].push(articleId); 4716 } 4717 return savedData; 4718} 4719 4720/* Helper function to mark or remove saved button's activated state */ 4721const activateSavedArticlesOnLoad = (idArray,op) => { 4722 /* Listing saved icon activate/deactivate */ 4723 for (let id of idArray) { 4724 $(`[data-itemid=${id}]`).each(function () { 4725 let savedBtn = $(this).closest(".cmp-story-list__item").find(".cmp-story-list__control-btn.cmp-save__btn,.cmp-story-list___dropdown-btn.cmp-save__btn"); 4726 let listSaveClass = eventSelector["list"]; 4727 let dropdownSaveClass = eventSelector["dropdown"]; 4728 if(op === "add"){ 4729 if(!savedBtn.hasClass(listSaveClass)){ 4730 savedBtn.addClass(listSaveClass); 4731 } 4732 if(!savedBtn.hasClass(dropdownSaveClass)){ 4733 savedBtn.addClass(dropdownSaveClass); 4734 } 4735 } 4736 if(op === "remove"){ 4737 if(savedBtn.hasClass(listSaveClass)){ 4738 savedBtn.removeClass(listSaveClass); 4739 } 4740 if(savedBtn.hasClass(dropdownSaveClass)){ 4741 savedBtn.removeClass(dropdownSaveClass); 4742 } 4743 } 4744 }); 4745 } 4746 4747 /* Article saved icon activate/deactivate */ 4748 let isArticle = (typeof pageDl !== 'undefined') && pageDl["pageType"] === "article" && idArray.includes(pageDl["articleId"]); 4749 if (!isArticle) { 4750 return; 4751 } 4752 let articleSaveClass = eventSelector["article"]; 4753 let articleSaveBtn = $(".article-save-btn"); 4754 if (op === "add") { 4755 if (!articleSaveBtn.hasClass(articleSaveClass)) { 4756 articleSaveBtn.addClass(articleSaveClass); 4757 } 4758 } 4759 if (op === "remove") { 4760 if (articleSaveBtn.hasClass(articleSaveClass)) { 4761 articleSaveBtn.removeClass(articleSaveClass); 4762 } 4763 } 4764} 4765 4766/** Batch update function which takes care of the batch POST update. 4767 * function also has an onload parameter to be called for initial pageload */ 4768const batchUpdateItems = async (savedData, onLoad = false, isAdded = false, isDeleted = false) => { 4769 let deleteMeta = savedData["deleteMeta"]; 4770 let addMeta = savedData["addMeta"]; 4771 let isAddBatchUpdate = false;
4772 let isDeleteBatchUpdate = false; 4773 let minDiff = 1 * 60 * 1000; 4774 4775 4776 if ((addMeta["isBatch"] && onLoad) || isAdded) { 4777 4778 if (addMeta["batchTimestamp"] === 0) { 4779 addMeta["batchTimestamp"] = Date.now(); 4780 addMeta["isBatch"] = true; 4781 } 4782 let addBatchDiff = Date.now() - addMeta["batchTimestamp"]; 4783 4784 if (addBatchDiff > minDiff) { 4785 isAddBatchUpdate = true; 4786 } 4787 } 4788 4789 if((deleteMeta["isBatch"] && onLoad) || isDeleted){ 4790 4791 if (deleteMeta["batchTimestamp"] === 0) { 4792 deleteMeta["batchTimestamp"] = Date.now(); 4793 deleteMeta["isBatch"] = true; 4794 } 4795 4796 let deleteBatchDiff = Date.now() - deleteMeta["batchTimestamp"]; 4797 4798 if (deleteBatchDiff > minDiff) { 4799 isDeleteBatchUpdate = true; 4800 } 4801 } 4802 const promises = []; 4803 if (isDeleteBatchUpdate) { 4804 promises.push(deleteSavedItems(savedData["deletedIds"]).then((status) => { 4805 if (status === 1) { 4806 savedData["deletedIds"] = []; 4807 deleteMeta["batchTimestamp"] = 0; 4808 deleteMeta["isBatch"] = false; 4809 } 4810 }).catch(error => { 4811 console.error("Error during delete batch update:", error); 4812 })); 4813 } 4814 4815 if (isAddBatchUpdate) { 4816 promises.push(addSavedItems(savedData["addedIds"]).then((status) => { 4817 if (status === 1) { 4818 savedData["source"] = ""; 4819 addMeta["batchTimestamp"] = 0; 4820 addMeta["isBatch"] = false; 4821 } 4822 }).catch(error => { 4823 console.error("Error during add batch update:", error); 4824 })); 4825 } 4826 4827 await Promise.all(promises); 4828 4829 savedData["deleteMeta"] = deleteMeta; 4830 savedData["addMeta"] = addMeta; 4831 return savedData; 4832} 4833 4834/* Helper function which does add and delete functionality based on a counter which resets after every minute. 4835 if the number of articles in counter is less than 5 , the article is posted immediately. if the counter exceeds 4836 5, we are maintaining a queue to then batch update all the articles after a minute */ 4837const addAndDeleteUpdateToAPI = async (savedData, articleId, isAdded) => { 4838 let deleteMeta = savedData["deleteMeta"]; 4839 let addMeta = savedData["addMeta"]; 4840 let minDiff = 1 * 60 * 1000; 4841 let dIdx = savedData["deletedIds"].indexOf(articleId); 4842 4843 if (!isAdded) { 4844 deleteMeta["counter"] += 1; 4845 if(deleteMeta["timestamp"] === 0){ 4846 deleteMeta["timestamp"] = Date.now(); 4847 } 4848 4849 let diffTime = Date.now() - deleteMeta["timestamp"]; 4850 4851 if (diffTime > minDiff && !deleteMeta["isBatch"]) { 4852 deleteMeta["counter"] = 1; 4853 deleteMeta["timestamp"] = Date.now(); 4854 let status = await deleteSavedItems([articleId]); 4855 if(status === 1){ 4856 if (dIdx !== -1) { 4857 savedData["deletedIds"].splice(dIdx, 1); 4858 } 4859 } 4860 } else { 4861 if (deleteMeta["counter"] <= 5) { 4862 let status = await deleteSavedItems([articleId]); 4863 if(status === 1){ 4864 if (dIdx !== -1) { 4865 savedData["deletedIds"].splice(dIdx, 1); 4866 } 4867 } 4868 } else { 4869 savedData = await batchUpdateItems(savedData, false, false, true); 4870 } 4871 } 4872 4873 savedData["deleteMeta"] = deleteMeta; 4874 4875 } else { 4876 addMeta["counter"] += 1; 4877 if(addMeta["timestamp"] === 0){ 4878 addMeta["timestamp"] = Date.now(); 4879 } 4880 4881 let diffTime = Date.now() - addMeta["timestamp"]; 4882 4883 if (diffTime > minDiff && !addMeta["isBatch"]) { 4884 addMeta["counter"] = 1; 4885 addMeta["timestamp"] = Date.now(); 4886 let status = await addSavedItems([articleId]); 4887 if (status === 1) { 4888 savedData["source"] = ""; 4889 } 4890 } else { 4891 if (addMeta["counter"] <= 5) { 4892 let status = await addSavedItems([articleId]); 4893 if (status === 1) { 4894 savedData["source"] = ""; 4895 } 4896 } else { 4897 savedData = await batchUpdateItems(savedData, false, true, false); 4898 } 4899 } 4900 4901 savedData["addMeta"] = addMeta; 4902 } 4903 4904 localStorage.setItem("savedItems", JSON.stringify(savedData)); 4905 return savedData; 4906} 4907 4908/* Helper function to get token and uid for api calls */ 4909const getTokenAndUId = () => { 4910 let token = getCookieVal("mmu_id_token"); 4911 if(!token){ 4912 return [null,null] 4913 } 4914 let base64Url = token.split('.')[1]; 4915 let base64 = base64Url.replace(/-/g, '+').replace(/_/g, '/'); 4916 let jsonPayload = decodeURIComponent(window.atob(base64).split('').map(function (c) {
4917 return '%' + ('00' + c.charCodeAt(0).toString(16)).slice(-2); 4918 }).join('')); 4919 let payLoad = JSON.parse(jsonPayload); 4920 let uId = payLoad["sub"]; 4921 let id_token = payLoad["id_token"]; 4922 return [id_token, uId]; 4923 4924} 4925 4926/* API Function: GET : get all the saved articles from API */ 4927const getSavedItems = async () => { 4928 const [token, uId] = getTokenAndUId(); 4929 return new Promise((resolve, reject) => { 4930 if (token === null) { 4931 return resolve(0); 4932 } 4933 4934 let fetchLimit = $(".cmp-modal-box.cmp-modal-box--save-article").attr("data-maxitems") || 20; 4935 4936 $.ajax({ 4937 url: `${mainApiDomain}/profile/read/bookmark`, 4938 type: "GET", 4939 dataType: 'json', 4940 data: { "uId": uId , "limit" : fetchLimit }, 4941 headers: { 4942 Authorization: 'Bearer ' + token, 4943 }, 4944 success: function (res) { 4945 console.log(res); 4946 return resolve(res); 4947 }, 4948 error: function (err) { 4949 console.log('Error:', err); 4950 return resolve(0); 4951 } 4952 }) 4953 }); 4954}; 4955 4956/* API Function: POST : post new article ids to API */ 4957const addSavedItems = async (articleIds) => { 4958 const [token, uId] = getTokenAndUId(); 4959 return new Promise((resolve, reject) => { 4960 if (token === null) { 4961 return resolve(0); 4962 } 4963 4964 $.ajax({ 4965 url: `${mainApiDomain}/profile/save/bookmark`, 4966 type: "POST", 4967 dataType: 'json', 4968 data: JSON.stringify({ "uId": uId, "aId": articleIds }), 4969 headers: { 4970 Authorization: 'Bearer ' + token, 4971 }, 4972 success: function (res) { 4973 console.log("success"); 4974 return resolve(1); 4975 }, 4976 error: function (err) { 4977 console.log('Response Text:', err); 4978 return resolve(0); 4979 } 4980 }) 4981 }); 4982}; 4983 4984/* API Function: POST : delete articles from API based on articleids */ 4985const deleteSavedItems = async (articleIds) => { 4986 const [token, uId] = getTokenAndUId(); 4987 return new Promise((resolve, reject) => { 4988 if (token === null) { 4989 return resolve(0); 4990 } 4991 4992 $.ajax({ 4993 url: `${mainApiDomain}/profile/delete/bookmark`, 4994 type: "POST", 4995 dataType: 'json', 4996 data: JSON.stringify({ "uId": uId, "aId": articleIds }), 4997 headers: { 4998 Authorization: 'Bearer ' + token, 4999 }, 5000 success: function (res) { 5001 console.log("success"); 5002 return resolve(1); 5003 }, 5004 error: function (err) { 5005 console.log('Response Text:', err); 5006 return resolve(0); 5007 } 5008 }) 5009 }); 5010}; 5011 5012/* Ad script utilty funtion for saved items */ 5013const setAdScriptForSaved = (savedCount, container) => { 5014 let isPremium = getCookieVal("prm_adfree") === 'true' ? true : false; 5015 if(isPremium){ 5016 return; 5017 } 5018 let liPositionIndex = 4; 5019 if(savedCount < 5){ 5020 liPositionIndex = savedCount - 1; 5021 } 5022 container.find(".cmp-story-list__item").eq(liPositionIndex).after(slb2AdScript); 5023 createAdUnit("slb2"); 5024} 5025 5026/* Populate the listing page with the api data. Used in saved items landing page */ 5027const populateSavedListing = (savedData) => {
5028 let container = $(".story-col-list-section.story-col-list-section--saved .cmp-story-list"); 5029 if (!container.length) { 5030 return; 5031 } 5032 5033 let savedCount = savedData["addedIds"].length; 5034 5035 if(savedCount === 0 || !revampHeaderutils.isLoggedIn()){ 5036 $(".list-noresult").css("display","block"); 5037 $(".saved-items__remove-btn").css("display","none"); 5038 $(".story-sort").css("display","none"); 5039 } 5040 container.empty(); 5041 5042 if (savedCount > 0) { 5043 $(".list-noresult").css("display","none"); 5044 $(".saved-items__remove-btn").css("display","block"); 5045 $(".story-sort").css("display","block"); 5046 $(".cmp-story-sort__count span").html(savedData["addedIds"].length); 5047 let articleData = savedData["articles"]; 5048 for (let key in articleData) { 5049 let data = articleData[key] 5050 let articleId = data.id; 5051 let articleLink = data.link; 5052 let articleTitle = data.title; 5053 let articleImg = data.img; 5054 let squareImg = data.squareImg; 5055 let sectionTitle = data.sectionTitle; 5056 let sectionLink = data.sectionLink; 5057 let isPremium = data.isPremium; 5058 let liveLabel = data.liveLabel; 5059 let hasVideoIcon = data.hasVideoIcon; 5060 let hasAudioIcon = data.hasAudioIcon; 5061 let stampLabel = data.stampLabel; 5062 let htmlLi = 5063 `<li class="cmp-story-list__item"> 5064 <div class="cmp-story-list__item-in" data-itemid="${articleId}"> 5065 <div class="cmp-story-list__content"> 5066 <h2 class="cmp-story-list__title"> <a href="${articleLink}" class="cmp-story-list__title-link" title="${articleTitle}"> 5067 ${liveLabel.length ? 5068 `<label class="cmp-live-label"> 5069 <div class="live-blink-circile"> 5070 <div class="live-nomaral-circle"></div> 5071 <div class="live-circle"></div> 5072 <div class="live-circle"></div> 5073 <div class="live-circle"></div> 5074 <div class="live-circle"></div> 5075 </div> 5076 ${liveLabel} 5077 </label>` : '' 5078 } 5079 ${stampLabel.length ? 5080 `<label class="cmp-stamp-label">${stampLabel}</label>` : '' 5081 } 5082 ${isPremium ? 5083 `<div class="cmp-story-list__premium-icon"> 5084 <i class="mm-icon mm-icon__mm-premium"></i> 5085 </div>` : '' 5086 } 5087 ${articleTitle} 5088 </a> </h2> 5089 5090 <div class="cmp-story-list__content-bottom"> 5091 <div class="cmp-story-list__content-btm-left"> <a href="${sectionLink}" class="cmp-story-list__pretitle" title="">${sectionTitle}</a> </div> 5092 <div class="cmp-story-list__content-btm-right"> 5093 <ul class="cmp-story-list__controls"> 5094 <li class="cmp-story-list__control-li"> 5095 <button class="cmp-story-list__control-btn" title=""><i class="mm-icon mm-gray-icon mm-icon__listen"></i></button> 5096 </li> 5097 <li class="cmp-story-list__control-li"> 5098 <button class="cmp-story-list__control-btn cmp-save__btn" title=""><i class="mm-icon mm-gray-icon mm-icon__bookmark-sm"></i></button> 5099 </li> 5100 </ul> 5101 </div> 5102 </div> 5103 </div> 5104 <div class="cmp-story-list__image-block"> 5105 <a class="cmp-story-list__image-link" href="${articleLink}" title="${articleTitle}"> 5106 ${hasAudioIcon ? 5107 `<div class="cmp-story-list__media-icon"> 5108 <i class="mm-icon mm-white-icon mm-icon__podcast"></i> 5109 </div>` : '' 5110 5111 } 5112 ${hasVideoIcon ? 5113 `<div class="cmp-story-list__media-icon"> 5114 <i class="mm-icon mm-white-icon mm-icon__play-sharp"></i> 5115 </div>` : '' 5116 } 5117 <img src="/etc.clientlibs/revamp-mmonline/cl
5117ientlibs/clientlib-mmo-common-footer/resources/img/default-medium.jpg" data-websrc="${articleImg}?w=260&h=135" data-mobsrc="${squareImg}" data-tabsrc="${squareImg}" alt="${articleTitle}" class="cmp-story-list__img lazyload"></a> </div> 5118 </div> 5119 </li>`; 5120 container.append(htmlLi); 5121 } 5122 setAdScriptForSaved(savedCount, container); // set ad for saved 5123 getDeviceType(); // call for image lazyload 5124 5125 } 5126} 5127 5128 5129const POST_WAIT_TIME = 60 * 1000; 5130const GET_WAIT_TIME = 5 * 60 * 1000; 5131const AD_POS = 6; 5132 5133 5134// helper methods 5135const getHistoryFromLocalStorage = () => { 5136 let history = JSON.parse(localStorage.getItem("historyItems")) || { 5137 historyItems: [], 5138 saved_articles: [], 5139 deleted_articles: [], 5140 lastPosted: Date.now() - POST_WAIT_TIME, 5141 lastFetched: Date.now() - GET_WAIT_TIME, 5142 saveCounter: 0, 5143 deleteCounter: 0 5144 } 5145 return history 5146} 5147 5148const saveHistoryToLocalStorage = (history) => { 5149 let historyString = JSON.str
5149ingify(history) 5150 localStorage.setItem("historyItems", historyString); 5151} 5152 5153const checkIfUserisLoggedIn = () => { 5154 const [token, uId] = getTokenAndUId(); 5155 return token && token != "" 5156} 5157 5158 5159function populateHistoryHtml(data) { 5160 let imageUrl = `${mainImgDomain}${data.image}`; 5161 let description = data.description 5162 let mobImage = "" 5163 if (data.mobImage) { 5164 let mobImgUrl = `${mainImgDomain}${data.mobImage}` 5165 mobImage = getSquareImg(mobImgUrl) 5166 } else { 5167 mobImage = getSquareImg(imageUrl) 5168 } 5169 let title = data.title 5170 let url = data.link 5171 let sectionTitle = data.sectionTitle 5172 let articleId = data.articleId 5173 let liveUpdate = data.liveUpdate 5174 let sectionLink = data.sectionLink 5175 let premium = data.isPremium 5176 5177 let liveUpdateSnippet = liveUpdate ? `<label class="cmp-live-label"> 5178 <div class="live-blink-circile"> 5179 <div class="live-nomaral-circle"></div> 5180 <div class="live-circle"></div> 5181 <div class="live-circle"></div> 5182 <div class="live-circle"></div> 5183 <div class="live-circle"></div> 5184 </div> 5185 LIVE UPDATES 5186 </label>` : "" 5187 5188 let premiumSnippet = premium ? `<div class="cmp-story-list__premium-icon"><i class="mm-icon mm-icon__mm-premium"></i></div>` : "" 5189 let historyListHtml = `<li class="cmp-story-list__item"> 5190 <div class="cmp-story-list__item-in" data-itemid="${articleId}"> 5191 <div class="cmp-story-list__content"> 5192 <h2 class="cmp-story-list__title"> <a href="${url}" class="cmp-story-list__title-link" title="${title}"> 5193 ${liveUpdateSnippet} 5194 ${premiumSnippet}${title}</a> </h2> 5195 <p class="cmp-story-list__dispn"><a href="${url}">${description}</a></p> 5196 <div class="cmp-story-list__content-bottom"> 5197 <div class="cmp-story-list__content-btm-left"> <a href="${sectionLink}" class="cmp-story-list__pretitle" title="${sectionTitle}">${sectionTitle}</a> </div> 5198 <div class="cmp-story-list__content-btm-right"> 5199 <ul class="cmp-story-list__controls"> 5200 <li class="cmp-story-list__control-li"> 5201 <button class="cmp-story-list__control-btn cmp-story-list__control-btn--more-menu cmp-history-custom-dropdown" title=""><i class="mm-icon mm-gray-icon mm-icon__more-vertical"></i> </button> 5202 <div class="cmp-story-list__drop-down"> 5203 <div class="cmp-story-list__drop-down-in"> 5204 <ul class="cmp-story-list___dropdown-ul"> 5205 <li class="cmp-story-list___dropdown-li"> 5206 <button class="cmp-story-list___dropdown-btn" data_articleId="${articleId}"><i class="mm-icon mm-gray-icon mm-icon__trash"></i><span class="cmp-story-list___dropdown-btn-text">Remove</span> </button> 5207 </li> 5208 <li class="cmp-story-list___dropdown-li"> 5209 <button class="cmp-story-list___dropdown-btn cmp-save__btn"><i class="mm-icon mm-gray-icon mm-icon__bookmark-sm"></i><span class="cmp-story-list___dropdown-btn-text">Save </span> </button> 5210 </li> 5211 <!-- <li class="cmp-story-list___dropdown-li"> 5212 <button class="cmp-story-list___dropdown-btn"><i class="mm-icon mm-gray-icon mm-icon__listen"></i><span class="cmp-story-list___dropdown-btn-text">listen </span> </button> 5213 </li> --> 5214 </ul> 5215 </div> 5216 </div> 5217 </li> 5218 </ul> 5219 </div> 5220 </div> 5221 </div> 5222 <div class="cmp-story-list__image-block"> <a class="cmp-story-list__image-link" href="${url}" title="${title}">
5223 <img src="/etc.clientlibs/revamp-mmonline/clientlibs/clientlib-mmo-common-footer/resources/img/default-medium.jpg" data-websrc="${imageUrl}?w=315&h=164" data-mobsrc="${mobImage}" data-tabsrc="${mobImage}" alt="${title}" class="cmp-story-list__img lazyload"></a> </div> 5224</div> 5225</li>` 5226 return historyListHtml 5227} 5228 5229function wrapHistoryHtml(historyListHtml) { 5230 return `<ul class="cmp-story-list">${historyListHtml}</ul>` 5231} 5232 5233const updateCounters = () => { 5234 let history = getHistoryFromLocalStorage(); 5235 if (history) { 5236 if (Date.now() - history.lastPosted > POST_WAIT_TIME) { 5237 if (history.save_pending) { 5238 let articleIds = history.saved_articles || []; 5239 saveHistory(articleIds) 5240 history.lastPosted = Date.now(); 5241 history.source = "" 5242 history.save_pending = false 5243 history.saved_articles = [] 5244 console.log("history saved") 5245 } 5246 history.saveCounter = 0; 5247 } 5248 if (Date.now() - history.lastDeleted > POST_WAIT_TIME) { 5249 if (history.delete_pending) { 5250 let articleIds = history.deletedIds; 5251 deleteHistoryItem(articleIds, history.deleteAll || false) 5252 history.source = "" 5253 history.deleteAll = false 5254 history.delete_pending = false 5255 history.deletedIds = [] 5256 history.lastDeleted = Date.now() 5257 console.log("history deleted") 5258 } 5259 history.deleteCounter = 0; 5260 } 5261 saveHistoryToLocalStorage(history) 5262 } 5263} 5264 5265async function fetchHistory() { 5266 5267 let FETCH_LIMIT = $('.cmp-sectionpage-header[data-articleLimit]').attr('data-articleLimit') || "100" 5268 FETCH_LIMIT = FETCH_LIMIT.toString(); 5269 const [token, uId] = getTokenAndUId(); 5270 let params = { 5271 method: "GET", 5272 "headers": { 5273 "Authorization": "Bearer " + token 5274 } 5275 } 5276 let url = `${mainApiDomain}/profile/read/history?uId=${uId}&limit=${FETCH_LIMIT}` 5277 let historyItems = [] 5278 let updatedOn; 5279 let resp = await fetch(url, params); 5280 if (resp.status === 200) { 5281 let response = await resp.json() 5282 response.data?.contents?.map((ele) => { 5283 const images = ele.contentImgs?.length ? ele.contentImgs : ele.thumbnailImgs || []; 5284 let articleData = { 5285 "articleId": ele.id, 5286 "sectionTitle": ele.subSection.title, 5287 "sectionLink": getCleanSectionUrl(ele.subSection.url), 5288 "title": ele.contentTitle.title, 5289 "description": ele.description, 5290 "link": getCleanSectionUrl(ele.contentTitle.url), 5291 "image": images.find(img => img.aspectratio === "image")?.url, 5292 "mobImage": images.find(img => img.aspectratio === "square")?.url, 5293 "isPremium": ele.isPremium, 5294 "stampLabel": ele.configurableLabel, 5295 "hasVideoIcon": ele.icon === "video", 5296 "hasAudioIcon": ele.icon === "audio", 5297 "liveUpdate": ele.liveBlinkingLabel, 5298 "lastModified": ele.lastModified 5299 }; 5300 historyItems.push(articleData) 5301 }) 5302 updatedOn = response.updatedOn || Date.now() 5303 historyItems.reverse() 5304 } else { 5305 console.log(`failed to fetch history with status code ${resp.status}`) 5306 } 5307 return [historyItems, updatedOn] 5308} 5309 5310 5311const fetchHistoryItems = async () => { 5312 let FETCH_LIMIT = $('.cmp-sectionpage-header[data-articleLimit]').attr('data-articleLimit') || "100" 5313 FETCH_LIMIT = parseInt(FETCH_LIMIT) 5314 let history = getHistoryFromLocalStorage() 5315 let historyItems = [] 5316 let updatedOn = null 5317 if (history.historyItems) { 5318 if (Date.now() - history.lastFetched > GET_WAIT_TIME) { // check if localstorage values are older than 5 minutes 5319 [historyItems, updatedOn] = await fetchHistory() 5320 history = { 5321 "lastFetched": updatedOn, 5322 "source": history.source || "", 5323 "lastPosted": history.lastPosted || Date.now(), 5324 "historyItems": historyItems, 5325 "deletedIds": historyItems.deletedIds || [], 5326 "saved_articles": historyItems.saved_articles || [], 5327 "save_pending": historyItems.save_pending || false, 5328 "delete_pending": historyItems.delete_pending || false, 5329 "lastDeleted": historyItems.lastDeleted || Date.now(), 5330 "saveCounter": historyItems.saveCounter || 0, 5331 "deleteCounter": historyItems.deleteCounter || 0 5332 } 5333 saveHistoryToLocalStorage(history) 5334 } else { 5335 historyItems = history.historyItems; 5336 } 5337 } else { 5338 [historyItems, updatedOn] = await fetchHistory() 5339 history = { 5340 "lastFetched": updatedOn, 5341 "source": "", 5342 "lastPosted": Date.now(), 5343 "historyItems": historyItems.reverse(), 5344 "saveCounter": 0, 5345 "deleteCounter": 0, 5346 "lastPosted":Date.now(), 5347 "lastDeleted": Date.now(), 5348 } 5349 saveHistoryToLocalStorage(history) 5350 } 5351 5352 let prmAdfree = getCookie("prm_adfree"); 5353 prmAdfree = prmAdfree == "true" ? true : false;
5354 5355 let storyList = $('#history-list')[0]; 5356 let finalHtml = "" 5357 history = getHistoryFromLocalStorage() 5358 historyItems = history.historyItems; 5359 if (historyItems.length > 0) { 5360 historyItems.reverse() 5361 limitedHistoryItems = historyItems.filter((element, index) => index < FETCH_LIMIT) 5362 if (storyList) { 5363 let itemCount = historyItems.length; 5364 limitedHistoryItems.map((element, key) => { 5365 finalHtml += populateHistoryHtml(element) 5366 if (key == AD_POS - 2 && !prmAdfree) { 5367 finalHtml += slb2AdScript 5368 } 5369 }) 5370 if (itemCount < AD_POS - 2 && !prmAdfree) { 5371 finalHtml += slb2AdScript 5372 } 5373 storyList.innerHTML = wrapHistoryHtml(finalHtml); 5374 $(".list-noresult.text-center").css("display", "none"); 5375 createAdUnit("slb2") 5376 } 5377 let deleteButtons = document.querySelectorAll("button[data_articleid]") 5378 deleteButtons.forEach(button => { 5379 button.addEventListener('click', function () { 5380 const articleId = this.getAttribute('data_articleid'); 5381 deleteHistory(articleId) 5382 }); 5383 }); 5384 $("#delete-history-confirm").css("display", "block") 5385 getDeviceType(); 5386 revampCustomutils.storylistMore(); 5387 addSaveItemsEventListeners(); 5388 5389 } else { 5390 storyList ? storyList.innerHTML = "" : null 5391 console.log("no history items found") 5392 $("#delete-history-confirm").css("display", "none") 5393 $(".list-noresult.text-center").css("display", "block"); 5394 } 5395} 5396 5397function deleteHistoryItem(articleIds, deleteAll = false) { 5398 const [token, uId] = getTokenAndUId(); 5399 5400 return new Promise((resolve, reject) => { 5401 if (token === null) { 5402 return reject(0); 5403 } 5404 let data = JSON.stringify({ "uId": uId, "aId": articleIds, "deleteAll": deleteAll }) 5405 $.ajax({ 5406 url: `${mainApiDomain}/profile/delete/history`, 5407 type: "POST", 5408 dataType: 'json', 5409 data: data, 5410 headers: { 5411 Authorization: 'Bearer ' + token, 5412 }, 5413 success: function (res) { 5414 console.log("success"); 5415 return resolve(1); 5416 }, 5417 error: function (err) { 5418 console.log('Response Text:', err); 5419 return reject(0); 5420 } 5421 }) 5422 }); 5423} 5424 5425const deleteHistory = (articleId, deleteAll = false) => { 5426 let history = getHistoryFromLocalStorage() 5427 if (history && history.historyItems) { 5428 let historyItems = history.historyItems; 5429 if (!history.deleteCounter) { 5430 history.deleteCounter = 0; 5431 } 5432 if (history.deleteCounter < 5) { 5433 deleteHistoryItem([articleId], deleteAll) 5434 history.deleteCounter += 1 5435 if (deleteAll) { 5436 history.historyItems = []; 5437 history.deletedIds = [] 5438 history.lastFetched = Date.now() 5439 } else { 5440 historyItems = historyItems.filter(item => item.articleId !== articleId) 5441 history.historyItems = historyItems; 5442 } 5443 } else if (deleteAll) { 5444 history.historyItems = [] 5445 history.deleteAll = true 5446 history.delete_pending = true 5447 history.deleteAll = true 5448 } else { 5449 historyItems = historyItems.filter(item => item.articleId !== articleId) 5450 history.historyItems = historyItems; 5451 history.source = "local" 5452 let deletedIds = history.deletedIds || []; 5453 deletedIds.push(articleId); 5454 history.deletedIds = deletedIds; 5455 history.delete_pending = true 5456 } 5457 console.log("article deleted from history") 5458 saveHistoryToLocalStorage(history) 5459 if (deleteAll) { 5460 $("#history-list").empty() 5461 $(".tost-message.slide-down").css("display", "block") 5462 setTimeout(() => $(".tost-message.slide-down").css("display", "none"), 2000)
5463 $("#delete-history-confirm").css("display", "none") 5464 $(".list-noresult.text-center").css("display", "block"); 5465 } else { 5466 fetchHistoryItems() 5467 } 5468 } 5469} 5470 5471const getArticleData = () => { 5472 let pageData = JSON.parse(JSON.stringify(pageDl)); 5473 let dateString = pageData.lastModified; 5474 let dateObject = new Date(dateString); 5475 let epochTime = dateObject.getTime(); 5476 5477 let articleId = pageData.articleId; 5478 let description = $('meta[name="description"]').attr('content') || ""; 5479 let url = window.location.href; 5480 let title = pageData.headline; 5481 let lastModified = epochTime 5482 let imageData = $(".cmp-story-figure__web-image img").attr("src")?.split("?")[0] || $('meta[property="og:image"]').attr('content') || ""; 5483 let image = "" 5484 if (imageData.length > 0) { 5485 let parsedImg = new URL(imageData) 5486 image = parsedImg.pathname; 5487 } 5488 let sectionTitle = pageData.sectionName; 5489 let sectionLink = $(".cmp-sectionpage-header__title a").attr("href") || ""; 5490 let isPremium = pageData.articleType === "premium"; 5491 let stampLabel = $(".article-header .cmp-stamp-label")?.text().trim() || ""; 5492 let liveLabel = $(".article-header .cmp-live-label")?.text().trim() || ""; 5493 let liveUpdate = $(".article-header .cmp-live-label").text().trim() != "" && $(".article-header .cmp-live-label").text().trim(); 5494 let hasVideoIcon = (pageData.ytVideoCount > 0 || pageData.bcVideoCount > 0) 5495 let hasAudioIcon = false; 5496 let articleData = { "articleId": articleId, "sectionTitle": sectionTitle, "sectionLink": sectionLink, "title": title, "description": description, "link": url, "image": image, "isPremium": isPremium, "stampLabel": stampLabel, "liveLabel": liveLabel, "hasVideoIcon": hasVideoIcon, "hasAudioIcon": hasAudioIcon, "liveUpdate": liveUpdate, "lastModified": lastModified }; 5497 return articleData; 5498} 5499 5500function saveHistory(articleIds) { 5501 const [token, uId] = getTokenAndUId(); 5502 return new Promise((resolve, reject) => { 5503 if (token === null) { 5504 return reject(0); 5505 } 5506 let data = JSON.stringify({ "uId": uId, "aId": articleIds }) 5507 $.ajax({ 5508 url: `${mainApiDomain}/profile/save/history`, 5509 type: "POST", 5510 dataType: 'json', 5511 data: data, 5512 headers: { 5513 Authorization: 'Bearer ' + token, 5514 }, 5515 success: function (res) { 5516 console.log("success"); 5517 return resolve(1); 5518 }, 5519 error: function (err) { 5520 console.log('Response Text:', err); 5521 return reject(0); 5522 } 5523 }) 5524 }); 5525} 5526 5527const postHistoryItems = async () => { 5528 5529 let history = getHistoryFromLocalStorage() 5530 let exists = false 5531 let historyItems = history.historyItems || [] 5532 let savedArticles = new Set(history.saved_articles || []); 5533 let articleData = getArticleData() 5534 5535 exists = historyItems.some(item => item.articleId === articleData.articleId); 5536 5537 if (!exists) { 5538 historyItems.push(articleData) 5539 history.historyItems = historyItems; 5540 history.saved_articles = Array.from(savedArticles); 5541 history.source = "local" 5542 5543 if (history.saveCounter < 5) { 5544 saveHistory([articleData.articleId]) 5545 history.saveCounter += 1 5546 } else { 5547 history.save_pending = true 5548 savedArticles.add(articleData.articleId) 5549 } 5550 5551 } 5552 saveHistoryToLocalStorage(history) 5553} 5554 5555const setupEventListeners = () => { 5556 const userLoggedIn = checkIfUserisLoggedIn() 5557 if (userLoggedIn) { 5558 document.addEventListener("DOMContentLoaded", () => { 5559 5560 updateCounters(); 5561 if (window.pageDl != undefined) { 5562 if (pageDl.contentType == "article") { 5563 postHistoryItems().then() 5564 console.log("article saved to history") 5565 } 5566 } 5567 if ($('#history-list').length > 0) { 5568 fetchHistoryItems() 5569 document.querySelector("#delete-history-button")?.addEventListener("click", (e) => { 5570 e.preventDefault() 5571 console.log("clear all triggered") 5572 deleteHistory(null, true) 5573 $(".cmp-modal-box.cmp-modal-box--history-clear").css("display", "none"); 5574 }) 5575 } 5576 }) 5577 } else if ($('#history-list').length > 0) {
5578 $("#delete-history-confirm").css("display", "none") 5579 $(".list-noresult.text-center").css("display", "block"); 5580 } 5581} 5582 5583setupEventListeners() 5584let idlength = 0; 5585document.addEventListener("DOMContentLoaded", function () { 5586 const searchBtn = document.querySelector(".cmp-lottery-result__srch-btn"); 5587 const inputField = document.querySelector(".lottery-input"); 5588 const resultItems = document.querySelectorAll(".cmp-lottery-result__li"); 5589 const winMessage = document.querySelector(".win-msg"); 5590 const loseMessage = document.querySelector(".lose-msg"); 5591 const winnerIdSpan = document.querySelector(".winner-id"); 5592 const prizeDetailsSpan = document.querySelector(".prize-details"); 5593 const firstResultItem = document.querySelector(".cmp-lottery-result__li"); 5594 const originalPlaceholder = inputField ? inputField.placeholder : ''; 5595 const lotteryTopBlock = document.querySelector(".cmp-lottery-result__top"); 5596 const defaultMessage=document.querySelector(".def-msg"); 5597 5598 function resetMessages() { 5599 winMessage.style.display = "none"; 5600 loseMessage.style.display = "none"; 5601 } 5602 if (firstResultItem) { 5603 const winningText = Array.from(firstResultItem.childNodes) 5604 .filter((node) => node.nodeType === Node.TEXT_NODE) 5605 .map((node) => node.textContent.trim().replace(/\s+/g, "")) 5606 .join(""); 5607 console.log(winningText); 5608 5609 idlength = winningText.length; 5610 console.log(idlength); 5611 } 5612 5613 function performSearch() { 5614 try { 5615 resetMessages(); 5616 const userInput = inputField.value 5617 .replace(/\s+/g, " ") 5618 .trim() 5619 .toUpperCase(); 5620 if (userInput.length == idlength && /^[A-Za-z]{2}\d{6}$/.test(userInput)) { 5621 let exactMatched = false; 5622 let last4Match = false; 5623 resultItems.forEach((item) => 5624 checkAndRemoveClass(item,"cmp-lottery-result__winner") 5625 ); 5626 5627 resultItems.forEach((item) => { 5628 const winnerIdText = Array.from(item.childNodes) 5629 .filter((node) => node.nodeType === Node.TEXT_NODE) 5630 .map((node) => node.textContent.trim().replace(/\s+/g, "")) 5631 .join(""); 5632 const winnerId = winnerIdText; 5633 if (winnerId === userInput) { 5634 item.classList.add("cmp-lottery-result__winner"); 5635 checkAndRemoveClass(lotteryTopBlock,"cmp-lottery-result__error"); 5636 exactMatched = true; 5637 winMessage.style.display = "block"; 5638 defaultMessage.style.display="none"; 5639 if (winnerIdSpan && winnerId.length >= 2) { 5640 winnerIdSpan.textContent = winnerId.substring(0, 2) + " " + winnerId.substring(2); 5641 } 5642 prizeDetailsSpan.textContent = assignPrizeDetailsSpanContent(item); 5643 } 5644 }); 5645 5646 if (!exactMatched && /^\S+\s?\d{6}$/.test(userInput)) { 5647 const last4 = userInput.slice(-4); 5648 resultItems.forEach((item) => { 5649 const winnerIdText = Array.from(item.childNodes) 5650 .filter((node) => node.nodeType === Node.TEXT_NODE) 5651 .map((node) => node.textContent.trim().replace(/\s+/g, "")) 5652 .join(""); 5653 if (winnerIdText === last4) { 5654 item.classList.add("cmp-lottery-result__winner"); 5655 checkAndRemoveClass(lotteryTopBlock,"cmp-lottery-result__error"); 5656 winMessage.style.display = "block"; 5657 defaultMessage.style.display="none"; 5658 last4Match = true; 5659 if (winnerIdSpan && winnerIdText.length >= 2) { 5660 winnerIdSpan.textContent = userInput.substring(0, 2) + " " + userInput.substring(2); 5661 } 5662 prizeDetailsSpan.textContent = assignPrizeDetailsSpanContent(item); 5663 } 5664 }); 5665 } 5666 if (!exactMatched && !last4Match) { 5667 checkAndRemoveClass(lotteryTopBlock,"cmp-lottery-result__error"); 5668 loseMessage.style.display = "block"; 5669 defaultMessage.style.display="none"; 5670 checkAndRemoveClass(item,"cmp-lottery-result__winner"); 5671 } 5672 } else { 5673 resetMessages(); 5674 defaultMessage.style.display="block";
5675 resultItems.forEach((item) => { 5676 checkAndRemoveClass(item,"cmp-lottery-result__winner") 5677 }); 5678 lotteryTopBlock.classList.add("cmp-lottery-result__error"); 5679 } 5680 } catch (error) { 5681 console.log(error); 5682 } 5683 } 5684 5685 searchBtn?.addEventListener("click", performSearch); 5686 5687 inputField?.addEventListener("keyup", function (e) { 5688 if (e.key === "Enter") { 5689 performSearch(); 5690 } 5691 }); 5692 inputField?.addEventListener("focus", function (e) { 5693 inputField.placeholder = ""; 5694 }); 5695 inputField?.addEventListener("blur", function (e) { 5696 inputField.placeholder = originalPlaceholder; 5697 }); 5698 inputField?.addEventListener("input", function (e) { 5699 this.value = this.value.replace(/\s+/g, "").substring(0, 8); 5700 if (this.value == "") { 5701 winMessage.style.display = "none"; 5702 loseMessage.style.display = "none"; 5703 defaultMessage.style.display="block"; 5704 resultItems.forEach((item) => { 5705 checkAndRemoveClass(item,"cmp-lottery-result__winner") 5706 }); 5707 checkAndRemoveClass(lotteryTopBlock, "cmp-lottery-result__error"); 5708 } 5709 }); 5710}); 5711 5712//helper function to remove winner or error classes 5713function checkAndRemoveClass(element, className) { 5714 if (element.classList.contains(className)) { 5715 element.classList.remove(className); 5716 } 5717} 5718 5719//helper function to set the text content for the prize details message 5720function assignPrizeDetailsSpanContent(item) { 5721 let parentUl = item.parentElement; 5722 let prizeParagraph = parentUl.previousElementSibling; 5723 while (prizeParagraph) { 5724 if ( 5725 prizeParagraph.tagName === "P" && 5726 prizeParagraph.classList.contains("cmp-lottery-result__item-title") 5727 ) { 5728 const prizeNameAndAmount = prizeParagraph.innerText; 5729 const [, prizeAmount] = prizeNameAndAmount.split("Rs :"); 5730 return "Rs :" + prizeAmount; 5731 } 5732 prizeParagraph = prizeParagraph.previousElementSibling; 5733 } 5734 return ""; 5735} 5736 5737document.addEventListener("DOMContentLoaded", function () { 5738 if (typeof getMCookie !== "function") { 5739 console.error("getMCookie is missing"); 5740 return; 5741 } 5742 5743 let isPremium = getMCookie('premium_user'); 5744 const expiryStr = getMCookie("subscription_expiry"); 5745 if (!expiryStr) return; 5746 const expiryDate = new Date(expiryStr); 5747 5748 const today = new Date(); 5749 const startDateObj = new Date(expiryDate); 5750 5751 startDateObj.setUTCDate(startDateObj.getUTCDate() + 1); 5752 5753 const dd = String(startDateObj.getUTCDate()).padStart(2, "0"); 5754 const mm = String(startDateObj.getUTCMonth() + 1).padStart(2, "0"); 5755 const yyyy = startDateObj.getUTCFullYear(); 5756 5757 const startDate = `${dd}${mm}${yyyy}`; 5758 5759 const renewLink = document.querySelector('.planexprStrip__btn1'); 5760 5761 if ( 5762 renewLink && 5763 renewLink.href.includes('/myaccount/subscribe-plan.html') 5764 ) { 5765 const url = new URL(renewLink.href); 5766 5767 url.searchParams.set('pRenewal', 'true'); 5768 url.searchParams.set('startDate', startDate); 5769 5770 renewLink.href = url.toString(); 5771 } 5772 5773 // Remove time part for accurate day calculation 5774 expiryDate.setHours(0,0,0,0); 5775 today.setHours(0,0,0,0); 5776 5777 const diffTime = expiryDate - today; 5778 const remainingDays = Math.ceil(diffTime / (1000 * 60 * 60 * 24)); 5779 5780 console.log("Remaining Days:", remainingDays); 5781 5782 const strip = document.querySelector(".planexprStrip"); 5783 const abmer = document.querySelector(".planexprAbmer"); 5784 const text = document.querySelector(".planexprStrip__p"); 5785 const profileText = document.querySelector(".planexpr"); 5786 const renewBtn = strip.querySelector('.planexprStrip__btnblk'); 5787 const isMySubPage = window.location.href.includes('subscribe-plan'); 5788 const isSubscribeSummaryPage =window.location.pathname === "/myaccount/subscribe-summary.html"; 5789 5790 if (expiryStr==="null" ||expiryStr==="undefined"|| expiryStr==="" || isSubscribeSummaryPage) { 5791 5792 if (abmer) abmer.style.display = "none"; 5793 if (profileText) profileText.style.display = "none"; 5794 return; 5795 } 5796 if(abmer && profileText){ 5797 abmer.style.display = "none"; 5798 profileText.style.display = "none"; 5799 } 5800 5801 if (text) { 5802 let icon = text.querySelector('.planexprStrip__pIcn'); 5803 let originalText = text.textContent.trim(); 5804 originalText = originalText.replace(/,\s*in\s+\d+\s+day.?$/, "").trim(); 5805 5806 let newText = remainingDays <= 1 5807 ? `${originalText} Today.` 5808 : `${originalText} in ${remainingDays} days.`; 5809 5810 text.innerHTML = ''; 5811 if (icon) { 5812 text.appendChild(icon); 5813 } 5814 text.appendChild(document.createTextNode(' ' + newText)); 5815} 5816 if (profileText) { 5817 const textContainer = profileText.querySelector('.planexpr__txt'); 5818 5819 if (textContainer) { 5820 const displayText = remainingDays <= 1 5821 ? "Premium Plan Expires Today" 5822 : `Premium Plan Expires in ${remainingDays} ${remainingDays === 1 ? "Day" : "Days"}`; 5823 5824 textContainer.textContent = displayText; 5825 } 5826 profileText.style.display = "flex"; 5827 profileText.style.alignItems = "center"; 5828 profileText.style.gap = "8px"; 5829} 5830 5831 if (remainingDays >= 16 && isPremium) { 5832 if (profileText) profileText.style.display = "none"; 5833 if (abmer) abmer.style.display = "none"; 5834 if (profileText) profileText.style.display = "none"; 5835 } 5836 5837 // Stage 2: 15â8 days 5838 else if (remainingDays >= 8 && remainingDays <= 15 && isPremium) { 5839 if (abmer) abmer.style.display = "block"; 5840 if (profileText) profileText.style.display = "flex"; 5841 } 5842 5843 // Stage 3: 7â4 days 5844 else if (remainingDays >= 4 && remainingDays <= 7 && isPremium) { 5845 if (abmer) abmer.style.display = "none"; 5846 if (profileText) profileText.style.display = "none"; 5847 if (isMySubPage && renewBtn) { 5848 renewBtn.style.display = "none"; 5849 } 5850 } 5851 5852 // Stage 4: 3â2 days 5853 else if (remainingDays >= 0 && remainingDays <= 3 && isPremium) { 5854 // if (text) text.style.color = "#ff1f1f"; 5855 // if (strip) strip.style.display = "block"; 5856 if (text) { 5857 text.style.color = "#b30000"; // Very dark red 5858 text.style.fontWeight = "bold"; // or "700" 5859 5860 } 5861 if (profileText) profileText.style.display = "none"; 5862 5863 if (strip) { 5864 5865 if (renewBtn) { 5866 if (window.location.href.includes('subscribe-plan')) { 5867 renewBtn.style.display = "none"; 5868 } 5869 renewBtn.style.backgroundColor = "#ff1f1f"; 5870 renewBtn.style.borderRadius = "20px"; 5871 renewBtn.style.padding = "5px 10px"; 5872 renewBtn.style.border = "none"; 5873 renewBtn.style.cursor = "pointer"; 5874 strip.querySelector('.planexprStrip__btn1').style.color = "#fff"; 5875 } 5876 } 5877 } 5878 5879 5880}); 5881/** 5882 * jQuery Unveil 5883 * A very lightweight jQuery plugin to lazy load images 5884 * http://luis-almeida.github.com/unveil 5885 * 5886 * Licensed under the MIT license. 5887 * Copyright 2013 LuÃs Almeida 5888 * https://github.com/luis-almeida 5889 */ 5890 5891;(function($) { 5892 5893 $.fn.unveil = function(threshold, callback) { 5894 5895 var $w = $(window), 5896 th = threshold || 0, 5897 retina = window.devicePixelRatio > 1, 5898 attrib = retina? "data-src-retina" : "data-src", 5899 images = this, 5900 loaded; 5901 5902 this.one("unveil", function() { 5903 var source = this.getAttribute(attrib); 5904 source = source || this.getAttribute("data-src"); 5905 if (source) { 5906 this.setAttribute("src", source); 5907 if (typeof callback === "function") callback.call(this); 5908 } 5909 }); 5910 5911 function unveil() { 5912 var inview = images.filter(function() { 5913 var $e = $(this); 5914 if ($e.is(":hidden")) return; 5915 5916 var wt = $w.scrollTop(), 5917 wb = wt + $w.height(), 5918 et = $e.offset().top, 5919 eb = et + $e.height(); 5920 5921 return eb >= wt - th && et <= wb + th; 5922 }); 5923 5924 loaded = inview.trigger("unveil"); 5925 images = images.not(loaded); 5926 } 5927 5928 $w.on("scroll.unveil resize.unveil lookup.unveil", unveil); 5929 5930 unveil(); 5931 5932 return this; 5933 5934 }; 5935 5936})(window.jQuery || window.Zepto); 5937 5938$(() => { 5939 try { 5940 getDeviceType(); 5941 } catch (error) { 5942 console.error('Error while getting device type:', error); 5943 } 5944}); 5945 5946$(window).on("orientationchange", (event) => { 5947 getDeviceType(); 5948}); 5949 5950const getDeviceType = () => { 5951 const docWidth = $(window).width(); 5952 if (docWidth > 991) { 5953 displayImages("web"); 5954 } else if (575 < docWidth && docWidth <= 991) { 5955 displayImages("tab"); 5956 } else { 5957 displayImages("mob"); 5958 } 5959}; 5960 5961const displayImages = (dType) => { 5962 const imageLength = $("img.lazyload").length; 5963 const imageDomain = $("#websiteImageDomain").val() || ""; 5964 for (let i = 0; i < imageLength; i++) { 5965 let attrFind = $($("img.lazyload")[i]).attr(`data-${dType}src`); 5966 5967 if (attrFind) { 5968 attrFind = `${imageDomain}${attrFind}`; 5969 $($("img.lazyload")[i]).attr("data-src", `${attrFind}`); 5970 } else { 5971 console.error("Error in LazyLoading Images"); 5972 } 5973 } 5974 if($("button.cmp-header__section-nav").length > 0){ 5975 document.querySelector("button.cmp-header__section-nav").addEventListener("click",function(){ 5976 document.querySelectorAll(".cmp-mega-menu__body img.lazyload").forEach(lazyImg =>{ 5977 let imgPath = lazyImg.dataset.src; 5978 if(imgPath){ 5979 lazyImg.src = imgPath; 5980 lazyImg.classList.remove("lazyload"); 5981 } 5982 }) 5983 }) 5984 } 5985 5986 5987 $(".lazyload").unveil(); 5988}; 5989document.addEventListener("DOMContentLoaded", (event) => { 5990 5991 try { 5992 document.querySelectorAll('.xf-cont-lazy:not(.cont-onclick), .mm-component-cont-lazy').forEach(element => { 5993 let observer = revampHeadCustomutils.observeElementIntersection(element,function(){lazyloadHandler(element)},false); 5994 if(element){observer.observe(element)} 5995 }); 5996 5997 } catch (error) { 5998 console.log("error while lazyloading the component",error) 5999 } 6000}); 6001document.addEventListener("DOMContentLoaded", (event) => { 6002 try { 6003 document.querySelectorAll('.cont-onload').forEach(element => { 6004 lazyloadHandler(element) 6005 }); 6006 6007 } catch (error) { 6008 console.log("error while listcontainer onload",error) 6009 } 6010}); 6011function processLazyImages(tempEle) { 6012 tempEle.documentElement.querySelectorAll(".lazyload").forEach(lazyLoadItem=>{ 6013 let lazyLoadItemSrc; 6014 if(screen.width>=991){ 6015 lazyLoadItemSrc=lazyLoadItem.dataset.websrc; 6016 } 6017 else if (screen.width<991 & screen.width>=575){ 6018 lazyLoadItemSrc=lazyLoadItem.dataset.tabsrc; 6019 } 6020 else{ 6021 lazyLoadItemSrc=lazyLoadItem.dataset.mobsrc; 6022 } 6023 if(lazyLoadItemSrc){ 6024 lazyLoadItem.classList.remove("lazyload"); 6025 lazyLoadItem.src = lazyLoadItemSrc; 6026 } 6027 }); 6028} 6029 6030 6031function initializeLazySliders(element) { 6032 const sliderConfigs = [ 6033 { selector: ".story-slider-block__four-story-banner .cmp-story-list--slider", handler: () => utils.bannerfourstorySlider() }, 6034 { selector: ".cmp-story-list--single-slider, .stories-promo-block .cmp-story-list--slider", handler: () => utils.singleSlider() }, 6035 { selector: ".visual-stories-block .cmp-story-list--slider, .shots-stories-block .cmp-story-list--slider, .story-our-serivces-block .cmp-story-list--slider, .following-topics-block .cmp-story-list--slider", handler: () => utils.fourClmSlider() }, 6036 { selector: ".story-multimedia-list-block .cmp-story-list--slider", handler: () => utils.threeClmSlider() }, 6037 { selector: ".story-slider-block--3 .cmp-story-list--slider", handler: () => utils.leftClmSlider() }, 6038 { selector: ".cmp-story-list__img-slider", handler: () => utils.imageBlockSlider() }, 6039 { selector: ".visual-stories-block .cmp-story-list--slider, .shots-stories-block .cmp-story-list--slider", handler: () => utils.vslShrtsSlider() }, 6040 { selector: ".prm-shorts-block-slider", handler: () => utils.premiumShortslider() }, 6041 { selector: ".prm-video-block-slider", handler: () => utils.premiumVideoslider() }, 6042 { selector: ".prm-featured-block-slider", handler: () => utils.PremiumFeaturedSlider() }, 6043 { selector: ".cmp-editable-banner--slider, .editable-banner--text-only .cmp-story-list--slider", handler: () => utils.bannerSlider() }, 6044 { selector: ".cartooncarousel", handler: () => revampCustomutils.cartoonSlider() }, 6045 { selector: ".mm-game-block .cmp-story-list--slider", handler: () => revampCustomutils.gameSlider() }, 6046 { selector: ".single-common-slider", handler: () => initiateSlidersAndWidgets() }, 6047 { selector: ".cmp-article-slider__large", handler: () => revampCustomutils.articleSlider() }, 6048 { selector: ".cmp-simple-slider-block__main", handler: () => revampCustomutils.artcleSimpleslider() }, 6049 { selector: ".story-card-list-block .cmp-story-list--slider", handler: () => revampCustomutils.storyCardSlickSlider() } 6050 ]; 6051
6052 sliderConfigs.forEach(config => { 6053 if (element.querySelector(config.selector)) { 6054 config.handler(); 6055 } 6056 }); 6057} 6058 6059function initializeLazyComponents(element) { 6060 const componentConfigs = [ 6061 { selector: ".day-in-picture-block .cmp-story-list__title", handler: () => utils.daypitcurecontent() }, 6062 { selector: ".score-card-block", handler: () => utils.scorecardwidth() }, 6063 { selector: ".cmp-story-list__control-btn--more-menu", handler: () => utils.storylistMore() }, 6064 { selector: ".cmp-score-card__golBy", handler: () => scorcardGoalinfo() }, 6065 { selector: ".moreInarticle-story-block", handler: () => revampCustomutils.listShowMore() }, 6066 { selector: ".cmp-video-block__icon-top", handler: () => revampCustomutils.videoPlayer() }, 6067 { selector: ".mmscoreboarditem", handler: () => revampCustomutils.mmScoreBoardDateTab() }, 6068 { selector: ".cmp-list-gallery", handler: () => revampCustomutils.articleGallery() }, 6069 { selector: ".cmp-gallery-block", handler: () => revampCustomutils.premiumImageSlideShow() }, 6070 { selector: "#vuukleComment", handler: () => revampCustomutils.vuukleComment() }, 6071 { selector: "div.cmp-story-list__component-slot-in", handler: () => revampCustomutils.indepthListHide() }, 6072 { selector: ".rprtr-item-sharebtn", handler: () => revampCustomutils.reportersShare() }, 6073 { selector: ".lclExplore__nav", handler: () => utils.exploreTab() } 6074 ]; 6075 6076 componentConfigs.forEach(config => { 6077 if (element.querySelector(config.selector)) { 6078 config.handler(); 6079 } 6080 }); 6081} 6082 6083function handleLazySpecialCases(element) { 6084 if(element.querySelector(".moreInarticle-story-block") || element.querySelector(".story-slider-block.story-card-list-block") || element.querySelector(".cmp-video-list-block")){ 6085 if(typeof videoViewUpdate != 'undefined'){ 6086 videoViewUpdate(); 6087 } 6088 } 6089 6090 6091 if(element.querySelector(".cmp-channel-block__nav")){ 6092 calcWidth2(); 6093 } 6094 if (checkMCookie("premium_token") && typeof handleAdReplace === 'function') { 6095 handleAdReplace(element); 6096 } 6097 if(element.querySelector(".story-list-block.prm-all-story-widget")){ 6098 bindAllStoriesLazy(); 6099 } 6100 6101 // For saved icons event handler register and indicators setting 6102 if(typeof addSaveItemsEventListeners === "function"){ 6103 addSaveItemsEventListeners(); 6104 let savedData = JSON.parse(localStorage.getItem("savedItems") || initData); 6105 activateSavedArticlesOnLoad(savedData["addedIds"],"add"); 6106 } 6107 6108 if(element.querySelector('.cmp-market-rates__in')){ 6109 if(typeof populateCommodityValues != 'undefined'){ 6110 populateCommodityValues(); 6111 } 6112 } 6113 6114 //To remove the experience fragment incase it has no ads for premium users. 6115 6116 $(".mm-col-blk-3 .experiencefragment .cmp-container>.ad-premiumuser,.right-component-slot .experiencefragment .cmp-container>.ad-premiumuser").each(function (i, e) { 6117 if (!$(e).height()) { 6118 $(e).closest(".experiencefragment").remove(); 6119 } 6120 }); 6121 6122 $(".article-body__aside .cmp-container>.ad-premiumuser").each(function (i, e) { 6123 if (!$(e).height()) { 6124 $(e).closest(".ad-premiumuser").remove(); 6125 } 6126 }); 6127} 6128 6129function lazyloadHandler(element){ 6130 6131 const url = element.getAttribute('data-lazy-url'); 6132 let scriptsEval = document.createElement("div"); 6133 let tempEle = document.createElement 6134 if(url){ 6135 const xhr = new XMLHttpRequest(); 6136 xhr.open('GET', url, true); 6137 xhr.onload = () => { 6138 if (xhr.status >= 200 && xhr.status < 300) { 6139 scriptsEval = new DOMParser().parseFromString(xhr.responseText, "text/html"); 6140 tempEle = new DOMParser().parseFromString(xhr.responseText, "text/html"); 6141 tempEle.documentElement.querySelectorAll("script").forEach(scripts=>{ 6142 if(scripts.type!="application/json" && scripts.type!="application/ld+json"){ 6143 scripts.remove(); 6144 } 6145 }); 6146 processLazyImages(tempEle); 6147 6148 element.innerHTML = tempEle.documentElement.innerHTML; 6149 scriptsEval.documentElement.querySelectorAll("script").forEach(scripts=>{ 6150 if(scripts.type!="application/json" && scripts.type!="application/ld+json"){ 6151 eval(scripts.innerHTML.trim()); 6152 } 6153 }); 6154 element.classList.remove("cont-initial"); 6155 element.querySelectorAll('.xf-cont-lazy:not(.cont-onclick), .mm-component-cont-lazy').forEach(element => { 6156 let observer = revampHeadCustomutils.observeElementIntersection(element,function(){lazyloadHandler(element)},false); 6157 if(element){observer.observe(element)} 6158 }); 6159 6160 initializeLazySliders(element); 6161 initializeLazyComponents(element) 6162 handleLazySpecialCases(element); 6163 6164 6165 } else {
6166 console.error(`Request failed with status ${xhr.status}`); 6167 } 6168 }; 6169 xhr.onerror = () => { 6170 console.error('Network error occurred'); 6171 }; 6172 try { 6173 xhr.send(); 6174 } catch (error) { 6175 console.error('An error occurred during the request:', error); 6176 } 6177 } 6178} 6179 6180function bindAllStoriesLazy() { 6181 try { 6182 const AllStoriesCom = document.querySelector('.story-list-block.prm-all-story-widget'); 6183 const AllStoriesOuter = AllStoriesCom.closest(".mm-component-cont-lazy"); 6184 const AllStoriesUl = AllStoriesCom.querySelector('.cmp-story-list'); 6185 const dataPerPage = AllStoriesCom.getAttribute("data-perpage"); 6186 const dataMaxcount = AllStoriesCom.getAttribute("data-maxcount"); 6187 const maxIteration = Math.ceil(dataMaxcount/dataPerPage); 6188 let currentPage = 1; 6189 let isLoading = false; 6190 let lastLi = AllStoriesUl.lastElementChild; 6191 let itemsWithTimestamp = AllStoriesUl.querySelectorAll(":scope > li.cmp-story-list__item[data-timestamp]"); 6192 let dataTimestamp = itemsWithTimestamp.length > 0 ? itemsWithTimestamp[itemsWithTimestamp.length - 1].getAttribute("data-timestamp") : null; 6193 let lastArticleId = itemsWithTimestamp.length > 0 ? itemsWithTimestamp[itemsWithTimestamp.length - 1].querySelector(".cmp-story-list__item-in").getAttribute("data-itemid") : null; 6194 let observer = revampHeadCustomutils.observeElementIntersection(lastLi,function(){loadNextSetStories()},false); 6195 if(lastLi){observer.observe(lastLi)} 6196 function loadNextSetStories() { 6197 if (isLoading) return; 6198 isLoading = true; 6199 6200 if(currentPage < maxIteration){ 6201 AllStoriesCom.insertAdjacentHTML('beforeend', "<div class='xf-cont-lazy cont-initial'></div>"); 6202 const xhr = new XMLHttpRequest(); 6203 let lazyAllStoryUrl = AllStoriesOuter?.getAttribute("data-lazy-url"); 6204 let esiExt = ".esi.html" 6205 if(lazyAllStoryUrl == null) 6206 { 6207 let authorUrl = new URL(window.location.href); 6208 lazyAllStoryUrl = AllStoriesCom.getAttribute("data-nextpage"); 6209 if(authorUrl.searchParams.has('wcmmode')){ 6210 esiExt = ".html?wcmmode=disabled"; 6211 } 6212 } 6213 let splitPath = ""; 6214 let initPath = ""; 6215 if(lazyAllStoryUrl.includes(".esi.")){ 6216 splitPath = lazyAllStoryUrl.split(".esi.");
6217 initPath = splitPath[0]; 6218 } 6219 else{ 6220 splitPath = lazyAllStoryUrl.split(".html"); 6221 initPath = splitPath[0]; 6222 } 6223 6224 const nextPageUrl = `${initPath}.${dataTimestamp}.${currentPage }.${lastArticleId}.moreallstories${esiExt}`; 6225 6226 xhr.open('GET', nextPageUrl, true); 6227 6228 xhr.onload = function () { 6229 6230 let config = { AllStoriesUl, observer, lastLi, itemsWithTimestamp, dataTimestamp, lastArticleId, currentPage, nextPageUrl, isLoading }; 6231 6232 ({ observer, lastLi, itemsWithTimestamp, dataTimestamp, lastArticleId, currentPage, isLoading } = handleNextResponse(xhr, config)); 6233 6234 }; 6235 6236 xhr.onerror = function () { 6237 console.error('An error occurred while loading the next page.'); 6238 isLoading = false; 6239 }; 6240 6241 xhr.send(); 6242 } 6243 6244 6245 } 6246 6247 } catch (error) { 6248 console.log("error while lazyloading the component",error) 6249 } 6250 6251 6252 function handleNextResponse(xhr, config) { 6253 let { AllStoriesUl, observer, lastLi, itemsWithTimestamp, dataTimestamp, lastArticleId, currentPage, nextPageUrl, isLoading } = config; 6254 if (xhr.status === 200) { 6255 let tempDiv = document.createElement('div'); 6256 tempDiv.innerHTML = xhr.responseText; 6257 tempDiv.querySelectorAll(".lazyload").forEach(lazyLoadItem => { 6258 let lazyLoadItemSrc; 6259 if (screen.width >= 991) { 6260 lazyLoadItemSrc = lazyLoadItem.dataset.websrc; 6261 } 6262 else if (screen.width < 991 & screen.width >= 575) { 6263 lazyLoadItemSrc = lazyLoadItem.dataset.tabsrc; 6264 } 6265 else { 6266 lazyLoadItemSrc = lazyLoadItem.dataset.mobsrc; 6267 } 6268 if (lazyLoadItemSrc) { 6269 lazyLoadItem.classList.remove("lazyload"); 6270 lazyLoadItem.src = lazyLoadItemSrc; 6271 } 6272 }); 6273 6274 let Ulnext = tempDiv.querySelector('ul'); 6275 Ulnext.querySelectorAll('.xf-cont-lazy:not(.cont-onclick), .mm-component-cont-lazy').forEach(element => { 6276 let observer = revampHeadCustomutils.observeElementIntersection(element, function () { lazyloadHandler(element); }, false); 6277 if (element) { observer.observe(element); } 6278 }); 6279 let Lilist = Ulnext.querySelectorAll(':scope > li'); 6280 Lilist.forEach((li) => { 6281 AllStoriesUl.appendChild(li); 6282 }); 6283 //Registers the saved icon event handler and sets up the saved icon indicator for infinite scroll in All Stories 6284 if(typeof addSaveItemsEventListeners === "function"){ 6285 addSaveItemsEventListeners(); 6286 let savedData = JSON.parse(localStorage.getItem("savedItems") || initData); 6287 activateSavedArticlesOnLoad(savedData["addedIds"],"add"); 6288 } 6289 let loader = document.querySelector('.xf-cont-lazy.cont-initial'); 6290 loader.parentNode.removeChild(loader); 6291 observer.unobserve(lastLi); 6292 lastLi = AllStoriesUl.lastElementChild; 6293 itemsWithTimestamp = AllStoriesUl.querySelectorAll(":scope > li.cmp-story-list__item[data-timestamp]"); 6294 dataTimestamp = itemsWithTimestamp.length > 0 ? itemsWithTimestamp[itemsWithTimestamp.length - 1].getAttribute("data-timestamp") : null; 6295 lastArticleId = itemsWithTimestamp.length > 0 ? itemsWithTimestamp[itemsWithTimestamp.length - 1].querySelector(".cmp-story-list__item-in").getAttribute("data-itemid") : null; 6296 6297 observer = revampHeadCustomutils.observeElementIntersection(lastLi, function () { loadNextSetStories(); }, false); 6298 if (lastLi) { observer.observe(lastLi); } 6299 currentPage++; 6300 } else { 6301 console.error(`Failed to load page: ${nextPageUrl}`); 6302 } 6303 isLoading = false; 6304 return { observer, lastLi, itemsWithTimestamp, dataTimestamp, lastArticleId, currentPage, isLoading }; 6305 } 6306}; 6307 6308document.addEventListener('DOMContentLoaded', function () { 6309 if(document.querySelector(".story-list-block.prm-all-story-widget")){ 6310 bindAllStoriesLazy(); 6311 } 6312}); 6313 6314document.addEventListener('DOMContentLoaded', function () { 6315 const headerNavButton = document.querySelector('.cmp-header__section-nav'); 6316 if (headerNavButton) { 6317 setTimeout(hamburgerLazyLoad, 500); 6318 } 6319 function hamburgerLazyLoad() { 6320 const onClickexperienceFragment = document.querySelector('.cont-onclick'); 6321 let firstLoad = true; 6322 let megaMenuInitialized = false; 6323 if (headerNavButton && onClickexperienceFragment) { 6324 const element = document.querySelector('.xf-cont-lazy.cont-onclick'); 6325 if (element) { 6326 const url = element.getAttribute('data-lazy-url'); 6327 if (url) { 6328 const xhr = new XMLHttpRequest(); 6329 xhr.open('GET', url, true); 6330 xhr.onload = () => { 6331 if (xhr.status >= 200 && xhr.status < 300) { 6332 const tempEle = new DOMParser().parseFromString(xhr.responseText, 'text/html'); 6333 tempEle.documentElement.querySelectorAll(".lazyload").forEach(lazyLoadItem => { 6334 let lazyLoadItemSrc; 6335 if (screen.width >= 991) { 6336 lazyLoadItemSrc = lazyLoadItem.dataset.websrc; 6337 } else if (screen.width < 991 && screen.width >= 575) { 6338 lazyLoadItemSrc = lazyLoadItem.dataset.tabsrc; 6339 } else { 6340 lazyLoadItemSrc = lazyLoadItem.dataset.mobsrc; 6341 } 6342 if (lazyLoadItemSrc) { 6343 lazyLoadItem.classList.remove("lazyload"); 6344 lazyLoadItem.src = lazyLoadItemSrc; 6345 } 6346 }); 6347 element.innerHTML = tempEle.documentElement.innerHTML; 6348 tempEle.documentElement.querySelectorAll("script").forEach(script => { 6349 if (script.type !== "application/json" && script.type !== "application/ld+json") { 6350 eval(script.innerHTML.trim()); 6351 } 6352 }); 6353 element.classList.remove("cont-onclick"); 6354 const megaMenu = element.querySelector(".cmp-mega-menu"); 6355 6356 // if (element.querySelector(".cmp-mega-menu.active")) { 6357 utils.storylistMore(); 6358 mmTab(); 6359 megaMenusub(); 6360 mmDropDOwn(); 6361 mmFilter(); 6362 mmFilterSub(); 6363 menuMoreAdjust(); 6364 calcWidth2(); 6365 menuClick(); 6366 modalPopup(); 6367 searchClick(); 6368 headerDropdowns(); 6369 headerDropdownsPosition();
6370 revampHeaderutils.signIn(); 6371 revampHeaderutils.myAccount(); 6372 revampHeaderutils.getUserName(); 6373 revampHeadCustomutils.TemplateThemeChange(); 6374 revampHeadCustomutils.checkSelectedTheme(); 6375 revampHeadCustomutils.changeHeaderBackground(); 6376 revampHeadCustomutils.trackUserClickedContent(); 6377 revampCustomutils.themeLabelClickListener(); 6378 // } 6379 6380 } else { 6381 console.error(`Request failed with status ${xhr.status}`); 6382 } 6383 }; 6384 6385 xhr.onerror = () => { 6386 console.error('Network error occurred'); 6387 }; 6388 xhr.send(); 6389 } 6390 } 6391 }else{ 6392 mmDropDOwn(); 6393 } 6394 } 6395 function mmHamburgerDropDown() { 6396 const megaMenuActive = $('.cmp-mega-menu.active'); 6397 megaMenuActive.find('.open-dropDown[data-target]').click(function (e) { 6398 e.preventDefault(); 6399 e.stopPropagation(); 6400 let $clickedDropdown = $(this); 6401 let dropDownBox = $clickedDropdown.attr('data-target'); 6402 let closestMegaMenu = $clickedDropdown.closest('.cmp-mega-menu'); 6403 if ($clickedDropdown.hasClass("active")) { 6404 $clickedDropdown.removeClass("active"); 6405 closestMegaMenu.find('[data-id=' + dropDownBox + ']').removeClass("active").fadeOut(100); 6406 } else { 6407 closestMegaMenu.find('.open-dropDown').removeClass("active"); 6408 closestMegaMenu.find(".mm-drop-down").removeClass("active").fadeOut(100); 6409 $clickedDropdown.addClass("active"); 6410 closestMegaMenu.find('[data-id=' + dropDownBox + ']').fadeIn(10).delay(100).addClass("active"); 6411 } 6412 }); 6413 $(document).on("click", function () { 6414 megaMenuActive.find(".mm-drop-down").removeClass("active").fadeOut(100); 6415 megaMenuActive.find('.open-dropDown').removeClass("active"); 6416 }); 6417 6418 megaMenuActive.find('.open-dropDown, .mm-drop-down').on("click", function (event) { 6419 event.stopPropagation(); 6420 }); 6421 } 6422}); 6423 6424utils.lclExplore__Width = function () { 6425 $(".lclExplore__nav").each(function () { 6426 let $localthis = $(this); 6427 6428 let localnavwidth = 0; 6429 let localmorewidth = $localthis.find(".lclExplore__navUl .lclExplore__navli--more").outerWidth(true); 6430 $localthis.find(".lclExplore__navUl > li:not(.lclExplore__navli--more)").each(function () { 6431 //localnavwidth += $(this).outerWidth(true); 6432 localnavwidth += $(this).children("a").outerWidth(true) + 5; 6433 }); 6434 //let availablespace = $('nav').outerWidth(true) - localmorewidth; 6435 let localnavavailablespac = $localthis.width() - localmorewidth; 6436 if (localnavwidth > localnavavailablespac) { 6437 let localnavlastItem = $localthis.find(".lclExplore__navUl > li:not(.lclExplore__navli--more)").last(); 6438 localnavlastItem.attr("data-width", localnavlastItem.outerWidth(true)); 6439 localnavlastItem.prependTo($localthis.find(".lclExplore__navUl .lclExplore__navli--more ul")); 6440 $localthis.find(".lclExplore__navUl").addClass("nav-visible"); 6441 utils.lclExplore__Width(); 6442 } else { 6443 $localthis.find(".lclExplore__navUl").addClass("nav-visible"); 6444 let firstMoreElement2 = $localthis.find(".lclExplore__navUl li.lclExplore__navli--more li").first(); 6445 if (localnavwidth + firstMoreElement2.data("width") < localnavavailablespac) { 6446 firstMoreElement2.insertBefore($localthis.find(".lclExplore__navUl .lclExplore__navli--more")); 6447 } 6448 } 6449 6450 if ($localthis.find(".lclExplore__navli--more li").length > 0) { 6451 $localthis.find(".lclExplore__navli--more").css("display", "inline-block"); 6452 $localthis.find(".lclExplore__navUl").addClass("lclExplore__more-menu"); 6453 } else { 6454 $localthis.find(".lclExplore__navli--more").css("display", "none"); 6455 $localthis.find(".lclExplore__navUl").removeClass("lclExplore__more-menu"); 6456 } 6457 }); 6458}; 6459 6460// more menu click 6461utils.lclExplore__moreClick = function () { 6462 function initExploreMenu() { 6463 const isMobile = $(window).width() <= 991; 6464 6465 // Remove any existing handlers 6466 $(".lclExplore__navli-a-more").off("mouseenter mouseleave click"); 6467 $(".lclExplore__navsub-Ul").stop(true, true).hide().removeClass("active"); 6468 $(".lclExplore__navli-a-more").removeClass("active");
6469 $(document).off("click.explore"); 6470 6471 if (isMobile) { 6472 // Mobile behavior - click to toggle 6473 $(".lclExplore__navli-a-more").on("click", function (event) { 6474 event.stopPropagation(); 6475 let $this = $(this); 6476 6477 if ($this.hasClass("active")) { 6478 $this.removeClass("active"); 6479 $this.siblings(".lclExplore__navsub-Ul").removeClass("active").fadeOut(100); 6480 } else { 6481 $(".lclExplore__navli-a-more").removeClass("active"); 6482 $(".lclExplore__navsub-Ul").removeClass("active").fadeOut(100); 6483 $this.addClass("active"); 6484 $this.siblings(".lclExplore__navsub-Ul").fadeIn(10).delay(100).addClass("active"); 6485 } 6486 }); 6487 6488 $(document).on("click.explore", function () { 6489 $(".lclExplore__navli-a-more").removeClass("active"); 6490 $(".lclExplore__navsub-Ul").removeClass("active").fadeOut(100); 6491 }); 6492 } else { 6493 // Desktop behavior - hover to show 6494 $(".lclExplore__navli-a-more") 6495 .on("mouseenter", function () { 6496 $(this).addClass("active"); 6497 $(this).siblings(".lclExplore__navsub-Ul").stop(true, true).fadeIn(10).addClass("active"); 6498 }) 6499 .on("mouseleave", function () { 6500 $(this).removeClass("active"); 6501 $(this).siblings(".lclExplore__navsub-Ul").stop(true, true).fadeOut(150).removeClass("active"); 6502 }); 6503 6504 $(".lclExplore__navsub-Ul") 6505 .on("mouseenter", function () { 6506 $(this).stop(true, true).show().addClass("active"); 6507 }) 6508 .on("mouseleave", function () { 6509 $(this).stop(true, true).fadeOut(150).removeClass("active"); 6510 $(this).siblings(".lclExplore__navli-a-more").removeClass("active"); 6511 }); 6512 } 6513 } 6514 6515 initExploreMenu(); 6516 6517 // Re-initialize on resize 6518 $(window).on("resize", function () { 6519 initExploreMenu(); 6520 }); 6521} 6522 6523 6524// near by news tabs active 6525utils.localExploreTab = function () { 6526 let previousTab = ""; 6527 let xhr; 6528 $(".lclExplore").each(function () { 6529 let localExploretab = $(this); 6530 localExploretab.find(".lclExplore__navUl").closest(".lclExplore__navli:first-child .lclExplore__navli-a").addClass("active"); 6531 localExploretab.find(".lclExplore__tab-item").hide(); 6532 localExploretab.find(".lclExplore__tab-item:first").show().addClass("active"); 6533 // Click function 6534 localExploretab.find(".lclExplore__navli .lclExplore__navli-a").off().on("click", function (e) { 6535 e.preventDefault(); 6536 let $this = $(this); 6537 let $closestParent = $(this).closest(".lclExplore"); 6538 let $tabContent = $closestParent.find(".lclExplore__tab-content"); 6539 if ($tabContent.find("#loading-spinner").length === 0) { 6540 $tabContent.append(`<div id="loading-spinner" style="text-align: center;">Loading...</div>`); 6541 } 6542 let hrefId = $(this).attr("href").slice(1); 6543 if (hrefId !== previousTab) { 6544 previousTab = hrefId; 6545 $closestParent.find(".lclExplore__tab-item").attr("id", hrefId); 6546 $closestParent.find(".lclExplore__navli .lclExplore__navli-a").removeClass("active"); 6547 $this.addClass("active"); 6548 $closestParent.find(".lclExplore__tab-item").hide().removeClass("active"); 6549 let localactiveTab = $this.attr("href"); 6550 let dataUrl = $this.closest(".lclExplore__navli").attr("data-tabUrl"); 6551 if (dataUrl != null) { 6552 xhr = $.ajax({ 6553 type: "GET", 6554 dataType: "html", 6555 url: dataUrl + ".html", 6556 success: function (response) { 6557 let tabList = response; 6558 $tabContent.find("#loading-spinner").remove(); 6559 $closestParent.find(".lclExplore__tab-item").hide().removeClass("active"); 6560 let tempEle = new DOMParser().parseFromString(tabList, "text/html"); 6561 processLazyImages(tempEle); 6562 $closestParent.find(".lclExplore__tab-item").html(tempEle.documentElement.innerHTML); 6563 console.log('length====' + $closestParent.length) 6564 $(localactiveTab).fadeIn().addClass("active"); 6565 if(typeof addSaveItemsEventListeners === "function"){ 6566 addSaveItemsEventListeners(); 6567 let savedData = JSON.parse(localStorage.getItem("savedItems") || initData); 6568 activateSavedArticlesOnLoad(savedData["addedIds"],"add"); 6569 } 6570 6571 }, 6572 error: function () { 6573 $tabContent.find("#loading-spinner").remove(); 6574 $tabContent.html("<p style='text-align: center; color: red;'>Failed to load content.</p>"); 6575 } 6576 }); 6577 } else { 6578 $(".lclExplore__tab-item").html(""); 6579 } 6580 } else { 6581 xhr.abort(); 6582 } 6583 return false;
6584 }); 6585 }); 6586}; 6587 6588// UGC click 6589utils.localUGcmodule = function () { 6590 $(".lclUgcMdle__btn-block").on("click", function () { 6591 let $loclUgeblock = $(this).closest(".lclUgcMdle"); 6592 6593 if ($loclUgeblock.hasClass("active")) { 6594 $loclUgeblock.removeClass("active"); 6595 } else { 6596 $loclUgeblock.addClass("active"); 6597 } 6598 }); 6599 6600 $(document).on("click", function () { 6601 $(".lclUgcMdle").removeClass("active"); 6602 }); 6603 $(".lclUgcMdle__btn-block").on("click", function (event) { 6604 event.stopPropagation(); 6605 }); 6606}; 6607 6608utils.exploreTab = function () { 6609 utils.lclExplore__Width(); 6610 utils.lclExplore__moreClick(); 6611 utils.localExploreTab(); 6612}; 6613 6614$(document).ready(function () { 6615 utils.exploreTab(); 6616 utils.localUGcmodule(); 6617 utils.artcleSimpleslider(); 6618 6619 $(window).on("resize load", function () { 6620 utils.lclExplore__Width(); 6621 }); 6622}); 6623 6624/* On click listener for listing saved button */ 6625$(".mm-emj-btn").off("click").on("click", async function() { 6626 let $btn = $(this); 6627 let $container = $btn.closest(".obt-lst-blk__body"); 6628 let isVictory = $container.hasClass("victory-lst-blk__body"); 6629 if (!$btn.hasClass("liked")) { 6630 const listItem = $(this).closest(".obt-lst-blk__li"); 6631 const articleId = listItem.attr("data-itemid"); 6632 const obitFormattedDate = listItem.attr("data-createddate"); 6633 const articleData = { id: articleId, obitFormattedDate }; 6634 6635 const isLoggedIn = typeof revampHeaderutils !== 'undefined' ? revampHeaderutils.isLoggedIn() : true; 6636 if (!isLoggedIn) { 6637 if (typeof ssoIn !== 'undefined') ssoIn(false, signInValue); 6638 } 6639 6640 await handleEventReactData($btn, articleData, isLoggedIn,isVictory,$container); 6641 6642 } 6643 6644}); 6645 6646const handleEventReactData = async (thisObj, articleData, isLoggedIn,isVictory,$container) => { 6647 const newItem = isVictory ? "victoryNewItem" : "obitNewItem"; 6648 const form = new FormData(); 6649 form.append("postId", articleData.id); 6650 form.append("postDate", articleData.obitFormattedDate); 6651 if (reactConfig.obitDistrict) form.append("district", reactConfig.obitDistrict); 6652 6653 if (isLoggedIn) { 6654 handleFeChanges(articleData,isVictory,$container); 6655 thisObj.addClass("liked"); 6656 } else { 6657 localStorage.setItem(newItem, JSON.stringify(articleData)); 6658 } 6659 const saveAPIUrl = isVictory ? reactConfig.victorySaveAPIUrl : reactConfig.obitSaveAPIUrl; 6660 await saveObitReaction(articleData, form, isLoggedIn, saveAPIUrl,$container); 6661 6662}; 6663const handleFeChanges = (articleData,isVictory,$container) => { 6664 const prefix = isVictory ? "victory" : "obit" ; 6665 const appDataUpdatedat = `${prefix}AppdataUpdatedat`; 6666 const appData = `${prefix}Appdata`; 6667 const votedIds = `${prefix}VotedIds`; 6668 let obitAppdata = JSON.parse(localStorage.getItem(appData)) || [{}]; 6669 let postToUpdate = {}; 6670 obitAppdata.some(item => { 6671 const reactions = item.reactPostCountDetails || obitAppdata; 6672 if (Array.isArray(reactions)) { 6673 6674 postToUpdate = reactions.find(post => post.postId === articleData.id); 6675 if(postToUpdate){ 6676 return true 6677 } 6678 return false; 6679 6680 } 6681 }); 6682 6683 if (postToUpdate) { 6684 postToUpdate.voteCount = postToUpdate.voteCount + 1; 6685 console.log(`Updated voteCount for postId: ${articleData.id} to ${postToUpdate.voteCount}`); 6686 } 6687 else { 6688 let newItem = { 6689 "postId": articleData.id, 6690 "voteCount": 1 6691 } 6692 let reactions = obitAppdata[0].reactPostCountDetails || obitAppdata; 6693 reactions.push(newItem); 6694 } 6695 localStorage.setItem(appData, JSON.stringify(obitAppdata)); 6696 let obitVotedIds = JSON.parse(localStorage.getItem(votedIds)) || []; 6697 obitVotedIds.push(articleData.id); 6698 localStorage.setItem(votedIds, JSON.stringify(obitVotedIds)); 6699 localStorage.setItem(appDataUpdatedat, Date.now()); 6700 6701 const typeLabel = isVictory ? "victory" : "obituary"; 6702 updateObitReactionCounts(reactConfig, typeLabel,$container); 6703 6704}; 6705const saveObitReaction = async (articleData, form,isLoggedIn,reactSaveapi,$container) => { 6706 const [token,uId] = getTokenAndUId(); 6707 return new Promise( (resolve, reject) => { 6708 if (token === null) { 6709 return resolve(0); 6710 } 6711 6712 $.ajax({ 6713 url: reactSaveapi, 6714 type: "POST", 6715 data: form, 6716 contentType: false, 6717 processData: false, 6718 mimeType: "multipart/form-data", 6719 headers: { 6720 Authorization: 'Bearer ' + token, 6721 }, 6722 success: function(res) { 6723 console.log("success", uId); 6724 console.log("response", res); 6725 if (!isLoggedIn) { 6726 handleFeChanges(articleData,isVictory,$container); 6727 thisObj.addClass("liked"); 6728 } 6729 6730 return resolve(1); 6731 }, 6732 error: function(err) { 6733 console.log('Response Text:', err); 6734 return resolve(0); 6735 } 6736 }) 6737 } 6738 ); 6739} 6740; 6741const updateObitReactionCounts = async (reactConfig,type,$container) => { 6742 try { 6743 const prefix = type === "obituary" ? "obit" : "victory"; 6744 const newItem = `${prefix}NewItem`; 6745 const appDataUpdatedat = `${prefix}AppdataUpdatedat`; 6746 const appData = `${prefix}Appdata`; 6747 const votedIds = `${prefix}VotedIds`; 6748 const reactNewItem = JSON.parse(localStorage.getItem(newItem)); 6749 const retrieveAPIUrl = type === "obituary" ? reactConfig.obitRetrieveAPIUrl : reactConfig.victoryRetrieveAPIUrl ; 6750 const shareAPIUrl = type === "obituary" ? reactConfig.obitShareAPIUrl : reactConfig.victoryShareAPIUrl ; 6751 6752 let isLoggedIn = revampHeaderutils.isLoggedIn(); 6753 6754 if (reactNewItem != null && isLoggedIn) { 6755 let form = new FormData(); 6756 form.append("postId", reactNewItem.id); 6757 form.append("postDate", reactNewItem.obitFormattedDate); 6758 if (reactConfig.obitDistrict){ 6759 form.append("district", reactConfig.obitDistrict); 6760 } 6761 localStorage.removeItem(newItem); 6762 const isVictory = type !== "obituary"; 6763 const saveAPIUrl = isVictory ? reactConfig.victorySaveAPIUrl : reactConfig.obitSaveAPIUrl; 6764 await saveObitReaction(reactNewItem, form, isLoggedIn,saveAPIUrl,$container); 6765 handleFeChanges(reactNewItem,isVictory,$container); 6766 } 6767 const obitAppdataUpdatedat = localStorage.getItem(appDataUpdatedat); 6768 let data = {} 6769 if ((Date.now() - obitAppdataUpdatedat) > 60 * 1000) { 6770 const response = await fetch(retrieveAPIUrl); 6771 if (!response.ok) { 6772 throw new Error(`HTTP error! status: ${response.status}`); 6773 } 6774 data = await response.json(); 6775 const objectString = JSON.stringify(data); 6776 localStorage.setItem(appData, objectString); 6777 } else { 6778 data = JSON.parse(localStorage.getItem(appData)); 6779 } 6780
6781 const postVoteCountsMap = new Map(); 6782 let obitVotedIds = JSON.parse(localStorage.getItem(votedIds)); 6783 6784 data.forEach(item => { 6785 const reactions = item.reactPostCountDetails || [item]; 6786 reactions.forEach(detail => { 6787 6788 postVoteCountsMap.set(detail.postId, detail.voteCount); 6789 if (obitVotedIds?.includes(detail.postId)) { 6790 $(`[data-itemid='${detail.postId}'] .mm-emj-btn`).addClass("liked"); 6791 } 6792 6793 6794 }); 6795 }); 6796 6797 postVoteCountsMap.forEach( (voteCount, postId) => { 6798 const $listItem = $(`.obt-lst-blk__li[data-itemid='${postId}']`); 6799 6800 if ($listItem.length) { 6801 $listItem.find(".mm-emj-btn .mm-obt-btn__text").text(voteCount); 6802 $listItem.addClass("obitUpdated"); 6803 } 6804 } 6805 ); 6806 6807 $container.find(".obt-lst-blk__li:not(.obitUpdated)").each(async function() { 6808 6809 $(this).find(".mm-emj-btn .mm-obt-btn__text").text(0); 6810 6811 }); 6812 6813 } catch (error) { 6814 console.error("Error fetching or processing reaction data:", error); 6815 } 6816}; 6817 6818 6819const reactConfig = { 6820 obitRetrieveAPIUrl: "", 6821 obitSaveAPIUrl: "", 6822 obitShareAPIUrl: "", 6823 victoryRetrieveAPIUrl: "", 6824 victorySaveAPIUrl: "", 6825 victoryShareAPIUrl: "", 6826 obitDistrict: "" 6827}; 6828document.addEventListener("DOMContentLoaded", function(e) { 6829 let $obitBody = $(".obt-lst-blk__body").not(".victory-lst-blk__body"); 6830 let $victoryBody = $(".victory-lst-blk__body"); 6831 6832 reactConfig.obitRetrieveAPIUrl = $obitBody.attr("data-reactretrieveapi"); 6833 reactConfig.obitSaveAPIUrl = $obitBody.attr("data-reactsaveapi"); 6834 reactConfig.obitShareAPIUrl = $obitBody.attr("data-reactShareApi"); 6835 6836 reactConfig.victoryRetrieveAPIUrl = $victoryBody.attr("data-reactretrieveapi"); 6837 reactConfig.victorySaveAPIUrl = $victoryBody.attr("data-reactsaveapi"); 6838 reactConfig.victoryShareAPIUrl = $victoryBody.attr("data-reactShareApi"); 6839 const districtSelect = document.getElementById('obituaryDistrictSelect') 6840 if (districtSelect) { 6841 for (const option of districtSelect.options) { 6842 const landingPage = option.getAttribute('data-obituary-landingpage'); 6843 if (landingPage?.includes(window.location.pathname)) { 6844 reactConfig.obitDistrict = option.text; 6845 break; 6846 } 6847 } 6848 6849 } 6850 if($obitBody.length > 0) updateObitReactionCounts(reactConfig,"obituary",$obitBody); 6851 6852 if($victoryBody.length > 0) updateObitReactionCounts(reactConfig,"victory",$victoryBody); 6853 6854}); 6855 6856$(document).on("click", '.open-modal[data-target="shareModelObitLst"]', function () { 6857 let $obtBlock = $(this).closest(".obt-lst-blk__in"); 6858 let fragmentName = $obtBlock.data("fragment-name"); 6859 let encodedUrl = $obtBlock.data("fragment-encodedurl"); 6860 6861 $("#email-share a").attr("href", `mailto:?subject=${fragmentName}&body=${encodeURIComponent(fragmentName)} ${encodedUrl}`); 6862 $("#facebook-share a").attr("href", `https://www.facebook.com/share.php?u=${encodedUrl}`); 6863 $("#twitter-share a").attr("href", `https://twitter.com/share?text=${fragmentName}&url=${encodedUrl}`); 6864 $("#whatsapp-share a").attr("href", `https://api.whatsapp.com/send?text=${fragmentName}%20${encodedUrl}`); 6865 $("#linkedin-share a").attr("href", `https://www.linkedin.com/shareArticle?mini=true&url=${encodedUrl}&title=${fragmentName}&summary=`); 6866 $("#telegram-share a").attr("href", `https://telegram.me/share/url?url=${encodedUrl}&text=${fragmentName}`); 6867 $("#reddit-share a").attr("href", `https://www.reddit.com/submit?url=${encodedUrl}&title=${fragmentName}`); 6868}); 6869
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.