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 932function scroll_down(val) { 933 const current = $('#' + val); 934 const listID = current.attr('id'); 935 current.css({ 936 'opacity': '0' 937 }); 938 $('#' + listID + ':not(:animated)').animate({ 939 'top': parseInt(current.css('top')) - current.find('li').outerHeight() - 10 940 }, 500, function () { 941 let cars = current.find('li'); 942 cars.last().before(cars.first()); 943 current.css({ 944 'top': '0px', 945 'opacity': '1' 946 }); 947 }); 948} 949utils.articleGallery = function () { 950 $('.cmp-list-gallery a').simpleLightbox({ 951 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>'], 952 closeText: 'Ã', 953 className: 'cmp-list-gallery__lightbox', 954 widthRatio: 1, 955 captions: true, 956 captionPosition: 'bottom', 957 captionDelay: .3, 958 }); 959} 960utils.articleSlider = function () { 961 $('.cmp-article-slider__large').slick({ 962 asNavFor: '.cmp-article-slider__thumb', 963 centerPadding: '0px', 964 infinite: false, 965 slidesToShow: 1, 966 slidesToScroll: 1, 967 dots: false, 968 969 prevArrow: '<button class="slide-arrow prev-arrow"><i class="mm-icon mm-icon__arrow-right-lg"></i> </button>', 970 nextArrow: '<button class="slide-arrow next-arrow"><i class="mm-icon mm-icon__arrow-left-lg"></i> </button>', 971 }); 972 $('.cmp-article-slider__thumb').slick({ 973 slidesToShow: 4, 974 slidesToScroll: 1, 975 centerPadding: '40px', 976 asNavFor: '.cmp-article-slider__large', 977 infinite: false, 978 dots: false, 979 focusOnSelect: true, 980 prevArrow: '<button class="cmp-article-slider__thumb-arrow prev-arrow"><i class="mm-icon mm-icon__arrow-right-lg"></i> </button>', 981 nextArrow: '<button class="cmp-article-slider__thumb-arrow next-arrow"><i class="mm-icon mm-icon__arrow-left-lg"></i> </button>', 982 responsive: [{ 983 breakpoint: 576, 984 settings: { 985 slidesToShow: 3, 986 slidesToScroll: 1, 987 } 988 }, ] 989 }); 990} 991utils.storylistMore = function () { 992 $('.cmp-story-list__control-btn--more-menu').on("click", function () { 993 const $storylistMore = $(this).closest('.cmp-story-list__control-li').find(".cmp-story-list__drop-down"); 994 if ($storylistMore.hasClass("active")) { 995 $storylistMore.removeClass("active").fadeOut(100); 996 } else { 997 $(".cmp-story-list__drop-down").removeClass("active").fadeOut(100); 998 $storylistMore.fadeIn(100).delay(100).addClass("active"); 999 } 1000 }); 1001 $(document).on("click", function () { 1002 $(".cmp-story-list__drop-down").removeClass("active").fadeOut(100); 1003 }); 1004 $('.cmp-story-list__control-btn--more-menu, .cmp-story-list__drop-down').on("click", function (event) { 1005 event.stopPropagation(); 1006 }); 1007} 1008utils.fullwidtharticle = function () { 1009 if ($(window).width() > 768 && $(' .cmp-fullwidth-image-block, .article-gallery-wrapper').length >= 1) { 1010 1011 const fullcontinerMargin = ($(window).width() - $('.article-body__content-top').width()) / 2; 1012 $('.article-body .cmp-fullwidth-image-block, .article-body .article-gallery-wrapper').css({ 1013 "margin-left": -fullcontinerMargin, 1014 "margin-right": -fullcontinerMargin 1015 }); 1016 1017 } else { 1018 $('.article-body .cmp-fullwidth-image-block, .article-body .article-gallery-wrapper').removeAttr('style'); 1019 } 1020} 1021utils.artcleSimpleslider = function () { 1022 $('.cmp-simple-slider-block__main').not('.slick-initialized').slick({ 1023 dots: false, 1024 lazyLoad: 'ondemand', 1025 autoplay: true, 1026 autoplaySpeed: 3000, 1027 fade: true, 1028 cssEase: 'linear', 1029 slidesToShow: 1, 1030 slidesToScroll: 1, 1031 infinite: false, 1032 arrows: true, 1033 pauseOnHover: false, 1034 pauseOnFocus: false, 1035 prevArrow: '<button class="slide-arrow prev-arrow"><i class="mm-icon mm-icon__arrow-right-lg"></i> </button>', 1036 nextArrow: '<button class="slide-arrow next-arrow"><i class="mm-icon mm-icon__arrow-left-lg"></i> </button>', 1037 }); 1038 // swipe : false 1039 $('.cmp-simple-slider-block__main').slick('slickPlay'); 1040 } 1041// popup image Height set 1042 utils.mmpopgalleryHeight = function() { 1043 const popwindowHeight = $(window).height(); 1044 $('.cmp-gallery-block__popup-item').each(function () { 1045 if ($(window).width() >= 991) { 1046 1047 const popimgheight = (popwindowHeight - 20); 1048
1049 $('.cmp-gallery-block__popup-details').css({ 1050 "height": popimgheight 1051 }); 1052 } 1053 else{ 1054 const popimgheight2 = (popwindowHeight - 55); 1055 $('.cmp-gallery-block__popup-details').css({ 1056 "height": popimgheight2 1057 }); 1058 1059 } 1060 1061 }); 1062 } 1063 utils.mmPopupgallery = function () { 1064 $('.cmp-gallery-block').each(function(){ 1065 const $thisGallery = $(this); 1066 $(this).find('.cmp-gallery-block__open').on("click", function () { 1067 $thisGallery.find('.cmp-gallery-block__popup').fadeIn(200); 1068 $thisGallery.find('.cmp-gallery-block__popup-slider').slick({ 1069 lazyLoad: 'ondemand', 1070 centerPadding: '20px', 1071 infinite: false, 1072 slidesToShow: 1, 1073 slidesToScroll: 1, 1074 dots: false, 1075 prevArrow: '<button class="slide-arrow slick-custom-arrow slick-prev"><i class="mm-icon mm-white-icon mm-icon__arrow-right-sm"></i> </button>', 1076 nextArrow: '<button class="slide-arrow slick-custom-arrow slick-next"><i class="mm-icon mm-white-icon mm-icon__arrow-left-sm"></i> </button>' 1077 }); 1078 $('body').addClass("overflow-hidden"); 1079 }); 1080 1081 1082 1083 1084 $thisGallery.find('.cmp-gallery-block__item:nth-child(2) .cmp-gallery-block__open').click(function(){ 1085 const slider = $thisGallery.find( '.cmp-gallery-block__popup-slider' ); 1086 slider[0].slick.slickGoTo(parseInt(1)); 1087 }); 1088 $thisGallery.find('.cmp-gallery-block__item:nth-child(3) .cmp-gallery-block__open').click(function(){ 1089 const slider = $thisGallery.find( '.cmp-gallery-block__popup-slider' ); 1090 slider[0].slick.slickGoTo(parseInt(2)); 1091 }); 1092 1093 1094 1095 // close gallery 1096 $thisGallery.find('.cmp-gallery-block__popup-close').on("click", function () { 1097 $thisGallery.find('.cmp-gallery-block__popup').fadeOut(200); 1098 $('body').removeClass("overflow-hidden"); 1099 $thisGallery.find('.cmp-gallery-block__popup-slider').slick('unslick'); 1100 }); 1101 $thisGallery.find('.cmp-gallery-block__popup-info').on("click", function(){ 1102 $(this).closest('.cmp-gallery-block').toggleClass("galleryDispnhide"); 1103 }); 1104 1105 }); 1106 1107 } 1108 1109 1110 utils.backtoTop = function () { 1111 1112 1113 1114 $('.back-to-top-button').on("click", function(){ 1115 $("html, body").animate({scrollTop: 0}, 1000); 1116 1117 }); 1118 1119 1120 // back button postion set 1121 let lastBackScrollTop = 0; 1122 1123$(window).scroll(function(event){ 1124 const st = $(this).scrollTop(); 1125 if (st > lastBackScrollTop || st < $(window).height() ){ 1126 1127 $('.backto-top').addClass('scrolling_down'); 1128 $('.backto-top').removeClass('active scrolling_up'); 1129 $('.backto-top').removeAttr("style") 1130 } else { 1131 $('.backto-top').addClass('active scrolling_up'); 1132 $('.backto-top').removeClass(' scrolling_down'); 1133 } 1134 lastBackScrollTop = st; 1135}); 1136 1137 1138 1139 1140 } 1141 1142 1143 function authorTabactive(){ 1144 if ($(window).width() < 992) { 1145 1146 1147 1148 const resultnvscrollpostion = $('.author-results .cmp-resulttab-block__nav-li.active').offset().left; 1149 $(".author-results .cmp-resulttab-block__nav-ul").scrollLeft(resultnvscrollpostion); 1150 1151$('.author-results .cmp-resulttab-block__nav-li a').on("click", function(){ 1152 const rstclcikpst = $(this).offset().left; 1153 const rstclcikwidth = $(this).outerWidth(); 1154 const rstclcikpstwidth = $(window).width()/2; 1155 1156 if(rstclcikpst > rstclcikpstwidth){ 1157 $(".author-results .cmp-resulttab-block__nav-ul").scrollLeft(rstclcikpst + rstclcikwidth); 1158 } 1159 else if(rstclcikpst < rstclcikpstwidth){ 1160 $(".author-results .cmp-resulttab-block__nav-ul").scrollLeft(rstclcikpst); 1161 } 1162 }); 1163 } 1164 1165} 1166 1167$(function () { 1168 mmTab(); 1169 megaMenusub(); 1170 // mmDropDOwn(); 1171 mmFilter(); 1172 mmFilterSub(); 1173 themechange(); 1174 menuMoreAdjust(); 1175 calcWidth2(); 1176 1177 headerDropdowns(); 1178 headerDropdownsPosition(); 1179 menuClick(); 1180 searchClick(); 1181 modalPopup(); 1182 utils.bannerfourstorySlider(); 1183 utils.singleSlider(); 1184 utils.fourClmSlider(); 1185 utils.vslShrtsSlider(); 1186 utils.threeClmSlider(); 1187 utils.leftClmSlider();
1188 utils.fullwidthBackground(); 1189 utils.daypitcurecontent(); 1190 utils.gameSlider(); 1191 utils.mobileNavarrow(); 1192 utils.scorecardwidth(); 1193 utils.imageBlockSlider(); 1194 utils.singleCommonSlider(); 1195 utils.storylistMore(); 1196 scorcardGoalinfo(); 1197 utils.bannerSlider(); 1198 utils.backtoTop(); 1199 // article page 1200 callQRNotifications(); 1201}); 1202$(window).on('resize load', function () { 1203 headerDropdownsPosition(); 1204 menuMoreAdjust(); 1205 calcWidth2(); 1206 utils.fullwidthBackground(); 1207 utils.scorecardwidth(); 1208}); 1209$(window).scroll(function () { 1210 1211 headerDropdownsPosition(); 1212}); 1213class ObituaryBlock { 1214 constructor() { 1215 this.obitDate = document.querySelector(".cmp-obituary-block__date"); 1216 this.selectedDistrict = document.getElementById("obituaryDistrictSelect"); 1217 1218 // if (this.obitDate) { 1219 // this.updateObitDate(); 1220 // } 1221 1222 if (this.selectedDistrict) { 1223 this.selectedDistrict.addEventListener("change", () => { 1224 this.handleDistrictChange(); 1225 }); 1226 } 1227 } 1228 1229 updateObitDate() { 1230 const currentDate = new Date(); 1231 const day = currentDate.getDate().toString().padStart(2, '0');
1232 const month = (currentDate.getMonth() + 1).toString().padStart(2, '0'); 1233 const year = currentDate.getFullYear(); 1234 1235 const formattedDate = `${day}-${month}-${year}`; 1236 this.obitDate.innerHTML = formattedDate; 1237 } 1238 1239 handleDistrictChange() { 1240 const selectedOption = this.selectedDistrict.options[this.selectedDistrict.selectedIndex]; 1241 const landingPageUrl = selectedOption.getAttribute("data-obituary-landingpage"); 1242 const linkTarget = selectedOption.getAttribute("data-obituary-linktarget"); 1243 1244 if (landingPageUrl) { 1245 if (/iPhone|iPad|iPod|Android/i.test(navigator.userAgent)) { 1246 const hiddenLink = document.createElement("a"); 1247 hiddenLink.style.display = "none"; 1248 hiddenLink.target = "_top"; 1249 const selectElement = document.getElementById("obituaryDistrictSelect"); 1250 selectElement.parentNode.insertBefore(hiddenLink, selectElement.nextSibling); 1251 hiddenLink.href = landingPageUrl; 1252 hiddenLink.click(); 1253 } else if (linkTarget === "_blank") { 1254 window.parent.open(landingPageUrl, "_blank"); 1255 } else { 1256 window.parent.location.href = landingPageUrl; 1257 } 1258 } 1259 } 1260} 1261 1262const obituaryBlock = new ObituaryBlock(); 1263 1264// Auto select district from obituary dropdown 1265document.addEventListener('DOMContentLoaded', () => { 1266 const selectElement = document.getElementById('obituaryDistrictSelect'); 1267 if (selectElement) { 1268 const currentPath = window.location.pathname; 1269 let match = false; 1270 1271 for (const option of selectElement.options) { 1272 const landingPage = option.getAttribute('data-obituary-landingpage'); 1273 if (landingPage && landingPage.includes(currentPath)) { 1274 option.defaultSelected = true; 1275 option.selected = true; 1276 option.disabled = true; 1277 match = true; 1278 break; 1279 } 1280 } 1281 1282 if (match) { 1283 for (const option of selectElement.options) { 1284 if (option.label !== selectElement.selectedOptions[0].label && option.defaultSelected) { 1285 option.defaultSelected = false; 1286 option.selected = false; 1287 option.disabled = false; 1288 } 1289 } 1290 } 1291 } 1292}); 1293 1294 1295function MMEditorSearch(c,dId,iwrap) { 1296 function m() { 1297 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"); 1298 return a 1299 } 1300 void 0 == c.getAttribute("data-language") || c.getAttribute("data-language"); 1301 var v = void 0 == c.getAttribute("data-keyboard") ? "malayalaminscript" : c.getAttribute("data-keyboard"); 1302 void 0 == c.getAttribute("toolbar") || 1303 c.getAttribute("toolbar"); 1304 //var w = void 0 == c.getAttribute("height") ? " " : c.getAttribute("height"), 1305 // x = void 0 == c.getAttribute("width") ? " " : c.getAttribute("width"); 1306 void 0 == c.getAttribute("css") || c.getAttribute("css"); 1307 var q = void 0 == c.getAttribute("data-font-family") ? "" : c.getAttribute("data-font-family"); 1308 void 0 == c.getAttribute("headline") || c.getAttribute("headline"); 1309 var n = document.createElement("div"); 1310 n.setAttribute("id", iwrap); 1311 var h = document.querySelector('#'+dId+' input'); 1312 h.focus(); 1313 var malPlaceHold = h.getAttribute("data-mlplacehold") || "à´àµà´µàµà´¡àµà´àµ¾, തലà´àµà´àµà´àµà´àµà´àµ¾ à´®àµà´¤à´²à´¾à´¯à´µ തിരയàµà´"; 1314 //h.setAttribute("type", "text"); 1315 h.setAttribute("placeholder", malPlaceHold); 1316 //alert("inside mm editor"); 1317 h.setAttribute("id", "searchMalText"); 1318 //h.setAttribute("class", cl); 1319 h.setAttribute("onclick", "event.stopPropagation()"); 1320 //h.style.fontSize = y + "px"; 1321 "" != q && (h.style.fontFamily = q); 1322 var b = this; 1323 this.textEditor = h; 1324 b.Languages = []; 1325 b.Encodings = []; 1326 b.Keyboards = []; 1327 b.conjuncts = [];
1328 b.AlternateKeyBoatdDetails = []; 1329 b.elem = h; 1330 this.LangList = []; 1331 this.KeyboardsDetails = []; 1332 b.chatType = []; 1333 b.languagePosition = []; 1334 b.toggle = !1; 1335 b.CTRL = 0; 1336 b.ALT = 0; 1337 this.inputText = ""; 1338 this.textEditor.onkeydown = function (a) { 1339 a = b.getKeyCode(a); 1340 String.fromCharCode(a).bold = !0; 1341 window.event || 17 != a || (b.CTRL = a); 1342 18 == a && (b.ALT = a); 1343 "Safari" === m() && 91 === a && (b.COMMAND = a); 1344 switch (a) { 1345 case 119: 1346 b.toggle = b.toggle ? !1 : !0 1347 } 1348 }; 1349 this.textEditor.onkeypress = function (a) { 1350 var d = b.getKeyCode(a); 1351 if ("Netscape" == window.navigator.appName && 26 == d && 0 <= window.navigator.vendor.indexOf("Google")) undoChromeSafari(b.elem); 1352 else if(!window.event && 17 == b.CTRL){ 1353 if(115 === d){ 1354 b.CTRL = 0; 1355 } 1356 } 1357 else if (!("Safari" === m() && 0 < b.COMMAND)) switch (d) { 1358 case 9: 1359 case 27: 1360 case 0: 1361 case 16: 1362 break; 1363 case 8: 1364 break; 1365 case 13: 1366 return !0; 1367 default: 1368 var keyboardType = v; 1369 var f = b.KeyboardsDetails()[keyboardType.toLowerCase()]; 1370 1371 if (void 0 == f) { 1372 console.log("KeyBoard for " + keyboardType + " is undefined"); 1373 return !1; 1374 } 1375 d = String.fromCharCode(d); 1376 f = f[d]; 1377 if (void 0 == f) break; 1378 b.toggle && (f = d); 1379 b.insertAtCursorPosition(b.elem, f); 1380 b.setConjuncts(b.elem, f, keyboardType); 1381 let elem = b.elem; 1382 if(document.selection){ 1383 elem.focus(); 1384 b.textEditor.focus(); 1385 document.selection.createRange().parentElement(); 1386 } 1387 1388 1389 return !1 1390 } 1391 }; 1392 this.textEditor.onkeyup = function (a) { 1393 a = b.getKeyCode(a); 1394 window.event || 17 != a || (b.CTRL = 0); 1395 "Safari" === m() && 0 < b.COMMAND && (b.COMMAND = 0); 1396 console.log(String.fromCharCode(a)); 1397 return !1 1398 }; 1399 this.getKeyCode = function (a) { 1400 if (a) return a.which; 1401 if (window.event) return window.event.keyCode 1402 }; 1403 this.getEventSource = function (a) { 1404 if (a) return a.target; 1405 if (window.event) return window.event.srcElement 1406 }; 1407 this.cancelEvent = function (a) { 1408 if (a) { 1409 a.preventDefault(); 1410 a.stopPropagation(); 1411 } 1412 1413 window.event && 1414 (window.event.returnValue = !1) 1415 }; 1416 var r, s, t, u; 1417 t = { 1418 "!": "!", 1419 '"': "\u2019", 1420 "#": "#", 1421 $: "$", 1422 "%": "%", 1423 "&": "&", 1424 "'": "\u2018", 1425 "(": "(", 1426 ")": ")", 1427 "*": "*", 1428 "+": "+", 1429 "-": "\u2013", 1430 ".": ".", 1431 "/": "/", 1432 0: "0", 1433 1: "1", 1434 2: "2", 1435 3: "3", 1436 4: "4", 1437 5: "5", 1438 6: "6", 1439 7: "7", 1440 8: "8", 1441 9: "9", 1442 ":": ":", 1443 ";": ";", 1444 "<": "<", 1445 "=": "=", 1446 ">": ">", 1447 "?": "?", 1448 "@": "@", 1449 A: "\u0d06", 1450 B: "\u0d2c\u0d4d", 1451 C: "\u0d15\u0d4d", 1452 D: "\u0d21\u0d4d", 1453 E: "\u0d0f", 1454 F: "\u0d2b\u0d4d", 1455 G: "\u0d17\u0d4d\u0d17\u0d4d", 1456 H: "\u0d03", 1457 I: "\u0d08", 1458 J: "\u0d1c\u0d4d\u0d1c\u0d4d", 1459 K: "\u0d15\u0d4d\u200c\u200c", 1460 L: "\u0d33\u0d4d", 1461 M: "\u0d02", 1462 N: "\u0d23\u0d4d", 1463 O: "\u0d13", 1464 P: "\u0d2a\u0d4d", 1465 Q: "\u0d15\u0d4d", 1466 R: "\u0d31\u0d4d", 1467 S: "\u0d36\u0d4d", 1468 T: "\u0d1f\u0d4d", 1469 U: "\u0d0a", 1470 V: "\u0d35\u0d4d", 1471 W: "\u0d35\u0d4d", 1472 X: "\u0d15\u0d4d\u0d37\u0d4d", 1473 Y: "\u0d2f\u0d4d", 1474 Z: "\u0d1c\u0d4d", 1475 "[": "[", 1476 "\\": "", 1477 "]": "]", 1478 "^": "^", 1479 _: "_", 1480 "`": "\u20a8", 1481 a: "\u0d05", 1482 b: "\u0d2c\u0d4d", 1483 c: "\u0d15\u0d4d\u200c", 1484 d: "\u0d26\u0d4d", 1485 e: "\u0d0e", 1486 f: "\u0d2b\u0d4d", 1487 g: "\u0d17\u0d4d", 1488 h: "\u0d39\u0d4d", 1489 i: "\u0d07", 1490 j: "\u0d1c\u0d4d", 1491 k: "\u0d15\u0d4d", 1492 l: "\u0d32\u0d4d", 1493 m: "\u0d2e\u0d4d", 1494 n: "\u0d28\u0d4d", 1495 o: "\u0d12", 1496 p: "\u0d2a\u0d4d", 1497 q: "\u0d15\u0d4d", 1498 r: "\u0d30\u0d4d", 1499 s: "\u0d38\u0d4d", 1500 t: "\u0d31\u0d4d\u0d31\u0d4d", 1501 u: "\u0d09", 1502 v: "\u0d35\u0d4d", 1503 w: "\u0d35\u0d4d", 1504 x: "\u0d15\u0d4d\u0d38\u0d4d", 1505 y: "\u0d2f\u0d4d", 1506 z: "\u0d1c\u0d4d\u200c", 1507 "{": "{", 1508 "|": "", 1509 "}": "}", 1510 "~": "~", 1511 " ": " " 1512 }; 1513 s = { 1514 "\u0003\u0d05": "\u0d3e:1", 1515 "\u0003\u0d07": "\u0d48:1", 1516 "\u0003\u0d09": "\u0d57:1", 1517 "\u0003\u0d3f\u0d07": "\u0d40:2", 1518 "\u0003\u0d41\u0d09": "\u0d42:2", 1519 "\u0d4d\u0d05": ":2", 1520 "\u0d4d\u200c\u0d05": ":3", 1521 "\u0d4d\u200c\u200c\u0d06": "\u0d3e:4", 1522 "\u0d4d\u200c\u0d06": "\u0d3e:3", 1523 "\u0d4d\u0d06": "\u0d3e:2", 1524 "\u0d4d\u200c\u0d07": "\u0d3f:3", 1525 "\u0d4d\u0d07": "\u0d3f:2", 1526 "\u0d4d\u200c\u0d08": "\u0d40:3", 1527 "\u0d4d\u0d08": "\u0d40:2", 1528 "\u0d4d\u200c\u0d09": "\u0d41:3", 1529 "\u0d4d\u0d09": "\u0d41:2", 1530 "\u0d4d\u200c\u0d0a": "\u0d42:3", 1531 "\u0d4d\u0d0a": "\u0d42:2", 1532 "\u0d4d\u200c\u0d30\u0d4d^": "\u0d43:5", 1533 "\u0d4d\u0d30\u0d4d^": "\u0d43:4", 1534 "\u0d4d\u200c\u0d0e": "\u0d46:3", 1535 "\u0d4d\u0d0e": "\u0d46:2", 1536 "\u0d4d\u200c\u0d0f": "\u0d47:3", 1537 "\u0d4d\u0d0f": "\u0d47:2", 1538 "\u0d4d\u0d10": "\u0d48:2", 1539 "\u0d4d\u200c\u0d10": "\u0d48:3", 1540 "\u0d47\u200c\u0d0f": "\u0d40:3", 1541 "\u0d47\u0d0f": "\u0d40:2", 1542 "\u0d4d\u200c\u0d12": "\u0d4a:3", 1543 "\u0d4d\u0d12": "\u0d4a:2",
1544 "\u0d4d\u200c\u0d13": "\u0d4b:3", 1545 "\u0d4d\u0d13": "\u0d4b:2", 1546 "\u0d4d\u0d14": "\u0d57:2", 1547 "\u0d4d\u200c\u0d14": "\u0d57:3", 1548 "\u0d4d\u0d02": "\u0d02:2", 1549 "\u0d4d\u0d03": "\u0d03:2", 1550 "\u0d30\u0d4d^": "\u0d0b:3", 1551 "\u0d4b\u0d13": "\u0d42:2", 1552 "\u0d05\u0d07": "\u0d10:2", 1553 "\u0d05\u0d05": "\u0d06:2", 1554 "\u0d05\u0d09": "\u0d14:2", 1555 "\u0d07\u0d07": "\u0d08:2", 1556 "\u0d09\u0d09": "\u0d0a:2", 1557 "\u0d28\u0d4d\u0d15\u0d4d\u200c\u0d39\u0d4d": "\u0d1e\u0d4d\u0d1a\u0d4d:7", 1558 "\u0d15\u0d4d\u0d39\u0d4d": "\u0d16\u0d4d:4", 1559 "\u0d17\u0d4d\u0d39\u0d4d": "\u0d18\u0d4d:4", 1560 "\u0d28\u0d4d\u0d17\u0d4d": "\u0d19\u0d4d:4", 1561 "\u0d15\u0d4d\u200c\u0d39\u0d4d": "\u0d1a\u0d4d:5", 1562 "\u0d1a\u0d4d\u0d39\u0d4d": "\u0d1b\u0d4d:4", 1563 "\u0d1c\u0d4d\u0d39\u0d4d": "\u0d1d\u0d4d:4", 1564 "\u0d28\u0d4d\u0d1c\u0d4d": "\u0d1e\u0d4d:4", 1565 "\u0d17\u0d4d\u200c\u0d2f\u0d4d": "\u0d1c\u0d4d\u0d1e\u0d4d:5", 1566 "\u0d31\u0d4d\u0d31\u0d4d\u0d31\u0d4d\u0d31\u0d4d": "\u0d1f\u0d4d\u0d1f\u0d4d:8", 1567 "\u0d1f\u0d4d\u0d39\u0d4d": "\u0d20\u0d4d:4", 1568 "\u0d21\u0d4d\u0d39\u0d4d": "\u0d22\u0d4d:4", 1569 "\u0d31\u0d4d\u0d31\u0d4d\u0d39\u0d4d": "\u0d24\u0d4d:6", 1570 "\u0d24\u0d4d\u0d39\u0d4d": "\u0d25\u0d4d:4", 1571 "\u0d26\u0d4d\u0d39\u0d4d": "\u0d27\u0d4d:4", 1572 "\u0d2a\u0d4d\u0d39\u0d4d": "\u0d2b\u0d4d:4", 1573 "\u0d2c\u0d4d\u0d39\u0d4d": "\u0d2d\u0d4d:4", 1574 "\u0d15\u0d4d\u0d38\u0d4d\u0d39\u0d4d": "\u0d37\u0d4d:4", 1575 "\u0d38\u0d4d\u0d39\u0d4d": "\u0d36\u0d4d:4", 1576 "\u0d36\u0d4d\u0d39\u0d4d": "\u0d37\u0d4d:4", 1577 "\u0d1c\u0d4d\u200c\u0d39\u0d4d": "\u0d34\u0d4d:5", 1578 "\u0d30\u0d41\u200d": "\u20a8:3", 1579 "\u0d28\u0d4d\u0d15\u0d4d": "\u0d19\u0d4d\u0d15\u0d4d:4", 1580 "\u0d28\u0d4d\u0d1f\u0d4d": "\u0d23\u0d4d\u0d1f\u0d4d:4", 1581 "\u0d30\u0d4d_": "\u0d7c:3", 1582 "\u0d28\u0d4d_": "\u0d7b:3", 1583 "\u0d23\u0d4d_": "\u0d7a:3", 1584 "\u0d33\u0d4d_": "\u0d7e:3", 1585 "\u0d32\u0d4d_": "\u0d7d:3", 1586 "\u0d15\u0d4d_": "\u0d7f:3", 1587 "\u0d28\u0d4d\u0d31\u0d4d\u0d31\u0d4d": "\u0d28\u0d4d\u0d31\u0d4d:6", 1588 "\u0d28\u0d4d\u0d31\u0d4d\u0d39\u0d4d": "\u0d28\u0d4d\u0d24\u0d4d:6", 1589 "\u0d28\u0d4d\u0d31\u0d4d\u0d39\u0d4d\u0d39\u0d4d": "\u0d28\u0d4d\u0d25\u0d4d:8" 1590 }; 1591 u = { 1592 "!": "!", 1593 '"': "\u0d20", 1594 "#": "\u0d4d\u0d30", 1595 $: ":", 1596 "%": ";", 1597 "&": "\u0d15\u0d4d\u0d37", 1598 "'": "\u0d1f", 1599 "(": "(", 1600 ")": ")", 1601 "*": "*", 1602 "+": "\u0d0b", 1603 "-": "\u2013", 1604 ".": ".", 1605 "/": "\u0d2f", 1606 0: "0", 1607 1: "1", 1608 2: "2", 1609 3: "3", 1610 4: "4", 1611 5: "5", 1612 6: "6", 1613 7: "7", 1614 8: "8", 1615 9: "9", 1616 ":": "\u0d1b", 1617 ";": "\u0d1a", 1618 "<": "\u0d37", 1619 "=": "\u0d43", 1620 ">": "\u2022", 1621 "?": "?", 1622 "@": "\u2018", 1623 A: "\u0d13", 1624 B: "\u0d33", 1625 C: "\u0d23", 1626 D: "\u0d05", 1627 E: "\u0d06", 1628 F: "\u0d07", 1629 G: "\u0d09", 1630 H: "\u0d2b", 1631 I: "\u0d18", 1632 J: "\u0d31", 1633 K: "\u0d16", 1634 L: "\u0d25", 1635 M: "\u0d36", 1636 N: "\u0d34", 1637 O: "\u0d27", 1638 P: "\u0d1d", 1639 Q: "\u0d14", 1640 R: "\u0d08", 1641 S: "\u0d0f", 1642 T: "\u0d0a", 1643 U: "\u0d19", 1644 V: "\u0d03", 1645 W: "\u0d10", 1646 X: "=", 1647 Y: "\u0d2d", 1648 Z: "\u0d0e", 1649 "[": "\u0d21", 1650 "\\": "\u200c", 1651 "]": "\u200d", 1652 "^": "\u2019", 1653 _: "%", 1654 "`": "\u0d4a", 1655 a: "\u0d4b", 1656 b: "\u0d35", 1657 c: "\u0d2e", 1658 d: "\u0d4d", 1659 e: "\u0d3e", 1660 f: "\u0d3f", 1661 g: "\u0d41", 1662 h: "\u0d2a", 1663 i: "\u0d17", 1664 j: "\u0d30", 1665 k: "\u0d15", 1666 l: "\u0d24", 1667 m: "\u0d38", 1668 n: "\u0d32", 1669 o: "\u0d26", 1670 p: "\u0d1c", 1671 q: "\u0d57", 1672 r: "\u0d40", 1673 s: "\u0d47", 1674 t: "\u0d42", 1675 u: "\u0d39", 1676 v: "\u0d28", 1677 w: "\u0d48", 1678 x: "\u0d02", 1679 y: "\u0d2c", 1680 z: "\u0d46", 1681 "{": "\u0d22", 1682 "|": "", 1683 "}": "\u0d1e", 1684 "~": "\u0d12", 1685 " ": " " 1686 }; 1687 r = { 1688 "\u0d46\u0d46": "\u0d48:2", 1689 "\u0d46\u0d3e": "\u0d4a:2", 1690 "\u0d47\u0d3e": "\u0d4b:2", 1691 "\u0d46\u0d57": "\u0d4c:2", 1692 "\u0d07\u0d57": "\u0d08:2", 1693 "\u0d09\u0d57": "\u0d0a:2", 1694 "\u0d0e\u0d46": "\u0d10:2", 1695 "\u0d12\u0d3e": "\u0d13:2", 1696 "\u0d12\u0d57": "\u0d14:2", 1697 "\u0d30\u0d4d\u200d": "\u0d7c:3", 1698 "\u0d28\u0d4d\u200d": "\u0d7b:3", 1699 "\u0d23\u0d4d\u200d": "\u0d7a:3", 1700 "\u0d32\u0d4d\u200d": "\u0d7d:3", 1701 "\u0d33\u0d4d\u200d": "\u0d7e:3", 1702 "\u0d15\u0d4d\u200d": "\u0d7f:3" 1703 }; 1704 let hindiRemingtonCharType = "0000000000000000000000000000000050500005050050500000000000550005000000000000000000000000000000000000000000000000000000000000000001110222222222222222233333333333333333333333333333333333334410444444444444444000000000003333333022440000000000000000000000000000"; 1705 this.LangList = function () { 1706 return { 1707 Malayalam: 2 1708 } 1709 }; 1710 this.Keyboards = function () { 1711 return { 1712 Malayalam: ["malayalaminscript", "phonetic-mal", "malayalam-linotype"] 1713 } 1714 }; 1715 this.KeyboardsDetails = function () { 1716 return { 1717 malayalaminscript: u, 1718 "phonetic-mal": t 1719 } 1720 }; 1721 b.chatType = function () { 1722 return { 1723 remington: hindiRemingtonCharType, 1724 malayalaminscript: "0000000000000000000000000000000050500005050050500000000000550005000000000000000000000000000000000000000000000000000000000000000001110222222222222222233333333333333333333333333333333333334410444444444444444000000000003333333022440000000000000000000000000000", 1725 "phonetic-mal": "0000000000000000000000000000000050500005050050500000000000550005000000000000000000000000000000000000000000000000000000000000000001110222222222222222233333333333333333333333333333333333334410444444444444444000000000003333333022440000000000000000000000000000" 1726 } 1727 }; 1728 b.languagePosition = function () { 1729 return { 1730 remington: "2304:2431", 1731 malayalaminscript: "3328:3440", 1732 "phonetic-mal": "3328:3440" 1733 } 1734 }; 1735 this.conjuncts = function () { 1736 return { 1737 malayalaminscript: r, 1738 "phonetic-mal": s 1739 } 1740 }; 1741 n.appendChild(this.textEditor); 1742 c.appendChild(n); 1743 this.setConjuncts = function (a, d, f) { 1744 d = b.conjuncts()[f]; 1745 var e = document.getElementById('searchMalText').value.length; 1746 e = 9 > parseInt(e) ? parseInt(e) : 9; 1747 var p = ""; 1748 if (document.selection) { 1749 a.focus(); 1750 let sel = document.selection.createRange(); 1751 sel.moveStart("character", -e); 1752 p = 9 < sel.text.length ? sel.text.substring(parseInt(sel.text.length) - 9, parseInt(sel.text.length)) : sel.text; 1753 var g = 0; 1754 f = compareStrings(d, p, f); 1755 e = f[0]; 1756 g = f[1]; 1757 let mySel = document.selection.createRange(); 1758 if(void 0 != d && "" != d && void 0 != g && "" != g && 0 < parseInt(g)){ 1759 mySel.moveStart("character", -parseInt(g)); 1760 mySel.select(); 1761 mySel.text = e; 1762 mySel.select(); 1763 } 1764 } else if (a.selectionStart || "0" == a.selectionStart) { 1765 var k = a.selectionStart, 1766 h = a.selectionEnd; 1767 p = a.value.substring(0 < k - 9 ? k - 9 : 0, k); 1768 f = compareStrings(d, p, f); 1769 e = f[0]; 1770 g = f[1]; 1771 if (void 0 != d && "" != d && void 0 != g && "" != g && 0 < parseInt(g)) { 1772 a.value = a.value.substring(0, k - g) + e + a.value.substring(h, a.value.length); 1773 a.selectionStart = k - g + parseInt(e.length); 1774 a.selectionEnd = k - g + parseInt(e.length); 1775 } 1776 1777 } 1778 }; 1779 const undoChromeSafari = function (a) { 1780 if (!document.selection) { 1781 var d = 1782 a.selectionStart; 1783 if (0 < d) { 1784 a.value = a.value.substring(0, a.value.length - 1); 1785 a.selectionStart = d; 1786 a.selectionEnd = d; 1787 } 1788 1789 } 1790 }; 1791 const compareType = function (a, d, f) { 1792 d = d.charCodeAt(0); 1793 a = a.replace("\\", ""); 1794 a = a.charCodeAt(0); 1795 var e = 0, 1796 langPosition = b.languagePosition(), 1797 g = b.chatType(), 1798 k = langPosition[f].split(":")[0], 1799 c = langPosition[f].split(":")[1]; 1800 f = g[f]; 1801 g = parseInt(d) - parseInt(k) + 128; 1802 parseInt(d) > parseInt(k) && parseInt(d) < parseInt(c) && (e = f.replace(",", "").charAt(g)); 1803 return e && !isNaN(e) && e == a; 1804 }; 1805 const compareStrings = function (a, d, b) { 1806 var e = "", 1807 c = 0, 1808 k; 1809 for (k in a) { 1810 var g = "", 1811 h = d.substring(d.length - 1812 k.length, d.length); 1813 if (0 <= h.toString().lastIndexOf(k)) { 1814 a = a[k]; 1815 e = a.split(":")[0]; 1816 c = a.split(":")[1]; 1817 break 1818 } else { 1819 for (var m = !0, l = 0; l < k.length; l++){ 1820 if (void 0 == h.charAt(l)) { 1821 m = !1; 1822 break 1823 } else { 1824 if (k.charAt(l) != h.charAt(l)) { 1825 console.log(`Mismatch at position ${l}: ${k.charAt(l)} != ${h.charAt(l)}`); 1826 } 1827 } 1828 if (compareType(k.charAt(l), h.charAt(l), b)) { 1829 g = (g === "" ? h.charAt(l) : g + "," + h.charAt(l)); 1830 } 1831 else { 1832 m = !1; 1833 break 1834 } 1835 } 1836 if (m) { 1837 a = a[k]; 1838 e = a.split(":")[0]; 1839 d = ""; 1840 for (b = 0; c < e.length; c++) {
1841 if (3 == e.charAt(c).charCodeAt(0) || 4 == e.charAt(c).charCodeAt(0)) { 1842 d += g.split(",")[b]; 1843 b++; 1844 } else { 1845 d += e.charAt(c); 1846 } 1847 } 1848 e = d; 1849 c = a.split(":")[1]; 1850 break 1851 } 1852 } 1853 } 1854 return [e, c] 1855 }; 1856 this.insertAtCursorPosition = function (a, b) { 1857 if (document.selection) {a.focus(); let sel = document.selection.createRange(); sel.text = b; sel.select();} 1858 else if (a.selectionStart || "0" == a.selectionStart) { 1859 var c = a.selectionStart, 1860 e = a.selectionEnd; 1861 e = (a.value.substring(0, c) + b + a.value.substring(e, a.value.length)).replace("", ""); 1862 a.value = e; 1863 a.selectionStart = c + b.length; 1864 a.selectionEnd = c + b.length 1865 } else a.value += b 1866 } 1867} 1868 1869const revampCustomutils = {}; 1870let hasPageScrolled = false; 1871 1872// breaking news 1873revampCustomutils.bnewsslider = function () { 1874 $('.cmp-breaking-news__ul').each(function () { 1875 let timeInterval = $(this).data('id'); 1876 let randomSpeed = 1000 * parseInt(timeInterval); 1877 $(this).not('.slick-initialized').slick({ 1878 slidesToScroll: 1, 1879 autoplay: true, 1880 autoplaySpeed: randomSpeed, 1881 vertical: true, 1882 infinite: false, 1883 arrows: false, 1884 centerMode: false, 1885 adaptiveHeight: true, 1886 pauseOnFocus: false, 1887 }); 1888 }) 1889 $('.cmp-breaking-news__close').on("click", function () { 1890 $('.cmp-breaking-news').slideUp(200); 1891 let storeLastDateTime = $(this).data('attribute'); 1892 localStorage.setItem("lastDateTime", storeLastDateTime); 1893 }); 1894 1895} 1896 1897revampCustomutils.loadBreakingNews = function () { 1898 $.ajax({ 1899 dataType: "html", 1900 type: "GET", 1901 url: $("#breaking-news-url").attr("data-url"), 1902 success: function (response) { 1903 const value = localStorage.getItem('lastDateTime'); 1904 if (value) { 1905 const storedDateTime = Math.floor(new Date(value).getTime() / 1000); 1906 const NewDateTime = Math.floor(new Date($("#breaking-news-url").attr("data-modified")).getTime() / 1000); 1907 if (NewDateTime > storedDateTime || $('#bknews').hasClass('bknews-author')) { 1908 $('#bknews').html(response); 1909 revampCustomutils.bnewsslider(); 1910 } 1911 } else { 1912 $('#bknews').html(response); 1913 revampCustomutils.bnewsslider(); 1914 } 1915 revampCustomutils.fullwidthBackground(); 1916 }, 1917 error: function (error) { 1918 console.log(error); 1919 } 1920 }); 1921} 1922 1923revampCustomutils.fullwidthBackground = function () { 1924 if ($(".fullwidth-bg").length > 0) { 1925 $(".fullwidth-bg").each(function () { 1926 let windwidth = $(window).width(); 1927 let fullwidtharea = $('.fullwidth-bg').closest('.container').width(); 1928 1929 let fullwidthvalue = (windwidth - fullwidtharea) / 2; 1930 if(windwidth > 575){ 1931 $('.fullwidth-bg').css({ 1932 left: -fullwidthvalue, 1933 right: -fullwidthvalue 1934 }); 1935 } else { 1936 $('.fullwidth-bg').css({ 1937 left: -15, 1938 right: -15 1939 }); 1940 } 1941 }) 1942 } 1943} 1944 1945// Today's epaper 1946revampCustomutils.todaysEpaper = function () { 1947 let today = new Date(); 1948 let dd = String(today.getDate()).padStart(2, '0'); 1949 let mm = String(today.getMonth() + 1).padStart(2, '0'); //January is 0! 1950 let yyyy = today.getFullYear(); 1951 let loaction = 'Kottayam'; 1952 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' 1953 $.ajax({ 1954 dataType: "html", 1955 type: "GET", 1956 url: url, 1957 success: function (response) { 1958 console.log(response); 1959 }, 1960 error: function (error) { 1961 console.log(error); 1962 } 1963 }); 1964} 1965 1966 1967// Cartoon Slider 1968revampCustomutils.cartoonSlider = function () { 1969 $('.cartooncarousel').each(function () { 1970 let carouselId = $(this).find('.cartoon-block').attr('id'); 1971 let carouselSize = $('#' + carouselId + '.cartoon-block').data('carousel-size'); 1972 let cartoonBlock = $('#' + carouselId + '.cartoon-block .cmp-story-list--slider'); 1973 const dotStatus = carouselSize > 1 ? true : false;
1974 $(cartoonBlock).not('.slick-initialized').slick({ 1975 slidesToScroll: 1, 1976 autoplay: true, 1977 infinite: false, 1978 autoplaySpeed: 4000, 1979 dots: dotStatus, 1980 pauseOnFocus: false, 1981 arrows: false, 1982 }); 1983 }); 1984} 1985 1986// Game Slider 1987revampCustomutils.gameSlider = function () { 1988 let sliderAutoPlay = $('.mm-game-block').data('slider-autoplay'); 1989 let timeInterval = $('.mm-game-block').data('slider-delay'); 1990 let sliderSpeed = 1000 * parseInt(timeInterval); 1991 $('.mm-game-block .cmp-story-list--slider').not('.slick-initialized').slick({ 1992 centerPadding: '0px', 1993 slidesToShow: 1, 1994 slidesToScroll: 1, 1995 autoplay: sliderAutoPlay, 1996 autoplaySpeed: sliderSpeed, 1997 dots: true, 1998 pauseOnFocus: false, 1999 prevArrow: '<button class="slide-arrow prev-arrow"><i class="mm-icon mm-icon__arrow-right-lg"></i> </button>', 2000 nextArrow: '<button class="slide-arrow next-arrow"><i class="mm-icon mm-icon__arrow-left-lg"></i> </button>', 2001 responsive: [{ 2002 breakpoint: 1200, 2003 settings: { 2004 centerPadding: '40px', 2005 slidesToShow: 3, 2006 infinite: true, 2007 } 2008 }, 2009 { 2010 breakpoint: 992, 2011 settings: { 2012 centerPadding: '40px', 2013 slidesToShow: 2, 2014 infinite: true, 2015 } 2016 }, 2017 { 2018 breakpoint: 576, 2019 settings: { 2020 centerPadding: '40px', 2021 slidesToShow: 1, 2022 infinite: true, 2023 } 2024 }, 2025 ] 2026 }); 2027} 2028 2029// embed videos 2030revampCustomutils.videoPlayer = function () { 2031 if ($('.cmp-section-title-block').length > 0) { 2032 $('.cmp-video-block__icon-top').click(function () { 2033 const $videoBlock = $(this).closest('.cmp-video-block'); 2034 2035 const $videoContent = $videoBlock.find('.cmp-video-block__inner'); 2036 $videoContent.css("display", "block"); 2037 2038 const $playButton = $videoBlock.find(".vjs-big-play-button"); 2039 if ($playButton.length > 0) { 2040 $playButton.click(); 2041 } 2042 2043 const $overlay = $videoBlock.find('.cmp-video-block__overlay'); 2044 $overlay.css("display", "none"); 2045 }); 2046 } 2047} 2048revampCustomutils.scoreBoardSlider = function () { 2049 $('.single-common-slider').each(function () { 2050 let autoPlay = $(this).data('autoplay'); 2051 let timeInterval = $(this).data('delay'); 2052 let randomSpeed = 1000 * parseInt(timeInterval); 2053 $(this).not('.slick-initialized').slick({ 2054 slidesToScroll: 1, 2055 autoplay: autoPlay, 2056 autoplaySpeed: randomSpeed, 2057 dots: true, 2058 arrows: false, 2059 }); 2060 }) 2061} 2062revampCustomutils.mmScoreBoardDateTab = function () { 2063 $('.mmscoreboarditem').each(function () { 2064 let hidetabvalue = $(this).find('.hidetab'); 2065 if (hidetabvalue.length) { 2066 let index = $(this).index(); 2067 $(this).closest('.cmp-tab-block').find('.cmp-tab-block__nav .cmp-tab-block__nav-ul .cmp-tab-block__nav-li').eq(index).remove(); 2068 $(this).remove(); 2069 } 2070 }); 2071 $('.cmp-tab-block').each(function () { 2072 let tabThis = $(this); 2073 if(!tabThis.find('.cmp-tab-block__nav-li').hasClass('active')) 2074 { 2075 tabThis.find('.cmp-tab-block__nav-li:first-child').addClass('active'); 2076 tabThis.find('.cmp-tab-block__item:first').addClass('active'); 2077 tabThis.find('.cmp-tab-block__item').hide(); 2078 tabThis.find('.cmp-tab-block__item:first').show(); 2079 tabThis.find('.cmp-mm-score-full__content-in').css("display", "none"); 2080 tabThis.find('.cmp-tab-block__item:first .cmp-mm-score-full__content').find('.cmp-mm-score-full__content-in').eq(0).css("display", "block"); 2081 }else{ 2082 let index = tabThis.find('.cmp-tab-block__nav-li.active').index(); 2083 tabThis.find('.cmp-tab-block__item').hide(); 2084 tabThis.find('.cmp-tab-block__item').eq(index).show(); 2085 tabThis.find('.cmp-mm-score-full__content-in').css("display", "none"); 2086 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"); 2087 2088 } 2089 tabThis.find('.cmp-tab-block__nav-li a').on("click", function () { 2090 tabThis.find('.cmp-tab-block__nav-li').removeClass('active'); 2091 $(this).parent('.cmp-tab-block__nav-li').addClass('active'); 2092 tabThis.find('.cmp-tab-block__item').hide().removeClass('active'); 2093 let activeIndex = $(this).parent('.cmp-tab-block__nav-li').index(); 2094 tabThis.find('.cmp-tab-block__item').eq(activeIndex).fadeIn().addClass('active'); 2095 $('.cmp-mm-score-full__date-ul li').find('.cmp-mm-score-full__date-btn').removeClass('cmp-mm-score-full__date-btn--active'); 2096 let cmpBlockItemActive = $('.cmp-tab-block__item.active') 2097 $('.cmp-mm-score-full__content-in').css("display", "none"); 2098 $(cmpBlockItemActive).find('.cmp-mm-score-full__date-btn').eq(0).addClass("cmp-mm-score-full__date-btn--active"); 2099 $(cmpBlockItemActive).find('.cmp-mm-score-full__content .cmp-mm-score-full__content-in').eq(0).css("display", "block"); 2100 return false;
2101 }); 2102 }); 2103 $('.cmp-mm-score-full__date-ul li').on("click", function () { 2104 $('.cmp-mm-score-full__date-ul li').find('.cmp-mm-score-full__date-btn').removeClass('cmp-mm-score-full__date-btn--active'); 2105 $(this).children('.cmp-mm-score-full__date-btn').addClass('cmp-mm-score-full__date-btn--active'); 2106 let mmScoreDateHref = $(this).find('.cmp-mm-score-full__date-btn--active').attr('data-id'); 2107 $('.cmp-mm-score-full__content-in').css("display", "none"); 2108 $('#' + mmScoreDateHref + '.cmp-mm-score-full__content-in').css("display", "block"); 2109 }); 2110 2111} 2112revampCustomutils.articleGallery = function () { 2113 let sliderSrc="src"; 2114 if(screen.width>=991){ 2115 sliderSrc="data-fullwidth"; 2116 } 2117 else if (screen.width<991 && screen.width>=575){ 2118 sliderSrc="data-tabsrc"; 2119 } 2120 else{ 2121 sliderSrc="data-mobsrc"; 2122 } 2123 2124 $('.cmp-list-gallery').each(function (key, data) { 2125 try{ 2126 let image = $(data).find("img"); 2127 2128 image.each(function() { 2129 const webSrc = $(this).attr('data-websrc'); 2130 if (webSrc) { 2131 const fullWidthSrc = webSrc.split('?')[0]; 2132 $(this).attr('data-fullwidth', fullWidthSrc); 2133 } 2134 }); 2135 2136 let gallery = $(data).find(".mm-icon__zoom"); 2137 gallery.on('click', function (e) { 2138 e.preventDefault(); 2139 $(this).parent().siblings('img').click(); 2140 }); 2141 image.simpleLightbox({ 2142 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>'], 2143 closeText: 'Ã', 2144 className: 'cmp-list-gallery__lightbox', 2145 widthRatio: 1, 2146 captions: true, 2147 captionPosition: 'bottom', 2148 captionDelay: .3, 2149 sourceAttr: sliderSrc, 2150 fileExt: false, 2151 2152 }); 2153 }catch(err){} 2154 }); 2155 2156} 2157revampCustomutils.articleSlider = function () { 2158 $('.cmp-article-slider__large').each(function () { 2159 $(this).not('.slick-initialized').slick({ 2160 asNavFor: '.cmp-article-slider__thumb', 2161 centerPadding: '0px', 2162 infinite: false, 2163 slidesToShow: 1, 2164 slidesToScroll: 1, 2165 dots: false, 2166 prevArrow: '<button class="slide-arrow prev-arrow"><i class="mm-icon mm-icon__arrow-right-lg"></i> </button>', 2167 nextArrow: '<button class="slide-arrow next-arrow"><i class="mm-icon mm-icon__arrow-left-lg"></i> </button>', 2168 }); 2169 }); 2170 $('.cmp-article-slider__thumb').each(function () { 2171 $(this).not('.slick-initialized').slick({ 2172 slidesToShow: 4, 2173 slidesToScroll: 1, 2174 centerPadding: '40px', 2175 asNavFor: '.cmp-article-slider__large', 2176 infinite: false, 2177 dots: false, 2178 focusOnSelect: true, 2179 prevArrow: '<button class="cmp-article-slider__thumb-arrow prev-arrow"><i class="mm-icon mm-icon__arrow-right-lg"></i> </button>', 2180 nextArrow: '<button class="cmp-article-slider__thumb-arrow next-arrow"><i class="mm-icon mm-icon__arrow-left-lg"></i> </button>', 2181 responsive: [{ 2182 breakpoint: 576, 2183 settings: { 2184 slidesToShow: 3, 2185 slidesToScroll: 1, 2186 } 2187 }, ] 2188 }); 2189 }); 2190} 2191revampCustomutils.artcleSimpleslider = function () { 2192 $('.cmp-simple-slider-block__main').each(function () { 2193 let timeInterval = $(this).data('id'); 2194 let randomSpeed = 1000 * parseInt(timeInterval); // code to calculate random speed here 2195 $(this).not('.slick-initialized').slick({ 2196 dots: false, 2197 lazyLoad: 'ondemand', 2198 autoplay: true, 2199 autoplaySpeed: randomSpeed, 2200 fade: true, 2201 cssEase: 'linear', 2202 slidesToShow: 1, 2203 slidesToScroll: 1, 2204 infinite: false, 2205 arrows: true, 2206 pauseOnHover: false, 2207 pauseOnFocus: false, 2208 prevArrow: '<button class="slide-arrow prev-arrow slick-arrow"><i class="mm-icon mm-icon__arrow-right-lg"></i> </button>', 2209 nextArrow: '<button class="slide-arrow next-arrow slick-arrow"><i class="mm-icon mm-icon__arrow-left-lg"></i> </button>' 2210 2211 }); 2212 }) 2213 $('.cmp-simple-slider-block__main').not('.slick-initialized').slick('slickPlay'); 2214} 2215 2216// ImageSlideShow 2217revampCustomutils.premiumImageSlideShow = function () { 2218 $('.cmp-gallery-block').each(function () { 2219 let $thisGallery = $(this); 2220 $(this).find('.cmp-gallery-block__open').on("click", function () { 2221 $thisGallery.find('.cmp-gallery-block__popup').fadeIn(200); 2222 $thisGallery.find('.cmp-gallery-block__popup-slider').not('.slick-initialized').slick({ 2223 centerPadding: '20px', 2224 infinite: false, 2225 slidesToShow: 1, 2226 slidesToScroll: 1, 2227 dots: false,
2228 prevArrow: '<button class="slide-arrow slick-custom-arrow slick-prev"><i class="mm-icon mm-white-icon mm-icon__arrow-right-sm"></i> </button>', 2229 nextArrow: '<button class="slide-arrow slick-custom-arrow slick-next"><i class="mm-icon mm-white-icon mm-icon__arrow-left-sm"></i> </button>' 2230 }); 2231 $('body').addClass("overflow-hidden"); 2232 $(".lazyload").unveil(); 2233 }); 2234 2235 $thisGallery.find('.cmp-gallery-block__item:nth-child(2) .cmp-gallery-block__open').click(function () { 2236 let slider = $thisGallery.find('.cmp-gallery-block__popup-slider'); 2237 slider[0].slick.slickGoTo(parseInt(1)); 2238 }); 2239 $thisGallery.find('.cmp-gallery-block__item:nth-child(3) .cmp-gallery-block__open').click(function () { 2240 let slider = $thisGallery.find('.cmp-gallery-block__popup-slider'); 2241 slider[0].slick.slickGoTo(parseInt(2)); 2242 }); 2243 2244 // close gallery 2245 $thisGallery.find('.cmp-gallery-block__popup-close').on("click", function () { 2246 $thisGallery.find('.cmp-gallery-block__popup').fadeOut(200); 2247 $('body').removeClass("overflow-hidden"); 2248 $thisGallery.find('.cmp-gallery-block__popup-slider').slick('unslick'); 2249 }); 2250 $thisGallery.find('.cmp-gallery-block__popup-info').on("click", function () { 2251 $(this).closest('.cmp-gallery-block').toggleClass("galleryDispnhide"); 2252 }); 2253 2254 }); 2255 2256 2257} 2258 2259// Search component 2260revampCustomutils.searchComponent = function () { 2261 const $switchLanguage = $('.cmp-search-popup__switch-language input[type="checkbox"]'); 2262 const $searchInput = $('.cmp-search-popup__input'); 2263 const $searchButton = $('.cmp-search-popup__btn'); 2264 let enPlaceHold; 2265 let searchURL; 2266 let searchVal; 2267 $switchLanguage.on('change', function() { 2268 console.log('clicked') 2269 const $ele = $(this); 2270 const isChecked = $ele.is(':checked'); 2271 const wrap = $ele.closest('.cmp-search-popup__filed-block'); 2272 const inputWrp = wrap.find('.cmp-search-popup__input-wrp'); 2273 const indicaElement = inputWrp.find('[id^="Indica_Wrapper"]'); 2274 if (isChecked) { 2275 let randNum = Math.floor(Math.random() * 1000); 2276 let newWrapId = 'search-mal-' + randNum; 2277 let Indica_Wrapper = 'Indica_Wrapper-' + randNum; 2278 2279 if(!inputWrp.attr('id')) { 2280 2281 wrap.find('.cmp-search-popup__input-wrp').attr({ 2282 'id': newWrapId, 2283 'data-language': 'malayalam', 2284 'data-keyboard': 'phonetic-mal' 2285 }); 2286 wrap.find('.cmp-search-popup__input-wrp input').val('') 2287 enPlaceHold = wrap.find('.cmp-search-popup__input-wrp input').attr('placeholder') 2288 2289 if(document.getElementById(Indica_Wrapper) === null){ 2290 new MMEditorSearch(document.getElementById(newWrapId), newWrapId, Indica_Wrapper); 2291 2292 } 2293 2294 } 2295 2296 }else{ 2297 inputWrp.find('.cmp-search-popup__input').removeAttr('id').removeAttr('placeholder'); 2298 inputWrp.find('.cmp-search-popup__input').attr('placeholder', enPlaceHold) 2299 inputWrp.removeAttr('id').removeAttr('data-language').removeAttr('data-keyboard'); 2300 const indicaCont = indicaElement.html(); 2301 indicaElement.replaceWith(indicaCont); 2302 } 2303 inputWrp.find('.cmp-search-popup__input').focus(); 2304 2305 }); 2306 $searchInput.on('keypress', function(e) { 2307 if (e.keyCode === 13) { 2308 searchVal = $(this).val(); 2309 searchURL = $(this).data('url'); 2310 searchResult(searchVal, searchURL, $(this)); 2311 } 2312 }); 2313 $searchButton.on('click', function() { 2314 const inpEle = $(this).closest('.cmp-search-popup__input-wrp').find('.cmp-search-popup__input'); 2315 searchVal = inpEle.val(); 2316 searchURL = inpEle.data('url'); 2317 searchResult(searchVal, searchURL, $(this)); 2318 }); 2319 function searchResult(val,url,ele) { 2320 if (val && url) { 2321 const redirectUrl = url + encodeURI(val); 2322 window.location.href = redirectUrl; 2323 } 2324 } 2325} 2326 2327 2328// 404 page listing tab 2329revampCustomutils.errorPageListingTab = function () { 2330 $('.listing-nav-tab').each(function () { 2331 const tabThis = $(this); 2332 tabThis.find('.cmp-nav-tab__li:first-child').addClass('active'); 2333 tabThis.find('.cmp-nav-tab__item').hide(); 2334 tabThis.find('.cmp-nav-tab__item:first').show(); 2335 tabThis.find('.cmp-nav-tab__li a').on("click", function (e) { 2336 e.preventDefault(); 2337 const clickedTab = $(this).parent('.cmp-nav-tab__li'); 2338 tabThis.find('.cmp-nav-tab__li').removeClass('active'); 2339 clickedTab.addClass('active'); 2340 tabThis.find('.cmp-nav-tab__item').hide().removeClass('active'); 2341 const activeTab = $(this).attr('href'); 2342 $(activeTab).fadeIn().addClass('active'); 2343 try { 2344 if($('.story-card-list-block .cmp-story-list--slider').not('.slick-initialized').slick('refresh')){ 2345 $('.story-card-list-block .cmp-story-list--slider').on('afterChange', function(e, slick, currentSlide){ 2346 $(".lazyload").unveil(); 2347 }); 2348 } 2349 } 2350 catch (err) { 2351 } 2352 }); 2353 }); 2354} 2355 2356// added MMO25-1156 story-card-list-block slick slider 2357revampCustomutils.storyCardSlickSlider = function () { 2358 $('.story-card-list-block .cmp-story-list--slider').not('.slick-initialized').not('.slick-initialized').slick({ 2359 centerMode: false, 2360 centerPadding: '0px', 2361 infinite: false, 2362 slidesToShow: 4, 2363 slidesToScroll: 1, 2364 dots: true, 2365 prevArrow: '<button class="slide-arrow prev-arrow"><i class="mm-icon mm-icon__arrow-right-lg"></i> </button>', 2366 nextArrow: '<button class="slide-arrow next-arrow"><i class="mm-icon mm-icon__arrow-left-lg"></i> </button>', 2367 responsive: [{ 2368 breakpoint: 1200, 2369 settings: { 2370 centerPadding: '40px', 2371 slidesToShow: 3, 2372 infinite: true, 2373 } 2374 }, { 2375 breakpoint: 992, 2376 settings: { 2377 centerPadding: '40px', 2378 slidesToShow: 2, 2379 infinite: true, 2380 } 2381 }, { 2382 breakpoint: 576, 2383 settings: { 2384 centerPadding: '40px', 2385 slidesToShow: 1, 2386 infinite: true, 2387 } 2388 }] 2389 }); 2390} 2391 2392 2393 2394// Scroll bottom - comment section 2395revampCustomutils.vuukleComment = function () { 2396 $("#vuukleComment").on('click', function () { 2397 $('html, body').animate({ 2398 'scrollTop': $('#comments').offset().top 2399 }, 2000); 2400 }); 2401} 2402 2403//Indepth list hide 2404revampCustomutils.indepthListHide = function () { 2405 $('div.cmp-story-list__component-slot-in').each(function() { 2406 if($.trim($(this).text()) === '' && $(this).children().length == 0) { 2407 $(this).parent().hide(); 2408 } 2409 }); 2410} 2411 2412// MMO25-1615 List show more 2413revampCustomutils.listShowMore = function () { 2414 try { 2415 if ($(".moreInarticle-story-block").find(".cmp-story-list").hasClass("listshowmore")){ 2416 let currentURL = window.location.href; 2417 let listlen = $(".moreInarticle-story-block").find(".cmp-story-list.listshowmore li.cmp-story-list__item").length-1; 2418 let duplicate = false;
2419 $(".moreInarticle-story-block").find(".cmp-story-list.listshowmore li.cmp-story-list__item").each(function (index, element) { 2420 let hrefValue = $(this).find("a.cmp-story-list__title-link").attr("href"); 2421 if (currentURL.indexOf(hrefValue) !== -1) { 2422 $(this).remove(); 2423 duplicate = true; 2424 }else if(index==listlen && duplicate== false){ 2425 $(".moreInarticle-story-block").find(".cmp-story-list.listshowmore li.cmp-story-list__item:last"). remove(); 2426 } 2427 2428 $(this).addClass("smhidden"); 2429 }); 2430 if($(".moreInarticle-story-block li.cmp-story-list__item").length===0){ 2431 $(".moreInarticle-story-block .cmp-section-title-block").remove(); 2432 } 2433 2434 // Set the number of items to show initially and the step size for each "Show More" click 2435 let itemsToShow = $(".cmp-story-list.listshowmore").attr("data-onloadlimit"); 2436 2437 // Show the first set of items 2438 $(".cmp-story-list.listshowmore li.cmp-story-list__item").slice(0, itemsToShow).removeClass("smhidden"); 2439 if ($(".cmp-story-list.listshowmore li.cmp-story-list__item").slice(0, itemsToShow).addClass("show")) { 2440 $(".lazyload").unveil(); 2441 if ($(".cmp-story-list.listshowmore li.cmp-story-list__item.smhidden").length === 0) { 2442 $('.moreInarticle-story-block').find('.cmp-more-stories').hide(); 2443 } 2444 } 2445 2446 // Handle the "Show More" button click 2447 // To avoid live update show more conflict, below line updated 2448 // To avoid premium block show more conflict, below line updated 2449 $(".moreInarticle-story-block").find(".cmp-more-stories").click(function () { 2450 let $hiddenItems = $(".cmp-story-list.listshowmore li.cmp-story-list__item.smhidden"); 2451 let stepSize = $(".cmp-story-list.listshowmore").attr("data-pagelimit"); 2452 let numItemsToShow = Math.min(stepSize, $hiddenItems.length); 2453 2454 $hiddenItems.slice(0, numItemsToShow).removeClass("smhidden"); 2455 $hiddenItems.slice(0, numItemsToShow).addClass("show"); 2456 2457 // Hide the "Show More" button if there are no more hidden items 2458 if ($(".cmp-story-list.listshowmore li.cmp-story-list__item.smhidden").length === 0) { 2459 $(this).hide(); 2460 } 2461 $(".lazyload").unveil(); 2462 }); 2463 } 2464 } catch (err) { } 2465} 2466 2467//reporters corner share 2468revampCustomutils.reportersShare = function () { 2469 $('.rprtr-item-sharebtn').on("click", function(e){ 2470 e.stopPropagation(); 2471 var thispop = $(this).siblings('.rprtr-share-pop'); 2472 if (thispop.hasClass("shareActive")) { 2473 thispop.removeClass("shareActive"); 2474 } else { 2475 $('.rprtr-share-pop').removeClass("shareActive"); 2476 thispop.addClass("shareActive"); 2477 } 2478 2479 }); 2480} 2481revampCustomutils.searchPopupScroll = function () { 2482 $('body').append($('.cmp-search-popup')); 2483 hasPageScrolled = true; 2484} 2485 2486 2487//remove watch next block when no articles are listed by default 2488revampCustomutils.removeWatchNext = function () { 2489 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) { 2490 $(".cmp-video-list-block.publish-mode").closest('.mmcontainer').remove(); 2491 } 2492} 2493 2494// MMO25-3649 Display Time stamp 2495revampCustomutils.displayPublishDate = function () { 2496 const appendTimestamp = className => { 2497 const elements = document.querySelectorAll(`p.${className}`); 2498 const time = respDate => { 2499 const sec = Math.floor((Date.now() - respDate) / 1000); 2500 if (!isNaN(sec)) { 2501 if (sec >= 86400) { 2502 const date = new Date(respDate); 2503 return date.toLocaleDateString('en-US', { month: 'short', day: 'numeric', year: 'numeric'}); 2504 } else if (sec >= 3600) { 2505 const hours = Math.floor(sec / 3600); 2506 return hours + (hours > 1 ? " hours ago" : " hour ago"); 2507 } else if (sec >= 60 && sec < 120) { 2508 return "Just now"; 2509 } else if (sec >= 120) { 2510 const minutes = Math.floor(sec / 60); 2511 return minutes + " minutes ago"; 2512 } else if (sec < 120){ 2513 return "Just now"; 2514 } else {
2515 return "invalid timestamp"; 2516 } 2517 } 2518 }; 2519 elements.forEach(element => { 2520 const publishDateAttr = element.getAttribute('data-publish-date'); 2521 const timestamp = parseInt(publishDateAttr, 10); 2522 if (!isNaN(timestamp)) { 2523 const formattedTime = time(timestamp); 2524 if (publishDateAttr !== "") { 2525 element.innerHTML = formattedTime; 2526 } 2527 } else if (publishDateAttr === null) { 2528 element.classList.remove('cmp-story-list__date'); 2529 } 2530 }); 2531 }; 2532 appendTimestamp('cmp-story-list__date'); 2533} 2534 2535// MMO25-3716 User Interaction Opinion Polling 2536revampCustomutils.userInteractionPollingBlock = function () { 2537 const articleBodySlots = $('.article-body__component-slot[data-pollingUrl]'); 2538 articleBodySlots.each(function (index) { 2539 let pollingUrl = $(this).attr('data-pollingUrl'); 2540 const opinionPollBlockId = `opinionPollBlock_${(index + 1).toString().padStart(2, '0')}`; 2541 $(this).attr('id', opinionPollBlockId); 2542 const opinionPollBlock = $(`#${opinionPollBlockId}`); 2543 let multipleOptionAllowed = false; 2544 let responseData; 2545 let voteButtonText = "VOTE NOW"; 2546 let questionTitleColor; 2547 let buttonColor; 2548 const errorBlockHide = () => { 2549 opinionPollBlock.on('click', '.cmp-polling-block__li', function () { 2550 let errorBlock = $(this).closest('.polling-block').find('.cmp-polling-block__error'); 2551 errorBlock.hide(); 2552 }); 2553 }; 2554 const getAndAppendPollingData = async () => { 2555 if (opinionPollBlock.find('.polling-block').length === 0) { 2556 const pollDataUrl = opinionPollBlock.attr('data-pollingurl'); 2557 pollingUrl = `${pollDataUrl}.json`; 2558 try { 2559 const resultData = await $.ajax({ 2560 url: pollingUrl, 2561 method: 'GET', 2562 dataType: 'json' 2563 }); 2564 responseData = resultData; 2565 if (resultData.opinionPollEventStatus !== 'Active') { 2566 opinionPollBlock.remove(); 2567 return; 2568 } 2569 if (resultData && resultData.opinionPollQuestion) { 2570 resultData.opinionPollQuestion.forEach((questionData) => { 2571 if (hasUserVoted(questionData.opinionPollQuestionId)) { 2572 displayResult(questionData.opinionPollQuestionId); 2573 } 2574 }); 2575 } 2576 questionTitleColor = resultData.opinionPollQuestionTitleColor; 2577 buttonColor = resultData.opinionPollButtonColor; 2578 const pollLanguage = resultData.opinionPollEventLanguage; 2579 const pollTitleName = resultData.opinionPollEventName; 2580 const opinionPollEventEndDate = new Date(resultData.opinionPollEventEndDate); 2581 const pollPoweredByImage = resultData.opinionPollEventPoweredByImage; 2582 const pollPoweredBy = resultData.opinionPollEventPoweredBy; 2583 const pollPoweredByWebsiteUrl = resultData.opinionPollEventPoweredByWebsiteUrl; 2584 const pollPoweredByNewTab = resultData.poweredByNewTab; 2585 const sectionTitleBlockExists = opinionPollBlock.find('.cmp-section-title-block').length > 0; 2586 opinionPollBlock.append('<div class="polling-block-outer"></div>'); 2587 if (!sectionTitleBlockExists) { 2588 let sectionTitleBlock = ` 2589 <div class="cmp-section-title-block"> 2590 <h3 class="cmp-section-title"><span class="cmp-section-shape"></span>${pollTitleName}</h3> 2591 `; 2592 if (pollPoweredByImage || pollPoweredBy || pollPoweredByWebsiteUrl) { 2593 sectionTitleBlock += ` 2594 <div class="cmp-sponser-block"> 2595 <div class="cmp-sponser-block__title">Powered By</div> 2596 <div class="cmp-sponser-block__logo"> 2597 <a tabindex="0" href="${pollPoweredByWebsiteUrl || '#'}" target="${pollPoweredByNewTab ? '_blank' : '_self'}"> 2598 ${pollPoweredByImage ? `<img src="${pollPoweredByImage}" alt="${pollPoweredBy}
2598">` : ''} 2599 </a> 2600 </div> 2601 </div> 2602 `; 2603 } 2604 2605 sectionTitleBlock += `</div>`; 2606 opinionPollBlock.find('.polling-block-outer').prepend(sectionTitleBlock); 2607 } 2608 2609 if (!opinionPollEventEndDate) { 2610 console.warn("The opinion poll event end date is not set."); 2611 } else { 2612 const eventEndDate = opinionPollEventEndDate instanceof Date ? opinionPollEventEndDate : new Date(opinionPollEventEndDate); 2613 2614 if (isNaN(eventEndDate.getTime())) { 2615 console.error("Invalid opinion poll event end date."); 2616 } else { 2617 const currentDate = new Date(); 2618 2619 if (currentDate > eventEndDate) { 2620 resultData.opinionPollQuestion.forEach((questionData) => { 2621 displayResult(questionData.opinionPollQuestionId); 2622 }); 2623 2624 const observer = new MutationObserver(() => { 2625 const pollingBlocks = document.querySelectorAll('.cmp-polling-block__alertmsg'); 2626 if (pollingBlocks.length > 0) { 2627 pollingBlocks.forEach((pollingBlock) => { 2628 pollingBlock.style.display = 'block'; 2629 }); 2630 observer.disconnect(); 2631 } 2632 }); 2633 observer.observe(document.body, { childList: true, subtree: true }); 2634 } 2635 } 2636 } 2637 2638 resultData.opinionPollQuestion.forEach((questionData) => { 2639 const opinionPollQuestionId = questionData.opinionPollQuestionId; 2640 let languageClass = ''; 2641 2642 if (pollLanguage === 'Malayalam') { 2643 languageClass = 'ml-font';
2644 } else if (pollLanguage === 'English') { 2645 languageClass = 'english-font'; 2646 } 2647 2648 const titleElement = $(`#pollingOuter-${opinionPollQuestionId} .cmp-section-title`); 2649 const spanElement = $(`#pollingOuter-${opinionPollQuestionId} .cmp-section-shape`); 2650 titleElement.append(spanElement, pollTitleName); 2651 2652 if (pollPoweredByWebsiteUrl) { 2653 $(`#pollingOuter-${opinionPollQuestionId} .cmp-sponser-block__title`).text('Powered By'); 2654 const sponsorLink = $(`#pollingOuter-${opinionPollQuestionId} .cmp-sponser-block__logo a`).attr('href', pollPoweredByWebsiteUrl); 2655 if (pollPoweredByNewTab == true) { 2656 sponsorLink.attr('target', '_blank'); 2657 } 2658 if (pollPoweredByImage) { 2659 $(`#pollingOuter-${opinionPollQuestionId} .cmp-sponser-block__logo img`).attr('src', pollPoweredByImage).attr('alt', pollPoweredBy); 2660 updatePollSponsorImageTheme(); 2661 } else { 2662 $(`#pollingOuter-${opinionPollQuestionId} .cmp-sponser-block__logo img`).remove(); 2663 } 2664 } else { 2665 $(`#pollingOuter-${opinionPollQuestionId} .cmp-sponser-block__logo a`).remove(); 2666 } 2667 2668 const pollingOuter = $(`#pollingOuter-${opinionPollQuestionId}`); 2669 2670 if (pollingOuter.length === 0) { 2671 $(opinionPollBlock).find('.polling-block-outer').append(` 2672 <div id="pollingBlock-${opinionPollQuestionId}" class="polling-block ${languageClass}"></div> 2673 `); 2674 } 2675 const pollMultipleChoiceBlk = $(`#pollingBlock-${opinionPollQuestionId}`); 2676 appendPollingBlock(questionData, pollMultipleChoiceBlk); 2677 }); 2678 } catch (error) { 2679 console.error('Error fetching data:', error); 2680 } 2681 updatePollSponsorImageTheme(); 2682 } 2683 opinionPollBlock.find('.cmp-polling-block__ul li').off('click'); 2684 errorBlockHide(); 2685 }; 2686 2687 const updatePollSponsorImageTheme = () => { 2688 $('.cmp-sponser-block__logo img').each(function() { 2689 var $parentDiv = $(this).closest('.article-body__component-slot'); 2690 if ($parentDiv.data('pollingurl')) { 2691 const sponsorImage = $(this); 2692 const pollPoweredByImage = sponsorImage.attr('src'); 2693 if ($('html').hasClass('mm-light-theme')) { 2694 sponsorImage.attr('src', pollPoweredByImage).removeClass('image-dark-theme').addClass('image-light-theme'); 2695 } else if ($('html').hasClass('mm-dark-theme')) { 2696 sponsorImage.attr('src', pollPoweredByImage).removeClass('image-light-theme').addClass('image-dark-theme'); 2697 } else { 2698 sponsorImage.attr('src', pollPoweredByImage).removeClass('image-dark-theme').addClass('image-light-theme'); 2699 } 2700 } 2701 }); 2702 }; 2703 2704 const isMultipleOptionAllowed = (responseData) => { 2705 return responseData.multipleOptionAllowed; 2706 }; 2707 const appendPollingBlock = (questionData, pollingBlock) => { 2708 const questionName = questionData.opinionPollQuestionName; 2709 const pollQuestionDescription = questionData.opinionPollQuestionDescription; 2710 const opinionPollQuestionId = questionData.opinionPollQuestionId; 2711 const pollOptions = questionData.opinionPollOption; 2712 multipleOptionAllowed = isMultipleOptionAllowed(responseData); 2713 let optionsHTML = ''; 2714 if (questionData.opinionPollVoteButtonText) { 2715 voteButtonText = questionData.opinionPollVoteButtonText; 2716 } 2717 2718 if (pollOptions && Array.isArray(pollOptions)) { 2719 pollOptions.forEach((option, optionIndex) => { 2720 let iconBlock = ''; 2721 if (option.opinionPollOptionImage) { 2722 iconBlock = `<div class="cmp-polling-block__icon"><img src="${option.opinionPollOptionImage}" alt="" title=""></div>`; 2723 } 2724 optionsHTML += `<li class="cmp-polling-block__li"> 2725 <label class="cmp-polling-block__option-label d-flex align-items-center"> 2726 ${iconBlock} 2727 <div class="cmp-polling-block__option-text">${option.opinionPollOptionValue}</div> 2728 <input type="${multipleOptionAllowed ? 'checkbox' : 'radio'}" data-pollQuestionId="${option.opinionPollOptionId}" id="option-${opinionPollQuestionId}-${optionIndex}" value="${option.opinionPollOptionValue}" name="pollingOption${opinionPollQuestionId}"> 2729 <div class="cmp-polling-block__ticker"> <i class="mm-icon mm-icon__check mm-white-icon"></i></div> 2730 </label> 2731 </li>`; 2732 }); 2733 } 2734 2735 pollingBlock.html(` 2736 <div class="cmp-polling-block mm-border-radius-8 card-gray-bg"> 2737 <div class="cmp-polling-block__option-block"> 2738 <div class="cmp-polling-block__head"> 2739 <h6 class="cmp-polling-block__title" ${questionTitleColor ? `style="color: ${questionTitleColor};"` : ''}>${questionName}</h6> 2740 <p class="cmp-polling-block__dispn">${pollQuestionDescription}</p> 2741 <p class="cmp-polling-block__alertmsg" style="display: none">Voting Completed</p> 2742 </div> 2743 <div class="cmp-polling-block__body"> 2744 <ul class="cmp-polling-block__ul d-flex flex-wrap"> 2745 ${optionsHTML} 2746 </ul> 2747 <div class="cmp-polling-block__footer d-flex justify-content-between"> 2748 <div class="cmp-polling-block__footer-left"> 2749 <div class="cmp-polling-block__error" style="display: none">Please Select an Option !</div> 2750 </div> 2751 <div id="locked-msg-loading-overlay" class="locked-msg-loading-overlay" style="display: none; text-align: center;"> 2752 <img src="/etc/designs/mmonline/cl
2752ientlibs/img/ajax-loader.gif" alt="loading" /> 2753 </div> 2754 <div class="cmp-polling-block__footer-right"> 2755 <button class="mm-btn mm-btn--primary vote-button" data-questionid="${opinionPollQuestionId}" ${buttonColor ? `style="background-color: ${buttonColor};border-color: ${buttonColor}"` : ''}><span>${voteButtonText}</span></button> 2756 </div> 2757 </div> 2758 </div> 2759 </div> 2760 </div> 2761 `); 2762 pollingBlock.find('.cmp-polling-block__icon').each(function () { 2763 if ($(this).children('img').length === 0) { 2764 $(this).hide(); 2765 } 2766 }) 2767 }; 2768 const displayResult = async (opinionPollQuestionId) => { 2769 const pollDataUrl = opinionPollBlock.attr('data-pollingurl'); 2770 const resultDataUrl = `${pollDataUrl}-Votes.json`; 2771 try { 2772 const resultData = await $.ajax({ 2773 url: resultDataUrl, 2774 method: 'GET', 2775 dataType: 'json' 2776 }); 2777 const pollingBlock = opinionPollBlock.find(`#pollingBlock-${opinionPollQuestionId}`); 2778 $('.locked-msg-loading-overlay').css('display','none'); 2779 pollingBlock.find('.cmp-polling-block__body').remove(); 2780 const resultBlock = ` 2781 <div class="cmp-polling-block__body cmp-polling-block__body--result"> 2782 <ul class="cmp-polling-block__ul d-flex flex-wrap"> 2783 2784 </ul> 2785 2786 </div>`; 2787 pollingBlock.find('.cmp-polling-block__option-block').append(resultBlock); 2788 const resultUl = pollingBlock.find('.cmp-polling-block__ul'); 2789 const resultDataList = resultData.opinionPollQuestion.find(q => q.opinionPollQuestionId === opinionPollQuestionId).opinionPollOption; 2790 if (Array.isArray(resultDataList) && resultDataList.length > 0) { 2791 resultDataList.forEach((option) => { 2792 const liElement = ` 2793 <li class="cmp-polling-block__li"> 2794 <div class="cmp-polling-block__prcntge"> 2795 <div class="cmp-polling-block__prcntge-title">${option.opinionPollOptionValue}</div> 2796 <div class="cmp-polling-block__prcntge-barblock d-flex align-items-center"> 2797 <div class="cmp-polling-block__prcntge-bar"> 2798 <div class="cmp-polling-block__voteprcntge" style="width: ${option.opinionPollOptionVoteCountPercentage}%"></div> 2799 </div> 2800 <div class="cmp-polling-block__prcntge-value">${option.opinionPollOptionVoteCountPercentage}%</div> 2801 </div> 2802 <div class="cmp-polling-block__prcntge-votecount">${option.opinionPollOptionVoteCount} VOTES</div> 2803 </div> 2804 </li>`; 2805 resultUl.append(liElement); 2806 }); 2807 } 2808 } catch (error) { 2809 console.error('Error fetching result data:', error); 2810 } 2811 }; 2812 2813 const getCookie = (name) => { 2814 let cookieArr = document.cookie.split(';'); 2815 for (let i = 0; i < cookieArr.length; i++) { 2816 let cookiePair = cookieArr[i].split('='); 2817 if (name === cookiePair[0].trim()) { 2818 return decodeURIComponent(cookiePair[1]); 2819 } 2820 } 2821 return null; 2822 }; 2823 2824 const storeVoteStatus = (opinionPollQuestionId) => { 2825 const userName = getUserName(); 2826 sessionStorage.setItem(`hasVoted_${opinionPollQuestionId}_${userName}`, 'true'); 2827 }; 2828 2829 const hasUserVoted = (opinionPollQuestionId) => { 2830 const userName = getUserName(); 2831 return sessionStorage.getItem(`hasVoted_${opinionPollQuestionId}_${userName}`) === 'true'; 2832 }; 2833 2834 const storeUserName = () => { 2835 const mmu_pn = getCookie('mmu_pn'); 2836 sessionStorage.setItem('userName', mmu_pn); 2837 }; 2838 2839 const getUserName = () => { 2840 return sessionStorage.getItem('userName'); 2841 }; 2842 2843 let sso_auth = { 2844 isLoggedIn: function () { 2845 let loginStatus = getCookieVal(login_stat)?.trim(); 2846 var loggedIn = false;
2847 if (loginStatus === 'userLoggedIn') { 2848 loggedIn = true; 2849 } 2850 return loggedIn; 2851 } 2852 } 2853 2854 const submitVote = (opinionPollQuestionId, errorBlock) => { 2855 const pollingUl = opinionPollBlock.find(`#pollingBlock-${opinionPollQuestionId} .cmp-polling-block__ul`); 2856 const selectedInputOption = pollingUl.find('li input:checked'); 2857 const signInValue = document.querySelector('.cmp-header__nav-button.sign-in-button').dataset.utmsource; 2858 const apiKeyVal = '2pJiKtQ64rJyjQNDDcrPxsefJ3AVmLemifVZOPLb5gQPPHex9qb5Zk1TrphUM8yydvr10vcfl8h5P8Y9NHKjlCIqRg2sN99Zwpcm3foCl8XdMk2MkYrSf34kRdwFVehe'; 2859 2860 if (selectedInputOption.length === 0) { 2861 $('.locked-msg-loading-overlay').css('display','none'); 2862 errorBlock.show(); 2863 return; 2864 } 2865 const requestData = []; 2866 selectedInputOption.each(function () { 2867 const selectedOption = $(this); 2868 const selectedOptionId = selectedOption.data('pollquestionid'); 2869 const selectedOptionVal = selectedOption.val(); 2870 requestData.push({ 2871 "opinionPollOptionId": selectedOptionId.toString(), 2872 "opinionPollOptionValue": selectedOptionVal.toString() 2873 }); 2874 }); 2875 if (sso_auth.isLoggedIn()) { 2876 const submitUrl = `https://events.manoramaonline.com/MMQuizAndOpinionPollApp/opinion-poll/submit-question/${opinionPollQuestionId}`; 2877 $.ajax({ 2878 url: submitUrl, 2879 method: 'POST', 2880 contentType: 'application/json', 2881 headers: { 2882 'apiKey': apiKeyVal 2883 }, 2884 data: JSON.stringify(requestData), 2885 success: function (responseData) { 2886 storeVoteStatus(opinionPollQuestionId); 2887 displayResult(opinionPollQuestionId); 2888 }, 2889 error: function (error) { 2890 console.error('Error submitting vote:', error); 2891 } 2892 }); 2893 } else { 2894 console.log('User is not logged in.'); 2895 $('.locked-msg-loading-overlay').css('display','none'); 2896 ssoIn(false, signInValue); 2897 } 2898 }; 2899 2900 function ssoIn(signUpFlag, utmsource) { 2901 let currLoc = encodeURIComponent(window.location.href); 2902 window.location.href = mmlog_path + "?a=in&pageURL=" + currLoc + "&signUpFlag=" + signUpFlag + "&utm_source=" + utmsource; 2903 } 2904 opinionPollBlock.on('click', '.vote-button', function (event) { 2905 event.preventDefault(); 2906 $('.locked-msg-loading-overlay').css('display','block'); 2907 const opinionPollQuestionId = $(this).data('questionid'); 2908 const errorBlock = $(this).closest('.polling-block').find('.cmp-polling-block__error'); 2909 if (sso_auth.isLoggedIn()) { 2910 storeUserName(); 2911 if (hasUserVoted(opinionPollQuestionId)) { 2912 $('.locked-msg-loading-overlay').css('display','none'); 2913 console.log('You have already voted on this question.'); 2914 return; 2915 } 2916 } 2917 submitVote(opinionPollQuestionId, errorBlock); 2918 }); 2919 2920 errorBlockHide(); 2921 getAndAppendPollingData(); 2922 }); 2923} 2924 2925//update SponsorImageTheme in UserInteractionBlock whenever the site theme changes. 2926revampCustomutils.themeLabelClickListener = function () { 2927 let themeLabels = document.querySelectorAll(".cmp-theme__label");
2928 themeLabels.forEach((label) => { 2929 label.addEventListener("click", function () { 2930 let themeValueselected = label.querySelector("input[name='theme']:checked"); 2931 if (themeValueselected) { 2932 $(".cmp-sponser-block__logo img").each(function () { 2933 var $parentDiv = $(this).closest(".article-body__component-slot"); 2934 if ($parentDiv.data("quizurl") || $parentDiv.data("pollingurl")) { 2935 const sponsorImage = $(this); 2936 const poweredByImage = sponsorImage.attr("src"); 2937 let themeClass = "light"; 2938 2939 if ($("html").hasClass("mm-dark-theme")) { 2940 themeClass = "dark"; 2941 } 2942 sponsorImage 2943 .attr("src", poweredByImage) 2944 .removeClass("image-light-theme image-dark-theme") 2945 .addClass("image-" + themeClass + "-theme"); 2946 } 2947 }); 2948 } 2949 }); 2950 }); 2951}; 2952// MMO25-3716 User Interaction Quiz 2953revampCustomutils.userInteractionQuizBlock = function () { 2954 const articleBodySlots = $('.article-body__component-slot[data-quizUrl]'); 2955 articleBodySlots.each(function (index) { 2956 let qaDataUrl = $(this).attr('data-quizUrl'); 2957 const qaBlockId = `quizBlock_${(index + 1).toString().padStart(2, '0')}`; 2958 $(this).attr('id', qaBlockId); 2959 const qaBlock = $(`#${qaBlockId}`); 2960 let currentQuestionIndex = 0; 2961 let isCarousel = false; 2962 let anyOptionSelected = false; 2963 let respData = []; 2964 const createDescriptionElement = (description) => { 2965 return $('<div>').addClass('cmp-multiple-choice__answerDispn').append($('<p>').html(description)); 2966 }; 2967 const userInteractionQaBlock = async () => { 2968 if (qaBlock.find('.multiple-choice-outer').length === 0) { 2969 let dataQuizCode = qaBlock.attr('data-quizUrl'); 2970 qaDataUrl = `${dataQuizCode}.json`; 2971 try { 2972 const responseData = await $.ajax({ 2973 url: qaDataUrl, 2974 method: 'GET', 2975 dataType: 'json' 2976 }); 2977 respData = responseData.quizQuestions; 2978 const quizLanguage = responseData.quizLanguage; 2979 const quizName = responseData.quizName; 2980 const quizPoweredByImage = responseData.quizPoweredByImage; 2981 const quizPoweredBy = responseData.quizPoweredBy; 2982 const quizPoweredByWebsiteUrl = responseData.quizPoweredByWebsiteUrl; 2983 const quizPoweredByNewTab = responseData.quizPoweredByNewTab; 2984 let languageClass = ''; 2985 2986 if (quizLanguage === 'Malayalam') { 2987 languageClass = 'ml-font';
2988 } else if (quizLanguage === 'English') { 2989 languageClass = 'english-font'; 2990 } 2991 qaBlock.append(` 2992 <div class="multiple-choice-outer "> 2993 <div class="cmp-section-title-block"> 2994 <h3 class="cmp-section-title"><span class="cmp-section-shape"></span></h3> 2995 <div class="cmp-sponser-block "> 2996 <div class="cmp-sponser-block__title"></div> 2997 <div class="cmp-sponser-block__logo"><a tabindex="0"> <img> </a> </div> 2998 </div> 2999 </div> 3000 <div class="multiple-choice-question-block ${languageClass}"></div> 3001 </div> 3002 `); 3003 if (responseData.quizStatus !== 'Active') { 3004 qaBlock.remove(); 3005 return; 3006 } 3007 const titleElement = $('<h3>').addClass('cmp-section-title').append( 3008 $('<span>').addClass('cmp-section-shape'), 3009 quizName, 3010 3011 ); 3012 qaBlock.find('.cmp-section-title').html(titleElement); 3013 if (quizPoweredByWebsiteUrl) { 3014 qaBlock.find('.cmp-sponser-block__title').text('Powered By'); 3015 const sponsorLink = qaBlock.find('.cmp-sponser-block__logo a').attr('href', quizPoweredByWebsiteUrl); 3016 if (quizPoweredByNewTab) { 3017 sponsorLink.attr('target', '_blank'); 3018 } 3019 if (quizPoweredByImage) { 3020 const sponsorImage = qaBlock.find('.cmp-sponser-block__logo img'); 3021 sponsorImage.attr('src', quizPoweredByImage).attr('alt', quizPoweredBy); 3022 updateSponsorImageTheme(sponsorImage); 3023 } else { 3024 qaBlock.find('.cmp-sponser-block__logo img').remove(); 3025 } 3026 } else { 3027 qaBlock.find('.cmp-sponser-block__logo a').remove(); 3028 } 3029 appendQABlocks(responseData.quizQuestions); 3030 if (responseData.quizDisplayType === 'horizontalVariant') { 3031 qaBlock.find('.multiple-choice-outer').addClass('multiple-choice-outer--carousal'); 3032 isCarousel = true; 3033 } else if (responseData.quizDisplayType === 'verticalVariant') { 3034 qaBlock.find('.multiple-choice-outer').removeClass('multiple-choice-outer--carousal'); 3035 qaBlock.find('.cmp-multiple-choice').show(); 3036 } 3037 3038 if (isCarousel) { 3039 createPrimaryButton(); 3040 } 3041 } catch (error) { 3042 console.error('Error fetching data:', error); 3043 } 3044 } 3045 3046 }; 3047 const updateSponsorImageTheme = () => { 3048 $('.cmp-sponser-block__logo img').each(function() { 3049 var $parentDiv = $(this).closest('.article-body__component-slot'); 3050 if ($parentDiv.data('quizurl')) { 3051 const sponsorImage = $(this); 3052 const quizPoweredByImage = sponsorImage.attr('src'); 3053 if ($('html').hasClass('mm-light-theme')) { 3054 sponsorImage.attr('src', quizPoweredByImage).removeClass('image-dark-theme').addClass('image-light-theme'); 3055 } else if ($('html').hasClass('mm-dark-theme')) { 3056 sponsorImage.attr('src', quizPoweredByImage).removeClass('image-light-theme').addClass('image-dark-theme'); 3057 } else { 3058 sponsorImage.attr('src', quizPoweredByImage).removeClass('image-dark-theme').addClass('image-light-theme'); 3059 } 3060 } 3061 }); 3062 }; 3063 const calculateScore = () => { 3064 let correctAnswers = 0; 3065 respData.forEach((qaData, index) => { 3066 const selectedOption = qaBlock.find('.cmp-multiple-choice').eq(index).find('.cmp-multiple-choice__answer.cmp-multiple-choice__selected'); 3067 if (selectedOption.length > 0 && selectedOption.index() === qaData.correctAnswer) { 3068 correctAnswers++; 3069 } 3070 }); 3071 return correctAnswers; 3072 }; 3073 const displayResult = () => { 3074 const score = calculateScore(); 3075 const totalQuestions = respData.length; 3076 const resultHTML = ` 3077 <div class="cmp-multiple-choice cmp-multiple-choice__result"> 3078 <div class="cmp-multiple-choice__result-title en-font">Thank you for participating...</div> 3079 <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> 3080 <div style="width: 100%;margin-top: 10px;"><button class="mm-btn mm-btn--primary restartBtn"><span>Restart </span></button></div>
3081 </div> 3082 `; 3083 qaBlock.find('.cmp-multiple-choice__footer').before(resultHTML); 3084 }; 3085 3086 const createPrimaryButton = () => { 3087 qaBlock.find('.multiple-choice-question-block').append(` 3088 <div class="cmp-multiple-choice__footer d-flex justify-content-between"> 3089 <div class="cmp-multiple-choice__footer-left"> 3090 <div class="cmp-multiple-choice__error" style="display: none">Please Select an Option !</div> 3091 </div> 3092 <div class="cmp-multiple-choice__footer-right"> 3093 <button class="mm-btn mm-btn--primary" disabled> 3094 <span>Next <i class="mm-icon mm-white-icon mm-icon__arrow-left-sm-rounded"></i></span> 3095 </button> 3096 </div> 3097 </div> 3098 `); 3099 }; 3100 const createQABlock = (qaData, index, dataLength) => { 3101 let optionsHTML = ''; 3102 qaData.quizOptions.forEach((option, optionIndex) => { 3103 optionsHTML += `<button class="cmp-multiple-choice__answer cmp-multiple-choice__unanswered cmp-multiple-choice__not-selected"> 3104 <div class="cmp-multiple-choice__text">${option.quizOptionValue}</div> 3105 </button>`; 3106 }); 3107 3108 let imageHTML = ''; 3109 if (qaData.questionImage) { 3110 imageHTML = `<div class="cmp-story-figure"> 3111 <figure class="cmp-story-figure__in"> 3112 <div class="cmp-story-figure__image"> 3113 <div class="cmp-story-figure__web-image"><img src="${qaData.questionImage}" title="" alt=""></div> 3114 </div> 3115 </figure> 3116 </div>`; 3117 } 3118 3119 return ` 3120 <div class="cmp-multiple-choice"> 3121 <div class="cmp-multiple-choice__counter"> 3122 <span class="cmp-multiple-choice__counter-current">${index + 1}</span> of ${dataLength} 3123 </div> 3124 <h6 class="cmp-multiple-choice__question">${qaData.question}</h6> 3125 ${imageHTML} 3126 <div class="cmp-multiple-choice__option-block"> 3127 ${optionsHTML} 3128 </div> 3129 </div> 3130 `; 3131 }; 3132 const appendQABlocks = (data, isCarousel) => { 3133 3134 data.forEach((qaData, index) => { 3135 const qaBlockHTML = createQABlock(qaData, index, data.length); 3136 qaBlock.find('.multiple-choice-question-block').append(qaBlockHTML); 3137 if (!isCarousel && index !== currentQuestionIndex) { 3138 qaBlock.find('.cmp-multiple-choice').eq(index).hide(); 3139 } 3140 }); 3141 }; 3142 qaBlock.on('click', '.mm-btn--primary', (event) => { 3143 3144 let currentQuestion = qaBlock.find('.cmp-multiple-choice').eq(currentQuestionIndex); 3145 let isVisibleBlock = currentQuestion.is(':visible'); 3146 3147 if (isVisibleBlock) { 3148 if (!anyOptionSelected) { 3149 qaBlock.find('.cmp-multiple-choice__error').show(); 3150 } else { 3151 let currentError = currentQuestion.find('.cmp-multiple-choice__footer .cmp-multiple-choice__error'); 3152 currentError.hide(); 3153 currentQuestionIndex++; 3154 if (currentQuestionIndex < respData.length) { 3155 anyOptionSelected = false; 3156 showQuestion(currentQuestionIndex); 3157 } else { 3158 qaBlock.find('.cmp-multiple-choice').hide(); 3159 qaBlock.find('.cmp-multiple-choice__footer-right').hide(); 3160 displayResult(); 3161 } 3162 } 3163 } 3164 }); 3165 qaBlock.on('click', '.cmp-multiple-choice__answer', (event) => { 3166 let selectedButton = $(event.currentTarget); 3167 let multipleChoiceBlk = selectedButton.closest('.cmp-multiple-choice'); 3168 let questionAllOption = multipleChoiceBlk.find('.cmp-multiple-choice__answer'); 3169 let selectedBtnIndex = selectedButton.index(); 3170 let questionIndex = multipleChoiceBlk.index(); 3171 let qaData = respData[questionIndex]; 3172 let correctOptionIndex = qaData.correctAnswer; 3173 let isCorrectAnswer = selectedBtnIndex == correctOptionIndex; 3174 let correctOptionButton = questionAllOption[correctOptionIndex]; 3175 3176 for (let i = 0; i < questionAllOption.length; i++) { 3177 questionAllOption[i].classList.remove('cmp-multiple-choice__unanswered'); 3178 questionAllOption[i].classList.add('cmp-multiple-choice__answered'); 3179 } 3180 if (isCarousel) { 3181 qaBlock.find('.cmp-multiple-choice__error').hide(); 3182 } 3183 if (!selectedButton.hasClass('cmp-multiple-choice__selected')) { 3184 selectedButton.removeClass('cmp-multiple-choice__not-selected').addClass('cmp-multiple-choice__selected'); 3185 if (isCorrectAnswer) { 3186 selectedButton.addClass('cmp-multiple-choice__correct'); 3187 } else { 3188 selectedButton.addClass('cmp-multiple-choice__incorrect'); 3189 correctOptionButton.classList.add('cmp-multiple-choice__correct'); 3190 } 3191 if (qaData.correctAnswerExplanation || qaData.correctAnswerExplanation == '') { 3192 let descriptionElement = createDescriptionElement(qaData.correctAnswerExplanation); 3193 multipleChoiceBlk.find('.cmp-multiple-choice__answerDispn').remove(); 3194 multipleChoiceBlk.append(descriptionElement); 3195 } 3196 anyOptionSelected = true; 3197 qaBlock.find('.mm-btn--primary').attr('disabled', false); 3198 } 3199 }); 3200 qaBlock.on('click', '.restartBtn', () => { 3201 resetQuizState(); 3202 }); 3203 const resetQuizState = () => { 3204 currentQuestionIndex = 0; 3205 anyOptionSelected = false;
3206 let multipleChoiceOuter = qaBlock.find('.multiple-choice-outer'); 3207 if (multipleChoiceOuter) { 3208 multipleChoiceOuter.remove(); 3209 } 3210 userInteractionQaBlock(); 3211 }; 3212 const showQuestion = (index) => { 3213 qaBlock.find('.cmp-multiple-choice').hide(); 3214 qaBlock.find('.cmp-multiple-choice').eq(index).show(); 3215 }; 3216 userInteractionQaBlock(); 3217 }); 3218} 3219 3220$(function () { 3221 var bkElement = document.getElementById('breaking-news-url'); 3222 3223 if (bkElement) { 3224 revampCustomutils.loadBreakingNews(); 3225 } 3226 revampCustomutils.cartoonSlider(); 3227 revampCustomutils.gameSlider(); 3228 // revampCustomutils.todaysEpaper(); // command for next phase 3229 revampCustomutils.videoPlayer(); 3230 revampCustomutils.scoreBoardSlider(); 3231 revampCustomutils.mmScoreBoardDateTab(); 3232 revampCustomutils.articleSlider(); 3233 revampCustomutils.articleGallery(); 3234 revampCustomutils.artcleSimpleslider(); 3235 revampCustomutils.premiumImageSlideShow(); 3236 revampCustomutils.searchComponent(); 3237 revampCustomutils.errorPageListingTab(); 3238 revampCustomutils.storyCardSlickSlider(); 3239 revampCustomutils.vuukleComment(); 3240 revampCustomutils.indepthListHide(); 3241 revampCustomutils.listShowMore(); 3242 revampCustomutils.reportersShare(); 3243 revampCustomutils.displayPublishDate(); 3244 revampCustomutils.removeWatchNext(); 3245 handleUserInteractionsOnScroll(); 3246 mmTab(); 3247 revampCustomutils.storylistMore(); 3248 $('.cmp-pagination__btn--active, .cmp-pagination__btn--prev.hidden').on('click', function(e){ 3249 e.preventDefault(); 3250 }); 3251}); 3252 3253$(window).on('load resize scroll', function () { 3254 revampCustomutils.fullwidthBackground(); 3255 if (!hasPageScrolled) { 3256 revampCustomutils.searchPopupScroll(); 3257 } 3258}); 3259 3260// User Interaction Scroll to load 3261function handleUserInteractionsOnScroll() { 3262 let scrollCount = 0; 3263 function handleUserInteractions() { 3264 scrollCount++; 3265 if (scrollCount >= 2) { 3266 revampCustomutils.userInteractionPollingBlock(); 3267 revampCustomutils.userInteractionQuizBlock(); 3268 window.removeEventListener('scroll', handleUserInteractions); 3269 } 3270 } 3271 window.addEventListener('scroll', handleUserInteractions); 3272} 3273 3274/* Listcomponent Refresh */ 3275$(document).ready(function () { 3276 3277 let clearTimer; 3278 3279 clearTimer = setInterval(() => { 3280 updateLatestNews(); 3281 3282 }, 60000); 3283 3284 document.addEventListener("visibilitychange", () => { 3285 3286 if (document.hidden) { 3287 clearInterval(clearTimer); 3288 } else { 3289 3290 updateLatestNews(); 3291 clearTimer = setInterval(() => { 3292 updateLatestNews(); 3293 3294 }, 60000); 3295 } 3296 }); 3297 3298 }); 3299 3300 3301 3302 function updateLatestNews(){ 3303 3304 let refreshComp, datahtml = "",componentpath; 3305 $(".refreshComponent").each(function () { 3306 3307 componentpath = $(this).data("refreshurl"); 3308 refreshComp = $(this); 3309 (function(refreshComp){ 3310 $.ajax({ 3311 url: componentpath, 3312 type: "GET", 3313 dataType: 'html', 3314 3315 success: function(data, status,xhr){ 3316 3317 if(refreshComp.find(".recommendationListContainer").index() != -1){ 3318 froomleTopnews(data,refreshComp.find(".recommendationListContainer")); 3319 initiateSlidersAndWidgets(); 3320 } 3321 else{ 3322 3323 datahtml = $(data); 3324 recallAdEmbed(refreshComp,datahtml); 3325 recallLiveUpdate(refreshComp,datahtml); 3326 refreshComp.replaceWith(datahtml); 3327 revampCustomutils.displayPublishDate(); 3328 initiateSlidersAndWidgets(); 3329 3330 } 3331 if (typeof addSaveItemsEventListeners === "function") { 3332 addSaveItemsEventListeners(); 3333 let savedData = JSON.parse(localStorage.getItem("savedItems") || initData); 3334 activateSavedArticlesOnLoad(savedData["addedIds"], "add"); 3335 } 3336 if( (refreshComp.find(".trending-block").index() != -1) && checkMCookie("premium_token") && typeof handleTrendingNumber === 'function'){ 3337 handleAdReplace(document.querySelector(".trending-block")); 3338 handleTrendingNumber(); 3339 } 3340 3341 }, 3342 error: function(request, status, error){ 3343 console.log(data) 3344 } 3345 }); 3346 3347 })(refreshComp); 3348 3349 }); 3350 3351 3352 } 3353 3354 function initiateSlidersAndWidgets(){ 3355 getDeviceType(); 3356 revampCustomutils.scoreBoardSlider(); 3357 utils.imageBlockSlider(); 3358 } 3359 3360 function recallAdEmbed(theComponent,datahtml) { 3361 3362 let pElement; 3363 3364 if (theComponent.find('.list-native-embed').length > 0) { 3365 pElement = theComponent.find(".list-native-embed"); 3366 datahtml.find(".list-native-embed").replaceWith(pElement.get(0)); 3367 3368 } 3369 3370 } 3371 3372 function recallLiveUpdate(theComponent,datahtml){ 3373 let pElement; 3374 3375 if (theComponent.find('#mm-live-update-content-list').length > 0) { 3376 pElement = theComponent.find("#mm-live-update-content-list"); 3377 datahtml.find("#mm-live-update-content-list").replaceWith(pElement.get(0)); 3378 3379 } 3380 3381 } 3382 function mainNavHover(){ 3383 var timeout; 3384 $('.main-nav__li--with-mega-menu').on('mouseenter', function () { 3385 var $thisElement = $(this); 3386 3387 if (timeout != null) { clearTimeout(timeout); } 3388 3389 timeout = setTimeout(function () { 3390 $('.main-nav__li--with-mega-menu').removeClass("hoverActive"); 3391 $thisElement.addClass("hoverActive"); 3392 $(".lazyload").unveil(); 3393 }, 100); 3394 }); 3395 3396 $('.main-nav__li--with-mega-menu').on('mouseleave', function () { 3397 if (timeout != null) { 3398 clearTimeout(timeout); 3399 3400 timeout = null; 3401 setTimeout(function() { 3402 $('.main-nav__li--with-mega-menu').removeClass("hoverActive"); 3403 }, 100); 3404 } 3405 }); 3406 3407 } 3408 3409 function mmTab() { 3410 $('.cmp-mega-menu .cmp-tab-block').each(function () { 3411 let tabThis = $(this); 3412 if (!tabThis.find('.cmp-tab-block__nav-li').hasClass('active')) { 3413 tabThis.find('.cmp-tab-block__nav-li:first-child').addClass('active'); 3414 tabThis.find('.cmp-tab-block__item:first').addClass('active'); 3415 tabThis.find('.cmp-tab-block__item').hide(); 3416 tabThis.find('.cmp-tab-block__item:first').show(); 3417 } else { 3418 let index = tabThis.find('.cmp-tab-block__nav-li.active').index(); 3419 tabThis.find('.cmp-tab-block__item').hide(); 3420 tabThis.find('.cmp-tab-block__item').eq(index).show(); 3421 3422 } 3423 tabThis.find('.cmp-tab-block__nav-li a').on("click", function () { 3424 tabThis.find('.cmp-tab-block__nav-li').removeClass('active'); 3425 $(this).parent('.cmp-tab-block__nav-li').addClass('active'); 3426 tabThis.find('.cmp-tab-block__item').hide().removeClass('active'); 3427 let activeIndex = $(this).parent('.cmp-tab-block__nav-li').index(); 3428 tabThis.find('.cmp-tab-block__item').eq(activeIndex).fadeIn().addClass('active'); 3429 return false;
3430 }); 3431 }); 3432 } 3433revampCustomutils.storylistMore = function () { 3434 $('.cmp-story-list__control-btn--more-menu.cmp-history-custom-dropdown').off("click").on("click", function () { 3435 var $storylistMore = $(this).closest('.cmp-story-list__control-li').find(".cmp-story-list__drop-down"); 3436 if ($storylistMore.hasClass("active")) { 3437 $storylistMore.removeClass("active").fadeOut(100); 3438 } else { 3439 $(".cmp-story-list__drop-down").removeClass("active").fadeOut(100); 3440 $storylistMore.fadeIn(100).delay(100).addClass("active"); 3441 } 3442 }); 3443 $(document).on("click", function () { 3444 $(".cmp-story-list__drop-down").removeClass("active").fadeOut(100); 3445 }); 3446 $('.cmp-story-list__control-btn--more-menu, .cmp-story-list__drop-down').on("click", function (event) { 3447 event.stopPropagation(); 3448 }); 3449} 3450 3451$(document).ready(function () { 3452 mainNavHover(); 3453 $(".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() : "" }); 3454 $(".article-body__aside .cmp-container>.ad-premiumuser").each(function (i, e) { !$(e).height() ? $(e).closest(".ad-premiumuser").remove() : "" }); 3455 3456 /* Listingtab tab switching */ 3457 $(".cmp-nav-tab .cmp-nav-tab-menu .cmp-nav-tab__ul a.cmp-nav-tab__a").click(function (e) { 3458 e.preventDefault(); 3459 $(".cmp-nav-tab__li").removeClass("active"); 3460 let tab = $(this).closest("li"); 3461 tab.addClass("active"); 3462 let category = tab.attr("id"); 3463 if (category) { 3464 category = `[aria-labelledby='${category}']`; 3465 $(".cmp-nav-tab__content .cmp-tabs__tabpanel").removeClass("cmp-tabs__tabpanel--active").filter(category).addClass("cmp-tabs__tabpanel--active"); 3466 if($('.cmp-story-list.cmp-story-list--slider').slick('refresh')){ 3467 $('.cmp-story-list.cmp-story-list--slider').on('afterChange', function(e, slick, currentSlide){ 3468 $(".lazyload").unveil(); 3469 }); 3470 } 3471 } 3472 }); 3473 3474}); 3475 3476//podcastlisting 3477 3478const podcastListing = () => { 3479 3480 const podcastShowcaseListing = document.getElementById("podcast-showcase-listing"); 3481 const podcastCarouselListing = document.getElementById("podcast-carousel-listing"); 3482 const podcastPrograms = document.getElementById("podcastlisting"); 3483 let liHTMLtoAppend = ""; 3484 if (podcastShowcaseListing) { 3485 const playlistData = getPodcastPlaylistJSON(podcastShowcaseListing); 3486 if(playlistData !== null){ 3487 liHTMLtoAppend = generatePodcastShowcaseHTML(playlistData,podcastPrograms); 3488 } 3489 podcastShowcaseListing.innerHTML = liHTMLtoAppend; 3490 } 3491 if(podcastCarouselListing){ 3492 $(".podcastlisting").find(".cmp-story-list.cmp-podcast-list--slider.slick-initialized").slick('unslick'); 3493 const playlistDataCarousel = getPodcastPlaylistJSON(podcastCarouselListing); 3494 if(playlistDataCarousel !== null){ 3495 liHTMLtoAppend = generatePodcastCarouselHTML(playlistDataCarousel ,podcastPrograms); 3496 } 3497 podcastCarouselListing.innerHTML = liHTMLtoAppend; 3498 slickPodcastCarousel(); 3499 3500 } 3501 3502 3503 3504 } 3505 3506 function slickPodcastCarousel(){ 3507 if($('.podcast-main-slider-block .cmp-podcast-list--slider').length > 0) { 3508 $('.podcast-main-slider-block .cmp-podcast-list--slider').each(function () { 3509 $(this).slick({ 3510 infinite: true, 3511 centerMode: true, 3512 variableWidth: true, 3513 centerPadding: '50px', 3514 slidesToShow: 1, 3515 dots: true, 3516 prevArrow: '<button class="slide-arrow prev-arrow"><i class="mm-icon mm-icon__arrow-right-lg"></i> </button>', 3517 nextArrow: '<button class="slide-arrow next-arrow"><i class="mm-icon mm-icon__arrow-left-lg"></i> </button>', 3518 responsive: [ 3519 3520 { 3521 breakpoint: 836, 3522 settings: { 3523 centerPadding: '60px' 3524 } 3525 }, 3526 { 3527 breakpoint: 576, 3528 settings: { 3529 centerPadding: '30px' 3530 } 3531 } 3532 ] 3533 }); 3534 }); 3535 } 3536 } 3537 3538function getPodcastPlaylistJSON(podcastElement) { 3539 const playlistId = podcastElement.getAttribute("data-playlist-id"); 3540 const maxcount = podcastElement.getAttribute("data-listingcount"); 3541 3542 try { 3543 const response = $.ajax({ 3544 type: "GET", 3545 url: `https://api.omny.fm/orgs/38abe477-df60-4cf0-bd9f-b1fe00d0bda4/playlists/` + playlistId + `/clips?pageSize=`+maxcount, 3546 async: false, 3547 }); 3548 3549 if (response.status != 200) { 3550 throw Error(response.statusText); 3551 } 3552 3553 const allClips = response.responseJSON.Clips; 3554 if(allClips.length > 0){ 3555 return allClips; 3556 }else{ 3557 return null; 3558 } 3559 3560 3561 } catch (err) { 3562 console.error(err); 3563 return null; 3564 } 3565} 3566 3567function generatePodcastCarouselHTML(clipsArray,podcastElement){
3568 let carouselLiHTML = ""; 3569 const programData=JSON.parse(podcastElement.getAttribute("data-program")); 3570 for (const element of clipsArray) { 3571 let program = programData[element.ProgramId]; 3572 let programPath = program ? program.programPath : ''; 3573 let programTitle = program ? program.programTitle : ''; 3574 carouselLiHTML += ` 3575 <li class="cmp-story-list__item"> 3576 <div class="cmp-story-list__item-in"> 3577 <div class="cmp-story-list__content"> 3578 <h2 class="cmp-story-list__title"> <a href="${programPath}#podcast_playlist" 3579 class="cmp-story-list__title-link" title="${element.Title}"> ${element.Title} </a> </h2> 3580 <div class="cmp-story-list__content-bottom"> 3581 <div class="cmp-story-list__content-btm-left"> 3582 3583 <a href="${programPath}" class="cmp-story-list__pretitle" title="${programTitle}">${programTitle}</a> 3584 </div> 3585 <div class="cmp-story-list__content-btm-right"> 3586 <ul class="cmp-story-list__controls"> 3587 <li class="cmp-story-list__control-li"> 3588 <button class="cmp-story-list__control-btn" title=""><i 3589 class="mm-icon mm-gray-icon mm-icon__bookmark-sm"></i></button> 3590 </li> 3591 </ul> 3592 </div> 3593 </div> 3594 3595 </div> 3596 <div class="cmp-story-list__image-block"> <a class="cmp-story-list__image-link" 3597 href="${programPath}#podcast_playlist" title="${element.Title}"> 3598 <div class="cmp-story-list__media-icon"><i 3599 class="mm-icon mm-white-icon mm-icon__play-btn-icon"></i></div> 3600 <img src="${element.ImageUrl}" alt="" class="cmp-story-list__img"> 3601 </a> </div> 3602 </div> 3603 </li> 3604 3605 `; 3606 3607 } 3608 3609 return carouselLiHTML; 3610} 3611 3612 3613function generatePodcastShowcaseHTML(clipsArray,podcastElement){ 3614 let showcaseLiHTML = ""; 3615 const programData=JSON.parse(podcastElement.getAttribute("data-program")); 3616 for (const element of clipsArray) { 3617 let program = programData[element.ProgramId]; 3618 let programPath = program ? program.programPath : ''; 3619 let programTitle = program ? program.programTitle : ''; 3620 showcaseLiHTML += ` 3621 <li class="cmp-story-list__item"> 3622 <div class="cmp-story-list__item-in"> 3623 <div class="cmp-story-list__content"> 3624 <h2 class="cmp-story-list__title"> <a href="${programPath}#podcast_playlist" class="cmp-story-list__title-link" title="${element.Title}"> 3625 ${element.Title} 3626 </a> </h2> 3627 <div class="cmp-story-list__content-bottom"> 3628 <div class="cmp-story-list__content-btm-left"> <a href="${programPath}" 3629 class="cmp-story-list__pretitle" title="${programTitle}">${programTitle}</a> </div> 3630 <div class="cmp-story-list__content-btm-right"> 3631 <ul class="cmp-story-list__controls"> 3632 <li class="cmp-story-list__control-li"> 3633 <button class="cmp-story-list__control-btn" title=""><i 3634 class="mm-icon mm-gray-icon mm-icon__bookmark-sm"></i></button> 3635 </li> 3636 </ul> 3637 </div> 3638 </div> 3639 </div> 3640 <div class="cmp-story-list__image-block"> <a class="cmp-story-list__image-link" href="${programPath}#podcast_playlist" 3641 title="${element.Title}"> 3642 <div class="cmp-story-list__media-icon"><i 3643 class="mm-icon mm-white-icon mm-icon__podcast"></i> </div> 3644 <img src="${element.ImageUrl}" 3645 alt="" class="cmp-story-list__img"> 3646 </a> </div> 3647 </div> 3648 </li> 3649 3650 `; 3651 } 3652 3653 return showcaseLiHTML; 3654} 3655 3656
3657podcastListing(); 3658 3659$('.podcast-page-block .mm-btn.mm-btn--primary-outline').each(function() { 3660 let currentHref = $(this).attr('href'); 3661 // For MMO25-5855, It will Only append if href exists and doesn't already contain the fragment identifier 3662 if (currentHref && !currentHref.includes('#podcast_playlist')) { 3663 let newHref = currentHref + '#podcast_playlist'; 3664 $(this).attr('href', newHref); 3665 } 3666}); 3667const revampHeaderutils = {}; 3668 3669 3670const LOGIN_STATUS_COOKIE = 'mmu_ls'; 3671const USER_LOGGED_IN = 'userLoggedIn'; 3672const login_userName = 'mmu_pn'; 3673const signInButton = document.querySelector('.cmp-header__nav-button.sign-in-button'); 3674const signInValue = signInButton ? signInButton.dataset.utmsource : null; 3675 3676// signin 3677revampHeaderutils.signIn = function () { 3678 $('.sign-in-button').on("click", function (e) { 3679 e.preventDefault(); 3680 if(signInValue != null){ 3681 ssoIn(false, signInValue); 3682 } 3683 }); 3684} 3685 3686// cookies 3687revampHeaderutils.getCookieByName = function (cookieName) { 3688 const cookie = document.cookie; 3689 try { 3690 let cookieValue = cookie.split(cookieName + '=')[1].split(';')[0].replace(/\+/g, '%20'); 3691 return decodeURIComponent(cookieValue); 3692 } catch (e) { 3693 console.log('Error reading cookie'); 3694 } 3695} 3696 3697// username 3698revampHeaderutils.getUserName = function () { 3699 let userName = revampHeaderutils.getCookieByName(login_userName); 3700 if (userName) { 3701 const firstName = userName.trim().split(' ')[0]; 3702 $('.cmp-login-block__after-head').attr('title', firstName); 3703 $('.cmp-login-block__user-letter').text(decodeURIComponent(userName).trim()); 3704 $('.cmp-login-block__user-name').text(decodeURIComponent(userName).trim()); 3705 } 3706} 3707 3708// myaccount check 3709revampHeaderutils.myAccount = function () { 3710 if (revampHeaderutils.isLoggedIn()) { 3711 $(".cmp-login-block__before-login").hide(); 3712 $(".cmp-login-block__after-login").show(); 3713 } 3714} 3715 3716revampHeaderutils.isLoggedIn = function () { 3717 const loginStatus = revampHeaderutils.getCookieByName(LOGIN_STATUS_COOKIE); 3718 return loginStatus === USER_LOGGED_IN; 3719} 3720 3721revampHeaderutils.redirectToHome = function () { 3722 window.location.href = window.location.origin; 3723} 3724$(window).resize(function () {}); 3725 3726// revampHeaderutils.handleHeaderOnScroll = function () { 3727// let firstScrollTop = 0; 3728// let headerTopAds = ($('.cmp-header').length > 0) ? $('.cmp-header').offset().top : 0; 3729// let headerTopOuter = $('.cmp-header__top').outerHeight(true) + 3; 3730// let headerMainOuter = $('.cmp-header__main').outerHeight(true); 3731// let headerFullHeight = $('.cmp-header').outerHeight(true); 3732// let mainNavHeight = headerFullHeight + headerTopAds; 3733// let footerNavOuter = $('.cmp-bottom-nav').outerHeight(true); 3734 3735// $(window).scroll(function (event) { 3736// let scrollTop = $(this).scrollTop(); 3737 3738// if (scrollTop > firstScrollTop && scrollTop > mainNavHeight) { 3739// $('.cmp-header').addClass('sticky-header'); 3740// $('.cmp-header').removeClass('scroll-up'); 3741// $('body').addClass("header-gap").css({ 3742// "padding-top": headerFullHeight 3743// }); 3744// if ($(window).width() > 991) { 3745// $('.cmp-header').css({ 3746// "top": -(headerTopOuter + headerMainOuter) 3747// }); 3748// } else { 3749// $('.cmp-header').css({ 3750// "top": -(headerTopOuter + headerMainOuter) 3751// }); 3752// } 3753// } else { 3754// if (scrollTop + $(window).height() < $(document).height() && scrollTop > mainNavHeight) { 3755// $('.cmp-header').addClass('sticky-header'); 3756// $('body').addClass("header-gap").css({ 3757// "padding-top": headerFullHeight 3758// }); 3759// if ($(window).width() > 991) { 3760// $('.cmp-header').css({ 3761// "top": -(headerTopOuter) 3762// }); 3763// } else { 3764// $('.cmp-header').css({
3765// "top": -(headerTopOuter) 3766// }).addClass("scroll-up"); 3767// if ($('.cmp-bottom-nav').length > 0) { 3768// $('.cmp-bottom-nav').removeClass('scroll-down'); 3769// } 3770// } 3771// } else { 3772// $('.cmp-header').removeClass('scroll-up sticky-header'); 3773// $('.cmp-header').css({ 3774// "top": -(headerFullHeight) 3775// }); 3776// $('body').removeClass("header-gap").css({ 3777// "padding-top": 0 3778// }); 3779// } 3780 3781// } 3782// if (scrollTop > firstScrollTop && scrollTop > footerNavOuter && $(window).width() < 991 && $('.cmp-bottom-nav').length > 0) { 3783// $('.cmp-bottom-nav').addClass('scroll-down'); 3784// $('.quikreadfloating').addClass('scroll-down-fixed'); 3785// } else { 3786// if (scrollTop + $(window).height() < $(document).height() && $(window).width() < 991 && $('.cmp-bottom-nav').length > 0) { 3787// $('.cmp-bottom-nav').removeClass('scroll-down'); 3788// $('.quikreadfloating').removeClass('scroll-down-fixed'); 3789// } 3790// } 3791// firstScrollTop = scrollTop; 3792// }); 3793// } 3794 3795// revampHeaderutils.handleTopAdBlockResize = function () { 3796// let topAdvtBlock = $(".top-advt-block .advtBlock__content")[0]; 3797// let resizeObserver = new ResizeObserver(() => { 3798// revampHeaderutils.handleHeaderOnScroll(); 3799// if ($(".top-advt-block .advtBlock__content").height() > 48) { 3800// $('.cmp-header').removeClass("sticky-header"); 3801// $('body').removeClass("header-gap").css({ 3802// "padding-top": 0 3803// }); 3804// revampHeaderutils.handleHeaderOnScroll(); 3805// } 3806// }); 3807// if (topAdvtBlock) { 3808// resizeObserver.observe(topAdvtBlock); 3809// } 3810// } 3811 3812 3813//Sets Current Date 3814revampHeaderutils.currentDate = function () { 3815 let formattedDate = new Date().toLocaleDateString('en-us', { weekday:"long", year:"numeric", month:"short", day:"numeric"}) ; 3816 document.querySelectorAll(".current-date").forEach(e => e.innerHTML = formattedDate); 3817} 3818 3819let navData = localStorage.getItem("NAV_CONTENT"); 3820if (navData) { 3821 navData = JSON.parse(navData); 3822} 3823 3824// Function to check if the nav data is already saved in localstorage 3825const checkForNavDataInLocalStorage = (url) => { 3826 3827 if (navData) { 3828 let lastStored = navData.storedAt; 3829 let now = new Date().getTime(); 3830 if (now - lastStored > 15 * 60 * 1000 || !navData.data[url]) { 3831 localStorage.removeItem("NAV_CONTENT"); 3832 return null; 3833 } else { 3834 return navData.data[url]; 3835 } 3836 } 3837 return null; 3838} 3839 3840const saveNavDataToLocalStorage = (key, data) => { 3841 let navData = { 3842 storedAt: new Date().getTime(), 3843 data: data 3844 } 3845 localStorage.setItem(key, JSON.stringify(navData)); 3846} 3847 3848const updateNavContent = (ele, content) => { 3849 ele.innerHTML = content; 3850 let navImg = document.querySelectorAll('.navlist-load img:not([data-src]'); 3851 navImg.forEach(function (img) { 3852 let dataWebsrc = img.getAttribute('data-websrc'); 3853 img.setAttribute('data-src', dataWebsrc); 3854 }); 3855 // For saved icons event handler register and indicators setting 3856 if (typeof addSaveItemsEventListeners === "function") { 3857 addSaveItemsEventListeners(); 3858 let savedData = JSON.parse(localStorage.getItem("savedItems") || initData); 3859 activateSavedArticlesOnLoad(savedData["addedIds"], "add"); 3860 } 3861} 3862 3863let navContent = {}; 3864 3865const loadNavContent = (ele) => { 3866 const url = ele.getAttribute('data-navlist-url'); 3867 3868 return new Promise((resolve, reject) => { 3869 let navData = checkForNavDataInLocalStorage(url); 3870 try { 3871 if (navData) { 3872 updateNavContent(ele, navData); 3873 resolve(); 3874 return; 3875 } 3876 3877 fetch(url) 3878 .then(response => response.text()) 3879 .then(content => { 3880 updateNavContent(ele, content); 3881 navContent[url] = content; 3882 resolve(); 3883 }) 3884 .catch(error => {console.error('Error fetching content:', error); reject(error);}); 3885 } catch (error) { 3886 console.error('Unexpected error:', error); 3887 reject(error); 3888 } 3889 }); 3890 3891}; 3892 3893const fetchNavlistCont = () => { 3894 const screenSize = window.innerWidth || document.documentElement.clientWidth || document.body.clientWidth; 3895 const DELAY_LOADING_MS = 500; 3896 if (screenSize > 991) { 3897 const navLists = document.querySelectorAll('.navlist-load'); 3898 3899 setTimeout(() => { 3900 const promises = Array.from(navLists).map(navList => { 3901 return loadNavContent(navList); 3902 }); 3903 console.log("Promises:", promises); 3904 Promise.all(promises).then(() => { 3905 if (Object.keys(navContent).length > 0) { 3906 saveNavDataToLocalStorage("NAV_CONTENT", navContent); 3907 } 3908 }); 3909 }, DELAY_LOADING_MS); 3910 3911 } 3912}; 3913 3914document.addEventListener('DOMContentLoaded', fetchNavlistCont); 3915 3916revampHeaderutils.headerfixedNew = function () { 3917 let lastScrollTopHeader = 0; 3918 const $header = $('.cmp-header'); 3919 if ($header.length === 0) return; 3920 const $headerSecondrow = $('.cmp-header__main'); 3921 const $headerThirdrow = $('.main-nav-outer'); 3922 let headerHeight = $header.outerHeight(); 3923 let headerBottom = $header.offset().top + headerHeight; 3924 3925 function getSecondRowHeight() { 3926 return $headerSecondrow.outerHeight() - 0.5; 3927 } 3928 3929 $(window).on('scroll', function () { 3930 const scrollTopHeader = $(this).scrollTop(); 3931 const secondRowHeight = getSecondRowHeight(); 3932 3933 if (scrollTopHeader >= headerHeight) { 3934 if (scrollTopHeader > lastScrollTopHeader) { 3935 // Scrolling down 3936 $header.addClass('sticky-down').removeClass('sticky-up'); 3937 $headerThirdrow.css('transform', ''); 3938 3939 if ($('.cmp-bottom-nav').length > 0) { 3940 $('.cmp-bottom-nav').addClass('scroll-down'); 3941 } 3942 } else { 3943 // Scrolling up 3944 $header.addClass('sticky-down sticky-up'); 3945 $headerThirdrow.css('transform', 'translateY(' + secondRowHeight + 'px)'); 3946 3947 if ($('.cmp-bottom-nav').length > 0) { 3948 $('.cmp-bottom-nav').removeClass('scroll-down'); 3949 } 3950 } 3951 } 3952 3953 if (scrollTopHeader <= headerBottom) { 3954 // Reached top of header again 3955 $header.removeClass('sticky-down sticky-up'); 3956 $headerThirdrow.css('transform', ''); 3957 } 3958 3959 lastScrollTopHeader = scrollTopHeader; 3960 }); 3961 3962 $(window).on('resize', function () { 3963 headerHeight = $header.outerHeight(); 3964 headerBottom = $header.offset().top + headerHeight; 3965 }); 3966} 3967 3968revampHeaderutils.quikereadscrolling = function () { 3969 let lastScrollTopquickread = 0; 3970 $(window).scroll(function (event) { 3971 quikreadscrolled(); 3972 }); 3973 3974 function quikreadscrolled() { 3975 let stquikread = $(this).scrollTop(); 3976 if (stquikread > lastScrollTopquickread && stquikread > 10 && $(window).width() < 991 ) { 3977 $('.quikreadfloating').addClass('scroll-down-fixed'); 3978 } else if (stquikread + $(window).height() < $(document).height() && $(window).width() < 991 ) { 3979 $('.quikreadfloating').removeClass('scroll-down-fixed'); 3980 } 3981 lastScrollTopquickread = stquikread; 3982 } 3983} 3984 3985// Call functions when the document is ready 3986$(function () {
3987 revampHeaderutils.signIn(); 3988 revampHeaderutils.myAccount(); 3989 revampHeaderutils.getUserName(); 3990 // revampHeaderutils.handleHeaderOnScroll(); 3991 // revampHeaderutils.handleTopAdBlockResize(); 3992 revampHeaderutils.headerfixedNew(); 3993 revampHeaderutils.quikereadscrolling(); 3994 revampHeaderutils.currentDate(); 3995}); 3996const mmlog_path = '/sso'; 3997const login_stat = 'mmu_ls'; 3998const login_un = 'mmu_pn'; 3999const last_rf_time = 'mmu_lsrfd'; 4000const rf_int = 'mmu_rfinv'; 4001const rf_Int_default = 1500000; 4002const cool_down_default = 180000; //3 minutes = 3 * 60 * 1000; 4003let rfTknTimer; 4004let sso_auth = { 4005 isLoggedIn: function() { 4006 let loginStatus = getCookieVal(login_stat); 4007 var loggedIn = false; 4008 if (loginStatus === 'userLoggedIn') { 4009 loggedIn = true; 4010 } 4011 return loggedIn; 4012 } 4013} 4014 4015function getCookieVal(v){ 4016 var r = document.cookie.match('(^|[^;]+)\\s*' + v + '\\s*=\\s*([^;]+)'); 4017 r = r ? r.pop(): undefined; 4018 return r 4019} 4020 4021function ssoIn(signUpFlag, utmsource) { 4022 let currLoc = encodeURIComponent(window.location.href); 4023 window.location.href = mmlog_path + "?a=in&pageURL=" + currLoc + "&signUpFlag=" + signUpFlag + "&utm_source=" + utmsource; 4024} 4025 4026function googleSsoIn(response){ 4027 if(response.credential){ 4028 let idToken = response.credential; 4029 let currLoc = encodeURIComponent(window.location.href); 4030 window.location.href = mmlog_path+"?a=goog&pageURL="+currLoc+"&token="+idToken; 4031 } 4032} 4033 4034function ssoOut(cl) { 4035 let currLoc; 4036 let randNo = Math.floor((Math.random() * 1000000) + 1); 4037 try{ 4038 if(window.sessionStorage["evolok:ev_profile"]!=undefined){ 4039 delete window.sessionStorage["evolok:ev_profile"]; 4040 } 4041 if(window.localStorage["evolok:ev_session"]!=undefined){ 4042 delete window.localStorage["evolok:ev_session"]; 4043 } 4044 }catch(err){} 4045 if(cl){ 4046 currLoc = encodeURIComponent(cl); 4047 }else{ 4048 currLoc = encodeURIComponent(window.location.href); 4049 } 4050 google.accounts.id.disableAutoSelect(); 4051 window.location.href = mmlog_path+"?a=out&pageURL="+currLoc+"&random="+randNo; 4052 localStorage.removeItem("savedItems"); // removed saveditems on logout. 4053 localStorage.removeItem("historyItems"); // removed history items on logout. 4054 localStorage.removeItem("obitVotedIds"); // removed Obituary Reacted items on logout. 4055 localStorage.removeItem("victoryVotedIds"); 4056} 4057 4058function rfAccessTkn() { 4059 if(rfTknTimer) { 4060 clearInterval(rfTknTimer); 4061 } 4062/* 4063 $.ajax({ 4064 type : "GET", 4065 url : mmlog_path, 4066 dataType : 'text', 4067 data : { 4068 a : 'rf' 4069 }, 4070 success : function(response) { 4071 if(response=='true') { 4072 setRfTknInt(); 4073 try{ 4074 if(!getCookieVal(login_un) || !getCookieVal('ev_ss')){ 4075 dataLayer.push({'event': 'mo-loginrefresh-fail'}) ; 4076 //location.reload(); 4077 } 4078 } catch (err) {console.log("err"+err)} 4079 } 4080 }, 4081 error : function(xhr, err) { 4082 console.log("err" + JSON.stringify(err)); 4083 } 4084 }); 4085 */ 4086} 4087 4088function setLoggedInView() { 4089 try { 4090 if (sso_auth.isLoggedIn()) { 4091 let userName = getCookieVal(login_un); 4092 if (userName) { 4093 $('.profile_name_txt').text(decodeURIComponent(userName).trim()); 4094 } 4095 $('.sign_in_button').removeClass("user-not-signed"); 4096 $('.sign_in_button').addClass('user-signed-in'); 4097 4098 $('.ml-login-icon-blk').removeClass('user-not-signed'); 4099 $('.ml-login-icon-blk').addClass('user-signed-in'); 4100 } else { 4101 4102 $('.sign_in_button').addClass("user-not-signed"); 4103 $('.sign_in_button').removeClass('user-signed-in'); 4104 4105 $('.ml-login-icon-blk').addClass('user-not-signed'); 4106 $('.ml-login-icon-blk').removeClass('user-signed-in'); 4107 4108 $('.profile_name_txt').text(''); 4109 } 4110 } catch (err) {} 4111} 4112 4113 4114function invokeRfTknReq() { 4115 let rfInt = getCookieVal(rf_int); 4116 let rfIntVal = 0; 4117 if(rfInt) { 4118 rfIntVal = parseInt(rfInt); 4119 } 4120 let lastRfTime = getCookieVal(last_rf_time); 4121 if(lastRfTime) { 4122 let lastRfTimeVal = parseInt(lastRfTime); 4123 let cTimeVal = 0; 4124 let cDate = new Date(); 4125 4126 let cTimeInMs = cDate.getTime(); 4127 if(cTimeInMs) { 4128 cTimeVal = parseInt(cTimeInMs); 4129 } 4130 4131 let timeDiff = cTimeVal - (lastRfTimeVal - 60000); 4132 if(timeDiff >= rfIntVal) { 4133 rfAccessTkn(); 4134 } else { 4135 rfIntVal = rfIntVal - timeDiff; 4136 } 4137 } 4138 4139 if(!rfIntVal) { 4140 rfIntVal = rf_Int_default; 4141 } 4142 4143 if(rfTknTimer) { 4144 clearInterval(rfTknTimer); 4145 } 4146 rfTknTimer = setInterval('rfAccessTkn()', rfIntVal); 4147} 4148 4149function setRfTknInt() { 4150 let rfInt = getCookieVal(rf_int); 4151 if(!rfInt) { 4152 rfInt = rf_Int_default; 4153 } 4154 rfTknTimer = setInterval('rfAccessTkn()', rfInt); 4155} 4156 4157 4158$(document).ready(function() { 4159 $(".sso-signout-button").on("click", function(e){ 4160 ssoOut(); 4161 }); 4162 4163 setLoggedInView(); 4164 4165 if(sso_auth.isLoggedIn()) { 4166 loadGoogleScript().then(() => googleOneTapLibraryLoad()); 4167 invokeRfTknReq(); 4168 }
4168 else if (typeof enablePrestitial === 'undefined' || !enablePrestitial) { 4169 loadGoogleScript() 4170 .then(() => googleOneTapLibraryLoad()) 4171 .then((val) => { 4172 if(val === 1){ 4173 invokeGoogleOneTap(); 4174 } 4175 }) 4176 .catch((error) => { 4177 console.error("Error loading Google One Tap:", error); 4178 }); 4179 } 4180 4181}); 4182 4183function loadGoogleScript() { 4184 return new Promise((resolve, reject) => { 4185 const script = document.createElement('script'); 4186 script.src = 'https://accounts.google.com/gsi/client'; 4187 script.onload = () => { 4188 console.log('Google script loaded.'); 4189 resolve(); 4190 }; 4191 script.onerror = () => reject(new Error('Failed to load Google script')); 4192 document.head.appendChild(script); 4193 }); 4194} 4195 4196function googleOneTapLibraryLoad() { 4197 return new Promise((resolve, reject) => { 4198 if(typeof googleClientId !== 'undefined'){ 4199 try { 4200 google.accounts.id.initialize({ 4201 client_id: googleClientId, 4202 cancel_on_tap_outside: false, 4203 itp_support: true, 4204 use_fedcm_for_prompt: true, 4205 callback: googleSsoIn, 4206 }); 4207 console.log('Google One Tap initialized.'); 4208 4209 } catch (error) { 4210 reject(error); 4211 } 4212 resolve(1); 4213 } 4214 else{ 4215 resolve(0); 4216 } 4217 4218 4219 }); 4220} 4221 4222// Function to invoke Google One Tap 4223function invokeGoogleOneTap() { 4224 const isMobileView = window.matchMedia("(max-width: 768px)").matches; // Check if the view is mobile 4225 if (isMobileView) { 4226 const targetElement = document.querySelector('.cmp-header__main'); 4227 if (targetElement) { 4228 const observer = new IntersectionObserver((entries) => { 4229 entries.forEach(entry => { 4230 if (!entry.isIntersecting && entry.boundingClientRect.top < 0) { 4231 google.accounts.id.prompt(); // excluded setExpirationTime() 4232 observer.disconnect(); 4233 } 4234 }); 4235 }, { rootMargin: '0px', threshold: [1] }); 4236 observer.observe(targetElement); 4237 } else { 4238 console.error("Element with class 'cmp-header__main' not found."); 4239 } 4240 } else { 4241 google.accounts.id.prompt(); 4242 } 4243} 4244 4245// Function to get a cookie by name 4246function getCookie(cookieName) { 4247 var name = cookieName + "="; 4248 var decodedCookie = decodeURIComponent(document.cookie);
4248 // Decode the cookie string and split it into individual cookies 4249 var cookieArray = decodedCookie.split(';'); 4250 for (const cookie of cookieArray) { 4251 // Trim leading and trailing spaces from the cookie string 4252 var trimmedCookie = cookie.trim(); 4253 // Check if the cookie name matches the target name 4254 if (trimmedCookie.startsWith(name)) { 4255 return trimmedCookie.substring(name.length); 4256 } 4257 } 4258 return null; 4259} 4260 4261// Function to set the expiration time for 'g_state' cookie 4262function setExpirationTime() { 4263 var now = new Date(); 4264 var time = now.getTime(); 4265 var expireTime = time + cool_down_default; // 3 minutes in the future 4266 now.setTime(expireTime); 4267 var gStateValue = getCookie("g_state"); 4268 if (gStateValue !== null) { 4269 document.cookie = 'g_state='+gStateValue+';path=/;expires='+now.toUTCString(); //Set the updated expiration time to g_state cookie 4270 } else { 4271 console.log("Cookie 'g_state' not found."); 4272 } 4273} 4274/* function to initiate google subscription Integration */ 4275function loadSwgScript() { 4276 return new Promise((resolve, reject) => { 4277 const script = document.createElement('script'); 4278 script.src = 'https://news.google.com/swg/js/v1/swg.js'; 4279 script.async = true; 4280 script.type = 'application/javascript'; 4281 script.setAttribute('subscriptions-control', 'manual'); 4282 4283 script.onload = () => { 4284 resolve(); 4285 }; 4286 4287 script.onerror = () => reject(new Error('Failed to load SWG script')); 4288 document.head.appendChild(script); 4289 }); 4290} 4291 4292function initiateGoogleSubscription(){ 4293 let ppid = getCookie("ev_guid"); 4294 let isGoogleLinked = getCookie("ev_gsubscription"); 4295 let isPremium = getCookie("premium_user"); 4296 if (isPremium && (isGoogleLinked === "false" && ppid)) { 4297 getReaderFromGoogle(ppid); 4298 } 4299} 4300 4301function linkSubscription(ppid) { 4302 self.SWG.push(async (subscriptions) => { 4303 try { 4304 const result = await subscriptions.linkSubscription({ 4305 publisherProvidedId: ppid, 4306 }) 4307 console.log(result); 4308 } catch(e) { 4309 console.log(e) 4310 } 4311 }) 4312} 4313function getReaderFromGoogle(ppid){ 4314 let keyfile = getCookie("g_subscriptionKey"); 4315 $.ajax({ 4316 type: "GET", 4317 url: `https://readerrevenuesubscriptionlinking.googleapis.com/v1/publications/CAowyeKNCw/readers/${ppid}`, 4318 headers: { 4319 "Authorization": `Bearer ${keyfile}`, 4320 }, 4321 success: function (data) { 4322 console.log("Reader exists:", data); 4323 }, 4324 error: function (xhr, status, error) { 4325 if (xhr.status === 404) { 4326 linkSubscription(ppid); 4327 } else { 4328 console.error("Error:", error, xhr.responseText); 4329 } 4330 }, 4331 }); 4332} 4333 4334document.addEventListener('DOMContentLoaded', async function () { 4335 await loadSwgScript(); 4336 4337 self.SWG = self.SWG || []; 4338 self.SWG.push((subscriptions) => { 4339 subscriptions.init("CAowyeKNCw"); 4340 }); 4341 initiateGoogleSubscription(); 4342}); 4343 4344 4345const 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": [] }); 4346const eventSelector = {"article":"article-save-btn--saved","list":"cmp-story-list__control-btn--saved","dropdown":"cmp-story-list___dropdown-btn--saved"}; 4347 4348const mainApiDomain = (typeof apiDomain !== "undefined" && apiDomain) ? apiDomain : "https://api.manoramaonline.com"; 4349const mainImgDomain = (typeof imgDomain !== "undefined" && imgDomain) ? imgDomain : "https://img-mm.manoramaonline.com"; 4350 4351/* Initial entry point. populate listing, setup event listeners and update with api calls */ 4352document.addEventListener("DOMContentLoaded" ,async function () { 4353 4354 let savedData = JSON.parse(localStorage.getItem("savedItems") || initData); 4355 4356 let diffTime = Date.now() - savedData["updated"]; 4357 let fiveMins = 5 * 60 * 1000; 4358 if (diffTime > fiveMins && savedData["source"] !== "local" && !savedData["deleteMeta"]["isBatch"] && !savedData["deleteMeta"]["isBatch"]) { 4359 let apiData = await getSavedItems(); 4360 if (apiData !== 0) { 4361 savedData = processApiRequestData(apiData) 4362 savedData["updated"] = apiData["updatedOn"] || Date.now();
4363 savedData["source"] = "api"; 4364 localStorage.setItem("savedItems", JSON.stringify(savedData)); 4365 } 4366 } 4367 4368 savedData = JSON.parse(localStorage.getItem("savedItems") || initData); 4369 4370 populateSavedListing(savedData); 4371 4372 addSaveItemsEventListeners(); 4373 4374 if (!revampHeaderutils.isLoggedIn()) { 4375 localStorage.removeItem("savedItems"); 4376 return; 4377 } 4378 4379 savedData = await batchUpdateItems(savedData,true); 4380 4381 activateSavedArticlesOnLoad(savedData["addedIds"],"add"); 4382 4383}); 4384 4385/* Setup events listeners : Saved onlick and remove all button listeners */ 4386const addSaveItemsEventListeners = () =>{ 4387 4388 /* Delete listener for remove all button */ 4389 $(".saved-items__remove-btn").off("click").on("click",async function(){ 4390 let localStorageData = localStorage.getItem("savedItems") || initData; 4391 let savedData = JSON.parse(localStorageData); 4392 let addedIds = savedData["addedIds"]; 4393 let clonedAddedIds = JSON.parse(JSON.stringify(savedData["addedIds"])); // deep clone for an unaffected array for looping 4394 let deletedIds = savedData["deletedIds"]; 4395 if(addedIds.length > 0){ 4396 clonedAddedIds.forEach(articleId => { 4397 let dIdx = deletedIds.indexOf(articleId); 4398 if(dIdx === -1){ 4399 deletedIds.push(articleId); 4400 } 4401 let idx = addedIds.indexOf(articleId); 4402 if(idx !== -1){ 4403 addedIds.splice(idx,1); 4404 } 4405 delete savedData["articles"][articleId]; 4406 }); 4407 let forceTimeStamp = Date.now() - (2 * 60 * 1000); // force an earlier timestamp for removeall 4408 savedData["addedIds"] = []; 4409 savedData["deletedIds"] = deletedIds; 4410 savedData["deleteMeta"]["isBatch"] = true; 4411 savedData["deleteMeta"]["batchTimestamp"] = forceTimeStamp; 4412 4413 activateSavedArticlesOnLoad(savedData["deletedIds"],"remove"); 4414 $(".story-col-list-section.story-col-list-section--saved").css("display","none"); 4415 $(".saved-items__remove-btn").css("display","none"); 4416 $(".story-sort").css("display","none"); 4417 $(".list-noresult").css("display","block"); 4418 savedData = await batchUpdateItems(savedData,true); 4419 localStorage.setItem("savedItems", JSON.stringify(savedData)); 4420 } 4421 }); 4422 4423 /* On click listener for listing saved button */ 4424 $(".cmp-story-list__control-btn.cmp-save__btn,.cmp-story-list___dropdown-btn.cmp-save__btn").off("click").on("click", async function () { 4425 let listItem = $(this).closest(".cmp-story-list__item"); 4426 let titleLink = listItem.find(".cmp-story-list__title-link"); 4427 let articleId = listItem.find(".cmp-story-list__item-in").attr("data-itemid"); 4428 let articleLink = titleLink.attr("href"); 4429 let articleTitle = titleLink.attr("title"); 4430 let isPremium = listItem.find(".cmp-story-list__premium-icon").length; 4431 let hasVideoIcon = listItem.find(".mm-icon__play-sharp").length; 4432 let hasAudioIcon = listItem.find(".mm-icon__podcast").length; 4433 let stampLabel = listItem.find(".cmp-stamp-label").text().trim(); 4434 let liveLabel = listItem.find(".cmp-live-label").text().trim(); 4435 let imgEle = listItem.find(".cmp-story-list__img"); 4436 let videoBlock = listItem.find(".cmp-story-list__video.cmp-video-block"); 4437 let dataImgSrc = videoBlock?.data("imgSrc"); 4438 let articleImg = "" 4439 let squareImg = "" 4440 if (typeof dataImgSrc != 'undefined' && dataImgSrc.length > 0) { 4441 articleImg = mainImgDomain + dataImgSrc; 4442 squareImg = getSquareImg(articleImg); 4443 } else { 4444 articleImg = imgEle.attr("src")?.split("?")[0]; 4445 squareImg = getSquareImg(imgEle.attr("data-mobsrc") || imgEle.attr("src")); 4446 } 4447 4448 let sectionTitle = listItem.find(".cmp-story-list__pretitle").attr("title"); 4449 let sectionLink = listItem.find(".cmp-story-list__pretitle").attr("href"); 4450 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 }; 4451 let selector = "list"; 4452 if($(this).hasClass("cmp-story-list___dropdown-btn.cmp-save__btn")){ 4453 selector = "dropdown"; 4454 } 4455 await handleEventArticleData($(this),articleData,selector); 4456 }); 4457 4458 $(".article-header__action-block-li .article-save-btn").off("
4458click").on("click", async function () { 4459 if(typeof pageDl === 'undefined'){ 4460 return; 4461 } 4462 let pageData = JSON.parse(JSON.stringify(pageDl)); 4463 let articleId = pageData.articleId; 4464 let articleLink = window.location.href; 4465 let articleTitle = pageData.headline; 4466 let articleImg = $(".cmp-story-figure__web-image img").attr("src")?.split("?")[0] || $('meta[property="og:image"]').attr('content') || ""; 4467 let squareImg = getSquareImg(articleImg); 4468 let sectionTitle = pageData.sectionName; 4469 let sectionLink = $(".cmp-sectionpage-header__title a").attr("href")||""; 4470 let isPremium = pageData.articleType === "premium" ? 1 : 0; 4471 let stampLabel = $(".article-header .cmp-stamp-label").text().trim(); 4472 let liveLabel = $(".article-header .cmp-live-label").text().trim(); 4473 let hasVideoIcon = (pageData.ytVideoCount > 0 || pageData.bcVideoCount > 0) ? 1 : 0; 4474 let hasAudioIcon = 0; // WIP 4475 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 }; 4476 await handleEventArticleData($(this),articleData,"article"); 4477 }); 4478 4479} 4480 4481/** Article Data handler function: OnEvent */ 4482const handleEventArticleData = async (thisObj,articleData,selector) => { 4483 return new Promise(async(resolve, reject) => { 4484 let localStorageData = localStorage.getItem("savedItems") || initData; 4485 let isAdded = true; 4486 4487 let maxSavedItems = $('.cmp-modal-box.cmp-modal-box--save-article').attr("data-maxitems") || 20; 4488 4489 let articleId = articleData["id"]; 4490 if(!articleId){ 4491 return resolve(); 4492 } 4493 let isLoggedIn = revampHeaderutils.isLoggedIn(); 4494 if (!isLoggedIn) { 4495 localStorageData = initData; 4496 } 4497 let savedData = JSON.parse(localStorageData); 4498 if (savedData["addedIds"].length >= parseInt(maxSavedItems)) { 4499 if(!thisObj.hasClass(eventSelector[selector])){ 4500 console.log("Limit reached"); 4501 $(".cmp-modal-box.cmp-modal-box--save-article").css('display','block'); 4502 return resolve(); 4503 } 4504 } 4505 let dIdx = savedData["deletedIds"].indexOf(articleId); 4506 let idx = savedData["addedIds"].indexOf(articleId); 4507 if (thisObj.hasClass(eventSelector[selector])) { 4508 if (dIdx === -1) { 4509 savedData["deletedIds"].push(articleId); 4510 } 4511 if (idx !== -1) { 4512 savedData["addedIds"].splice(idx, 1); 4513 } 4514 delete savedData["articles"][articleId]; 4515 isAdded = false; 4516 activateSavedArticlesOnLoad([articleId],"remove"); 4517 } else { 4518 if (dIdx !== -1) { 4519 savedData["deletedIds"].splice(dIdx, 1); 4520 } 4521 if (idx === -1) { 4522 savedData["source"] = "local"; 4523 savedData["addedIds"].push(articleId); 4524 savedData["articles"]={[articleId] : articleData,...savedData["articles"]}; 4525 } 4526 activateSavedArticlesOnLoad([articleId],"add"); 4527 } 4528 savedData["isLoggedIn"] = isLoggedIn; 4529 localStorage.setItem("savedItems", JSON.stringify(savedData)); 4530 if (!isLoggedIn) { 4531 ssoIn(false, signInValue); 4532 } 4533 4534 savedData = await addAndDeleteUpdateToAPI(savedData, articleId, isAdded); 4535 4536 let savedContainerMain = $(".story-col-list-section.story-col-list-section--saved"); 4537 if(savedContainerMain.length){ 4538 populateSavedListing(savedData); 4539 activateSavedArticlesOnLoad(savedData["addedIds"],"add"); 4540 addSaveItemsEventListeners(); 4541 } 4542 return resolve(); 4543 }); 4544} 4545 4546const getCleanSectionUrl = (url) =>{ 4547 if(url){ 4548 let urlArray = url.split("/"); 4549 if(urlArray.length > 4){ 4550 urlArray.splice(1,3); 4551 } 4552 let sectionLink = urlArray.join("/") + ".html"; 4553 return sectionLink; 4554 } 4555 return ""; 4556} 4557 4558const getSquareImg = (url) => {
4559 let urlParams = new URLSearchParams(url); 4560 url = url.split("?")[0]; 4561 let rendition = "&w=100&h=100"; 4562 if (urlParams.has("crop")) { 4563 url = `${url}?crop=${urlParams.get("crop")}${rendition}`; 4564 } else { 4565 url = `${url}?crop=fc${rendition}` 4566 } 4567 return url; 4568} 4569 4570/* Helper function to process data coming from api */ 4571const processApiRequestData = (apiData) => { 4572 let savedData = JSON.parse(initData); 4573 4574 if(!apiData["data"] || apiData["data"]["contents"].length === 0){ 4575 return savedData; 4576 } 4577 4578 for (let data of apiData["data"]["contents"]) { 4579 let articleId = data.id; 4580 let articleLink = data.contentTitle.url + ".html"; 4581 let articleTitle = data.contentTitle.title; 4582 let articleImg = `${mainImgDomain}${data.contentImgs.filter(img => img.aspectratio == "image")[0]?.url}`; 4583 let squareImg = getSquareImg(`${mainImgDomain}${data.contentImgs.filter(img => img.aspectratio == "square")[0]?.url || data.contentImgs.filter(img => img.aspectratio == "image")[0]?.url}`); 4584 let sectionTitle = data.subSection.title; 4585 let sectionLink = getCleanSectionUrl(data.subSection.url); 4586 let isPremium = data.isPremium || false; 4587 let liveLabel = data.webExclusive || ''; 4588 let hasVideoIcon = data.icon === "video" ? 1 : 0; 4589 let hasAudioIcon = data.icon === "audio" ? 1 : 0; 4590 let stampLabel = data.configurableLabel || ''; 4591 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 }; 4592 savedData["articles"][articleId] = articleData; 4593 savedData["addedIds"].push(articleId); 4594 } 4595 return savedData; 4596} 4597 4598/* Helper function to mark or remove saved button's activated state */ 4599const activateSavedArticlesOnLoad = (idArray,op) => { 4600 /* Listing saved icon activate/deactivate */ 4601 for (let id of idArray) { 4602 $(`[data-itemid=${id}]`).each(function () { 4603 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"); 4604 let listSaveClass = eventSelector["list"]; 4605 let dropdownSaveClass = eventSelector["dropdown"]; 4606 if(op === "add"){ 4607 if(!savedBtn.hasClass(listSaveClass)){ 4608 savedBtn.addClass(listSaveClass); 4609 } 4610 if(!savedBtn.hasClass(dropdownSaveClass)){ 4611 savedBtn.addClass(dropdownSaveClass); 4612 } 4613 } 4614 if(op === "remove"){ 4615 if(savedBtn.hasClass(listSaveClass)){ 4616 savedBtn.removeClass(listSaveClass); 4617 } 4618 if(savedBtn.hasClass(dropdownSaveClass)){ 4619 savedBtn.removeClass(dropdownSaveClass); 4620 } 4621 } 4622 }); 4623 } 4624 4625 /* Article saved icon activate/deactivate */ 4626 let isArticle = (typeof pageDl !== 'undefined') && pageDl["pageType"] === "article" && idArray.includes(pageDl["articleId"]); 4627 if (!isArticle) { 4628 return; 4629 } 4630 let articleSaveClass = eventSelector["article"]; 4631 let articleSaveBtn = $(".article-save-btn"); 4632 if (op === "add") { 4633 if (!articleSaveBtn.hasClass(articleSaveClass)) { 4634 articleSaveBtn.addClass(articleSaveClass); 4635 } 4636 } 4637 if (op === "remove") { 4638 if (articleSaveBtn.hasClass(articleSaveClass)) { 4639 articleSaveBtn.removeClass(articleSaveClass); 4640 } 4641 } 4642} 4643 4644/** Batch update function which takes care of the batch POST update. 4645 * function also has an onload parameter to be called for initial pageload */ 4646const batchUpdateItems = async (savedData, onLoad = false, isAdded = false, isDeleted = false) => { 4647 let deleteMeta = savedData["deleteMeta"]; 4648 let addMeta = savedData["addMeta"]; 4649 let isAddBatchUpdate = false; 4650 let isDeleteBatchUpdate = false;
4651 let minDiff = 1 * 60 * 1000; 4652 4653 4654 if ((addMeta["isBatch"] && onLoad) || isAdded) { 4655 4656 if (addMeta["batchTimestamp"] === 0) { 4657 addMeta["batchTimestamp"] = Date.now(); 4658 addMeta["isBatch"] = true; 4659 } 4660 let addBatchDiff = Date.now() - addMeta["batchTimestamp"]; 4661 4662 if (addBatchDiff > minDiff) { 4663 isAddBatchUpdate = true; 4664 } 4665 } 4666 4667 if((deleteMeta["isBatch"] && onLoad) || isDeleted){ 4668 4669 if (deleteMeta["batchTimestamp"] === 0) { 4670 deleteMeta["batchTimestamp"] = Date.now(); 4671 deleteMeta["isBatch"] = true; 4672 } 4673 4674 let deleteBatchDiff = Date.now() - deleteMeta["batchTimestamp"]; 4675 4676 if (deleteBatchDiff > minDiff) { 4677 isDeleteBatchUpdate = true; 4678 } 4679 } 4680 const promises = []; 4681 if (isDeleteBatchUpdate) { 4682 promises.push(deleteSavedItems(savedData["deletedIds"]).then((status) => { 4683 if (status === 1) { 4684 savedData["deletedIds"] = []; 4685 deleteMeta["batchTimestamp"] = 0; 4686 deleteMeta["isBatch"] = false; 4687 } 4688 }).catch(error => { 4689 console.error("Error during delete batch update:", error); 4690 })); 4691 } 4692 4693 if (isAddBatchUpdate) { 4694 promises.push(addSavedItems(savedData["addedIds"]).then((status) => { 4695 if (status === 1) { 4696 savedData["source"] = ""; 4697 addMeta["batchTimestamp"] = 0; 4698 addMeta["isBatch"] = false; 4699 } 4700 }).catch(error => { 4701 console.error("Error during add batch update:", error); 4702 })); 4703 } 4704 4705 await Promise.all(promises); 4706 4707 savedData["deleteMeta"] = deleteMeta; 4708 savedData["addMeta"] = addMeta; 4709 return savedData; 4710} 4711 4712/* Helper function which does add and delete functionality based on a counter which resets after every minute. 4713 if the number of articles in counter is less than 5 , the article is posted immediately. if the counter exceeds 4714 5, we are maintaining a queue to then batch update all the articles after a minute */ 4715const addAndDeleteUpdateToAPI = async (savedData, articleId, isAdded) => { 4716 let deleteMeta = savedData["deleteMeta"]; 4717 let addMeta = savedData["addMeta"]; 4718 let minDiff = 1 * 60 * 1000; 4719 let dIdx = savedData["deletedIds"].indexOf(articleId); 4720 4721 if (!isAdded) { 4722 deleteMeta["counter"] += 1; 4723 if(deleteMeta["timestamp"] === 0){ 4724 deleteMeta["timestamp"] = Date.now(); 4725 } 4726 4727 let diffTime = Date.now() - deleteMeta["timestamp"]; 4728 4729 if (diffTime > minDiff && !deleteMeta["isBatch"]) { 4730 deleteMeta["counter"] = 1; 4731 deleteMeta["timestamp"] = Date.now(); 4732 let status = await deleteSavedItems([articleId]); 4733 if(status === 1){ 4734 if (dIdx !== -1) { 4735 savedData["deletedIds"].splice(dIdx, 1); 4736 } 4737 } 4738 } else { 4739 if (deleteMeta["counter"] <= 5) { 4740 let status = await deleteSavedItems([articleId]); 4741 if(status === 1){ 4742 if (dIdx !== -1) { 4743 savedData["deletedIds"].splice(dIdx, 1); 4744 } 4745 } 4746 } else { 4747 savedData = await batchUpdateItems(savedData, false, false, true); 4748 } 4749 } 4750 4751 savedData["deleteMeta"] = deleteMeta; 4752 4753 } else { 4754 addMeta["counter"] += 1; 4755 if(addMeta["timestamp"] === 0){ 4756 addMeta["timestamp"] = Date.now(); 4757 } 4758 4759 let diffTime = Date.now() - addMeta["timestamp"]; 4760 4761 if (diffTime > minDiff && !addMeta["isBatch"]) { 4762 addMeta["counter"] = 1; 4763 addMeta["timestamp"] = Date.now(); 4764 let status = await addSavedItems([articleId]); 4765 if (status === 1) { 4766 savedData["source"] = ""; 4767 } 4768 } else { 4769 if (addMeta["counter"] <= 5) { 4770 let status = await addSavedItems([articleId]); 4771 if (status === 1) { 4772 savedData["source"] = ""; 4773 } 4774 } else { 4775 savedData = await batchUpdateItems(savedData, false, true, false); 4776 } 4777 } 4778 4779 savedData["addMeta"] = addMeta; 4780 } 4781 4782 localStorage.setItem("savedItems", JSON.stringify(savedData)); 4783 return savedData; 4784} 4785 4786/* Helper function to get token and uid for api calls */ 4787const getTokenAndUId = () => { 4788 let token = getCookieVal("mmu_id_token"); 4789 if(!token){ 4790 return [null,null] 4791 } 4792 let base64Url = token.split('.')[1]; 4793 let base64 = base64Url.replace(/-/g, '+').replace(/_/g, '/'); 4794 let jsonPayload = decodeURIComponent(window.atob(base64).split('').map(function (c) {
4795 return '%' + ('00' + c.charCodeAt(0).toString(16)).slice(-2); 4796 }).join('')); 4797 let payLoad = JSON.parse(jsonPayload); 4798 let uId = payLoad["sub"]; 4799 let id_token = payLoad["id_token"]; 4800 return [id_token, uId]; 4801 4802} 4803 4804/* API Function: GET : get all the saved articles from API */ 4805const getSavedItems = async () => { 4806 const [token, uId] = getTokenAndUId(); 4807 return new Promise((resolve, reject) => { 4808 if (token === null) { 4809 return resolve(0); 4810 } 4811 4812 let fetchLimit = $(".cmp-modal-box.cmp-modal-box--save-article").attr("data-maxitems") || 20; 4813 4814 $.ajax({ 4815 url: `${mainApiDomain}/profile/read/bookmark`, 4816 type: "GET", 4817 dataType: 'json', 4818 data: { "uId": uId , "limit" : fetchLimit }, 4819 headers: { 4820 Authorization: 'Bearer ' + token, 4821 }, 4822 success: function (res) { 4823 console.log(res); 4824 return resolve(res); 4825 }, 4826 error: function (err) { 4827 console.log('Error:', err); 4828 return resolve(0); 4829 } 4830 }) 4831 }); 4832}; 4833 4834/* API Function: POST : post new article ids to API */ 4835const addSavedItems = async (articleIds) => { 4836 const [token, uId] = getTokenAndUId(); 4837 return new Promise((resolve, reject) => { 4838 if (token === null) { 4839 return resolve(0); 4840 } 4841 4842 $.ajax({ 4843 url: `${mainApiDomain}/profile/save/bookmark`, 4844 type: "POST", 4845 dataType: 'json', 4846 data: JSON.stringify({ "uId": uId, "aId": articleIds }), 4847 headers: { 4848 Authorization: 'Bearer ' + token, 4849 }, 4850 success: function (res) { 4851 console.log("success"); 4852 return resolve(1); 4853 }, 4854 error: function (err) { 4855 console.log('Response Text:', err); 4856 return resolve(0); 4857 } 4858 }) 4859 }); 4860}; 4861 4862/* API Function: POST : delete articles from API based on articleids */ 4863const deleteSavedItems = async (articleIds) => { 4864 const [token, uId] = getTokenAndUId(); 4865 return new Promise((resolve, reject) => { 4866 if (token === null) { 4867 return resolve(0); 4868 } 4869 4870 $.ajax({ 4871 url: `${mainApiDomain}/profile/delete/bookmark`, 4872 type: "POST", 4873 dataType: 'json', 4874 data: JSON.stringify({ "uId": uId, "aId": articleIds }), 4875 headers: { 4876 Authorization: 'Bearer ' + token, 4877 }, 4878 success: function (res) { 4879 console.log("success"); 4880 return resolve(1); 4881 }, 4882 error: function (err) { 4883 console.log('Response Text:', err); 4884 return resolve(0); 4885 } 4886 }) 4887 }); 4888}; 4889 4890/* Ad script utilty funtion for saved items */ 4891const setAdScriptForSaved = (savedCount, container) => { 4892 let isPremium = getCookieVal("prm_adfree") === 'true' ? true : false; 4893 if(isPremium){ 4894 return; 4895 } 4896 let liPositionIndex = 4; 4897 if(savedCount < 5){ 4898 liPositionIndex = savedCount - 1; 4899 } 4900 container.find(".cmp-story-list__item").eq(liPositionIndex).after(slb2AdScript); 4901 createAdUnit("slb2"); 4902} 4903 4904/* Populate the listing page with the api data. Used in saved items landing page */ 4905const populateSavedListing = (savedData) => {
4906 let container = $(".story-col-list-section.story-col-list-section--saved .cmp-story-list"); 4907 if (!container.length) { 4908 return; 4909 } 4910 4911 let savedCount = savedData["addedIds"].length; 4912 4913 if(savedCount === 0 || !revampHeaderutils.isLoggedIn()){ 4914 $(".list-noresult").css("display","block"); 4915 $(".saved-items__remove-btn").css("display","none"); 4916 $(".story-sort").css("display","none"); 4917 } 4918 container.empty(); 4919 4920 if (savedCount > 0) { 4921 $(".list-noresult").css("display","none"); 4922 $(".saved-items__remove-btn").css("display","block"); 4923 $(".story-sort").css("display","block"); 4924 $(".cmp-story-sort__count span").html(savedData["addedIds"].length); 4925 let articleData = savedData["articles"]; 4926 for (let key in articleData) { 4927 let data = articleData[key] 4928 let articleId = data.id; 4929 let articleLink = data.link; 4930 let articleTitle = data.title; 4931 let articleImg = data.img; 4932 let squareImg = data.squareImg; 4933 let sectionTitle = data.sectionTitle; 4934 let sectionLink = data.sectionLink; 4935 let isPremium = data.isPremium; 4936 let liveLabel = data.liveLabel; 4937 let hasVideoIcon = data.hasVideoIcon; 4938 let hasAudioIcon = data.hasAudioIcon; 4939 let stampLabel = data.stampLabel; 4940 let htmlLi = 4941 `<li class="cmp-story-list__item"> 4942 <div class="cmp-story-list__item-in" data-itemid="${articleId}"> 4943 <div class="cmp-story-list__content"> 4944 <h2 class="cmp-story-list__title"> <a href="${articleLink}" class="cmp-story-list__title-link" title="${articleTitle}"> 4945 ${liveLabel.length ? 4946 `<label class="cmp-live-label"> 4947 <div class="live-blink-circile"> 4948 <div class="live-nomaral-circle"></div> 4949 <div class="live-circle"></div> 4950 <div class="live-circle"></div> 4951 <div class="live-circle"></div> 4952 <div class="live-circle"></div> 4953 </div> 4954 ${liveLabel} 4955 </label>` : '' 4956 } 4957 ${stampLabel.length ? 4958 `<label class="cmp-stamp-label">${stampLabel}</label>` : '' 4959 } 4960 ${isPremium ? 4961 `<div class="cmp-story-list__premium-icon"> 4962 <i class="mm-icon mm-icon__mm-premium"></i> 4963 </div>` : '' 4964 } 4965 ${articleTitle} 4966 </a> </h2> 4967 4968 <div class="cmp-story-list__content-bottom"> 4969 <div class="cmp-story-list__content-btm-left"> <a href="${sectionLink}" class="cmp-story-list__pretitle" title="">${sectionTitle}</a> </div> 4970 <div class="cmp-story-list__content-btm-right"> 4971 <ul class="cmp-story-list__controls"> 4972 <li class="cmp-story-list__control-li"> 4973 <button class="cmp-story-list__control-btn" title=""><i class="mm-icon mm-gray-icon mm-icon__listen"></i></button> 4974 </li> 4975 <li class="cmp-story-list__control-li"> 4976 <button class="cmp-story-list__control-btn cmp-save__btn" title=""><i class="mm-icon mm-gray-icon mm-icon__bookmark-sm"></i></button> 4977 </li> 4978 </ul> 4979 </div> 4980 </div> 4981 </div> 4982 <div class="cmp-story-list__image-block"> 4983 <a class="cmp-story-list__image-link" href="${articleLink}" title="${articleTitle}"> 4984 ${hasAudioIcon ? 4985 `<div class="cmp-story-list__media-icon"> 4986 <i class="mm-icon mm-white-icon mm-icon__podcast"></i> 4987 </div>` : '' 4988 4989 } 4990 ${hasVideoIcon ? 4991 `<div class="cmp-story-list__media-icon"> 4992 <i class="mm-icon mm-white-icon mm-icon__play-sharp"></i> 4993 </div>` : '' 4994 } 4995 <img src="/etc.clientlibs/revamp-mmonline/cl
4995ientlibs/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> 4996 </div> 4997 </li>`; 4998 container.append(htmlLi); 4999 } 5000 setAdScriptForSaved(savedCount, container); // set ad for saved 5001 getDeviceType(); // call for image lazyload 5002 5003 } 5004} 5005const POST_WAIT_TIME = 60 * 1000; 5006const GET_WAIT_TIME = 5 * 60 * 1000; 5007const AD_POS = 6; 5008 5009 5010// helper methods 5011const getHistoryFromLocalStorage = () => { 5012 let history = JSON.parse(localStorage.getItem("historyItems")) || { 5013 historyItems: [], 5014 saved_articles: [], 5015 deleted_articles: [], 5016 lastPosted: Date.now() - POST_WAIT_TIME, 5017 lastFetched: Date.now() - GET_WAIT_TIME, 5018 saveCounter: 0, 5019 deleteCounter: 0 5020 } 5021 return history 5022} 5023 5024const saveHistoryToLocalStorage = (history) => { 5025 let historyString = JSON.stringify(history) 5026 localStorage.setItem("historyItems", historyString); 5027} 5028 5029const checkIfUserisLoggedIn = () => { 5030 const [token, uId] = getTokenAndUId(); 5031 return token && token != "" 5032} 5033 5034 5035function populateHistoryHtml(data) { 5036 let imageUrl = `${mainImgDomain}${data.image}`; 5037 let description = data.description 5038 let mobImage = "" 5039 if (data.mobImage) { 5040 let mobImgUrl = `${mainImgDomain}${data.mobImage}` 5041 mobImage = getSquareImg(mobImgUrl) 5042 } else { 5043 mobImage = getSquareImg(imageUrl) 5044 } 5045 let title = data.title 5046 let url = data.link 5047 let sectionTitle = data.sectionTitle 5048 let articleId = data.articleId 5049 let liveUpdate = data.liveUpdate 5050 let sectionLink = data.sectionLink 5051 let premium = data.isPremium 5052 5053 let liveUpdateSnippet = liveUpdate ? `<label class="cmp-live-label"> 5054 <div class="live-blink-circile"> 5055 <div class="live-nomaral-circle"></div> 5056 <div class="live-circle"></div> 5057 <div class="live-circle"></div> 5058 <div class="live-circle"></div> 5059 <div class="live-circle"></div> 5060 </div> 5061 LIVE UPDATES 5062 </label>` : "" 5063 5064 let premiumSnippet = premium ? `<div class="cmp-story-list__premium-icon"><i class="mm-icon mm-icon__mm-premium"></i></div>` : "" 5065 let historyListHtml = `<li class="cmp-story-list__item"> 5066 <div class="cmp-story-list__item-in" data-itemid="${articleId}"> 5067 <div class="cmp-story-list__content"> 5068 <h2 class="cmp-story-list__title"> <a href="${url}" class="cmp-story-list__title-link" title="${title}"> 5069 ${liveUpdateSnippet} 5070 ${premiumSnippet}${title}</a> </h2> 5071 <p class="cmp-story-list__dispn"><a href="${url}">${description}</a></p> 5072 <div class="cmp-story-list__content-bottom"> 5073 <div class="cmp-story-list__content-btm-left"> <a href="${sectionLink}" class="cmp-story-list__pretitle" title="${sectionTitle}">${sectionTitle}</a> </div> 5074 <div class="cmp-story-list__content-btm-right"> 5075 <ul class="cmp-story-list__controls"> 5076 <li class="cmp-story-list__control-li"> 5077 <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> 5078 <div class="cmp-story-list__drop-down"> 5079 <div class="cmp-story-list__drop-down-in"> 5080 <ul class="cmp-story-list___dropdown-ul"> 5081 <li class="cmp-story-list___dropdown-li"> 5082 <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> 5083 </li> 5084 <li class="cmp-story-list___dropdown-li"> 5085 <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> 5086 </li> 5087 <!-- <li class="cmp-story-list___dropdown-li"> 5088 <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> 5089 </li> --> 5090 </ul> 5091 </div> 5092 </div> 5093 </li> 5094 </ul> 5095 </div> 5096 </div> 5097 </div> 5098 <div class="cmp-story-list__image-block"> <a class="cmp-story-list__image-link" href="${url}" title="${title}">
5099 <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> 5100</div> 5101</li>` 5102 return historyListHtml 5103} 5104 5105function wrapHistoryHtml(historyListHtml) { 5106 return `<ul class="cmp-story-list">${historyListHtml}</ul>` 5107} 5108 5109const updateCounters = () => { 5110 let history = getHistoryFromLocalStorage(); 5111 if (history) { 5112 if (Date.now() - history.lastPosted > POST_WAIT_TIME) { 5113 if (history.save_pending) { 5114 let articleIds = history.saved_articles || []; 5115 saveHistory(articleIds) 5116 history.lastPosted = Date.now(); 5117 history.source = "" 5118 history.save_pending = false 5119 history.saved_articles = [] 5120 console.log("history saved") 5121 } 5122 history.saveCounter = 0; 5123 } 5124 if (Date.now() - history.lastDeleted > POST_WAIT_TIME) { 5125 if (history.delete_pending) { 5126 let articleIds = history.deletedIds; 5127 deleteHistoryItem(articleIds, history.deleteAll || false) 5128 history.source = "" 5129 history.deleteAll = false 5130 history.delete_pending = false 5131 history.deletedIds = [] 5132 history.lastDeleted = Date.now() 5133 console.log("history deleted") 5134 } 5135 history.deleteCounter = 0; 5136 } 5137 saveHistoryToLocalStorage(history) 5138 } 5139} 5140 5141async function fetchHistory() { 5142 5143 let FETCH_LIMIT = $('.cmp-sectionpage-header[data-articleLimit]').attr('data-articleLimit') || "100" 5144 FETCH_LIMIT = FETCH_LIMIT.toString(); 5145 const [token, uId] = getTokenAndUId(); 5146 let params = { 5147 method: "GET", 5148 "headers": { 5149 "Authorization": "Bearer " + token 5150 } 5151 } 5152 let url = `${mainApiDomain}/profile/read/history?uId=${uId}&limit=${FETCH_LIMIT}` 5153 let historyItems = [] 5154 let updatedOn; 5155 let resp = await fetch(url, params); 5156 if (resp.status === 200) { 5157 let response = await resp.json() 5158 response.data?.contents?.map((ele) => { 5159 let articleData = { 5160 "articleId": ele.id, 5161 "sectionTitle": ele.subSection.title, 5162 "sectionLink": getCleanSectionUrl(ele.subSection.url), 5163 "title": ele.contentTitle.title, 5164 "description": ele.description, 5165 "link": getCleanSectionUrl(ele.contentTitle.url), 5166 "image": ele.contentImgs.filter(img => img.aspectratio == "image")[0]?.url, 5167 "mobImage": ele.contentImgs.filter(img => img.aspectratio == "square")[0]?.url, 5168 "isPremium": ele.isPremium, 5169 "stampLabel": ele.configurableLabel, 5170 "hasVideoIcon": ele.icon === "video", 5171 "hasAudioIcon": ele.icon === "audio", 5172 "liveUpdate": ele.liveBlinkingLabel, 5173 "lastModified": ele.lastModified 5174 }; 5175 historyItems.push(articleData) 5176 }) 5177 updatedOn = response.updatedOn || Date.now() 5178 historyItems.reverse() 5179 } else { 5180 console.log(`failed to fetch history with status code ${resp.status}`) 5181 } 5182 return [historyItems, updatedOn] 5183} 5184 5185 5186const fetchHistoryItems = async () => { 5187 let FETCH_LIMIT = $('.cmp-sectionpage-header[data-articleLimit]').attr('data-articleLimit') || "100" 5188 FETCH_LIMIT = parseInt(FETCH_LIMIT) 5189 let history = getHistoryFromLocalStorage() 5190 let historyItems = [] 5191 let updatedOn = null 5192 if (history.historyItems) { 5193 if (Date.now() - history.lastFetched > GET_WAIT_TIME) { // check if localstorage values are older than 5 minutes 5194 [historyItems, updatedOn] = await fetchHistory() 5195 history = { 5196 "lastFetched": updatedOn, 5197 "source": history.source || "", 5198 "lastPosted": history.lastPosted || Date.now(), 5199 "historyItems": historyItems, 5200 "deletedIds": historyItems.deletedIds || [], 5201 "saved_articles": historyItems.saved_articles || [], 5202 "save_pending": historyItems.save_pending || false, 5203 "delete_pending": historyItems.delete_pending || false, 5204 "lastDeleted": historyItems.lastDeleted || Date.now(), 5205 "saveCounter": historyItems.saveCounter || 0, 5206 "deleteCounter": historyItems.deleteCounter || 0 5207 } 5208 saveHistoryToLocalStorage(history) 5209 } else { 5210 historyItems = history.historyItems; 5211 } 5212 } else { 5213 [historyItems, updatedOn] = await fetchHistory() 5214 history = { 5215 "lastFetched": updatedOn, 5216 "source": "", 5217 "lastPosted": Date.now(), 5218 "historyItems": historyItems.reverse(), 5219 "saveCounter": 0, 5220 "deleteCounter": 0, 5221 "lastPosted":Date.now(), 5222 "lastDeleted": Date.now(), 5223 } 5224 saveHistoryToLocalStorage(history) 5225 } 5226 5227 let prmAdfree = getCookie("prm_adfree"); 5228 prmAdfree = prmAdfree == "true" ? true : false;
5229 5230 let storyList = $('#history-list')[0]; 5231 let finalHtml = "" 5232 history = getHistoryFromLocalStorage() 5233 historyItems = history.historyItems; 5234 if (historyItems.length > 0) { 5235 historyItems.reverse() 5236 limitedHistoryItems = historyItems.filter((element, index) => index < FETCH_LIMIT) 5237 if (storyList) { 5238 let itemCount = historyItems.length; 5239 limitedHistoryItems.map((element, key) => { 5240 finalHtml += populateHistoryHtml(element) 5241 if (key == AD_POS - 2 && !prmAdfree) { 5242 finalHtml += slb2AdScript 5243 } 5244 }) 5245 if (itemCount < AD_POS - 2 && !prmAdfree) { 5246 finalHtml += slb2AdScript 5247 } 5248 storyList.innerHTML = wrapHistoryHtml(finalHtml); 5249 $(".list-noresult.text-center").css("display", "none"); 5250 createAdUnit("slb2") 5251 } 5252 let deleteButtons = document.querySelectorAll("button[data_articleid]") 5253 deleteButtons.forEach(button => { 5254 button.addEventListener('click', function () { 5255 const articleId = this.getAttribute('data_articleid'); 5256 deleteHistory(articleId) 5257 }); 5258 }); 5259 $("#delete-history-confirm").css("display", "block") 5260 getDeviceType(); 5261 revampCustomutils.storylistMore(); 5262 addSaveItemsEventListeners(); 5263 5264 } else { 5265 storyList ? storyList.innerHTML = "" : null 5266 console.log("no history items found") 5267 $("#delete-history-confirm").css("display", "none") 5268 $(".list-noresult.text-center").css("display", "block"); 5269 } 5270} 5271 5272function deleteHistoryItem(articleIds, deleteAll = false) { 5273 const [token, uId] = getTokenAndUId(); 5274 5275 return new Promise((resolve, reject) => { 5276 if (token === null) { 5277 return reject(0); 5278 } 5279 let data = JSON.stringify({ "uId": uId, "aId": articleIds, "deleteAll": deleteAll }) 5280 $.ajax({ 5281 url: `${mainApiDomain}/profile/delete/history`, 5282 type: "POST", 5283 dataType: 'json', 5284 data: data, 5285 headers: { 5286 Authorization: 'Bearer ' + token, 5287 }, 5288 success: function (res) { 5289 console.log("success"); 5290 return resolve(1); 5291 }, 5292 error: function (err) { 5293 console.log('Response Text:', err); 5294 return reject(0); 5295 } 5296 }) 5297 }); 5298} 5299 5300const deleteHistory = (articleId, deleteAll = false) => { 5301 let history = getHistoryFromLocalStorage() 5302 if (history && history.historyItems) { 5303 let historyItems = history.historyItems; 5304 if (!history.deleteCounter) { 5305 history.deleteCounter = 0; 5306 } 5307 if (history.deleteCounter < 5) { 5308 deleteHistoryItem([articleId], deleteAll) 5309 history.deleteCounter += 1 5310 if (deleteAll) { 5311 history.historyItems = []; 5312 history.deletedIds = [] 5313 history.lastFetched = Date.now() 5314 } else { 5315 historyItems = historyItems.filter(item => item.articleId !== articleId) 5316 history.historyItems = historyItems; 5317 } 5318 } else if (deleteAll) { 5319 history.historyItems = [] 5320 history.deleteAll = true 5321 history.delete_pending = true 5322 history.deleteAll = true 5323 } else { 5324 historyItems = historyItems.filter(item => item.articleId !== articleId) 5325 history.historyItems = historyItems; 5326 history.source = "local" 5327 let deletedIds = history.deletedIds || []; 5328 deletedIds.push(articleId); 5329 history.deletedIds = deletedIds; 5330 history.delete_pending = true 5331 } 5332 console.log("article deleted from history") 5333 saveHistoryToLocalStorage(history) 5334 if (deleteAll) { 5335 $("#history-list").empty() 5336 $(".tost-message.slide-down").css("display", "block") 5337 setTimeout(() => $(".tost-message.slide-down").css("display", "none"), 2000)
5338 $("#delete-history-confirm").css("display", "none") 5339 $(".list-noresult.text-center").css("display", "block"); 5340 } else { 5341 fetchHistoryItems() 5342 } 5343 } 5344} 5345 5346const getArticleData = () => { 5347 let pageData = JSON.parse(JSON.stringify(pageDl)); 5348 let dateString = pageData.lastModified; 5349 let dateObject = new Date(dateString); 5350 let epochTime = dateObject.getTime(); 5351 5352 let articleId = pageData.articleId; 5353 let description = $('meta[name="description"]').attr('content') || ""; 5354 let url = window.location.href; 5355 let title = pageData.headline; 5356 let lastModified = epochTime 5357 let imageData = $(".cmp-story-figure__web-image img").attr("src")?.split("?")[0] || $('meta[property="og:image"]').attr('content') || ""; 5358 let image = "" 5359 if (imageData.length > 0) { 5360 let parsedImg = new URL(imageData) 5361 image = parsedImg.pathname; 5362 } 5363 let sectionTitle = pageData.sectionName; 5364 let sectionLink = $(".cmp-sectionpage-header__title a").attr("href") || ""; 5365 let isPremium = pageData.articleType === "premium"; 5366 let stampLabel = $(".article-header .cmp-stamp-label")?.text().trim() || ""; 5367 let liveLabel = $(".article-header .cmp-live-label")?.text().trim() || ""; 5368 let liveUpdate = $(".article-header .cmp-live-label").text().trim() != "" && $(".article-header .cmp-live-label").text().trim(); 5369 let hasVideoIcon = (pageData.ytVideoCount > 0 || pageData.bcVideoCount > 0) 5370 let hasAudioIcon = false; 5371 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 }; 5372 return articleData; 5373} 5374 5375function saveHistory(articleIds) { 5376 const [token, uId] = getTokenAndUId(); 5377 return new Promise((resolve, reject) => { 5378 if (token === null) { 5379 return reject(0); 5380 } 5381 let data = JSON.stringify({ "uId": uId, "aId": articleIds }) 5382 $.ajax({ 5383 url: `${mainApiDomain}/profile/save/history`, 5384 type: "POST", 5385 dataType: 'json', 5386 data: data, 5387 headers: { 5388 Authorization: 'Bearer ' + token, 5389 }, 5390 success: function (res) { 5391 console.log("success"); 5392 return resolve(1); 5393 }, 5394 error: function (err) { 5395 console.log('Response Text:', err); 5396 return reject(0); 5397 } 5398 }) 5399 }); 5400} 5401 5402const postHistoryItems = async () => { 5403 5404 let history = getHistoryFromLocalStorage() 5405 let exists = false 5406 let historyItems = history.historyItems || [] 5407 let savedArticles = new Set(history.saved_articles || []); 5408 let articleData = getArticleData() 5409 5410 exists = historyItems.some(item => item.articleId === articleData.articleId); 5411 5412 if (!exists) { 5413 historyItems.push(articleData) 5414 history.historyItems = historyItems; 5415 history.saved_articles = Array.from(savedArticles); 5416 history.source = "local" 5417 5418 if (history.saveCounter < 5) { 5419 saveHistory([articleData.articleId]) 5420 history.saveCounter += 1 5421 } else { 5422 history.save_pending = true 5423 savedArticles.add(articleData.articleId) 5424 } 5425 5426 } 5427 saveHistoryToLocalStorage(history) 5428} 5429 5430const setupEventListeners = () => { 5431 const userLoggedIn = checkIfUserisLoggedIn() 5432 if (userLoggedIn) { 5433 document.addEventListener("DOMContentLoaded", () => { 5434 5435 updateCounters(); 5436 if (window.pageDl != undefined) { 5437 if (pageDl.contentType == "article") { 5438 postHistoryItems().then() 5439 console.log("article saved to history") 5440 } 5441 } 5442 if ($('#history-list').length > 0) { 5443 fetchHistoryItems() 5444 document.querySelector("#delete-history-button")?.addEventListener("click", (e) => { 5445 e.preventDefault() 5446 console.log("clear all triggered") 5447 deleteHistory(null, true) 5448 $(".cmp-modal-box.cmp-modal-box--history-clear").css("display", "none"); 5449 }) 5450 } 5451 }) 5452 } else if ($('#history-list').length > 0) {
5453 $("#delete-history-confirm").css("display", "none") 5454 $(".list-noresult.text-center").css("display", "block"); 5455 } 5456} 5457 5458setupEventListeners() 5459let idlength = 0; 5460document.addEventListener("DOMContentLoaded", function () { 5461 const searchBtn = document.querySelector(".cmp-lottery-result__srch-btn"); 5462 const inputField = document.querySelector(".lottery-input"); 5463 const resultItems = document.querySelectorAll(".cmp-lottery-result__li"); 5464 const winMessage = document.querySelector(".win-msg"); 5465 const loseMessage = document.querySelector(".lose-msg"); 5466 const winnerIdSpan = document.querySelector(".winner-id"); 5467 const prizeDetailsSpan = document.querySelector(".prize-details"); 5468 const firstResultItem = document.querySelector(".cmp-lottery-result__li"); 5469 const originalPlaceholder = inputField ? inputField.placeholder : ''; 5470 const lotteryTopBlock = document.querySelector(".cmp-lottery-result__top"); 5471 const defaultMessage=document.querySelector(".def-msg"); 5472 5473 function resetMessages() { 5474 winMessage.style.display = "none"; 5475 loseMessage.style.display = "none"; 5476 } 5477 if (firstResultItem) { 5478 const winningText = Array.from(firstResultItem.childNodes) 5479 .filter((node) => node.nodeType === Node.TEXT_NODE) 5480 .map((node) => node.textContent.trim().replace(/\s+/g, "")) 5481 .join(""); 5482 console.log(winningText); 5483 5484 idlength = winningText.length; 5485 console.log(idlength); 5486 } 5487 5488 function performSearch() { 5489 try { 5490 resetMessages(); 5491 const userInput = inputField.value 5492 .replace(/\s+/g, " ") 5493 .trim() 5494 .toUpperCase(); 5495 if (userInput.length == idlength && /^[A-Za-z]{2}\d{6}$/.test(userInput)) { 5496 let exactMatched = false; 5497 let last4Match = false; 5498 resultItems.forEach((item) => 5499 checkAndRemoveClass(item,"cmp-lottery-result__winner") 5500 ); 5501 5502 resultItems.forEach((item) => { 5503 const winnerIdText = Array.from(item.childNodes) 5504 .filter((node) => node.nodeType === Node.TEXT_NODE) 5505 .map((node) => node.textContent.trim().replace(/\s+/g, "")) 5506 .join(""); 5507 const winnerId = winnerIdText; 5508 if (winnerId === userInput) { 5509 item.classList.add("cmp-lottery-result__winner"); 5510 checkAndRemoveClass(lotteryTopBlock,"cmp-lottery-result__error"); 5511 exactMatched = true; 5512 winMessage.style.display = "block"; 5513 defaultMessage.style.display="none"; 5514 if (winnerIdSpan && winnerId.length >= 2) { 5515 winnerIdSpan.textContent = winnerId.substring(0, 2) + " " + winnerId.substring(2); 5516 } 5517 prizeDetailsSpan.textContent = assignPrizeDetailsSpanContent(item); 5518 } 5519 }); 5520 5521 if (!exactMatched && /^\S+\s?\d{6}$/.test(userInput)) { 5522 const last4 = userInput.slice(-4); 5523 resultItems.forEach((item) => { 5524 const winnerIdText = Array.from(item.childNodes) 5525 .filter((node) => node.nodeType === Node.TEXT_NODE) 5526 .map((node) => node.textContent.trim().replace(/\s+/g, "")) 5527 .join(""); 5528 if (winnerIdText === last4) { 5529 item.classList.add("cmp-lottery-result__winner"); 5530 checkAndRemoveClass(lotteryTopBlock,"cmp-lottery-result__error"); 5531 winMessage.style.display = "block"; 5532 defaultMessage.style.display="none"; 5533 last4Match = true; 5534 if (winnerIdSpan && winnerIdText.length >= 2) { 5535 winnerIdSpan.textContent = userInput.substring(0, 2) + " " + userInput.substring(2); 5536 } 5537 prizeDetailsSpan.textContent = assignPrizeDetailsSpanContent(item); 5538 } 5539 }); 5540 } 5541 if (!exactMatched && !last4Match) { 5542 checkAndRemoveClass(lotteryTopBlock,"cmp-lottery-result__error"); 5543 loseMessage.style.display = "block"; 5544 defaultMessage.style.display="none"; 5545 checkAndRemoveClass(item,"cmp-lottery-result__winner"); 5546 } 5547 } else { 5548 resetMessages(); 5549 defaultMessage.style.display="block";
5550 resultItems.forEach((item) => { 5551 checkAndRemoveClass(item,"cmp-lottery-result__winner") 5552 }); 5553 lotteryTopBlock.classList.add("cmp-lottery-result__error"); 5554 } 5555 } catch (error) { 5556 console.log(error); 5557 } 5558 } 5559 5560 searchBtn?.addEventListener("click", performSearch); 5561 5562 inputField?.addEventListener("keyup", function (e) { 5563 if (e.key === "Enter") { 5564 performSearch(); 5565 } 5566 }); 5567 inputField?.addEventListener("focus", function (e) { 5568 inputField.placeholder = ""; 5569 }); 5570 inputField?.addEventListener("blur", function (e) { 5571 inputField.placeholder = originalPlaceholder; 5572 }); 5573 inputField?.addEventListener("input", function (e) { 5574 this.value = this.value.replace(/\s+/g, "").substring(0, 8); 5575 if (this.value == "") { 5576 winMessage.style.display = "none"; 5577 loseMessage.style.display = "none"; 5578 defaultMessage.style.display="block"; 5579 resultItems.forEach((item) => { 5580 checkAndRemoveClass(item,"cmp-lottery-result__winner") 5581 }); 5582 checkAndRemoveClass(lotteryTopBlock, "cmp-lottery-result__error"); 5583 } 5584 }); 5585}); 5586 5587//helper function to remove winner or error classes 5588function checkAndRemoveClass(element, className) { 5589 if (element.classList.contains(className)) { 5590 element.classList.remove(className); 5591 } 5592} 5593 5594//helper function to set the text content for the prize details message 5595function assignPrizeDetailsSpanContent(item) { 5596 let parentUl = item.parentElement; 5597 let prizeParagraph = parentUl.previousElementSibling; 5598 while (prizeParagraph) { 5599 if ( 5600 prizeParagraph.tagName === "P" && 5601 prizeParagraph.classList.contains("cmp-lottery-result__item-title") 5602 ) { 5603 const prizeNameAndAmount = prizeParagraph.innerText; 5604 const [, prizeAmount] = prizeNameAndAmount.split("Rs :"); 5605 return "Rs :" + prizeAmount; 5606 } 5607 prizeParagraph = prizeParagraph.previousElementSibling; 5608 } 5609 return ""; 5610} 5611 5612/** 5613 * jQuery Unveil 5614 * A very lightweight jQuery plugin to lazy load images 5615 * http://luis-almeida.github.com/unveil 5616 * 5617 * Licensed under the MIT license. 5618 * Copyright 2013 LuÃs Almeida 5619 * https://github.com/luis-almeida 5620 */ 5621 5622;(function($) { 5623 5624 $.fn.unveil = function(threshold, callback) { 5625 5626 var $w = $(window), 5627 th = threshold || 0, 5628 retina = window.devicePixelRatio > 1, 5629 attrib = retina? "data-src-retina" : "data-src", 5630 images = this, 5631 loaded; 5632 5633 this.one("unveil", function() { 5634 var source = this.getAttribute(attrib); 5635 source = source || this.getAttribute("data-src"); 5636 if (source) { 5637 this.setAttribute("src", source); 5638 if (typeof callback === "function") callback.call(this); 5639 } 5640 }); 5641 5642 function unveil() { 5643 var inview = images.filter(function() { 5644 var $e = $(this); 5645 if ($e.is(":hidden")) return; 5646 5647 var wt = $w.scrollTop(), 5648 wb = wt + $w.height(), 5649 et = $e.offset().top, 5650 eb = et + $e.height(); 5651 5652 return eb >= wt - th && et <= wb + th; 5653 }); 5654 5655 loaded = inview.trigger("unveil"); 5656 images = images.not(loaded); 5657 } 5658 5659 $w.on("scroll.unveil resize.unveil lookup.unveil", unveil); 5660 5661 unveil(); 5662 5663 return this; 5664 5665 }; 5666 5667})(window.jQuery || window.Zepto); 5668 5669$(() => { 5670 try { 5671 getDeviceType(); 5672 } catch (error) { 5673 console.error('Error while getting device type:', error); 5674 } 5675}); 5676 5677$(window).on("orientationchange", (event) => { 5678 getDeviceType(); 5679}); 5680 5681const getDeviceType = () => { 5682 const docWidth = $(window).width(); 5683 if (docWidth > 991) { 5684 displayImages("web"); 5685 } else if (575 < docWidth && docWidth <= 991) { 5686 displayImages("tab"); 5687 } else { 5688 displayImages("mob"); 5689 } 5690}; 5691 5692const displayImages = (dType) => { 5693 const imageLength = $("img.lazyload").length; 5694 const imageDomain = $("#websiteImageDomain").val() || ""; 5695 for (let i = 0; i < imageLength; i++) { 5696 let attrFind = $($("img.lazyload")[i]).attr(`data-${dType}src`); 5697 5698 if (attrFind) { 5699 attrFind = `${imageDomain}${attrFind}`; 5700 $($("img.lazyload")[i]).attr("data-src", `${attrFind}`); 5701 } else { 5702 console.error("Error in LazyLoading Images"); 5703 } 5704 } 5705 if($("button.cmp-header__section-nav").length > 0){ 5706 document.querySelector("button.cmp-header__section-nav").addEventListener("click",function(){ 5707 document.querySelectorAll(".cmp-mega-menu__body img.lazyload").forEach(lazyImg =>{ 5708 let imgPath = lazyImg.dataset.src; 5709 if(imgPath){ 5710 lazyImg.src = imgPath; 5711 lazyImg.classList.remove("lazyload"); 5712 } 5713 }) 5714 }) 5715 } 5716 5717 5718 $(".lazyload").unveil(); 5719}; 5720document.addEventListener("DOMContentLoaded", (event) => { 5721 try { 5722 document.querySelectorAll('.xf-cont-lazy:not(.cont-onclick), .mm-component-cont-lazy').forEach(element => { 5723 let observer = revampHeadCustomutils.observeElementIntersection(element,function(){lazyloadHandler(element)},false); 5724 if(element){observer.observe(element)} 5725 }); 5726 5727 } catch (error) { 5728 console.log("error while lazyloading the component",error) 5729 } 5730}); 5731document.addEventListener("DOMContentLoaded", (event) => { 5732 try { 5733 document.querySelectorAll('.cont-onload').forEach(element => { 5734 lazyloadHandler(element) 5735 }); 5736 5737 } catch (error) { 5738 console.log("error while listcontainer onload",error) 5739 } 5740}); 5741function processLazyImages(tempEle) { 5742 tempEle.documentElement.querySelectorAll(".lazyload").forEach(lazyLoadItem=>{ 5743 let lazyLoadItemSrc; 5744 if(screen.width>=991){ 5745 lazyLoadItemSrc=lazyLoadItem.dataset.websrc; 5746 } 5747 else if (screen.width<991 & screen.width>=575){ 5748 lazyLoadItemSrc=lazyLoadItem.dataset.tabsrc; 5749 } 5750 else{ 5751 lazyLoadItemSrc=lazyLoadItem.dataset.mobsrc; 5752 } 5753 if(lazyLoadItemSrc){ 5754 lazyLoadItem.classList.remove("lazyload"); 5755 lazyLoadItem.src = lazyLoadItemSrc; 5756 } 5757 }); 5758} 5759 5760 5761function initializeLazySliders(element) { 5762 const sliderConfigs = [ 5763 { selector: ".story-slider-block__four-story-banner .cmp-story-list--slider", handler: () => utils.bannerfourstorySlider() }, 5764 { selector: ".cmp-story-list--single-slider, .stories-promo-block .cmp-story-list--slider", handler: () => utils.singleSlider() }, 5765 { 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() }, 5766 { selector: ".story-multimedia-list-block .cmp-story-list--slider", handler: () => utils.threeClmSlider() }, 5767 { selector: ".story-slider-block--3 .cmp-story-list--slider", handler: () => utils.leftClmSlider() }, 5768 { selector: ".cmp-story-list__img-slider", handler: () => utils.imageBlockSlider() }, 5769 { selector: ".visual-stories-block .cmp-story-list--slider, .shots-stories-block .cmp-story-list--slider", handler: () => utils.vslShrtsSlider() }, 5770 { selector: ".prm-shorts-block-slider", handler: () => utils.premiumShortslider() }, 5771 { selector: ".prm-video-block-slider", handler: () => utils.premiumVideoslider() }, 5772 { selector: ".prm-featured-block-slider", handler: () => utils.PremiumFeaturedSlider() }, 5773 { selector: ".cmp-editable-banner--slider, .editable-banner--text-only .cmp-story-list--slider", handler: () => utils.bannerSlider() }, 5774 { selector: ".cartooncarousel", handler: () => revampCustomutils.cartoonSlider() }, 5775 { selector: ".mm-game-block .cmp-story-list--slider", handler: () => revampCustomutils.gameSlider() }, 5776 { selector: ".single-common-slider", handler: () => initiateSlidersAndWidgets() }, 5777 { selector: ".cmp-article-slider__large", handler: () => revampCustomutils.articleSlider() }, 5778 { selector: ".cmp-simple-slider-block__main", handler: () => revampCustomutils.artcleSimpleslider() }, 5779 { selector: ".story-card-list-block .cmp-story-list--slider", handler: () => revampCustomutils.storyCardSlickSlider() } 5780 ]; 5781
5782 sliderConfigs.forEach(config => { 5783 if (element.querySelector(config.selector)) { 5784 config.handler(); 5785 } 5786 }); 5787} 5788 5789function initializeLazyComponents(element) { 5790 const componentConfigs = [ 5791 { selector: ".day-in-picture-block .cmp-story-list__title", handler: () => utils.daypitcurecontent() }, 5792 { selector: ".score-card-block", handler: () => utils.scorecardwidth() }, 5793 { selector: ".cmp-story-list__control-btn--more-menu", handler: () => utils.storylistMore() }, 5794 { selector: ".cmp-score-card__golBy", handler: () => scorcardGoalinfo() }, 5795 { selector: ".moreInarticle-story-block", handler: () => revampCustomutils.listShowMore() }, 5796 { selector: ".cmp-video-block__icon-top", handler: () => revampCustomutils.videoPlayer() }, 5797 { selector: ".mmscoreboarditem", handler: () => revampCustomutils.mmScoreBoardDateTab() }, 5798 { selector: ".cmp-list-gallery", handler: () => revampCustomutils.articleGallery() }, 5799 { selector: ".cmp-gallery-block", handler: () => revampCustomutils.premiumImageSlideShow() }, 5800 { selector: "#vuukleComment", handler: () => revampCustomutils.vuukleComment() }, 5801 { selector: "div.cmp-story-list__component-slot-in", handler: () => revampCustomutils.indepthListHide() }, 5802 { selector: ".rprtr-item-sharebtn", handler: () => revampCustomutils.reportersShare() }, 5803 { selector: ".lclExplore__nav", handler: () => utils.exploreTab() } 5804 ]; 5805 5806 componentConfigs.forEach(config => { 5807 if (element.querySelector(config.selector)) { 5808 config.handler(); 5809 } 5810 }); 5811} 5812 5813function handleLazySpecialCases(element) { 5814 if(element.querySelector(".moreInarticle-story-block") || element.querySelector(".story-slider-block.story-card-list-block") || element.querySelector(".cmp-video-list-block")){ 5815 if(typeof videoViewUpdate != 'undefined'){ 5816 videoViewUpdate(); 5817 } 5818 } 5819 5820 5821 if(element.querySelector(".cmp-channel-block__nav")){ 5822 calcWidth2(); 5823 } 5824 if (checkMCookie("premium_token") && typeof handleAdReplace === 'function') { 5825 handleAdReplace(element); 5826 } 5827 if(element.querySelector(".story-list-block.prm-all-story-widget")){ 5828 bindAllStoriesLazy(); 5829 } 5830 5831 // For saved icons event handler register and indicators setting 5832 if(typeof addSaveItemsEventListeners === "function"){ 5833 addSaveItemsEventListeners(); 5834 let savedData = JSON.parse(localStorage.getItem("savedItems") || initData); 5835 activateSavedArticlesOnLoad(savedData["addedIds"],"add"); 5836 } 5837 5838 if(element.querySelector('.cmp-market-rates__in')){ 5839 if(typeof populateCommodityValues != 'undefined'){ 5840 populateCommodityValues(); 5841 } 5842 } 5843 5844 //To remove the experience fragment incase it has no ads for premium users. 5845 5846 $(".mm-col-blk-3 .experiencefragment .cmp-container>.ad-premiumuser,.right-component-slot .experiencefragment .cmp-container>.ad-premiumuser").each(function (i, e) { 5847 if (!$(e).height()) { 5848 $(e).closest(".experiencefragment").remove(); 5849 } 5850 }); 5851 5852 $(".article-body__aside .cmp-container>.ad-premiumuser").each(function (i, e) { 5853 if (!$(e).height()) { 5854 $(e).closest(".ad-premiumuser").remove(); 5855 } 5856 }); 5857} 5858 5859function lazyloadHandler(element){ 5860 5861 const url = element.getAttribute('data-lazy-url'); 5862 let scriptsEval = document.createElement("div"); 5863 let tempEle = document.createElement 5864 if(url){ 5865 const xhr = new XMLHttpRequest(); 5866 xhr.open('GET', url, true); 5867 xhr.onload = () => { 5868 if (xhr.status >= 200 && xhr.status < 300) { 5869 scriptsEval = new DOMParser().parseFromString(xhr.responseText, "text/html"); 5870 tempEle = new DOMParser().parseFromString(xhr.responseText, "text/html"); 5871 tempEle.documentElement.querySelectorAll("script").forEach(scripts=>{ 5872 if(scripts.type!="application/json" && scripts.type!="application/ld+json"){ 5873 scripts.remove(); 5874 } 5875 }); 5876 processLazyImages(tempEle); 5877 5878 element.innerHTML = tempEle.documentElement.innerHTML; 5879 scriptsEval.documentElement.querySelectorAll("script").forEach(scripts=>{ 5880 if(scripts.type!="application/json" && scripts.type!="application/ld+json"){ 5881 eval(scripts.innerHTML.trim()); 5882 } 5883 }); 5884 element.classList.remove("cont-initial"); 5885 element.querySelectorAll('.xf-cont-lazy:not(.cont-onclick), .mm-component-cont-lazy').forEach(element => { 5886 let observer = revampHeadCustomutils.observeElementIntersection(element,function(){lazyloadHandler(element)},false); 5887 if(element){observer.observe(element)} 5888 }); 5889 5890 initializeLazySliders(element); 5891 initializeLazyComponents(element) 5892 handleLazySpecialCases(element); 5893 5894 5895 } else {
5896 console.error(`Request failed with status ${xhr.status}`); 5897 } 5898 }; 5899 xhr.onerror = () => { 5900 console.error('Network error occurred'); 5901 }; 5902 try { 5903 xhr.send(); 5904 } catch (error) { 5905 console.error('An error occurred during the request:', error); 5906 } 5907 } 5908} 5909 5910function bindAllStoriesLazy() { 5911 try { 5912 const AllStoriesCom = document.querySelector('.story-list-block.prm-all-story-widget'); 5913 const AllStoriesOuter = AllStoriesCom.closest(".mm-component-cont-lazy"); 5914 const AllStoriesUl = AllStoriesCom.querySelector('.cmp-story-list'); 5915 const dataPerPage = AllStoriesCom.getAttribute("data-perpage"); 5916 const dataMaxcount = AllStoriesCom.getAttribute("data-maxcount"); 5917 const maxIteration = Math.ceil(dataMaxcount/dataPerPage); 5918 let currentPage = 1; 5919 let isLoading = false; 5920 let lastLi = AllStoriesUl.lastElementChild; 5921 let itemsWithTimestamp = AllStoriesUl.querySelectorAll(":scope > li.cmp-story-list__item[data-timestamp]"); 5922 let dataTimestamp = itemsWithTimestamp.length > 0 ? itemsWithTimestamp[itemsWithTimestamp.length - 1].getAttribute("data-timestamp") : null; 5923 let lastArticleId = itemsWithTimestamp.length > 0 ? itemsWithTimestamp[itemsWithTimestamp.length - 1].querySelector(".cmp-story-list__item-in").getAttribute("data-itemid") : null; 5924 let observer = revampHeadCustomutils.observeElementIntersection(lastLi,function(){loadNextSetStories()},false); 5925 if(lastLi){observer.observe(lastLi)} 5926 function loadNextSetStories() { 5927 if (isLoading) return; 5928 isLoading = true; 5929 5930 if(currentPage < maxIteration){ 5931 AllStoriesCom.insertAdjacentHTML('beforeend', "<div class='xf-cont-lazy cont-initial'></div>"); 5932 const xhr = new XMLHttpRequest(); 5933 let lazyAllStoryUrl = AllStoriesOuter?.getAttribute("data-lazy-url"); 5934 let esiExt = ".esi.html" 5935 if(lazyAllStoryUrl == null) 5936 { 5937 let authorUrl = new URL(window.location.href); 5938 lazyAllStoryUrl = AllStoriesCom.getAttribute("data-nextpage"); 5939 if(authorUrl.searchParams.has('wcmmode')){ 5940 esiExt = ".html?wcmmode=disabled"; 5941 } 5942 } 5943 let splitPath = ""; 5944 let initPath = ""; 5945 if(lazyAllStoryUrl.includes(".esi.")){ 5946 splitPath = lazyAllStoryUrl.split(".esi.");
5947 initPath = splitPath[0]; 5948 } 5949 else{ 5950 splitPath = lazyAllStoryUrl.split(".html"); 5951 initPath = splitPath[0]; 5952 } 5953 5954 const nextPageUrl = `${initPath}.${dataTimestamp}.${currentPage }.${lastArticleId}.moreallstories${esiExt}`; 5955 5956 xhr.open('GET', nextPageUrl, true); 5957 5958 xhr.onload = function () { 5959 5960 let config = { AllStoriesUl, observer, lastLi, itemsWithTimestamp, dataTimestamp, lastArticleId, currentPage, nextPageUrl, isLoading }; 5961 5962 ({ observer, lastLi, itemsWithTimestamp, dataTimestamp, lastArticleId, currentPage, isLoading } = handleNextResponse(xhr, config)); 5963 5964 }; 5965 5966 xhr.onerror = function () { 5967 console.error('An error occurred while loading the next page.'); 5968 isLoading = false; 5969 }; 5970 5971 xhr.send(); 5972 } 5973 5974 5975 } 5976 5977 } catch (error) { 5978 console.log("error while lazyloading the component",error) 5979 } 5980 5981 5982 function handleNextResponse(xhr, config) { 5983 let { AllStoriesUl, observer, lastLi, itemsWithTimestamp, dataTimestamp, lastArticleId, currentPage, nextPageUrl, isLoading } = config; 5984 if (xhr.status === 200) { 5985 let tempDiv = document.createElement('div'); 5986 tempDiv.innerHTML = xhr.responseText; 5987 tempDiv.querySelectorAll(".lazyload").forEach(lazyLoadItem => { 5988 let lazyLoadItemSrc; 5989 if (screen.width >= 991) { 5990 lazyLoadItemSrc = lazyLoadItem.dataset.websrc; 5991 } 5992 else if (screen.width < 991 & screen.width >= 575) { 5993 lazyLoadItemSrc = lazyLoadItem.dataset.tabsrc; 5994 } 5995 else { 5996 lazyLoadItemSrc = lazyLoadItem.dataset.mobsrc; 5997 } 5998 if (lazyLoadItemSrc) { 5999 lazyLoadItem.classList.remove("lazyload"); 6000 lazyLoadItem.src = lazyLoadItemSrc; 6001 } 6002 }); 6003 6004 let Ulnext = tempDiv.querySelector('ul'); 6005 Ulnext.querySelectorAll('.xf-cont-lazy:not(.cont-onclick), .mm-component-cont-lazy').forEach(element => { 6006 let observer = revampHeadCustomutils.observeElementIntersection(element, function () { lazyloadHandler(element); }, false); 6007 if (element) { observer.observe(element); } 6008 }); 6009 let Lilist = Ulnext.querySelectorAll(':scope > li'); 6010 Lilist.forEach((li) => { 6011 AllStoriesUl.appendChild(li); 6012 }); 6013 //Registers the saved icon event handler and sets up the saved icon indicator for infinite scroll in All Stories 6014 if(typeof addSaveItemsEventListeners === "function"){ 6015 addSaveItemsEventListeners(); 6016 let savedData = JSON.parse(localStorage.getItem("savedItems") || initData); 6017 activateSavedArticlesOnLoad(savedData["addedIds"],"add"); 6018 } 6019 let loader = document.querySelector('.xf-cont-lazy.cont-initial'); 6020 loader.parentNode.removeChild(loader); 6021 observer.unobserve(lastLi); 6022 lastLi = AllStoriesUl.lastElementChild; 6023 itemsWithTimestamp = AllStoriesUl.querySelectorAll(":scope > li.cmp-story-list__item[data-timestamp]"); 6024 dataTimestamp = itemsWithTimestamp.length > 0 ? itemsWithTimestamp[itemsWithTimestamp.length - 1].getAttribute("data-timestamp") : null; 6025 lastArticleId = itemsWithTimestamp.length > 0 ? itemsWithTimestamp[itemsWithTimestamp.length - 1].querySelector(".cmp-story-list__item-in").getAttribute("data-itemid") : null; 6026 6027 observer = revampHeadCustomutils.observeElementIntersection(lastLi, function () { loadNextSetStories(); }, false); 6028 if (lastLi) { observer.observe(lastLi); } 6029 currentPage++; 6030 } else { 6031 console.error(`Failed to load page: ${nextPageUrl}`); 6032 } 6033 isLoading = false; 6034 return { observer, lastLi, itemsWithTimestamp, dataTimestamp, lastArticleId, currentPage, isLoading }; 6035 } 6036}; 6037 6038document.addEventListener('DOMContentLoaded', function () { 6039 if(document.querySelector(".story-list-block.prm-all-story-widget")){ 6040 bindAllStoriesLazy(); 6041 } 6042}); 6043 6044document.addEventListener('DOMContentLoaded', function () { 6045 const headerNavButton = document.querySelector('.cmp-header__section-nav'); 6046 if (headerNavButton) { 6047 setTimeout(hamburgerLazyLoad, 500); 6048 } 6049 function hamburgerLazyLoad() { 6050 const onClickexperienceFragment = document.querySelector('.cont-onclick'); 6051 let firstLoad = true; 6052 let megaMenuInitialized = false; 6053 if (headerNavButton && onClickexperienceFragment) { 6054 const element = document.querySelector('.xf-cont-lazy.cont-onclick'); 6055 if (element) { 6056 const url = element.getAttribute('data-lazy-url'); 6057 if (url) { 6058 const xhr = new XMLHttpRequest(); 6059 xhr.open('GET', url, true); 6060 xhr.onload = () => { 6061 if (xhr.status >= 200 && xhr.status < 300) { 6062 const tempEle = new DOMParser().parseFromString(xhr.responseText, 'text/html'); 6063 tempEle.documentElement.querySelectorAll(".lazyload").forEach(lazyLoadItem => { 6064 let lazyLoadItemSrc; 6065 if (screen.width >= 991) { 6066 lazyLoadItemSrc = lazyLoadItem.dataset.websrc; 6067 } else if (screen.width < 991 && screen.width >= 575) { 6068 lazyLoadItemSrc = lazyLoadItem.dataset.tabsrc; 6069 } else { 6070 lazyLoadItemSrc = lazyLoadItem.dataset.mobsrc; 6071 } 6072 if (lazyLoadItemSrc) { 6073 lazyLoadItem.classList.remove("lazyload"); 6074 lazyLoadItem.src = lazyLoadItemSrc; 6075 } 6076 }); 6077 element.innerHTML = tempEle.documentElement.innerHTML; 6078 tempEle.documentElement.querySelectorAll("script").forEach(script => { 6079 if (script.type !== "application/json" && script.type !== "application/ld+json") { 6080 eval(script.innerHTML.trim()); 6081 } 6082 }); 6083 element.classList.remove("cont-onclick"); 6084 const megaMenu = element.querySelector(".cmp-mega-menu"); 6085 6086 // if (element.querySelector(".cmp-mega-menu.active")) { 6087 utils.storylistMore(); 6088 mmTab(); 6089 megaMenusub(); 6090 mmDropDOwn(); 6091 mmFilter(); 6092 mmFilterSub(); 6093 menuMoreAdjust(); 6094 calcWidth2(); 6095 menuClick(); 6096 modalPopup(); 6097 searchClick(); 6098 headerDropdowns(); 6099 headerDropdownsPosition();
6100 revampHeaderutils.signIn(); 6101 revampHeaderutils.myAccount(); 6102 revampHeaderutils.getUserName(); 6103 revampHeadCustomutils.TemplateThemeChange(); 6104 revampHeadCustomutils.checkSelectedTheme(); 6105 revampHeadCustomutils.changeHeaderBackground(); 6106 revampHeadCustomutils.trackUserClickedContent(); 6107 revampCustomutils.themeLabelClickListener(); 6108 // } 6109 6110 } else { 6111 console.error(`Request failed with status ${xhr.status}`); 6112 } 6113 }; 6114 6115 xhr.onerror = () => { 6116 console.error('Network error occurred'); 6117 }; 6118 xhr.send(); 6119 } 6120 } 6121 }else{ 6122 mmDropDOwn(); 6123 } 6124 } 6125 function mmHamburgerDropDown() { 6126 const megaMenuActive = $('.cmp-mega-menu.active'); 6127 megaMenuActive.find('.open-dropDown[data-target]').click(function (e) { 6128 e.preventDefault(); 6129 e.stopPropagation(); 6130 let $clickedDropdown = $(this); 6131 let dropDownBox = $clickedDropdown.attr('data-target'); 6132 let closestMegaMenu = $clickedDropdown.closest('.cmp-mega-menu'); 6133 if ($clickedDropdown.hasClass("active")) { 6134 $clickedDropdown.removeClass("active"); 6135 closestMegaMenu.find('[data-id=' + dropDownBox + ']').removeClass("active").fadeOut(100); 6136 } else { 6137 closestMegaMenu.find('.open-dropDown').removeClass("active"); 6138 closestMegaMenu.find(".mm-drop-down").removeClass("active").fadeOut(100); 6139 $clickedDropdown.addClass("active"); 6140 closestMegaMenu.find('[data-id=' + dropDownBox + ']').fadeIn(10).delay(100).addClass("active"); 6141 } 6142 }); 6143 $(document).on("click", function () { 6144 megaMenuActive.find(".mm-drop-down").removeClass("active").fadeOut(100); 6145 megaMenuActive.find('.open-dropDown').removeClass("active"); 6146 }); 6147 6148 megaMenuActive.find('.open-dropDown, .mm-drop-down').on("click", function (event) { 6149 event.stopPropagation(); 6150 }); 6151 } 6152}); 6153
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.