PageSourceSearch

https://js-mm.manoramaonline.com/etc.clientlibs/revamp-mmonline/cl….ACSHASHb08f820cac3532151cf1ccc7d80a4b01.js

js manoramaonline.com collected 2026-10-01 10:26:21 UTC 265,520 bytes, 6,869 lines download raw bytes

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

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.