PageSourceSearch

https://www.justmommies.com/js/js-v1/script-article-min.js

js justmommies.com collected 2026-09-24 20:47:26 UTC 67,223 bytes, 1,586 lines download raw bytes

1var Page = {
2    init: function() {
3        this.nav.init(), this.header.init(), this.veil.init(), this.util.images.loadDeferred()
4    }
5};
6Page.nav = {
7    init: function() {
8        this.events.register()
9    },
10    menu: {
11        clicked: function() {
12            var e = document.getElementById("nav");
13            e.classList.remove("inactive", "sub-menu-active"), e.classList.add("menu-active"), Page.modal.close(), Page.modal.open("#modals .category-list")
14        }
15    },
16    category: {
17        clicked: function(e) {
18            var t = Page.util.events.getTarget(e),
19                a = t.getAttribute("value"),
20                l = Page.util.normalize.labelToClassName(a);
21            document.getElementById("nav").className = "sub-menu-active", subHeader = document.querySelector("#nav .sub-header"), subHeader.innerText = a.toUpperCase(), Page.modal.close(), Page.modal.open("#modals .sub-category-list." + l);
22            var i = document.getElementById("modals");
23            i.scrollTo(0, 0)
24        }
25    },
26    exit: {
27        clicked: function() {
28            var e = document.getElementById("nav");
29            e.classList.remove("menu-active", "sub-menu-active", "browse-topics"), e.classList.add("inactive"), Page.modal.close()
30        }
31    },
32    events: {
33        register: function() {
34            var e = [{
35                type: "click",
36                selector: "#modals .category-list li.arrow",
37                handler: Page.nav.category.clicked,
38                applyToNodeList: !0
39            }, {
40                type: "click",
41                selector: "#nav .back-arrow",
42                handler: Page.nav.menu.clicked,
43                applyToNodeList: !1
44            }, {
45                type: "click",
46                selector: "#nav .exit",
47                handler: Page.nav.exit.clicked,
48                applyToNodeList: !1
49            }];
50            Page.util.events.register(e)
51        }
52    }
53}, Page.header = {
54    init: function() {
55        this.events.register()
56    },
57    search: {
58        close: function() {
59            var e = document.getElementById("header");
60            e.classList.remove("search-active"), Page.header.search.set(""), Page.nav.exit.clicked()
61        },
62        submit: function(e) {
63            var t = Page.util.events.getTarget(e),
64                a = "q" === t.name ? t.value : Page.header.search.get();
65            Page.header.search.close();
66            var l = "search-results.php";
67            document.location.href = l + "?q=" + encodeURI(a.trim()) + "&limit=9"
68        },
69        enter: function(e) {
70            "ENTER" === e.key.toUpperCase() && Page.header.search.submit(e)
71        },
72        get: function() {
73            return document.querySelector("#header .search-input input[name=q]").value
74        },
75        set: function(e) {
76            return document.querySelector("#header .search-input input[name=q]").value = e
77        },
78        activate: function() {
79            var e = document.getElementById("header");
80            e.classList.add("search-active");
81            var t = e.querySelector(".search-input input[name=q]");
82            t.focus(), Page.modal.close();
83            var a = document.body;
84            a.classList.add("search-modal")
85        }
86    },
87    menu: {
88        open: function() {
89            var e = document.getElementById("nav");
90            e.classList.remove("inactive"), e.classList.add("menu-active"), Page.modal.close(), Page.modal.open("#modals .category-list")
91        }
92    },
93    browseTopics: {
94        open: function(e) {
95            var t = document.getElementById("nav");
96            t.classList.remove("inactive"), t.classList.add("menu-active"), Page.modal.close(), Page.modal.open("#modals .category-list");
97            var a = Page.util.events.getTarget(e),
98                l = a.getAttribute("category-name");
99            document.querySelector('.category-list li[value="' + l + '"]').click(), subHeader = t.querySelector(".sub-header"), subHeader.innerText = "BROWSE TOPICS";
100            var i = document.getElementById("modals");
101            t.classList.add("browse-topics"), i.classList.add("browse-topics")
102        }
103    },
104    events: {
105        register: function() {
106            var e = [{
107                type: "click",
108                selector: "#header .search.activate",
109                handler: Page.header.search.activate,
110                applyToNodeList: !1
111            }, {
112                type: "click",
113                selector: "#header .search.submit",
114                handler: Page.header.search.submit,
115                applyToNodeList: !1
116            }, {
117                type: "click",
118                selector: "#header .menu",
119                handler: Page.header.menu.open,
120                applyToNodeList: !1
121            }, {
122                type: "click",
123                selector: "#header .exit",
124                handler: Page.header.search.close,
125                applyToNodeList: !1
126            }, {
127                type: "click",
128                selector: "#content .browse-topics-button",
129                handler: Page.header.browseTopics.open,
130                applyToNodeList: !1
131            }];
132            Page.util.events.register(e)
133        }
134    }
135}, Page.veil = {
136    init: function() {
137        this.events.register()
138    },
139    events: {
140        register: function() {
141            var e = [{
142                type: "click",
143                selector: "#veil",
144                handler: Page.veil.close,
145                applyToNodeList: !1
146            }];
147            Page.util.events.register(e)
148        }
149    },
150    close: function() {
151        Page.header.search.close()
152    }
153}, Page.modal = {
154    open: function(e) {
155        var t = document.querySelector(e);
156        t.classList.add("open"), document.body.classList.add("menu-modal")
157    },
158    close: function() {
159        document.body.classList.remove("menu-modal", "search-modal");
160        var e = document.getElementById("modals");
161        e.classList.remove("browse-topics");
162        for (var t = e.querySelectorAll("#modals ul"), a = 0; a < t.length; a++) t[a].classList.remove("open")
163    }
164}, Page.util = {
165    data: {
166        base64: {
167            "gif-transparent-1x1": {
168                media: "gif",
169                base64: "R0lGODlhAQABAAD/ACwAAAAAAQABAAACADs="
170            },
171            "png-transparent-1x1": {
172                media: "png",
173                base64: "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mNkYAAAAAYAAjCB0C8AAAAASUVORK5CYII="
174            },
175            "png-transparent-18x12": {
176                media: "png",
177                base64: "iVBORw0KGgoAAAANSUhEUgAAABIAAAAMCAQAAADFGyU3AAAAEUl
177EQVR42mNkIAIwjioajIoADQIADV+wqgYAAAAASUVORK5CYII="
178            }
179        }
180    },
181    normalize: {
182        date: function(e) {
183            var t = e.value,
184                a = t.length,
185                l = "";
186            if (a)
187                for (var i = Page.util.data.regex.date_mask, r = a - 1; r >= 0; r--) {
188                    var n = t.substring(0, r + 1);
189                    if (i[r].test(n) === !0) {
190                        l = n;
191                        break
192                    }
193                }
194            return l
195        },
196        labelToClassName: function(e) {
197            var t = e.replace(/&/g, "and").toLowerCase();
198            return t = t.replace(/\s+/g, "-")
199        }
200    },
201    queryString: {
202        getVariable: function(e) {
203            for (var t = window.location.search.substring(1), a = t.split("&"), l = "", i = 0; i < a.length; i++) {
204                var r = a[i].split("=");
205                decodeURIComponent(r[0]) === e && (l = decodeURIComponent(r[1]))
206            }
207            return l
208        }
209    },
210    http: {
211        request: [],
212        requestUrl: null,
213        requestables: null,
214        response: [],
215        responseFail: [],
216        responseText: null,
217        statusText: null,
218        nextIndex: function() {
219            var e = Page.util.article.nextIndex.get(Page.util.doc.container.el);
220            return +e
221        },
222        nextLimit: function() {
223            var e = this.nextIndex(),
224                t = Page.util.article.count.get(Page.util.doc.container.el),
225                a = 4,
226                l = a;
227            return t > 0 && (l = Math.min(a, t - e)), +l
228        },
229        getNext: function() {
230            function e() {
231                if (4 === a.readyState)
232                    if (200 === a.status) {
233                        Page.util.http.responseText = a.responseText;
234                        for (var e = 0; e < Page.util.http.response.length; e++) Page.util.http.response[e]()
235                    } else {
236                        Page.util.http.statusText = a.statusText;
237                        for (var e = 0; e < Page.util.http.responseFail.length; e++) Page.util.http.responseFail[e]()
238                    }
239            }
240
241            function t() {
242                if (Page.util.doc.container.el) {
243                    if (Page.util.http.requestablesAvailable()) {
244                        for (var t = 0; t < Page.util.http.request.length; t++) Page.util.http.request[t]();
245                        a.onreadystatechange = e, a.open("GET", Page.util.http.requestUrl, !0), a.send()
246                    } else Page.util.bounce.scroll.deregister()
247                }
248            }
249            var a = new XMLHttpRequest;
250            t()
251        }
252    },
253    events: {
254        register: function(e) {
255            e.forEach(function(e) {
256                if (e.applyToNodeList)
257                    for (var t = document.querySelectorAll(e.selector), a = 0; a < t.length; a++) t[a].addEventListener(e.type, e.handler, !1);
258                else {
259                    var l = document.querySelector(e.selector);
260                    l && l.addEventListener(e.type, e.handler, !1)
261                }
262            })
263        },
264        getTarget: function(e) {
265            var t;
266            if (!e) var e = window.event;
267            return e.target ? t = e.target : e.srcElement && (t = e.srcElement), 3 == t.nodeType && (t = t.parentNode), t
268        },
269        scroll: {
270            threshold: {
271                removeIndicator: function(e) {
272                    var t = document.getElementById(e);
273                    t && t.parentNode.removeChild(t), t = document.getElementById(e + "-arrow"), t && t.parentNode.removeChild(t)
274                },
275                getIndicator: function(e, t, a, l) {
276                    var i = t + "px",
277                        r = 0,
278                        n = 40,
279                        s = 100,
280                        o = 2,
281                        c = document.createElement("span");
282                    c.id = e;
283                    var u = ["position:absolute", "width:" + s + "px", "height:" + n + "px", "line-height:" + n + "px", "text-align:center", "background-color:" + a, "color:" + l, "top:" + i, "right:" + r + "px", "z-index:" + o],
284                        d = u.join(";");
285                    c.textContent = i, c.style.cssText = d;
286                    var g = document.createElement("span");
287                    g.id = e + "-arrow", u = ["width:0", "height:0", "border-top:" + n / 2 + "px solid transparent", "border-bottom:" + n / 2 + "px solid transparent", "border-right:" + n / 2 + "px solid " + a, "z-index:" + o, "top:" + i, "right:" + (r + s) + "px", "position:absolute"], d = u.join(";"), g.style.cssText = d, document.body.appendChild(g), document.body.appendChild(c)
288                },
289                next: null,
290                depth: .75,
291                get: function() {
292                    var e = 86,
293                        t = 46,
294                        a = e + t,
295                        l = Page.util.doc.getHeight(),
296                        i = (Page.util.doc.getWidth(), Math.floor(l * this.depth - a));
297                    return i
298                },
299                set: function(e) {
300                    e = e ? e : this.get(), Page.util.events.scroll.threshold.next = e
301                },
302                exceededAction: [],
303                exceeded: function() {
304                    var e = Page.util.events.scroll.threshold,
305                        t = e.exceededAction,
306                        a = Page.util.doc.scrollTop.get(),
307                        l = e.next;
308                    if (l && a > l) {
309                        e.next = null;
310                        for (var i = 0; i < t.length; i++) t[i]()
311                    }
312                },
313                showScrollIndicators: function(e, t, a) {
314                    var l = {
315                            "oxford-blue": "#002145",
316                            "metallic-silver": "#A5ACAF",
317                            "kelly-green": "#66C010"
318                        },
319                        i = document.documentElement.clientHeight,
320                        r = t + i / 2;
321                    e.removeIndicator("scroller-top"), e.getIndicator("scroller-top", t, l["oxford-blue"], l["metallic-silver"]), e.removeIndicator("scroller-middle"), e.getIndicator("scroller-middle", r, l["metallic-silver"], l["oxford-blue"]), e.removeIndicator("scroller-threshold"), e.getIndicator("scroller-threshold", a, l["kelly-green"], l["oxford-blue"])
322                }
323            }
324        },
325        resize: {
326            adjust: {
327                scroll: {
328                    threshold: function() {
329                        Page.util.events.scroll.threshold.next && Page.util.events.scroll.threshold.set()
330                    }
331                }
332            }
333        }
334    },
335    bounce: {
336        addEvent: function(e, t) {
337            window.addEventListener(e, function(e) {
338                window.clearTimeout(t.isFiring), t.isFiring = setTimeout(function() {
339                    t.handlers.forEach(function(e) {
340                        e()
341                    })
342                }, t.duration)
343            }, !1)
344        },
345        scroll: {
346            duration: 125,
347            isFiring: !1,
348            handlers: [],
349            register: function() {
350                Page.util.bounce.addEvent("scroll", this)
351            },
352            deregister: function() {
353                Page.util.bounce.scroll.handlers = [], Page.util.bounce.resize.handlers = []
354            }
355        },
356        resize: {
357            duration: 125,
358            isFiring: !1,
359            handlers: [],
360            register: function() {
361                Page.util.bounce.addEvent("resize", this)
362            }
363        }
364    },
365    images: {
366        getBase64: function(e) {
367            var t = "png-transparent-18x12",
368                a = e ? Page.util.data.base64[e] : Page.util.data.base64[t],
369                l = "data:image/" + a.media + ";base64," + a.base64;
370            return l
371        },
372        setSrc: function(e, t) {
373            var a = 'img[src=""]';
374            e = e ? e + " " + a : a;
375            for (var l = this.getBase64(t), i = document.querySelectorAll(e), r = 0; r < i.length; r++) {
376                var n = i[r];
377                n.setAttribute("src", l)
378            }
379        },
380        loadDeferred: function(e) {
381            var t;
382            t = e ? e.getElementsByTagName("img") : document.getElementsByTagName("img");
383            for (var a = 0; a < t.length; a++) t[a].getAttribute("data-src") && (t[a].setAttribute("src", t[a].getAttribute("data-src")), t[a].removeAttribute("data-src"))
384        }
385    },
386    doc: {
387        container: {
388            el: null,
389            set: function(e) {
390                this.el = document.querySelector(e)
391            },
392            articlesAvailable: function() {
393                var e = !1,
394                    t = Page.util.doc.container.el,
395                    a = +t.getAttribute("total-article-count"),
396                    l = +t.getAttribute("next-article-index");
397                if (t && a >= 0 && l >= -1 && a > l + 1) var e = !0;
398                return e
399            }
400        },
401        getHeight: function() {
402            return document.body.clientHeight
403        },
404        getWidth: function() {
405            return document.body.clientWidth
406        },
407        scrollTop: {
408            get: function() {
409                var e = Math.max(document.documentElement.scrollTop, document.body.scrollTop);
410                return e
411            },
412            set: function() {
413                window.onbeforeunload = function() {
414                    window.scrollTo(0, 0)
415                }
416            }
417        }
418    },
419    article: {
420        nextIndex: {
421            get: function(e) {
422                var t = 0;
423                return e && e.getAttribute("next-article-index") && (t = e.getAttribute("next-article-index")), t
424            },
425            set: function(e, t) {
426                e && e.setAttribute("next-article-index", t)
427            }
428        },
429        count: {
430            get: function(e) {
431                var t = !1;
432                return e && e.getAttribute("total-article-count") && (t = e.getAttribute("total-article-count")), t
433            },
434            set: function(e, t) {
435                e && e.setAttribute("total-article-count", t)
436            }
437        }
438    },
439    el: function(e, t, a) {
440        var l = document.createElement(e);
441        for (var i in t) l.setAttribute(i, t[i]);
442        return a && (l.innerHTML = a), l
443    },
444    frag: {
445        create: {
446            fromHTMLString: function(e) {
447                var t = document.createDocumentFragment();
448                for (temp = document.createElement("div"), temp.innerHTML = e; temp.firstChild;) t.appendChild(temp.firstChild);
449                return t
450            }
451        }
452    },
453    effect: {
454        fadeOut: function(e, t, a) {
455            e.style.opacity = 1,
456                function l() {
457                    (e.style.opacity -= t) < 0 ? a() : requestAnimationFrame(l)
458                }()
459        }
460    },
461    spinner: {
462        show: function() {
463            var e = document.getElementById("spinner");
464            e || (e = document.createElement("div"), e.id = "spinner", document.body.appendChild(e)), e.style.opacity = 1, e.classList.add("active")
465        },
466        deactivate: function() {
467            document.getElementById("spinner").classList.remove("active")
468        },
469        hide: function() {
470            setTimeout(Page.util.spinner.fadeOut, 250)
471        },
472        fadeOut: function() {
473            var e = document.getElementById("spinner"),
474                t = .05;
475            Page.util.effect.fadeOut(e, t, Page.util.spinner.deactivate)
476        }
477    }
478}, Page.dueDateForm = {
479    selector: {
480        date: "input[name=due_date]",
481        articleBlock: ".pregnancy-calendar-page.child-page-articles .categories.articles-of-type",
482        dateFieldContainer: ".due-date-form .label-field .field"
483    },
484    DefaultDate: {
485        set: function() {
486            var e, t = this.get.futureDate(),
487                a = this.get.formattedDate(t),
488                l = Page.dueDateForm.selector.date;
489            e = document.querySelector(l), e.value = a
490        },
491        get: {
492            futureDate: function() {
493                var e = new Date,
494                    t = 7,
495                    a = 35,
496                    l = t * a;
497                return e.setDate(e.getDate() + l), e
498            },
499            formattedDate: function(e) {
500                return e.getFullYear() + "-" + this.normalize(e.getMonth() + 1) + "-" + this.normalize(e.getDate())
501            },
502            normalize: function(e) {
503                return e = e > 9 ? e : "0" + e
504            }
505        }
506    },
507    addClassToLastCategoryBlock: function() {
508        var e = Page.dueDateForm.selector.articleBlock,
509            t = document.querySelectorAll(e);
510        if (t) {
511            var a = t.length;
512            console.log(a), a > 0 && t[a - 1].classList.add("last")
513        }
514    },
515    init: function() {
516        this.DefaultDate.set(), this.addClassToLastCategoryBlock(), this.addDateIconLabel()
517    },
518    addDateIconLabel: function() {
519        var e = Page.dueDateForm.selector.dateFieldContainer,
520            t = document.querySelector(e),
521            a = document.createElement("i");
522        a.classList.add("fa", "fa-calendar"), t.appendChild(a)
523    }
524}, Page.pregnancyCalendar = {
525    init: function(e) {
526        "results" === e && (this.appendCards(), this.bounce())
527    },
528    bouncehandler: function() {
529        Page.pregnancyCalendar.highlightCenteredNumberBubble()
530    },
531    bounce: function() {
532        var e = Page.pregnancyCalendar,
533            t = document.querySelector(".date-band");
534        t.onscroll = e.bouncehandler, document.body.onresize = e.bouncehandler
535    },
536    highlightCenteredNumberBubble: function() {
537        for (var e = document.querySelector(".date-band"), t = (e.clientWidth, e.scrollLeft, Math.max(document.documentElement.clientWidth, window.innerWidth || 0)), a = 100, l = t / 2, i = e.querySelectorAll(".date-band-dial"), r = [], n = 0; n < i.length; n++) {
538            var s = i[n].getBoundingClientRect();
539            r.push(s.left)
540        }
541        for (var o = (Page.pregnancyCalendar.closest(r, a, l), Page.pregnancyCalendar.closestIndex(r, a, l)), n = 0; n < i.length; n++) i[n].querySelector(".date-type").classList.remove("small", "big"), n === o ? i[n].querySelector(".date-type").classList.add("big") : i[n].querySelector(".date-type").classList.add("small")
542    },
543    closest: function(e, t, a) {
544        var l, i = 0,
545            r = 1e3;
546        a -= t / 2;
547        for (i in e) {
548            var n = Math.abs(a - e[i]);
549            r > n && (r = n, l = e[i])
550        }
551        return l
552    },
553    closestIndex: function(e, t, a) {
554        var l = 1e3,
555            i = 0;
556        a -= t / 2;
557        for (var r = 0; r < e.length; r++) {
558            var n = Math.abs(a - e[r]);
559            l > n && (l = n, i = r)
560        }
561        return i
562    },
563    appendCards: function() {
564        for (var e = 1; 60 > e; e++) {
565            var t = document.createElement("div");
566            t.classList.add("date-band-dial");
567            var a = document.createElement("span");
568            a.innerText = e;
569            var l = document.createElement("span");
570            l.classList.add("date-type"), l.classList.add("small"), l.appendChild(a), t.appendChild(l), Page.pregnancyCalendar.appendCard(t)
571        }
572        Page.pregnancyCalendar.highlightCenteredNumberBubble()
573    },
574    appendCard: function(e) {
575        document.getElementById("horizontal-cards").appendChild(e)
576    }
577}, Page.ads = {
578    get: function() {
579        var e = document.createElement("div");
580        e.setAttribute("class", "ad-wrapper");
581        var t = document.createElement("div");
582        t.setAttribute("class", "ad border");
583        var a = document.createElement("div");
584        return a.setAttribute("class", "container"), t.appendChild(a), e.appendChild(t), e
585    },
586    inject: function(e) {
587        for (var t = document.querySelectorAll(e + " h2," + e + " p strong"), a = 0; a < t.length; a++) {
588            var l = t[a],
589                i = Page.ads.get();
590            l.parentNode.insertBefore(i, l)
591        }
592    }
593}, Page.article = {
594    nextIdList: [494098, 492992],
595    getNextId: function() {
596        var e = null,
597            t = Page.article.nextIdList.length;
598        if (t) {
599            var a = Math.floor(Math.random() * t);
600            e = Page.article.nextIdList[a], Page.article.nextIdList.splice(a, 1)
601        }
602        return e
603    },
604    normalize: {
605        fillRecommended: function(e) {
606            var t = [{
607                    url: "https://www.justmommies.com/getting-pregnant/adoption-and-surrogacy/how-much-does-adoption-cost",
608                    title: "How much does adoption cost?",
609                    src: "https://cimg3.ibsrv.net/cimg/www.justmommies.com/180x120_85-1/719/425baby-20food2-219719.jpg"
610                }, {
611                    url: "https://www.justmommies.com/pregnancy/am-i-pregnant/morning-sickness-or-stomach-bug",
612                    title: "Morning Sickness or Stomach Bug?",
613                    src: "https://cimg1.ibsrv.net/cimg/www.justmommies.com/180x120_85-1/713/425cow-219713.jpg"
614                }, {
615                    url: "https://www.justmommies.com/toddlers/childcare/what-to-look-for-in-childcare-program",
616                    title: "What to Look for in a Childcare Program",
617                    src: "https://cimg1.ibsrv.net/cimg/www.justmommies.com/180x120_85-1/25/breastfeeding-pregnant2-221025.jpg"
618                }, {
619                    url: "https://www.justmommies.com/tweens-and-teens/fitness-and-sports/how-to-get-your-couch-potato-off-the-couch",
620                    title: "How to Get Your Couch Potato Off the Couch",
621                    src: "https://cimg3.ibsrv.net/cimg/www.justmommies.com/180x120_85-1/891/babytravelwide-220891.jpg"
622                }],
623                a = e.querySelector("#morerelated .imageContainer");
624            if (a) {
625                var l = e.querySelectorAll(".imageBoxOuterContainer"),
626                    i = l.length,
627                    r = 4;
628                if (i)
629                    for (var n = 0; r - i > n; n++) {
630                        var s = Page.util.frag.create.fromHTMLString(Page.article.normalize.recommendedItem(t[n]));
631                        a.appendChild(s)
632                    }
633            }
634        },
635        recommendedItem: function(e) {
636            return '<div class="imageBoxOuterContainer"><div class="imageBoxInnerContainer"><div class="imageBox-content portrait"><a href="' + e.url + '"><img src="' + e.src + '"></a></div><p style="word-wrap:break-word;"><a href="' + e.url + '">' + e.title + "</a></p></div></div>"
637        },
638        replaceH2: function(e) {
639            for (var t = e.querySelectorAll("#article-body .main > p"), a = [], l = 0; l < t.length; l++)
640                if (1 === t[l].childNodes.length) {
641                    var i = t[l].childNodes[0];
642                    if ("strong" === i.nodeName.toLowerCase()) {
643                        var r = i.childNodes;
644                        1 === r.length && 3 === r[0].nodeType && a.push({
645                            el: t[l],
646                            txt: r[0]
647                        })
648                    }
649                } else "" === t[l].innerHTML && t[l].parentNode.removeChild(t[l]);
650            for (var l = 0; l < a.length; l++) {
651                var n = document.createElement("h2");
652                n.appendChild(a[l].txt), a[l].el.parentNode.replaceChild(n, a[l].el)
653            }
654            return e
655        },
656        replaceListParagraphs: function(e) {
657            function t(e) {
658                for (var t, a, l, i = "", r = e.querySelectorAll("li"), n = 0; n < r.length; n++) {
659                    l = r[n].querySelectorAll("p");
660                    for (var s = 0; s < l.length; s++) t = l[s], a = t.innerHTML, i += a;
661                    r[n].innerHTML = i
662                }
663                return e
664            }
665
666            function a(e) {
667                for (var a, l, i, r = 0; r < e.length; r++) {
668                    a = e[r];
669                    for (var n = 0; n < a.length; n++) t(a[n]);
670                    for (var n = a.length; n > 1; n--) i = a[n - 1], l = i.querySelector("li"), a[0].appendChild(l), i.parentNode.removeChild(i)
671                }
672            }
673
674            function l(e) {
675                var t, a, l = e.querySelectorAll("li"),
676                    i = !1;
677                return 1 === l.length && (t = l[0], a = t.querySelectorAll("p"), a.length > 0 && (i = !0)), i
678            }
679
680            function i(e, t) {
681                var i, r = e.querySelector("#article-body .main"),
682                    n = r.children,
683                    s = [],
684                    o = [],
685                    c = !1;
686                if (n.length) {
687                    for (var u = 0; u < n.length; u++) i = n[u], i.tagName.toLowerCase() === t ? (c || (c = !0, o = []), l(i) && o.push(i)) : (c = !1, o.length && (s.push(o), o = []));
688                    o.length && s.push(o)
689                }
690                a(s)
691            }
692
693            function r(e) {
694                for (; e.firstChild;) e.parentNode.insertBefore(e.firstChild, e)
695            }
696
697            function n(e) {
698                e.parentNode.removeChild(e)
699            }
700
701            function s(e, t) {
702                for (var a, l = e.querySelectorAll("#article-body .main " + t + " li > p"), i = 0; i < l.length; i++) a = l[i], r(a), n(a);
703                return e
704            }
705            for (var o = ["ul", "ol"], c = 0; c < o.length; c++) i(e, o[c]), s(e, o[c]);
706            return e
707        }
708    },
709    debug: {
710        removeMe: function(e) {
711            var e = document.getElementById("article-debug-modal");
712            e.parentNode.removeChild(e)
713        },
714        fadeOut: function(e) {
715            var t = .005;
716            Page.util.effect.fadeOut(e, t, Page.article.debug.removeMe)
717        },
718        displayNewArticle: function(e, t) {
719            var a = t.firstChild.getAttribute("data-article"),
720                l = JSON.parse(a),
721                i = l.title,
722                r = "position:fixed;z-index:3;top:10px;right:10px;background-color:#A5ACAF;color:#002145;border:1px solid #66C010;border-radius:5px;padding:20px;margin:0;list-style:none;width:320px",
723                n = Page.util.el("ul", {
724                    "class": "debug-new-article"
725                }, null);
726            n.id = "article-debug-modal", n.style.cssText = r, n.appendChild(Page.util.el("lh", null, "new article")), n.appendChild(Page.util.el("li", null, "id: " + e)), n.appendChild(Page.util.el("li", null, "title: " + i)), document.body.appendChild(n), Page.article.debug.fadeOut(n)
727        }
728    },
729    init: function() {
730        Page.ads.inject("#content .article.primary"), Page.util.images.setSrc(".imageContainer"), Page.article.replaceByLine(), Page.util.events.scroll.threshold.set(), Page.util.doc.scrollTop.set(), Page.article.events.register.doc(), Page.article.events.register.bounce(), Page.article.events.register.http(), Page.article.http.setNextId()
731    },
732    events: {
733        register: {
734            doc: function() {
735                Page.util.doc.container.set("#content .wrapper .article-block .article.primary")
736            },
737            bounce: function() {
738                Page.util.bounce.scroll.register(), Page.util.events.scroll.threshold.exceededAction.push(Page.util.http.getNext), Page.util.bounce.scroll.handlers.push(Page.util.events.scroll.threshold.exceeded), Page.util.bounce.resize.register(), Page.util.bounce.resize.handlers.push(Page.util.events.resize.adjust.scroll.threshold)
739            },
740            http: function() {
741                Page.util.http.request.push(Page.article.http.request), Page.util.http.response.push(Page.article.http.response), Page.util.http.responseFail.push(Page.article.http.responseFail), Page.util.http.requestablesAvailable = Page.article.http.articlesAvailable
742            }
743        }
744    },
745    http: {
746        setNextId: function() {
747            var e = Page.article.getNextId();
748            Page.article.http.articleId = e
749        },
750        articleId: null,
751        articlesAvailable: function() {
752            return !!Page.article.http.articleId
753        },
754        requestUrl: {
755            set: function() {
756                var e = "endpoints/article.php?id=" + Page.article.http.articleId;
757                Page.util.http.requestUrl = e
758            }
759        },
760        request: function() {
761            Page.article.http.articleId ? (Page.util.spinner.show(), Page.article.http.requestUrl.set()) : Page.util.bounce.scroll.deregister()
762        },
763        responseFail: function() {
764            Page.util.spinner.hide(), Page.util.bounce.scroll.deregister()
765        },
766        response: function() {
767            var e = Page.util.frag.create.fromHTMLString(Page.util.http.responseText);
768            e = Page.article.normalize.replaceH2(e), e = Page.article.normalize.replaceListParagraphs(e), Page.article.replaceByLine(e), Page.article.normalize.fillRecommended(e), -1 !== document.location.href.indexOf("localhost");
769            var t = Page.util.doc.container.el;
770            t.appendChild(e), Page.util.images.setSrc(".imageContainer"), Page.util.events.scroll.threshold.set(), Page.util.spinner.hide(), Page.article.http.setNextId()
771        }
772    },
773    replaceByLine: function(e) {
774        var t = ["<span class='byline-img'><img src='images/bill-small.jpg'></span><span class='byline-author'>By <a href='author.php?author=bill-murray'>Bill Murray</a></span>", "<span class='byline-img'><img src='images/jimi-hendrix.jpg'></span><span class='byline-author'>By <a href='author.php?author=jimi-hendrix'>Jimi Hendrix</a></span>", "<span class='byline-img'><img src='images/frida-kahlo.jpg'></span><span class='byline-author'>By <a href='author.php?author=frida-kahlo'>Frida Kahlo</a></span>", "<span class='byline-img'><img src='images/baby-small.jpg'></span><span class='byline-author'>By <a href='author.php?author=jennifer-brown'>Jennifer Brown</a></span>"],
775            a = Math.floor(Math.random() * t.length);
776        e ? e.getElementById("byline").innerHTML = t[a] : document.getElementById("byline").innerHTML = t[a]
777    },
778    getPopularTools: function() {
779        return '<div class="popular-tools"><div class="popular-tools-label">Popular Tools<div class="view-all"><a href="https://www.justmommies.com/all-tools/">View All</a></div></div><ul class="tools-list"><li class="wrapper"><a href="https://www.justmommies.com/duedate.shtml" class="tool"><span class="icon due-date-calendar"><i></i></span><span class="label"><span>Due Date Calendar</span></span></a></li><li class="wrapper"><a href="https://www.justmommies.com/pregnancy_calendar.php" class="tool"><span class="icon pregnancy-calendar"><i></i></span><span class="label"><span>Pregnancy Calendar</span></span></a></li><li class="wrapper"><a href="https://www.justmommies.com/ovulation-calendar.shtml" class="tool"><span class="icon ovulation-calendar"><i></i></span><span class="label"><span>Ovulation Center</span></span></a></li><li class="wrapper"><a href="https://www.justmommies.com/articles/period_calculator.php" class="tool"><span class="icon period-calculator"><i></i></span><span class="label"><span>Period Calculator</span></span></a></li><li class="wrapper"><a href="https://www.justmommies.com/baby-names" class="tool"><span class="icon baby-names"><i></i></span><span class="label"><span>Baby Names</span></span></a></li><li class="wrapper"><a href="https://www.justmommies.com/pregnancy/pregnancy-week-week" class="tool"><span class="icon pregnancy-week-by-week"><i></i></span><span class="label"><span>Pregnancy Week By Week</span></span></a></li><li class="wrapper"><a href="https://www.justmommies.com/articles/formula-feeding-calculator.php" class="tool"><span class="icon formula-feeding-calendar"><i></i></span><span class="label"><span>Formula Feeding Calendar</span></span></a></li><li class="wrapper"><a href="https://www.justmommies.com/articles/download-fertility-chart.shtml" class="tool"><span class="icon bbt-charts"><i></i></span><span class="label"><span>BBT Charts</span></span></a></li><li class="wrapper"><a href="https://www.justmommies.com/articles/breastfeeding-calculator.php" class="tool"><span class="icon breastfeeding-calculator"><i></i></span><span class="label"><span>Breastfeeding Calculator</span></span></a></li><li class="wrapper"><a href="https://www.justmommies.com/pregnancy/hcgcalculator.shtml" class="tool"><span class="icon hcg-calculator"><i></i></span><span class="label"><span>HCG Calculator</span></span></a></li><li class="wrapper"><a href="https://www.justmommies.com/articles/chore-charts-for-kids.shtml" class="tool"><span class="icon chore-chart"><i></i></span><span class="label"><span>Chore Chart</span></span></a></li><li class="wrapper"><a href="https://www.justmommies.com/articles/infants_growth_calculator.shtml" class="tool"><span class="icon infant-growth-calculator"><i></i></span><span class="label"><span>Infant Growth Calculator</span></span></a></li><li class="wrapper"><a href="https://www.justmommies.com/quizzes/birthplan.php" class="tool"><span class="icon birth-plan"><i></i></span><span class="label"><span>Birth Plan</span></span></a></li><li class="wrapper"><a href="https://www.justmommies.com/articles/childrens_growth_calculator.shtml" class="tool"><span class="icon child-growth-calculator"><i></i></span><span class="label"><span>Child Growth Calculator</span></span></a></li><li class="wrapper"><a href="https://www.justmommies.com/articles/home-organization-plan.php" class="tool"><span class="icon home-organization-plan"><i></i></span><span class="label"><span>Home Organization Plan</span></span></a></li><li class="wrapper"><a href="https://www.justmommies.com/articles/hourly_wage.shtml" class="tool"><span class="icon wage-calculator"><i></i></span><span class="label"><span>Wage Calculator</span></span></a></li></ul><div class="view-all"><a href="https://www.justmommies.com/all-tools/">View All Tools</a></div></div>'
780    }
781}, Page.category = {
782    style: {
783        adjust: {
784            blurb: function() {
785                var e = 38,
786                    t = 0,
787                    a = {
788                        header: "#content .category-header > .category-header-wrapper",
789                        blurb: "#content .category-blurb"
790                    },
791                    l = document.querySelector(a.header),
792                    i = document.querySelector(a.blurb);
793                if (l && i) {
794                    var r = l.clientHeight;
795                    r > e && (t = r - e), i.style.marginTop = t + "px"
796                }
797            }
798        }
799    },
800    init: function() {
801        this.style.adjust.blurb()
802    }
803}, Page.subcategory = {
804    getArticleBlock: function(e) {
805        var t = e.href,
806            a = "images/baby-small.jpg",
807            l = e.tag,
808            i = e.label,
809            r = Page.util.el("a", {
810                "class": "article-link-block responsive",
811                href: t
812            }),
813            n = Page.util.el("div", {
814                "class": "wrapper"
815            }),
816            s = Page.util.el("div", {
817                "class": "hero top"
818            }),
819            o = Page.util.el("img", {
820                "class": "hero top image",
821                "data-src": a,
822                src: Page.util.images.getBase64("png-transparent-1x1")
823            }),
824            c = Page.util.el("div", {
825                "class": "tag-title"
826            }),
827            u = Page.util.el("div", {
828                "class": "tag"
829            }, l),
830            d = Page.util.el("div", {
831                "class": "title"
832            }, i),
833            g = Page.util.el("div", {
834                "class": "hero-bottom-container"
835            }),
836            p = Page.util.el("div", {
837                "class": "hero bottom"
838            }),
839            h = Page.util.el("img", {
840                alt: "hero bottom image",
841                "data-src": a,
842                src: Page.util.images.getBase64("png-transparent-1x1")
843            });
844        return s.appendChild(o), c.appendChild(u), c.appendChild(d), p.appendChild(h), g.appendChild(p), n.appendChild(s), n.appendChild(c), n.appendChild(g), r.appendChild(n), r
845    },
846    displayNext: function(e) {
847        for (var t = document.querySelector("#content main .category-page"), a = Page.util.el("div", {
848                "class": "categories articles-of-type"
849            }), l = Page.util.el("div", {
850                "class": "category-items"
851            }), i = e.articles, r = 0; r < i.length; r++) l.appendChild(Page.subcategory.getArticleBlock(i[r]));
852        a.appendChild(l), t.appendChild(a), Page.util.images.loadDeferred(t)
853    },
854    events: {
855        register: {
856            doc: function() {
857                Page.util.doc.container.set("#content main .category-page")
858            },
859            bounce: function() {
860                Page.util.bounce.scroll.register(), Page.util.events.scroll.threshold.exceededAction.push(Page.util.http.getNext), Page.util.events.scroll.threshold.depth = .25, Page.util.events.scroll.threshold.set(25), Page.util.bounce.scroll.handlers.push(Page.util.events.scroll.threshold.exceeded), Page.util.bounce.resize.register(), Page.util.bounce.resize.handlers.push(Page.util.events.resize.adjust.scroll.threshold)
861            },
862            http: function() {
863                Page.util.http.response.push(Page.subcategory.http.response), Page.util.http.request.push(Page.subcategory.http.request), Page.util.http.responseFail.push(Page.subcategory.http.responseFail), Page.util.http.requestablesAvailable = Page.util.doc.container.articlesAvailable
864            }
865        }
866    },
867    http: {
868        requestUrl: {
869            set: function() {
870                var e = Page.util.queryString.getVariable("subcategory"),
871                    t = Page.util.http.nextIndex(),
872                    a = Page.util.http.nextLimit(),
873                    l = "endpoints/subcategory-article.php?subcategory=" + e + "&start=" + t + "&limit=" + a;
874                Page.util.http.requestUrl = l
875            }
876        },
877        request: function() {
878            Page.util.spinner.show(), Page.subcategory.http.requestUrl.set()
879        },
880        responseFail: function() {
881            Page.util.spinner.hide(), Page.util.bounce.scroll.deregister()
882        },
883        response: function() {
884            var e = Page.util.doc.container.el,
885                t = JSON.parse(Page.util.http.responseText),
886                a = t.total;
887            if (a > 0) {
888                var l = Page.util.http.nextLimit(),
889                    i = Page.util.http.nextIndex(),
890                    a = t.total;
891                i += l, Page.util.article.count.set(e, a), Page.util.article.nextIndex.set(e, i), Page.subcategory.displayNext(t), a > i ? Page.util.events.scroll.threshold.set() : Page.util.bounce.scroll.deregister(), Page.util.spinner.hide()
892            } else Page.subcategory.http.responseFail()
893        }
894    },
895    init: function() {
896        Page.util.doc.scrollTop.set(), Page.subcategory.events.register.doc(), Page.util.doc.container.articlesAvailable() && (Page.subcategory.events.register.bounce(), Page.subcategory.events.register.http())
897    }
898}, Page.search = {
899    setFocusOnSearch: function() {
900        var e = Page.util.queryString.getVariable("q");
901        void 0 === e && (e = "");
902        var t = document.querySelector("#content .search-results-input > .search-input input");
903        t && (t.value = "", t.focus(), t.value = e)
904    },
905    el: {
906        getResults: function(e) {
907            for (var t = e.articles, a = this.getArticlesOfType(), l = this.getCategoryItems(), i = 4, r = 0; r < t.length; r++) l.appendChild(this.getArticleLinkBlock(t[r]));
908            if (t.length < i)
909                for (var r = 0; r < i - t.length; r++) l.appendChild(this.getArticleLinkBlockPlaceholder());
910            return a.appendChild(l), a
911        },
912        getArticlesOfType: function() {
913            return Page.util.el("div", {
914                "class": "categories articles-of-type"
915            }, null)
916        },
917        getCategoryItems: function() {
918            return Page.util.el("div", {
919                "class": "category-items"
920            }, null)
921        },
922        getArticleLinkBlock: function(e) {
923            var t = Page.util.el("a", {
924                    "class": "article-link-block responsive",
925                    href: e.href
926                }, null),
927                a = Page.util.el("div", {
928                    "class": "wrapper"
929                }, null),
930                l = Page.util.el("div", {
931                    "class": "hero top"
932                }, null),
933                i = Page.util.el("img", {
934                    alt: "hero top image",
935                    "data-src": "images/bill-small.jpg"
936                }, null);
937            l.appendChild(i);
938            var r = Page.util.el("div", {
939                    "class": "tag-title"
940                }, null),
941                n = Page.util.el("div", {
942                    "class": "tag"
943                }, e.tag),
944                s = Page.util.el("div", {
945                    "class": "title"
946                }, e.label);
947            r.appendChild(n), r.appendChild(s);
948            var o = Page.util.el("div", {
949                    "class": "hero-bottom-container"
950                }, null),
951                c = Page.util.el("div", {
952                    "class": "hero bottom"
953                }, null),
954                u = Page.util.el("img", {
955                    alt: "hero bottom image",
956                    "data-src": "images/bill-small.jpg"
957                }, null);
958            return c.appendChild(u), o.appendChild(c), a.appendChild(l), a.appendChild(r), a.appendChild(o), t.appendChild(a), t
959        },
960        getArticleLinkBlockPlaceholder: function() {
961            var e = Page.util.el("div", {
962                    "class": "article-link-block placeholder responsive"
963                }, null),
964                t = Page.util.el("div", {
965                    "class": "wrapper"
966                }, null),
967                a = Page.util.el("div", {
968                    "class": "hero top"
969                }, null),
970                l = Page.util.el("img", {
971                    alt: "hero top image",
972                    src: Page.util.images.getBase64("gif-transparent-1x1")
973                }, null);
974            a.appendChild(l);
975            var i = Page.util.el("div", {
976                    "class": "tag-title"
977                }, null),
978                r = Page.util.el("div", {
979                    "class": "tag"
980                }, null),
981                n = Page.util.el("div", {
982                    "class": "title"
983                }, null);
984            i.appendChild(r), i.appendChild(n);
985            var s = Page.util.el("div", {
986                    "class": "hero-bottom-container"
987                }, null),
988                o = Page.util.el("div", {
989                    "class": "hero bottom"
990                }, null),
991                c = Page.util.el("img", {
992                    alt: "hero bottom image",
993                    src: Page.util.images.getBase64("gif-transparent-1x1")
994                }, null);
995            return o.appendChild(c), s.appendChild(o), t.appendChild(a), t.appendChild(i), t.appendChild(s), e.appendChild(t), e
996        }
997    },
998    events: {
999        register: {
1000            doc: function() {
1001                Page.util.doc.container.set("#content main .search-page")
1002            },
1003            bounce: function() {
1004                Page.util.bounce.scroll.register(), Page.util.events.scroll.threshold.exceededAction.push(Page.util.http.getNext), Page.util.events.scroll.threshold.depth = .45, Page.util.events.scroll.threshold.set(), Page.util.bounce.scroll.handlers.push(Page.util.events.scroll.threshold.exceeded), Page.util.bounce.resize.register(), Page.util.bounce.resize.handlers.push(Page.util.events.resize.adjust.scroll.threshold)
1005            },
1006            http: function() {
1007                Page.util.http.request.push(Page.search.http.request), Page.util.http.response.push(Page.search.http.response), Page.util.http.responseFail.push(Page.search.http.responseFail), Page.util.http.requestablesAvailable = Page.util.doc.container.articlesAvailable
1008            }
1009        }
1010    },
1011    http: {
1012        requestUrl: {
1013            set: function() {
1014                var e = Page.util.queryString.getVariable("q"),
1015                    t = Page.util.http.nextIndex(),
1016                    a = Page.util.http.nextLimit(),
1017                    l = "endpoints/search.php?q=" + e + "&start=" + t + "&limit=" + a;
1018                Page.util.http.requestUrl = l
1019            }
1020        },
1021        request: function() {
1022            Page.util.spinner.show(), Page.search.http.requestUrl.set()
1023        },
1024        responseFail: function() {
1025            Page.util.spinner.hide(), Page.util.bounce.scroll.deregister()
1026        },
1027        response: function() {
1028            var e = Page.util.doc.container.el,
1029                t = JSON.parse(Page.util.http.responseText),
1030                a = t.total;
1031            if (a > 0) {
1032                var l = Page.util.http.nextLimit(),
1033                    i = Page.util.http.nextIndex();
1034                i += l;
1035                var r = Page.search.el.getResults(t);
1036                e.appendChild(r), Page.util.images.loadDeferred(e), Page.util.article.count.set(e, a), Page.util.article.nextIndex.set(e, i), a > i ? Page.util.events.scroll.threshold.set() : Page.util.bounce.scroll.deregister(), Page.util.spinner.hide()
1037            } else Page.search.http.responseFail()
1038        }
1039    },
1040    init: function() {
1041        Page.util.doc.scrollTop.set(), Page.search.events.register.doc(), Page.util.doc.container.articlesAvailable() && (Page.search.events.register.bounce(), Page.search.events.register.http()), setTimeout(Page.search.setFocusOnSearch, 1)
1042    }
1043}, Page.bio = {
1044    el: {
1045        getResults: function(e) {
1046            for (var t = e.articles, a = this.getArticlesOfType(), l = this.getCategoryItems(), i = 4, r = 0; r < t.length; r++) l.appendChild(this.getArticleLinkBlock(t[r]));
1047            if (t.length < i)
1048                for (var r = 0; r < i - t.length; r++) l.appendChild(this.getArticleLinkBlockPlaceholder());
1049            return a.appendChild(l), a
1050        },
1051        getArticlesOfType: function() {
1052            return Page.util.el("div", {
1053                "class": "categories articles-of-type"
1054            }, null)
1055        },
1056        getCategoryItems: function() {
1057            return Page.util.el("div", {
1058                "class": "category-items"
1059            }, null)
1060        },
1061        getArticleLinkBlock: function(e) {
1062            var t = Page.util.el("a", {
1063                    "class": "article-link-block responsive",
1064                    href: e.href
1065                }, null),
1066                a = Page.util.el("div", {
1067                    "class": "wrapper"
1068                }, null),
1069                l = Page.util.el("div", {
1070                    "class": "hero top"
1071                }, null),
1072                i = Page.util.el("img", {
1073                    alt: "hero top image",
1074                    "data-src": "images/bill-small.jpg"
1075                }, null);
1076            l.appendChild(i);
1077            var r = Page.util.el("div", {
1078                    "class": "tag-title"
1079                }, null),
1080                n = Page.util.el("div", {
1081                    "class": "tag"
1082                }, e.tag),
1083                s = Page.util.el("div", {
1084                    "class": "title"
1085                }, e.label);
1086            r.appendChild(n), r.appendChild(s);
1087            var o = Page.util.el("div", {
1088                    "class": "hero-bottom-container"
1089                }, null),
1090                c = Page.util.el("div", {
1091                    "class": "hero bottom"
1092                }, null),
1093                u = Page.util.el("img", {
1094                    alt: "hero bottom image",
1095                    "data-src": "images/bill-small.jpg"
1096                }, null);
1097            return c.appendChild(u), o.appendChild(c), a.appendChild(l), a.appendChild(r), a.appendChild(o), t.appendChild(a), t
1098        },
1099        getArticleLinkBlockPlaceholder: function() {
1100            var e = Page.util.el("div", {
1101                    "class": "article-link-block placeholder responsive"
1102                }, null),
1103                t = Page.util.el("div", {
1104                    "class": "wrapper"
1105                }, null),
1106                a = Page.util.el("div", {
1107                    "class": "hero top"
1108                }, null),
1109                l = Page.util.el("img", {
1110                    alt: "hero top image",
1111                    src: Page.util.images.getBase64("gif-transparent-1x1")
1112                }, null);
1113            a.appendChild(l);
1114            var i = Page.util.el("div", {
1115                    "class": "tag-title"
1116                }, null),
1117                r = Page.util.el("div", {
1118                    "class": "tag"
1119                }, null),
1120                n = Page.util.el("div", {
1121                    "class": "title"
1122                }, null);
1123            i.appendChild(r), i.appendChild(n);
1124            var s = Page.util.el("div", {
1125                    "class": "hero-bottom-container"
1126                }, null),
1127                o = Page.util.el("div", {
1128                    "class": "hero bottom"
1129                }, null),
1130                c = Page.util.el("img", {
1131                    alt: "hero bottom image",
1132                    src: Page.util.images.getBase64("gif-transparent-1x1")
1133                }, null);
1134            return o.appendChild(c), s.appendChild(o), t.appendChild(a), t.appendChild(i), t.appendChild(s), e.appendChild(t), e
1135        }
1136    },
1137    events: {
1138        register: {
1139            doc: function() {
1140                Page.util.doc.container.set("#content main .child-page-articles")
1141            },
1142            bounce: function() {
1143                Page.util.bounce.scroll.register(), Page.util.events.scroll.threshold.exceededAction.push(Page.util.http.getNext), Page.util.events.scroll.threshold.depth = .45, Page.util.events.scroll.threshold.set(), Page.util.bounce.scroll.handlers.push(Page.util.events.scroll.threshold.exceeded), Page.util.bounce.resize.register(), Page.util.bounce.resize.handlers.push(Page.util.events.resize.adjust.scroll.threshold)
1144            },
1145            http: function() {
1146                Page.util.http.request.push(Page.bio.http.request), Page.util.http.response.push(Page.bio.http.response), Page.util.http.responseFail.push(Page.bio.http.responseFail), Page.util.http.requestablesAvailable = Page.util.doc.container.articlesAvailable
1147            }
1148        }
1149    },
1150    http: {
1151        requestUrl: {
1152            set: function() {
1153                var e = Page.util.queryString.getVariable("author");
1154                "" === e && (e = "jennifer-brown");
1155                var t = Page.util.http.nextIndex(),
1156                    a = Page.util.http.nextLimit(),
1157                    l = "endpoints/author-bio.php?author=" + e + "&start=" + t + "&limit=" + a;
1158                Page.util.http.requestUrl = l
1159            }
1160        },
1161        request: function() {
1162            Page.util.spinner.show(), Page.bio.http.requestUrl.set()
1163        },
1164        responseFail: function() {
1165            Page.util.spinner.hide(), Page.util.bounce.scroll.deregister()
1166        },
1167        response: function() {
1168            var e = Page.util.doc.container.el,
1169                t = JSON.parse(Page.util.http.responseText),
1170                a = t.total;
1171            if (a > 0) {
1172                var l = Page.util.http.nextLimit(),
1173                    i = Page.util.http.nextIndex();
1174                i += l;
1175                var r = Page.bio.el.getResults(t);
1176                e.appendChild(r), Page.util.images.loadDeferred(e), Page.util.article.count.set(e, a), Page.util.article.nextIndex.set(e, i), a > i ? Page.util.events.scroll.threshold.set() : Page.util.bounce.scroll.deregister(), Page.util.spinner.hide()
1177            } else Page.bio.http.responseFail()
1178        }
1179    },
1180    init: function() {
1181        Page.util.doc.scrollTop.set(), Page.bio.events.register.doc(), Page.util.doc.container.articlesAvailable() && (Page.bio.events.register.bounce(), Page.bio.events.register.http())
1182    }
1183}, Page.newsletter = {
1184
1185	// form: object containing form fields
1186	forms: {},
1187
1188	// element selectors
1189	selector: {
1190
1191		date: 'input[name=due_date]',
1192		email: 'input[name=email_address]',
1193		signup: 'input[name=signup_agree]',
1194
1195		// parents
1196		signupAgree: '.sign-up-agree',
1197		dateParent: '.label-field.date',
1198		emailParent: '.label-field.email',
1199		header: '.header'
1200
1201	},
1202
1203	// set up form on page load
1204	init: function () {
1205
1206		this.events.register();
1207
1208	},
1209
1210	events: {
1211
1212		register: function () {
1213
1214			var list = document.querySelectorAll( 'form.newsletter-form' );
1215
1216			for( var i = 0; i < list.length; i++ ) {
1217
1218                var form = list[i];
1219                form.idx = i;
1220
1221                var data = {};
1222                for(var idx = 0; idx < form.length; idx++) {
1223                    if(form[idx].name) {
1224                        data[form[idx].name] = {
1225                            value: form[idx].value,
1226                            element: form[idx]
1227                        };
1228                    }
1229                }
1230                data.casl = false;
1231                Page.newsletter.forms[form.idx] = data;
1232
1233				this.registerSignup( form );
1234				this.registerSubmit( form );
1235				this.registerInvalidForm( form );
1236				this.registerCheckbox( form );
1237                this.registerFocus( form );
1238                this.registerForm(form);
1239
1240				// register click for signup "link", on click change isOptional to false for "agree" checkbox
1241
1242			}
1243
1244        },
1245
1246        registerForm: function( form ) {
1247            form.addEventListener(
1248                'submit',
1249                function (e) {
1250                    if(Page.newsletter.validate(form)) {
1251                        let formData = Page.newsletter.forms[form.idx];
1252                        let submitData = {
1253                            casl: formData.casl,
1254                            due_date: formData.due_date.value,
1255                            email_address:formData.email_address.value,
1256                            r:formData.r.value,
1257                            signup_agree:formData.signup_agree.value,
1258                        };
1259                        var callback = function(data) {
1260                            let wrapper = form.querySelector( '.form-wrapper' );
1261                            if(data && data.et_error == 0) {
1262                                wrapper.innerHTML = "Thank you for subscribing to our newsletter.";
1263                            } else {
1264                                wrapper.innerHTML = "There was an error with subscribing you to the newsletter. Please try again later.";
1265                            }
1266                        }
1267
1268                        jQuery.ajax("/newsletters_new/add",{
1269                            method: "POST",
1270                            data:submitData,
1271                            dataType:"json"
1272                        })
1273                        .then(function(data){
1274                            callback(data);
1275                        });
1276                    }
1277
1278                    if(e.preventDefault) e.preventDefault();
1279                    return false;
1280                },
1281                true
1282            );
1283        },
1284
1285		registerSignup: function ( form ) {
1286			var field = form.querySelector( '.sign-up' );
1287			if ( field ) {
1288				field.addEventListener(
1289					'click',
1290					function () {
1291                        var data = Page.newsletter.forms[form.idx];
1292                        for(var idx = 0; idx < form.length; idx++) {
1293                            if(form[idx].name) {
1294                                data[form[idx].name] = {
1295                                    value: form[idx].value,
1296                                    element: form[idx]
1297                                };
1298                            }
1299                        }
1300                        data.casl = true;
1301                        Page.newsletter.forms[form.idx] = data;
1302
1303
1304						var me = Page.newsletter;
1305
1306						// hide anchor, show checkbox
1307						me.activate ( form, 'signupAnchor', false, false );
1308						me.activate ( form, 'signupAgree', true, false );
1309					},
1310					false
1311				);
1312			}
1313
1314		},
1315
1316
1317		registerSubmit: function ( form ) {
1318
1319			var list = form.querySelectorAll( '.subscribe .submit' );
1320			//var list = form.querySelectorAll( '.form-button .submit' );
1321			for ( var i = 0; i < list.length; i++ ) {
1322				var input = list[i];
1323				input.addEventListener (
1324					'click',
1325					function (e) {
1326						var list = form.querySelectorAll( 'input:required' );
1327						for ( var i = 0; i < list.length; i++ ) {
1328							var input = list[i];
1329							input.classList.add( 'required' );
1330						}
1331                        if(Page.log) Page.log( form );
1332                        //return sde.validateNewsletterForm();
1333					},
1334					true
1335				);
1336			}
1337
1338		},
1339
1340
1341		/**
1342		 *
1343		 *	listeners:
1344		 *		invalid		fires invalid event on any field(s) from this form
1345		 *		keyup		unused, an alt to blur that fires per char as opposed to leaving the field (blur)
1346		 *		blur		used, validates when leaving a field
1347		 *
1348		 **/
1349		registerInvalidForm: function ( form ) {
1350
1351			form.addEventListener( 'invalid', Page.newsletter.invalidListener, true );
1352				//input.addEventListener( 'keyup', Page.newsletter_main.blurListener, true );
1353			form.addEventListener(
1354				'blur',
1355				function ( event ) {
1356					var target = Page.util.events.getTarget( event );
1357					var isValid = target.checkValidity();
1358					// if(Page.log) Page.log( 'blur event: ' + target.name );
1359					// if(Page.log) Page.log( 'valid: ' + isValid );
1360					if ( isValid ) {
1361						Page.newsletter.activate ( form, target.name, false, true );
1362					}
1363				},
1364				true
1365			);
1366		},
1367
1368		registerCheckbox: function ( form ) {
1369
1370			var selector = Page.newsletter.selector[ 'signup' ];
1371			var field = form.querySelector( selector );
1372
1373			if ( field ) {
1374
1375				field.addEventListener (
1376					'change',
1377					function ( event ) {
1378
1379						var target = Page.util.events.getTarget( event );
1380						var isValid;
1381						var wrapper = target.parentNode;
1382
1383
1384						isValid = target.checkValidity();
1385						if(Page.log) Page.log( 'checkClicked: ' + target.name );
1386						if(Page.log) Page.log( 'valid: ' + isValid );
1387
1388						if ( target.checked ) {
1389							target.setCustomValidity( '' );
1390							wrapper.classList.remove( 'required' );
1391						}
1392						else {
1393							target.setCustomValidity( 'Please check to subscribe' );
1394							wrapper.classList.add( 'required' );
1395						}
1396
1397						isValid = target.checkValidity();
1398						if ( isValid ) {
1399							Page.newsletter.activate ( form, target.name, false, true );
1400						}
1401
1402						if(Page.log) Page.log( 'checkClicked: ' + target.name );
1403						if(Page.log) Page.log( 'valid: ' + isValid );
1404
1405					},
1406					true
1407				);
1408
1409			}
1410
1411		},
1412
1413		registerFocus: function( form ) {
1414
1415			var list = form.querySelectorAll( 'input' );
1416			var input;
1417
1418			for ( var i = 0; i < list.length; i++ ) {
1419
1420				input = list[i];
1421
1422				input.addEventListener(
1423					'focus',
1424					function ( event ) {
1425						var target = Page.util.events.getTarget( event );
1426						target.setCustomValidity( '' );
1427						if(Page.log) Page.log( 'cleared validation message for ' + target.name );
1428					},
1429					true
1430				);
1431
1432				input.addEventListener(
1433					'blur',
1434					function ( event ) {
1435						var target = Page.util.events.getTarget( event );
1436						target.setCustomValidity('');
1437						if(Page.log) Page.log( 'cleared validation message for ' + target.name );
1438					},
1439					true
1440				);
1441
1442			}
1443
1444		}
1445
1446
1447	},
1448
1449	activate: function ( form, key, doActivate, hasMany ) {
1450
1451		if(Page.log) Page.log('activate key: ' + key);
1452		var list;
1453
1454		if ( hasMany ) list = form.querySelectorAll( this.selector[key] );
1455		else {
1456			selector = this.selector[ key ];
1457			field = form.querySelector( selector );
1458			if ( field ) { list = [ field ]; }
1459		}
1460
1461		if ( list ) {
1462			for ( var i = 0; i < list.length; i++ ) {
1463				if ( doActivate ) {
1464					list[i].classList.add( 'active' );
1465					if(Page.log) Page.log( 'showField('+ key +')' );
1466				}
1467				else {
1468					list[i].classList.remove( 'active' );
1469					if(Page.log) Page.log( 'hideField('+ key +')' );
1470				}
1471			}
1472		}
1473
1474	},
1475
1476	invalidListener: function ( event ) {
1477
1478		if(Page.log) Page.log('Page.newsletter.invalidListener()');
1479
1480		var target = Page.util.events.getTarget( event );
1481		var key = target.name;
1482		var msg = '';
1483
1484		if(Page.log) Page.log( key );
1485		if ( key === 'email_address' ) {
1486			//msg = 'Invalid email address. Please try again.';
1487      msg = '';
1488		}
1489		else if ( key === 'due_date' ) {
1490			msg = 'Please enter a date';
1491		}
1492		else if ( key === 'signup_agree' ) {
1493			msg = 'You must agree to subscribe.';
1494		}
1495		target.setCustomValidity( msg );
1496
1497		//var doActivate = true;
1498		//var hasMany = true;
1499		//Page.newsletter_main.activate ( key, doActivate, hasMany );
1500
1501    },
1502
1503    validate: function( form ) {
1504        let hasPassed = true;
1505        let formData = Page.newsletter.forms[form.idx];
1506        for(var idx = 0; idx < form.length; idx++) {
1507            if(form[idx].name) {
1508                formData[form[idx].name] = {
1509                    value: form[idx].value,
1510                    element: form[idx]
1511                };
1512            }
1513        }
1514        Page.newsletter.forms[form.idx] = formData;
1515        for(var prop in formData) {
1516            switch(prop) {
1517                case "email_address":
1518                    if(!Page.newsletter.validateEmail(formData[prop].value)) {
1519                        //Page.newsletter.addError(formData[prop].element,"Invalid email address. Please try again.","small",1);
1520                        Page.newsletter.addError(formData[prop].element,"","small",1);
1521                        hasPassed = false;
1522                    } else {
1523                        Page.newsletter.removeError(formData[prop].element);
1524                    }
1525                    break;
1526                case "signup_agree":
1527                    if(formData.casl && !formData[prop].element.checked) {
1528                        Page.newsletter.addError(formData[prop].element,"You must agree to subscribe.","p",2);
1529                        hasPassed = false;
1530                    } else if(formData.casl && formData[prop].element.checked) {
1531                        Page.newsletter.removeError(formData[prop].element);
1532                    }
1533            }
1534        }
1535
1536        console.log(hasPassed);
1537        return hasPassed;
1538
1539    },
1540
1541    validateEmail: function(email) {
1542        var re = /^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/;
1543        return re.test(String(email).toLowerCase());
1544    },
1545
1546    addError: function(element,message,domType,numParents) {
1547        let errorMessageClass = element.name + "_message";
1548        for(var prop in Page.newsletter.errorStyle) {
1549            element.style[prop] = Page.newsletter.errorStyle[prop];
1550        }
1551
1552        if(document.querySelectorAll("."+errorMessageClass).length == 0) {
1553            var dom = document.createElement(domType);
1554            dom.style['color'] = 'red';
1555            dom.style['margin-top'] = '0';
1556            dom.style['margin-bottom'] = '10px';
1557            dom.style['display'] = 'block';
1558            dom.className = errorMessageClass;
1559            dom.innerHTML = message;
1560            var insertElement = element;
1561            for(var i = 0; i < numParents; i++) {
1562                insertElement = insertElement.parentElement;
1563            }
1564            insertElement.appendChild(dom);
1565        }
1566    },
1567
1568    removeError: function(element) {
1569        let errorMessageClass = element.name + "_message";
1570        for(var prop in Page.newsletter.noErrorStyle) {
1571            element.style[prop] = Page.newsletter.noErrorStyle[prop];
1572        }
1573
1574        document.querySelectorAll("."+errorMessageClass).forEach(function(elem) {
1575            elem.remove();
1576        });
1577    },
1578
1579    errorStyle: {
1580        "border-color":"red"
1581    },
1582
1583    noErrorStyle: {
1584        "border-color":"#E7E7E7"
1585    }
1586};

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.