PageSourceSearch

https://foodsystemeconomics.org/wp-content/themes/fsec/js/scripts.js?time=1790915101

js foodsystemeconomics.org collected 2026-10-02 04:25:29 UTC 14,364 bytes, 447 lines download raw bytes

1/*jslint browser: true, white: true, plusplus: true, regexp: true, indent: 4, maxerr: 50, es5: true */
2/*jshint multistr: true, latedef: nofunc */
3/*global jQuery, $, Swiper*/
4
5// console.log(Date.now());
6if ($('body').hasClass('tpl-counter') || $('.sticky_counter').length > 0) {
7
8    //Display Layout function
9    function updateCounterDisplay(counterElement, value) {
10        let formattedValue = "$" + formatNumberWithSpaces(value.toFixed(0));
11        counterElement.innerHTML = formattedValue;
12    }
13    //Regular expression for Layout function
14    function formatNumberWithSpaces(numberString) {
15        return numberString.replace(/\B(?=(\d{3})+(?!\d))/g, " ");
16    }
17
18    // var current_date = new Date();
19    let current_time = Date.now();
20    let start_date = new Date('2015-12-12');
21    // var end_date = new Date('2022-11-30');
22    let end_date = new Date('2025-12-12');
23
24// var day_increment = 14610441210.2163;
25    let day_increment = 40471098850;
26    let milisec_per_day = 86400000;
27    let mili_increment = day_increment / milisec_per_day;
28    let sec_increment = mili_increment * 1000;
29
30    let current_diff = current_time - start_date;
31    let current_value = current_diff * mili_increment;
32
33    let end_diff = end_date - start_date;
34    let end_value = end_diff * mili_increment;
35    //Creating the elements of counter for top panel and pop-up
36    const counterEl = document.createElement('div');
37    counterEl.classList.add('counter');
38    const counterTopEl = counterEl.cloneNode();
39    const counterElWrapper = $('.counter__wrapper');
40    const counterTopPanel = $('.top_panel__counter__content .content h1');
41
42    if (current_time < end_date) {
43        setInterval(function () {
44            current_value = current_value + sec_increment;
45            if ($('body').hasClass('tpl-counter')) {
46                let counter_top_panel = counterTopEl;
47                counterTopPanel.after(counter_top_panel);
48                updateCounterDisplay(counter_top_panel, current_value);
49            }
50
51            if ($('.sticky_counter').length > 0) {
52                counterEl.classList.add('h3');
53                counterElWrapper.append(counterEl);
54                let counter_sticky = counterEl;
55                updateCounterDisplay(counter_sticky, current_value);
56
57            }
58
59        }, 1000);
60    } else {
61        if ($('body').hasClass('tpl-counter')) {
62
63            let counter_top_panel = document.querySelector(".top_panel__counter .counter");
64            if (counter_top_panel) {
65                counter_top_panel.innerHTML = "$" + end_value.toFixed(0);
66
67                counter_top_panel.innerHTML = counter_top_panel.textContent.replace(/ (-|#|@){1}/g, s => s[1] + s[0]).replace(/(\S*)/g, m => {
68                    return m.replace(/\S(-|#|@)?/g, "<span class='counter_number'>$&</span>");
69                });
70            }
71
72        }
73
74        if ($('.sticky_counter').length > 0) {
75
76            let counter_sticky = document.querySelector(".sticky_counter .counter");
77            if (counter_sticky) {
78                counter_sticky.innerHTML = "$" + end_value.toFixed(0);
79
80                counter_sticky.innerHTML = counter_sticky.textContent.replace(/ (-|#|@){1}/g, s => s[1] + s[0]).replace(/(\S*)/g, m => {
81                    return m.replace(/\S(-|#|@)?/g, "<span class='counter_number'>$&</span>");
82                });
83            }
84        }
85
86    }
87
88
89// console.log((end_date - start_date)*mili_increment);
90
91}
92
93
94// control :focus when using mouse/keyboard
95document.body.addEventListener('mousedown', function () {
96    document.body.classList.add('is_using_mouse');
97});
98document.body.addEventListener('keydown', function () {
99    document.body.classList.remove('is_using_mouse');
100});
101
102
103$(document).ready(function () {
104    'use strict';
105
106    // variables
107    const body = $('body');
108    const header = $('header');
109    const menu__toggle = $('.menu__toggle');
110    const menu__primary = $('.menu__primary');
111    const menu__a_has_children = menu__primary.find('.menu-item-has-children > a');
112
113
114    // hamburger + menu
115    menu__toggle.on('click', function () {
116        $(this).toggleClass('is_active');
117        menu__primary.stop().toggleClass('is_open');
118        body.toggleClass('is_overflow');
119    });
120    // close menu with Esc key
121    body.on('keyup', function (e) {
122        if (e.keyCode === 27 && menu__toggle.hasClass('is_active')) {
123            $('.menu__toggle.is_active').click();
124            $('a[href="#skip_to_content"]').focus();
125        }
126    });
127
128    // hide all sub-menu links from tabbing unless sub-menu is open
129    menu__primary.find('.sub-menu').each(function () {
130        let sub_menu_links = $(this).find('> li > a'),
131            last_sub_menu_link = sub_menu_links.last();
132
133        last_sub_menu_link.on('blur', function () {
134            $(this).parents('.sub-menu').prev().click();
135        });
136
137        $(this).find('a').attr({
138            'aria-hidden': 'true',
139            'tabindex': -1
140        });
141    });
142
143    // open/close sub-menu actions
144    function sub_menu_actions(elem) {
145        let _exp = elem.attr('aria-expanded');
146        (_exp === 'false')
147            ? elem.attr('aria-expanded', 'true').next().find('a').attr({'aria-hidden': 'false', 'tabindex': 0})
148            : elem.attr('aria-expanded', 'false').next().find('a').attr({'aria-hidden': 'true', 'tabindex': -1});
149        elem.toggleClass('is_open').next().stop().toggleClass('is_mob_shown').toggleClass('is_desk_shown');
150    }
151
152    menu__a_has_children.on('click', function () {
153        sub_menu_actions($(this));
154    }).attr({
155        'aria-label': 'Sub-menu toggle',
156        'aria-expanded': 'false',
157        'href': 'javascript:;',
158    });
159
160
161    // header
162    $(window).on('scroll', function () {
163        if ($(this).scrollTop() > 5) {
164            header.addClass('is_sticky');
165        } else {
166            header.removeClass('is_sticky');
167        }
168    });
169    if ($(this).scrollTop() > 4) header.addClass('is_sticky');
170
171
172    // contact form 7
173    $(this).on('click', '.wpcf7-not-valid-tip', function () {
174        $(this).prev().trigger('focus');
175        $(this).fadeOut(250, function () {
176            $(this).remove();
177        });
178        $(this).parents('.wpcf7-form').find('.wpcf7-response-output').addClass('is_temp_hidden');
179    });
180    $(this).on('focus', '.wpcf7-form-control.wpcf7-not-valid', function () {
181        $(this).next('.wpcf7-not-valid-tip').fadeOut(250, function () {
182            $(this).remove();
183        });
184        $(this).parents('.wpcf7-form').find('.wpcf7-response-output').addClass('is_temp_hidden');
185    });
186    document.addEventListener('wpcf7submit', function (event) {
187        $('.wpcf7-response-output').removeClass('is_temp_hidden');
188    }, false);
189
190
191    // custom select
192    if ($('select').length > 0) {
193        $('select').selectric({
194            disableOnMobile: false,
195            nativeOnMobile: false,
196            arrowButtonMarkup: '<span class="select_arrow i_chevron_down_alt"></span>'
197        });
198        // $('select.wpcf7-form-control').each(function () {
199        //     $(this).find('option').first().val('');
200        // });
201    }
202
203
204    // fancybox
205    $('[data-fancybox]').fancybox({
206        touch: {
207            vertical: false,
208            momentum: true
209        },
210        smallBtn: false,
211        beforeLoad: function (instance, slide) {
212            // fix if header is sticky
213            header.addClass('compensate-for-scrollbar');
214        },
215        afterClose: function (instance, slide) {
216            // fix if header is sticky
217            header.removeClass('compensate-for-scrollbar');
218            // remove body class after event
219            if (body.hasClass('is_searching')) {
220                body.removeClass('is_searching');
221            }
222        }
223    });
224
225
226    // add body class on event
227    $('.search_toggle').on('click', function () {
228        body.addClass('is_searching');
229    });
230
231    // scroll to
232    $('a[data-scrollto]').on('click', function () {
233        let anchor = $(this).data('scrollto');
234
235        if ($(anchor).length > 0) {
236            $('html, body').animate({
237                scrollTop: $(anchor).offset().top - header.outerHeight()
238            }, 700);
239        }
240    });
241
242
243    // block - accordion
244    function acc_action(elem) {
245        let exp = elem.attr('aria-expanded');
246        let hid = elem.next().attr('aria-hidden');
247        (exp === 'false') ? elem.attr('aria-expanded', 'true') : elem.attr('aria-expanded', 'false');
248        (hid === 'true') ? elem.next().attr('aria-hidden', 'false') : elem.next().attr('aria-hidden', 'true');
249        elem.toggleClass('is_open').next().toggle();
250        elem.find('.i_plus_alt').toggleClass('is_active');
251    }
252
253    $('.acc_title').on('click', function () {
254        acc_action($(this));
255    }).on('keyup', function (e) {
256        if (e.keyCode === 13) {
257            acc_action($(this));
258        }
259    });
260
261
262    // wrap tables for responsive design
263    if ($('.content table').length > 0) {
264        $('.content table').wrap('<div class="table_wrapper"></div>');
265    }
266
267    //Clear empty container in a default_content
268    $('.container.is_8 .content').each(function () {
269        if ($(this).children().length === 0) {
270            $(this).parent().remove();
271        }
272    });
273
274    //counter page slider
275    function counter_slide_action(elem) {
276        let exp = elem.attr('aria-expanded');
277        let hid = elem.find('.hidden_content').attr('aria-hidden');
278        (exp === 'false') ? elem.attr('aria-expanded', 'true') : elem.attr('aria-expanded', 'false');
279        (hid === 'true') ? elem.find('.hidden_content').attr('aria-hidden', 'false') : elem.find('.hidden_content').attr('aria-hidden', 'true');
280        elem.find('.hidden_content').toggleClass('is_active');
281    }
282
283    $('.counter__slider .swiper-slide').on('click', function () {
284        counter_slide_action($(this));
285    }).on('keyup', function (e) {
286        if (e.keyCode === 13) {
287            counter_slide_action($(this));
288        }
289    });
290
291    //Counter popup
292    $('.sticky_counter__toggle').on('click', function () {
293        $(this).hide();
294        $('.sticky_counter__popup').addClass('is_active');
295    });
296
297    $('.sticky_counter__popup .i_close_thin').on('click', function () {
298        $('.sticky_counter__toggle').show();
299        $('.sticky_counter__popup').removeClass('is_active');
300    });
301
302    $(window).on('scroll', function () {
303        if ($(this).scrollTop() > 5) {
304            $('.sticky_counter__popup').removeClass('is_active');
305            $('.sticky_counter__toggle').show();
306        }
307    });
308
309
310});
311
312
313$(window).on('load', function () {
314    'use strict';
315
316    // swiper - block__custom_slider
317    $('.block__custom_slider').each(function () {
318        let slider_holder = $(this),
319            swiper_instance = slider_holder.find('.swiper'),
320            next = slider_holder.find('.sw_next'),
321            prev = slider_holder.find('.sw_prev'),
322            pagination = slider_holder.find('.sw_pagination');
323
324        let block_slider = new Swiper(swiper_instance[0], {
325            navigation: {
326                nextEl: next[0],
327                prevEl: prev[0]
328            },
329            pagination: {
330                el: pagination[0],
331                type: 'progressbar',
332            },
333            loop: true,
334            loopAdditionalSlides: 1,
335            speed: 600,
336            grabCursor: true,
337            threshold: 10,
338            spaceBetween: 0,
339            effect: "creative",
340            creativeEffect: {
341                prev: {
342                    translate: ["-98%", "0%", 0],
343                    scale: 0.9,
344                },
345                next: {
346                    translate: ["98%", "0%", 0],
347                    scale: 0.9,
348                },
349            },
350            breakpoints: {
351                1025: {
352                    creativeEffect: {
353                        prev: {
354                            translate: ["-97%", "0%", 0],
355                        },
356                        next: {
357                            translate: ["97%", "0%", 0],
358                        },
359                    },
360                }
361            },
362
363        });
364    });
365
366    //swiper - posts
367    $('.posts_slider').each(function () {
368        let slider_holder = $(this),
369            swiper_instance = slider_holder.find('.swiper'),
370            next = slider_holder.find('.sw_next'),
371            prev = slider_holder.find('.sw_prev');
372
373        let posts_slider = new Swiper(swiper_instance[0], {
374            navigation: {
375                nextEl: next[0],
376                prevEl: prev[0]
377            },
378            slidesPerView: 1.25,
379            speed: 600,
380            cssMode: true,
381            grabCursor: true,
382            threshold: 10,
383            spaceBetween: 0,
384            breakpoints: {
385                640: {
386                    slidesPerView: 2.25,
387                },
388                1025: {
389                    slidesPerView: 3.75,
390                    freeMode: true,
391                    cssMode: false
392                }
393            }
394        });
395
396    });
397
398    //swiper - counter page
399    $('.counter__slider').each(function () {
400        let slider_holder = $(this),
401            swiper_instance = slider_holder.find('.swiper'),
402            next = slider_holder.find('.sw_next'),
403            prev = slider_holder.find('.sw_prev');
404
405        let counter_slider = new Swiper(swiper_instance[0], {
406            navigation: {
407                nextEl: next[0],
408                prevEl: prev[0]
409            },
410            freeMode: true,
411            slidesPerView: 'auto',
412            speed: 600,
413            grabCursor: true,
414            threshold: 10,
415            spaceBetween: 24
416        });
417
418    });
419
420    // custom class for video in content (iframe)
421    $('.content iframe').each(function (i) {
422        let t = $(this),
423            p = t.parent();
424        if ((p.is('p') || p.is('span')) && !p.hasClass('full_frame')) {
425            p.addClass('full_frame');
426        }
427    });
428
429});
430
431
432// close on click outside
433// $(document).on('mouseup', function(e) {
434//     let menu = $('.menu__primary');
435//
436//     if (!menu.is(e.target) && !$('.menu__toggle.is_active').is(e.target) && menu.has(e.target).length === 0 && menu.hasClass('is_open')) {
437//         $('.menu__toggle.is_active').click();
438//     }
439// });
440
441
442// proper resize event
443// $(window).resizeEnd(function() {
444//     'use strict';
445//
446// });
447

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.