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.