<!doctype html>
<html lang="en">
<head>
    <!-- Required meta tags -->
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
    <meta name="description" content="Barakel is a year-round, Christ-centered camp in northeast Michigan that hosts nearly 10,000 guests each year.">
    <meta name="author" content="">
    <link rel="icon" href="https://www.lvalive.com/cf/19/images/favicon.png">
    <title>Camp Barakel | A Year-round Christian Camp in Northeast Michigan</title>

    <!-- OG code for social media cards -->
    <meta property="og:title" content="Camp Barakel" />
    <meta property="og:description" content="Barakel is a year-round, Christ-centered camp in northeast Michigan that hosts nearly 10,000 guests each year." />
    <meta property="og:type" content="website" />
    <meta property="og:image" content="https://www.campbarakel.org/19/images/img_about_blockhouse.jpg" />
	<meta name="twitter:creator" content="@CampBarakel" />
<style type='text/css'>/*!
 * Bootstrap v4.1.1 (https://getbootstrap.com/)
 * Copyright 2011-2018 The Bootstrap Authors
 * Copyright 2011-2018 Twitter, Inc.
 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
 */:root{--blue:#007bff;--indigo:#6610f2;--purple:#6f42c1;--pink:#e83e8c;--red:#dc3545;--orange:#fd7e14;--yellow:#ffc107;--green:#28a745;--teal:#20c997;--cyan:#17a2b8;--white:#fff;--gray:#6c757d;--gray-dark:#343a40;--primary:#007bff;--secondary:#6c757d;--success:#28a745;--info:#17a2b8;--warning:#ffc107;--danger:#dc3545;--light:#f8f9fa;--dark:#343a40;--breakpoint-xs:0;--breakpoint-sm:576px;--breakpoint-md:768px;--breakpoint-lg:992px;--breakpoint-xl:1200px;--font-family-sans-serif:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol";--font-family-monospace:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace}*,::after,::before{box-sizing:border-box}html{font-family:sans-serif;line-height:1.15;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%;-ms-overflow-style:scrollbar;-webkit-tap-highlight-color:transparent}@-ms-viewport{width:device-width}article,aside,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}body{margin:0;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol";font-size:1rem;font-weight:400;line-height:1.5;color:#212529;text-align:left;background-color:#fff}[tabindex="-1"]:focus{outline:0!important}hr{box-sizing:content-box;height:0;overflow:visible}h1,h2,h3,h4,h5,h6{margin-top:0;margin-bottom:.5rem}p{margin-top:0;margin-bottom:1rem}abbr[data-original-title],abbr[title]{text-decoration:underline;-webkit-text-decoration:underline dotted;text-decoration:underline dotted;cursor:help;border-bottom:0}address{margin-bottom:1rem;font-style:normal;line-height:inherit}dl,ol,ul{margin-top:0;margin-bottom:1rem}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}dt{font-weight:700}dd{margin-bottom:.5rem;margin-left:0}blockquote{margin:0 0 1rem}dfn{font-style:italic}b,strong{font-weight:bolder}small{font-size:80%}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}a{color:#007bff;text-decoration:none;background-color:transparent;-webkit-text-decoration-skip:objects}a:hover{color:#0056b3;text-decoration:underline}a:not([href]):not([tabindex]){color:inherit;text-decoration:none}a:not([href]):not([tabindex]):focus,a:not([href]):not([tabindex]):hover{color:inherit;text-decoration:none}a:not([href]):not([tabindex]):focus{outline:0}code,kbd,pre,samp{font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;font-size:1em}pre{margin-top:0;margin-bottom:1rem;overflow:auto;-ms-overflow-style:scrollbar}figure{margin:0 0 1rem}img{vertical-align:middle;border-style:none}svg:not(:root){overflow:hidden}table{border-collapse:collapse}caption{padding-top:.75rem;padding-bottom:.75rem;color:#6c757d;text-align:left;caption-side:bottom}th{text-align:inherit}label{display:inline-block;margin-bottom:.5rem}button{border-radius:0}button:focus{outline:1px dotted;outline:5px auto -webkit-focus-ring-color}button,input,optgroup,select,textarea{margin:0;font-family:inherit;font-size:inherit;line-height:inherit}button,input{overflow:visible}button,select{text-transform:none}[type=reset],[type=submit],button,html [type=button]{-webkit-appearance:button}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{padding:0;border-style:none}input[type=checkbox],input[type=radio]{box-sizing:border-box;padding:0}input[type=date],input[type=datetime-local],input[type=month],input[type=time]{-webkit-appearance:listbox}textarea{overflow:auto;resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}legend{display:block;width:100%;max-width:100%;padding:0;margin-bottom:.5rem;font-size:1.5rem;line-height:inherit;color:inherit;white-space:normal}progress{vertical-align:baseline}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{outline-offset:-2px;-webkit-appearance:none}[type=search]::-webkit-search-cancel-button,[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{font:inherit;-webkit-appearance:button}output{display:inline-block}summary{display:list-item;cursor:pointer}template{display:none}[hidden]{display:none!important}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{margin-bottom:.5rem;font-family:inherit;font-weight:500;line-height:1.2;color:inherit}.h1,h1{font-size:2.5rem}.h2,h2{font-size:2rem}.h3,h3{font-size:1.75rem}.h4,h4{font-size:1.5rem}.h5,h5{font-size:1.25rem}.h6,h6{font-size:1rem}.lead{font-size:1.25rem;font-weight:300}.display-1{font-size:6rem;font-weight:300;line-height:1.2}.display-2{font-size:5.5rem;font-weight:300;line-height:1.2}.display-3{font-size:4.5rem;font-weight:300;line-height:1.2}.display-4{font-size:3.5rem;font-weight:300;line-height:1.2}hr{margin-top:1rem;margin-bottom:1rem;border:0;border-top:1px solid rgba(0,0,0,.1)}.small,small{font-size:80%;font-weight:400}.mark,mark{padding:.2em;background-color:#fcf8e3}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;list-style:none}.list-inline-item{display:inline-block}.list-inline-item:not(:last-child){margin-right:.5rem}.initialism{font-size:90%;text-transform:uppercase}.blockquote{margin-bottom:1rem;font-size:1.25rem}.blockquote-footer{display:block;font-size:80%;color:#6c757d}.blockquote-footer::before{content:"\2014 \00A0"}.img-fluid{max-width:100%;height:auto}.img-thumbnail{padding:.25rem;background-color:#fff;border:1px solid #dee2e6;border-radius:.25rem;max-width:100%;height:auto}.figure{display:inline-block}.figure-img{margin-bottom:.5rem;line-height:1}.figure-caption{font-size:90%;color:#6c757d}code{font-size:87.5%;color:#e83e8c;word-break:break-word}a>code{color:inherit}kbd{padding:.2rem .4rem;font-size:87.5%;color:#fff;background-color:#212529;border-radius:.2rem}kbd kbd{padding:0;font-size:100%;font-weight:700}pre{display:block;font-size:87.5%;color:#212529}pre code{font-size:inherit;color:inherit;word-break:normal}.pre-scrollable{max-height:340px;overflow-y:scroll}.container{width:100%;padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}@media (min-width:576px){.container{max-width:540px}}@media (min-width:768px){.container{max-width:720px}}@media (min-width:992px){.container{max-width:960px}}@media (min-width:1200px){.container{max-width:1140px}}.container-fluid{width:100%;padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}.row{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-right:-15px;margin-left:-15px}.no-gutters{margin-right:0;margin-left:0}.no-gutters>.col,.no-gutters>[class*=col-]{padding-right:0;padding-left:0}.col,.col-1,.col-10,.col-11,.col-12,.col-2,.col-3,.col-4,.col-5,.col-6,.col-7,.col-8,.col-9,.col-auto,.col-lg,.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-lg-auto,.col-md,.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-md-auto,.col-sm,.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-sm-auto,.col-xl,.col-xl-1,.col-xl-10,.col-xl-11,.col-xl-12,.col-xl-2,.col-xl-3,.col-xl-4,.col-xl-5,.col-xl-6,.col-xl-7,.col-xl-8,.col-xl-9,.col-xl-auto{position:relative;width:100%;min-height:1px;padding-right:15px;padding-left:15px}.col{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:none}.col-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-first{-ms-flex-order:-1;order:-1}.order-last{-ms-flex-order:13;order:13}.order-0{-ms-flex-order:0;order:0}.order-1{-ms-flex-order:1;order:1}.order-2{-ms-flex-order:2;order:2}.order-3{-ms-flex-order:3;order:3}.order-4{-ms-flex-order:4;order:4}.order-5{-ms-flex-order:5;order:5}.order-6{-ms-flex-order:6;order:6}.order-7{-ms-flex-order:7;order:7}.order-8{-ms-flex-order:8;order:8}.order-9{-ms-flex-order:9;order:9}.order-10{-ms-flex-order:10;order:10}.order-11{-ms-flex-order:11;order:11}.order-12{-ms-flex-order:12;order:12}.offset-1{margin-left:8.333333%}.offset-2{margin-left:16.666667%}.offset-3{margin-left:25%}.offset-4{margin-left:33.333333%}.offset-5{margin-left:41.666667%}.offset-6{margin-left:50%}.offset-7{margin-left:58.333333%}.offset-8{margin-left:66.666667%}.offset-9{margin-left:75%}.offset-10{margin-left:83.333333%}.offset-11{margin-left:91.666667%}@media (min-width:576px){.col-sm{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-sm-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:none}.col-sm-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-sm-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-sm-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-sm-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-sm-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-sm-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-sm-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-sm-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-sm-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-sm-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-sm-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-sm-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-sm-first{-ms-flex-order:-1;order:-1}.order-sm-last{-ms-flex-order:13;order:13}.order-sm-0{-ms-flex-order:0;order:0}.order-sm-1{-ms-flex-order:1;order:1}.order-sm-2{-ms-flex-order:2;order:2}.order-sm-3{-ms-flex-order:3;order:3}.order-sm-4{-ms-flex-order:4;order:4}.order-sm-5{-ms-flex-order:5;order:5}.order-sm-6{-ms-flex-order:6;order:6}.order-sm-7{-ms-flex-order:7;order:7}.order-sm-8{-ms-flex-order:8;order:8}.order-sm-9{-ms-flex-order:9;order:9}.order-sm-10{-ms-flex-order:10;order:10}.order-sm-11{-ms-flex-order:11;order:11}.order-sm-12{-ms-flex-order:12;order:12}.offset-sm-0{margin-left:0}.offset-sm-1{margin-left:8.333333%}.offset-sm-2{margin-left:16.666667%}.offset-sm-3{margin-left:25%}.offset-sm-4{margin-left:33.333333%}.offset-sm-5{margin-left:41.666667%}.offset-sm-6{margin-left:50%}.offset-sm-7{margin-left:58.333333%}.offset-sm-8{margin-left:66.666667%}.offset-sm-9{margin-left:75%}.offset-sm-10{margin-left:83.333333%}.offset-sm-11{margin-left:91.666667%}}@media (min-width:768px){.col-md{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-md-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:none}.col-md-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-md-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-md-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-md-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-md-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-md-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-md-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-md-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-md-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-md-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-md-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-md-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-md-first{-ms-flex-order:-1;order:-1}.order-md-last{-ms-flex-order:13;order:13}.order-md-0{-ms-flex-order:0;order:0}.order-md-1{-ms-flex-order:1;order:1}.order-md-2{-ms-flex-order:2;order:2}.order-md-3{-ms-flex-order:3;order:3}.order-md-4{-ms-flex-order:4;order:4}.order-md-5{-ms-flex-order:5;order:5}.order-md-6{-ms-flex-order:6;order:6}.order-md-7{-ms-flex-order:7;order:7}.order-md-8{-ms-flex-order:8;order:8}.order-md-9{-ms-flex-order:9;order:9}.order-md-10{-ms-flex-order:10;order:10}.order-md-11{-ms-flex-order:11;order:11}.order-md-12{-ms-flex-order:12;order:12}.offset-md-0{margin-left:0}.offset-md-1{margin-left:8.333333%}.offset-md-2{margin-left:16.666667%}.offset-md-3{margin-left:25%}.offset-md-4{margin-left:33.333333%}.offset-md-5{margin-left:41.666667%}.offset-md-6{margin-left:50%}.offset-md-7{margin-left:58.333333%}.offset-md-8{margin-left:66.666667%}.offset-md-9{margin-left:75%}.offset-md-10{margin-left:83.333333%}.offset-md-11{margin-left:91.666667%}}@media (min-width:992px){.col-lg{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-lg-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:none}.col-lg-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-lg-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-lg-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-lg-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-lg-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-lg-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-lg-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-lg-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-lg-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-lg-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-lg-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-lg-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-lg-first{-ms-flex-order:-1;order:-1}.order-lg-last{-ms-flex-order:13;order:13}.order-lg-0{-ms-flex-order:0;order:0}.order-lg-1{-ms-flex-order:1;order:1}.order-lg-2{-ms-flex-order:2;order:2}.order-lg-3{-ms-flex-order:3;order:3}.order-lg-4{-ms-flex-order:4;order:4}.order-lg-5{-ms-flex-order:5;order:5}.order-lg-6{-ms-flex-order:6;order:6}.order-lg-7{-ms-flex-order:7;order:7}.order-lg-8{-ms-flex-order:8;order:8}.order-lg-9{-ms-flex-order:9;order:9}.order-lg-10{-ms-flex-order:10;order:10}.order-lg-11{-ms-flex-order:11;order:11}.order-lg-12{-ms-flex-order:12;order:12}.offset-lg-0{margin-left:0}.offset-lg-1{margin-left:8.333333%}.offset-lg-2{margin-left:16.666667%}.offset-lg-3{margin-left:25%}.offset-lg-4{margin-left:33.333333%}.offset-lg-5{margin-left:41.666667%}.offset-lg-6{margin-left:50%}.offset-lg-7{margin-left:58.333333%}.offset-lg-8{margin-left:66.666667%}.offset-lg-9{margin-left:75%}.offset-lg-10{margin-left:83.333333%}.offset-lg-11{margin-left:91.666667%}}@media (min-width:1200px){.col-xl{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-xl-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:none}.col-xl-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-xl-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-xl-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-xl-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-xl-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-xl-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-xl-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-xl-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-xl-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-xl-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-xl-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-xl-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-xl-first{-ms-flex-order:-1;order:-1}.order-xl-last{-ms-flex-order:13;order:13}.order-xl-0{-ms-flex-order:0;order:0}.order-xl-1{-ms-flex-order:1;order:1}.order-xl-2{-ms-flex-order:2;order:2}.order-xl-3{-ms-flex-order:3;order:3}.order-xl-4{-ms-flex-order:4;order:4}.order-xl-5{-ms-flex-order:5;order:5}.order-xl-6{-ms-flex-order:6;order:6}.order-xl-7{-ms-flex-order:7;order:7}.order-xl-8{-ms-flex-order:8;order:8}.order-xl-9{-ms-flex-order:9;order:9}.order-xl-10{-ms-flex-order:10;order:10}.order-xl-11{-ms-flex-order:11;order:11}.order-xl-12{-ms-flex-order:12;order:12}.offset-xl-0{margin-left:0}.offset-xl-1{margin-left:8.333333%}.offset-xl-2{margin-left:16.666667%}.offset-xl-3{margin-left:25%}.offset-xl-4{margin-left:33.333333%}.offset-xl-5{margin-left:41.666667%}.offset-xl-6{margin-left:50%}.offset-xl-7{margin-left:58.333333%}.offset-xl-8{margin-left:66.666667%}.offset-xl-9{margin-left:75%}.offset-xl-10{margin-left:83.333333%}.offset-xl-11{margin-left:91.666667%}}.table{width:100%;max-width:100%;margin-bottom:1rem;background-color:transparent}.table td,.table th{padding:.75rem;vertical-align:top;border-top:1px solid #dee2e6}.table thead th{vertical-align:bottom;border-bottom:2px solid #dee2e6}.table tbody+tbody{border-top:2px solid #dee2e6}.table .table{background-color:#fff}.table-sm td,.table-sm th{padding:.3rem}.table-bordered{border:1px solid #dee2e6}.table-bordered td,.table-bordered th{border:1px solid #dee2e6}.table-bordered thead td,.table-bordered thead th{border-bottom-width:2px}.table-borderless tbody+tbody,.table-borderless td,.table-borderless th,.table-borderless thead th{border:0}.table-striped tbody tr:nth-of-type(odd){background-color:rgba(0,0,0,.05)}.table-hover tbody tr:hover{background-color:rgba(0,0,0,.075)}.table-primary,.table-primary>td,.table-primary>th{background-color:#b8daff}.table-hover .table-primary:hover{background-color:#9fcdff}.table-hover .table-primary:hover>td,.table-hover .table-primary:hover>th{background-color:#9fcdff}.table-secondary,.table-secondary>td,.table-secondary>th{background-color:#d6d8db}.table-hover .table-secondary:hover{background-color:#c8cbcf}.table-hover .table-secondary:hover>td,.table-hover .table-secondary:hover>th{background-color:#c8cbcf}.table-success,.table-success>td,.table-success>th{background-color:#c3e6cb}.table-hover .table-success:hover{background-color:#b1dfbb}.table-hover .table-success:hover>td,.table-hover .table-success:hover>th{background-color:#b1dfbb}.table-info,.table-info>td,.table-info>th{background-color:#bee5eb}.table-hover .table-info:hover{background-color:#abdde5}.table-hover .table-info:hover>td,.table-hover .table-info:hover>th{background-color:#abdde5}.table-warning,.table-warning>td,.table-warning>th{background-color:#ffeeba}.table-hover .table-warning:hover{background-color:#ffe8a1}.table-hover .table-warning:hover>td,.table-hover .table-warning:hover>th{background-color:#ffe8a1}.table-danger,.table-danger>td,.table-danger>th{background-color:#f5c6cb}.table-hover .table-danger:hover{background-color:#f1b0b7}.table-hover .table-danger:hover>td,.table-hover .table-danger:hover>th{background-color:#f1b0b7}.table-light,.table-light>td,.table-light>th{background-color:#fdfdfe}.table-hover .table-light:hover{background-color:#ececf6}.table-hover .table-light:hover>td,.table-hover .table-light:hover>th{background-color:#ececf6}.table-dark,.table-dark>td,.table-dark>th{background-color:#c6c8ca}.table-hover .table-dark:hover{background-color:#b9bbbe}.table-hover .table-dark:hover>td,.table-hover .table-dark:hover>th{background-color:#b9bbbe}.table-active,.table-active>td,.table-active>th{background-color:rgba(0,0,0,.075)}.table-hover .table-active:hover{background-color:rgba(0,0,0,.075)}.table-hover .table-active:hover>td,.table-hover .table-active:hover>th{background-color:rgba(0,0,0,.075)}.table .thead-dark th{color:#fff;background-color:#212529;border-color:#32383e}.table .thead-light th{color:#495057;background-color:#e9ecef;border-color:#dee2e6}.table-dark{color:#fff;background-color:#212529}.table-dark td,.table-dark th,.table-dark thead th{border-color:#32383e}.table-dark.table-bordered{border:0}.table-dark.table-striped tbody tr:nth-of-type(odd){background-color:rgba(255,255,255,.05)}.table-dark.table-hover tbody tr:hover{background-color:rgba(255,255,255,.075)}@media (max-width:575.98px){.table-responsive-sm{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar}.table-responsive-sm>.table-bordered{border:0}}@media (max-width:767.98px){.table-responsive-md{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar}.table-responsive-md>.table-bordered{border:0}}@media (max-width:991.98px){.table-responsive-lg{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar}.table-responsive-lg>.table-bordered{border:0}}@media (max-width:1199.98px){.table-responsive-xl{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar}.table-responsive-xl>.table-bordered{border:0}}.table-responsive{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar}.table-responsive>.table-bordered{border:0}.form-control{display:block;width:100%;padding:.375rem .75rem;font-size:1rem;line-height:1.5;color:#495057;background-color:#fff;background-clip:padding-box;border:1px solid #ced4da;border-radius:.25rem;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media screen and (prefers-reduced-motion:reduce){.form-control{transition:none}}.form-control::-ms-expand{background-color:transparent;border:0}.form-control:focus{color:#495057;background-color:#fff;border-color:#80bdff;outline:0;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.form-control::-webkit-input-placeholder{color:#6c757d;opacity:1}.form-control::-moz-placeholder{color:#6c757d;opacity:1}.form-control:-ms-input-placeholder{color:#6c757d;opacity:1}.form-control::-ms-input-placeholder{color:#6c757d;opacity:1}.form-control::placeholder{color:#6c757d;opacity:1}.form-control:disabled,.form-control[readonly]{background-color:#e9ecef;opacity:1}select.form-control:not([size]):not([multiple]){height:calc(2.25rem + 2px)}select.form-control:focus::-ms-value{color:#495057;background-color:#fff}.form-control-file,.form-control-range{display:block;width:100%}.col-form-label{padding-top:calc(.375rem + 1px);padding-bottom:calc(.375rem + 1px);margin-bottom:0;font-size:inherit;line-height:1.5}.col-form-label-lg{padding-top:calc(.5rem + 1px);padding-bottom:calc(.5rem + 1px);font-size:1.25rem;line-height:1.5}.col-form-label-sm{padding-top:calc(.25rem + 1px);padding-bottom:calc(.25rem + 1px);font-size:.875rem;line-height:1.5}.form-control-plaintext{display:block;width:100%;padding-top:.375rem;padding-bottom:.375rem;margin-bottom:0;line-height:1.5;color:#212529;background-color:transparent;border:solid transparent;border-width:1px 0}.form-control-plaintext.form-control-lg,.form-control-plaintext.form-control-sm,.input-group-lg>.form-control-plaintext.form-control,.input-group-lg>.input-group-append>.form-control-plaintext.btn,.input-group-lg>.input-group-append>.form-control-plaintext.input-group-text,.input-group-lg>.input-group-prepend>.form-control-plaintext.btn,.input-group-lg>.input-group-prepend>.form-control-plaintext.input-group-text,.input-group-sm>.form-control-plaintext.form-control,.input-group-sm>.input-group-append>.form-control-plaintext.btn,.input-group-sm>.input-group-append>.form-control-plaintext.input-group-text,.input-group-sm>.input-group-prepend>.form-control-plaintext.btn,.input-group-sm>.input-group-prepend>.form-control-plaintext.input-group-text{padding-right:0;padding-left:0}.form-control-sm,.input-group-sm>.form-control,.input-group-sm>.input-group-append>.btn,.input-group-sm>.input-group-append>.input-group-text,.input-group-sm>.input-group-prepend>.btn,.input-group-sm>.input-group-prepend>.input-group-text{padding:.25rem .5rem;font-size:.875rem;line-height:1.5;border-radius:.2rem}.input-group-sm>.input-group-append>select.btn:not([size]):not([multiple]),.input-group-sm>.input-group-append>select.input-group-text:not([size]):not([multiple]),.input-group-sm>.input-group-prepend>select.btn:not([size]):not([multiple]),.input-group-sm>.input-group-prepend>select.input-group-text:not([size]):not([multiple]),.input-group-sm>select.form-control:not([size]):not([multiple]),select.form-control-sm:not([size]):not([multiple]){height:calc(1.8125rem + 2px)}.form-control-lg,.input-group-lg>.form-control,.input-group-lg>.input-group-append>.btn,.input-group-lg>.input-group-append>.input-group-text,.input-group-lg>.input-group-prepend>.btn,.input-group-lg>.input-group-prepend>.input-group-text{padding:.5rem 1rem;font-size:1.25rem;line-height:1.5;border-radius:.3rem}.input-group-lg>.input-group-append>select.btn:not([size]):not([multiple]),.input-group-lg>.input-group-append>select.input-group-text:not([size]):not([multiple]),.input-group-lg>.input-group-prepend>select.btn:not([size]):not([multiple]),.input-group-lg>.input-group-prepend>select.input-group-text:not([size]):not([multiple]),.input-group-lg>select.form-control:not([size]):not([multiple]),select.form-control-lg:not([size]):not([multiple]){height:calc(2.875rem + 2px)}.form-group{margin-bottom:1rem}.form-text{display:block;margin-top:.25rem}.form-row{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-right:-5px;margin-left:-5px}.form-row>.col,.form-row>[class*=col-]{padding-right:5px;padding-left:5px}.form-check{position:relative;display:block;padding-left:1.25rem}.form-check-input{position:absolute;margin-top:.3rem;margin-left:-1.25rem}.form-check-input:disabled~.form-check-label{color:#6c757d}.form-check-label{margin-bottom:0}.form-check-inline{display:-ms-inline-flexbox;display:inline-flex;-ms-flex-align:center;align-items:center;padding-left:0;margin-right:.75rem}.form-check-inline .form-check-input{position:static;margin-top:0;margin-right:.3125rem;margin-left:0}.valid-feedback{display:none;width:100%;margin-top:.25rem;font-size:80%;color:#28a745}.valid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.5rem;margin-top:.1rem;font-size:.875rem;line-height:1;color:#fff;background-color:rgba(40,167,69,.8);border-radius:.2rem}.custom-select.is-valid,.form-control.is-valid,.was-validated .custom-select:valid,.was-validated .form-control:valid{border-color:#28a745}.custom-select.is-valid:focus,.form-control.is-valid:focus,.was-validated .custom-select:valid:focus,.was-validated .form-control:valid:focus{border-color:#28a745;box-shadow:0 0 0 .2rem rgba(40,167,69,.25)}.custom-select.is-valid~.valid-feedback,.custom-select.is-valid~.valid-tooltip,.form-control.is-valid~.valid-feedback,.form-control.is-valid~.valid-tooltip,.was-validated .custom-select:valid~.valid-feedback,.was-validated .custom-select:valid~.valid-tooltip,.was-validated .form-control:valid~.valid-feedback,.was-validated .form-control:valid~.valid-tooltip{display:block}.form-control-file.is-valid~.valid-feedback,.form-control-file.is-valid~.valid-tooltip,.was-validated .form-control-file:valid~.valid-feedback,.was-validated .form-control-file:valid~.valid-tooltip{display:block}.form-check-input.is-valid~.form-check-label,.was-validated .form-check-input:valid~.form-check-label{color:#28a745}.form-check-input.is-valid~.valid-feedback,.form-check-input.is-valid~.valid-tooltip,.was-validated .form-check-input:valid~.valid-feedback,.was-validated .form-check-input:valid~.valid-tooltip{display:block}.custom-control-input.is-valid~.custom-control-label,.was-validated .custom-control-input:valid~.custom-control-label{color:#28a745}.custom-control-input.is-valid~.custom-control-label::before,.was-validated .custom-control-input:valid~.custom-control-label::before{background-color:#71dd8a}.custom-control-input.is-valid~.valid-feedback,.custom-control-input.is-valid~.valid-tooltip,.was-validated .custom-control-input:valid~.valid-feedback,.was-validated .custom-control-input:valid~.valid-tooltip{display:block}.custom-control-input.is-valid:checked~.custom-control-label::before,.was-validated .custom-control-input:valid:checked~.custom-control-label::before{background-color:#34ce57}.custom-control-input.is-valid:focus~.custom-control-label::before,.was-validated .custom-control-input:valid:focus~.custom-control-label::before{box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(40,167,69,.25)}.custom-file-input.is-valid~.custom-file-label,.was-validated .custom-file-input:valid~.custom-file-label{border-color:#28a745}.custom-file-input.is-valid~.custom-file-label::before,.was-validated .custom-file-input:valid~.custom-file-label::before{border-color:inherit}.custom-file-input.is-valid~.valid-feedback,.custom-file-input.is-valid~.valid-tooltip,.was-validated .custom-file-input:valid~.valid-feedback,.was-validated .custom-file-input:valid~.valid-tooltip{display:block}.custom-file-input.is-valid:focus~.custom-file-label,.was-validated .custom-file-input:valid:focus~.custom-file-label{box-shadow:0 0 0 .2rem rgba(40,167,69,.25)}.invalid-feedback{display:none;width:100%;margin-top:.25rem;font-size:80%;color:#dc3545}.invalid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.5rem;margin-top:.1rem;font-size:.875rem;line-height:1;color:#fff;background-color:rgba(220,53,69,.8);border-radius:.2rem}.custom-select.is-invalid,.form-control.is-invalid,.was-validated .custom-select:invalid,.was-validated .form-control:invalid{border-color:#dc3545}.custom-select.is-invalid:focus,.form-control.is-invalid:focus,.was-validated .custom-select:invalid:focus,.was-validated .form-control:invalid:focus{border-color:#dc3545;box-shadow:0 0 0 .2rem rgba(220,53,69,.25)}.custom-select.is-invalid~.invalid-feedback,.custom-select.is-invalid~.invalid-tooltip,.form-control.is-invalid~.invalid-feedback,.form-control.is-invalid~.invalid-tooltip,.was-validated .custom-select:invalid~.invalid-feedback,.was-validated .custom-select:invalid~.invalid-tooltip,.was-validated .form-control:invalid~.invalid-feedback,.was-validated .form-control:invalid~.invalid-tooltip{display:block}.form-control-file.is-invalid~.invalid-feedback,.form-control-file.is-invalid~.invalid-tooltip,.was-validated .form-control-file:invalid~.invalid-feedback,.was-validated .form-control-file:invalid~.invalid-tooltip{display:block}.form-check-input.is-invalid~.form-check-label,.was-validated .form-check-input:invalid~.form-check-label{color:#dc3545}.form-check-input.is-invalid~.invalid-feedback,.form-check-input.is-invalid~.invalid-tooltip,.was-validated .form-check-input:invalid~.invalid-feedback,.was-validated .form-check-input:invalid~.invalid-tooltip{display:block}.custom-control-input.is-invalid~.custom-control-label,.was-validated .custom-control-input:invalid~.custom-control-label{color:#dc3545}.custom-control-input.is-invalid~.custom-control-label::before,.was-validated .custom-control-input:invalid~.custom-control-label::before{background-color:#efa2a9}.custom-control-input.is-invalid~.invalid-feedback,.custom-control-input.is-invalid~.invalid-tooltip,.was-validated .custom-control-input:invalid~.invalid-feedback,.was-validated .custom-control-input:invalid~.invalid-tooltip{display:block}.custom-control-input.is-invalid:checked~.custom-control-label::before,.was-validated .custom-control-input:invalid:checked~.custom-control-label::before{background-color:#e4606d}.custom-control-input.is-invalid:focus~.custom-control-label::before,.was-validated .custom-control-input:invalid:focus~.custom-control-label::before{box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(220,53,69,.25)}.custom-file-input.is-invalid~.custom-file-label,.was-validated .custom-file-input:invalid~.custom-file-label{border-color:#dc3545}.custom-file-input.is-invalid~.custom-file-label::before,.was-validated .custom-file-input:invalid~.custom-file-label::before{border-color:inherit}.custom-file-input.is-invalid~.invalid-feedback,.custom-file-input.is-invalid~.invalid-tooltip,.was-validated .custom-file-input:invalid~.invalid-feedback,.was-validated .custom-file-input:invalid~.invalid-tooltip{display:block}.custom-file-input.is-invalid:focus~.custom-file-label,.was-validated .custom-file-input:invalid:focus~.custom-file-label{box-shadow:0 0 0 .2rem rgba(220,53,69,.25)}.form-inline{display:-ms-flexbox;display:flex;-ms-flex-flow:row wrap;flex-flow:row wrap;-ms-flex-align:center;align-items:center}.form-inline .form-check{width:100%}@media (min-width:576px){.form-inline label{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;margin-bottom:0}.form-inline .form-group{display:-ms-flexbox;display:flex;-ms-flex:0 0 auto;flex:0 0 auto;-ms-flex-flow:row wrap;flex-flow:row wrap;-ms-flex-align:center;align-items:center;margin-bottom:0}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .form-control-plaintext{display:inline-block}.form-inline .custom-select,.form-inline .input-group{width:auto}.form-inline .form-check{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;width:auto;padding-left:0}.form-inline .form-check-input{position:relative;margin-top:0;margin-right:.25rem;margin-left:0}.form-inline .custom-control{-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center}.form-inline .custom-control-label{margin-bottom:0}}.btn{display:inline-block;font-weight:400;text-align:center;white-space:nowrap;vertical-align:middle;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;border:1px solid transparent;padding:.375rem .75rem;font-size:1rem;line-height:1.5;border-radius:.25rem;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media screen and (prefers-reduced-motion:reduce){.btn{transition:none}}.btn:focus,.btn:hover{text-decoration:none}.btn.focus,.btn:focus{outline:0;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.btn.disabled,.btn:disabled{opacity:.65}.btn:not(:disabled):not(.disabled){cursor:pointer}.btn:not(:disabled):not(.disabled).active,.btn:not(:disabled):not(.disabled):active{background-image:none}a.btn.disabled,fieldset:disabled a.btn{pointer-events:none}.btn-primary{color:#fff;background-color:#007bff;border-color:#007bff}.btn-primary:hover{color:#fff;background-color:#0069d9;border-color:#0062cc}.btn-primary.focus,.btn-primary:focus{box-shadow:0 0 0 .2rem rgba(0,123,255,.5)}.btn-primary.disabled,.btn-primary:disabled{color:#fff;background-color:#007bff;border-color:#007bff}.btn-primary:not(:disabled):not(.disabled).active,.btn-primary:not(:disabled):not(.disabled):active,.show>.btn-primary.dropdown-toggle{color:#fff;background-color:#0062cc;border-color:#005cbf}.btn-primary:not(:disabled):not(.disabled).active:focus,.btn-primary:not(:disabled):not(.disabled):active:focus,.show>.btn-primary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(0,123,255,.5)}.btn-secondary{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-secondary:hover{color:#fff;background-color:#5a6268;border-color:#545b62}.btn-secondary.focus,.btn-secondary:focus{box-shadow:0 0 0 .2rem rgba(108,117,125,.5)}.btn-secondary.disabled,.btn-secondary:disabled{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-secondary:not(:disabled):not(.disabled).active,.btn-secondary:not(:disabled):not(.disabled):active,.show>.btn-secondary.dropdown-toggle{color:#fff;background-color:#545b62;border-color:#4e555b}.btn-secondary:not(:disabled):not(.disabled).active:focus,.btn-secondary:not(:disabled):not(.disabled):active:focus,.show>.btn-secondary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(108,117,125,.5)}.btn-success{color:#fff;background-color:#28a745;border-color:#28a745}.btn-success:hover{color:#fff;background-color:#218838;border-color:#1e7e34}.btn-success.focus,.btn-success:focus{box-shadow:0 0 0 .2rem rgba(40,167,69,.5)}.btn-success.disabled,.btn-success:disabled{color:#fff;background-color:#28a745;border-color:#28a745}.btn-success:not(:disabled):not(.disabled).active,.btn-success:not(:disabled):not(.disabled):active,.show>.btn-success.dropdown-toggle{color:#fff;background-color:#1e7e34;border-color:#1c7430}.btn-success:not(:disabled):not(.disabled).active:focus,.btn-success:not(:disabled):not(.disabled):active:focus,.show>.btn-success.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(40,167,69,.5)}.btn-info{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-info:hover{color:#fff;background-color:#138496;border-color:#117a8b}.btn-info.focus,.btn-info:focus{box-shadow:0 0 0 .2rem rgba(23,162,184,.5)}.btn-info.disabled,.btn-info:disabled{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-info:not(:disabled):not(.disabled).active,.btn-info:not(:disabled):not(.disabled):active,.show>.btn-info.dropdown-toggle{color:#fff;background-color:#117a8b;border-color:#10707f}.btn-info:not(:disabled):not(.disabled).active:focus,.btn-info:not(:disabled):not(.disabled):active:focus,.show>.btn-info.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(23,162,184,.5)}.btn-warning{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-warning:hover{color:#212529;background-color:#e0a800;border-color:#d39e00}.btn-warning.focus,.btn-warning:focus{box-shadow:0 0 0 .2rem rgba(255,193,7,.5)}.btn-warning.disabled,.btn-warning:disabled{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-warning:not(:disabled):not(.disabled).active,.btn-warning:not(:disabled):not(.disabled):active,.show>.btn-warning.dropdown-toggle{color:#212529;background-color:#d39e00;border-color:#c69500}.btn-warning:not(:disabled):not(.disabled).active:focus,.btn-warning:not(:disabled):not(.disabled):active:focus,.show>.btn-warning.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(255,193,7,.5)}.btn-danger{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-danger:hover{color:#fff;background-color:#c82333;border-color:#bd2130}.btn-danger.focus,.btn-danger:focus{box-shadow:0 0 0 .2rem rgba(220,53,69,.5)}.btn-danger.disabled,.btn-danger:disabled{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-danger:not(:disabled):not(.disabled).active,.btn-danger:not(:disabled):not(.disabled):active,.show>.btn-danger.dropdown-toggle{color:#fff;background-color:#bd2130;border-color:#b21f2d}.btn-danger:not(:disabled):not(.disabled).active:focus,.btn-danger:not(:disabled):not(.disabled):active:focus,.show>.btn-danger.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(220,53,69,.5)}.btn-light{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-light:hover{color:#212529;background-color:#e2e6ea;border-color:#dae0e5}.btn-light.focus,.btn-light:focus{box-shadow:0 0 0 .2rem rgba(248,249,250,.5)}.btn-light.disabled,.btn-light:disabled{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-light:not(:disabled):not(.disabled).active,.btn-light:not(:disabled):not(.disabled):active,.show>.btn-light.dropdown-toggle{color:#212529;background-color:#dae0e5;border-color:#d3d9df}.btn-light:not(:disabled):not(.disabled).active:focus,.btn-light:not(:disabled):not(.disabled):active:focus,.show>.btn-light.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(248,249,250,.5)}.btn-dark{color:#fff;background-color:#343a40;border-color:#343a40}.btn-dark:hover{color:#fff;background-color:#23272b;border-color:#1d2124}.btn-dark.focus,.btn-dark:focus{box-shadow:0 0 0 .2rem rgba(52,58,64,.5)}.btn-dark.disabled,.btn-dark:disabled{color:#fff;background-color:#343a40;border-color:#343a40}.btn-dark:not(:disabled):not(.disabled).active,.btn-dark:not(:disabled):not(.disabled):active,.show>.btn-dark.dropdown-toggle{color:#fff;background-color:#1d2124;border-color:#171a1d}.btn-dark:not(:disabled):not(.disabled).active:focus,.btn-dark:not(:disabled):not(.disabled):active:focus,.show>.btn-dark.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(52,58,64,.5)}.btn-outline-primary{color:#007bff;background-color:transparent;background-image:none;border-color:#007bff}.btn-outline-primary:hover{color:#fff;background-color:#007bff;border-color:#007bff}.btn-outline-primary.focus,.btn-outline-primary:focus{box-shadow:0 0 0 .2rem rgba(0,123,255,.5)}.btn-outline-primary.disabled,.btn-outline-primary:disabled{color:#007bff;background-color:transparent}.btn-outline-primary:not(:disabled):not(.disabled).active,.btn-outline-primary:not(:disabled):not(.disabled):active,.show>.btn-outline-primary.dropdown-toggle{color:#fff;background-color:#007bff;border-color:#007bff}.btn-outline-primary:not(:disabled):not(.disabled).active:focus,.btn-outline-primary:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-primary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(0,123,255,.5)}.btn-outline-secondary{color:#6c757d;background-color:transparent;background-image:none;border-color:#6c757d}.btn-outline-secondary:hover{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-outline-secondary.focus,.btn-outline-secondary:focus{box-shadow:0 0 0 .2rem rgba(108,117,125,.5)}.btn-outline-secondary.disabled,.btn-outline-secondary:disabled{color:#6c757d;background-color:transparent}.btn-outline-secondary:not(:disabled):not(.disabled).active,.btn-outline-secondary:not(:disabled):not(.disabled):active,.show>.btn-outline-secondary.dropdown-toggle{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-outline-secondary:not(:disabled):not(.disabled).active:focus,.btn-outline-secondary:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-secondary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(108,117,125,.5)}.btn-outline-success{color:#28a745;background-color:transparent;background-image:none;border-color:#28a745}.btn-outline-success:hover{color:#fff;background-color:#28a745;border-color:#28a745}.btn-outline-success.focus,.btn-outline-success:focus{box-shadow:0 0 0 .2rem rgba(40,167,69,.5)}.btn-outline-success.disabled,.btn-outline-success:disabled{color:#28a745;background-color:transparent}.btn-outline-success:not(:disabled):not(.disabled).active,.btn-outline-success:not(:disabled):not(.disabled):active,.show>.btn-outline-success.dropdown-toggle{color:#fff;background-color:#28a745;border-color:#28a745}.btn-outline-success:not(:disabled):not(.disabled).active:focus,.btn-outline-success:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-success.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(40,167,69,.5)}.btn-outline-info{color:#17a2b8;background-color:transparent;background-image:none;border-color:#17a2b8}.btn-outline-info:hover{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-outline-info.focus,.btn-outline-info:focus{box-shadow:0 0 0 .2rem rgba(23,162,184,.5)}.btn-outline-info.disabled,.btn-outline-info:disabled{color:#17a2b8;background-color:transparent}.btn-outline-info:not(:disabled):not(.disabled).active,.btn-outline-info:not(:disabled):not(.disabled):active,.show>.btn-outline-info.dropdown-toggle{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-outline-info:not(:disabled):not(.disabled).active:focus,.btn-outline-info:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-info.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(23,162,184,.5)}.btn-outline-warning{color:#ffc107;background-color:transparent;background-image:none;border-color:#ffc107}.btn-outline-warning:hover{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-outline-warning.focus,.btn-outline-warning:focus{box-shadow:0 0 0 .2rem rgba(255,193,7,.5)}.btn-outline-warning.disabled,.btn-outline-warning:disabled{color:#ffc107;background-color:transparent}.btn-outline-warning:not(:disabled):not(.disabled).active,.btn-outline-warning:not(:disabled):not(.disabled):active,.show>.btn-outline-warning.dropdown-toggle{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-outline-warning:not(:disabled):not(.disabled).active:focus,.btn-outline-warning:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-warning.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(255,193,7,.5)}.btn-outline-danger{color:#dc3545;background-color:transparent;background-image:none;border-color:#dc3545}.btn-outline-danger:hover{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-outline-danger.focus,.btn-outline-danger:focus{box-shadow:0 0 0 .2rem rgba(220,53,69,.5)}.btn-outline-danger.disabled,.btn-outline-danger:disabled{color:#dc3545;background-color:transparent}.btn-outline-danger:not(:disabled):not(.disabled).active,.btn-outline-danger:not(:disabled):not(.disabled):active,.show>.btn-outline-danger.dropdown-toggle{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-outline-danger:not(:disabled):not(.disabled).active:focus,.btn-outline-danger:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-danger.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(220,53,69,.5)}.btn-outline-light{color:#f8f9fa;background-color:transparent;background-image:none;border-color:#f8f9fa}.btn-outline-light:hover{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-outline-light.focus,.btn-outline-light:focus{box-shadow:0 0 0 .2rem rgba(248,249,250,.5)}.btn-outline-light.disabled,.btn-outline-light:disabled{color:#f8f9fa;background-color:transparent}.btn-outline-light:not(:disabled):not(.disabled).active,.btn-outline-light:not(:disabled):not(.disabled):active,.show>.btn-outline-light.dropdown-toggle{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-outline-light:not(:disabled):not(.disabled).active:focus,.btn-outline-light:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-light.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(248,249,250,.5)}.btn-outline-dark{color:#343a40;background-color:transparent;background-image:none;border-color:#343a40}.btn-outline-dark:hover{color:#fff;background-color:#343a40;border-color:#343a40}.btn-outline-dark.focus,.btn-outline-dark:focus{box-shadow:0 0 0 .2rem rgba(52,58,64,.5)}.btn-outline-dark.disabled,.btn-outline-dark:disabled{color:#343a40;background-color:transparent}.btn-outline-dark:not(:disabled):not(.disabled).active,.btn-outline-dark:not(:disabled):not(.disabled):active,.show>.btn-outline-dark.dropdown-toggle{color:#fff;background-color:#343a40;border-color:#343a40}.btn-outline-dark:not(:disabled):not(.disabled).active:focus,.btn-outline-dark:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-dark.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(52,58,64,.5)}.btn-link{font-weight:400;color:#007bff;background-color:transparent}.btn-link:hover{color:#0056b3;text-decoration:underline;background-color:transparent;border-color:transparent}.btn-link.focus,.btn-link:focus{text-decoration:underline;border-color:transparent;box-shadow:none}.btn-link.disabled,.btn-link:disabled{color:#6c757d;pointer-events:none}.btn-group-lg>.btn,.btn-lg{padding:.5rem 1rem;font-size:1.25rem;line-height:1.5;border-radius:.3rem}.btn-group-sm>.btn,.btn-sm{padding:.25rem .5rem;font-size:.875rem;line-height:1.5;border-radius:.2rem}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:.5rem}input[type=button].btn-block,input[type=reset].btn-block,input[type=submit].btn-block{width:100%}.fade{transition:opacity .15s linear}@media screen and (prefers-reduced-motion:reduce){.fade{transition:none}}.fade:not(.show){opacity:0}.collapse:not(.show){display:none}.collapsing{position:relative;height:0;overflow:hidden;transition:height .35s ease}@media screen and (prefers-reduced-motion:reduce){.collapsing{transition:none}}.dropdown,.dropleft,.dropright,.dropup{position:relative}.dropdown-toggle::after{display:inline-block;width:0;height:0;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid;border-right:.3em solid transparent;border-bottom:0;border-left:.3em solid transparent}.dropdown-toggle:empty::after{margin-left:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:10rem;padding:.5rem 0;margin:.125rem 0 0;font-size:1rem;color:#212529;text-align:left;list-style:none;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.15);border-radius:.25rem}.dropdown-menu-right{right:0;left:auto}.dropup .dropdown-menu{top:auto;bottom:100%;margin-top:0;margin-bottom:.125rem}.dropup .dropdown-toggle::after{display:inline-block;width:0;height:0;margin-left:.255em;vertical-align:.255em;content:"";border-top:0;border-right:.3em solid transparent;border-bottom:.3em solid;border-left:.3em solid transparent}.dropup .dropdown-toggle:empty::after{margin-left:0}.dropright .dropdown-menu{top:0;right:auto;left:100%;margin-top:0;margin-left:.125rem}.dropright .dropdown-toggle::after{display:inline-block;width:0;height:0;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid transparent;border-right:0;border-bottom:.3em solid transparent;border-left:.3em solid}.dropright .dropdown-toggle:empty::after{margin-left:0}.dropright .dropdown-toggle::after{vertical-align:0}.dropleft .dropdown-menu{top:0;right:100%;left:auto;margin-top:0;margin-right:.125rem}.dropleft .dropdown-toggle::after{display:inline-block;width:0;height:0;margin-left:.255em;vertical-align:.255em;content:""}.dropleft .dropdown-toggle::after{display:none}.dropleft .dropdown-toggle::before{display:inline-block;width:0;height:0;margin-right:.255em;vertical-align:.255em;content:"";border-top:.3em solid transparent;border-right:.3em solid;border-bottom:.3em solid transparent}.dropleft .dropdown-toggle:empty::after{margin-left:0}.dropleft .dropdown-toggle::before{vertical-align:0}.dropdown-menu[x-placement^=bottom],.dropdown-menu[x-placement^=left],.dropdown-menu[x-placement^=right],.dropdown-menu[x-placement^=top]{right:auto;bottom:auto}.dropdown-divider{height:0;margin:.5rem 0;overflow:hidden;border-top:1px solid #e9ecef}.dropdown-item{display:block;width:100%;padding:.25rem 1.5rem;clear:both;font-weight:400;color:#212529;text-align:inherit;white-space:nowrap;background-color:transparent;border:0}.dropdown-item:focus,.dropdown-item:hover{color:#16181b;text-decoration:none;background-color:#f8f9fa}.dropdown-item.active,.dropdown-item:active{color:#fff;text-decoration:none;background-color:#007bff}.dropdown-item.disabled,.dropdown-item:disabled{color:#6c757d;background-color:transparent}.dropdown-menu.show{display:block}.dropdown-header{display:block;padding:.5rem 1.5rem;margin-bottom:0;font-size:.875rem;color:#6c757d;white-space:nowrap}.dropdown-item-text{display:block;padding:.25rem 1.5rem;color:#212529}.btn-group,.btn-group-vertical{position:relative;display:-ms-inline-flexbox;display:inline-flex;vertical-align:middle}.btn-group-vertical>.btn,.btn-group>.btn{position:relative;-ms-flex:0 1 auto;flex:0 1 auto}.btn-group-vertical>.btn:hover,.btn-group>.btn:hover{z-index:1}.btn-group-vertical>.btn.active,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn:focus,.btn-group>.btn.active,.btn-group>.btn:active,.btn-group>.btn:focus{z-index:1}.btn-group .btn+.btn,.btn-group .btn+.btn-group,.btn-group .btn-group+.btn,.btn-group .btn-group+.btn-group,.btn-group-vertical .btn+.btn,.btn-group-vertical .btn+.btn-group,.btn-group-vertical .btn-group+.btn,.btn-group-vertical .btn-group+.btn-group{margin-left:-1px}.btn-toolbar{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-pack:start;justify-content:flex-start}.btn-toolbar .input-group{width:auto}.btn-group>.btn:first-child{margin-left:0}.btn-group>.btn-group:not(:last-child)>.btn,.btn-group>.btn:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn-group:not(:first-child)>.btn,.btn-group>.btn:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.dropdown-toggle-split{padding-right:.5625rem;padding-left:.5625rem}.dropdown-toggle-split::after,.dropright .dropdown-toggle-split::after,.dropup .dropdown-toggle-split::after{margin-left:0}.dropleft .dropdown-toggle-split::before{margin-right:0}.btn-group-sm>.btn+.dropdown-toggle-split,.btn-sm+.dropdown-toggle-split{padding-right:.375rem;padding-left:.375rem}.btn-group-lg>.btn+.dropdown-toggle-split,.btn-lg+.dropdown-toggle-split{padding-right:.75rem;padding-left:.75rem}.btn-group-vertical{-ms-flex-direction:column;flex-direction:column;-ms-flex-align:start;align-items:flex-start;-ms-flex-pack:center;justify-content:center}.btn-group-vertical .btn,.btn-group-vertical .btn-group{width:100%}.btn-group-vertical>.btn+.btn,.btn-group-vertical>.btn+.btn-group,.btn-group-vertical>.btn-group+.btn,.btn-group-vertical>.btn-group+.btn-group{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn-group:not(:last-child)>.btn,.btn-group-vertical>.btn:not(:last-child):not(.dropdown-toggle){border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:not(:first-child)>.btn,.btn-group-vertical>.btn:not(:first-child){border-top-left-radius:0;border-top-right-radius:0}.btn-group-toggle>.btn,.btn-group-toggle>.btn-group>.btn{margin-bottom:0}.btn-group-toggle>.btn input[type=checkbox],.btn-group-toggle>.btn input[type=radio],.btn-group-toggle>.btn-group>.btn input[type=checkbox],.btn-group-toggle>.btn-group>.btn input[type=radio]{position:absolute;clip:rect(0,0,0,0);pointer-events:none}.input-group{position:relative;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-align:stretch;align-items:stretch;width:100%}.input-group>.custom-file,.input-group>.custom-select,.input-group>.form-control{position:relative;-ms-flex:1 1 auto;flex:1 1 auto;width:1%;margin-bottom:0}.input-group>.custom-file:focus,.input-group>.custom-select:focus,.input-group>.form-control:focus{z-index:3}.input-group>.custom-file+.custom-file,.input-group>.custom-file+.custom-select,.input-group>.custom-file+.form-control,.input-group>.custom-select+.custom-file,.input-group>.custom-select+.custom-select,.input-group>.custom-select+.form-control,.input-group>.form-control+.custom-file,.input-group>.form-control+.custom-select,.input-group>.form-control+.form-control{margin-left:-1px}.input-group>.custom-select:not(:last-child),.input-group>.form-control:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}.input-group>.custom-select:not(:first-child),.input-group>.form-control:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.input-group>.custom-file{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center}.input-group>.custom-file:not(:last-child) .custom-file-label,.input-group>.custom-file:not(:last-child) .custom-file-label::after{border-top-right-radius:0;border-bottom-right-radius:0}.input-group>.custom-file:not(:first-child) .custom-file-label{border-top-left-radius:0;border-bottom-left-radius:0}.input-group-append,.input-group-prepend{display:-ms-flexbox;display:flex}.input-group-append .btn,.input-group-prepend .btn{position:relative;z-index:2}.input-group-append .btn+.btn,.input-group-append .btn+.input-group-text,.input-group-append .input-group-text+.btn,.input-group-append .input-group-text+.input-group-text,.input-group-prepend .btn+.btn,.input-group-prepend .btn+.input-group-text,.input-group-prepend .input-group-text+.btn,.input-group-prepend .input-group-text+.input-group-text{margin-left:-1px}.input-group-prepend{margin-right:-1px}.input-group-append{margin-left:-1px}.input-group-text{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;padding:.375rem .75rem;margin-bottom:0;font-size:1rem;font-weight:400;line-height:1.5;color:#495057;text-align:center;white-space:nowrap;background-color:#e9ecef;border:1px solid #ced4da;border-radius:.25rem}.input-group-text input[type=checkbox],.input-group-text input[type=radio]{margin-top:0}.input-group>.input-group-append:last-child>.btn:not(:last-child):not(.dropdown-toggle),.input-group>.input-group-append:last-child>.input-group-text:not(:last-child),.input-group>.input-group-append:not(:last-child)>.btn,.input-group>.input-group-append:not(:last-child)>.input-group-text,.input-group>.input-group-prepend>.btn,.input-group>.input-group-prepend>.input-group-text{border-top-right-radius:0;border-bottom-right-radius:0}.input-group>.input-group-append>.btn,.input-group>.input-group-append>.input-group-text,.input-group>.input-group-prepend:first-child>.btn:not(:first-child),.input-group>.input-group-prepend:first-child>.input-group-text:not(:first-child),.input-group>.input-group-prepend:not(:first-child)>.btn,.input-group>.input-group-prepend:not(:first-child)>.input-group-text{border-top-left-radius:0;border-bottom-left-radius:0}.custom-control{position:relative;display:block;min-height:1.5rem;padding-left:1.5rem}.custom-control-inline{display:-ms-inline-flexbox;display:inline-flex;margin-right:1rem}.custom-control-input{position:absolute;z-index:-1;opacity:0}.custom-control-input:checked~.custom-control-label::before{color:#fff;background-color:#007bff}.custom-control-input:focus~.custom-control-label::before{box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(0,123,255,.25)}.custom-control-input:active~.custom-control-label::before{color:#fff;background-color:#b3d7ff}.custom-control-input:disabled~.custom-control-label{color:#6c757d}.custom-control-input:disabled~.custom-control-label::before{background-color:#e9ecef}.custom-control-label{position:relative;margin-bottom:0}.custom-control-label::before{position:absolute;top:.25rem;left:-1.5rem;display:block;width:1rem;height:1rem;pointer-events:none;content:"";-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-color:#dee2e6}.custom-control-label::after{position:absolute;top:.25rem;left:-1.5rem;display:block;width:1rem;height:1rem;content:"";background-repeat:no-repeat;background-position:center center;background-size:50% 50%}.custom-checkbox .custom-control-label::before{border-radius:.25rem}.custom-checkbox .custom-control-input:checked~.custom-control-label::before{background-color:#007bff}.custom-checkbox .custom-control-input:checked~.custom-control-label::after{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3E%3Cpath fill='%23fff' d='M6.564.75l-3.59 3.612-1.538-1.55L0 4.26 2.974 7.25 8 2.193z'/%3E%3C/svg%3E")}.custom-checkbox .custom-control-input:indeterminate~.custom-control-label::before{background-color:#007bff}.custom-checkbox .custom-control-input:indeterminate~.custom-control-label::after{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 4'%3E%3Cpath stroke='%23fff' d='M0 2h4'/%3E%3C/svg%3E")}.custom-checkbox .custom-control-input:disabled:checked~.custom-control-label::before{background-color:rgba(0,123,255,.5)}.custom-checkbox .custom-control-input:disabled:indeterminate~.custom-control-label::before{background-color:rgba(0,123,255,.5)}.custom-radio .custom-control-label::before{border-radius:50%}.custom-radio .custom-control-input:checked~.custom-control-label::before{background-color:#007bff}.custom-radio .custom-control-input:checked~.custom-control-label::after{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3E%3Ccircle r='3' fill='%23fff'/%3E%3C/svg%3E")}.custom-radio .custom-control-input:disabled:checked~.custom-control-label::before{background-color:rgba(0,123,255,.5)}.custom-select{display:inline-block;width:100%;height:calc(2.25rem + 2px);padding:.375rem 1.75rem .375rem .75rem;line-height:1.5;color:#495057;vertical-align:middle;background:#fff url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'%3E%3Cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3E%3C/svg%3E") no-repeat right .75rem center;background-size:8px 10px;border:1px solid #ced4da;border-radius:.25rem;-webkit-appearance:none;-moz-appearance:none;appearance:none}.custom-select:focus{border-color:#80bdff;outline:0;box-shadow:inset 0 1px 2px rgba(0,0,0,.075),0 0 5px rgba(128,189,255,.5)}.custom-select:focus::-ms-value{color:#495057;background-color:#fff}.custom-select[multiple],.custom-select[size]:not([size="1"]){height:auto;padding-right:.75rem;background-image:none}.custom-select:disabled{color:#6c757d;background-color:#e9ecef}.custom-select::-ms-expand{opacity:0}.custom-select-sm{height:calc(1.8125rem + 2px);padding-top:.375rem;padding-bottom:.375rem;font-size:75%}.custom-select-lg{height:calc(2.875rem + 2px);padding-top:.375rem;padding-bottom:.375rem;font-size:125%}.custom-file{position:relative;display:inline-block;width:100%;height:calc(2.25rem + 2px);margin-bottom:0}.custom-file-input{position:relative;z-index:2;width:100%;height:calc(2.25rem + 2px);margin:0;opacity:0}.custom-file-input:focus~.custom-file-label{border-color:#80bdff;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.custom-file-input:focus~.custom-file-label::after{border-color:#80bdff}.custom-file-input:lang(en)~.custom-file-label::after{content:"Browse"}.custom-file-label{position:absolute;top:0;right:0;left:0;z-index:1;height:calc(2.25rem + 2px);padding:.375rem .75rem;line-height:1.5;color:#495057;background-color:#fff;border:1px solid #ced4da;border-radius:.25rem}.custom-file-label::after{position:absolute;top:0;right:0;bottom:0;z-index:3;display:block;height:2.25rem;padding:.375rem .75rem;line-height:1.5;color:#495057;content:"Browse";background-color:#e9ecef;border-left:1px solid #ced4da;border-radius:0 .25rem .25rem 0}.custom-range{width:100%;padding-left:0;background-color:transparent;-webkit-appearance:none;-moz-appearance:none;appearance:none}.custom-range:focus{outline:0}.custom-range::-moz-focus-outer{border:0}.custom-range::-webkit-slider-thumb{width:1rem;height:1rem;margin-top:-.25rem;background-color:#007bff;border:0;border-radius:1rem;-webkit-appearance:none;appearance:none}.custom-range::-webkit-slider-thumb:focus{outline:0;box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(0,123,255,.25)}.custom-range::-webkit-slider-thumb:active{background-color:#b3d7ff}.custom-range::-webkit-slider-runnable-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:#dee2e6;border-color:transparent;border-radius:1rem}.custom-range::-moz-range-thumb{width:1rem;height:1rem;background-color:#007bff;border:0;border-radius:1rem;-moz-appearance:none;appearance:none}.custom-range::-moz-range-thumb:focus{outline:0;box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(0,123,255,.25)}.custom-range::-moz-range-thumb:active{background-color:#b3d7ff}.custom-range::-moz-range-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:#dee2e6;border-color:transparent;border-radius:1rem}.custom-range::-ms-thumb{width:1rem;height:1rem;background-color:#007bff;border:0;border-radius:1rem;appearance:none}.custom-range::-ms-thumb:focus{outline:0;box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(0,123,255,.25)}.custom-range::-ms-thumb:active{background-color:#b3d7ff}.custom-range::-ms-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:transparent;border-color:transparent;border-width:.5rem}.custom-range::-ms-fill-lower{background-color:#dee2e6;border-radius:1rem}.custom-range::-ms-fill-upper{margin-right:15px;background-color:#dee2e6;border-radius:1rem}.nav{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;padding-left:0;margin-bottom:0;list-style:none}.nav-link{display:block;padding:.5rem 1rem}.nav-link:focus,.nav-link:hover{text-decoration:none}.nav-link.disabled{color:#6c757d}.nav-tabs{border-bottom:1px solid #dee2e6}.nav-tabs .nav-item{margin-bottom:-1px}.nav-tabs .nav-link{border:1px solid transparent;border-top-left-radius:.25rem;border-top-right-radius:.25rem}.nav-tabs .nav-link:focus,.nav-tabs .nav-link:hover{border-color:#e9ecef #e9ecef #dee2e6}.nav-tabs .nav-link.disabled{color:#6c757d;background-color:transparent;border-color:transparent}.nav-tabs .nav-item.show .nav-link,.nav-tabs .nav-link.active{color:#495057;background-color:#fff;border-color:#dee2e6 #dee2e6 #fff}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-left-radius:0;border-top-right-radius:0}.nav-pills .nav-link{border-radius:.25rem}.nav-pills .nav-link.active,.nav-pills .show>.nav-link{color:#fff;background-color:#007bff}.nav-fill .nav-item{-ms-flex:1 1 auto;flex:1 1 auto;text-align:center}.nav-justified .nav-item{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;text-align:center}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.navbar{position:relative;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-align:center;align-items:center;-ms-flex-pack:justify;justify-content:space-between;padding:.5rem 1rem}.navbar>.container,.navbar>.container-fluid{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-align:center;align-items:center;-ms-flex-pack:justify;justify-content:space-between}.navbar-brand{display:inline-block;padding-top:.3125rem;padding-bottom:.3125rem;margin-right:1rem;font-size:1.25rem;line-height:inherit;white-space:nowrap}.navbar-brand:focus,.navbar-brand:hover{text-decoration:none}.navbar-nav{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;padding-left:0;margin-bottom:0;list-style:none}.navbar-nav .nav-link{padding-right:0;padding-left:0}.navbar-nav .dropdown-menu{position:static;float:none}.navbar-text{display:inline-block;padding-top:.5rem;padding-bottom:.5rem}.navbar-collapse{-ms-flex-preferred-size:100%;flex-basis:100%;-ms-flex-positive:1;flex-grow:1;-ms-flex-align:center;align-items:center}.navbar-toggler{padding:.25rem .75rem;font-size:1.25rem;line-height:1;background-color:transparent;border:1px solid transparent;border-radius:.25rem}.navbar-toggler:focus,.navbar-toggler:hover{text-decoration:none}.navbar-toggler:not(:disabled):not(.disabled){cursor:pointer}.navbar-toggler-icon{display:inline-block;width:1.5em;height:1.5em;vertical-align:middle;content:"";background:no-repeat center center;background-size:100% 100%}@media (max-width:575.98px){.navbar-expand-sm>.container,.navbar-expand-sm>.container-fluid{padding-right:0;padding-left:0}}@media (min-width:576px){.navbar-expand-sm{-ms-flex-flow:row nowrap;flex-flow:row nowrap;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-sm .navbar-nav{-ms-flex-direction:row;flex-direction:row}.navbar-expand-sm .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-sm .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-sm>.container,.navbar-expand-sm>.container-fluid{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-sm .navbar-collapse{display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-sm .navbar-toggler{display:none}}@media (max-width:767.98px){.navbar-expand-md>.container,.navbar-expand-md>.container-fluid{padding-right:0;padding-left:0}}@media (min-width:768px){.navbar-expand-md{-ms-flex-flow:row nowrap;flex-flow:row nowrap;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-md .navbar-nav{-ms-flex-direction:row;flex-direction:row}.navbar-expand-md .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-md .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-md>.container,.navbar-expand-md>.container-fluid{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-md .navbar-collapse{display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-md .navbar-toggler{display:none}}@media (max-width:991.98px){.navbar-expand-lg>.container,.navbar-expand-lg>.container-fluid{padding-right:0;padding-left:0}}@media (min-width:992px){.navbar-expand-lg{-ms-flex-flow:row nowrap;flex-flow:row nowrap;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-lg .navbar-nav{-ms-flex-direction:row;flex-direction:row}.navbar-expand-lg .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-lg .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-lg>.container,.navbar-expand-lg>.container-fluid{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-lg .navbar-collapse{display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-lg .navbar-toggler{display:none}}@media (max-width:1199.98px){.navbar-expand-xl>.container,.navbar-expand-xl>.container-fluid{padding-right:0;padding-left:0}}@media (min-width:1200px){.navbar-expand-xl{-ms-flex-flow:row nowrap;flex-flow:row nowrap;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-xl .navbar-nav{-ms-flex-direction:row;flex-direction:row}.navbar-expand-xl .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-xl .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-xl>.container,.navbar-expand-xl>.container-fluid{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-xl .navbar-collapse{display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-xl .navbar-toggler{display:none}}.navbar-expand{-ms-flex-flow:row nowrap;flex-flow:row nowrap;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand>.container,.navbar-expand>.container-fluid{padding-right:0;padding-left:0}.navbar-expand .navbar-nav{-ms-flex-direction:row;flex-direction:row}.navbar-expand .navbar-nav .dropdown-menu{position:absolute}.navbar-expand .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand>.container,.navbar-expand>.container-fluid{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand .navbar-collapse{display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand .navbar-toggler{display:none}.navbar-light .navbar-brand{color:rgba(0,0,0,.9)}.navbar-light .navbar-brand:focus,.navbar-light .navbar-brand:hover{color:rgba(0,0,0,.9)}.navbar-light .navbar-nav .nav-link{color:rgba(0,0,0,.5)}.navbar-light .navbar-nav .nav-link:focus,.navbar-light .navbar-nav .nav-link:hover{color:rgba(0,0,0,.7)}.navbar-light .navbar-nav .nav-link.disabled{color:rgba(0,0,0,.3)}.navbar-light .navbar-nav .active>.nav-link,.navbar-light .navbar-nav .nav-link.active,.navbar-light .navbar-nav .nav-link.show,.navbar-light .navbar-nav .show>.nav-link{color:rgba(0,0,0,.9)}.navbar-light .navbar-toggler{color:rgba(0,0,0,.5);border-color:rgba(0,0,0,.1)}.navbar-light .navbar-toggler-icon{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath stroke='rgba(0, 0, 0, 0.5)' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3E%3C/svg%3E")}.navbar-light .navbar-text{color:rgba(0,0,0,.5)}.navbar-light .navbar-text a{color:rgba(0,0,0,.9)}.navbar-light .navbar-text a:focus,.navbar-light .navbar-text a:hover{color:rgba(0,0,0,.9)}.navbar-dark .navbar-brand{color:#fff}.navbar-dark .navbar-brand:focus,.navbar-dark .navbar-brand:hover{color:#fff}.navbar-dark .navbar-nav .nav-link{color:rgba(255,255,255,.5)}.navbar-dark .navbar-nav .nav-link:focus,.navbar-dark .navbar-nav .nav-link:hover{color:rgba(255,255,255,.75)}.navbar-dark .navbar-nav .nav-link.disabled{color:rgba(255,255,255,.25)}.navbar-dark .navbar-nav .active>.nav-link,.navbar-dark .navbar-nav .nav-link.active,.navbar-dark .navbar-nav .nav-link.show,.navbar-dark .navbar-nav .show>.nav-link{color:#fff}.navbar-dark .navbar-toggler{color:rgba(255,255,255,.5);border-color:rgba(255,255,255,.1)}.navbar-dark .navbar-toggler-icon{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath stroke='rgba(255, 255, 255, 0.5)' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3E%3C/svg%3E")}.navbar-dark .navbar-text{color:rgba(255,255,255,.5)}.navbar-dark .navbar-text a{color:#fff}.navbar-dark .navbar-text a:focus,.navbar-dark .navbar-text a:hover{color:#fff}.card{position:relative;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;min-width:0;word-wrap:break-word;background-color:#fff;background-clip:border-box;border:1px solid rgba(0,0,0,.125);border-radius:.25rem}.card>hr{margin-right:0;margin-left:0}.card>.list-group:first-child .list-group-item:first-child{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.card>.list-group:last-child .list-group-item:last-child{border-bottom-right-radius:.25rem;border-bottom-left-radius:.25rem}.card-body{-ms-flex:1 1 auto;flex:1 1 auto;padding:1.25rem}.card-title{margin-bottom:.75rem}.card-subtitle{margin-top:-.375rem;margin-bottom:0}.card-text:last-child{margin-bottom:0}.card-link:hover{text-decoration:none}.card-link+.card-link{margin-left:1.25rem}.card-header{padding:.75rem 1.25rem;margin-bottom:0;background-color:rgba(0,0,0,.03);border-bottom:1px solid rgba(0,0,0,.125)}.card-header:first-child{border-radius:calc(.25rem - 1px) calc(.25rem - 1px) 0 0}.card-header+.list-group .list-group-item:first-child{border-top:0}.card-footer{padding:.75rem 1.25rem;background-color:rgba(0,0,0,.03);border-top:1px solid rgba(0,0,0,.125)}.card-footer:last-child{border-radius:0 0 calc(.25rem - 1px) calc(.25rem - 1px)}.card-header-tabs{margin-right:-.625rem;margin-bottom:-.75rem;margin-left:-.625rem;border-bottom:0}.card-header-pills{margin-right:-.625rem;margin-left:-.625rem}.card-img-overlay{position:absolute;top:0;right:0;bottom:0;left:0;padding:1.25rem}.card-img{width:100%;border-radius:calc(.25rem - 1px)}.card-img-top{width:100%;border-top-left-radius:calc(.25rem - 1px);border-top-right-radius:calc(.25rem - 1px)}.card-img-bottom{width:100%;border-bottom-right-radius:calc(.25rem - 1px);border-bottom-left-radius:calc(.25rem - 1px)}.card-deck{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column}.card-deck .card{margin-bottom:15px}@media (min-width:576px){.card-deck{-ms-flex-flow:row wrap;flex-flow:row wrap;margin-right:-15px;margin-left:-15px}.card-deck .card{display:-ms-flexbox;display:flex;-ms-flex:1 0 0%;flex:1 0 0%;-ms-flex-direction:column;flex-direction:column;margin-right:15px;margin-bottom:0;margin-left:15px}}.card-group{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column}.card-group>.card{margin-bottom:15px}@media (min-width:576px){.card-group{-ms-flex-flow:row wrap;flex-flow:row wrap}.card-group>.card{-ms-flex:1 0 0%;flex:1 0 0%;margin-bottom:0}.card-group>.card+.card{margin-left:0;border-left:0}.card-group>.card:first-child{border-top-right-radius:0;border-bottom-right-radius:0}.card-group>.card:first-child .card-header,.card-group>.card:first-child .card-img-top{border-top-right-radius:0}.card-group>.card:first-child .card-footer,.card-group>.card:first-child .card-img-bottom{border-bottom-right-radius:0}.card-group>.card:last-child{border-top-left-radius:0;border-bottom-left-radius:0}.card-group>.card:last-child .card-header,.card-group>.card:last-child .card-img-top{border-top-left-radius:0}.card-group>.card:last-child .card-footer,.card-group>.card:last-child .card-img-bottom{border-bottom-left-radius:0}.card-group>.card:only-child{border-radius:.25rem}.card-group>.card:only-child .card-header,.card-group>.card:only-child .card-img-top{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.card-group>.card:only-child .card-footer,.card-group>.card:only-child .card-img-bottom{border-bottom-right-radius:.25rem;border-bottom-left-radius:.25rem}.card-group>.card:not(:first-child):not(:last-child):not(:only-child){border-radius:0}.card-group>.card:not(:first-child):not(:last-child):not(:only-child) .card-footer,.card-group>.card:not(:first-child):not(:last-child):not(:only-child) .card-header,.card-group>.card:not(:first-child):not(:last-child):not(:only-child) .card-img-bottom,.card-group>.card:not(:first-child):not(:last-child):not(:only-child) .card-img-top{border-radius:0}}.card-columns .card{margin-bottom:.75rem}@media (min-width:576px){.card-columns{-webkit-column-count:3;-moz-column-count:3;column-count:3;-webkit-column-gap:1.25rem;-moz-column-gap:1.25rem;column-gap:1.25rem;orphans:1;widows:1}.card-columns .card{display:inline-block;width:100%}}.accordion .card:not(:first-of-type):not(:last-of-type){border-bottom:0;border-radius:0}.accordion .card:not(:first-of-type) .card-header:first-child{border-radius:0}.accordion .card:first-of-type{border-bottom:0;border-bottom-right-radius:0;border-bottom-left-radius:0}.accordion .card:last-of-type{border-top-left-radius:0;border-top-right-radius:0}.breadcrumb{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;padding:.75rem 1rem;margin-bottom:1rem;list-style:none;background-color:#e9ecef;border-radius:.25rem}.breadcrumb-item+.breadcrumb-item{padding-left:.5rem}.breadcrumb-item+.breadcrumb-item::before{display:inline-block;padding-right:.5rem;color:#6c757d;content:"/"}.breadcrumb-item+.breadcrumb-item:hover::before{text-decoration:underline}.breadcrumb-item+.breadcrumb-item:hover::before{text-decoration:none}.breadcrumb-item.active{color:#6c757d}.pagination{display:-ms-flexbox;display:flex;padding-left:0;list-style:none;border-radius:.25rem}.page-link{position:relative;display:block;padding:.5rem .75rem;margin-left:-1px;line-height:1.25;color:#007bff;background-color:#fff;border:1px solid #dee2e6}.page-link:hover{z-index:2;color:#0056b3;text-decoration:none;background-color:#e9ecef;border-color:#dee2e6}.page-link:focus{z-index:2;outline:0;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.page-link:not(:disabled):not(.disabled){cursor:pointer}.page-item:first-child .page-link{margin-left:0;border-top-left-radius:.25rem;border-bottom-left-radius:.25rem}.page-item:last-child .page-link{border-top-right-radius:.25rem;border-bottom-right-radius:.25rem}.page-item.active .page-link{z-index:1;color:#fff;background-color:#007bff;border-color:#007bff}.page-item.disabled .page-link{color:#6c757d;pointer-events:none;cursor:auto;background-color:#fff;border-color:#dee2e6}.pagination-lg .page-link{padding:.75rem 1.5rem;font-size:1.25rem;line-height:1.5}.pagination-lg .page-item:first-child .page-link{border-top-left-radius:.3rem;border-bottom-left-radius:.3rem}.pagination-lg .page-item:last-child .page-link{border-top-right-radius:.3rem;border-bottom-right-radius:.3rem}.pagination-sm .page-link{padding:.25rem .5rem;font-size:.875rem;line-height:1.5}.pagination-sm .page-item:first-child .page-link{border-top-left-radius:.2rem;border-bottom-left-radius:.2rem}.pagination-sm .page-item:last-child .page-link{border-top-right-radius:.2rem;border-bottom-right-radius:.2rem}.badge{display:inline-block;padding:.25em .4em;font-size:75%;font-weight:700;line-height:1;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25rem}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.badge-pill{padding-right:.6em;padding-left:.6em;border-radius:10rem}.badge-primary{color:#fff;background-color:#007bff}.badge-primary[href]:focus,.badge-primary[href]:hover{color:#fff;text-decoration:none;background-color:#0062cc}.badge-secondary{color:#fff;background-color:#6c757d}.badge-secondary[href]:focus,.badge-secondary[href]:hover{color:#fff;text-decoration:none;background-color:#545b62}.badge-success{color:#fff;background-color:#28a745}.badge-success[href]:focus,.badge-success[href]:hover{color:#fff;text-decoration:none;background-color:#1e7e34}.badge-info{color:#fff;background-color:#17a2b8}.badge-info[href]:focus,.badge-info[href]:hover{color:#fff;text-decoration:none;background-color:#117a8b}.badge-warning{color:#212529;background-color:#ffc107}.badge-warning[href]:focus,.badge-warning[href]:hover{color:#212529;text-decoration:none;background-color:#d39e00}.badge-danger{color:#fff;background-color:#dc3545}.badge-danger[href]:focus,.badge-danger[href]:hover{color:#fff;text-decoration:none;background-color:#bd2130}.badge-light{color:#212529;background-color:#f8f9fa}.badge-light[href]:focus,.badge-light[href]:hover{color:#212529;text-decoration:none;background-color:#dae0e5}.badge-dark{color:#fff;background-color:#343a40}.badge-dark[href]:focus,.badge-dark[href]:hover{color:#fff;text-decoration:none;background-color:#1d2124}.jumbotron{padding:2rem 1rem;margin-bottom:2rem;background-color:#e9ecef;border-radius:.3rem}@media (min-width:576px){.jumbotron{padding:4rem 2rem}}.jumbotron-fluid{padding-right:0;padding-left:0;border-radius:0}.alert{position:relative;padding:.75rem 1.25rem;margin-bottom:1rem;border:1px solid transparent;border-radius:.25rem}.alert-heading{color:inherit}.alert-link{font-weight:700}.alert-dismissible{padding-right:4rem}.alert-dismissible .close{position:absolute;top:0;right:0;padding:.75rem 1.25rem;color:inherit}.alert-primary{color:#004085;background-color:#cce5ff;border-color:#b8daff}.alert-primary hr{border-top-color:#9fcdff}.alert-primary .alert-link{color:#002752}.alert-secondary{color:#383d41;background-color:#e2e3e5;border-color:#d6d8db}.alert-secondary hr{border-top-color:#c8cbcf}.alert-secondary .alert-link{color:#202326}.alert-success{color:#155724;background-color:#d4edda;border-color:#c3e6cb}.alert-success hr{border-top-color:#b1dfbb}.alert-success .alert-link{color:#0b2e13}.alert-info{color:#0c5460;background-color:#d1ecf1;border-color:#bee5eb}.alert-info hr{border-top-color:#abdde5}.alert-info .alert-link{color:#062c33}.alert-warning{color:#856404;background-color:#fff3cd;border-color:#ffeeba}.alert-warning hr{border-top-color:#ffe8a1}.alert-warning .alert-link{color:#533f03}.alert-danger{color:#721c24;background-color:#f8d7da;border-color:#f5c6cb}.alert-danger hr{border-top-color:#f1b0b7}.alert-danger .alert-link{color:#491217}.alert-light{color:#818182;background-color:#fefefe;border-color:#fdfdfe}.alert-light hr{border-top-color:#ececf6}.alert-light .alert-link{color:#686868}.alert-dark{color:#1b1e21;background-color:#d6d8d9;border-color:#c6c8ca}.alert-dark hr{border-top-color:#b9bbbe}.alert-dark .alert-link{color:#040505}@-webkit-keyframes progress-bar-stripes{from{background-position:1rem 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:1rem 0}to{background-position:0 0}}.progress{display:-ms-flexbox;display:flex;height:1rem;overflow:hidden;font-size:.75rem;background-color:#e9ecef;border-radius:.25rem}.progress-bar{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;-ms-flex-pack:center;justify-content:center;color:#fff;text-align:center;white-space:nowrap;background-color:#007bff;transition:width .6s ease}@media screen and (prefers-reduced-motion:reduce){.progress-bar{transition:none}}.progress-bar-striped{background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-size:1rem 1rem}.progress-bar-animated{-webkit-animation:progress-bar-stripes 1s linear infinite;animation:progress-bar-stripes 1s linear infinite}.media{display:-ms-flexbox;display:flex;-ms-flex-align:start;align-items:flex-start}.media-body{-ms-flex:1;flex:1}.list-group{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;padding-left:0;margin-bottom:0}.list-group-item-action{width:100%;color:#495057;text-align:inherit}.list-group-item-action:focus,.list-group-item-action:hover{color:#495057;text-decoration:none;background-color:#f8f9fa}.list-group-item-action:active{color:#212529;background-color:#e9ecef}.list-group-item{position:relative;display:block;padding:.75rem 1.25rem;margin-bottom:-1px;background-color:#fff;border:1px solid rgba(0,0,0,.125)}.list-group-item:first-child{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:.25rem;border-bottom-left-radius:.25rem}.list-group-item:focus,.list-group-item:hover{z-index:1;text-decoration:none}.list-group-item.disabled,.list-group-item:disabled{color:#6c757d;background-color:#fff}.list-group-item.active{z-index:2;color:#fff;background-color:#007bff;border-color:#007bff}.list-group-flush .list-group-item{border-right:0;border-left:0;border-radius:0}.list-group-flush:first-child .list-group-item:first-child{border-top:0}.list-group-flush:last-child .list-group-item:last-child{border-bottom:0}.list-group-item-primary{color:#004085;background-color:#b8daff}.list-group-item-primary.list-group-item-action:focus,.list-group-item-primary.list-group-item-action:hover{color:#004085;background-color:#9fcdff}.list-group-item-primary.list-group-item-action.active{color:#fff;background-color:#004085;border-color:#004085}.list-group-item-secondary{color:#383d41;background-color:#d6d8db}.list-group-item-secondary.list-group-item-action:focus,.list-group-item-secondary.list-group-item-action:hover{color:#383d41;background-color:#c8cbcf}.list-group-item-secondary.list-group-item-action.active{color:#fff;background-color:#383d41;border-color:#383d41}.list-group-item-success{color:#155724;background-color:#c3e6cb}.list-group-item-success.list-group-item-action:focus,.list-group-item-success.list-group-item-action:hover{color:#155724;background-color:#b1dfbb}.list-group-item-success.list-group-item-action.active{color:#fff;background-color:#155724;border-color:#155724}.list-group-item-info{color:#0c5460;background-color:#bee5eb}.list-group-item-info.list-group-item-action:focus,.list-group-item-info.list-group-item-action:hover{color:#0c5460;background-color:#abdde5}.list-group-item-info.list-group-item-action.active{color:#fff;background-color:#0c5460;border-color:#0c5460}.list-group-item-warning{color:#856404;background-color:#ffeeba}.list-group-item-warning.list-group-item-action:focus,.list-group-item-warning.list-group-item-action:hover{color:#856404;background-color:#ffe8a1}.list-group-item-warning.list-group-item-action.active{color:#fff;background-color:#856404;border-color:#856404}.list-group-item-danger{color:#721c24;background-color:#f5c6cb}.list-group-item-danger.list-group-item-action:focus,.list-group-item-danger.list-group-item-action:hover{color:#721c24;background-color:#f1b0b7}.list-group-item-danger.list-group-item-action.active{color:#fff;background-color:#721c24;border-color:#721c24}.list-group-item-light{color:#818182;background-color:#fdfdfe}.list-group-item-light.list-group-item-action:focus,.list-group-item-light.list-group-item-action:hover{color:#818182;background-color:#ececf6}.list-group-item-light.list-group-item-action.active{color:#fff;background-color:#818182;border-color:#818182}.list-group-item-dark{color:#1b1e21;background-color:#c6c8ca}.list-group-item-dark.list-group-item-action:focus,.list-group-item-dark.list-group-item-action:hover{color:#1b1e21;background-color:#b9bbbe}.list-group-item-dark.list-group-item-action.active{color:#fff;background-color:#1b1e21;border-color:#1b1e21}.close{float:right;font-size:1.5rem;font-weight:700;line-height:1;color:#000;text-shadow:0 1px 0 #fff;opacity:.5}.close:focus,.close:hover{color:#000;text-decoration:none;opacity:.75}.close:not(:disabled):not(.disabled){cursor:pointer}button.close{padding:0;background-color:transparent;border:0;-webkit-appearance:none}.modal-open{overflow:hidden}.modal{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1050;display:none;overflow:hidden;outline:0}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal-dialog{position:relative;width:auto;margin:.5rem;pointer-events:none}.modal.fade .modal-dialog{transition:-webkit-transform .3s ease-out;transition:transform .3s ease-out;transition:transform .3s ease-out,-webkit-transform .3s ease-out;-webkit-transform:translate(0,-25%);transform:translate(0,-25%)}@media screen and (prefers-reduced-motion:reduce){.modal.fade .modal-dialog{transition:none}}.modal.show .modal-dialog{-webkit-transform:translate(0,0);transform:translate(0,0)}.modal-dialog-centered{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;min-height:calc(100% - (.5rem * 2))}.modal-content{position:relative;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;width:100%;pointer-events:auto;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.2);border-radius:.3rem;outline:0}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000}.modal-backdrop.fade{opacity:0}.modal-backdrop.show{opacity:.5}.modal-header{display:-ms-flexbox;display:flex;-ms-flex-align:start;align-items:flex-start;-ms-flex-pack:justify;justify-content:space-between;padding:1rem;border-bottom:1px solid #e9ecef;border-top-left-radius:.3rem;border-top-right-radius:.3rem}.modal-header .close{padding:1rem;margin:-1rem -1rem -1rem auto}.modal-title{margin-bottom:0;line-height:1.5}.modal-body{position:relative;-ms-flex:1 1 auto;flex:1 1 auto;padding:1rem}.modal-footer{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:end;justify-content:flex-end;padding:1rem;border-top:1px solid #e9ecef}.modal-footer>:not(:first-child){margin-left:.25rem}.modal-footer>:not(:last-child){margin-right:.25rem}.modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@media (min-width:576px){.modal-dialog{max-width:500px;margin:1.75rem auto}.modal-dialog-centered{min-height:calc(100% - (1.75rem * 2))}.modal-sm{max-width:300px}}@media (min-width:992px){.modal-lg{max-width:800px}}.tooltip{position:absolute;z-index:1070;display:block;margin:0;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol";font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;white-space:normal;line-break:auto;font-size:.875rem;word-wrap:break-word;opacity:0}.tooltip.show{opacity:.9}.tooltip .arrow{position:absolute;display:block;width:.8rem;height:.4rem}.tooltip .arrow::before{position:absolute;content:"";border-color:transparent;border-style:solid}.bs-tooltip-auto[x-placement^=top],.bs-tooltip-top{padding:.4rem 0}.bs-tooltip-auto[x-placement^=top] .arrow,.bs-tooltip-top .arrow{bottom:0}.bs-tooltip-auto[x-placement^=top] .arrow::before,.bs-tooltip-top .arrow::before{top:0;border-width:.4rem .4rem 0;border-top-color:#000}.bs-tooltip-auto[x-placement^=right],.bs-tooltip-right{padding:0 .4rem}.bs-tooltip-auto[x-placement^=right] .arrow,.bs-tooltip-right .arrow{left:0;width:.4rem;height:.8rem}.bs-tooltip-auto[x-placement^=right] .arrow::before,.bs-tooltip-right .arrow::before{right:0;border-width:.4rem .4rem .4rem 0;border-right-color:#000}.bs-tooltip-auto[x-placement^=bottom],.bs-tooltip-bottom{padding:.4rem 0}.bs-tooltip-auto[x-placement^=bottom] .arrow,.bs-tooltip-bottom .arrow{top:0}.bs-tooltip-auto[x-placement^=bottom] .arrow::before,.bs-tooltip-bottom .arrow::before{bottom:0;border-width:0 .4rem .4rem;border-bottom-color:#000}.bs-tooltip-auto[x-placement^=left],.bs-tooltip-left{padding:0 .4rem}.bs-tooltip-auto[x-placement^=left] .arrow,.bs-tooltip-left .arrow{right:0;width:.4rem;height:.8rem}.bs-tooltip-auto[x-placement^=left] .arrow::before,.bs-tooltip-left .arrow::before{left:0;border-width:.4rem 0 .4rem .4rem;border-left-color:#000}.tooltip-inner{max-width:200px;padding:.25rem .5rem;color:#fff;text-align:center;background-color:#000;border-radius:.25rem}.popover{position:absolute;top:0;left:0;z-index:1060;display:block;max-width:276px;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol";font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;white-space:normal;line-break:auto;font-size:.875rem;word-wrap:break-word;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.2);border-radius:.3rem}.popover .arrow{position:absolute;display:block;width:1rem;height:.5rem;margin:0 .3rem}.popover .arrow::after,.popover .arrow::before{position:absolute;display:block;content:"";border-color:transparent;border-style:solid}.bs-popover-auto[x-placement^=top],.bs-popover-top{margin-bottom:.5rem}.bs-popover-auto[x-placement^=top] .arrow,.bs-popover-top .arrow{bottom:calc((.5rem + 1px) * -1)}.bs-popover-auto[x-placement^=top] .arrow::after,.bs-popover-auto[x-placement^=top] .arrow::before,.bs-popover-top .arrow::after,.bs-popover-top .arrow::before{border-width:.5rem .5rem 0}.bs-popover-auto[x-placement^=top] .arrow::before,.bs-popover-top .arrow::before{bottom:0;border-top-color:rgba(0,0,0,.25)}.bs-popover-auto[x-placement^=top] .arrow::after,.bs-popover-top .arrow::after{bottom:1px;border-top-color:#fff}.bs-popover-auto[x-placement^=right],.bs-popover-right{margin-left:.5rem}.bs-popover-auto[x-placement^=right] .arrow,.bs-popover-right .arrow{left:calc((.5rem + 1px) * -1);width:.5rem;height:1rem;margin:.3rem 0}.bs-popover-auto[x-placement^=right] .arrow::after,.bs-popover-auto[x-placement^=right] .arrow::before,.bs-popover-right .arrow::after,.bs-popover-right .arrow::before{border-width:.5rem .5rem .5rem 0}.bs-popover-auto[x-placement^=right] .arrow::before,.bs-popover-right .arrow::before{left:0;border-right-color:rgba(0,0,0,.25)}.bs-popover-auto[x-placement^=right] .arrow::after,.bs-popover-right .arrow::after{left:1px;border-right-color:#fff}.bs-popover-auto[x-placement^=bottom],.bs-popover-bottom{margin-top:.5rem}.bs-popover-auto[x-placement^=bottom] .arrow,.bs-popover-bottom .arrow{top:calc((.5rem + 1px) * -1)}.bs-popover-auto[x-placement^=bottom] .arrow::after,.bs-popover-auto[x-placement^=bottom] .arrow::before,.bs-popover-bottom .arrow::after,.bs-popover-bottom .arrow::before{border-width:0 .5rem .5rem .5rem}.bs-popover-auto[x-placement^=bottom] .arrow::before,.bs-popover-bottom .arrow::before{top:0;border-bottom-color:rgba(0,0,0,.25)}.bs-popover-auto[x-placement^=bottom] .arrow::after,.bs-popover-bottom .arrow::after{top:1px;border-bottom-color:#fff}.bs-popover-auto[x-placement^=bottom] .popover-header::before,.bs-popover-bottom .popover-header::before{position:absolute;top:0;left:50%;display:block;width:1rem;margin-left:-.5rem;content:"";border-bottom:1px solid #f7f7f7}.bs-popover-auto[x-placement^=left],.bs-popover-left{margin-right:.5rem}.bs-popover-auto[x-placement^=left] .arrow,.bs-popover-left .arrow{right:calc((.5rem + 1px) * -1);width:.5rem;height:1rem;margin:.3rem 0}.bs-popover-auto[x-placement^=left] .arrow::after,.bs-popover-auto[x-placement^=left] .arrow::before,.bs-popover-left .arrow::after,.bs-popover-left .arrow::before{border-width:.5rem 0 .5rem .5rem}.bs-popover-auto[x-placement^=left] .arrow::before,.bs-popover-left .arrow::before{right:0;border-left-color:rgba(0,0,0,.25)}.bs-popover-auto[x-placement^=left] .arrow::after,.bs-popover-left .arrow::after{right:1px;border-left-color:#fff}.popover-header{padding:.5rem .75rem;margin-bottom:0;font-size:1rem;color:inherit;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-top-left-radius:calc(.3rem - 1px);border-top-right-radius:calc(.3rem - 1px)}.popover-header:empty{display:none}.popover-body{padding:.5rem .75rem;color:#212529}.carousel{position:relative}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-item{position:relative;display:none;-ms-flex-align:center;align-items:center;width:100%;transition:-webkit-transform .6s ease;transition:transform .6s ease;transition:transform .6s ease,-webkit-transform .6s ease;-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-perspective:1000px;perspective:1000px}@media screen and (prefers-reduced-motion:reduce){.carousel-item{transition:none}}.carousel-item-next,.carousel-item-prev,.carousel-item.active{display:block}.carousel-item-next,.carousel-item-prev{position:absolute;top:0}.carousel-item-next.carousel-item-left,.carousel-item-prev.carousel-item-right{-webkit-transform:translateX(0);transform:translateX(0)}@supports ((-webkit-transform-style:preserve-3d) or (transform-style:preserve-3d)){.carousel-item-next.carousel-item-left,.carousel-item-prev.carousel-item-right{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}}.active.carousel-item-right,.carousel-item-next{-webkit-transform:translateX(100%);transform:translateX(100%)}@supports ((-webkit-transform-style:preserve-3d) or (transform-style:preserve-3d)){.active.carousel-item-right,.carousel-item-next{-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}}.active.carousel-item-left,.carousel-item-prev{-webkit-transform:translateX(-100%);transform:translateX(-100%)}@supports ((-webkit-transform-style:preserve-3d) or (transform-style:preserve-3d)){.active.carousel-item-left,.carousel-item-prev{-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}}.carousel-fade .carousel-item{opacity:0;transition-duration:.6s;transition-property:opacity}.carousel-fade .carousel-item-next.carousel-item-left,.carousel-fade .carousel-item-prev.carousel-item-right,.carousel-fade .carousel-item.active{opacity:1}.carousel-fade .active.carousel-item-left,.carousel-fade .active.carousel-item-right{opacity:0}.carousel-fade .active.carousel-item-left,.carousel-fade .active.carousel-item-prev,.carousel-fade .carousel-item-next,.carousel-fade .carousel-item-prev,.carousel-fade .carousel-item.active{-webkit-transform:translateX(0);transform:translateX(0)}@supports ((-webkit-transform-style:preserve-3d) or (transform-style:preserve-3d)){.carousel-fade .active.carousel-item-left,.carousel-fade .active.carousel-item-prev,.carousel-fade .carousel-item-next,.carousel-fade .carousel-item-prev,.carousel-fade .carousel-item.active{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}}.carousel-control-next,.carousel-control-prev{position:absolute;top:0;bottom:0;display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;width:15%;color:#fff;text-align:center;opacity:.5}.carousel-control-next:focus,.carousel-control-next:hover,.carousel-control-prev:focus,.carousel-control-prev:hover{color:#fff;text-decoration:none;outline:0;opacity:.9}.carousel-control-prev{left:0}.carousel-control-next{right:0}.carousel-control-next-icon,.carousel-control-prev-icon{display:inline-block;width:20px;height:20px;background:transparent no-repeat center center;background-size:100% 100%}.carousel-control-prev-icon{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' viewBox='0 0 8 8'%3E%3Cpath d='M5.25 0l-4 4 4 4 1.5-1.5-2.5-2.5 2.5-2.5-1.5-1.5z'/%3E%3C/svg%3E")}.carousel-control-next-icon{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' viewBox='0 0 8 8'%3E%3Cpath d='M2.75 0l-1.5 1.5 2.5 2.5-2.5 2.5 1.5 1.5 4-4-4-4z'/%3E%3C/svg%3E")}.carousel-indicators{position:absolute;right:0;bottom:10px;left:0;z-index:15;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;padding-left:0;margin-right:15%;margin-left:15%;list-style:none}.carousel-indicators li{position:relative;-ms-flex:0 1 auto;flex:0 1 auto;width:30px;height:3px;margin-right:3px;margin-left:3px;text-indent:-999px;cursor:pointer;background-color:rgba(255,255,255,.5)}.carousel-indicators li::before{position:absolute;top:-10px;left:0;display:inline-block;width:100%;height:10px;content:""}.carousel-indicators li::after{position:absolute;bottom:-10px;left:0;display:inline-block;width:100%;height:10px;content:""}.carousel-indicators .active{background-color:#fff}.carousel-caption{position:absolute;right:15%;bottom:20px;left:15%;z-index:10;padding-top:20px;padding-bottom:20px;color:#fff;text-align:center}.align-baseline{vertical-align:baseline!important}.align-top{vertical-align:top!important}.align-middle{vertical-align:middle!important}.align-bottom{vertical-align:bottom!important}.align-text-bottom{vertical-align:text-bottom!important}.align-text-top{vertical-align:text-top!important}.bg-primary{background-color:#007bff!important}a.bg-primary:focus,a.bg-primary:hover,button.bg-primary:focus,button.bg-primary:hover{background-color:#0062cc!important}.bg-secondary{background-color:#6c757d!important}a.bg-secondary:focus,a.bg-secondary:hover,button.bg-secondary:focus,button.bg-secondary:hover{background-color:#545b62!important}.bg-success{background-color:#28a745!important}a.bg-success:focus,a.bg-success:hover,button.bg-success:focus,button.bg-success:hover{background-color:#1e7e34!important}.bg-info{background-color:#17a2b8!important}a.bg-info:focus,a.bg-info:hover,button.bg-info:focus,button.bg-info:hover{background-color:#117a8b!important}.bg-warning{background-color:#ffc107!important}a.bg-warning:focus,a.bg-warning:hover,button.bg-warning:focus,button.bg-warning:hover{background-color:#d39e00!important}.bg-danger{background-color:#dc3545!important}a.bg-danger:focus,a.bg-danger:hover,button.bg-danger:focus,button.bg-danger:hover{background-color:#bd2130!important}.bg-light{background-color:#f8f9fa!important}a.bg-light:focus,a.bg-light:hover,button.bg-light:focus,button.bg-light:hover{background-color:#dae0e5!important}.bg-dark{background-color:#343a40!important}a.bg-dark:focus,a.bg-dark:hover,button.bg-dark:focus,button.bg-dark:hover{background-color:#1d2124!important}.bg-white{background-color:#fff!important}.bg-transparent{background-color:transparent!important}.border{border:1px solid #dee2e6!important}.border-top{border-top:1px solid #dee2e6!important}.border-right{border-right:1px solid #dee2e6!important}.border-bottom{border-bottom:1px solid #dee2e6!important}.border-left{border-left:1px solid #dee2e6!important}.border-0{border:0!important}.border-top-0{border-top:0!important}.border-right-0{border-right:0!important}.border-bottom-0{border-bottom:0!important}.border-left-0{border-left:0!important}.border-primary{border-color:#007bff!important}.border-secondary{border-color:#6c757d!important}.border-success{border-color:#28a745!important}.border-info{border-color:#17a2b8!important}.border-warning{border-color:#ffc107!important}.border-danger{border-color:#dc3545!important}.border-light{border-color:#f8f9fa!important}.border-dark{border-color:#343a40!important}.border-white{border-color:#fff!important}.rounded{border-radius:.25rem!important}.rounded-top{border-top-left-radius:.25rem!important;border-top-right-radius:.25rem!important}.rounded-right{border-top-right-radius:.25rem!important;border-bottom-right-radius:.25rem!important}.rounded-bottom{border-bottom-right-radius:.25rem!important;border-bottom-left-radius:.25rem!important}.rounded-left{border-top-left-radius:.25rem!important;border-bottom-left-radius:.25rem!important}.rounded-circle{border-radius:50%!important}.rounded-0{border-radius:0!important}.clearfix::after{display:block;clear:both;content:""}.d-none{display:none!important}.d-inline{display:inline!important}.d-inline-block{display:inline-block!important}.d-block{display:block!important}.d-table{display:table!important}.d-table-row{display:table-row!important}.d-table-cell{display:table-cell!important}.d-flex{display:-ms-flexbox!important;display:flex!important}.d-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}@media (min-width:576px){.d-sm-none{display:none!important}.d-sm-inline{display:inline!important}.d-sm-inline-block{display:inline-block!important}.d-sm-block{display:block!important}.d-sm-table{display:table!important}.d-sm-table-row{display:table-row!important}.d-sm-table-cell{display:table-cell!important}.d-sm-flex{display:-ms-flexbox!important;display:flex!important}.d-sm-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}}@media (min-width:768px){.d-md-none{display:none!important}.d-md-inline{display:inline!important}.d-md-inline-block{display:inline-block!important}.d-md-block{display:block!important}.d-md-table{display:table!important}.d-md-table-row{display:table-row!important}.d-md-table-cell{display:table-cell!important}.d-md-flex{display:-ms-flexbox!important;display:flex!important}.d-md-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}}@media (min-width:992px){.d-lg-none{display:none!important}.d-lg-inline{display:inline!important}.d-lg-inline-block{display:inline-block!important}.d-lg-block{display:block!important}.d-lg-table{display:table!important}.d-lg-table-row{display:table-row!important}.d-lg-table-cell{display:table-cell!important}.d-lg-flex{display:-ms-flexbox!important;display:flex!important}.d-lg-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}}@media (min-width:1200px){.d-xl-none{display:none!important}.d-xl-inline{display:inline!important}.d-xl-inline-block{display:inline-block!important}.d-xl-block{display:block!important}.d-xl-table{display:table!important}.d-xl-table-row{display:table-row!important}.d-xl-table-cell{display:table-cell!important}.d-xl-flex{display:-ms-flexbox!important;display:flex!important}.d-xl-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}}@media print{.d-print-none{display:none!important}.d-print-inline{display:inline!important}.d-print-inline-block{display:inline-block!important}.d-print-block{display:block!important}.d-print-table{display:table!important}.d-print-table-row{display:table-row!important}.d-print-table-cell{display:table-cell!important}.d-print-flex{display:-ms-flexbox!important;display:flex!important}.d-print-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}}.embed-responsive{position:relative;display:block;width:100%;padding:0;overflow:hidden}.embed-responsive::before{display:block;content:""}.embed-responsive .embed-responsive-item,.embed-responsive embed,.embed-responsive iframe,.embed-responsive object,.embed-responsive video{position:absolute;top:0;bottom:0;left:0;width:100%;height:100%;border:0}.embed-responsive-21by9::before{padding-top:42.857143%}.embed-responsive-16by9::before{padding-top:56.25%}.embed-responsive-4by3::before{padding-top:75%}.embed-responsive-1by1::before{padding-top:100%}.flex-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-fill{-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-grow-0{-ms-flex-positive:0!important;flex-grow:0!important}.flex-grow-1{-ms-flex-positive:1!important;flex-grow:1!important}.flex-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-center{-ms-flex-align:center!important;align-items:center!important}.align-items-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}@media (min-width:576px){.flex-sm-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-sm-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-sm-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-sm-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-sm-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-sm-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-sm-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-sm-fill{-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-sm-grow-0{-ms-flex-positive:0!important;flex-grow:0!important}.flex-sm-grow-1{-ms-flex-positive:1!important;flex-grow:1!important}.flex-sm-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-sm-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-sm-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-sm-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-sm-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-sm-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-sm-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-sm-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-sm-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-sm-center{-ms-flex-align:center!important;align-items:center!important}.align-items-sm-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-sm-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-sm-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-sm-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-sm-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-sm-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-sm-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-sm-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-sm-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-sm-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-sm-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-sm-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-sm-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-sm-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}@media (min-width:768px){.flex-md-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-md-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-md-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-md-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-md-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-md-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-md-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-md-fill{-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-md-grow-0{-ms-flex-positive:0!important;flex-grow:0!important}.flex-md-grow-1{-ms-flex-positive:1!important;flex-grow:1!important}.flex-md-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-md-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-md-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-md-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-md-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-md-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-md-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-md-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-md-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-md-center{-ms-flex-align:center!important;align-items:center!important}.align-items-md-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-md-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-md-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-md-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-md-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-md-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-md-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-md-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-md-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-md-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-md-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-md-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-md-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-md-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}@media (min-width:992px){.flex-lg-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-lg-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-lg-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-lg-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-lg-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-lg-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-lg-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-lg-fill{-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-lg-grow-0{-ms-flex-positive:0!important;flex-grow:0!important}.flex-lg-grow-1{-ms-flex-positive:1!important;flex-grow:1!important}.flex-lg-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-lg-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-lg-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-lg-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-lg-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-lg-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-lg-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-lg-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-lg-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-lg-center{-ms-flex-align:center!important;align-items:center!important}.align-items-lg-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-lg-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-lg-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-lg-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-lg-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-lg-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-lg-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-lg-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-lg-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-lg-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-lg-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-lg-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-lg-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-lg-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}@media (min-width:1200px){.flex-xl-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-xl-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-xl-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-xl-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-xl-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-xl-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-xl-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-xl-fill{-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-xl-grow-0{-ms-flex-positive:0!important;flex-grow:0!important}.flex-xl-grow-1{-ms-flex-positive:1!important;flex-grow:1!important}.flex-xl-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-xl-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-xl-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-xl-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-xl-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-xl-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-xl-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-xl-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-xl-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-xl-center{-ms-flex-align:center!important;align-items:center!important}.align-items-xl-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-xl-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-xl-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-xl-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-xl-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-xl-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-xl-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-xl-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-xl-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-xl-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-xl-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-xl-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-xl-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-xl-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}.float-left{float:left!important}.float-right{float:right!important}.float-none{float:none!important}@media (min-width:576px){.float-sm-left{float:left!important}.float-sm-right{float:right!important}.float-sm-none{float:none!important}}@media (min-width:768px){.float-md-left{float:left!important}.float-md-right{float:right!important}.float-md-none{float:none!important}}@media (min-width:992px){.float-lg-left{float:left!important}.float-lg-right{float:right!important}.float-lg-none{float:none!important}}@media (min-width:1200px){.float-xl-left{float:left!important}.float-xl-right{float:right!important}.float-xl-none{float:none!important}}.position-static{position:static!important}.position-relative{position:relative!important}.position-absolute{position:absolute!important}.position-fixed{position:fixed!important}.position-sticky{position:-webkit-sticky!important;position:sticky!important}.fixed-top{position:fixed;top:0;right:0;left:0;z-index:1030}.fixed-bottom{position:fixed;right:0;bottom:0;left:0;z-index:1030}@supports ((position:-webkit-sticky) or (position:sticky)){.sticky-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}}.sr-only{position:absolute;width:1px;height:1px;padding:0;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;overflow:visible;clip:auto;white-space:normal}.shadow-sm{box-shadow:0 .125rem .25rem rgba(0,0,0,.075)!important}.shadow{box-shadow:0 .5rem 1rem rgba(0,0,0,.15)!important}.shadow-lg{box-shadow:0 1rem 3rem rgba(0,0,0,.175)!important}.shadow-none{box-shadow:none!important}.w-25{width:25%!important}.w-50{width:50%!important}.w-75{width:75%!important}.w-100{width:100%!important}.w-auto{width:auto!important}.h-25{height:25%!important}.h-50{height:50%!important}.h-75{height:75%!important}.h-100{height:100%!important}.h-auto{height:auto!important}.mw-100{max-width:100%!important}.mh-100{max-height:100%!important}.m-0{margin:0!important}.mt-0,.my-0{margin-top:0!important}.mr-0,.mx-0{margin-right:0!important}.mb-0,.my-0{margin-bottom:0!important}.ml-0,.mx-0{margin-left:0!important}.m-1{margin:.25rem!important}.mt-1,.my-1{margin-top:.25rem!important}.mr-1,.mx-1{margin-right:.25rem!important}.mb-1,.my-1{margin-bottom:.25rem!important}.ml-1,.mx-1{margin-left:.25rem!important}.m-2{margin:.5rem!important}.mt-2,.my-2{margin-top:.5rem!important}.mr-2,.mx-2{margin-right:.5rem!important}.mb-2,.my-2{margin-bottom:.5rem!important}.ml-2,.mx-2{margin-left:.5rem!important}.m-3{margin:1rem!important}.mt-3,.my-3{margin-top:1rem!important}.mr-3,.mx-3{margin-right:1rem!important}.mb-3,.my-3{margin-bottom:1rem!important}.ml-3,.mx-3{margin-left:1rem!important}.m-4{margin:1.5rem!important}.mt-4,.my-4{margin-top:1.5rem!important}.mr-4,.mx-4{margin-right:1.5rem!important}.mb-4,.my-4{margin-bottom:1.5rem!important}.ml-4,.mx-4{margin-left:1.5rem!important}.m-5{margin:3rem!important}.mt-5,.my-5{margin-top:3rem!important}.mr-5,.mx-5{margin-right:3rem!important}.mb-5,.my-5{margin-bottom:3rem!important}.ml-5,.mx-5{margin-left:3rem!important}.p-0{padding:0!important}.pt-0,.py-0{padding-top:0!important}.pr-0,.px-0{padding-right:0!important}.pb-0,.py-0{padding-bottom:0!important}.pl-0,.px-0{padding-left:0!important}.p-1{padding:.25rem!important}.pt-1,.py-1{padding-top:.25rem!important}.pr-1,.px-1{padding-right:.25rem!important}.pb-1,.py-1{padding-bottom:.25rem!important}.pl-1,.px-1{padding-left:.25rem!important}.p-2{padding:.5rem!important}.pt-2,.py-2{padding-top:.5rem!important}.pr-2,.px-2{padding-right:.5rem!important}.pb-2,.py-2{padding-bottom:.5rem!important}.pl-2,.px-2{padding-left:.5rem!important}.p-3{padding:1rem!important}.pt-3,.py-3{padding-top:1rem!important}.pr-3,.px-3{padding-right:1rem!important}.pb-3,.py-3{padding-bottom:1rem!important}.pl-3,.px-3{padding-left:1rem!important}.p-4{padding:1.5rem!important}.pt-4,.py-4{padding-top:1.5rem!important}.pr-4,.px-4{padding-right:1.5rem!important}.pb-4,.py-4{padding-bottom:1.5rem!important}.pl-4,.px-4{padding-left:1.5rem!important}.p-5{padding:3rem!important}.pt-5,.py-5{padding-top:3rem!important}.pr-5,.px-5{padding-right:3rem!important}.pb-5,.py-5{padding-bottom:3rem!important}.pl-5,.px-5{padding-left:3rem!important}.m-auto{margin:auto!important}.mt-auto,.my-auto{margin-top:auto!important}.mr-auto,.mx-auto{margin-right:auto!important}.mb-auto,.my-auto{margin-bottom:auto!important}.ml-auto,.mx-auto{margin-left:auto!important}@media (min-width:576px){.m-sm-0{margin:0!important}.mt-sm-0,.my-sm-0{margin-top:0!important}.mr-sm-0,.mx-sm-0{margin-right:0!important}.mb-sm-0,.my-sm-0{margin-bottom:0!important}.ml-sm-0,.mx-sm-0{margin-left:0!important}.m-sm-1{margin:.25rem!important}.mt-sm-1,.my-sm-1{margin-top:.25rem!important}.mr-sm-1,.mx-sm-1{margin-right:.25rem!important}.mb-sm-1,.my-sm-1{margin-bottom:.25rem!important}.ml-sm-1,.mx-sm-1{margin-left:.25rem!important}.m-sm-2{margin:.5rem!important}.mt-sm-2,.my-sm-2{margin-top:.5rem!important}.mr-sm-2,.mx-sm-2{margin-right:.5rem!important}.mb-sm-2,.my-sm-2{margin-bottom:.5rem!important}.ml-sm-2,.mx-sm-2{margin-left:.5rem!important}.m-sm-3{margin:1rem!important}.mt-sm-3,.my-sm-3{margin-top:1rem!important}.mr-sm-3,.mx-sm-3{margin-right:1rem!important}.mb-sm-3,.my-sm-3{margin-bottom:1rem!important}.ml-sm-3,.mx-sm-3{margin-left:1rem!important}.m-sm-4{margin:1.5rem!important}.mt-sm-4,.my-sm-4{margin-top:1.5rem!important}.mr-sm-4,.mx-sm-4{margin-right:1.5rem!important}.mb-sm-4,.my-sm-4{margin-bottom:1.5rem!important}.ml-sm-4,.mx-sm-4{margin-left:1.5rem!important}.m-sm-5{margin:3rem!important}.mt-sm-5,.my-sm-5{margin-top:3rem!important}.mr-sm-5,.mx-sm-5{margin-right:3rem!important}.mb-sm-5,.my-sm-5{margin-bottom:3rem!important}.ml-sm-5,.mx-sm-5{margin-left:3rem!important}.p-sm-0{padding:0!important}.pt-sm-0,.py-sm-0{padding-top:0!important}.pr-sm-0,.px-sm-0{padding-right:0!important}.pb-sm-0,.py-sm-0{padding-bottom:0!important}.pl-sm-0,.px-sm-0{padding-left:0!important}.p-sm-1{padding:.25rem!important}.pt-sm-1,.py-sm-1{padding-top:.25rem!important}.pr-sm-1,.px-sm-1{padding-right:.25rem!important}.pb-sm-1,.py-sm-1{padding-bottom:.25rem!important}.pl-sm-1,.px-sm-1{padding-left:.25rem!important}.p-sm-2{padding:.5rem!important}.pt-sm-2,.py-sm-2{padding-top:.5rem!important}.pr-sm-2,.px-sm-2{padding-right:.5rem!important}.pb-sm-2,.py-sm-2{padding-bottom:.5rem!important}.pl-sm-2,.px-sm-2{padding-left:.5rem!important}.p-sm-3{padding:1rem!important}.pt-sm-3,.py-sm-3{padding-top:1rem!important}.pr-sm-3,.px-sm-3{padding-right:1rem!important}.pb-sm-3,.py-sm-3{padding-bottom:1rem!important}.pl-sm-3,.px-sm-3{padding-left:1rem!important}.p-sm-4{padding:1.5rem!important}.pt-sm-4,.py-sm-4{padding-top:1.5rem!important}.pr-sm-4,.px-sm-4{padding-right:1.5rem!important}.pb-sm-4,.py-sm-4{padding-bottom:1.5rem!important}.pl-sm-4,.px-sm-4{padding-left:1.5rem!important}.p-sm-5{padding:3rem!important}.pt-sm-5,.py-sm-5{padding-top:3rem!important}.pr-sm-5,.px-sm-5{padding-right:3rem!important}.pb-sm-5,.py-sm-5{padding-bottom:3rem!important}.pl-sm-5,.px-sm-5{padding-left:3rem!important}.m-sm-auto{margin:auto!important}.mt-sm-auto,.my-sm-auto{margin-top:auto!important}.mr-sm-auto,.mx-sm-auto{margin-right:auto!important}.mb-sm-auto,.my-sm-auto{margin-bottom:auto!important}.ml-sm-auto,.mx-sm-auto{margin-left:auto!important}}@media (min-width:768px){.m-md-0{margin:0!important}.mt-md-0,.my-md-0{margin-top:0!important}.mr-md-0,.mx-md-0{margin-right:0!important}.mb-md-0,.my-md-0{margin-bottom:0!important}.ml-md-0,.mx-md-0{margin-left:0!important}.m-md-1{margin:.25rem!important}.mt-md-1,.my-md-1{margin-top:.25rem!important}.mr-md-1,.mx-md-1{margin-right:.25rem!important}.mb-md-1,.my-md-1{margin-bottom:.25rem!important}.ml-md-1,.mx-md-1{margin-left:.25rem!important}.m-md-2{margin:.5rem!important}.mt-md-2,.my-md-2{margin-top:.5rem!important}.mr-md-2,.mx-md-2{margin-right:.5rem!important}.mb-md-2,.my-md-2{margin-bottom:.5rem!important}.ml-md-2,.mx-md-2{margin-left:.5rem!important}.m-md-3{margin:1rem!important}.mt-md-3,.my-md-3{margin-top:1rem!important}.mr-md-3,.mx-md-3{margin-right:1rem!important}.mb-md-3,.my-md-3{margin-bottom:1rem!important}.ml-md-3,.mx-md-3{margin-left:1rem!important}.m-md-4{margin:1.5rem!important}.mt-md-4,.my-md-4{margin-top:1.5rem!important}.mr-md-4,.mx-md-4{margin-right:1.5rem!important}.mb-md-4,.my-md-4{margin-bottom:1.5rem!important}.ml-md-4,.mx-md-4{margin-left:1.5rem!important}.m-md-5{margin:3rem!important}.mt-md-5,.my-md-5{margin-top:3rem!important}.mr-md-5,.mx-md-5{margin-right:3rem!important}.mb-md-5,.my-md-5{margin-bottom:3rem!important}.ml-md-5,.mx-md-5{margin-left:3rem!important}.p-md-0{padding:0!important}.pt-md-0,.py-md-0{padding-top:0!important}.pr-md-0,.px-md-0{padding-right:0!important}.pb-md-0,.py-md-0{padding-bottom:0!important}.pl-md-0,.px-md-0{padding-left:0!important}.p-md-1{padding:.25rem!important}.pt-md-1,.py-md-1{padding-top:.25rem!important}.pr-md-1,.px-md-1{padding-right:.25rem!important}.pb-md-1,.py-md-1{padding-bottom:.25rem!important}.pl-md-1,.px-md-1{padding-left:.25rem!important}.p-md-2{padding:.5rem!important}.pt-md-2,.py-md-2{padding-top:.5rem!important}.pr-md-2,.px-md-2{padding-right:.5rem!important}.pb-md-2,.py-md-2{padding-bottom:.5rem!important}.pl-md-2,.px-md-2{padding-left:.5rem!important}.p-md-3{padding:1rem!important}.pt-md-3,.py-md-3{padding-top:1rem!important}.pr-md-3,.px-md-3{padding-right:1rem!important}.pb-md-3,.py-md-3{padding-bottom:1rem!important}.pl-md-3,.px-md-3{padding-left:1rem!important}.p-md-4{padding:1.5rem!important}.pt-md-4,.py-md-4{padding-top:1.5rem!important}.pr-md-4,.px-md-4{padding-right:1.5rem!important}.pb-md-4,.py-md-4{padding-bottom:1.5rem!important}.pl-md-4,.px-md-4{padding-left:1.5rem!important}.p-md-5{padding:3rem!important}.pt-md-5,.py-md-5{padding-top:3rem!important}.pr-md-5,.px-md-5{padding-right:3rem!important}.pb-md-5,.py-md-5{padding-bottom:3rem!important}.pl-md-5,.px-md-5{padding-left:3rem!important}.m-md-auto{margin:auto!important}.mt-md-auto,.my-md-auto{margin-top:auto!important}.mr-md-auto,.mx-md-auto{margin-right:auto!important}.mb-md-auto,.my-md-auto{margin-bottom:auto!important}.ml-md-auto,.mx-md-auto{margin-left:auto!important}}@media (min-width:992px){.m-lg-0{margin:0!important}.mt-lg-0,.my-lg-0{margin-top:0!important}.mr-lg-0,.mx-lg-0{margin-right:0!important}.mb-lg-0,.my-lg-0{margin-bottom:0!important}.ml-lg-0,.mx-lg-0{margin-left:0!important}.m-lg-1{margin:.25rem!important}.mt-lg-1,.my-lg-1{margin-top:.25rem!important}.mr-lg-1,.mx-lg-1{margin-right:.25rem!important}.mb-lg-1,.my-lg-1{margin-bottom:.25rem!important}.ml-lg-1,.mx-lg-1{margin-left:.25rem!important}.m-lg-2{margin:.5rem!important}.mt-lg-2,.my-lg-2{margin-top:.5rem!important}.mr-lg-2,.mx-lg-2{margin-right:.5rem!important}.mb-lg-2,.my-lg-2{margin-bottom:.5rem!important}.ml-lg-2,.mx-lg-2{margin-left:.5rem!important}.m-lg-3{margin:1rem!important}.mt-lg-3,.my-lg-3{margin-top:1rem!important}.mr-lg-3,.mx-lg-3{margin-right:1rem!important}.mb-lg-3,.my-lg-3{margin-bottom:1rem!important}.ml-lg-3,.mx-lg-3{margin-left:1rem!important}.m-lg-4{margin:1.5rem!important}.mt-lg-4,.my-lg-4{margin-top:1.5rem!important}.mr-lg-4,.mx-lg-4{margin-right:1.5rem!important}.mb-lg-4,.my-lg-4{margin-bottom:1.5rem!important}.ml-lg-4,.mx-lg-4{margin-left:1.5rem!important}.m-lg-5{margin:3rem!important}.mt-lg-5,.my-lg-5{margin-top:3rem!important}.mr-lg-5,.mx-lg-5{margin-right:3rem!important}.mb-lg-5,.my-lg-5{margin-bottom:3rem!important}.ml-lg-5,.mx-lg-5{margin-left:3rem!important}.p-lg-0{padding:0!important}.pt-lg-0,.py-lg-0{padding-top:0!important}.pr-lg-0,.px-lg-0{padding-right:0!important}.pb-lg-0,.py-lg-0{padding-bottom:0!important}.pl-lg-0,.px-lg-0{padding-left:0!important}.p-lg-1{padding:.25rem!important}.pt-lg-1,.py-lg-1{padding-top:.25rem!important}.pr-lg-1,.px-lg-1{padding-right:.25rem!important}.pb-lg-1,.py-lg-1{padding-bottom:.25rem!important}.pl-lg-1,.px-lg-1{padding-left:.25rem!important}.p-lg-2{padding:.5rem!important}.pt-lg-2,.py-lg-2{padding-top:.5rem!important}.pr-lg-2,.px-lg-2{padding-right:.5rem!important}.pb-lg-2,.py-lg-2{padding-bottom:.5rem!important}.pl-lg-2,.px-lg-2{padding-left:.5rem!important}.p-lg-3{padding:1rem!important}.pt-lg-3,.py-lg-3{padding-top:1rem!important}.pr-lg-3,.px-lg-3{padding-right:1rem!important}.pb-lg-3,.py-lg-3{padding-bottom:1rem!important}.pl-lg-3,.px-lg-3{padding-left:1rem!important}.p-lg-4{padding:1.5rem!important}.pt-lg-4,.py-lg-4{padding-top:1.5rem!important}.pr-lg-4,.px-lg-4{padding-right:1.5rem!important}.pb-lg-4,.py-lg-4{padding-bottom:1.5rem!important}.pl-lg-4,.px-lg-4{padding-left:1.5rem!important}.p-lg-5{padding:3rem!important}.pt-lg-5,.py-lg-5{padding-top:3rem!important}.pr-lg-5,.px-lg-5{padding-right:3rem!important}.pb-lg-5,.py-lg-5{padding-bottom:3rem!important}.pl-lg-5,.px-lg-5{padding-left:3rem!important}.m-lg-auto{margin:auto!important}.mt-lg-auto,.my-lg-auto{margin-top:auto!important}.mr-lg-auto,.mx-lg-auto{margin-right:auto!important}.mb-lg-auto,.my-lg-auto{margin-bottom:auto!important}.ml-lg-auto,.mx-lg-auto{margin-left:auto!important}}@media (min-width:1200px){.m-xl-0{margin:0!important}.mt-xl-0,.my-xl-0{margin-top:0!important}.mr-xl-0,.mx-xl-0{margin-right:0!important}.mb-xl-0,.my-xl-0{margin-bottom:0!important}.ml-xl-0,.mx-xl-0{margin-left:0!important}.m-xl-1{margin:.25rem!important}.mt-xl-1,.my-xl-1{margin-top:.25rem!important}.mr-xl-1,.mx-xl-1{margin-right:.25rem!important}.mb-xl-1,.my-xl-1{margin-bottom:.25rem!important}.ml-xl-1,.mx-xl-1{margin-left:.25rem!important}.m-xl-2{margin:.5rem!important}.mt-xl-2,.my-xl-2{margin-top:.5rem!important}.mr-xl-2,.mx-xl-2{margin-right:.5rem!important}.mb-xl-2,.my-xl-2{margin-bottom:.5rem!important}.ml-xl-2,.mx-xl-2{margin-left:.5rem!important}.m-xl-3{margin:1rem!important}.mt-xl-3,.my-xl-3{margin-top:1rem!important}.mr-xl-3,.mx-xl-3{margin-right:1rem!important}.mb-xl-3,.my-xl-3{margin-bottom:1rem!important}.ml-xl-3,.mx-xl-3{margin-left:1rem!important}.m-xl-4{margin:1.5rem!important}.mt-xl-4,.my-xl-4{margin-top:1.5rem!important}.mr-xl-4,.mx-xl-4{margin-right:1.5rem!important}.mb-xl-4,.my-xl-4{margin-bottom:1.5rem!important}.ml-xl-4,.mx-xl-4{margin-left:1.5rem!important}.m-xl-5{margin:3rem!important}.mt-xl-5,.my-xl-5{margin-top:3rem!important}.mr-xl-5,.mx-xl-5{margin-right:3rem!important}.mb-xl-5,.my-xl-5{margin-bottom:3rem!important}.ml-xl-5,.mx-xl-5{margin-left:3rem!important}.p-xl-0{padding:0!important}.pt-xl-0,.py-xl-0{padding-top:0!important}.pr-xl-0,.px-xl-0{padding-right:0!important}.pb-xl-0,.py-xl-0{padding-bottom:0!important}.pl-xl-0,.px-xl-0{padding-left:0!important}.p-xl-1{padding:.25rem!important}.pt-xl-1,.py-xl-1{padding-top:.25rem!important}.pr-xl-1,.px-xl-1{padding-right:.25rem!important}.pb-xl-1,.py-xl-1{padding-bottom:.25rem!important}.pl-xl-1,.px-xl-1{padding-left:.25rem!important}.p-xl-2{padding:.5rem!important}.pt-xl-2,.py-xl-2{padding-top:.5rem!important}.pr-xl-2,.px-xl-2{padding-right:.5rem!important}.pb-xl-2,.py-xl-2{padding-bottom:.5rem!important}.pl-xl-2,.px-xl-2{padding-left:.5rem!important}.p-xl-3{padding:1rem!important}.pt-xl-3,.py-xl-3{padding-top:1rem!important}.pr-xl-3,.px-xl-3{padding-right:1rem!important}.pb-xl-3,.py-xl-3{padding-bottom:1rem!important}.pl-xl-3,.px-xl-3{padding-left:1rem!important}.p-xl-4{padding:1.5rem!important}.pt-xl-4,.py-xl-4{padding-top:1.5rem!important}.pr-xl-4,.px-xl-4{padding-right:1.5rem!important}.pb-xl-4,.py-xl-4{padding-bottom:1.5rem!important}.pl-xl-4,.px-xl-4{padding-left:1.5rem!important}.p-xl-5{padding:3rem!important}.pt-xl-5,.py-xl-5{padding-top:3rem!important}.pr-xl-5,.px-xl-5{padding-right:3rem!important}.pb-xl-5,.py-xl-5{padding-bottom:3rem!important}.pl-xl-5,.px-xl-5{padding-left:3rem!important}.m-xl-auto{margin:auto!important}.mt-xl-auto,.my-xl-auto{margin-top:auto!important}.mr-xl-auto,.mx-xl-auto{margin-right:auto!important}.mb-xl-auto,.my-xl-auto{margin-bottom:auto!important}.ml-xl-auto,.mx-xl-auto{margin-left:auto!important}}.text-monospace{font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace}.text-justify{text-align:justify!important}.text-nowrap{white-space:nowrap!important}.text-truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.text-left{text-align:left!important}.text-right{text-align:right!important}.text-center{text-align:center!important}@media (min-width:576px){.text-sm-left{text-align:left!important}.text-sm-right{text-align:right!important}.text-sm-center{text-align:center!important}}@media (min-width:768px){.text-md-left{text-align:left!important}.text-md-right{text-align:right!important}.text-md-center{text-align:center!important}}@media (min-width:992px){.text-lg-left{text-align:left!important}.text-lg-right{text-align:right!important}.text-lg-center{text-align:center!important}}@media (min-width:1200px){.text-xl-left{text-align:left!important}.text-xl-right{text-align:right!important}.text-xl-center{text-align:center!important}}.text-lowercase{text-transform:lowercase!important}.text-uppercase{text-transform:uppercase!important}.text-capitalize{text-transform:capitalize!important}.font-weight-light{font-weight:300!important}.font-weight-normal{font-weight:400!important}.font-weight-bold{font-weight:700!important}.font-italic{font-style:italic!important}.text-white{color:#fff!important}.text-primary{color:#007bff!important}a.text-primary:focus,a.text-primary:hover{color:#0062cc!important}.text-secondary{color:#6c757d!important}a.text-secondary:focus,a.text-secondary:hover{color:#545b62!important}.text-success{color:#28a745!important}a.text-success:focus,a.text-success:hover{color:#1e7e34!important}.text-info{color:#17a2b8!important}a.text-info:focus,a.text-info:hover{color:#117a8b!important}.text-warning{color:#ffc107!important}a.text-warning:focus,a.text-warning:hover{color:#d39e00!important}.text-danger{color:#dc3545!important}a.text-danger:focus,a.text-danger:hover{color:#bd2130!important}.text-light{color:#f8f9fa!important}a.text-light:focus,a.text-light:hover{color:#dae0e5!important}.text-dark{color:#343a40!important}a.text-dark:focus,a.text-dark:hover{color:#1d2124!important}.text-body{color:#212529!important}.text-muted{color:#6c757d!important}.text-black-50{color:rgba(0,0,0,.5)!important}.text-white-50{color:rgba(255,255,255,.5)!important}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.visible{visibility:visible!important}.invisible{visibility:hidden!important}@media print{*,::after,::before{text-shadow:none!important;box-shadow:none!important}a:not(.btn){text-decoration:underline}abbr[title]::after{content:" (" attr(title) ")"}pre{white-space:pre-wrap!important}blockquote,pre{border:1px solid #adb5bd;page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}h2,h3,p{orphans:3;widows:3}h2,h3{page-break-after:avoid}@page{size:a3}body{min-width:992px!important}.container{min-width:992px!important}.navbar{display:none}.badge{border:1px solid #000}.table{border-collapse:collapse!important}.table td,.table th{background-color:#fff!important}.table-bordered td,.table-bordered th{border:1px solid #dee2e6!important}.table-dark{color:inherit}.table-dark tbody+tbody,.table-dark td,.table-dark th,.table-dark thead th{border-color:#dee2e6}.table .thead-dark th{color:inherit;border-color:#dee2e6}}
/*# sourceMappingURL=/19/dist/css/bootstrap.min.css.map */
@charset "utf-8";
/* --------- UPDATE INFO --------------------------------
	
Created on: June 6, 2018 (D-Day)
Cretaed by: Peter Gurry, www.gurrydesign.com

--------- CONTENTS --------------------------------------

	============================
	=1: Basic Styles & Structure
	============================
	=2: Header
	----------------------------
		=2a: Navigation
		=2b: Carousel & banners
	============================
	=3: Content
	----------------------------
		=3a: Typography
		=3b: Lists
		=3c: Images
		=3d: Links & Buttons
		=3e: Forms
		=3f: Tables
	============================
	=4: Footers
	============================
	=5: Size-specific Styles
	============================
	=6: Misc
	============================
		
--------------------------------------------------------- */

/* @import url("https://use.typekit.net/nez3jru.css"); */

body {
    font-family: "proxima-nova-condensed", "arial narrow", sans-serif;
    padding-top: 0;
    padding-bottom: 0;
    color: #58544f;
    position: relative;
    background: url(https://www.lvalive.com/cf/19/images/bg_main.jpg) repeat;
    background-size: 475px 475px;
    font-variant-numeric: oldstyle-nums;
    -moz-font-feature-settings: "onum";
    -webkit-font-feature-settings: "onum";
    font-feature-settings: "onum";
}

@media (max-width: 768px) {
body {
    background: url(https://www.lvalive.com/cf/19/images/bg_main-450.jpg) repeat;
}
}


/*	=1: Basic Styles & Structure
=============================================== */

div.contact .body-content,
div.directions .body-content,
.navbar-brand,
.reg-table h3,
footer,
.pagination,
h3.icon,
.metadata,
.filters,
form,
.reg-progress-bar {
    /* proportional lining numerals */
    font-variant-numeric: proportional-nums;
    -moz-font-feature-settings: "pnum";
    -webkit-font-feature-settings: "pnum";
    font-feature-settings: "pnum";
}
ol {
    /* tabular lining numerals */
    font-variant-numeric: tabular-nums;
    -moz-font-feature-settings: "tnum";
    -webkit-font-feature-settings: "tnum";
    font-feature-settings: "tnum";
}

/*	=2: Header
=============================================== */

a.navbar-brand img#logo-blockhouse {
    display: none;
}

a.navbar-brand {
    font: 30px/38px Gin, impact;
    text-align: center;
    color: #fff;
    background-size: 100% auto;
    padding: 2px 25px 13px;
    margin: 0 0 -10px -5px;
    /* -8px makes up for the margin in the .png background image */
    text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.7);
}
body.webp a.navbar-brand {
    background: url(https://www.lvalive.com/cf/19/images/bg_main_logo.webp) no-repeat bottom center;   
}
body.no-webp a.navbar-brand {
    background: url(https://www.lvalive.com/cf/19/images/bg_main_logo.png) no-repeat bottom center;   
}

a.navbar-brand:hover {
    color: #7d8560 !important;
}

.navbar-brand .logo-camp {
    display: none;
}

.navbar-brand .tagline {
    font: 9px/12px termina, sans-serif;
    color: #7d8560;
    text-transform: uppercase;
    letter-spacing: .1em;
    display: none;
    text-shadow: none;
}

.navbar-brand .est-date {
    display: none;
}


/*	=2a: Navigation
----------------------------------------------- */

.navbar {
    background: linear-gradient(#2a2a2a, #1a1a1a);
    border-top: 1px solid #000;
    border-bottom: 1px solid #000;
    box-shadow: 0 2px 3px rgba(0, 0, 0, 0.4);
    padding-top: 0;
    padding-bottom: 0;
}

.navbar-dark .navbar-nav .nav-link {
    color: #fff;
    font-size: 18px;
    padding-left: .7rem;
    padding-right: .7rem;
    transition: 0s;
    /* set as 0 because dropdowns appear with no transition currently */
    font-family: "proxima-nova", sans-serif;
}

.navbar-dark .navbar-nav .nav-link:hover {
    transition: 0s;
    /* set as 0 because dropdowns appear with no transition currently */
}

.navbar-dark .navbar-nav .nav-item:last-child .nav-link,
.navbar-nav.social-links .nav-link {
    background: none;
}

.navbar-dark .navbar-nav .active > .nav-link,
.navbar-dark .navbar-nav .nav-link.active {
    color: #ff931e;
    font-weight: bold;
}

.navbar-dark .navbar-nav .nav-link:focus,
.navbar-dark .navbar-nav .nav-link:hover {
    color: #ff931e;
}

.dropdown-toggle::after {
    opacity: 0.4;
    vertical-align: .1em;
    border-top: .3em solid;
    border-right: .2em solid transparent;
    border-bottom: 0;
    border-left: .2em solid transparent;
}

/* search box styles */

.nav-link i.fa-search {
    /* search icon size */
    font-size: 75%;
}

.dropdown-menu.search-dropdown {
    padding: 15px;
}

.search-dropdown .form-control {
    border-color: #222;
    border-right: none;
    border-top-right-radius: 0;
    border-bottom-right-radius: 0;
    width: 70%;
}

.search-dropdown .form-control:active,
.search-dropdown .form-control:focus {
    width: auto;
    border-color: #2e3429;
}

.search-dropdown button {
    border-top-left-radius: 0;
    border-bottom-left-radius: 0;
    width: 30%;
}

.dropdown-menu {
    background: linear-gradient(#333, #353535);
    box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.15), 0 0 0px 1px rgba(0, 0, 0, 0.2);
    border-top: 1px solid #313131;
    border-bottom: 1px solid #3a3a3a;
}


a.dropdown-item,
a:visited.dropdown-item {
    color: #eee;
    -webkit-transition: all .3s;
    transition: all .3s;
    transition-timing-function: ease;
    font-family: "proxima-nova";
}

.dropdown-item:focus,
.dropdown-item:hover {
    background-color: #b5baa1;
    color: #2e3429;
    box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 -1px 0 #a5aa91, 0 1px 0 #a5aa91;
    text-shadow: 0 1px 0 rgba(255, 255, 255, 0.3);
    -webkit-transition: all .3s;
    transition: all .3s;
    transition-timing-function: ease;
}

.dropdown-item.active,
.dropdown-item:active {
    background: #000;
    cursor: default;
}

.dropdown-header {
    font-family: marydale, sans-serif;
    color: #ff931e;
    font-size: 18px;
}

.dropdown-divider {
    border-top: 1px solid #272727;
    box-shadow: 0 1px 0 rgba(255, 255, 255, .05);
}

/* social media links */

.navbar-nav.social-links {
    display: none;
    /* hides social links on dropdown nav menu on smaller screens */
}

.navbar .navbar-nav.social-links .nav-link {
    font-size: 16px;
    padding-left: .3rem;
    padding-right: .3rem;
    color: #b5baa3;
    background: none !important;
    transition: .3s;
    /* to offset the 0 set above */
}

.navbar .social-links a:hover i.fa-facebook {
    color: #1877f2;
}

.navbar .social-links a:hover i.fa-twitter {
    color: #1da1f2;
}

.navbar .social-links a:hover i.fa-vimeo-v {
    color: #1ab7ea;
}

.navbar .social-links a:hover i.fa-instagram {
    color: #c32aa3;
}

.navbar .social-links a:hover i.fa-pinterest {
    color: #bd081c;
}

.navbar-collapse .navbar-nav {
    padding: 10px 0;
}

/* breadcrumbs */

.breadcrumb-nav {
    padding: 5px 0;
    box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), inset 0 -1px 0 rgba(0, 0, 0, 0.2), 0 1px 2px rgba(0, 0, 0, 0.15), 0 -1px 2px rgba(0, 0, 0, 0.2);
    background: url(https://www.lvalive.com/cf/19/images/bg_light_green-q90.webp) repeat;
    background-size: 130px 130px;
    text-shadow: 0 1px 0 rgba(255, 255, 255, 0.3);
    position: relative;
    z-index: 2;
}


.breadcrumb {
    margin-bottom: 0;
    background: none;
    padding: 4px 0 2px;
    margin-left: 15px;
    font-size: 14px;
}

.breadcrumb-item a,
.breadcrumb-item a:visited {
    color: #2e3429;
    text-decoration: underline;
}

.breadcrumb-item a:hover {
    color: #1b1e19;
    text-decoration: none;
}

.breadcrumb-item.active {
    color: #2e3429;
}

.breadcrumb-item + .breadcrumb-item::before {
    content: " › ";
    color: #556249;
}

.breadcrumb-nav p.share-links {
    padding: 10px 0 6px;
    margin-bottom: 0;
    color: #2e3429;
    margin-right: 15px;
}

.breadcrumb-nav p.share-links a,
.breadcrumb-nav p.share-links a:visited {
    border: 1px solid #2e3429;
    border-radius: 15px;
    height: 24px;
    width: 24px;
    margin-left: 3px;
    display: inline-block;
    text-align: center;
    color: #2e3429;
}

.breadcrumb-nav p.share-links a:hover {
    color: #fff;
    background: #2e3429;
}

.breadcrumb-nav p.share-links a:hover i {
    text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.3);
}

.breadcrumb-nav p.share-links a.fb:hover {
    border-color: #3b5998;
    background: #3b5998;
}

.breadcrumb-nav p.share-links a.tw:hover {
    border-color: #1da1f2;
    background: #1da1f2;
}

.breadcrumb-nav p.share-links a.pt:hover {
    border-color: #bd081c;
    background: #bd081c;
}
.serve .nav-tabs {
	border-bottom: none;
	margin:30px 0 -39px;
}
.nav-tabs .nav-link {
	border-color: #c2b8b5;
	font-weight: bold;
}
.nav-tabs .nav-link:focus, .nav-tabs .nav-link:hover {
	background: linear-gradient(#ffffff, #e8e3dc);
    border-color: #c2b8b5 #c2b8b5 #c2b8b5;
    box-shadow: 0 1px 0 #fff;
}
.nav-tabs .nav-item.show .nav-link, .nav-tabs .nav-link.active {
	background: #e8e3dc;
    border-color: #c2b8b5 #c2b8b5 #e8e3dc;
    box-shadow: 0 1px 0 #e8e3dc, inset 0 1px 1px #fff;
    text-shadow: 0 1px 0 #fff;
}
.nav-tabs .nav-link i {
	margin-right: 5px;
	opacity: 0.6;
}
.nav-tabs .nav-link.active i {
	opacity: 1;
}
.serve.adult .nav-tabs .nav-link {
	padding: 0.3rem 0.5rem .2rem;
	font-weight: normal;
}
.serve.adult .nav-tabs .nav-link i {
	display: none;
}

/*	=2b: Carousel & banners
----------------------------------------------- */

/* Carousel base class */

.carousel {
    margin-bottom: 0;
}

/* Since positioning the image, we need to help out the caption */

.carousel-caption {
    bottom: 0rem;
    z-index: 10;
    left: 0;
    right: 0;
    background: linear-gradient(transparent, rgba(0, 0, 0, 0.6));
    box-shadow: inset 0 -4px 1px rgba(0, 0, 0, 0.1);
}
.light-bg .carousel-caption {
    background: linear-gradient(transparent, rgba(0, 0, 0, 0.1));
    box-shadow: inset 0 -1px 1px rgba(0, 0, 0, 0.25);
}

.carousel-caption2 {
    z-index: 10;
    top: 80px;
    position: relative;
    display: block;
}
.carousel-caption2 h3 {
    font-size: 100%;
}
@media (max-width: 768px) {
.carousel-caption2 h3 {
    font-size: 12px;
}
}


#home .carousel-caption p {
    margin-bottom: 30px;
}

.body-content .carousel-caption p {
    padding: 15px 35px 5px;
    text-shadow: 0 1px 3px rgba(0, 0, 0, 0.8);
    line-height: 1.2em;
}

div.history .carousel-indicators {
    margin-bottom: 12px;
}

div.history .carousel-caption {
    padding: 30px 0 12px;
    line-height: 1em;
    background: linear-gradient(transparent, rgba(0, 0, 0, 0.75));
}

div.history .carousel-caption p {
    opacity: 1;
    letter-spacing: 0.03em;
    padding: 0 15px 0;
    text-shadow: 0 1px 3px rgba(0, 0, 0, 0.8);
}

.carousel-control-next,
.carousel-control-prev,
.carousel-control-next:focus,
.carousel-control-prev:focus {
    background: linear-gradient(transparent 60%, rgba(0, 0, 0, 1));
    opacity: 0.5;
}

.carousel-control-next:hover,
.carousel-control-prev:hover {
    background: rgba(0, 0, 0, 1);
    opacity: 0.5;
}

/* Declare heights because of positioning of img element */

#home .carousel-item {
    height: 20rem;
    background-color: #777;
}

#home .carousel-item img {
    position: absolute;
    top: 0;
    left: 0;
    min-height: 100%;
    height: 20rem;
}

/* Center align the text within the three columns below the carousel */

.marketing .col-lg-4 {
    margin-bottom: 1.5rem;
    text-align: center;
}

.marketing h2 {
    font-weight: 400;
}

.marketing .col-lg-4 p {
    margin-right: .75rem;
    margin-left: .75rem;
}

.featurette-divider {
    margin: 5rem 0;
    /* Space out the Bootstrap <hr> more */
}

/* Thin out the marketing headings */

.featurette-heading {
    font-weight: 300;
    line-height: 1;
    letter-spacing: -.05rem;
}

.carousel-indicators {
    bottom: 0;
}

.carousel-indicators li {
    height: 4px;
    -webkit-transition: all .3s;
    transition: all .3s;
    transition-timing-function: ease;
}

.carousel-indicators li:hover {
    -webkit-transition: all .3s;
    transition: all .3s;
    transition-timing-function: ease;
}

#home .carousel-indicators li {
    width: 14px;
    height: 14px;
    border-radius: 15px;
    border: 2px solid rgba(255, 255, 255, 0.6);
    background: none;
}

#home .carousel-indicators .active {
    background: #fff;
}

#home .carousel-indicators li:hover {
    border: 7px solid rgba(255, 255, 255, .6);
}

/* banner */

#banner {
    height: min(48vw, max(525px, 50vh));
    margin-top: 50px;
    width: auto;
    overflow: hidden;
    position: relative;
}

#banner img {
    width: max(650px, 100%);
    position: absolute;
    top: 50%;
    left: 50%;
    transform: translate(-50%, -50%);
}

.about #banner {
    margin: 50px 0 0;
    padding: 100px 0 10px;
    height: auto;
    background-size: contain;
    overflow: visible; /* for the uncle johnnie photo */
}

#cb-about.about.summer #banner {
    background: #091004 url(https://www.lvalive.com/cf/19/images/bg_about_summer-800-c70.jpg) no-repeat;
}
@media (min-width: 600px) {
#cb-about.about.summer #banner {
    background: #091004 url(https://www.lvalive.com/cf/19/images/bg_about_summer-c70.jpg) no-repeat;
    background-size: cover;
}
}


#cb-about.about.fall #banner {
    background: #0a0b00 url(https://www.lvalive.com/cf/19/images/bg_about_fall-800-q60.webp) no-repeat;
}
@media (min-width: 500px) {
#cb-about.about.fall #banner {
    background: #0a0b00 url(https://www.lvalive.com/cf/19/images/bg_about_fall-q55.webp) no-repeat;
    background-size: cover;
}
}


#cb-about.about.winter #banner {
    background: #dcd5dd url(https://www.lvalive.com/cf/19/images/bg_about_winterc-40.jpg) no-repeat;
    background-size: cover;
}

.about.activities-facilities:not(.winter):not(.fall) #banner {
    background: #091004 url("https://www.lvalive.com/cf/19/images/bg_about_summer_esballfield-c70.jpg") no-repeat;
    background-size: cover;
}
.about.activities-facilities.fall #banner {
    background: #ffffff url("https://www.lvalive.com/cf/19/images/bg_about_fall_aerial-1000-q75.webp") no-repeat;
    background-size: cover;
}
@media (min-width: 600px) {
.about.activities-facilities.fall #banner {
    background: #ffffff url("https://www.lvalive.com/cf/19/images/bg_about_fall_aerial.jpg") no-repeat;
    background-size: cover;
}
}
.about.activities-facilities.winter #banner {
    background: #d1d5e1 no-repeat;
    background-size: cover;
    background-position: center;
}

.about.activities-facilities.winter #banner {
    background-image: url("https://www.lvalive.com/cf/19/images/bg_activities_winter1111-c50.jpg");
}

body.webp div.history #banner {
    padding-top: 40%;
    background: #091004 url(https://www.lvalive.com/cf/19/images/bg_history_lake.webp) no-repeat;
    background-position: top center;
}
body.no-webp div.history #banner {
    padding-top: 40%;
    background: #091004 url(https://www.lvalive.com/cf/19/images/bg_history_lake.jpg) no-repeat;
    background-position: top center;
}

/*	=3: Content
=============================================== */

/* general styles */

.top-border-fade {
    padding: 40px 15px 0;
    background: linear-gradient(#e8e3dc, #ffffff);
    border-top: 1px solid #fff;
    box-shadow: 0 -1px 0 #c2b8b5;
    margin: 40px -15px 0;
}

.row.top-border-fade {
    padding-left: 0;
    padding-right: 0;
}

/* homepage */

.home-about {
    padding: 20px 0;
    border-bottom: 1px solid rgba(255, 255, 255, 0.7);
    box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), inset 0 -1px 0 rgba(0, 0, 0, 0.2);
    background: url(https://www.lvalive.com/cf/19/images/bg_light_green-q90.webp) repeat;
    background-size: 130px 130px;
}
.winter .home-about {
	background-image: url(https://www.lvalive.com/cf/19/images/bg_blue.jpg);
}

#home .registration {
    padding: 40px 0 0;
}

.reg-table {
    background: #fff;
    box-shadow: 0 1px 3px rgba(0, 0, 0, 0.2);
    border: 1px solid #c2b8b5;
    padding: 10px;
    margin-bottom: 30px;
}
@media (min-width: 576px) {
.reg-table {
    padding: 20px;
}
}

.card .reg-table {
    /* for the reg tables on the account pages */
    box-shadow: none;
    border: none;
}

.schedule .reg-table {
    border: 1px solid #c2b8b5;
    box-shadow: 0 1px 2px rgba(0, 0, 0, 0.1);
}

#home .reg-table {
    background: linear-gradient(#e8e3dc, #ffffff);
}

.reg-table .info {
    background: #ece7e0;
    border: 1px solid #fff;
    border-top-color: #c2b8b5;
    box-shadow: inset 0 1px 0 #fff;
    margin: 20px -20px -20px;
    padding: 15px 20px;
}

.reg-open-message {
    font-size: calc(0.9vw * var(--sv));
}

#home .reg-table .info {
    padding: 15px 0;
}

#twitter-widget-0 {
    box-shadow: 0 1px 3px rgba(0, 0, 0, 0.2);
    border: 1px solid #c2b8b5;
    border-radius: 5px;
}

.activities {
    background: url(https://www.lvalive.com/cf/19/images/bg_activities_water.jpg) no-repeat center center;
    background-size: cover;
    margin: 50px -15px;
}

.activities.spring {
    background: url(https://www.lvalive.com/cf/19/images/bg_activities_ferns.jpg) no-repeat;
    background-size: cover;
}

.activities.fall {
    background: url(https://www.lvalive.com/cf/19/images/bg_activities_leaves-q55.webp) no-repeat;
    background-size: cover;
}
@media (max-width: 900px) {
.activities.fall {
    background: url(https://www.lvalive.com/cf/19/images/bg_activities_leaves-900-q60.webp) no-repeat;
    background-size: cover;
}
}

.activities.winter {
    background: url(https://www.lvalive.com/cf/19/images/bg_activities_snow.jpg) no-repeat;
    background-size: cover;
}

#home .activities {
    margin: 50px 0;
}

#home .current-info img.pic-of-the-day {
    border: 5px solid #fff;
    box-shadow: 0 1px 3px rgba(0, 0, 0, 0.2);
    margin-bottom: 25px;
}

.video-frame div {
    /* selects only the iframe with a vimeo src */
    border: 5px solid #fff;
    background: #fff;
    box-shadow: 0 1px 3px rgba(0, 0, 0, 0.2);
}

#home .video > div div {
    /* padding for the <div> around the homepage video */
    margin-bottom: 25px;
}

.home-news {
    margin-bottom: 25px;
}

.home-news img {
    max-width: 100%;
}

#weatherWidget {
    font-family: "proxima-nova-condensed" !important;
}

/* about page */
#cb-about.about .history {
    background: #000;
}

#cb-about.about .story {
    margin-bottom: 25px;
}
.about.activities-facilities .story {
    margin-bottom: 0;
}

.about .activity-info, 
.activities-facilities .activities-facilities-info {
    background: #111 url(https://www.lvalive.com/cf/19/images/bg_about_activities-800-c80.jpg) no-repeat center top;
    background-size: cover;
    padding: 20px 0;
    box-shadow: inset 0 -1px 3px rgba(0, 0, 0, 0.3), inset 0 1px 0 rgba(255, 255, 255, 0.15);
}
@media (min-width: 740px) {
.about .activity-info, 
.activities-facilities .activities-facilities-info {
    background: #111 url(https://www.lvalive.com/cf/19/images/bg_about_activities-c60.jpg) no-repeat center top;
    background-size: cover;
    padding: 20px 0;
    box-shadow: inset 0 -1px 3px rgba(0, 0, 0, 0.3), inset 0 1px 0 rgba(255, 255, 255, 0.15);
}
}


.about.fall .activity-info {
    background: url(https://www.lvalive.com/cf/19/images/bg_about_activities_fall-900-q60.webp) no-repeat center top;
    background-size: cover;
    box-shadow: inset 0 -1px 3px rgba(0, 0, 0, 0.1), inset 0 1px 0 rgba(255, 255, 255, 0.5), 0 -1px 3px rgba(0, 0, 0, 0.05);
}
@media (min-width: 600px) {
.about.fall .activity-info {
    background: url(https://www.lvalive.com/cf/19/images/bg_about_activities_fall.jpg) no-repeat center top;
    background-size: cover;
}
}
.about.winter .activity-info {
    background:  #E9E7EA no-repeat center top;
    background-size: cover;
    box-shadow: inset 0 -1px 3px rgba(0, 0, 0, 0.1), inset 0 1px 0 rgba(255, 255, 255, 0.5), 0 -1px 3px rgba(0, 0, 0, 0.05);
}

body.no-webp .about.winter .activity-info {
    background-image: url(https://www.lvalive.com/cf/19/images/bg_about_activities_winter.jpg);
}
body.webp .about.winter .activity-info {
    background-image: url(https://www.lvalive.com/cf/19/images/bg_about_activities_winter.webp);
}

.about .more-about-info {
    background: #f1e8d6;
    padding: 20px 0;
    box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.3);
}
.about.winter .more-about-info {
    background: #cececf;
}
.activities-facilities .activities-facilities-info {
    background: #111;
}

/* history page */
body.no-webp div.history .founder-info {
    background-image: url(https://www.lvalive.com/cf/19/images/bg_history_johnnie.jpg), url(https://www.lvalive.com/cf/19/images/bg_history.jpg);
    background-repeat: no-repeat, repeat;
    background-size: 100%, auto;
    padding: 20px 0;
    box-shadow: inset 0 -1px 3px rgba(0, 0, 0, 0.3), inset 0 1px 0 rgba(255, 255, 255, 0.15);
}

body.webp div.history .founder-info {
    background-image: url(https://www.lvalive.com/cf/19/images/bg_history_johnnie.webp), url(https://www.lvalive.com/cf/19/images/bg_history.jpg);
    background-repeat: no-repeat, repeat;
    background-size: 100%, auto;
    padding: 20px 0;
    box-shadow: inset 0 -1px 3px rgba(0, 0, 0, 0.3), inset 0 1px 0 rgba(255, 255, 255, 0.15);
}

div.history .book-info {
    background: url(https://www.lvalive.com/cf/19/images/bg_light_green.jpg) repeat center top;
    background-size: 130px;
    padding: 20px 0;
    box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15);
}

/* modal styles */

.modal-content {
    border-radius: .4rem;
    box-shadow: 0 5px 35px rgba(0, 0, 0, 0.4);
}

.modal-header {
    box-shadow: inset 0 -1px 1px rgba(0, 0, 0, 0.3), 0 1px 0 rgba(255, 255, 255, 0.1);
    background: url(https://www.lvalive.com/cf/19/images/bg_green_texture.jpg) repeat;
    background-size: 320px auto;
    border-bottom: none;
    z-index: 2;
    /* puts header above image for the 1px white shadow */
}

.modal-body {
    box-shadow: 0 -1px 1px rgba(0, 0, 0, 0.2);
    font-family: "proxima-nova", sans-serif;
}

.modal-footer {
    padding: 0.5rem 1rem;
    background: #ece7e0;
    border-top: 1px solid #c2b8b5;
    box-shadow: inset 0 1px 0 #fff;
    border-radius: 0 0 .4rem .4rem;
    justify-content: flex-start;
    /* left-aligns the content */
}

.close {
    color: #b1b89d;
    text-shadow: 0 1px 0 #000;
    opacity: 1;
}

.close:focus,
.close:hover {
    color: #fff;
    opacity: 1;
}

/* secondary pages */

.camp .activities,
.retreat .activities {
    margin-top: 15px;
}

.retreat .activities.fall {
    margin-top: 25px;
}

.account main {
    margin-top: 40px;
}

main > .container {
    /* makes secondary page content go edge-to-edge */
    padding-left: 0;
    padding-right: 0;
}

#home main > .container {
    /* keeps home page content from going edge-to-edge */
    padding-left: 15px;
    padding-right: 15px;
}

.body-content {
    background: #fff;
    padding: 15px 15px 0;
    box-shadow: 0 1px 3px rgba(0, 0, 0, 0.2);
    margin-bottom: 0;
}

.account .body-content {
    padding-top: 50px;
}

.reg-table .boy,
.reg-table .girl {
    color: #333;
    font-weight: bold;
    white-space: nowrap;
    /* keeps the icons and numbers on the same line when the tables get small */
}

.reg-table .boy i {
    color: #006e99;
}

.reg-table .girl i {
    color: #cd1f8e;
}

/* completed-event means the event has already finished */
.reg-table tr.completed-event {
    text-decoration: line-through;
}

/* closed means no more space left in the event */
.reg-table tr.completed-event,
.reg-table .closed,
.reg-table .closed {
    color: #3e3a35;
    font-weight: normal;
    opacity: .5;
}

.reg-table .waitlist,
.reg-table:not(.reg-open) .only-when-reg-open,
.reg-table .speaker.event-speaker-no-type,
.reg-table .event-type-column,
.chapel-messages .bible-text,
table .hide,
.bus-schedule .directions {
    /* hide these for small screens */
    display: none;
}

.bus-schedule .bus-schedule-address {
    font-size: 0.6rem;
}

.adult-volunteers .work-group-row.completed-or-cancelled {
    text-decoration: line-through;
    color: #3e3a35;
    font-weight: normal;
    opacity: .5;
}

/* slight workaround so that retreat pages can contain larger bodies
 * for phones in landscape orientation. Make the container larger than
 * default and show the speaker column.
 */
@media (min-width: 576px) and (max-width: 768px) {
.retreat .container {
    max-width: 720px;
}
.retreat .speaker.event-speaker-no-type {
    display: table-cell;
}
}

.chapel-messages .chapel-msg-date-range {
    display: inline-block;
}

.camp .reg-table th,
.camp .reg-table td,
.retreat .reg-table th,
.retreat .reg-table td,
.schedule .reg-table th,
.schedule .reg-table td,
.bus-schedule .bus-schedule-table th,
.bus-schedule .bus-schedule-table td,
.account.events-list .reg-table th,
.account.events-list .reg-table td,
.account .add-table th,
.account .add-table td {
    padding: 4px;
    font-size: 14px;
}
.reg-table .btn-sm {
    font-size: 13px;
    padding: 2px 8px;
}

.camp .reg-table th,
.retreat reg-table th,
.schedule .reg-table th,
.account.events-list .reg-table th,
.bus-schedule .bus-schedule-table th {
    font-weight: normal;
}

.camp .reg-table .btn i,
.retreat .reg-table .btn i,
.schedule .reg-table .btn i,
.account.events-list .reg-table .btn i {
    display: none;
}

.sidebar > div {
    margin-bottom: 35px;
}

.photos-videos .row.recent-photos a {
    display: block;
    padding-bottom: 1px;
}

.photos-videos .row.recent-photos a img {
    opacity: 1;
    -webkit-transition: all .3s;
    transition: all .3s;
}

.photos-videos .row.recent-photos a:hover {
    text-decoration: none;
    color: #2e3429;
    background: rgba(125, 133, 96, .2);
}

.photos-videos .row.recent-photos a:hover img {
    opacity: 0.9;
    -webkit-transition: all .3s;
    transition: all .3s;
}

.resident-staff.one-family #s1-current-letter .card-body img {
    max-width: 100%;
}

.media .filters > div,
.media .results > div,
.media.chapel-songs .filters > div:last-child,
.resident-staff .staff-bios .col {
    margin-bottom: 25px;
}

.media .filters > div:last-child,
.media .results > div:last-child {
    margin-bottom: 0;
}

.results {
    margin-top: 15px;
}

.card {
    box-shadow: 0 1px 1px rgba(0, 0, 0, 0.2);
}


.chapel-songs .filters .card,
.resident-staff .staff-bios .card {
    height: 100%;
    /* keeps the song and staff cards neat and tidy */
}

/* year header (except the first one)
 * in multi-year presentation gets extra space
 * to separate it from the previous year's songs.
 */
.chapel-songs .one-song + .year-header {
    margin-top: 3rem;
}


/* account pages */

.account .reg-progress-bar {
    font-family: termina;
    font-size: 14px;
    border-radius: 6px;
    margin: 0 0 40px;
    padding: 5px 20px;
}

.account ul.reg-progress-bar li {
    margin: 10px 0;
    float: left !important;
    list-style-type: none;
    font-size: 14px;
    text-transform: uppercase;
}

.account .reg-progress-bar li:after {
    content: "•";
    padding: 0 10px;
    color: #505948;
    text-shadow: 0 -1px 0 #000;
}

.account .reg-progress-bar li:last-child:after {
    content: "";
    padding: 0;
}

.account .reg-progress-bar .step-num {
    color: #a4ac90;
    border: 1px solid #a4ac90;
    display: inline-block;
    height: 24px;
    width: 24px;
    border-radius: 30px;
    margin-right: 5px;
    text-align: center;
    padding: 2px;
    /* needed to offset the reduced text of icons in <a> tags */
    -webkit-transition: all .3s;
    transition: all .3s;
}

.account .reg-progress-bar a {
    color: #a4ac90;
    letter-spacing: 0.1em;
    text-shadow: 0 -1px 0 #000;
    padding: 10px 5px;
}

.account .reg-progress-bar a:hover,
.account .reg-progress-bar a:hover .step-num {
    color: #fff;
    text-decoration: none;
    /* needed to offset the reduced text of icons in <a> tags */
    -webkit-transition: all .3s;
    transition: all .3s;
}

.account .reg-progress-bar a:hover .step-num {
    border-color: #fff;
    /* needed to offset the reduced text of icons in <a> tags */
    -webkit-transition: all .3s;
    transition: all .3s;
}

.account .reg-progress-bar li.active a:hover {
    cursor: default;
}

.account .reg-progress-bar li.active .step-num {
    color: #2e3429;
    background: #fff;
    border-color: #fff;
    box-shadow: 0 -1px 0 #000;
}

.account .reg-progress-bar li.active a {
    color: #fff;
}

.account .user-links {
    margin-bottom: 0;
}

/*	=3a: Typography
----------------------------------------------- */

h1 {
    color: #2e3429;
    font-family: termina, sans-serif;
}

h1.display-4 {
    font-size: 30px;
}

#home h1 {
    color: #fff;
}

#home .home-about h1 {
    color: #2e3429;
    text-shadow: 0 1px 0 rgba(255, 255, 255, .4);
    font: 24px/30px "proxima-nova", sans-serif;
    font-weight: normal;
    margin-bottom: 0;
}
#home.winter .home-about h1 {
	color: #343a40;
}

.about #banner h1 {
    font-size: 32px;
}
#cb-about.about.summer #banner h1, #cb-about.about.fall #banner h1,
.activities-facilities #banner h1, div.history #banner h1 {
    color: #fff;
    text-shadow: 0 1px 4px rgba(0, 0, 0, 0.8);
}
#cb-about.about.winter #banner h1 {
	text-shadow: 0 0 8px rgba(255,255,255, 0.5);
}
.about.activities-facilities.winter #banner h1 {
	text-shadow: 0 0 8px rgba(0,0,0, 0.8);
}

#home .carousel-caption h1 {
    font: 32px/32px termina, sans-serif;
    text-shadow: 0 0 10px rgba(0, 0, 0, 0.6), 0 0 100px rgba(0, 0, 0, 0.9);
    margin: 0;
}
#home .carousel-caption h1 span.predication {
    font: 48px/48px marydale, Gabriola, "Segoe Script";
    color: #ff931e;
    text-shadow: 0 0 20px rgba(0, 0, 0, 0.2), 0 0 100px rgba(0, 0, 0, 0.9);
    margin-bottom: 7px;
    display: block;
	font-feature-settings: "salt"; /*stylistic alternatives for letters like a, y, g, etc. */
}
#home .light-bg .carousel-caption h1 {
	text-shadow: none;
	color: #283228;
}
#home .carousel-caption h1 span.predication {
	text-shadow: none;
}

/* colors for specific carousel text and button icons */

#home .grass-green .carousel-caption h1 span.predication,
#home .grass-green .carousel-caption .btn-primary i {
    color: #9bdc20;
}

#home .paddle-blue .carousel-caption h1 span.predication,
#home .paddle-blue .carousel-caption .btn-primary i {
    color: #00bfe7;
}
#home .blue .carousel-caption h1 span.predication,
#home .blue .carousel-caption .btn-primary i {
    color: #648cd2;
}
#home .light-green .carousel-caption h1 span.predication,
#home .light-green .carousel-caption .btn-primary i {
    color: #7d875a;
}

#home .semi-blue .carousel-caption h1 span.predication,
#home .semi-blue .carousel-caption .btn-primary i {
    color: #add7c3;
}

h2 i {
    font-size: 85%;
    opacity: 0.6;
}

.news h2, div.resident-staff .body-content .card h2 {
    font-family: termina;
    font-size: 26px;
}

.schedule h2 {
    font-family: termina;
    text-transform: lowercase;
    letter-spacing: .02em;
    font-variant: small-caps;
    font-size: 18px;
}

h3.script {
    font-family: marydale;
    color: #ff931e;
}

.about .activity-info .script {
    color: #fff;
}
.about.winter .activity-info .script {
    color: #648cd2;
}
.about.winter .more-about-info .script {
    color: #503728;
}

h3.icon {
    font: 13px/18px termina;
    color: #2e3429;
    text-transform: uppercase;
    letter-spacing: 0.1em;
    border-top: 2px solid #7d8560;
    padding: 10px 0;
    margin-bottom: 0; /* not needed because of the padding */
}

h3.icon.link {
    padding: 0; /* because the padding is added to the <a> tag instead */
}
div.album .album-photos h3.icon {
	margin-top: 2px;
    padding-bottom: 6px;
}

.about #banner h3.icon {
    border-top-width: 1px;
    padding-top: 20px;
    color: #FF9322;
    border-top-color: rgba(255, 255, 255, 0.25);
}
#cb-about.about.winter #banner h3.icon {
	color: #503728;
    border-top-color: rgba(0, 0, 0, 0.15);
}
.about.activities-facilities.winter #banner h3.icon {
	color: #503728;
    border-top-color: rgba(255,255,255, 0.5);
}

.about .activity-info h3.termina,
div.history .founder-info h3.termina, 
.activities-facilities .activities-facilities-info h3.termina {
    color: #fff;
    font-size: 18px;
    border-top: none;
    text-transform: uppercase;
    letter-spacing: 0.1em;
    padding: 10px 0;
    margin-bottom: 0;
}
.activities-facilities .activities-facilities-info h3.termina {
    border-bottom: 1px solid rgba(255,255,255,0.3);
    margin-bottom: 10px !important;
}
.about.winter .activity-info h3.termina {
	color: #283228;
}

div.history .founder-info h3.icon {
    color: #fff;
    border-top-color: #ff931e;
}

div.history .founder-info h3.icon.border-bottom {
    border-bottom-color: rgba(255, 255, 255, 0.4) !important;
}

div.history .founder-info h3.icon i {
    color: #ff931e;
}

.media .results h3.icon {
    font-size: 14px;
}

.media .results h3.icon {
    font-weight: bold;
}
.chapel-messages .results a i {
    padding-right: 2px;
}

h3.icon span.metadata {
    font-family: "proxima-nova-condensed";
    font-weight: normal;
}

h3.icon.border-bottom {
    border-bottom: 1px dotted #7d8560 !important;
    margin-bottom: 15px;
}

h3.icon i {
    color: #7d8560;
    opacity: 1;
    font-size: 100%;
    margin-right: 1px;
    /* needed to offset the reduced text of icons in <a> tags */
    -webkit-transition: all .3s;
    transition: all .3s;
}

h2 i,
h3 i,
h4 i,
h5 i,
h6 i {
    font-size: 75%;
    opacity: .6;
    margin-right: 5px;
}

h2.termina,
h3.termina,
h4.termina,
h5.termina,
h6.termina {
    font-family: termina;
}

.reg-table h3.icon,
.reg-progress-bar {
    font-size: 14px;
    margin: -21px -11px 20px;

    padding: 20px;
    color: #fff;
    border-top: none;
    box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.3), 0 1px 0 rgba(255, 255, 255, 0.8);
    background: #2e3429 url(https://www.lvalive.com/cf/19/images/bg_green_texture.jpg) repeat;
    background-size: 320px auto;
}

#home .reg-table h3.icon {
    padding: 20px;
}

#home .reg-table h4 {
    font-size: 20px;
    font-weight: bold;
    color: #252525;
}

#home .reg-table h4 span.open,
.reg-table h3 span.open {
    font-size: 16px;
    font-weight: normal;
    color: #7d8560;
}

.reg-table h3 span.open {
    font-size: 16px;
    font-weight: normal;
    text-transform: capitalize;
    letter-spacing: 0;
    font-family: "proxima-nova-condensed";
    color: #7d8560;
}

h5 {
    font-weight: bold;
}

.home-about h5 {
    font-family: termina;
    font-size: .9rem;
    text-transform: uppercase;
    letter-spacing: 0.1em;
    color: #55604c;
    font-weight: normal;
}
.winter .home-about h5 {
	color: #495057;
}

.activities h5 {
    font: 18px/24px termina;
    text-align: center;
    text-transform: uppercase;
    letter-spacing: 0.1em;
    margin-top: 40px;
}

.activities h5 {
    color: rgba(255, 255, 255, 0.5)
}

.activities.fall h5 {
    color: rgba(0, 0, 0, 0.8);
}

.activities.spring h5 {
    color: rgba(255, 255, 255, 0.7)
}

.activities.winter h5 {
    color: rgba(255, 255, 255, 0.7)
}

.modal h5, .activities .modal h5 {
    font: 16px/24px termina;
    text-align: left;
    color: #fff;
    margin: 0;
	text-transform: uppercase;
    letter-spacing: 0.1em;
}

.card-title {
    font-weight: bold;
}

.reg-table .info p {
    margin: 0;
}

#home .reg-table .info p {
    margin: 0 0 10px;
    /* to help with spacing */
    line-height: 1.3em;
}

#cb-about.about.summer #banner p, #cb-about.about.fall #banner p, .activities-facilities #banner p {
    color: #fff;
    text-shadow: 0 1px 4px rgba(0, 0, 0, 0.8);
    opacity: .8;
}
.activities-facilities #banner h3 {
    text-shadow: 0 1px 4px rgba(0, 0, 0, 0.8);
    line-height: 1.4em;
}
.activities-facilities #banner p.lead {
    opacity: 1;
    text-shadow: 0 0 20px rgba(0, 0, 0, 1), 0 1px 4px rgba(0, 0, 0, 0.5);
}

div.history #banner p,
div.history .founder-info p {
    color: #fff;
    text-shadow: 0 1px 4px rgba(0, 0, 0, 0.4);
    opacity: 0.9;
}

div.history .book-info p {
    color: #283228;
    text-shadow: 0 1px 4px rgba(0, 0, 0, 0.1);
}

#cb-about.about .about-summary p {
    opacity: .95;
}
#cb-about.about.summer .about-summary p, #cb-about.about.fall .about-summary p {
    color: #fff;
    text-shadow: 0 1px 4px rgba(0, 0, 0, 0.8);
}
#cb-about.about.winter .about-summary,
#cb-about.about.winter .story {
    /* partially transparent color adding lightness so text can be seen.
       This is set to transparent below for larger-width screens.
     */
    background-color: #e6e7eaab;
}
#cb-about.about.winter .about-summary {
    padding-top: 7px;
}
#cb-about.about.winter .story {
    padding-bottom: 7px;
}
#cb-about.about.winter .about-summary p {
	color: #2e3429;
	opacity: 0.9;
    text-shadow: 0 0 8px rgba(255,255,255, 0.4);
}

.about.summer .activity-info p, 
.about.fall .activity-info p,
.activities-facilities .activities-facilities-info p {
    color: #fff;
    text-shadow: 0 1px 4px rgba(0, 0, 0, 0.1);
    opacity: .85;
}

p.metadata {
    color: #58544f;
}

.media img + p.metadata {
    margin: -7px 0 0;
    padding: 0 7px 5px;
}

p.metadata i {
    color: #7d8560;
    margin-right: 4px;
    font-size: 90%;
}

.sep {
    padding: 0 6px;
    color: #7d8560;
}

.sep.dot {
    padding: 0 1px;
    color: #7d8560;
}

.small-caps {
    text-transform: lowercase;
    font-variant: small-caps;
    letter-spacing: .06em;
    font-variant-numeric: oldstyle-nums;
    -moz-font-feature-settings: "onum";
    -webkit-font-feature-settings: "onum";
    font-feature-settings: "onum";
}

.script {
    font-family: marydale;
}
.alt {    
	font-feature-settings: "salt"; /*stylistic alternatives for letters like a, y, g, etc. */
}

.termina {
    font-family: termina;
}

.small-caps i {
    font-size: 75%;
    /* shrinks icons in small-caps text */
}

.text-uppercase {
    letter-spacing: 0.1em;
}

.capitalize {
    text-transform: capitalize;
}

.blue {
    color: #638cd4 !important;
}

.light-green {
    color: #7d8560 !important;
}

.dark-green {
    color: #283228 !important;
}

.orange {
    color: #ff931e !important;
}

blockquote {
    padding-left: 15px;
    border-left: 3px solid #a4ac90;
}

blockquote.no-line {
    padding-left: 0;
    border-left: 0;
}

strong {
    color: #333;
    font-weight: bold;
}

/*	=3b: Lists
----------------------------------------------- */
.activities ul {
    text-align: center;
    margin-bottom: 40px;
    padding-left: 0;
}

.activities ul li {
    display: inline;
    line-height: 1.6em;
    margin-left: 0;
    padding-left: 0;
    font-family: marydale;
    font-size: 20px;
    list-style-type: none;
}

.activities ul li:after {
    content: "•";
    opacity: 0.5;
    padding: 0 10px;
}

.activities ul li:last-child:after,
.activities ul li.d-none:after {
    content: "";
    padding: 0;
}

.activities.summer ul li,
.activities.winter ul li,
.activities.spring ul li {
    color: #fff;
}

.activities.fall ul li {
    color: #000;
}

div.contact #camper-mail ul {
    padding-left: 1.2em;
}
.serve .top-border-fade ol, .serve .top-border-fade ul, .donate .modal ol {
	padding-left: 18px;
}
.serve .top-border-fade ol li, .donate .modal ol li {
	padding-left: 5px;
}
ul.two-col, ol.two-col {
	column-count: 2;
	column-gap: 40px;
}
ul.three-col, ol.three-col {
	column-count: 3;
	column-gap: 40px;
}
ul.four-col, ol.four-col {
	column-count: 2;
	column-gap: 40px;
}
.activities-facilities-info ul.two-col, .activities-facilities-info ul.four-col {
    column-gap: 25px;
    list-style-type: square;
    padding-left: 20px;
    color: rgba(255,255,255,0.5);
}
.activities-facilities-info ul.two-col li, .activities-facilities-info ul.four-col li {
    line-height: 1.3em;
}

.beliefs .social .fab, .news .social .fab,
.sitemap .social .fab {
    position: relative;
    bottom: 6px;
}

.sidebar .social li {
    margin-right: 12px;
    float: left;
}

.sidebar .social li:last-child {
    margin-right: 0;
}

.sidebar .social li a {
    display: inline-block;
    border: 1px solid #ced4da;
    border-radius: 3px;
    height: 32px;
    width: 32px;
    text-align: center;
    font-size: 22px;
	padding: 7px 7px 6px;
}

.sidebar .social li a.fb {
    color: #0082b5;
}

.sidebar .social li a.tw {
    color: #1da1f2;
}

.sidebar .social li a.vm {
    color: #1ab7ea;
}

.sidebar .social li a.ig {
    color: #c32aa3;
}

.sidebar .social li a.pt {
    color: #bd081c;
}

.sidebar .social li a:hover {
    background: #ced4da;
    color: #fff;
    box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.4);
}

.sidebar .social li a.fb:hover {
    background-color: #0082b5;
    border-color: #0082b5;
}

.sidebar .social li a.tw:hover {
    background-color: #1da1f2;
    border-color: #1da1f2;
}

.sidebar .social li a.vm:hover {
    background-color: #1ab7ea;
    border-color: #1ab7ea;
}

.sidebar .social li a.ig:hover {
    background-color: #c32aa3;
    border-color: #c32aa3;
}

.sidebar .social li a.pt:hover {
    background-color: #bd081c;
    border-color: #bd081c;
}

.list-group-item.active {
    background-color: #7d8560;
    border-color: #7d8560;
    text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
}
div.resident-staff .list-group .list-group-item i {
    color: #000;
    opacity: .6;
    margin-right: 5px;
}
.pagination a,
.pagination a:visited {
    color: #006e99;
}

.page-item.active .page-link {
    background-color: #7d8560;
    border-color: #7d8560;
}

footer ul li.text-muted {
    color: #666 !important;
}

footer ul li.text-muted span {
    color: #ccc;
}

/*	=3c: Images
----------------------------------------------- */

.home-about img {
    margin: 15px auto -45px;
    display: block;
    /* centers the image for smaller screens */
    width: 100%;
}

.home-news img {
    box-shadow: 0 1px 3px rgba(0, 0, 0, 0.2);
    margin-bottom: 15px;
}
.body-content .page-info img {
	margin-bottom: 0; /* for small screen sizes */
}

.activities .row img {
    margin: -15px 0 -9px;
}

.activities .row img.winter-girl {
    margin: -23px 0 -1px;
}

.activities .row img.zipline-dad {
    margin: -36px 0 0;
}
#home .activities .row img.zipline-dad {
    margin: -34px 0 0;
}
#home .activities .row img.zipline-mom {
    margin: -16px 0 0px;
}

.activities .row img.father-daughter {
    margin: -21px 0 -15px;
}

.body-content img {
    margin-bottom: 15px;
}

.body-content .card img {
    margin-bottom: 5px;
}

.body-content .carousel img {
    margin-bottom: 0;
}

.album .body-content img, .album .body-content .album-photos iframe {
    margin: 0;
    border: 2px solid transparent;
}

.modal img {
    width: 100%;
    height: auto;
    margin: 0;
}

img.shadow, .carousel-inner.shadow {
    box-shadow: 0 1px 3px rgba(0, 0, 0, 0.2) !important;
}

img.border, .carousel-inner.border {
    border: 5px solid #fff !important;
}

.history img.barakel-book {
    margin: 0 0 -26px;
}

/*	=3d: Links & Buttons
----------------------------------------------- */

a,
a.list-group-item-action {
    color: #006e99;
    transition: 0.3s;
    text-decoration: underline;
}

a:is(.btn, .navbar-brand, .nav-link, .dropdown-item),
:is(.activities, .reg-table, .act-list, #facilities,
 .event-message-list, footer) a {
    text-decoration: none;
}

a:visited,
a.list-group-item-action:visited {
    color: #006e99;
}

a:hover,
a.list-group-item-action:hover {
    color: #10b1f1;
}

.list-group-item-action:focus, .list-group-item-action:hover {
    background-color: #eaeef3;
}

.btn {
    font-family: "proxima-nova", sans-serif;
}

.btn-primary,
a.btn-primary {
    background: linear-gradient(#454e3d, #2f3529);
    color: #fff;
    text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.4);
    border: 1px solid #2e3429;
    box-shadow: 0 2px 3px rgba(0, 0, 0, 0.2), inset 0 1px 0 rgba(255, 255, 255, 0.2);
}

.btn-primary:hover {
    color: #fff;
    background: linear-gradient(#546149, #2f3529);
    border: 1px solid #2e3429;
}

.btn-primary.focus,
.btn-primary:focus,
.btn-primary:not(:disabled):not(.disabled).active,
.btn-primary:not(:disabled):not(.disabled):active,
.btn-primary:not(:disabled):not(.disabled):active:focus {
    background: linear-gradient(#2f3529, #546149);
    border: 1px solid #2e3429;
    color: #fff;
    box-shadow: 0 1px 2px rgba(0, 0, 0, 0.2), inset 0 1px 0 rgba(255, 255, 255, 0.2);
}

a i {
    font-size: 80%;
}

.btn i {
    padding-left: 4px;
    color: #7d8560;
}
.btn.icon-left i {
    padding-left: 0;
    padding-right: 4px;
}

.btn:hover i {
    color: #fff;
}

#home .carousel-caption .btn-primary,
#home .carousel-caption a.btn-primary {
    font-size: 16px;
    color: rgba(255, 255, 255, 0.7);
    background: linear-gradient(#2a2a2a, #171717);
    border: 1px solid #000;
    box-shadow: 0 0 0 2px rgba(0, 0, 0, 0.15), 0 2px 3px rgba(0, 0, 0, 0.2), inset 0 1px 0 rgba(255, 255, 255, 0.1);
}

#home .carousel-caption .btn-primary:hover {
    color: #fff;
    background: linear-gradient(#2a2a2a, #1c1c1c);
    border: 1px solid #111;
    box-shadow: 0 0 0 2px rgba(0, 0, 0, 0.4), 0 2px 3px rgba(0, 0, 0, 0.2), inset 0 1px 0 rgba(255, 255, 255, 0.1);
}

#home .carousel-caption .btn-primary.focus,
#home .carousel-caption .btn-primary:focus,
#home .carousel-caption .btn-primary:not(:disabled):not(.disabled).active,
#home .carousel-caption .btn-primary:not(:disabled):not(.disabled):active,
#home .carousel-caption .btn-primary:not(:disabled):not(.disabled):active:focus {
    background: linear-gradient(#1c1c1c, #2a2a2a);
    border: 1px solid #111;
    box-shadow: 0 0 0 2px rgba(0, 0, 0, 0.4), 0 2px 3px rgba(0, 0, 0, 0.2), inset 0 1px 0 rgba(255, 255, 255, 0.1);
}

#home .carousel-caption .btn-primary i {
    color: #ff931e;
}

#home .carousel-caption .btn-primary:hover i {
    color: #fff;
}

.btn.btn-outline-secondary {
    color: #2e3429;
    border: 1px solid rgba(46, 52, 41, 0.7);
    text-shadow: 0 1px 0 rgba(255, 255, 255, .4);
    box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.4);
    background: linear-gradient(rgba(185, 195, 165, 0.1), rgba(185, 195, 165, 0.4));
}

.btn.btn-outline-secondary:hover {
    box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.3);
    text-shadow: 0 1px 0 rgba(255, 255, 255, .5);
    background: linear-gradient(rgba(185, 195, 165, 0.6), rgba(185, 195, 165, 1));
}

.btn.btn-outline-secondary.focus,
.btn.btn-outline-secondary:focus,
.btn.btn-outline-secondary:active,
.btn.btn-outline-secondary:not(:disabled):not(.disabled):active,
.btn.btn-outline-secondary:not(:disabled):not(.disabled):active:focus {
    color: #2e3429;
    text-shadow: 0 1px 0 rgba(255, 255, 255, .4);
    border-color: rgba(46, 52, 41, 0.7);
    box-shadow: none;
    background: linear-gradient(rgba(185, 195, 165, 1), rgba(185, 195, 165, 0.6));
}

.btn-outline-secondary.disabled,
.btn-outline-secondary:disabled {
    color: #6c757d !important;
    background: transparent !important;
}

.btn-outline-secondary.disabled:hover i,
.btn-outline-secondary:hover:disabled i {
    color: #6c757d !important;
}

.home-about .btn.btn-outline-secondary {
    border-width: 2px;
    font-weight: bold;
    text-shadow: 0 1px 0 rgba(255, 255, 255, .2);
    background: linear-gradient(rgba(40, 50, 40, 0.1), rgba(40, 50, 40, 0.2));
}

.home-about .btn.btn-outline-secondary:hover {
    background: linear-gradient(rgba(40, 50, 40, 0.2), rgba(40, 50, 40, 0.4));
}

.home-about .btn.btn-outline-secondary.focus,
.home-about .btn.btn-outline-secondary:focus,
.home-about .btn.btn-outline-secondary:active,
.home-about .btn.btn-outline-secondary:not(:disabled):not(.disabled):active,
.home-about .btn.btn-outline-secondary:not(:disabled):not(.disabled):active:focus {
    background: linear-gradient(rgba(40, 50, 40, 0.4), rgba(40, 50, 40, 0.2));
}

.btn-outline-secondary i {
    color: rgba(46, 52, 41, 0.7);
    opacity: 1;
}

.btn-outline-secondary:hover i {
    color: #2e3429;
}

.btn-outline-light {
    color: #7d8560;
    border-color: #7d8560;
}

.btn-outline-light.white {
    color: #fff;
    border-color: rgba(255, 255, 255, 0.8);
}

.btn-outline-light.white i {
    color: rgba(255, 255, 255, 0.6);
}

a.btn-outline-light.white:hover,
a.btn-outline-light.white:hover i {
    color: #2e3429;
}

h3.icon a.btn-outline-light {
    color: #7d8560;
    padding: 5px 10px;
    text-transform: capitalize;
    letter-spacing: 0;
    margin-top: -6px;
}

h3.icon a.btn-outline-light:hover {
    color: #fff;
}

.activities.summer ul li a,
.activities.winter ul li a,
.activities.spring ul li a {
    color: #fff;
}

.activities.summer ul li a:hover,
.activities.winter ul li a:hover,
.activities.spring ul li a:hover {
    color: #fff;
    opacity: .8;
}

.activities.fall ul li a {
    color: #000;
    opacity: .8;
}

.activities.fall ul li a:hover {
    color: #000;
    opacity: 1;
}

h3.icon a {
    color: #2e3429;
    display: block;
    padding: 10px 0;
}

h3.icon a:hover {
    text-decoration: none;
    color: #2e3429;
    background: rgba(125, 133, 96, .2);
}

h3.icon a:hover i {
    color: #2e3429;
    -webkit-transition: all .3s;
    transition: all .3s;
}
.activities-facilities-info ul.two-col li a, .activities-facilities-info ul.four-col li a {
    color: #fff;
    padding: 5px 0;
    display: block;
    text-shadow: 0 1px 0 rgba(0,0,0,0.6), 0 0 15px rgba(0,0,0,0.3);
}
.activities-facilities-info ul.two-col li a:hover, .activities-facilities-info ul.four-col li a:hover {
    color: #ff931e;
}
.schedule .reg-table .btn,
.account.events-list .reg-table .btn {
    /* shrink buttons on the schedule and events list pages */
    font-size: 13px;
    padding: 2px 8px;
}

a.sort,
a:visited.sort {
    color: #3e3a35;
    opacity: .5;
}

a:hover.sort {
    opacity: 1;
}

.media a.album-cover {
    display: block;
}

.media a:hover.album-cover {
    text-decoration: none;
    color: #2e3429;
    background: rgba(125, 133, 96, .2);
    border-radius: 0 0 3px 3px;
}

.media a.album-cover h3 i,
.media a.album-cover p.metadata,
.media a.album-cover p.metadata i {
    -webkit-transition: all .3s;
    transition: all .3s;
    transition-timing-function: ease;
}

.media a:hover.album-cover h3 i,
.media a:hover.album-cover p.metadata,
.media a:hover.album-cover p.metadata i {
    color: #2e3429;
    -webkit-transition: all .3s;
    transition: all .3s;
    transition-timing-function: ease;
}

.media a.album-cover img {
    opacity: 1;
    -webkit-transition: all .3s;
    transition: all .3s;
    transition-timing-function: ease;
}

.media a:hover.album-cover img, .media.album .album-photos a:hover img {
    opacity: .85;
    -webkit-transition: all .3s;
    transition: all .3s;
    transition-timing-function: ease;
}

.sidebar form button, .news .card form button {
    border-top-left-radius: 0;
    border-bottom-left-radius: 0;
}

.account .add-btn {
    margin-bottom: 25px;
}

.account .user-name {
    font-weight: bold;
}

footer h5,
footer h5 a,
footer h5 a:visited {
    color: #ccc;
}

footer h5 a:hover {
    color: #ff931e;
    text-decoration: none;
}

footer h5 a i {
    color: #ff931e;
}

footer li a.text-muted,
footer li a.text-muted:visited {
    color: #666 !important;
}

footer li a.text-muted:hover,
footer li a.text-muted.email:hover {
    color: #ff931e !important;
    text-decoration: none;
}

footer li a.text-muted.email {
    color: #ccc !important;
}

#copyright a,
#copyright a:visited {
    color: #666;
}

#copyright a:hover {
    color: #ccc;
}

/*	=3e: Forms
----------------------------------------------- */

.sidebar .form-inline .form-control, .news .card .form-inline .form-control {
    width: auto;
}

.sidebar .form-inline .form-control, .news .card .form-inline .form-control {
    border-top-right-radius: 0;
    border-bottom-right-radius: 0;
}

.alert-primary hr,
.alert-primary input {
    border-color: #cec6c4;
}

.alert-secondary hr,
.alert-secondary input {
    border-color: #c2b8b5;
}

.alert-success hr,
.alert-success input {
    border-color: #b0b79c;
}

.form-check-input:disabled ~ .form-check-label {
    color: #b7b2aa;
}

#showInputAddress {
    padding: 20px;
    color: #2e3429;
    background-color: #d9dec9;
    border: 1px solid #b0b79c;
    box-shadow: inset 0 0 0 1px #fff;
    border-radius: 3px;
    margin-bottom: 25px;
}

#showInputAddress input {
    border-color: #b0b79c;
}

.account .add-table .form-check-inline {
    margin: 0;
}

/*	=3f: Tables
----------------------------------------------- */

table {
    width: 100%;
    margin: 15px 0;
    font-variant-numeric: tabular-nums;
    -moz-font-feature-settings: "tnum";
    -webkit-font-feature-settings: "tnum";
    font-feature-settings: "tnum";
}

#home .registration table {
    width: 100%;
    margin: 1px 0 20px;
}

th,
td {
    padding: 8px 10px 6px;
    line-height: 1.3em;
}

th {
    padding: 9px 10px 7px;
    background: #d9dcd0;
    border-bottom: 1px solid #b9bfa8;
    color: #2e3429;
}

td {
    border-bottom: 1px solid #c2b8b5;
}

tr.audio-playing td {
    border-bottom: none;
    color: #111;
    font-weight: bold;
}

.reg-table tr td:first-child,
.schedule .reg-table tr td:nth-child(2n),
#home .reg-table tr td:nth-child(2n) {
    /* sets the number style for the date column of registration tables */
    font-variant-numeric: lining-nums;
    -moz-font-feature-settings: "lnum";
    -webkit-font-feature-settings: "lnum";
    font-feature-settings: "lnum";
}

.bus-schedule-table tr {
    vertical-align: top;
}

.bus-schedule-table tr th {
    vertical-align: bottom;
}

.bus-schedule-table td {
    padding-top: 14px;
    padding-bottom: 12px;
}

.contact-info td {
    vertical-align: top;
}

.contact-info td:first-child {
    font-weight: bold;
}

.account tr td.add {
    width: 15px;
}

.account .add-table tr.selected td {
    background: #eee;
    font-weight: bold;
    color: #333;
}


.account .add-table input {
    margin: 4px;
}

.account .add-table label {
    display: block;
}

.account table tr.total td {
    padding: 10px;
    font-weight: bold;
    border-bottom: none;
    border-top: 2px solid #999;
    text-transform: uppercase;
}
.serve.adult table .dates {
	min-width: 90px;
}

/*	=4: Footers
=============================================== */

footer {
    border-top: 4px solid #ff931e;
    font-size: 14px;
    margin: 30px 0 0;
    padding: 25px 15px 0;
    background: linear-gradient(rgba(0, 0, 0, 0.85), rgba(0, 0, 0, 0.8));
    box-shadow: inset 0 1px 0 rgba(0, 0, 0, 0.85), inset 0 2px 0 rgba(255, 255, 255, .1);
}

#home footer,
#cb-about.about footer {
    padding: 25px 0 0;
    margin: 30px 0 0;
}

#cb-about.about footer {
    margin: 0;
}

#copyright {
    background: rgba(0, 0, 0, 0.83);
    border-top: 1px solid rgba(0, 0, 0, 0.2);
    box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.05);
    padding: 7px 0;
    margin: 0;
    line-height: 1.3em;
}

#home #copyright,
#cb-about.about #copyright {
    padding: 7px 0;
    margin: 0;
}

#copyright .text-muted {
    color: #555 !important;
}

/* study serve page */
.study-serve {
    font-size: 13pt;
}
.study-serve h2 {
    font-size: 35pt;
}
.ss-bg-cover {
    background-repeat: no-repeat;
    background-position: center center;
    background-size: cover;
    min-height: 28rem;
    display:flex;
    align-items: center;
    justify-content: center;
    padding: 0;
    line-height: 1;
    margin-bottom: 20px;
}
.col-12.ss-bg-cover {
    margin-top: 50px;
}

.ss-bg-cover {
    font-size: 25pt;
}
.ss-bg-cover > div {
    max-width: 97%;
}
.ss-subpoint {
    display: flex;
    align-items: flex-start;
    justify-content: space-around;
    flex-wrap: wrap;
}
.ss-subpoint > .ss-bg-cover {
    font-size: 35pt;
    padding: 1rem;
    line-height: 1.2;
    min-height: 27rem;
    justify-content: flex-start;
    align-items: flex-start;
}
.ss-subpoint > div,
.overview-subpoint {
    width: 95%;
}
.ss-subpoint :is(.ss-bg-cover, .ss-subpoint-text) {
    width: 45%;
}
.ss-subpoint-text {
    align-self: center;
}
.ss-wte-text {
    display: flex;
    align-items: center;
    justify-content: center;
    flex-wrap: wrap;
    width: 100%;
}
.ss-subpoint .ss-bg-cover+div {
    line-height: 1.3;
}
.ss-subpoint .ss-header {
    font-size: 35%;
}
.ss-subpoint:not(:first-child) {
    border-top: 1px solid #c9c9c9;
    padding-top: 2rem;
    margin-top: 5rem;
}
.ss-header {
    font-family: "Georgia",serif;
    font-size: 77pt;
}

div:not(.ss-subpoint) > .ss-bg-cover:not(.no-top-border) {
    border-top: 25px solid #e1dcdc;
}

.ss-scroll-contents {
    display: flex;
    flex-wrap: nowrap;
    overflow-x:auto;
    scroll-snap-type: x mandatory;
}

.ss-scroll-contents > div {
    width: 84%;
    flex-shrink: 0;
    position:relative;
    margin-right: 4vw;
    scroll-snap-align:start;
}
.ss-scroll-contents img {
    width: 98%;
    margin-top: 5px;
    margin-bottom:20px;
}
.ss-scroll-contents div div p:first-child {
    margin-bottom: 0.2rem;
    font-weight:bold;
    font-size: 120%;
}
.study-serve a + .collapse {
    margin-left: 2rem;
}
.ss-scroll-contents bl,
.ss-wte-text bl {
    list-style-position: inside;
}
.ss-scroll-contents bl li,
.ss-wte-text bl li {
    margin-left: 2rem;
    text-indent: -1.5rem;
}
.study-serve .strong-bigger strong {
    font-size: 22pt;
}

.study-serve .modal {
    --inv-color: #b88d45;
    font-size: max(1vw, 13pt);
}
.study-serve .modal :is(input, select) {
    width: 80%;
    border: none;
    border-bottom: 1px solid #ddd;
    margin-top: 20px;
    outline: 0;
}
.study-serve .modal input[type="radio"] {
    width: auto;
}
.study-serve .modal input[name="interest"] {
    margin-top: 0;
}
.study-serve .modal input {
    transition: all 0.1s ease-in-out;
}
.study-serve .modal :is(input:focus, select:focus) {
    border: none;
    border-bottom: 1px solid #ddd;    
}
.study-serve .modal input:invalid {
    border-bottom: 1px solid var(--inv-color);
}
.study-serve .modal input:invalid,
.study-serve .modal input:invalid::placeholder,
.study-serve .modal input[type="radio"]:invalid + label {
    color: var(--inv-color);
}
.study-serve .modal input.flash:invalid,
.study-serve .modal input[type="radio"].flash:invalid + label {
    opacity: 0.4;
}
.study-serve .modal h4 {
    font-weight:bold;
}

.ss-vertical-spacer {
    width:100%;
    margin-top:5rem;
}

@media (max-width: 768px) {
.ss-bg-cover {
    margin-top: 5vh;
    margin-bottom: 5px;
}
.ss-subpoint:not(:first-child) {
    padding-top: 0;
    margin-top: 2rem;
}


.ss-subpoint .ss-bg-cover+div {
    font-size: 13pt;
}
.ss-header {
    font-size: 38pt;
}
.study-serve h2 {
    font-size: 25pt;
}
.ss-subpoint > .ss-bg-cover {
    font-size: 25pt;
    min-height: 16rem;
}
.ss-subpoint {
    width: 100%;
}
.ss-subpoint :is(.ss-bg-cover, .ss-subpoint-text) {
    width: 95%;
}
.ss-subpoint-text {
    align-self: auto;
}
.ss-cqa {
    padding-left: 2.5rem;
}

.ss-vertical-spacer {
    margin-top:3rem;
}

}

/*	=5: Size-specific Styles
=============================================== */

/* breaks occur at 576px (phones), 768px (tablets), 992px (laptops), and 1200px (desktops) */

@media (min-width: 320px) {
    a.navbar-brand {
        margin-bottom: -15px;
        padding: 1px 25px 17px;
    }

    .navbar-brand .logo-camp {
        display: inline;
    }

    .navbar-brand .tagline {
        display: block;
    }
}

@media (min-width: 576px) {
    .body-content {
        margin-bottom: 50px;
    }

    .account .body-content {
        padding-top: 80px;
    }

    a.navbar-brand {
        font: 44px/46px Gin, impact;
        margin-bottom: -22px;
        padding: 0 45px 22px;
    }

    .navbar-brand .tagline {
        font-size: 9px;
        line-height: 16px;
        margin-top: 1px;
    }

    .navbar-brand .est-date {
        display: inline;
    }

    .navbar-collapse .navbar-nav {
        padding: 25px 0 20px 15px;
    }

    #home .carousel-item img {
        height: auto;
    }

    #home .carousel-item {
        height: 18rem;
    }

    .home-about {
        padding: 40px 0;
    }

    .about #banner {
        padding: 220px 0 40px;
    }
	div.media.album #banner img {
		margin-top: -100px; /*since we're using a normal size image we need to center it */
	}

    .breadcrumb {
        padding: 10px 0 6px;
        font-size: 16px;
    }

    main > .container {
        padding-left: 15px;
        padding-right: 15px;
    }

    .body-content {
        border: 1px solid #a8a39c;
        border-top: none;
        border-bottom: none;
    }

    .news h2, div.resident-staff .body-content .card h2 {
        font-size: 32px;
    }

    .news #news-article-list img {
        max-width: 99%;
    }

    .activities h5 {
        font: 22px/28px termina;
    }

    .activities ul li {
        font-size: 22px;
    }

    #home .reg-table {
        padding: 40px;
    }

    .reg-table h3.icon {
        font-size: 16px;
        padding: 20px;
        margin: -21px -21px 20px;
        /* the 21 covers the 1px from the border */
    }

    #home .reg-table h3.icon {
        font-size: 18px;
        padding: 20px 40px;
        margin: -41px -41px 30px;
    }

    #home .reg-table .info {
        margin: 0 -40px -40px;
    }

    #home .reg-table .info p {
        margin: 0;
    }

    div.history #banner {
        padding: 180px 0 10px;
        background-size: contain;
    }

    .history img.barakel-book {
        margin-bottom: -31px;
    }

    .reg-table .waitlist,
    .chapel-messages .bible-text,
    table .hide,
    .bus-schedule .directions {
        display: table-cell;
    }

    .camp .reg-table table,
    .retreat .reg-table table,
    .schedule .reg-table table {
        margin-left: 0;
        margin-right: 0;
        width: 100%;
    }

    .camp .reg-table th,
    .camp .reg-table td,
    .retreat .reg-table th,
    .retreat .reg-table td,
    .schedule .reg-table th,
    .schedule .reg-table td,
    .bus-schedule .bus-schedule-table th,
    .bus-schedule .bus-schedule-table td,
    .account.events-list .reg-table th,
    .account.events-list .reg-table td,
	.account .add-table th,
	.account .add-table td {
        padding: 8px 10px 7px;
        font-size: 16px;
    }
    .reg-table .btn-sm {
        font-size: 16px;
        padding: 0.25rem 0.5rem;
    }

    .account.events-list .reg-table .btn {
        padding: 4px 8px;
        font-size: 14px;
    }

    .camp .reg-table th,
    .retreat .reg-table th,
    .schedule .reg-table th,
    .account.events-list .reg-table th,
    .bus-schedule .bus-schedule-table th {
        font-weight: bold;
    }

    .camp .reg-table .btn i,
    .retreat .reg-table .btn i,
    .schedule .reg-table .btn i,
    .account.events-list .reg-table .btn i {
        display: inline;
    }
	.serve.adult .nav-tabs .nav-link {
		padding: .5rem 1rem;
		font-weight: bold;
	}
	.serve.adult .nav-tabs .nav-link i {
		display: inline-block;
	}
    ul.four-col, ol.four-col {
        column-count: 4;
    }
    .account .add-btn {
        margin-top: 35px;
        margin-bottom: 0;
        width: 100%;
    }
	.account .add-table input {
		margin: 10px 10px 10px 15px;
	}
    footer {
        font-size: 16px;
    }
}

@media (min-width: 768px) {
    .body-content {
        padding: 40px 40px 0;
    }

    .breadcrumb {
        margin-left: 40px;
    }

    .breadcrumb-nav p.share-links {
        margin-right: 40px;
    }

    /* Bump up size of carousel content */
    #home .carousel-item {
        height: 24rem;
    }

    #home .carousel-caption h1 {
        font-size: 48px;
        line-height: 48px;
        margin: 0;
    }

    #home .carousel-caption h1 span.predication {
        font-size: 80px;
        line-height: 80px;
        margin-bottom: 10px;
    }

    #home .carousel-caption p {
        font-size: 1.25rem;
        line-height: 1.4;
    }

    #home .carousel-caption .btn-primary,
    #home .carousel-caption a.btn-primary {
        font-size: 20px;
    }

    .featurette-heading {
        font-size: 50px;
    }

    h1.display-4 {
        font-size: 40px;
    }

    h3.script {
        font-size: 27px;
        margin-bottom: 15px;
    }

    .home-about img {
        margin: -40px 0;
    }

    .top-border-fade {
        margin-right: -40px;
        margin-left: -40px;
        padding-left: 40px;
        padding-right: 40px;
    }

    .row.top-border-fade {
        margin-right: -40px;
        margin-left: -40px;
        padding-left: 25px;
        padding-right: 25px;
    }

    #home .reg-table h3.icon {
        font-size: 20px;
    }

    .reg-table .speaker.event-speaker-no-type,
    .reg-table .event-type-column {
        display: table-cell;
    }

    .activities {
        margin-left: -40px;
        margin-right: -40px;
    }

    #home .activities {
        margin: 30px 0 50px;
    }

    .about #banner {
        padding: 260px 0 40px;
    }

    #cb-about.about.winter .about-summary,
    #cb-about.about.winter .story {
        background-color: transparent;
    }
    #cb-about.about .about-summary {
        margin-bottom: 20px;
    }
    #cb-about.about .story {
        margin-bottom: 0;
    }
    div.history .about-summary {
        margin-bottom: 0;
    }
    .about .activity-info,
    .about .more-about-info,
    div.history .founder-info,
    div.history .book-info {
        padding: 40px 0;
    }
	.activities-facilities .activities-facilities-info {
        padding: 50px 0;
    }
    .about .more-about-info {
        background: #f1e8d6;
        background-repeat: no-repeat;
        background-size: cover;
        background-position: 150px center;
    }
    .about.summer .more-about-info {
        background-image: url(https://www.lvalive.com/cf/19/images/bg_buses-c50.jpg);
    }
    .about.fall .more-about-info {
        background-image: url(https://www.lvalive.com/cf/19/images/bg_fall_lakeside.jpg);
        background-size: cover;
    }
    .about.winter .more-about-info {
        background-image: url(https://www.lvalive.com/cf/19/images/bg_winter_tree-c50.jpg);
        background-size: cover;
    }

    .about .activity-info .script,
    .about .more-about-info .script, 
	.activities-facilities .activities-facilities-info .script {
        font-size: 45px;
    }

    .about .activity-info {
        background-position: -460px top;
    }

    div.history .founder-info {
        background-size: 100%, auto;
    }

    div.history .founder-info h3 + p {
        font-size: 20px;
    }

    .history img.barakel-book {
        margin: -30px 0 -55px;
    }
    .activities-facilities .activities-facilities-info {
        background: #111 url(https://www.lvalive.com/cf/19/images/bg_activities-c60.jpg) no-repeat center top;
        background-size: cover;
    }
    .activities-facilities.fall .activities-facilities-info {
        background: #111 url(https://www.lvalive.com/cf/19/images/bg_activities_fall.jpg) no-repeat center top;
        background-size: cover;
    }
    body.no-webp .activities-facilities.winter .activities-facilities-info {
        background: #111 url(https://www.lvalive.com/cf/19/images/bg_activities_winter.jpg) no-repeat center top;
        background-size: cover;
    }
    body.webp .activities-facilities.winter .activities-facilities-info {
        background: #111 url(https://www.lvalive.com/cf/19/images/bg_activities_winter.webp) no-repeat center top;
        background-size: cover;
    }
    .schedule h2 {
        font-size: 22px;
    }

    .bus-schedule-table th.bus-tues,
    .bus-schedule-table th.bus-mon {
        min-width: 85px;
    }

    img.rotate-right {
        transform: rotate(4deg);
    }

    img.rotate-left {
        transform: rotate(-4deg);
    }
    .account .available-events h3.card-title {
        margin-bottom: 0;
    }

    .account .show-waitlist {
        float: right;
        margin-top: 5px;
    }

    .account .reg-progress-bar {
        font-size: 18px;
        border-radius: 50px;
    }

    footer {
        margin: 50px 0 0;
        padding: 25px 40px 10px;
    }

    #copyright {
        margin: 0;
        padding: 8px 40px;
        border-bottom: 1px solid #111;
    }
}


@media (min-width: 992px) {
    .navbar {
        height: 63px;
    }

    .navbar-collapse .navbar-nav {
        padding: 0;
    }

    a.navbar-brand img#logo-blockhouse {
        display: block;
        margin: 0 auto -4px;
        width: 77px;
        padding-left: 9px;
    }

    #home a.navbar-brand img#logo-blockhouse {
        margin-bottom: 10px;
    }

    a.navbar-brand {
        font: 50px/60px Gin, impact;
        letter-spacing: -0.015em;
        margin-bottom: -90px;
        margin-left: -12px;
        padding: 15px 45px 30px;
        width: 368px;
    }

    #home a.navbar-brand {
        font: 83px/90px Gin, impact;
        margin-bottom: -155px;
        padding-bottom: 35px;
    }

    #home a.navbar-brand .logo-camp {
        font: 36px/32px termina;
        display: block;
        text-align: center;
        letter-spacing: 0.02em;
        text-transform: uppercase;
        font-weight: bold;
        margin-bottom: -15px;
    }

    .navbar-brand .tagline {
        font-size: 10px;
    }

    /* The following transitions shrink and expand the logo on scroll */
    .navbar.scrolled a.navbar-brand,
    #home .navbar.scrolled a.navbar-brand .logo-camp,
    .navbar.scrolled a.navbar-brand .tagline,
    .navbar.scrolled a.navbar-brand img#logo-blockhouse {
        -webkit-transition: all .4s;
        transition: all .4s;
        transition-timing-function: ease;
    }

    .navbar a.navbar-brand,
    .navbar a.navbar-brand .tagline,
    .navbar a.navbar-brand img#logo-blockhouse {
        -webkit-transition: all .4s;
        transition: all .4s;
        transition-timing-function: ease;
    }

    .navbar.scrolled a.navbar-brand {
        margin-bottom: -7px;
        margin-top: -4px;
        line-height: 70px;
    }

    #home .navbar.scrolled a.navbar-brand {
        margin-bottom: -50px;
        margin-top: -84px;
        font-size: 60px;
        line-height: 60px;
    }

    .navbar.scrolled a.navbar-brand img#logo-blockhouse {
        width: 50px;
        margin-top: -20px;
        opacity: 0;
    }

    #home .navbar.scrolled a.navbar-brand .logo-camp {
        font-size: 25px;
        padding-bottom: 10px;
        opacity: 0;
    }

    .navbar.scrolled a.navbar-brand .tagline {
        margin-top: -20px;
        font-size: 6px;
        opacity: 0;
        line-height: 10px;
    }

    .dropdown-menu {
        background: #fff;
        border: 1px solid #d0cdc7;
        box-shadow: 0 3px 5px rgba(0, 0, 0, 0.2);
        margin: 0;
    }

    .dropdown:hover .dropdown-menu {
        display: block;
        /* makes dropdowns appear on hover */
    }

    .dropdown-item.active,
    .dropdown-item:active {
        background: #d7dacc;
        cursor: default;
        color: #2e3429;
        text-shadow: 0 1px 0 rgba(255, 255, 255, 0.3);
        box-shadow: none;
    }

    .navbar-dark .navbar-nav .nav-link {
        background: url(https://www.lvalive.com/cf/19/images/bg_nav_sep.png) no-repeat center right;
        background-size: 2px 48px;
        padding-left: 0.6rem;
        padding-right: 0.6rem;
        font-size: 17px;
        font-family: "proxima-nova-condensed", sans-serif;
    }

    .dropdown-menu.search-dropdown {
        width: 270px;
    }

    .search-dropdown .form-control {
        border-color: #7d8560;
    }

    a.dropdown-item,
    a:visited.dropdown-item {
        color: #2e3429;
        font-family: "proxima-nova-condensed";
    }

    .dropdown-divider {
        border-top: 1px solid #e9ecef;
        box-shadow: none;
    }

    .navbar-nav.social-links {
        display: flex;
    }

    .navbar-nav.social-links .nav-link {
        padding-left: 0.25rem;
        padding-right: 0.25rem;
        font-size: 14px;
    }

    #home .carousel-indicators {
        bottom: 10px;
    }

    #home .carousel-item {
        height: 30rem;
    }

    .about #banner {
        padding: 200px 0 40px;
    }
	div.media.album #banner img {
		margin-top: -175px; /*since we're using a normal size image we need to center it */
	}

    .about #banner h1 {
        font-size: 38px;
    }

    .about #banner h3.icon {
        padding-top: 40px;
    }

    .about .activity-info {
        background-position: center top;
    }

    .about .more-about-info {
        background-position: 200px center;
    }

    div.history #banner {
        padding: 290px 0 40px;
    }

    div.history .founder-info h3.script {
        font-size: 36px;
    }

    div.history .book-info {
        padding: 25px 0;
    }

    div.history .book-info h2 {
        font-size: 29px;
    }

    .history img.barakel-book {
        margin: -82px 0 -38px;
    }

    h1.display-4 {
        font-size: 60px;
    }

    #home .home-about h1 {
        font-size: 34px;
        line-height: 48px;
    }

    .news h2, div.resident-staff .body-content .card h2 {
        font-size: 44px;
    }

    .row .top-border-fade {
        margin-right: -15px;
        /* to account for the .sidebar div to the right */
        border-right: 1px solid #fff;
    }

    .sidebar {
        margin-top: 40px;
        padding-left: 40px;
        border-left: 1px solid #c2b8b5;
    }

    .top-border-fade .sidebar {
        margin-top: 0;
        padding-left: 15px;
        border-left: 0;
    }

    .home-about img {
        margin: -60px 0;
    }

    #home .registration table {
        margin-bottom: 40px;
    }

    .activities h5 {
        font: 22px/28px termina;
        margin-top: 35px;
    }

    .activities ul {
        margin-bottom: 15px;
        padding: 0 35px 0 0;
    }

    #home .activities ul {
        padding: 0 35px;
    }

    .activities ul li {
        font-size: 22px;
    }

    #home .reg-table .info p {
        margin-top: 9px;
    }

    .account .account-links p {
        margin-bottom: 0;
    }

    .account .user-links {
        float: right;
    }

    #copyright {
        text-align: right;
    }
}

@media (min-width: 1200px) {
    :root {
        --sv: 0.75;
    }

    /* above 1200px */
    .h1, .h2, .h3, .h4, .h5, .h6, h1, h2, h3, h4, h5, h6 {
        margin-bottom: calc(0.667vw * var(--sv));
    }
    table {
        margin: calc(1.25vw * var(--sv)) 0;
    }
    hr {
        margin-top: 1vw;
        margin-bottom: 1vw;
        border-top: 0.1vw solid rgba(0,0,0,.1);
    }
    .mb-3, .my-3 {
        margin-bottom: calc(1.33vw * var(--sv))!important;
    }
    .mt-3, .my-3 {
        margin-top: calc(1.33vw * var(--sv))!important;
    }
    .mb-4, .my-4 {
        margin-bottom: calc(3vw * var(--sv))!important;
    }
    .p-1 {
        padding: .3vw !important;
    }
    .p-2 {
        padding: .5vw!important;
    }
    .ml-2, .mx-2 {
        margin-left: .5vw!important;
    }
    .mr-2, .mx-2 {
        margin-right: .5vw!important;
    }

    .row.top-border-fade {
        padding: calc(3.33vw*var(--sv)) calc(1.25vw*var(--sv)) 0;
        margin-right: -2vw; /* this matches .body-content padding */
        margin-left: -2vw;
    }
    .navbar-dark .navbar-nav .nav-link {
        padding-left: calc(1.13vw*var(--sv));
        padding-right: calc(1.13vw*var(--sv));
    }
    img.shadow, .carousel-inner.shadow {
        box-shadow: 0 0.08vw 0.2vw rgba(0, 0, 0, 0.2) !important;
    }
    img.border, .carousel-inner.border {
        border: 0.26vw solid #fff !important;
    }

    .navbar-dark .navbar-nav .nav-link,
    .blockquote {
        font-size: calc(1.667vw * var(--sv));
    }

    .navbar .navbar-nav.social-links .nav-link {
        padding-left: calc(0.53vw * var(--sv));
        padding-right: calc(0.53vw * var(--sv));
        font-size: calc(1.83vw * var(--sv));
    }
    .navbar {
        height: calc(5.25vw * var(--sv));
    }
    a.navbar-brand img#logo-blockhouse {
        width: calc(4.28vw*var(--sv));
    }
    .navbar.scrolled a.navbar-brand img#logo-blockhouse {
        margin-top: 0;
    }
    a.navbar-brand, body.webp a.navbar-brand {
        font: calc(4.167vw*var(--sv))/calc(5vw*var(--sv)) Gin, impact;
        padding: calc(6vw*var(--sv)) 2.5vw 1.67vw;
        width: calc(30.6vw * var(--sv));
        background-size: cover;
        margin-bottom: 0;
    }
    .navbar-brand .tagline {
        font-size: calc(0.833vw*var(--sv));
        line-height: calc(1.33vw*var(--sv));
    }
    .navbar.scrolled a.navbar-brand {
        margin-bottom: 0;
        margin-top: 0;
        padding-top: calc(2vw*var(--sv));;
        padding-bottom: calc(3vw*var(--sv));
        line-height: calc(4vw*var(--sv));
    }

    .container {
        max-width: calc(95vw * var(--sv));
    }

    #home .carousel-item, #banner
    {
        height: calc(50vw * var(--sv));
    }
    #banner {
        margin-top: calc(5.25vw * var(--sv));
    }

    .about #banner {
        background-size: cover;
        height: auto;
        padding: calc(25vw * var(--sv)) 0 calc(5.3vw * var(--sv));
    }

    div.history #banner {
        background-size: cover;
    }

    #home .home-about h1 {
        font-size: calc(3.33vw*var(--sv));
        line-height: calc(3.8vw*var(--sv));
    }
    
    h1.display-4
    {
        font-size: calc(4.5vw*var(--sv));
    }

    #home .carousel-caption h1
    {
        font-size: calc(4.2vw*var(--sv));
        line-height: calc(5vw*var(--sv));
        margin-bottom: 1vw;
    }

    #home .carousel-caption h1 span.predication {
        font-size: calc(7vw*var(--sv));
        line-height: calc(7.7vw*var(--sv));
		letter-spacing: -0.01em;
    }

    #home .carousel-indicators li {
        width: 0.8vw;
        height: 0.8vw;
        border-radius: 0.8vw;
    }

    body,
    .btn,
    #home .reg-table h4 span.open,
    footer,
    .dropdown-menu,
    .breadcrumb,
    .reg-table h3 span.open,
    .camp .reg-table th, .camp .reg-table td, .retreat .reg-table th, 
    .retreat .reg-table td, .schedule .reg-table th,
    .schedule .reg-table td, .bus-schedule .bus-schedule-table th, 
    .bus-schedule .bus-schedule-table td, .account.events-list .reg-table th,
    .account.events-list .reg-table td, .account .add-table th,
    .account .add-table td,
    .reg-table .btn-sm,
    .h4, h4
    {
        font-size: calc(1.333vw*var(--sv));
    }
    footer {
        margin: calc(3.3vw*var(--sv)) 0 0;
        padding: calc(1.5vw*var(--sv)) calc(3.5vw*var(--sv)) calc(0.5vw*var(--sv));
    }
    p {
        margin-bottom: calc(1.33vw*var(--sv));
    }

    th, td {
        padding: calc(0.667vw*var(--sv)) calc(0.8333vw*var(--sv)) calc(0.5vw*var(--sv));
        line-height: calc(1.733vw*var(--sv));
    }
    #home .reg-table .info p {
        margin-top: calc(0.75vw*var(--sv));
    }
    .reg-table {
        padding: calc(1.67vw*var(--sv));
    }

    .camp .reg-table th, .camp .reg-table td, .retreat .reg-table th, .retreat .reg-table td, .schedule .reg-table th, .schedule .reg-table td, .bus-schedule .bus-schedule-table th, .bus-schedule .bus-schedule-table td, .account.events-list .reg-table th, .account.events-list .reg-table td, .account .add-table th, .account .add-table td {
        padding: calc(0.5vw*var(--sv)) calc(0.8333vw*var(--sv)) calc(0.5833vw*var(--sv));
    }

    .schedule .reg-table .btn, .account.events-list .reg-table .btn {
        font-size: calc(1.08vw*var(--sv));
        padding: calc(0.167vw*var(--sv)) calc(0.667vw*var(--sv));
    }

    .col, .col-1, .col-10, .col-11, .col-12, .col-2, .col-3, .col-4, .col-5, .col-6, .col-7, .col-8, .col-9, .col-auto, .col-lg, .col-lg-1, .col-lg-10, .col-lg-11, .col-lg-12, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-auto, .col-md, .col-md-1, .col-md-10, .col-md-11, .col-md-12, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-auto, .col-sm, .col-sm-1, .col-sm-10, .col-sm-11, .col-sm-12, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-auto, .col-xl, .col-xl-1, .col-xl-10, .col-xl-11, .col-xl-12, .col-xl-2, .col-xl-3, .col-xl-4, .col-xl-5, .col-xl-6, .col-xl-7, .col-xl-8, .col-xl-9, .col-xl-auto {
        padding-right: calc(1.25vw*var(--sv));
        padding-left: calc(1.25vw*var(--sv));
    }

    .bus-schedule .bus-schedule-address {
        font-size: calc(0.9vw*var(--sv));
    }

    .body-content {
        padding: 2vw 2vw 0;
    }

    #home .carousel-caption p {
        margin-bottom: 2.5rem;
    }

    .breadcrumb {
        padding: calc(0.8333vw*var(--sv)) 0 calc(0.5vw*var(--sv));
        margin-left: calc(3.33vw*var(--sv));
    }
    .breadcrumb-item+.breadcrumb-item {
        padding-left: .5vw;
    }

    .schedule h2,
    #home .carousel-caption .btn-primary,
    #home .carousel-caption a.btn-primary {
        font-size: calc(1.833vw*var(--sv));
    }

    .reg-table .btn-sm,
    .btn, .btn-group-sm>.btn, .btn-sm {
        padding: 0.25vw 0.5vw;
        border-radius: 0.4vw;
    }

    .home-about img {
        margin: -80px 0;
    }

    #home .registration {
        padding: calc(4vw*var(--sv)) 0;
    }
    #home .registration table {
        margin-bottom: calc(3.33vw*var(--sv));
    }
    #home .activities {
        margin: calc(2.5vw*var(--sv)) 0 calc(4vw*var(--sv));
    }

    div.history #banner {
        padding-top: 340px;
    }

    #home .reg-table h3.icon,
    .about #banner .story h3.icon,
    .lead,
    .h5, h5,
    #home .reg-table h4,
    .about #banner .story h3.icon {
        font-size: calc(1.667vw*var(--sv));
    }

    h3.icon a {
        padding: calc(.833vw*var(--sv)) 0;
        border-top: calc(.1vw*var(--sv)) solid #7d8560
    }

    .media .results h3.icon {
        font-size: calc(1.1667vw*var(--sv));
    }

    #home .reg-table h3.icon {
        padding: 1.33vw 2.33vw;
    }

    h3.icon + img,
    .page-info img,
    #home .reg-table img {
        width: 100%;
    }

    .about #banner h1 {
        font-size: calc(3.83vw*var(--sv));
    }

    .about .activity-info h3.termina,
    .dropdown-header,
    div.history .founder-info h3.termina, 
    .activities-facilities .activities-facilities-info h3.termina,
    #cb-about.about .story p {
        font-size: calc(1.5vw*var(--sv));
    }

    .dropdown-item, .dropdown-header {
        padding: calc(0.3vw*var(--sv)) calc(1.6vw*var(--sv));
    }

    #cb-about.about img.uncle-johnnie {
        margin: -10px 0 -50px;
    }
    .activities-facilities img.lake {
        margin: -10px 0 -70px;
    }
    .about .more-about-info {
        background-position: right center;
        background-size: contain
    }
    .about .more-about-info img {
        width: 100%;
    }

    #cb-about.about .about-summary p {
        font-size: calc(1.833vw*var(--sv));
    }

    div.history .founder-info h3.script {
        font-size: calc(3.5vw*var(--sv));
    }

    div.history .book-info {
        padding: 40px 0;
    }

    div.history .book-info h2 {
        font-size: 34px;
    }

    div.history .book-info h2 + p {
        font-size: calc(2.833vw*var(--sv));
    }

    div.history img.barakel-book {
        margin: -109px 0 -55px;
    }

    .bus-schedule-table th.bus-tues {
        min-width: 85px;
    }

    .bus-schedule-table th.bus-mon {
        min-width: 102px;
    }

    .activities {
        /* this negative margin undoes the padding of .body-content */
        margin-left: -2vw;
        margin-right: -2vw;
    }

    .activities h5 {
        font: calc(1.833vw*var(--sv))/ calc(2.333vw*var(--sv)) termina;
        margin-top: 40px;
    }

    .activities ul li {
        font-size: calc(2.16667vw*var(--sv));
    }

    .h2, h2 {
        font-size: calc(2.667vw*var(--sv));
    }

    .h3, h3 {
        font-size: calc(2.333vw*var(--sv));
    }
    .home-about h5 {
        font-size: calc(0.8vw*var(--sv));
    }

    .activities .row img {
        width: 22.5vw;
    }

    .reg-table h3.icon {
        font: calc(1.333vw*var(--sv)) termina;
        padding: calc(1.6667vw * var(--sv));
        margin: calc(-1.67vw*var(--sv)) calc(-1.67vw*var(--sv)) 1.3vw;
    }
    h3.icon {
        font: calc(1.0833vw*var(--sv))/calc(1.5vw*var(--sv)) termina;
        padding: calc(0.833vw * var(--sv)) 0;
    }
    h3.icon a.btn-outline-light {
        padding: calc(.417vw*var(--sv)) calc(.833vw*var(--sv));
        margin-top: calc(-.5vw*var(--sv));
    }
    h3.script {
        font-size: calc(2.2vw*var(--sv));
        margin-bottom: 0.8333vw;
    }
    .about .activity-info .script,
    .about .more-about-info .script, 
	.activities-facilities .activities-facilities-info .script {
        font-size: calc(3.75vw*var(--sv));
    }
    .about .activity-info,
    .about .more-about-info,
    div.history .founder-info,
    div.history .book-info {
        padding: 3.3vw 0;
    }
    p {
        margin-bottom: 1.3vw;
    }
    .directions iframe {
        height: 30vw;
    }
    .custom-select {
        height: calc(2.5vw * var(--sv));
    }
    .card-body {
        padding: calc(1vw*var(--sv));
    }
    .card {
        box-shadow: 0 0.2vw 0.2vw rgba(0, 0, 0, 0.2);
        border: 0.1vw solid rgba(0,0,0,.125);
        border-radius: 0.2vw;
    }
    .serve .top-border-fade ol, .serve .top-border-fade ul, .donate .modal ol {
        padding-left: calc(1.5vw*var(--sv));
    }
    .serve .top-border-fade ol li, .donate .modal ol li {
        padding-left: calc(.5vw*var(--sv));
    }
    .serve.adult .nav-tabs .nav-link {
        padding: calc(.5vw*var(--sv)) calc(1vw*var(--sv));
    }

    /* study serve page */
    .study-serve {
        font-size: calc(1.44vw*var(--sv));
    }
    .study-serve h2,
    .ss-subpoint > .ss-bg-cover {
        font-size: calc(3.889vw*var(--sv));
    }
    .ss-subpoint > .ss-bg-cover {
        padding: calc(1.3vw*var(--sv));
        min-height: calc(36vw*var(--sv));
    }
    .ss-header {
        font-size: calc(8.556vw*var(--sv));
    }
    .study-serve .strong-bigger strong {
        font-size: calc(2.44vw*var(--sv));
    }
}


/*	=6: Misc
=============================================== */

hr.green {
    border-top: 2px solid #7d8560;
}
hr.orange {
    border-top: 1px solid #ff931e;
}

acronym {
    font-size: 80%;
    text-transform: uppercase;
    letter-spacing: .045em;
    text-decoration: none;
}

/* Add pointer on hover */
.pointer:hover { cursor: pointer; }

audio {
    width: 100%;
    margin: 0 0 5px;
}
.kern-tight {
	letter-spacing: -0.15em;
}
.jumbotron {
    padding: 2rem;
}
.alert {
    padding: 25px;
    box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.5);
    border-radius: 3px;
}

.alert *:last-child {
    margin-bottom: 0;
}

.alert-primary {
    color: #11688b;
    background-color: #d5e1ef;
    border-color: #b8c7da;
}

.alert-secondary {
    background: #ece7e0;
    border-color: #c2b8b5;
}

.alert-success {
    color: #2e3429;
    background-color: #d9dcd0;
    border-color: #b0b79c;
}

.alert h5 i {
    font-size: 85%;
    opacity: .7;
}

.alert hr {
    box-shadow: 0 1px 0 rgba(255, 255, 255, 0.5);
}

.alert .text-muted {
    color: inherit !important;
    opacity: 0.6;
}

.account strong i {
    color: #333;
}

.cb-video-container {
	position: relative;
	padding-bottom: 56.25%;
	padding-top: 30px;
	height: 0;
	overflow: hidden;
}

.cb-video-container iframe, .cb-video-container object, .cb-video-container embed {
	position: absolute;
	top: 0;
	left: 0;
	width: 100%;
	height: 100%;
}

/* show content depending on whether collapse state
 * is collapsed or not for bootstrap's collapse button/a
 * elements.
 */
.show-collapsed, .show-not-collapsed {
    display: none;
}
[aria-expanded="true"] .show-not-collapsed,
[aria-expanded="false"] .show-collapsed {
    display: inline-block;
}

/*! jQuery UI - v1.11.4 - 2015-12-07
* http://jqueryui.com
* Includes: core.css, draggable.css, resizable.css, selectable.css, sortable.css, accordion.css, autocomplete.css, button.css, datepicker.css, dialog.css, menu.css, progressbar.css, selectmenu.css, slider.css, spinner.css, tooltip.css, theme.css
* To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=Verdana%2CArial%2Csans-serif&fwDefault=normal&fsDefault=1.1em&cornerRadius=4px&bgColorHeader=cccccc&bgTextureHeader=highlight_soft&bgImgOpacityHeader=75&borderColorHeader=aaaaaa&fcHeader=222222&iconColorHeader=222222&bgColorContent=ffffff&bgTextureContent=flat&bgImgOpacityContent=75&borderColorContent=aaaaaa&fcContent=222222&iconColorContent=222222&bgColorDefault=e6e6e6&bgTextureDefault=glass&bgImgOpacityDefault=75&borderColorDefault=d3d3d3&fcDefault=555555&iconColorDefault=888888&bgColorHover=dadada&bgTextureHover=glass&bgImgOpacityHover=75&borderColorHover=999999&fcHover=212121&iconColorHover=454545&bgColorActive=ffffff&bgTextureActive=glass&bgImgOpacityActive=65&borderColorActive=aaaaaa&fcActive=212121&iconColorActive=454545&bgColorHighlight=fbf9ee&bgTextureHighlight=glass&bgImgOpacityHighlight=55&borderColorHighlight=fcefa1&fcHighlight=363636&iconColorHighlight=2e83ff&bgColorError=fef1ec&bgTextureError=glass&bgImgOpacityError=95&borderColorError=cd0a0a&fcError=cd0a0a&iconColorError=cd0a0a&bgColorOverlay=aaaaaa&bgTextureOverlay=flat&bgImgOpacityOverlay=0&opacityOverlay=30&bgColorShadow=aaaaaa&bgTextureShadow=flat&bgImgOpacityShadow=0&opacityShadow=30&thicknessShadow=8px&offsetTopShadow=-8px&offsetLeftShadow=-8px&cornerRadiusShadow=8px
* Copyright jQuery Foundation and other contributors; Licensed MIT */

.ui-helper-hidden{display:none}.ui-helper-hidden-accessible{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.ui-helper-reset{margin:0;padding:0;border:0;outline:0;line-height:1.3;text-decoration:none;font-size:100%;list-style:none}.ui-helper-clearfix:before,.ui-helper-clearfix:after{content:"";display:table;border-collapse:collapse}.ui-helper-clearfix:after{clear:both}.ui-helper-clearfix{min-height:0}.ui-helper-zfix{width:100%;height:100%;top:0;left:0;position:absolute;opacity:0;filter:Alpha(Opacity=0)}.ui-front{z-index:100}.ui-state-disabled{cursor:default!important}.ui-icon{display:block;text-indent:-99999px;overflow:hidden;background-repeat:no-repeat}.ui-widget-overlay{position:fixed;top:0;left:0;width:100%;height:100%}.ui-draggable-handle{-ms-touch-action:none;touch-action:none}.ui-resizable{position:relative}.ui-resizable-handle{position:absolute;font-size:0.1px;display:block;-ms-touch-action:none;touch-action:none}.ui-resizable-disabled .ui-resizable-handle,.ui-resizable-autohide .ui-resizable-handle{display:none}.ui-resizable-n{cursor:n-resize;height:7px;width:100%;top:-5px;left:0}.ui-resizable-s{cursor:s-resize;height:7px;width:100%;bottom:-5px;left:0}.ui-resizable-e{cursor:e-resize;width:7px;right:-5px;top:0;height:100%}.ui-resizable-w{cursor:w-resize;width:7px;left:-5px;top:0;height:100%}.ui-resizable-se{cursor:se-resize;width:12px;height:12px;right:1px;bottom:1px}.ui-resizable-sw{cursor:sw-resize;width:9px;height:9px;left:-5px;bottom:-5px}.ui-resizable-nw{cursor:nw-resize;width:9px;height:9px;left:-5px;top:-5px}.ui-resizable-ne{cursor:ne-resize;width:9px;height:9px;right:-5px;top:-5px}.ui-selectable{-ms-touch-action:none;touch-action:none}.ui-selectable-helper{position:absolute;z-index:100;border:1px dotted black}.ui-sortable-handle{-ms-touch-action:none;touch-action:none}.ui-accordion .ui-accordion-header{display:block;cursor:pointer;position:relative;margin:2px 0 0 0;padding:.5em .5em .5em .7em;min-height:0;font-size:100%}.ui-accordion .ui-accordion-icons{padding-left:2.2em}.ui-accordion .ui-accordion-icons .ui-accordion-icons{padding-left:2.2em}.ui-accordion .ui-accordion-header .ui-accordion-header-icon{position:absolute;left:.5em;top:50%;margin-top:-8px}.ui-accordion .ui-accordion-content{padding:1em 2.2em;border-top:0;overflow:auto}.ui-autocomplete{position:absolute;top:0;left:0;cursor:default}.ui-button{display:inline-block;position:relative;padding:0;line-height:normal;margin-right:.1em;cursor:pointer;vertical-align:middle;text-align:center;overflow:visible}.ui-button,.ui-button:link,.ui-button:visited,.ui-button:hover,.ui-button:active{text-decoration:none}.ui-button-icon-only{width:2.2em}button.ui-button-icon-only{width:2.4em}.ui-button-icons-only{width:3.4em}button.ui-button-icons-only{width:3.7em}.ui-button .ui-button-text{display:block;line-height:normal}.ui-button-text-only .ui-button-text{padding:.4em 1em}.ui-button-icon-only .ui-button-text,.ui-button-icons-only .ui-button-text{padding:.4em;text-indent:-9999999px}.ui-button-text-icon-primary .ui-button-text,.ui-button-text-icons .ui-button-text{padding:.4em 1em .4em 2.1em}.ui-button-text-icon-secondary .ui-button-text,.ui-button-text-icons .ui-button-text{padding:.4em 2.1em .4em 1em}.ui-button-text-icons .ui-button-text{padding-left:2.1em;padding-right:2.1em}input.ui-button{padding:.4em 1em}.ui-button-icon-only .ui-icon,.ui-button-text-icon-primary .ui-icon,.ui-button-text-icon-secondary .ui-icon,.ui-button-text-icons .ui-icon,.ui-button-icons-only .ui-icon{position:absolute;top:50%;margin-top:-8px}.ui-button-icon-only .ui-icon{left:50%;margin-left:-8px}.ui-button-text-icon-primary .ui-button-icon-primary,.ui-button-text-icons .ui-button-icon-primary,.ui-button-icons-only .ui-button-icon-primary{left:.5em}.ui-button-text-icon-secondary .ui-button-icon-secondary,.ui-button-text-icons .ui-button-icon-secondary,.ui-button-icons-only .ui-button-icon-secondary{right:.5em}.ui-buttonset{margin-right:7px}.ui-buttonset .ui-button{margin-left:0;margin-right:-.3em}input.ui-button::-moz-focus-inner,button.ui-button::-moz-focus-inner{border:0;padding:0}.ui-datepicker{width:17em;padding:.2em .2em 0;display:none}.ui-datepicker .ui-datepicker-header{position:relative;padding:.2em 0}.ui-datepicker .ui-datepicker-prev,.ui-datepicker .ui-datepicker-next{position:absolute;top:2px;width:1.8em;height:1.8em}.ui-datepicker .ui-datepicker-prev-hover,.ui-datepicker .ui-datepicker-next-hover{top:1px}.ui-datepicker .ui-datepicker-prev{left:2px}.ui-datepicker .ui-datepicker-next{right:2px}.ui-datepicker .ui-datepicker-prev-hover{left:1px}.ui-datepicker .ui-datepicker-next-hover{right:1px}.ui-datepicker .ui-datepicker-prev span,.ui-datepicker .ui-datepicker-next span{display:block;position:absolute;left:50%;margin-left:-8px;top:50%;margin-top:-8px}.ui-datepicker .ui-datepicker-title{margin:0 2.3em;line-height:1.8em;text-align:center}.ui-datepicker .ui-datepicker-title select{font-size:1em;margin:1px 0}.ui-datepicker select.ui-datepicker-month,.ui-datepicker select.ui-datepicker-year{width:45%}.ui-datepicker table{width:100%;font-size:.9em;border-collapse:collapse;margin:0 0 .4em}.ui-datepicker th{padding:.7em .3em;text-align:center;font-weight:bold;border:0}.ui-datepicker td{border:0;padding:1px}.ui-datepicker td span,.ui-datepicker td a{display:block;padding:.2em;text-align:right;text-decoration:none}.ui-datepicker .ui-datepicker-buttonpane{background-image:none;margin:.7em 0 0 0;padding:0 .2em;border-left:0;border-right:0;border-bottom:0}.ui-datepicker .ui-datepicker-buttonpane button{float:right;margin:.5em .2em .4em;cursor:pointer;padding:.2em .6em .3em .6em;width:auto;overflow:visible}.ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current{float:left}.ui-datepicker.ui-datepicker-multi{width:auto}.ui-datepicker-multi .ui-datepicker-group{float:left}.ui-datepicker-multi .ui-datepicker-group table{width:95%;margin:0 auto .4em}.ui-datepicker-multi-2 .ui-datepicker-group{width:50%}.ui-datepicker-multi-3 .ui-datepicker-group{width:33.3%}.ui-datepicker-multi-4 .ui-datepicker-group{width:25%}.ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header,.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header{border-left-width:0}.ui-datepicker-multi .ui-datepicker-buttonpane{clear:left}.ui-datepicker-row-break{clear:both;width:100%;font-size:0}.ui-datepicker-rtl{direction:rtl}.ui-datepicker-rtl .ui-datepicker-prev{right:2px;left:auto}.ui-datepicker-rtl .ui-datepicker-next{left:2px;right:auto}.ui-datepicker-rtl .ui-datepicker-prev:hover{right:1px;left:auto}.ui-datepicker-rtl .ui-datepicker-next:hover{left:1px;right:auto}.ui-datepicker-rtl .ui-datepicker-buttonpane{clear:right}.ui-datepicker-rtl .ui-datepicker-buttonpane button{float:left}.ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current,.ui-datepicker-rtl .ui-datepicker-group{float:right}.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header,.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header{border-right-width:0;border-left-width:1px}.ui-dialog{overflow:hidden;position:absolute;top:0;left:0;padding:.2em;outline:0}.ui-dialog .ui-dialog-titlebar{padding:.4em 1em;position:relative}.ui-dialog .ui-dialog-title{float:left;margin:.1em 0;white-space:nowrap;width:90%;overflow:hidden;text-overflow:ellipsis}.ui-dialog .ui-dialog-titlebar-close{position:absolute;right:.3em;top:50%;width:20px;margin:-10px 0 0 0;padding:1px;height:20px}.ui-dialog .ui-dialog-content{position:relative;border:0;padding:.5em 1em;background:none;overflow:auto}.ui-dialog .ui-dialog-buttonpane{text-align:left;border-width:1px 0 0 0;background-image:none;margin-top:.5em;padding:.3em 1em .5em .4em}.ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset{float:right}.ui-dialog .ui-dialog-buttonpane button{margin:.5em .4em .5em 0;cursor:pointer}.ui-dialog .ui-resizable-se{width:12px;height:12px;right:-5px;bottom:-5px;background-position:16px 16px}.ui-draggable .ui-dialog-titlebar{cursor:move}.ui-menu{list-style:none;padding:0;margin:0;display:block;outline:none}.ui-menu .ui-menu{position:absolute}.ui-menu .ui-menu-item{position:relative;margin:0;padding:3px 1em 3px .4em;cursor:pointer;min-height:0;list-style-image:url("data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7")}.ui-menu .ui-menu-divider{margin:5px 0;height:0;font-size:0;line-height:0;border-width:1px 0 0 0}.ui-menu .ui-state-focus,.ui-menu .ui-state-active{margin:-1px}.ui-menu-icons{position:relative}.ui-menu-icons .ui-menu-item{padding-left:2em}.ui-menu .ui-icon{position:absolute;top:0;bottom:0;left:.2em;margin:auto 0}.ui-menu .ui-menu-icon{left:auto;right:0}.ui-progressbar{height:2em;text-align:left;overflow:hidden}.ui-progressbar .ui-progressbar-value{margin:-1px;height:100%}.ui-progressbar .ui-progressbar-overlay{background:url("data:image/gif;base64,R0lGODlhKAAoAIABAAAAAP///yH/C05FVFNDQVBFMi4wAwEAAAAh+QQJAQABACwAAAAAKAAoAAACkYwNqXrdC52DS06a7MFZI+4FHBCKoDeWKXqymPqGqxvJrXZbMx7Ttc+w9XgU2FB3lOyQRWET2IFGiU9m1frDVpxZZc6bfHwv4c1YXP6k1Vdy292Fb6UkuvFtXpvWSzA+HycXJHUXiGYIiMg2R6W459gnWGfHNdjIqDWVqemH2ekpObkpOlppWUqZiqr6edqqWQAAIfkECQEAAQAsAAAAACgAKAAAApSMgZnGfaqcg1E2uuzDmmHUBR8Qil95hiPKqWn3aqtLsS18y7G1SzNeowWBENtQd+T1JktP05nzPTdJZlR6vUxNWWjV+vUWhWNkWFwxl9VpZRedYcflIOLafaa28XdsH/ynlcc1uPVDZxQIR0K25+cICCmoqCe5mGhZOfeYSUh5yJcJyrkZWWpaR8doJ2o4NYq62lAAACH5BAkBAAEALAAAAAAoACgAAAKVDI4Yy22ZnINRNqosw0Bv7i1gyHUkFj7oSaWlu3ovC8GxNso5fluz3qLVhBVeT/Lz7ZTHyxL5dDalQWPVOsQWtRnuwXaFTj9jVVh8pma9JjZ4zYSj5ZOyma7uuolffh+IR5aW97cHuBUXKGKXlKjn+DiHWMcYJah4N0lYCMlJOXipGRr5qdgoSTrqWSq6WFl2ypoaUAAAIfkECQEAAQAsAAAAACgAKAAAApaEb6HLgd/iO7FNWtcFWe+ufODGjRfoiJ2akShbueb0wtI50zm02pbvwfWEMWBQ1zKGlLIhskiEPm9R6vRXxV4ZzWT2yHOGpWMyorblKlNp8HmHEb/lCXjcW7bmtXP8Xt229OVWR1fod2eWqNfHuMjXCPkIGNileOiImVmCOEmoSfn3yXlJWmoHGhqp6ilYuWYpmTqKUgAAIfkECQEAAQAsAAAAACgAKAAAApiEH6kb58biQ3FNWtMFWW3eNVcojuFGfqnZqSebuS06w5V80/X02pKe8zFwP6EFWOT1lDFk8rGERh1TTNOocQ61Hm4Xm2VexUHpzjymViHrFbiELsefVrn6XKfnt2Q9G/+Xdie499XHd2g4h7ioOGhXGJboGAnXSBnoBwKYyfioubZJ2Hn0RuRZaflZOil56Zp6iioKSXpUAAAh+QQJAQABACwAAAAAKAAoAAACkoQRqRvnxuI7kU1a1UU5bd5tnSeOZXhmn5lWK3qNTWvRdQxP8qvaC+/yaYQzXO7BMvaUEmJRd3TsiMAgswmNYrSgZdYrTX6tSHGZO73ezuAw2uxuQ+BbeZfMxsexY35+/Qe4J1inV0g4x3WHuMhIl2jXOKT2Q+VU5fgoSUI52VfZyfkJGkha6jmY+aaYdirq+lQAACH5BAkBAAEALAAAAAAoACgAAAKWBIKpYe0L3YNKToqswUlvznigd4wiR4KhZrKt9Upqip61i9E3vMvxRdHlbEFiEXfk9YARYxOZZD6VQ2pUunBmtRXo1Lf8hMVVcNl8JafV38aM2/Fu5V16Bn63r6xt97j09+MXSFi4BniGFae3hzbH9+hYBzkpuUh5aZmHuanZOZgIuvbGiNeomCnaxxap2upaCZsq+1kAACH5BAkBAAEALAAAAAAoACgAAAKXjI8By5zf4kOxTVrXNVlv1X0d8IGZGKLnNpYtm8Lr9cqVeuOSvfOW79D9aDHizNhDJidFZhNydEahOaDH6nomtJjp1tutKoNWkvA6JqfRVLHU/QUfau9l2x7G54d1fl995xcIGAdXqMfBNadoYrhH+Mg2KBlpVpbluCiXmMnZ2Sh4GBqJ+ckIOqqJ6LmKSllZmsoq6wpQAAAh+QQJAQABACwAAAAAKAAoAAAClYx/oLvoxuJDkU1a1YUZbJ59nSd2ZXhWqbRa2/gF8Gu2DY3iqs7yrq+xBYEkYvFSM8aSSObE+ZgRl1BHFZNr7pRCavZ5BW2142hY3AN/zWtsmf12p9XxxFl2lpLn1rseztfXZjdIWIf2s5dItwjYKBgo9yg5pHgzJXTEeGlZuenpyPmpGQoKOWkYmSpaSnqKileI2FAAACH5BAkBAAEALAAAAAAoACgAAAKVjB+gu+jG4kORTVrVhRlsnn2dJ3ZleFaptFrb+CXmO9OozeL5VfP99HvAWhpiUdcwkpBH3825AwYdU8xTqlLGhtCosArKMpvfa1mMRae9VvWZfeB2XfPkeLmm18lUcBj+p5dnN8jXZ3YIGEhYuOUn45aoCDkp16hl5IjYJvjWKcnoGQpqyPlpOhr3aElaqrq56Bq7VAAAOw==");height:100%;filter:alpha(opacity=25);opacity:0.25}.ui-progressbar-indeterminate .ui-progressbar-value{background-image:none}.ui-selectmenu-menu{padding:0;margin:0;position:absolute;top:0;left:0;display:none}.ui-selectmenu-menu .ui-menu{overflow:auto;overflow-x:hidden;padding-bottom:1px}.ui-selectmenu-menu .ui-menu .ui-selectmenu-optgroup{font-size:1em;font-weight:bold;line-height:1.5;padding:2px 0.4em;margin:0.5em 0 0 0;height:auto;border:0}.ui-selectmenu-open{display:block}.ui-selectmenu-button{display:inline-block;overflow:hidden;position:relative;text-decoration:none;cursor:pointer}.ui-selectmenu-button span.ui-icon{right:0.5em;left:auto;margin-top:-8px;position:absolute;top:50%}.ui-selectmenu-button span.ui-selectmenu-text{text-align:left;padding:0.4em 2.1em 0.4em 1em;display:block;line-height:1.4;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.ui-slider{position:relative;text-align:left}.ui-slider .ui-slider-handle{position:absolute;z-index:2;width:1.2em;height:1.2em;cursor:default;-ms-touch-action:none;touch-action:none}.ui-slider .ui-slider-range{position:absolute;z-index:1;font-size:.7em;display:block;border:0;background-position:0 0}.ui-slider.ui-state-disabled .ui-slider-handle,.ui-slider.ui-state-disabled .ui-slider-range{filter:inherit}.ui-slider-horizontal{height:.8em}.ui-slider-horizontal .ui-slider-handle{top:-.3em;margin-left:-.6em}.ui-slider-horizontal .ui-slider-range{top:0;height:100%}.ui-slider-horizontal .ui-slider-range-min{left:0}.ui-slider-horizontal .ui-slider-range-max{right:0}.ui-slider-vertical{width:.8em;height:100px}.ui-slider-vertical .ui-slider-handle{left:-.3em;margin-left:0;margin-bottom:-.6em}.ui-slider-vertical .ui-slider-range{left:0;width:100%}.ui-slider-vertical .ui-slider-range-min{bottom:0}.ui-slider-vertical .ui-slider-range-max{top:0}.ui-spinner{position:relative;display:inline-block;overflow:hidden;padding:0;vertical-align:middle}.ui-spinner-input{border:none;background:none;color:inherit;padding:0;margin:.2em 0;vertical-align:middle;margin-left:.4em;margin-right:22px}.ui-spinner-button{width:16px;height:50%;font-size:.5em;padding:0;margin:0;text-align:center;position:absolute;cursor:default;display:block;overflow:hidden;right:0}.ui-spinner a.ui-spinner-button{border-top:none;border-bottom:none;border-right:none}.ui-spinner .ui-icon{position:absolute;margin-top:-8px;top:50%;left:0}.ui-spinner-up{top:0}.ui-spinner-down{bottom:0}.ui-spinner .ui-icon-triangle-1-s{background-position:-65px -16px}.ui-tooltip{padding:8px;position:absolute;z-index:9999;max-width:300px;-webkit-box-shadow:0 0 5px #aaa;box-shadow:0 0 5px #aaa}body .ui-tooltip{border-width:2px}.ui-widget{font-family:Verdana,Arial,sans-serif;font-size:1.1em}.ui-widget .ui-widget{font-size:1em}.ui-widget input,.ui-widget select,.ui-widget textarea,.ui-widget button{font-family:Verdana,Arial,sans-serif;font-size:1em}.ui-widget-content{border:1px solid #aaa;background:#fff;color:#222}.ui-widget-content a{color:#222}.ui-widget-header{border:1px solid #aaa;background:#ccc url("images/ui-bg_highlight-soft_75_cccccc_1x100.png") 50% 50% repeat-x;color:#222;font-weight:bold}.ui-widget-header a{color:#222}.ui-state-default,.ui-widget-content .ui-state-default,.ui-widget-header .ui-state-default{border:1px solid #d3d3d3;background:#e6e6e6 url("images/ui-bg_glass_75_e6e6e6_1x400.png") 50% 50% repeat-x;font-weight:normal;color:#555}.ui-state-default a,.ui-state-default a:link,.ui-state-default a:visited{color:#555;text-decoration:none}.ui-state-hover,.ui-widget-content .ui-state-hover,.ui-widget-header .ui-state-hover,.ui-state-focus,.ui-widget-content .ui-state-focus,.ui-widget-header .ui-state-focus{border:1px solid #999;background:#dadada url("images/ui-bg_glass_75_dadada_1x400.png") 50% 50% repeat-x;font-weight:normal;color:#212121}.ui-state-hover a,.ui-state-hover a:hover,.ui-state-hover a:link,.ui-state-hover a:visited,.ui-state-focus a,.ui-state-focus a:hover,.ui-state-focus a:link,.ui-state-focus a:visited{color:#212121;text-decoration:none}.ui-state-active,.ui-widget-content .ui-state-active,.ui-widget-header .ui-state-active{border:1px solid #aaa;background:#fff url("images/ui-bg_glass_65_ffffff_1x400.png") 50% 50% repeat-x;font-weight:normal;color:#212121}.ui-state-active a,.ui-state-active a:link,.ui-state-active a:visited{color:#212121;text-decoration:none}.ui-state-highlight,.ui-widget-content .ui-state-highlight,.ui-widget-header .ui-state-highlight{border:1px solid #fcefa1;background:#fbf9ee url("images/ui-bg_glass_55_fbf9ee_1x400.png") 50% 50% repeat-x;color:#363636}.ui-state-highlight a,.ui-widget-content .ui-state-highlight a,.ui-widget-header .ui-state-highlight a{color:#363636}.ui-state-error,.ui-widget-content .ui-state-error,.ui-widget-header .ui-state-error{border:1px solid #cd0a0a;background:#fef1ec url("images/ui-bg_glass_95_fef1ec_1x400.png") 50% 50% repeat-x;color:#cd0a0a}.ui-state-error a,.ui-widget-content .ui-state-error a,.ui-widget-header .ui-state-error a{color:#cd0a0a}.ui-state-error-text,.ui-widget-content .ui-state-error-text,.ui-widget-header .ui-state-error-text{color:#cd0a0a}.ui-priority-primary,.ui-widget-content .ui-priority-primary,.ui-widget-header .ui-priority-primary{font-weight:bold}.ui-priority-secondary,.ui-widget-content .ui-priority-secondary,.ui-widget-header .ui-priority-secondary{opacity:.7;filter:Alpha(Opacity=70);font-weight:normal}.ui-state-disabled,.ui-widget-content .ui-state-disabled,.ui-widget-header .ui-state-disabled{opacity:.35;filter:Alpha(Opacity=35);background-image:none}.ui-state-disabled .ui-icon{filter:Alpha(Opacity=35)}.ui-icon{width:16px;height:16px}.ui-icon,.ui-widget-content .ui-icon{background-image:url("images/ui-icons_222222_256x240.png")}.ui-widget-header .ui-icon{background-image:url("images/ui-icons_222222_256x240.png")}.ui-state-default .ui-icon{background-image:url("images/ui-icons_888888_256x240.png")}.ui-state-hover .ui-icon,.ui-state-focus .ui-icon{background-image:url("images/ui-icons_454545_256x240.png")}.ui-state-active .ui-icon{background-image:url("images/ui-icons_454545_256x240.png")}.ui-state-highlight .ui-icon{background-image:url("images/ui-icons_2e83ff_256x240.png")}.ui-state-error .ui-icon,.ui-state-error-text .ui-icon{background-image:url("images/ui-icons_cd0a0a_256x240.png")}.ui-icon-blank{background-position:16px 16px}.ui-icon-carat-1-n{background-position:0 0}.ui-icon-carat-1-ne{background-position:-16px 0}.ui-icon-carat-1-e{background-position:-32px 0}.ui-icon-carat-1-se{background-position:-48px 0}.ui-icon-carat-1-s{background-position:-64px 0}.ui-icon-carat-1-sw{background-position:-80px 0}.ui-icon-carat-1-w{background-position:-96px 0}.ui-icon-carat-1-nw{background-position:-112px 0}.ui-icon-carat-2-n-s{background-position:-128px 0}.ui-icon-carat-2-e-w{background-position:-144px 0}.ui-icon-triangle-1-n{background-position:0 -16px}.ui-icon-triangle-1-ne{background-position:-16px -16px}.ui-icon-triangle-1-e{background-position:-32px -16px}.ui-icon-triangle-1-se{background-position:-48px -16px}.ui-icon-triangle-1-s{background-position:-64px -16px}.ui-icon-triangle-1-sw{background-position:-80px -16px}.ui-icon-triangle-1-w{background-position:-96px -16px}.ui-icon-triangle-1-nw{background-position:-112px -16px}.ui-icon-triangle-2-n-s{background-position:-128px -16px}.ui-icon-triangle-2-e-w{background-position:-144px -16px}.ui-icon-arrow-1-n{background-position:0 -32px}.ui-icon-arrow-1-ne{background-position:-16px -32px}.ui-icon-arrow-1-e{background-position:-32px -32px}.ui-icon-arrow-1-se{background-position:-48px -32px}.ui-icon-arrow-1-s{background-position:-64px -32px}.ui-icon-arrow-1-sw{background-position:-80px -32px}.ui-icon-arrow-1-w{background-position:-96px -32px}.ui-icon-arrow-1-nw{background-position:-112px -32px}.ui-icon-arrow-2-n-s{background-position:-128px -32px}.ui-icon-arrow-2-ne-sw{background-position:-144px -32px}.ui-icon-arrow-2-e-w{background-position:-160px -32px}.ui-icon-arrow-2-se-nw{background-position:-176px -32px}.ui-icon-arrowstop-1-n{background-position:-192px -32px}.ui-icon-arrowstop-1-e{background-position:-208px -32px}.ui-icon-arrowstop-1-s{background-position:-224px -32px}.ui-icon-arrowstop-1-w{background-position:-240px -32px}.ui-icon-arrowthick-1-n{background-position:0 -48px}.ui-icon-arrowthick-1-ne{background-position:-16px -48px}.ui-icon-arrowthick-1-e{background-position:-32px -48px}.ui-icon-arrowthick-1-se{background-position:-48px -48px}.ui-icon-arrowthick-1-s{background-position:-64px -48px}.ui-icon-arrowthick-1-sw{background-position:-80px -48px}.ui-icon-arrowthick-1-w{background-position:-96px -48px}.ui-icon-arrowthick-1-nw{background-position:-112px -48px}.ui-icon-arrowthick-2-n-s{background-position:-128px -48px}.ui-icon-arrowthick-2-ne-sw{background-position:-144px -48px}.ui-icon-arrowthick-2-e-w{background-position:-160px -48px}.ui-icon-arrowthick-2-se-nw{background-position:-176px -48px}.ui-icon-arrowthickstop-1-n{background-position:-192px -48px}.ui-icon-arrowthickstop-1-e{background-position:-208px -48px}.ui-icon-arrowthickstop-1-s{background-position:-224px -48px}.ui-icon-arrowthickstop-1-w{background-position:-240px -48px}.ui-icon-arrowreturnthick-1-w{background-position:0 -64px}.ui-icon-arrowreturnthick-1-n{background-position:-16px -64px}.ui-icon-arrowreturnthick-1-e{background-position:-32px -64px}.ui-icon-arrowreturnthick-1-s{background-position:-48px -64px}.ui-icon-arrowreturn-1-w{background-position:-64px -64px}.ui-icon-arrowreturn-1-n{background-position:-80px -64px}.ui-icon-arrowreturn-1-e{background-position:-96px -64px}.ui-icon-arrowreturn-1-s{background-position:-112px -64px}.ui-icon-arrowrefresh-1-w{background-position:-128px -64px}.ui-icon-arrowrefresh-1-n{background-position:-144px -64px}.ui-icon-arrowrefresh-1-e{background-position:-160px -64px}.ui-icon-arrowrefresh-1-s{background-position:-176px -64px}.ui-icon-arrow-4{background-position:0 -80px}.ui-icon-arrow-4-diag{background-position:-16px -80px}.ui-icon-extlink{background-position:-32px -80px}.ui-icon-newwin{background-position:-48px -80px}.ui-icon-refresh{background-position:-64px -80px}.ui-icon-shuffle{background-position:-80px -80px}.ui-icon-transfer-e-w{background-position:-96px -80px}.ui-icon-transferthick-e-w{background-position:-112px -80px}.ui-icon-folder-collapsed{background-position:0 -96px}.ui-icon-folder-open{background-position:-16px -96px}.ui-icon-document{background-position:-32px -96px}.ui-icon-document-b{background-position:-48px -96px}.ui-icon-note{background-position:-64px -96px}.ui-icon-mail-closed{background-position:-80px -96px}.ui-icon-mail-open{background-position:-96px -96px}.ui-icon-suitcase{background-position:-112px -96px}.ui-icon-comment{background-position:-128px -96px}.ui-icon-person{background-position:-144px -96px}.ui-icon-print{background-position:-160px -96px}.ui-icon-trash{background-position:-176px -96px}.ui-icon-locked{background-position:-192px -96px}.ui-icon-unlocked{background-position:-208px -96px}.ui-icon-bookmark{background-position:-224px -96px}.ui-icon-tag{background-position:-240px -96px}.ui-icon-home{background-position:0 -112px}.ui-icon-flag{background-position:-16px -112px}.ui-icon-calendar{background-position:-32px -112px}.ui-icon-cart{background-position:-48px -112px}.ui-icon-pencil{background-position:-64px -112px}.ui-icon-clock{background-position:-80px -112px}.ui-icon-disk{background-position:-96px -112px}.ui-icon-calculator{background-position:-112px -112px}.ui-icon-zoomin{background-position:-128px -112px}.ui-icon-zoomout{background-position:-144px -112px}.ui-icon-search{background-position:-160px -112px}.ui-icon-wrench{background-position:-176px -112px}.ui-icon-gear{background-position:-192px -112px}.ui-icon-heart{background-position:-208px -112px}.ui-icon-star{background-position:-224px -112px}.ui-icon-link{background-position:-240px -112px}.ui-icon-cancel{background-position:0 -128px}.ui-icon-plus{background-position:-16px -128px}.ui-icon-plusthick{background-position:-32px -128px}.ui-icon-minus{background-position:-48px -128px}.ui-icon-minusthick{background-position:-64px -128px}.ui-icon-close{background-position:-80px -128px}.ui-icon-closethick{background-position:-96px -128px}.ui-icon-key{background-position:-112px -128px}.ui-icon-lightbulb{background-position:-128px -128px}.ui-icon-scissors{background-position:-144px -128px}.ui-icon-clipboard{background-position:-160px -128px}.ui-icon-copy{background-position:-176px -128px}.ui-icon-contact{background-position:-192px -128px}.ui-icon-image{background-position:-208px -128px}.ui-icon-video{background-position:-224px -128px}.ui-icon-script{background-position:-240px -128px}.ui-icon-alert{background-position:0 -144px}.ui-icon-info{background-position:-16px -144px}.ui-icon-notice{background-position:-32px -144px}.ui-icon-help{background-position:-48px -144px}.ui-icon-check{background-position:-64px -144px}.ui-icon-bullet{background-position:-80px -144px}.ui-icon-radio-on{background-position:-96px -144px}.ui-icon-radio-off{background-position:-112px -144px}.ui-icon-pin-w{background-position:-128px -144px}.ui-icon-pin-s{background-position:-144px -144px}.ui-icon-play{background-position:0 -160px}.ui-icon-pause{background-position:-16px -160px}.ui-icon-seek-next{background-position:-32px -160px}.ui-icon-seek-prev{background-position:-48px -160px}.ui-icon-seek-end{background-position:-64px -160px}.ui-icon-seek-start{background-position:-80px -160px}.ui-icon-seek-first{background-position:-80px -160px}.ui-icon-stop{background-position:-96px -160px}.ui-icon-eject{background-position:-112px -160px}.ui-icon-volume-off{background-position:-128px -160px}.ui-icon-volume-on{background-position:-144px -160px}.ui-icon-power{background-position:0 -176px}.ui-icon-signal-diag{background-position:-16px -176px}.ui-icon-signal{background-position:-32px -176px}.ui-icon-battery-0{background-position:-48px -176px}.ui-icon-battery-1{background-position:-64px -176px}.ui-icon-battery-2{background-position:-80px -176px}.ui-icon-battery-3{background-position:-96px -176px}.ui-icon-circle-plus{background-position:0 -192px}.ui-icon-circle-minus{background-position:-16px -192px}.ui-icon-circle-close{background-position:-32px -192px}.ui-icon-circle-triangle-e{background-position:-48px -192px}.ui-icon-circle-triangle-s{background-position:-64px -192px}.ui-icon-circle-triangle-w{background-position:-80px -192px}.ui-icon-circle-triangle-n{background-position:-96px -192px}.ui-icon-circle-arrow-e{background-position:-112px -192px}.ui-icon-circle-arrow-s{background-position:-128px -192px}.ui-icon-circle-arrow-w{background-position:-144px -192px}.ui-icon-circle-arrow-n{background-position:-160px -192px}.ui-icon-circle-zoomin{background-position:-176px -192px}.ui-icon-circle-zoomout{background-position:-192px -192px}.ui-icon-circle-check{background-position:-208px -192px}.ui-icon-circlesmall-plus{background-position:0 -208px}.ui-icon-circlesmall-minus{background-position:-16px -208px}.ui-icon-circlesmall-close{background-position:-32px -208px}.ui-icon-squaresmall-plus{background-position:-48px -208px}.ui-icon-squaresmall-minus{background-position:-64px -208px}.ui-icon-squaresmall-close{background-position:-80px -208px}.ui-icon-grip-dotted-vertical{background-position:0 -224px}.ui-icon-grip-dotted-horizontal{background-position:-16px -224px}.ui-icon-grip-solid-vertical{background-position:-32px -224px}.ui-icon-grip-solid-horizontal{background-position:-48px -224px}.ui-icon-gripsmall-diagonal-se{background-position:-64px -224px}.ui-icon-grip-diagonal-se{background-position:-80px -224px}.ui-corner-all,.ui-corner-top,.ui-corner-left,.ui-corner-tl{border-top-left-radius:4px}.ui-corner-all,.ui-corner-top,.ui-corner-right,.ui-corner-tr{border-top-right-radius:4px}.ui-corner-all,.ui-corner-bottom,.ui-corner-left,.ui-corner-bl{border-bottom-left-radius:4px}.ui-corner-all,.ui-corner-bottom,.ui-corner-right,.ui-corner-br{border-bottom-right-radius:4px}.ui-widget-overlay{background:#aaa;opacity:.3;filter:Alpha(Opacity=30)}.ui-widget-shadow{margin:-8px 0 0 -8px;padding:8px;background:#aaa;opacity:.3;filter:Alpha(Opacity=30);border-radius:8px}

.tl { text-align: left; }
.tr { text-align: right; }
.tc, .center-contents { text-align:center }
.bdr1 { border: 1px solid #dadcd8; }
.trans04 { transition: all 0.4s ease-in-out; }
.trans02 { transition: all 0.2s ease-in-out; }
.shadow-hover:hover { box-shadow: 1px 2px 1px 1px rgb(202, 202, 202) }
#cTblID TD {
    padding: 0;
}
#regmain .btn {
    padding: 0.1rem 0.3rem;
    font-size: 0.9rem;
}

.cbhfont {
    font-family: termina;
}
#regdiv .pageHeader {
	font-size: 26px;
	margin: 0 0 6pt 0;
    line-height: 1.3;
    font-family: termina;
}

#cbmTbl {
    width: 98.5%;
    max-width: 1200px;
}
input, select, button {
    border-radius: 2px;
    font-size:1rem;
    padding: 0.2em;
}
#regdiv select {
    max-width: 99%;
}

#viewregistration input[type=button][value="Cancel"] {
    background-color: #903a3a;
}
#cTblID input[type="button"][value|="Register"] {
    margin: 4pt;
}

button:disabled, input[type=button]:disabled {
    background-color: #f8faf8;
    color: #8E988E;
}


.hidden { display:none }
em { font-style:italic }

/* debug header */
#cb_logotbl.debug {
    background-color: #750000;
    display: inline-block;
    padding: 4px;
    color: #fff;
}

#ceu form input[type="radio"],
#ceu form input[type="checkbox"] {
    margin-right: 0.4rem;
}

#wlid {
    text-align: right;
    margin-left: 4px;
    padding: 0 3px;
}
#wlid.admin {
    background-color: #E5F7E5;
}
#wlid .uus:not(.hidden) {
    display:block;
    padding-top:1em;
    background-color: #fbfbe2
}
#wlid.admin .ef {
    background-color: #f5f9f3;
    display:block;
    cursor:pointer;
    padding: 0 2px;
}
#wlid.admin .ef.Blocked {
    background-color: #ff2222;
}
#wlid.admin .ef.Admin {
    background-color: #E5F7E5;
}
#wlid.admin .ef.Unvalidated {
    background-color: #ffff88;
}
#signin #instrID {
    width:380px;max-width:380px;
    margin:7px 0 1em 5px;
    float:right;
}
#instrID * {
    transition: all 0.3s ease-in-out;
}
#instrID .val p {
    background-color: #FFE3BC;
    border: 1px solid #FF6262;
    box-shadow: 2px 2px 2px #A73F0E;
    padding: 6px;
    display: inline-block;
    font-size: 0.9rem;
}
#signin .hiddenSIA {
    display:none
}
#siUserPassword {
    margin-top:15pt;
}
#siMsg { padding:8pt; max-width:18em }
#siMsg h3 { font-weight:bold; margin-bottom:0;font-size:120% }
#siMsg H3+p { margin-top: 6px }
#changepassword input[type=button],
#siUserPassword input[type=button] {
    margin: 20px 0;
    display:block;
}

#changepassword input[type=button] {
    margin:1.3rem;
    display:inline-block;
}

#changepassword .q1,
#siUserPassword .q1 {
    margin-top:15pt;
    font-size:1.4rem;
    line-height:1.5;
}
#siUserPassword .a1 {
    margin: 0 8pt 4pt 0;
}

#donation-staff-family:invalid {
    border: 1px solid red;
    background-color: #fff5f5;
}

@media screen and (max-width: 650px) {
#signin #instrID {
  width:auto;max-width:none;float:none;
  margin: 0 0 5px 0;
}
}

.q1 {
	margin: 8px 2px 0 0;
	font-weight:bold;
}
.q1, .q1 * { font-size:1.4rem }

.ctcDiv .q1, .q1, .q1 * {
	font-size:1.6rem;
	line-height:1.1;
}
.ctcDiv .q1 { margin: 0.3em 0 4pt 4pt }

.a1 {
	margin: 0 8pt 4pt 0;
	font-weight:bold;
}
.l1 { font-size:11pt;font-weight:bold;margin:2px;
    margin-left:5px;margin-top:3px }

#cTblID, #cTblID TD { border-collapse:collapse }
.ctblc, #cTblID {
	border:1px solid #c7c7c7;
	border-radius: 3pt;
    margin: 6pt auto 12pt auto;
    padding: 0 0 0.15em 0;
}
#cTblID TD { border: 1px solid #c7c7c7 }

#cTblID P { margin:4pt 6pt }
#cTblHeaderRowID * { font-weight:bold }
#cTblHeaderRowID { background-color: #d9dcd0 }
#cTblID.evlist #cTblHeaderRowID TD {
    border: 1px solid #acacac;
    border-top: none;
}
#cTblHeaderRowID TD P {
	text-align:center;
}
#cTblHeaderRowID TD P.gender {
    font-size:0.9rem;
}

.editebrow td {
    background-color: #f6f6f6;
}
.editebrow td.changed {
    background-color: #f7f9c8;
}

/* instrID - instructions */
#instrID input, #instrID button {
    color: #fff;
}
#instrID P { margin: 0.5rem; max-width: 35em }
#instrID {
    display:inline-block;
	margin: 10px 0 10px 2.5%;
    border: 1px solid #CCD8CC;
    border-radius: 3px;
    box-shadow: 1px 1px 1px #e4e8e4;
    overflow: hidden;
}

#regtemplates { display: none }

/* regevent */
#regdiv #regevent .cbLeftPanel {
	padding-right:1%; width: 30%;float:left
}

div.c-list {
    display:flex;
    flex-flow: row wrap;
    justify-content: space-around;
    align-items:stretch;
}
div.c-list > div {
    flex-grow: 1;
    max-width: 16rem;
    border: 2px solid #999f96;
}

div.c-list > div P {
    margin: 0;
}

.a1 { margin:0;margin-right:3pt }
#regdiv .a1, #regdiv .t1 { margin-top:0;margin-bottom:0 }
#regdiv .t1 { margin-left: 2pt }
.s2Tbl {
	overflow:hidden;
	margin-bottom:5pt;
	clear:both;
}
.s2Tbl > div { float:left;display:inline }
#cbEventInfo { margin-top: 6pt }
.cbNotAld P {
    margin: 2pt 6pt;
	color: #476647;
    font-size:0.9rem;
}
.c-list > div:not(.cbNotAld) P {
    font-size: 1.25rem;
}
.c-list > div:not(.cbNotAld) P.aci {
    font-size: 1rem;
}
.c-list > div:not(.cbNotAld) P:nth-child(2) {
    color: #748b74;
    font-size: 0.94rem;
}

.cbNotAld p:nth-child(3) {
    margin-top:10pt;
    font-style: oblique;
}

.cbNotAld { background-color: #efefeb; }
.unpaid { background-color: #aadf94 }
.already-reg { background-color: #fff8d7; }
#cTblID .smallC, #cTblID .smallC A {
    margin-top:2px;
	font-size:0.75rem
}
/* sg - summer grade */
.evlist .sw, #cTblID .sg { font-size: 0.8rem; color: #8A9887 }

/* new date row in regmain */
#cTblID.evlist .ndr { border-top: 2px solid #B0BDAF; }
#cTblID.evlist .ndr.nseas { border-top: 8px solid #5f7259; }
#cTblID.evlist td:first-child {
    border-bottom: none;
    border-top:none;
}
#cTblID.evlist TD { border: 1px solid #D0DAD0; }
#cTblID.evlist TR.season-header {
    background-color: #2e3429 ;
    color: #fff;
    font-size: 1.1rem;
}

/* add camper button */
.c-list button {
    margin: 0.3rem auto;
    font-size:0.9rem;
}
.c-list button:hover {
	box-shadow: 1px 1px 1px #9ba09b;
}

#buttonP INPUT { font-size:0.889rem;padding: 3px 6px }
#regevent #instrID {
	width:98%;
	margin: 10px 0;
}
/* end regevent */

#saveProgress {
    position:fixed;
    width:99vw;
    top:0;
    left:0;
    transition: all 0.2s ease;
    color: #363;
    z-index:3;
    -webkit-appearance: none;
}
progress::-moz-progress-bar { background: #363; }
progress::-webkit-progress-value { background: #363; }

/* housing/payment */
.paylist {
    display: block;
    margin: 0;
}

#payment-details a[data-sb="true"] {
    background-color: #feffcd;
}

#payment-details .btn {
    margin: 3px 3px 0 0;
}

#regdiv .cbLeftPanel { width:50%;float:left }
#regdiv .cbRightPanel {
	float:left;
	margin-left:3%;
	width:47%;
	text-align:center;
}
#regdiv .cbRightPanel #cTblID {
    text-align: left;
}
#regdiv .cbRightPanel .sdwBrdr {
    padding: 0 0.611rem;
    display:inline-block;
    border: 1px solid #7d8560;
}
#housingdiv #cTblID { background-color: #fafffa }

#housingInfoForm P { margin: 0 }
#housingInfoForm textarea {
    border-radius: 3px;
    margin-left:3px;
    margin-top:8px;
    width:95%;
    height:5em;
    padding: 0 5px;
}
#housingInfoForm textarea:disabled {
    background-color: #f7f7e7;
}

/* end housing */

textarea[name=remarks] {
    width: 16em;
    height: 3em;
}
[name=rninput], [name=checkno], [name="adjAmt"], [name=mc_gross] {
    width: 4.5rem;
}
#officepayform [type="button"],
#officepayform [type="number"] {
    margin-right:1em;
}
#officepayform [name=emailConf] {
    width: 14em;
}

/* opq - small screen version - hidden for wider screens */
.opq { display:none }

label[for=regonly] {
    font-size:0.7rem;
}

#cuNewDup {
    max-width:90%;
    padding: 0 1em;
}

#cuEUList .n .n {
    margin-left: 1em;
}
#cuEUList .reg {
    margin-left:2em;
    display:block;
    cursor:pointer;
}
#cuEUList .n {
    cursor:pointer
}

.shprts-reglist {
    display:flex;
    flex-flow: row wrap;
    justify-content: left;
    align-items: stretch;
    position: relative;
}

.shprts-reglist .rn {
    flex: 1 1 auto;
}
@media (min-width: 800px) {
.shprts-reglist .rn {
    width:48%
}
}

#plist .rn {
    margin: 0;
    padding: 0.25rem 0.4rem;
    border-top: 1px solid #d4e4d4;
    border-left: 1px solid #d4e4d4;
    border-right: 1px solid #d4e4d4;
}
#plist .sep-head {
    font-size: 1.5rem;
    margin: 0.3rem 0 0 0;
    padding: 0.2rem 1rem 0.2rem 1rem;
    display:inline-block;
}
#plist .hn {
    font-family: termina;
    font-size: 0.7rem;
}
#plist .bl {
    margin: 4pt 0 0 0;
    padding: 0 0 4pt 1em;
    border-top:none;
}
#plist .bl .sNN {
    background-color: #E8F9DF;
    padding: 0 6px;
}
#plist .pn {
    font-size: 105%;
    font-weight:bold;
    line-height: 1;
}
.thelist .wait, #plist .rn {
    cursor:pointer;
}
#plist .rn {
    transition: all 0.3s ease-in-out;
}
#plist .rn:hover {
    background-color: #F5F9F4;
}
input[value="Latest Registrations"] {
    margin-right:1em;
}
.thelist .wait {
    font-weight:normal;
}

.myregistrations div[data-regnum] {
    border-bottom: 1px solid #ccc;
    padding: 0.2rem;
    margin-bottom: 0.5rem;
    transition: all 0.15s ease-in-out;
}
.myregistrations div[data-regnum]:last-child {
    border-bottom: none;
    margin-bottom: 0;
}
.myregistrations div[data-regnum]:hover {
    background-color: hsl(120deg 8% 96%)
}

#theoutput span[cid-data] {
    cursor:pointer;
}
#theoutput td {
    font-size: 0.8rem;
}
.dltbl {
    max-width:100%;
}
.dltbl td {
    padding: 0 0.2em;
    border: 1px solid #e6e6e6;
    overflow-wrap: break-word;
    word-wrap: break-word;
}
.dltbl tr:first-child td {
    text-align:center;
    font-weight:bold;
    background-color: #f2f2f2;
}
.dltbl tr:nth-child(odd) {
    background-color: #f9f9f3;
}
.thelist [type=input][name*="act_date"] {
    width: 6em;
    font-size:12pt;
}

/* view registration - housing info */
#reg1 .hs { /* housing info */
    background-color: #ecf0ec;
    border: 1px solid #b1b2b1;
    padding: 0.2em 0.5em;
    position: relative;
    overflow: hidden;
}
#reg1 .hs .btns {
    position: absolute;
    display: inline-block;
    right: 0.1rem;
    top: 0.1rem;
}
#reg1 .hs input[type=button] {
    font-size: 10pt;
    box-shadow: none;
    background-color: #eef2ee;
    padding: 0 3pt;
    margin: 0;
}


#eventname {
    word-wrap: break-word;
}

#eventName .ndd {
    display:inline-block;
}

.collapsed-children * {
    max-height: 0;
    overflow:hidden;
    transition: all 0.4s ease-in-out;
}
.collapsed-children.show * {
    max-height: 999px;
}
.collapsed-children:before {
    content: '\25b8'; /* right pointing small triangle */
    margin-right: 0.3rem;
    width:0.5rem;
    display:inline-block;
}
.collapsed-children.show:before {
    content: '\25be'; /* down pointing small triangle */
}

.going { 
    background-color: #7d8560;
    border-color: #7d8560;
    text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
    color: white;
}
span.going {
    padding: 0 3px;
}
.going-decoration:after {
    content: '\21d2';
    position: absolute;
    top:0;
    right:-1.4rem;
    font-size:1.4rem;
    line-height:100%;
    color: #366636;
}
.not-allowed { background-color: #fff1f3; color: #c69c9c; }
.pending-action { background-color: black; color: white }
#moveregistration > p {
    margin-bottom: 3pt;
}
#change-campers input {
    width:4em;
}
#change-campers input[value*="Del"] {
    background-color: #f00;
}
#change-campers form {
    display:none;
}

/* The animation code */
@keyframes loading {
    0% {color: #283328;transform:  rotateX(0deg);}
    50% {color: #538053;
        transform:  rotateX(360deg) ;}
    100% { color: #283328; transform:  rotateX(0deg) }
}
h2.loading {
    animation-name: loading;
    animation-duration: 4s;
    animation-iteration-count: infinite;
    margin: 2em;
}

#notChurchAccount p {
    text-align:left;
}
#notChurchAccount input[type="button"] {
    margin-bottom:0.5em;
}

.wt1 {
    font-size: 1.3rem;
    display:flex;
    flex-flow: row wrap;
    justify-content: space-around;
}
.wt1 input {
    font-size: 4.5rem;
}

.wt1 input[type="number"] {
    width: 1.66em;
    border-radius: 0.09em;
    box-shadow: 2px 2px 2px #6b7767;
    text-align: center;
}

.wt1 > div {
    margin: 1em 0;
    width: 45%;
}
@media screen and (max-width: 475px) {
.wt1 >div {
    font-size: 4vw;
}
.wt1 input {
    font-size: 17vw;
}
}

#regdiv #wtsci {
    text-align:left;
    background-color: #fefffe;
    display:block
}
#wtsci p {
    margin: 0 0 6pt 12pt;
}
#wtsci p:first-child {
    margin: 6pt 0 0 6pt;
    font-weight:bold;
}

#feedback {
    text-align:left;
    margin-bottom:0.25em;
}

@media screen and (max-width: 670px) {
#instrID { margin: 10px 2px 10px 0; }
#instrID P { margin: 10px; }
#regevent #instrID { width:auto;max-width:25em;margin: 10px 2px 10px 0 }
#regdiv #regevent .cbLeftPanel,
#regdiv .cbLeftPanel {
    padding-right:0;
    width:auto;
    float:none;
    margin-bottom:1rem;
}

#regdiv .cbRightPanel {
	width:auto;
    display:block;
    clear:both;
    float:none;
	margin: 0 auto;
	border:none;
    padding: 0 0.3em;
}

#cbEventInfo {
    font-size: 110%;
}

}



/* begin addCamper-edit */

.autocomplete {
    /*the container must be positioned relative:*/
    position: relative;
    display: inline-block;
}
.autocomplete input {
    border: 1px solid transparent;
    background-color: #f1f1f1;
    padding: 10px;
    font-size: 16px;
}
.autocomplete input[type=text] {
    background-color: #f1f1f1;
    width: 100%;
}
.autocomplete-items {
    position: absolute;
    border: 1px solid #d4d4d4;
    border-bottom: none;
    border-top: none;
    z-index: 99;
    /*position the autocomplete items to be the same width as the container:*/
    top: 100%;
    left: 0;
    right: 0;
}
.autocomplete-items div {
    padding: 10px;
    cursor: pointer;
    background-color: #fff;
    border-bottom: 1px solid #d4d4d4;
}
.autocomplete-items div:hover {
    /*when hovering an item:*/
    background-color: #e9e9e9;
}
.autocomplete-active {
    /*when navigating through the items using the arrow keys:*/
    background-color: DodgerBlue !important;
    color: #ffffff;
}

/* ctcDiv - contact div */
.ctcDiv {
    max-width: 40rem;
    margin: 0 auto;
}

/* inline-block span, for user info */
.nmtbl, .cibs, .ctcDiv .l1 {
    display:inline-block;
}

#regdiv table {
    width: auto;
    margin: 0;
}
#regdiv td {
    border-bottom: none;
}

.cibs {
	margin-top: 0.6rem;
}

.ctcDiv .cibs {
	margin-right:2rem;
}

.l1 .fos {
	font-size: 0.8rem;
	color: #7EA57E;
	font-weight:normal;
    margin-left:1em;
    margin-top:0;
}

.ctcDiv input[name=birth_date] {
    width: 9rem;
}

.ctcDiv #churchname {
    width: 17rem;
    max-width:100%;
}
.ctcDiv input[name="firstname"] {
    width: 6rem;
}
.ctcDiv input[name="lastname"] {
    width: 9rem;
}
.ctcDiv input[name="email"] {
    width: 70%;
}

.nmtbl TD SPAN {
	font-size: 0.6rem;
	color: #778677;
	margin: 4pt 0 0 0;
	line-height: 1;
	display: block;
}

.ctcDiv SELECT {
	font-size:1rem
}
.ctcDiv .l1 {
    font-size:1.1rem;
    margin:0;
}

.revt-season {
    border-top: 5px solid #59735D;
    margin: 1em 0 0 0;
}
.revt-season P {
    font-size:120%;
    background-color: #59735D;
    color: #F0F7F0;
}
.revt {
    padding: 2px;
}
.revt.oecls {
    background-color: #faf7f4;
}
.revt [type=number] {
    width: 3.2rem;
    margin: 0 0.8em 0 0;
    padding: 0 2px;
    border-color: #e2e2e2;
    font-family: 'Courier New', Courier, monospace;
    font-size: 0.85rem;
}
.revt [type=number]:disabled {
    border: none;
}
.revt [type="checkbox"] {
    margin: 0 0.8em 0 0;
}
.revt:not(.act), .revt:not(.act) input {
    /* lighter text for events not taking registrations */
    color: #9EB19A;
}
.revt .dskp {
    margin-left: 6em;
}
.revt .dstr {
    width: 6em;
    display: inline-block;
}

.nmtbl INPUT { margin: 0 }

#aynBox {
    display:inline-block;
    padding:8px 15px 8px 8px;
    border: 1px solid transparent;
}
#aynBox p {
    margin:0;
}

button, INPUT, SELECT, #aynBox,textarea {
	transition: all 0.2s ease;
}

#regdiv .invalidField:hover {
    background-color: #f3ede5;
    border-color: #b46635;
    box-shadow: 2px 2px 2px #f3dcd2;
}
#regdiv .hilite,
#regdiv .invalidField,
#regdiv .invalidField::selection,
#regdiv .invalidField:focus {
    border: 3px solid;
    border-radius: 2px;
    outline: none;
    background-color: #f8f4ef;
    border-color: #b46939;
    box-shadow: 4px 4px 1px #e9d4ca;
}

input:invalid, select:invalid {
    border-color: #b46939;
}
input:invalid + label {
    color: #b46939;
}

.length-question.question-not-needed,
.what-question.question-not-needed {
    opacity: 0.2;
}

.gagsp td { padding: 0; }
.gagsp label { margin: 3px; }
.gagsp input[type="radio"] { margin: 3px 4px 3px 0; }
.notAllowed {
    color: #8D9C8D;
}
.moon-gray { color: #ccc; }

#regdiv .ac-buttons {
    margin: 1rem 0;
}
#regdiv .ac-buttons INPUT {
    margin:0 8pt 0 0;
}
#regdiv {
    padding-bottom: 12px;
    /* margin-top: 120px; */
}
.ctcDiv #instrID {
	margin:0 0 1em 0;
}

.body-content:has(#regnav) {
    padding-top: 8px;
}

#regnav {
    display: flex;
    flex-flow: row wrap;
    justify-content: left;
    align-items: center;
    border-bottom: 1px solid #ccc;
    margin-bottom: 0.5rem;
}
#regnav p {
    margin-bottom: 0;
}
#regnav #wlid {
    font-size: 0.85rem;
}
#regnav .p11:not(#wlid) {
    display: flex;
    flex-flow: row wrap;
    justify-content: space-around;
    align-items: center;
    line-height: 2;
    margin-bottom: 0.5rem;
    background-color: #f2eee8;
}

@media (max-width: 1000px) {
#regnav .p11:not(#wlid) a {
    width: 26%;
}
}

@media (max-width: 576px) {

.ctcDiv .cibs {
    margin-right:0.2rem;
}
#regdiv select[name="address"] {
    width:55%;
    font-size:0.7rem;
}
.cibs select[name="address"] + input[value="New"] {
    font-size: 0.7rem;
}

#regnav .p11#wlid {
    margin-bottom: 0.3rem;
}


#regnav A { margin-right: 0.5em; line-height:2 }

#regdiv h1 + .row.top-border-fade {
    margin-top: 22px;
}
#cTblID P {
	margin: 4pt 1vw 4pt 1.5vw;
}
.opq { display:inline }
.opop { display:none } /* hidden for narrow screens */

#cTblID * { font-size:0.93rem }
#regmain .btn {
    padding: 0.1rem 0.1rem;
    font-size: 0.8rem;
}
}
    


@media screen and (max-width: 400px) {

#cb-page-content-container .container {
    padding: 0;
}

.body-content {
    padding: 8px 2vw 0;
}

.card-body {
    padding: 3vw;
}

.ctcDiv input[name="firstname"] {
    width: 4rem;
}
.ctcDiv input[name="lastname"] {
    width: 5rem;
}

.l1 .fos {
	margin-left:0;
	display:block;
}

#cTblID TD {
    overflow: hidden;
}

#cbmTbl { width: 100%; }

}

@media screen and (max-width: 350px) {
    #cTblID { box-shadow: none }
    #regdiv .cbRightPanel .sdwBrdr {
        padding: 0 2%;
    }
    input[type=button] {
        margin: 7px 0;
        padding: 1px 3px;
        border-radius:3px;
        box-shadow:none;
        border:1px solid #bec4be;
    }
    
}

/* end addCamper-edit */

@media screen and (min-width: 1400px) {
#cTblID .smallC, #cTblID .smallC A {
    margin-top: 0.2vw;
    font-size: 0.8vw;
}
#regmain .btn {
    padding: 0.2vw 0.5vw;
    font-size: 0.8vw;
}
.collapsed-children:before {
    margin-right: 0.3vw;
    width: 0.5vw;
}
.evlist .sw, #cTblID .sg { font-size: 70%; }
#buttonP INPUT { font-size: 95%;padding: 0.2vw 0.7vw }
.cbNotAld P {
    margin: .2vw .6vw;
    font-size: 90%;
}
.c-list > div:not(.cbNotAld) P {
    font-size: 125%;
}
.c-list > div:not(.cbNotAld) P.aci {
    font-size: 100%;
}
.c-list > div:not(.cbNotAld) P:nth-child(2) {
    font-size: 94%;
}
.c-list button {
    margin: .3vw auto;
    font-size: 85%;
}
#regnav #wlid {
    font-size: 85%;
}
#regnav {
    margin-bottom: 0.5vw;
    border-bottom: 0.1vw solid #ccc;
}
.ctcDiv {
    max-width: 95%;
}
.autocomplete input,
.ctcDiv select,
select,
input,
button {
    font-size: 100%;
    padding: 0.2vw;
    border-radius: 0.2vw;
}
#regdiv .hilite,
#regdiv .invalidField,
#regdiv .invalidField::selection,
#regdiv .invalidField:focus {
    border-radius: 0.2vw;
}
.ctcDiv .l1, .l1 {
    font-size: 110%;
}
.nmtbl TD SPAN {
	font-size: 60%;
	margin: 0.25vw 0 0 0;
}
.ctcDiv #churchname {
    width: 17vw;
}
.ctcDiv input[name="firstname"] {
    width: 6vw;
}
.ctcDiv input[name="lastname"] {
    width: 9vw;
}
.ctcDiv input[name="email"] {
    width: 50%;
}
.ctcDiv input[name=birth_date] {
    width: 9vw;
}
.gagsp label { margin: 0.4vw; }
.gagsp input[type="radio"] { margin: 0.3vw 0.4vw 0.3vw 0; }
#cTblID P { margin: .4vw .6vw }
#cTblID.evlist TR.season-header {
    font-size: 110%;
}
}body.compensate-for-scrollbar{overflow:hidden}.fancybox-active{height:auto}.fancybox-is-hidden{left:-9999px;margin:0;position:absolute!important;top:-9999px;visibility:hidden}.fancybox-container{-webkit-backface-visibility:hidden;height:100%;left:0;outline:none;position:fixed;-webkit-tap-highlight-color:transparent;top:0;-ms-touch-action:manipulation;touch-action:manipulation;transform:translateZ(0);width:100%;z-index:99992}.fancybox-container *{box-sizing:border-box}.fancybox-bg,.fancybox-inner,.fancybox-outer,.fancybox-stage{bottom:0;left:0;position:absolute;right:0;top:0}.fancybox-outer{-webkit-overflow-scrolling:touch;overflow-y:auto}.fancybox-bg{background:#111;opacity:0;transition-duration:inherit;transition-property:opacity;transition-timing-function:cubic-bezier(.47,0,.74,.71)}.fancybox-is-open .fancybox-bg{opacity:.9;transition-timing-function:cubic-bezier(.22,.61,.36,1)}.fancybox-caption,.fancybox-infobar,.fancybox-navigation .fancybox-button,.fancybox-toolbar{direction:ltr;opacity:0;position:absolute;transition:opacity .25s ease,visibility 0s ease .25s;visibility:hidden;z-index:99997}.fancybox-show-caption .fancybox-caption,.fancybox-show-infobar .fancybox-infobar,.fancybox-show-nav .fancybox-navigation .fancybox-button,.fancybox-show-toolbar .fancybox-toolbar{opacity:1;transition:opacity .25s ease 0s,visibility 0s ease 0s;visibility:visible}.fancybox-infobar{color:#ccc;font-size:13px;-webkit-font-smoothing:subpixel-antialiased;height:44px;left:0;line-height:44px;min-width:44px;mix-blend-mode:difference;padding:0 10px;pointer-events:none;top:0;-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.fancybox-toolbar{right:0;top:0}.fancybox-stage{direction:ltr;overflow:visible;transform:translateZ(0);z-index:99994}.fancybox-is-open .fancybox-stage{overflow:hidden}.fancybox-slide{-webkit-backface-visibility:hidden;display:none;height:100%;left:0;outline:none;overflow:auto;-webkit-overflow-scrolling:touch;padding:44px;position:absolute;text-align:center;top:0;transition-property:transform,opacity;white-space:normal;width:100%;z-index:99994}.fancybox-slide:before{content:"";display:inline-block;font-size:0;height:100%;vertical-align:middle;width:0}.fancybox-is-sliding .fancybox-slide,.fancybox-slide--current,.fancybox-slide--next,.fancybox-slide--previous{display:block}.fancybox-slide--image{overflow:hidden;padding:44px 0}.fancybox-slide--image:before{display:none}.fancybox-slide--html{padding:6px}.fancybox-content{background:#fff;display:inline-block;margin:0;max-width:100%;overflow:auto;-webkit-overflow-scrolling:touch;padding:44px;position:relative;text-align:left;vertical-align:middle}.fancybox-slide--image .fancybox-content{animation-timing-function:cubic-bezier(.5,0,.14,1);-webkit-backface-visibility:hidden;background:transparent;box-shadow:0 0 30px rgba(0,0,0,0.7);background-repeat:no-repeat;background-size:100% 100%;left:0;max-width:none;overflow:visible;padding:0;position:absolute;top:0;transform-origin:top left;transition-property:transform,opacity;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;z-index:99995}.fancybox-can-zoomOut .fancybox-content{cursor:zoom-out}.fancybox-can-zoomIn .fancybox-content{cursor:zoom-in}.fancybox-can-pan .fancybox-content,.fancybox-can-swipe .fancybox-content{cursor:grab}.fancybox-is-grabbing .fancybox-content{cursor:grabbing}.fancybox-container [data-selectable=true]{cursor:text}.fancybox-image,.fancybox-spaceball{background:transparent;border:0;height:100%;left:0;margin:0;max-height:none;max-width:none;padding:0;position:absolute;top:0;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;width:100%}.fancybox-spaceball{z-index:1}.fancybox-slide--iframe .fancybox-content,.fancybox-slide--map .fancybox-content,.fancybox-slide--pdf .fancybox-content,.fancybox-slide--video .fancybox-content{height:100%;overflow:visible;padding:0;width:100%}.fancybox-slide--video .fancybox-content{background:#000}.fancybox-slide--map .fancybox-content{background:#e5e3df}.fancybox-slide--iframe .fancybox-content{background:#fff}.fancybox-iframe,.fancybox-video{background:transparent;border:0;display:block;height:100%;margin:0;overflow:hidden;padding:0;width:100%}.fancybox-iframe{left:0;position:absolute;top:0}.fancybox-error{background:#fff;cursor:default;max-width:400px;padding:40px;width:100%}.fancybox-error p{color:#444;font-size:16px;line-height:20px;margin:0;padding:0}.fancybox-button{background:rgba(30,30,30,.6);border:0;border-radius:0;box-shadow:none;cursor:pointer;display:inline-block;height:44px;margin:0;padding:10px;position:relative;transition:color .2s;vertical-align:top;visibility:inherit;width:44px}.fancybox-button,.fancybox-button:link,.fancybox-button:visited{color:#ccc}.fancybox-button:hover{color:#ff961e}.fancybox-button:focus{outline:none}.fancybox-button.fancybox-focus{outline:1px dotted}.fancybox-button[disabled],.fancybox-button[disabled]:hover{color:#888;cursor:default;outline:none}.fancybox-button div{height:100%}.fancybox-button svg{display:block;height:100%;overflow:visible;position:relative;width:100%}.fancybox-button svg path{fill:currentColor;stroke-width:0}.fancybox-button--fsenter svg:nth-child(2),.fancybox-button--fsexit svg:first-child,.fancybox-button--pause svg:first-child,.fancybox-button--play svg:nth-child(2){display:none}.fancybox-progress{background:#ff961e;height:2px;left:0;position:absolute;right:0;top:0;transform:scaleX(0);transform-origin:0;transition-property:transform;transition-timing-function:linear;z-index:99998}.fancybox-close-small{background:transparent;border:0;border-radius:0;color:#ccc;cursor:pointer;opacity:.8;padding:8px;position:absolute;right:-12px;top:-44px;z-index:401}.fancybox-close-small:hover{color:#fff;opacity:1}.fancybox-slide--html .fancybox-close-small{color:currentColor;padding:10px;right:0;top:0}.fancybox-slide--image.fancybox-is-scaling .fancybox-content{overflow:hidden}.fancybox-is-scaling .fancybox-close-small,.fancybox-is-zoomable.fancybox-can-pan .fancybox-close-small{display:none}.fancybox-navigation .fancybox-button{background-clip:content-box;height:100px;opacity:0;position:absolute;top:calc(50% - 50px);width:80px}.fancybox-navigation .fancybox-button div{padding:7px}.fancybox-navigation .fancybox-button--arrow_left{left:0;left:env(safe-area-inset-left);padding:20px 26px 20px 0}.fancybox-navigation .fancybox-button--arrow_right{padding:20px 0 20px 26px;right:0;right:env(safe-area-inset-right)}.fancybox-caption{background:linear-gradient(0deg,rgba(0,0,0,.85) 0,rgba(0,0,0,.3) 50%,rgba(0,0,0,.15) 65%,rgba(0,0,0,.075) 75.5%,rgba(0,0,0,.037) 82.85%,rgba(0,0,0,.019) 88%,transparent);bottom:0;color:#eee;font-size:14px;font-weight:400;left:0;line-height:1.5;padding:75px 44px 25px;pointer-events:none;right:0;text-align:center;z-index:99996}@supports (padding:max(0px)){.fancybox-caption{padding:75px max(44px,env(safe-area-inset-right)) max(25px,env(safe-area-inset-bottom)) max(44px,env(safe-area-inset-left))}}.fancybox-caption--separate{margin-top:-50px}.fancybox-caption__body{max-height:50vh;overflow:auto;pointer-events:all}.fancybox-caption a,.fancybox-caption a:link,.fancybox-caption a:visited{color:#ccc;text-decoration:none}.fancybox-caption a:hover{color:#fff;text-decoration:underline}.fancybox-loading{animation:a 1s linear infinite;background:transparent;border:4px solid #888;border-bottom-color:#fff;border-radius:50%;height:50px;left:50%;margin:-25px 0 0 -25px;opacity:.7;padding:0;position:absolute;top:50%;width:50px;z-index:99999}@keyframes a{to{transform:rotate(1turn)}}.fancybox-animated{transition-timing-function:cubic-bezier(0,0,.25,1)}.fancybox-fx-slide.fancybox-slide--previous{opacity:0;transform:translate3d(-100%,0,0)}.fancybox-fx-slide.fancybox-slide--next{opacity:0;transform:translate3d(100%,0,0)}.fancybox-fx-slide.fancybox-slide--current{opacity:1;transform:translateZ(0)}.fancybox-fx-fade.fancybox-slide--next,.fancybox-fx-fade.fancybox-slide--previous{opacity:0;transition-timing-function:cubic-bezier(.19,1,.22,1)}.fancybox-fx-fade.fancybox-slide--current{opacity:1}.fancybox-fx-zoom-in-out.fancybox-slide--previous{opacity:0;transform:scale3d(1.5,1.5,1.5)}.fancybox-fx-zoom-in-out.fancybox-slide--next{opacity:0;transform:scale3d(.5,.5,.5)}.fancybox-fx-zoom-in-out.fancybox-slide--current{opacity:1;transform:scaleX(1)}.fancybox-fx-rotate.fancybox-slide--previous{opacity:0;transform:rotate(-1turn)}.fancybox-fx-rotate.fancybox-slide--next{opacity:0;transform:rotate(1turn)}.fancybox-fx-rotate.fancybox-slide--current{opacity:1;transform:rotate(0deg)}.fancybox-fx-circular.fancybox-slide--previous{opacity:0;transform:scale3d(0,0,0) translate3d(-100%,0,0)}.fancybox-fx-circular.fancybox-slide--next{opacity:0;transform:scale3d(0,0,0) translate3d(100%,0,0)}.fancybox-fx-circular.fancybox-slide--current{opacity:1;transform:scaleX(1) translateZ(0)}.fancybox-fx-tube.fancybox-slide--previous{transform:translate3d(-100%,0,0) scale(.1) skew(-10deg)}.fancybox-fx-tube.fancybox-slide--next{transform:translate3d(100%,0,0) scale(.1) skew(10deg)}.fancybox-fx-tube.fancybox-slide--current{transform:translateZ(0) scale(1)}@media (max-height:576px){.fancybox-slide{padding-left:6px;padding-right:6px}.fancybox-slide--image{padding:6px 0}.fancybox-close-small{right:-6px}.fancybox-slide--image .fancybox-close-small{background:#4e4e4e;color:#f2f4f6;height:36px;opacity:1;padding:6px;right:0;top:0;width:36px}.fancybox-caption{padding-left:12px;padding-right:12px}@supports (padding:max(0px)){.fancybox-caption{padding-left:max(12px,env(safe-area-inset-left));padding-right:max(12px,env(safe-area-inset-right))}}}.fancybox-share{background:#f4f4f4;border-radius:3px;max-width:90%;padding:30px;text-align:center}.fancybox-share h1{color:#222;font-size:35px;font-weight:700;margin:0 0 20px}.fancybox-share p{margin:0;padding:0}.fancybox-share__button{border:0;border-radius:3px;display:inline-block;font-size:14px;font-weight:700;line-height:40px;margin:0 5px 10px;min-width:130px;padding:0 15px;text-decoration:none;transition:all .2s;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;white-space:nowrap}.fancybox-share__button:link,.fancybox-share__button:visited{color:#fff}.fancybox-share__button:hover{text-decoration:none}.fancybox-share__button--fb{background:#3b5998}.fancybox-share__button--fb:hover{background:#344e86}.fancybox-share__button--pt{background:#bd081d}.fancybox-share__button--pt:hover{background:#aa0719}.fancybox-share__button--tw{background:#1da1f2}.fancybox-share__button--tw:hover{background:#0d95e8}.fancybox-share__button svg{height:25px;margin-right:7px;position:relative;top:-1px;vertical-align:middle;width:25px}.fancybox-share__button svg path{fill:#fff}.fancybox-share__input{background:transparent;border:0;border-bottom:1px solid #d7d7d7;border-radius:0;color:#5d5b5b;font-size:14px;margin:10px 0 0;outline:none;padding:10px 15px;width:100%}.fancybox-thumbs{background:rgba(255,255,255,0.1);bottom:0;border-left:1px solid #444;display:none;margin:0;-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar;padding:2px 2px 4px;position:absolute;right:0;-webkit-tap-highlight-color:rgba(0,0,0,0);top:0;width:212px;z-index:99995}.fancybox-thumbs-x{overflow-x:auto;overflow-y:hidden}.fancybox-show-thumbs .fancybox-thumbs{display:block}.fancybox-show-thumbs .fancybox-inner{right:212px}.fancybox-thumbs__list{font-size:0;height:100%;list-style:none;margin:0;overflow-x:hidden;overflow-y:auto;padding:0;position:absolute;position:relative;white-space:nowrap;width:100%}.fancybox-thumbs-x .fancybox-thumbs__list{overflow:hidden}.fancybox-thumbs-y .fancybox-thumbs__list::-webkit-scrollbar{width:7px}.fancybox-thumbs-y .fancybox-thumbs__list::-webkit-scrollbar-track{background:#fff;border-radius:10px;box-shadow:inset 0 0 6px rgba(0,0,0,.3)}.fancybox-thumbs-y .fancybox-thumbs__list::-webkit-scrollbar-thumb{background:#2a2a2a;border-radius:10px}.fancybox-thumbs__list a{-webkit-backface-visibility:hidden;backface-visibility:hidden;background-color:rgba(0,0,0,.1);background-position:50%;background-repeat:no-repeat;background-size:cover;cursor:pointer;float:left;height:75px;margin:2px;max-height:calc(100% - 8px);max-width:calc(50% - 4px);outline:none;overflow:hidden;padding:0;position:relative;-webkit-tap-highlight-color:transparent;width:100px}.fancybox-thumbs__list a:before{border:3px solid #ff961e;bottom:0;content:"";left:0;opacity:0;position:absolute;right:0;top:0;transition:all .2s cubic-bezier(.25,.46,.45,.94);z-index:99991}.fancybox-thumbs__list a:focus:before{opacity:.5}.fancybox-thumbs__list a.fancybox-thumbs-active:before{opacity:1}@media (max-width:576px){.fancybox-thumbs{width:110px}.fancybox-show-thumbs .fancybox-inner{right:110px}.fancybox-thumbs__list a{max-width:calc(100% - 10px)}}</style></head><body>
    <header>
        <nav class="navbar navbar-expand-lg navbar-dark fixed-top bg-dark">
            <div class="container"> <a class="navbar-brand" href="/home"><img id="logo-blockhouse" src="https://www.lvalive.com/cf/19/images/img_blockhouse_logo_green.png" alt="Camp Barakel Blockhouse"><span class="logo-camp">Camp</span> Barakel <span class="tagline">Where God Has Blessed<span class="est-date"> • Est. 1942</span></span></a>
                <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarCollapse" aria-controls="navbarCollapse" aria-expanded="false" aria-label="Toggle navigation"> <span class="navbar-toggler-icon"></span> </button>
                <div class="collapse navbar-collapse" id="navbarCollapse">
                    <ul class="navbar-nav mr-auto">
                        <li class="nav-item dropdown"><a class="nav-link dropdown-toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false" href="#">About</a>
                            <ul class="dropdown-menu" aria-labelledby="navbarDropdownMenuLink">
                                <li><a class="dropdown-item" href="/about-barakel">About Barakel</a></li>
                                <li><a class="dropdown-item" href="/about-our-staff">About our Staff</a></li>
                                <li><a class="dropdown-item" href="/activities-facilities">Activities &amp; Facilities</a></li>
                                <li><a class="dropdown-item" href="/events">Schedule of Events</a></li>
                                <li><a class="dropdown-item" href="/directions">Directions</a></li>
                                <li><a class="dropdown-item" href="/events/summer-bus-schedule">Summer Bus Schedule</a></li>
                            </ul>
                        </li>
                        <li class="nav-item dropdown"><a class="nav-link dropdown-toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false" href="#">Camps</a>
                            <ul class="dropdown-menu" aria-labelledby="navbarDropdownMenuLink">
                                <h6 class="dropdown-header">Summer</h6>
                                <li><a class="dropdown-item d-none" href="/events/summer-explorer">Explorer</a> </li>
                                <li><a class="dropdown-item" href="/events/summer-junior">Junior</a> </li>
                                <li><a class="dropdown-item" href="/events/summer-ms">Middle School</a> </li>
                                <li><a class="dropdown-item" href="/events/summer-jr-high">Jr. High</a> </li>
                                <li><a class="dropdown-item" href="/events/summer-high-school">Sr. High</a> </li>
                                <li class="d-none"><a class="dropdown-item" href="/events/summer-his-ability">HIS-ability</a> </li>
                                <div class="dropdown-divider"></div>
                                <li><a class="dropdown-item" href="/events/family-camps">Family Camp</a></li>
                                <div class="dropdown-divider d-none"></div>
                                <li><a class="dropdown-item d-none" href="/events/bible-immersion">Bible Immersion Week</a></li>
                            </ul>
                        </li>
                        <li class="nav-item dropdown"><a class="nav-link dropdown-toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false" href="#">Retreats</a>
                            <ul class="dropdown-menu" aria-labelledby="navbarDropdownMenuLink">
  								<h6 class="dropdown-header">Fall, Winter, &amp; Spring</h6>
                                <li><a class="dropdown-item" href="/events/winter-teen">Teen</a></li>
                                <li><a class="dropdown-item" href="/events/retreat-adult">Adult</a></li>
                                <li><a class="dropdown-item" href="/events/retreat-parent-child">Parent &amp; Child</a></li>
                            </ul>
                        </li>
                        <li class="nav-item dropdown"><a class="nav-link dropdown-toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false" href="#">Serve</a>
                            <ul class="dropdown-menu" aria-labelledby="navbarDropdownMenuLink">
                                <li><a class="dropdown-item" href="/staff/high-school-staff">High School Volunteers</a></li>
                                <li><a class="dropdown-item" href="/staff/adult-volunteers">Adult Volunteers</a></li>
                                <li><a class="dropdown-item" href="/resident-missionary-staff">Resident Missionary Staff</a></li>
                                <li><a class="dropdown-item" href="/prayer">Pray for Us</a></li>
                                <li><a class="dropdown-item" href="/donate">Donate</a></li>
                                <div class="dropdown-divider d-none"></div>
                                <li><a class="dropdown-item d-none" href="/staff/study-serve">Study and Serve</a></li>
                                <li><a class="dropdown-item d-none" href="/events/bible-immersion">Bible Immersion Week</a></li>
                            </ul>
                        </li>
                        <li class="nav-item dropdown"><a class="nav-link dropdown-toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false" href="#">Media</a>
                            <ul class="dropdown-menu" aria-labelledby="navbarDropdownMenuLink">
                                <li><a class="dropdown-item" href="/photos-videos">Photos &amp; Videos</a></li>
                                <li><a class="dropdown-item" href="/chapel-messages">Chapel Messages</a></li>
                                <li><a class="dropdown-item" href="/song-list">Chapel Songs</a></li>
                            </ul>
                        </li>
                        <li class="nav-item"> <a class="nav-link" href="/contact">Contact</a> </li>
                        <li class="nav-item"> <a class="nav-link" 
                            href="/register" id="login-nav-link"
                            title="Register for Camp Barakel events">Log In</a>
                        </li>
                    </ul>
                    <div class="navbar-nav ml-auto social-links">
                        <a class="nav-link" href="https://www.facebook.com/CampBarakel" target="_blank" title="Visit our Facebook page"><i class="fab fa-facebook"></i></a> 
                        <a class="nav-link" href="https://www.instagram.com/campbarakel" target="_blank" title="Visit us on Instagram"><i class="fab fa-instagram"></i></a> 
                    </div>
                </div>
            </div>
        </nav>
    </header>
    <main role="main">
        <div id="cb-page-content-container">
        </div>

        <!-- FOOTER -->
        <footer>
            <div class="container">
                <div class="row">
                    <div class="col-lg-2 col-md-4 col-6">
                        <h5>About</h5>
                        <ul class="list-unstyled text-small">
                            <li><a class="text-muted" href="/about-barakel">About Barakel</a></li>
                            <li><a class="text-muted" href="/about-our-staff">About our Staff</a></li>
                            <li><a class="text-muted" href="/activities-facilities">Activities &amp; Facilities</a></li>
                            <li><a class="text-muted" href="/directions">Directions</a></li>
                            <li><a class="text-muted" href="/2020-maintenance-shop-fire">2020 Fire</a></li>
                        </ul>
                    </div>
                    <div class="col-lg-2 col-md-4 col-6">
                        <h5>Camps</h5>
                        <ul class="list-unstyled text-small">
                            <li><a class="text-muted d-none" href="/events/summer-explorer">Explorer</a></li>
                            <li><a class="text-muted" href="/events/summer-junior">Junior</a> • <a class="text-muted" href="/events/summer-ms">Middle School</a></li>
                            <li><a class="text-muted" href="/events/summer-jr-high">Jr.&nbsp;High</a> • <a class="text-muted" href="/events/summer-high-school">Sr.&nbsp;High</a></li>
                            <li class="d-none"><a class="text-muted" href="/events/summer-his-ability">HIS-ability</a></li>
                            <li><a class="text-muted" href="/events/family-camps">Family Camp</a></li>
                        </ul>
                    </div>
                    <div class="col-lg-2 col-md-4 col-6">
                        <h5>Retreats</h5>
                        <ul class="list-unstyled text-small">
                            <li><a class="text-muted" href="/events/winter-teen">Teen</a></li>
                            <li><a class="text-muted" href="/events/retreat-adult">Adult</a></li>
                            <li><a class="text-muted" href="/events/retreat-parent-child">Parent &amp; Child</a></li>
                        </ul>
                    </div>
                    <div class="col-lg-2 col-md-4 col-6">
                        <h5>Serve</h5>
                        <ul class="list-unstyled text-small">
                            <li><a class="text-muted" href="/staff/high-school-staff">High School <span class="d-none d-sm-inline">Volunteers</span></a></li>
                            <li><a class="text-muted" href="/staff/adult-volunteers">Adult <span class="d-none d-sm-inline">Volunteers</span></a></li>
                            <li><a class="text-muted" href="/resident-missionary-staff">Resident <span class="d-none d-sm-inline">Missionary Staff</span></a></li>
                            <li><a class="text-muted d-none" href="/staff/study-serve">Study and Serve</a></li>
                            <li><a class="text-muted" href="/prayer">Pray for Us</a></li>
                            <li><a class="text-muted" href="/donate">Donate</a></li>
                        </ul>
                    </div>
                    <div class="col-lg-2 col-md-4 col-6">
                        <h5>Media</h5>
                        <ul class="list-unstyled text-small">
                            <li><a class="text-muted" href="/photos-videos">Photos &amp; Videos</a></li>
                            <li><a class="text-muted" href="/chapel-messages">Chapel Messages</a></li>
                            <li><a class="text-muted" href="/song-list">Chapel Songs</a></li>
                            <li><a class="text-muted" href="/2020-review">2020 Review</a></li>
                        </ul>
                    </div>
                    <div class="col-lg-2 col-md-4 col-6">
                        <h5><a href="/contact" title="Contact Camp Barakel">Contact Us</a></h5>
                        <ul class="list-unstyled text-small">
                            <li><a class="text-muted" href="/camper-mail">Camper Mail</a></li>
                            <li class="text-muted phone">Phone: <span>989-848-2279</span></li>
                            <li class="text-muted">Fax: <span>989-848-2280</span></li>
                            <li><a class="text-muted email" href="mailto:info@campbarakel.org">info@campbarakel.org</a></li>
                        </ul>
                    </div>
                </div>

            </div>
        </footer>
        <div id="copyright">
            <div class="container">
                <small class="text-muted">© <span id="copyright-year">20xx</span> Camp Barakel  &nbsp;|&nbsp; <a href="/sitemap"
                    title="View our sitemap">Sitemap</a></small>
            </div>
        </div>
    </main>
</body>
<script src='/19/reg19/old-browser-test.js'></script><script src='https://www.lvalive.com/cf/19/dist/js/bjs.js'></script><script>/*! jQuery UI - v1.11.4 - 2015-12-07
* http://jqueryui.com
* Includes: core.js, widget.js, mouse.js, position.js, draggable.js, droppable.js, resizable.js, selectable.js, sortable.js, accordion.js, autocomplete.js, button.js, datepicker.js, dialog.js, menu.js, progressbar.js, selectmenu.js, slider.js, spinner.js, tooltip.js
* Copyright jQuery Foundation and other contributors; Licensed MIT */

(function(e){"function"==typeof define&&define.amd?define(["jquery"],e):e(jQuery)})(function(e){function t(t,s){var n,a,o,r=t.nodeName.toLowerCase();return"area"===r?(n=t.parentNode,a=n.name,t.href&&a&&"map"===n.nodeName.toLowerCase()?(o=e("img[usemap='#"+a+"']")[0],!!o&&i(o)):!1):(/^(input|select|textarea|button|object)$/.test(r)?!t.disabled:"a"===r?t.href||s:s)&&i(t)}function i(t){return e.expr.filters.visible(t)&&!e(t).parents().addBack().filter(function(){return"hidden"===e.css(this,"visibility")}).length}function s(e){for(var t,i;e.length&&e[0]!==document;){if(t=e.css("position"),("absolute"===t||"relative"===t||"fixed"===t)&&(i=parseInt(e.css("zIndex"),10),!isNaN(i)&&0!==i))return i;e=e.parent()}return 0}function n(){this._curInst=null,this._keyEvent=!1,this._disabledInputs=[],this._datepickerShowing=!1,this._inDialog=!1,this._mainDivId="ui-datepicker-div",this._inlineClass="ui-datepicker-inline",this._appendClass="ui-datepicker-append",this._triggerClass="ui-datepicker-trigger",this._dialogClass="ui-datepicker-dialog",this._disableClass="ui-datepicker-disabled",this._unselectableClass="ui-datepicker-unselectable",this._currentClass="ui-datepicker-current-day",this._dayOverClass="ui-datepicker-days-cell-over",this.regional=[],this.regional[""]={closeText:"Done",prevText:"Prev",nextText:"Next",currentText:"Today",monthNames:["January","February","March","April","May","June","July","August","September","October","November","December"],monthNamesShort:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],dayNames:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],dayNamesShort:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],dayNamesMin:["Su","Mo","Tu","We","Th","Fr","Sa"],weekHeader:"Wk",dateFormat:"mm/dd/yy",firstDay:0,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},this._defaults={showOn:"focus",showAnim:"fadeIn",showOptions:{},defaultDate:null,appendText:"",buttonText:"...",buttonImage:"",buttonImageOnly:!1,hideIfNoPrevNext:!1,navigationAsDateFormat:!1,gotoCurrent:!1,changeMonth:!1,changeYear:!1,yearRange:"c-10:c+10",showOtherMonths:!1,selectOtherMonths:!1,showWeek:!1,calculateWeek:this.iso8601Week,shortYearCutoff:"+10",minDate:null,maxDate:null,duration:"fast",beforeShowDay:null,beforeShow:null,onSelect:null,onChangeMonthYear:null,onClose:null,numberOfMonths:1,showCurrentAtPos:0,stepMonths:1,stepBigMonths:12,altField:"",altFormat:"",constrainInput:!0,showButtonPanel:!1,autoSize:!1,disabled:!1},e.extend(this._defaults,this.regional[""]),this.regional.en=e.extend(!0,{},this.regional[""]),this.regional["en-US"]=e.extend(!0,{},this.regional.en),this.dpDiv=a(e("<div id='"+this._mainDivId+"' class='ui-datepicker ui-widget ui-widget-content ui-helper-clearfix ui-corner-all'></div>"))}function a(t){var i="button, .ui-datepicker-prev, .ui-datepicker-next, .ui-datepicker-calendar td a";return t.delegate(i,"mouseout",function(){e(this).removeClass("ui-state-hover"),-1!==this.className.indexOf("ui-datepicker-prev")&&e(this).removeClass("ui-datepicker-prev-hover"),-1!==this.className.indexOf("ui-datepicker-next")&&e(this).removeClass("ui-datepicker-next-hover")}).delegate(i,"mouseover",o)}function o(){e.datepicker._isDisabledDatepicker(v.inline?v.dpDiv.parent()[0]:v.input[0])||(e(this).parents(".ui-datepicker-calendar").find("a").removeClass("ui-state-hover"),e(this).addClass("ui-state-hover"),-1!==this.className.indexOf("ui-datepicker-prev")&&e(this).addClass("ui-datepicker-prev-hover"),-1!==this.className.indexOf("ui-datepicker-next")&&e(this).addClass("ui-datepicker-next-hover"))}function r(t,i){e.extend(t,i);for(var s in i)null==i[s]&&(t[s]=i[s]);return t}function h(e){return function(){var t=this.element.val();e.apply(this,arguments),this._refresh(),t!==this.element.val()&&this._trigger("change")}}e.ui=e.ui||{},e.extend(e.ui,{version:"1.11.4",keyCode:{BACKSPACE:8,COMMA:188,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,LEFT:37,PAGE_DOWN:34,PAGE_UP:33,PERIOD:190,RIGHT:39,SPACE:32,TAB:9,UP:38}}),e.fn.extend({scrollParent:function(t){var i=this.css("position"),s="absolute"===i,n=t?/(auto|scroll|hidden)/:/(auto|scroll)/,a=this.parents().filter(function(){var t=e(this);return s&&"static"===t.css("position")?!1:n.test(t.css("overflow")+t.css("overflow-y")+t.css("overflow-x"))}).eq(0);return"fixed"!==i&&a.length?a:e(this[0].ownerDocument||document)},uniqueId:function(){var e=0;return function(){return this.each(function(){this.id||(this.id="ui-id-"+ ++e)})}}(),removeUniqueId:function(){return this.each(function(){/^ui-id-\d+$/.test(this.id)&&e(this).removeAttr("id")})}}),e.extend(e.expr[":"],{data:e.expr.createPseudo?e.expr.createPseudo(function(t){return function(i){return!!e.data(i,t)}}):function(t,i,s){return!!e.data(t,s[3])},focusable:function(i){return t(i,!isNaN(e.attr(i,"tabindex")))},tabbable:function(i){var s=e.attr(i,"tabindex"),n=isNaN(s);return(n||s>=0)&&t(i,!n)}}),e("<a>").outerWidth(1).jquery||e.each(["Width","Height"],function(t,i){function s(t,i,s,a){return e.each(n,function(){i-=parseFloat(e.css(t,"padding"+this))||0,s&&(i-=parseFloat(e.css(t,"border"+this+"Width"))||0),a&&(i-=parseFloat(e.css(t,"margin"+this))||0)}),i}var n="Width"===i?["Left","Right"]:["Top","Bottom"],a=i.toLowerCase(),o={innerWidth:e.fn.innerWidth,innerHeight:e.fn.innerHeight,outerWidth:e.fn.outerWidth,outerHeight:e.fn.outerHeight};e.fn["inner"+i]=function(t){return void 0===t?o["inner"+i].call(this):this.each(function(){e(this).css(a,s(this,t)+"px")})},e.fn["outer"+i]=function(t,n){return"number"!=typeof t?o["outer"+i].call(this,t):this.each(function(){e(this).css(a,s(this,t,!0,n)+"px")})}}),e.fn.addBack||(e.fn.addBack=function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}),e("<a>").data("a-b","a").removeData("a-b").data("a-b")&&(e.fn.removeData=function(t){return function(i){return arguments.length?t.call(this,e.camelCase(i)):t.call(this)}}(e.fn.removeData)),e.ui.ie=!!/msie [\w.]+/.exec(navigator.userAgent.toLowerCase()),e.fn.extend({focus:function(t){return function(i,s){return"number"==typeof i?this.each(function(){var t=this;setTimeout(function(){e(t).focus(),s&&s.call(t)},i)}):t.apply(this,arguments)}}(e.fn.focus),disableSelection:function(){var e="onselectstart"in document.createElement("div")?"selectstart":"mousedown";return function(){return this.bind(e+".ui-disableSelection",function(e){e.preventDefault()})}}(),enableSelection:function(){return this.unbind(".ui-disableSelection")},zIndex:function(t){if(void 0!==t)return this.css("zIndex",t);if(this.length)for(var i,s,n=e(this[0]);n.length&&n[0]!==document;){if(i=n.css("position"),("absolute"===i||"relative"===i||"fixed"===i)&&(s=parseInt(n.css("zIndex"),10),!isNaN(s)&&0!==s))return s;n=n.parent()}return 0}}),e.ui.plugin={add:function(t,i,s){var n,a=e.ui[t].prototype;for(n in s)a.plugins[n]=a.plugins[n]||[],a.plugins[n].push([i,s[n]])},call:function(e,t,i,s){var n,a=e.plugins[t];if(a&&(s||e.element[0].parentNode&&11!==e.element[0].parentNode.nodeType))for(n=0;a.length>n;n++)e.options[a[n][0]]&&a[n][1].apply(e.element,i)}};var l=0,u=Array.prototype.slice;e.cleanData=function(t){return function(i){var s,n,a;for(a=0;null!=(n=i[a]);a++)try{s=e._data(n,"events"),s&&s.remove&&e(n).triggerHandler("remove")}catch(o){}t(i)}}(e.cleanData),e.widget=function(t,i,s){var n,a,o,r,h={},l=t.split(".")[0];return t=t.split(".")[1],n=l+"-"+t,s||(s=i,i=e.Widget),e.expr[":"][n.toLowerCase()]=function(t){return!!e.data(t,n)},e[l]=e[l]||{},a=e[l][t],o=e[l][t]=function(e,t){return this._createWidget?(arguments.length&&this._createWidget(e,t),void 0):new o(e,t)},e.extend(o,a,{version:s.version,_proto:e.extend({},s),_childConstructors:[]}),r=new i,r.options=e.widget.extend({},r.options),e.each(s,function(t,s){return e.isFunction(s)?(h[t]=function(){var e=function(){return i.prototype[t].apply(this,arguments)},n=function(e){return i.prototype[t].apply(this,e)};return function(){var t,i=this._super,a=this._superApply;return this._super=e,this._superApply=n,t=s.apply(this,arguments),this._super=i,this._superApply=a,t}}(),void 0):(h[t]=s,void 0)}),o.prototype=e.widget.extend(r,{widgetEventPrefix:a?r.widgetEventPrefix||t:t},h,{constructor:o,namespace:l,widgetName:t,widgetFullName:n}),a?(e.each(a._childConstructors,function(t,i){var s=i.prototype;e.widget(s.namespace+"."+s.widgetName,o,i._proto)}),delete a._childConstructors):i._childConstructors.push(o),e.widget.bridge(t,o),o},e.widget.extend=function(t){for(var i,s,n=u.call(arguments,1),a=0,o=n.length;o>a;a++)for(i in n[a])s=n[a][i],n[a].hasOwnProperty(i)&&void 0!==s&&(t[i]=e.isPlainObject(s)?e.isPlainObject(t[i])?e.widget.extend({},t[i],s):e.widget.extend({},s):s);return t},e.widget.bridge=function(t,i){var s=i.prototype.widgetFullName||t;e.fn[t]=function(n){var a="string"==typeof n,o=u.call(arguments,1),r=this;return a?this.each(function(){var i,a=e.data(this,s);return"instance"===n?(r=a,!1):a?e.isFunction(a[n])&&"_"!==n.charAt(0)?(i=a[n].apply(a,o),i!==a&&void 0!==i?(r=i&&i.jquery?r.pushStack(i.get()):i,!1):void 0):e.error("no such method '"+n+"' for "+t+" widget instance"):e.error("cannot call methods on "+t+" prior to initialization; "+"attempted to call method '"+n+"'")}):(o.length&&(n=e.widget.extend.apply(null,[n].concat(o))),this.each(function(){var t=e.data(this,s);t?(t.option(n||{}),t._init&&t._init()):e.data(this,s,new i(n,this))})),r}},e.Widget=function(){},e.Widget._childConstructors=[],e.Widget.prototype={widgetName:"widget",widgetEventPrefix:"",defaultElement:"<div>",options:{disabled:!1,create:null},_createWidget:function(t,i){i=e(i||this.defaultElement||this)[0],this.element=e(i),this.uuid=l++,this.eventNamespace="."+this.widgetName+this.uuid,this.bindings=e(),this.hoverable=e(),this.focusable=e(),i!==this&&(e.data(i,this.widgetFullName,this),this._on(!0,this.element,{remove:function(e){e.target===i&&this.destroy()}}),this.document=e(i.style?i.ownerDocument:i.document||i),this.window=e(this.document[0].defaultView||this.document[0].parentWindow)),this.options=e.widget.extend({},this.options,this._getCreateOptions(),t),this._create(),this._trigger("create",null,this._getCreateEventData()),this._init()},_getCreateOptions:e.noop,_getCreateEventData:e.noop,_create:e.noop,_init:e.noop,destroy:function(){this._destroy(),this.element.unbind(this.eventNamespace).removeData(this.widgetFullName).removeData(e.camelCase(this.widgetFullName)),this.widget().unbind(this.eventNamespace).removeAttr("aria-disabled").removeClass(this.widgetFullName+"-disabled "+"ui-state-disabled"),this.bindings.unbind(this.eventNamespace),this.hoverable.removeClass("ui-state-hover"),this.focusable.removeClass("ui-state-focus")},_destroy:e.noop,widget:function(){return this.element},option:function(t,i){var s,n,a,o=t;if(0===arguments.length)return e.widget.extend({},this.options);if("string"==typeof t)if(o={},s=t.split("."),t=s.shift(),s.length){for(n=o[t]=e.widget.extend({},this.options[t]),a=0;s.length-1>a;a++)n[s[a]]=n[s[a]]||{},n=n[s[a]];if(t=s.pop(),1===arguments.length)return void 0===n[t]?null:n[t];n[t]=i}else{if(1===arguments.length)return void 0===this.options[t]?null:this.options[t];o[t]=i}return this._setOptions(o),this},_setOptions:function(e){var t;for(t in e)this._setOption(t,e[t]);return this},_setOption:function(e,t){return this.options[e]=t,"disabled"===e&&(this.widget().toggleClass(this.widgetFullName+"-disabled",!!t),t&&(this.hoverable.removeClass("ui-state-hover"),this.focusable.removeClass("ui-state-focus"))),this},enable:function(){return this._setOptions({disabled:!1})},disable:function(){return this._setOptions({disabled:!0})},_on:function(t,i,s){var n,a=this;"boolean"!=typeof t&&(s=i,i=t,t=!1),s?(i=n=e(i),this.bindings=this.bindings.add(i)):(s=i,i=this.element,n=this.widget()),e.each(s,function(s,o){function r(){return t||a.options.disabled!==!0&&!e(this).hasClass("ui-state-disabled")?("string"==typeof o?a[o]:o).apply(a,arguments):void 0}"string"!=typeof o&&(r.guid=o.guid=o.guid||r.guid||e.guid++);var h=s.match(/^([\w:-]*)\s*(.*)$/),l=h[1]+a.eventNamespace,u=h[2];u?n.delegate(u,l,r):i.bind(l,r)})},_off:function(t,i){i=(i||"").split(" ").join(this.eventNamespace+" ")+this.eventNamespace,t.unbind(i).undelegate(i),this.bindings=e(this.bindings.not(t).get()),this.focusable=e(this.focusable.not(t).get()),this.hoverable=e(this.hoverable.not(t).get())},_delay:function(e,t){function i(){return("string"==typeof e?s[e]:e).apply(s,arguments)}var s=this;return setTimeout(i,t||0)},_hoverable:function(t){this.hoverable=this.hoverable.add(t),this._on(t,{mouseenter:function(t){e(t.currentTarget).addClass("ui-state-hover")},mouseleave:function(t){e(t.currentTarget).removeClass("ui-state-hover")}})},_focusable:function(t){this.focusable=this.focusable.add(t),this._on(t,{focusin:function(t){e(t.currentTarget).addClass("ui-state-focus")},focusout:function(t){e(t.currentTarget).removeClass("ui-state-focus")}})},_trigger:function(t,i,s){var n,a,o=this.options[t];if(s=s||{},i=e.Event(i),i.type=(t===this.widgetEventPrefix?t:this.widgetEventPrefix+t).toLowerCase(),i.target=this.element[0],a=i.originalEvent)for(n in a)n in i||(i[n]=a[n]);return this.element.trigger(i,s),!(e.isFunction(o)&&o.apply(this.element[0],[i].concat(s))===!1||i.isDefaultPrevented())}},e.each({show:"fadeIn",hide:"fadeOut"},function(t,i){e.Widget.prototype["_"+t]=function(s,n,a){"string"==typeof n&&(n={effect:n});var o,r=n?n===!0||"number"==typeof n?i:n.effect||i:t;n=n||{},"number"==typeof n&&(n={duration:n}),o=!e.isEmptyObject(n),n.complete=a,n.delay&&s.delay(n.delay),o&&e.effects&&e.effects.effect[r]?s[t](n):r!==t&&s[r]?s[r](n.duration,n.easing,a):s.queue(function(i){e(this)[t](),a&&a.call(s[0]),i()})}}),e.widget;var d=!1;e(document).mouseup(function(){d=!1}),e.widget("ui.mouse",{version:"1.11.4",options:{cancel:"input,textarea,button,select,option",distance:1,delay:0},_mouseInit:function(){var t=this;this.element.bind("mousedown."+this.widgetName,function(e){return t._mouseDown(e)}).bind("click."+this.widgetName,function(i){return!0===e.data(i.target,t.widgetName+".preventClickEvent")?(e.removeData(i.target,t.widgetName+".preventClickEvent"),i.stopImmediatePropagation(),!1):void 0}),this.started=!1},_mouseDestroy:function(){this.element.unbind("."+this.widgetName),this._mouseMoveDelegate&&this.document.unbind("mousemove."+this.widgetName,this._mouseMoveDelegate).unbind("mouseup."+this.widgetName,this._mouseUpDelegate)},_mouseDown:function(t){if(!d){this._mouseMoved=!1,this._mouseStarted&&this._mouseUp(t),this._mouseDownEvent=t;var i=this,s=1===t.which,n="string"==typeof this.options.cancel&&t.target.nodeName?e(t.target).closest(this.options.cancel).length:!1;return s&&!n&&this._mouseCapture(t)?(this.mouseDelayMet=!this.options.delay,this.mouseDelayMet||(this._mouseDelayTimer=setTimeout(function(){i.mouseDelayMet=!0},this.options.delay)),this._mouseDistanceMet(t)&&this._mouseDelayMet(t)&&(this._mouseStarted=this._mouseStart(t)!==!1,!this._mouseStarted)?(t.preventDefault(),!0):(!0===e.data(t.target,this.widgetName+".preventClickEvent")&&e.removeData(t.target,this.widgetName+".preventClickEvent"),this._mouseMoveDelegate=function(e){return i._mouseMove(e)},this._mouseUpDelegate=function(e){return i._mouseUp(e)},this.document.bind("mousemove."+this.widgetName,this._mouseMoveDelegate).bind("mouseup."+this.widgetName,this._mouseUpDelegate),t.preventDefault(),d=!0,!0)):!0}},_mouseMove:function(t){if(this._mouseMoved){if(e.ui.ie&&(!document.documentMode||9>document.documentMode)&&!t.button)return this._mouseUp(t);if(!t.which)return this._mouseUp(t)}return(t.which||t.button)&&(this._mouseMoved=!0),this._mouseStarted?(this._mouseDrag(t),t.preventDefault()):(this._mouseDistanceMet(t)&&this._mouseDelayMet(t)&&(this._mouseStarted=this._mouseStart(this._mouseDownEvent,t)!==!1,this._mouseStarted?this._mouseDrag(t):this._mouseUp(t)),!this._mouseStarted)},_mouseUp:function(t){return this.document.unbind("mousemove."+this.widgetName,this._mouseMoveDelegate).unbind("mouseup."+this.widgetName,this._mouseUpDelegate),this._mouseStarted&&(this._mouseStarted=!1,t.target===this._mouseDownEvent.target&&e.data(t.target,this.widgetName+".preventClickEvent",!0),this._mouseStop(t)),d=!1,!1},_mouseDistanceMet:function(e){return Math.max(Math.abs(this._mouseDownEvent.pageX-e.pageX),Math.abs(this._mouseDownEvent.pageY-e.pageY))>=this.options.distance},_mouseDelayMet:function(){return this.mouseDelayMet},_mouseStart:function(){},_mouseDrag:function(){},_mouseStop:function(){},_mouseCapture:function(){return!0}}),function(){function t(e,t,i){return[parseFloat(e[0])*(p.test(e[0])?t/100:1),parseFloat(e[1])*(p.test(e[1])?i/100:1)]}function i(t,i){return parseInt(e.css(t,i),10)||0}function s(t){var i=t[0];return 9===i.nodeType?{width:t.width(),height:t.height(),offset:{top:0,left:0}}:e.isWindow(i)?{width:t.width(),height:t.height(),offset:{top:t.scrollTop(),left:t.scrollLeft()}}:i.preventDefault?{width:0,height:0,offset:{top:i.pageY,left:i.pageX}}:{width:t.outerWidth(),height:t.outerHeight(),offset:t.offset()}}e.ui=e.ui||{};var n,a,o=Math.max,r=Math.abs,h=Math.round,l=/left|center|right/,u=/top|center|bottom/,d=/[\+\-]\d+(\.[\d]+)?%?/,c=/^\w+/,p=/%$/,f=e.fn.position;e.position={scrollbarWidth:function(){if(void 0!==n)return n;var t,i,s=e("<div style='display:block;position:absolute;width:50px;height:50px;overflow:hidden;'><div style='height:100px;width:auto;'></div></div>"),a=s.children()[0];return e("body").append(s),t=a.offsetWidth,s.css("overflow","scroll"),i=a.offsetWidth,t===i&&(i=s[0].clientWidth),s.remove(),n=t-i},getScrollInfo:function(t){var i=t.isWindow||t.isDocument?"":t.element.css("overflow-x"),s=t.isWindow||t.isDocument?"":t.element.css("overflow-y"),n="scroll"===i||"auto"===i&&t.width<t.element[0].scrollWidth,a="scroll"===s||"auto"===s&&t.height<t.element[0].scrollHeight;return{width:a?e.position.scrollbarWidth():0,height:n?e.position.scrollbarWidth():0}},getWithinInfo:function(t){var i=e(t||window),s=e.isWindow(i[0]),n=!!i[0]&&9===i[0].nodeType;return{element:i,isWindow:s,isDocument:n,offset:i.offset()||{left:0,top:0},scrollLeft:i.scrollLeft(),scrollTop:i.scrollTop(),width:s||n?i.width():i.outerWidth(),height:s||n?i.height():i.outerHeight()}}},e.fn.position=function(n){if(!n||!n.of)return f.apply(this,arguments);n=e.extend({},n);var p,m,g,v,y,b,_=e(n.of),x=e.position.getWithinInfo(n.within),w=e.position.getScrollInfo(x),k=(n.collision||"flip").split(" "),T={};return b=s(_),_[0].preventDefault&&(n.at="left top"),m=b.width,g=b.height,v=b.offset,y=e.extend({},v),e.each(["my","at"],function(){var e,t,i=(n[this]||"").split(" ");1===i.length&&(i=l.test(i[0])?i.concat(["center"]):u.test(i[0])?["center"].concat(i):["center","center"]),i[0]=l.test(i[0])?i[0]:"center",i[1]=u.test(i[1])?i[1]:"center",e=d.exec(i[0]),t=d.exec(i[1]),T[this]=[e?e[0]:0,t?t[0]:0],n[this]=[c.exec(i[0])[0],c.exec(i[1])[0]]}),1===k.length&&(k[1]=k[0]),"right"===n.at[0]?y.left+=m:"center"===n.at[0]&&(y.left+=m/2),"bottom"===n.at[1]?y.top+=g:"center"===n.at[1]&&(y.top+=g/2),p=t(T.at,m,g),y.left+=p[0],y.top+=p[1],this.each(function(){var s,l,u=e(this),d=u.outerWidth(),c=u.outerHeight(),f=i(this,"marginLeft"),b=i(this,"marginTop"),D=d+f+i(this,"marginRight")+w.width,S=c+b+i(this,"marginBottom")+w.height,N=e.extend({},y),M=t(T.my,u.outerWidth(),u.outerHeight());"right"===n.my[0]?N.left-=d:"center"===n.my[0]&&(N.left-=d/2),"bottom"===n.my[1]?N.top-=c:"center"===n.my[1]&&(N.top-=c/2),N.left+=M[0],N.top+=M[1],a||(N.left=h(N.left),N.top=h(N.top)),s={marginLeft:f,marginTop:b},e.each(["left","top"],function(t,i){e.ui.position[k[t]]&&e.ui.position[k[t]][i](N,{targetWidth:m,targetHeight:g,elemWidth:d,elemHeight:c,collisionPosition:s,collisionWidth:D,collisionHeight:S,offset:[p[0]+M[0],p[1]+M[1]],my:n.my,at:n.at,within:x,elem:u})}),n.using&&(l=function(e){var t=v.left-N.left,i=t+m-d,s=v.top-N.top,a=s+g-c,h={target:{element:_,left:v.left,top:v.top,width:m,height:g},element:{element:u,left:N.left,top:N.top,width:d,height:c},horizontal:0>i?"left":t>0?"right":"center",vertical:0>a?"top":s>0?"bottom":"middle"};d>m&&m>r(t+i)&&(h.horizontal="center"),c>g&&g>r(s+a)&&(h.vertical="middle"),h.important=o(r(t),r(i))>o(r(s),r(a))?"horizontal":"vertical",n.using.call(this,e,h)}),u.offset(e.extend(N,{using:l}))})},e.ui.position={fit:{left:function(e,t){var i,s=t.within,n=s.isWindow?s.scrollLeft:s.offset.left,a=s.width,r=e.left-t.collisionPosition.marginLeft,h=n-r,l=r+t.collisionWidth-a-n;t.collisionWidth>a?h>0&&0>=l?(i=e.left+h+t.collisionWidth-a-n,e.left+=h-i):e.left=l>0&&0>=h?n:h>l?n+a-t.collisionWidth:n:h>0?e.left+=h:l>0?e.left-=l:e.left=o(e.left-r,e.left)},top:function(e,t){var i,s=t.within,n=s.isWindow?s.scrollTop:s.offset.top,a=t.within.height,r=e.top-t.collisionPosition.marginTop,h=n-r,l=r+t.collisionHeight-a-n;t.collisionHeight>a?h>0&&0>=l?(i=e.top+h+t.collisionHeight-a-n,e.top+=h-i):e.top=l>0&&0>=h?n:h>l?n+a-t.collisionHeight:n:h>0?e.top+=h:l>0?e.top-=l:e.top=o(e.top-r,e.top)}},flip:{left:function(e,t){var i,s,n=t.within,a=n.offset.left+n.scrollLeft,o=n.width,h=n.isWindow?n.scrollLeft:n.offset.left,l=e.left-t.collisionPosition.marginLeft,u=l-h,d=l+t.collisionWidth-o-h,c="left"===t.my[0]?-t.elemWidth:"right"===t.my[0]?t.elemWidth:0,p="left"===t.at[0]?t.targetWidth:"right"===t.at[0]?-t.targetWidth:0,f=-2*t.offset[0];0>u?(i=e.left+c+p+f+t.collisionWidth-o-a,(0>i||r(u)>i)&&(e.left+=c+p+f)):d>0&&(s=e.left-t.collisionPosition.marginLeft+c+p+f-h,(s>0||d>r(s))&&(e.left+=c+p+f))},top:function(e,t){var i,s,n=t.within,a=n.offset.top+n.scrollTop,o=n.height,h=n.isWindow?n.scrollTop:n.offset.top,l=e.top-t.collisionPosition.marginTop,u=l-h,d=l+t.collisionHeight-o-h,c="top"===t.my[1],p=c?-t.elemHeight:"bottom"===t.my[1]?t.elemHeight:0,f="top"===t.at[1]?t.targetHeight:"bottom"===t.at[1]?-t.targetHeight:0,m=-2*t.offset[1];0>u?(s=e.top+p+f+m+t.collisionHeight-o-a,(0>s||r(u)>s)&&(e.top+=p+f+m)):d>0&&(i=e.top-t.collisionPosition.marginTop+p+f+m-h,(i>0||d>r(i))&&(e.top+=p+f+m))}},flipfit:{left:function(){e.ui.position.flip.left.apply(this,arguments),e.ui.position.fit.left.apply(this,arguments)},top:function(){e.ui.position.flip.top.apply(this,arguments),e.ui.position.fit.top.apply(this,arguments)}}},function(){var t,i,s,n,o,r=document.getElementsByTagName("body")[0],h=document.createElement("div");t=document.createElement(r?"div":"body"),s={visibility:"hidden",width:0,height:0,border:0,margin:0,background:"none"},r&&e.extend(s,{position:"absolute",left:"-1000px",top:"-1000px"});for(o in s)t.style[o]=s[o];t.appendChild(h),i=r||document.documentElement,i.insertBefore(t,i.firstChild),h.style.cssText="position: absolute; left: 10.7432222px;",n=e(h).offset().left,a=n>10&&11>n,t.innerHTML="",i.removeChild(t)}()}(),e.ui.position,e.widget("ui.draggable",e.ui.mouse,{version:"1.11.4",widgetEventPrefix:"drag",options:{addClasses:!0,appendTo:"parent",axis:!1,connectToSortable:!1,containment:!1,cursor:"auto",cursorAt:!1,grid:!1,handle:!1,helper:"original",iframeFix:!1,opacity:!1,refreshPositions:!1,revert:!1,revertDuration:500,scope:"default",scroll:!0,scrollSensitivity:20,scrollSpeed:20,snap:!1,snapMode:"both",snapTolerance:20,stack:!1,zIndex:!1,drag:null,start:null,stop:null},_create:function(){"original"===this.options.helper&&this._setPositionRelative(),this.options.addClasses&&this.element.addClass("ui-draggable"),this.options.disabled&&this.element.addClass("ui-draggable-disabled"),this._setHandleClassName(),this._mouseInit()},_setOption:function(e,t){this._super(e,t),"handle"===e&&(this._removeHandleClassName(),this._setHandleClassName())},_destroy:function(){return(this.helper||this.element).is(".ui-draggable-dragging")?(this.destroyOnClear=!0,void 0):(this.element.removeClass("ui-draggable ui-draggable-dragging ui-draggable-disabled"),this._removeHandleClassName(),this._mouseDestroy(),void 0)},_mouseCapture:function(t){var i=this.options;return this._blurActiveElement(t),this.helper||i.disabled||e(t.target).closest(".ui-resizable-handle").length>0?!1:(this.handle=this._getHandle(t),this.handle?(this._blockFrames(i.iframeFix===!0?"iframe":i.iframeFix),!0):!1)},_blockFrames:function(t){this.iframeBlocks=this.document.find(t).map(function(){var t=e(this);return e("<div>").css("position","absolute").appendTo(t.parent()).outerWidth(t.outerWidth()).outerHeight(t.outerHeight()).offset(t.offset())[0]})},_unblockFrames:function(){this.iframeBlocks&&(this.iframeBlocks.remove(),delete this.iframeBlocks)},_blurActiveElement:function(t){var i=this.document[0];if(this.handleElement.is(t.target))try{i.activeElement&&"body"!==i.activeElement.nodeName.toLowerCase()&&e(i.activeElement).blur()}catch(s){}},_mouseStart:function(t){var i=this.options;return this.helper=this._createHelper(t),this.helper.addClass("ui-draggable-dragging"),this._cacheHelperProportions(),e.ui.ddmanager&&(e.ui.ddmanager.current=this),this._cacheMargins(),this.cssPosition=this.helper.css("position"),this.scrollParent=this.helper.scrollParent(!0),this.offsetParent=this.helper.offsetParent(),this.hasFixedAncestor=this.helper.parents().filter(function(){return"fixed"===e(this).css("position")}).length>0,this.positionAbs=this.element.offset(),this._refreshOffsets(t),this.originalPosition=this.position=this._generatePosition(t,!1),this.originalPageX=t.pageX,this.originalPageY=t.pageY,i.cursorAt&&this._adjustOffsetFromHelper(i.cursorAt),this._setContainment(),this._trigger("start",t)===!1?(this._clear(),!1):(this._cacheHelperProportions(),e.ui.ddmanager&&!i.dropBehaviour&&e.ui.ddmanager.prepareOffsets(this,t),this._normalizeRightBottom(),this._mouseDrag(t,!0),e.ui.ddmanager&&e.ui.ddmanager.dragStart(this,t),!0)},_refreshOffsets:function(e){this.offset={top:this.positionAbs.top-this.margins.top,left:this.positionAbs.left-this.margins.left,scroll:!1,parent:this._getParentOffset(),relative:this._getRelativeOffset()},this.offset.click={left:e.pageX-this.offset.left,top:e.pageY-this.offset.top}},_mouseDrag:function(t,i){if(this.hasFixedAncestor&&(this.offset.parent=this._getParentOffset()),this.position=this._generatePosition(t,!0),this.positionAbs=this._convertPositionTo("absolute"),!i){var s=this._uiHash();if(this._trigger("drag",t,s)===!1)return this._mouseUp({}),!1;this.position=s.position}return this.helper[0].style.left=this.position.left+"px",this.helper[0].style.top=this.position.top+"px",e.ui.ddmanager&&e.ui.ddmanager.drag(this,t),!1},_mouseStop:function(t){var i=this,s=!1;return e.ui.ddmanager&&!this.options.dropBehaviour&&(s=e.ui.ddmanager.drop(this,t)),this.dropped&&(s=this.dropped,this.dropped=!1),"invalid"===this.options.revert&&!s||"valid"===this.options.revert&&s||this.options.revert===!0||e.isFunction(this.options.revert)&&this.options.revert.call(this.element,s)?e(this.helper).animate(this.originalPosition,parseInt(this.options.revertDuration,10),function(){i._trigger("stop",t)!==!1&&i._clear()}):this._trigger("stop",t)!==!1&&this._clear(),!1},_mouseUp:function(t){return this._unblockFrames(),e.ui.ddmanager&&e.ui.ddmanager.dragStop(this,t),this.handleElement.is(t.target)&&this.element.focus(),e.ui.mouse.prototype._mouseUp.call(this,t)},cancel:function(){return this.helper.is(".ui-draggable-dragging")?this._mouseUp({}):this._clear(),this},_getHandle:function(t){return this.options.handle?!!e(t.target).closest(this.element.find(this.options.handle)).length:!0},_setHandleClassName:function(){this.handleElement=this.options.handle?this.element.find(this.options.handle):this.element,this.handleElement.addClass("ui-draggable-handle")},_removeHandleClassName:function(){this.handleElement.removeClass("ui-draggable-handle")},_createHelper:function(t){var i=this.options,s=e.isFunction(i.helper),n=s?e(i.helper.apply(this.element[0],[t])):"clone"===i.helper?this.element.clone().removeAttr("id"):this.element;return n.parents("body").length||n.appendTo("parent"===i.appendTo?this.element[0].parentNode:i.appendTo),s&&n[0]===this.element[0]&&this._setPositionRelative(),n[0]===this.element[0]||/(fixed|absolute)/.test(n.css("position"))||n.css("position","absolute"),n},_setPositionRelative:function(){/^(?:r|a|f)/.test(this.element.css("position"))||(this.element[0].style.position="relative")},_adjustOffsetFromHelper:function(t){"string"==typeof t&&(t=t.split(" ")),e.isArray(t)&&(t={left:+t[0],top:+t[1]||0}),"left"in t&&(this.offset.click.left=t.left+this.margins.left),"right"in t&&(this.offset.click.left=this.helperProportions.width-t.right+this.margins.left),"top"in t&&(this.offset.click.top=t.top+this.margins.top),"bottom"in t&&(this.offset.click.top=this.helperProportions.height-t.bottom+this.margins.top)},_isRootNode:function(e){return/(html|body)/i.test(e.tagName)||e===this.document[0]},_getParentOffset:function(){var t=this.offsetParent.offset(),i=this.document[0];return"absolute"===this.cssPosition&&this.scrollParent[0]!==i&&e.contains(this.scrollParent[0],this.offsetParent[0])&&(t.left+=this.scrollParent.scrollLeft(),t.top+=this.scrollParent.scrollTop()),this._isRootNode(this.offsetParent[0])&&(t={top:0,left:0}),{top:t.top+(parseInt(this.offsetParent.css("borderTopWidth"),10)||0),left:t.left+(parseInt(this.offsetParent.css("borderLeftWidth"),10)||0)}},_getRelativeOffset:function(){if("relative"!==this.cssPosition)return{top:0,left:0};var e=this.element.position(),t=this._isRootNode(this.scrollParent[0]);return{top:e.top-(parseInt(this.helper.css("top"),10)||0)+(t?0:this.scrollParent.scrollTop()),left:e.left-(parseInt(this.helper.css("left"),10)||0)+(t?0:this.scrollParent.scrollLeft())}},_cacheMargins:function(){this.margins={left:parseInt(this.element.css("marginLeft"),10)||0,top:parseInt(this.element.css("marginTop"),10)||0,right:parseInt(this.element.css("marginRight"),10)||0,bottom:parseInt(this.element.css("marginBottom"),10)||0}},_cacheHelperProportions:function(){this.helperProportions={width:this.helper.outerWidth(),height:this.helper.outerHeight()}},_setContainment:function(){var t,i,s,n=this.options,a=this.document[0];return this.relativeContainer=null,n.containment?"window"===n.containment?(this.containment=[e(window).scrollLeft()-this.offset.relative.left-this.offset.parent.left,e(window).scrollTop()-this.offset.relative.top-this.offset.parent.top,e(window).scrollLeft()+e(window).width()-this.helperProportions.width-this.margins.left,e(window).scrollTop()+(e(window).height()||a.body.parentNode.scrollHeight)-this.helperProportions.height-this.margins.top],void 0):"document"===n.containment?(this.containment=[0,0,e(a).width()-this.helperProportions.width-this.margins.left,(e(a).height()||a.body.parentNode.scrollHeight)-this.helperProportions.height-this.margins.top],void 0):n.containment.constructor===Array?(this.containment=n.containment,void 0):("parent"===n.containment&&(n.containment=this.helper[0].parentNode),i=e(n.containment),s=i[0],s&&(t=/(scroll|auto)/.test(i.css("overflow")),this.containment=[(parseInt(i.css("borderLeftWidth"),10)||0)+(parseInt(i.css("paddingLeft"),10)||0),(parseInt(i.css("borderTopWidth"),10)||0)+(parseInt(i.css("paddingTop"),10)||0),(t?Math.max(s.scrollWidth,s.offsetWidth):s.offsetWidth)-(parseInt(i.css("borderRightWidth"),10)||0)-(parseInt(i.css("paddingRight"),10)||0)-this.helperProportions.width-this.margins.left-this.margins.right,(t?Math.max(s.scrollHeight,s.offsetHeight):s.offsetHeight)-(parseInt(i.css("borderBottomWidth"),10)||0)-(parseInt(i.css("paddingBottom"),10)||0)-this.helperProportions.height-this.margins.top-this.margins.bottom],this.relativeContainer=i),void 0):(this.containment=null,void 0)},_convertPositionTo:function(e,t){t||(t=this.position);var i="absolute"===e?1:-1,s=this._isRootNode(this.scrollParent[0]);return{top:t.top+this.offset.relative.top*i+this.offset.parent.top*i-("fixed"===this.cssPosition?-this.offset.scroll.top:s?0:this.offset.scroll.top)*i,left:t.left+this.offset.relative.left*i+this.offset.parent.left*i-("fixed"===this.cssPosition?-this.offset.scroll.left:s?0:this.offset.scroll.left)*i}},_generatePosition:function(e,t){var i,s,n,a,o=this.options,r=this._isRootNode(this.scrollParent[0]),h=e.pageX,l=e.pageY;return r&&this.offset.scroll||(this.offset.scroll={top:this.scrollParent.scrollTop(),left:this.scrollParent.scrollLeft()}),t&&(this.containment&&(this.relativeContainer?(s=this.relativeContainer.offset(),i=[this.containment[0]+s.left,this.containment[1]+s.top,this.containment[2]+s.left,this.containment[3]+s.top]):i=this.containment,e.pageX-this.offset.click.left<i[0]&&(h=i[0]+this.offset.click.left),e.pageY-this.offset.click.top<i[1]&&(l=i[1]+this.offset.click.top),e.pageX-this.offset.click.left>i[2]&&(h=i[2]+this.offset.click.left),e.pageY-this.offset.click.top>i[3]&&(l=i[3]+this.offset.click.top)),o.grid&&(n=o.grid[1]?this.originalPageY+Math.round((l-this.originalPageY)/o.grid[1])*o.grid[1]:this.originalPageY,l=i?n-this.offset.click.top>=i[1]||n-this.offset.click.top>i[3]?n:n-this.offset.click.top>=i[1]?n-o.grid[1]:n+o.grid[1]:n,a=o.grid[0]?this.originalPageX+Math.round((h-this.originalPageX)/o.grid[0])*o.grid[0]:this.originalPageX,h=i?a-this.offset.click.left>=i[0]||a-this.offset.click.left>i[2]?a:a-this.offset.click.left>=i[0]?a-o.grid[0]:a+o.grid[0]:a),"y"===o.axis&&(h=this.originalPageX),"x"===o.axis&&(l=this.originalPageY)),{top:l-this.offset.click.top-this.offset.relative.top-this.offset.parent.top+("fixed"===this.cssPosition?-this.offset.scroll.top:r?0:this.offset.scroll.top),left:h-this.offset.click.left-this.offset.relative.left-this.offset.parent.left+("fixed"===this.cssPosition?-this.offset.scroll.left:r?0:this.offset.scroll.left)}
},_clear:function(){this.helper.removeClass("ui-draggable-dragging"),this.helper[0]===this.element[0]||this.cancelHelperRemoval||this.helper.remove(),this.helper=null,this.cancelHelperRemoval=!1,this.destroyOnClear&&this.destroy()},_normalizeRightBottom:function(){"y"!==this.options.axis&&"auto"!==this.helper.css("right")&&(this.helper.width(this.helper.width()),this.helper.css("right","auto")),"x"!==this.options.axis&&"auto"!==this.helper.css("bottom")&&(this.helper.height(this.helper.height()),this.helper.css("bottom","auto"))},_trigger:function(t,i,s){return s=s||this._uiHash(),e.ui.plugin.call(this,t,[i,s,this],!0),/^(drag|start|stop)/.test(t)&&(this.positionAbs=this._convertPositionTo("absolute"),s.offset=this.positionAbs),e.Widget.prototype._trigger.call(this,t,i,s)},plugins:{},_uiHash:function(){return{helper:this.helper,position:this.position,originalPosition:this.originalPosition,offset:this.positionAbs}}}),e.ui.plugin.add("draggable","connectToSortable",{start:function(t,i,s){var n=e.extend({},i,{item:s.element});s.sortables=[],e(s.options.connectToSortable).each(function(){var i=e(this).sortable("instance");i&&!i.options.disabled&&(s.sortables.push(i),i.refreshPositions(),i._trigger("activate",t,n))})},stop:function(t,i,s){var n=e.extend({},i,{item:s.element});s.cancelHelperRemoval=!1,e.each(s.sortables,function(){var e=this;e.isOver?(e.isOver=0,s.cancelHelperRemoval=!0,e.cancelHelperRemoval=!1,e._storedCSS={position:e.placeholder.css("position"),top:e.placeholder.css("top"),left:e.placeholder.css("left")},e._mouseStop(t),e.options.helper=e.options._helper):(e.cancelHelperRemoval=!0,e._trigger("deactivate",t,n))})},drag:function(t,i,s){e.each(s.sortables,function(){var n=!1,a=this;a.positionAbs=s.positionAbs,a.helperProportions=s.helperProportions,a.offset.click=s.offset.click,a._intersectsWith(a.containerCache)&&(n=!0,e.each(s.sortables,function(){return this.positionAbs=s.positionAbs,this.helperProportions=s.helperProportions,this.offset.click=s.offset.click,this!==a&&this._intersectsWith(this.containerCache)&&e.contains(a.element[0],this.element[0])&&(n=!1),n})),n?(a.isOver||(a.isOver=1,s._parent=i.helper.parent(),a.currentItem=i.helper.appendTo(a.element).data("ui-sortable-item",!0),a.options._helper=a.options.helper,a.options.helper=function(){return i.helper[0]},t.target=a.currentItem[0],a._mouseCapture(t,!0),a._mouseStart(t,!0,!0),a.offset.click.top=s.offset.click.top,a.offset.click.left=s.offset.click.left,a.offset.parent.left-=s.offset.parent.left-a.offset.parent.left,a.offset.parent.top-=s.offset.parent.top-a.offset.parent.top,s._trigger("toSortable",t),s.dropped=a.element,e.each(s.sortables,function(){this.refreshPositions()}),s.currentItem=s.element,a.fromOutside=s),a.currentItem&&(a._mouseDrag(t),i.position=a.position)):a.isOver&&(a.isOver=0,a.cancelHelperRemoval=!0,a.options._revert=a.options.revert,a.options.revert=!1,a._trigger("out",t,a._uiHash(a)),a._mouseStop(t,!0),a.options.revert=a.options._revert,a.options.helper=a.options._helper,a.placeholder&&a.placeholder.remove(),i.helper.appendTo(s._parent),s._refreshOffsets(t),i.position=s._generatePosition(t,!0),s._trigger("fromSortable",t),s.dropped=!1,e.each(s.sortables,function(){this.refreshPositions()}))})}}),e.ui.plugin.add("draggable","cursor",{start:function(t,i,s){var n=e("body"),a=s.options;n.css("cursor")&&(a._cursor=n.css("cursor")),n.css("cursor",a.cursor)},stop:function(t,i,s){var n=s.options;n._cursor&&e("body").css("cursor",n._cursor)}}),e.ui.plugin.add("draggable","opacity",{start:function(t,i,s){var n=e(i.helper),a=s.options;n.css("opacity")&&(a._opacity=n.css("opacity")),n.css("opacity",a.opacity)},stop:function(t,i,s){var n=s.options;n._opacity&&e(i.helper).css("opacity",n._opacity)}}),e.ui.plugin.add("draggable","scroll",{start:function(e,t,i){i.scrollParentNotHidden||(i.scrollParentNotHidden=i.helper.scrollParent(!1)),i.scrollParentNotHidden[0]!==i.document[0]&&"HTML"!==i.scrollParentNotHidden[0].tagName&&(i.overflowOffset=i.scrollParentNotHidden.offset())},drag:function(t,i,s){var n=s.options,a=!1,o=s.scrollParentNotHidden[0],r=s.document[0];o!==r&&"HTML"!==o.tagName?(n.axis&&"x"===n.axis||(s.overflowOffset.top+o.offsetHeight-t.pageY<n.scrollSensitivity?o.scrollTop=a=o.scrollTop+n.scrollSpeed:t.pageY-s.overflowOffset.top<n.scrollSensitivity&&(o.scrollTop=a=o.scrollTop-n.scrollSpeed)),n.axis&&"y"===n.axis||(s.overflowOffset.left+o.offsetWidth-t.pageX<n.scrollSensitivity?o.scrollLeft=a=o.scrollLeft+n.scrollSpeed:t.pageX-s.overflowOffset.left<n.scrollSensitivity&&(o.scrollLeft=a=o.scrollLeft-n.scrollSpeed))):(n.axis&&"x"===n.axis||(t.pageY-e(r).scrollTop()<n.scrollSensitivity?a=e(r).scrollTop(e(r).scrollTop()-n.scrollSpeed):e(window).height()-(t.pageY-e(r).scrollTop())<n.scrollSensitivity&&(a=e(r).scrollTop(e(r).scrollTop()+n.scrollSpeed))),n.axis&&"y"===n.axis||(t.pageX-e(r).scrollLeft()<n.scrollSensitivity?a=e(r).scrollLeft(e(r).scrollLeft()-n.scrollSpeed):e(window).width()-(t.pageX-e(r).scrollLeft())<n.scrollSensitivity&&(a=e(r).scrollLeft(e(r).scrollLeft()+n.scrollSpeed)))),a!==!1&&e.ui.ddmanager&&!n.dropBehaviour&&e.ui.ddmanager.prepareOffsets(s,t)}}),e.ui.plugin.add("draggable","snap",{start:function(t,i,s){var n=s.options;s.snapElements=[],e(n.snap.constructor!==String?n.snap.items||":data(ui-draggable)":n.snap).each(function(){var t=e(this),i=t.offset();this!==s.element[0]&&s.snapElements.push({item:this,width:t.outerWidth(),height:t.outerHeight(),top:i.top,left:i.left})})},drag:function(t,i,s){var n,a,o,r,h,l,u,d,c,p,f=s.options,m=f.snapTolerance,g=i.offset.left,v=g+s.helperProportions.width,y=i.offset.top,b=y+s.helperProportions.height;for(c=s.snapElements.length-1;c>=0;c--)h=s.snapElements[c].left-s.margins.left,l=h+s.snapElements[c].width,u=s.snapElements[c].top-s.margins.top,d=u+s.snapElements[c].height,h-m>v||g>l+m||u-m>b||y>d+m||!e.contains(s.snapElements[c].item.ownerDocument,s.snapElements[c].item)?(s.snapElements[c].snapping&&s.options.snap.release&&s.options.snap.release.call(s.element,t,e.extend(s._uiHash(),{snapItem:s.snapElements[c].item})),s.snapElements[c].snapping=!1):("inner"!==f.snapMode&&(n=m>=Math.abs(u-b),a=m>=Math.abs(d-y),o=m>=Math.abs(h-v),r=m>=Math.abs(l-g),n&&(i.position.top=s._convertPositionTo("relative",{top:u-s.helperProportions.height,left:0}).top),a&&(i.position.top=s._convertPositionTo("relative",{top:d,left:0}).top),o&&(i.position.left=s._convertPositionTo("relative",{top:0,left:h-s.helperProportions.width}).left),r&&(i.position.left=s._convertPositionTo("relative",{top:0,left:l}).left)),p=n||a||o||r,"outer"!==f.snapMode&&(n=m>=Math.abs(u-y),a=m>=Math.abs(d-b),o=m>=Math.abs(h-g),r=m>=Math.abs(l-v),n&&(i.position.top=s._convertPositionTo("relative",{top:u,left:0}).top),a&&(i.position.top=s._convertPositionTo("relative",{top:d-s.helperProportions.height,left:0}).top),o&&(i.position.left=s._convertPositionTo("relative",{top:0,left:h}).left),r&&(i.position.left=s._convertPositionTo("relative",{top:0,left:l-s.helperProportions.width}).left)),!s.snapElements[c].snapping&&(n||a||o||r||p)&&s.options.snap.snap&&s.options.snap.snap.call(s.element,t,e.extend(s._uiHash(),{snapItem:s.snapElements[c].item})),s.snapElements[c].snapping=n||a||o||r||p)}}),e.ui.plugin.add("draggable","stack",{start:function(t,i,s){var n,a=s.options,o=e.makeArray(e(a.stack)).sort(function(t,i){return(parseInt(e(t).css("zIndex"),10)||0)-(parseInt(e(i).css("zIndex"),10)||0)});o.length&&(n=parseInt(e(o[0]).css("zIndex"),10)||0,e(o).each(function(t){e(this).css("zIndex",n+t)}),this.css("zIndex",n+o.length))}}),e.ui.plugin.add("draggable","zIndex",{start:function(t,i,s){var n=e(i.helper),a=s.options;n.css("zIndex")&&(a._zIndex=n.css("zIndex")),n.css("zIndex",a.zIndex)},stop:function(t,i,s){var n=s.options;n._zIndex&&e(i.helper).css("zIndex",n._zIndex)}}),e.ui.draggable,e.widget("ui.droppable",{version:"1.11.4",widgetEventPrefix:"drop",options:{accept:"*",activeClass:!1,addClasses:!0,greedy:!1,hoverClass:!1,scope:"default",tolerance:"intersect",activate:null,deactivate:null,drop:null,out:null,over:null},_create:function(){var t,i=this.options,s=i.accept;this.isover=!1,this.isout=!0,this.accept=e.isFunction(s)?s:function(e){return e.is(s)},this.proportions=function(){return arguments.length?(t=arguments[0],void 0):t?t:t={width:this.element[0].offsetWidth,height:this.element[0].offsetHeight}},this._addToManager(i.scope),i.addClasses&&this.element.addClass("ui-droppable")},_addToManager:function(t){e.ui.ddmanager.droppables[t]=e.ui.ddmanager.droppables[t]||[],e.ui.ddmanager.droppables[t].push(this)},_splice:function(e){for(var t=0;e.length>t;t++)e[t]===this&&e.splice(t,1)},_destroy:function(){var t=e.ui.ddmanager.droppables[this.options.scope];this._splice(t),this.element.removeClass("ui-droppable ui-droppable-disabled")},_setOption:function(t,i){if("accept"===t)this.accept=e.isFunction(i)?i:function(e){return e.is(i)};else if("scope"===t){var s=e.ui.ddmanager.droppables[this.options.scope];this._splice(s),this._addToManager(i)}this._super(t,i)},_activate:function(t){var i=e.ui.ddmanager.current;this.options.activeClass&&this.element.addClass(this.options.activeClass),i&&this._trigger("activate",t,this.ui(i))},_deactivate:function(t){var i=e.ui.ddmanager.current;this.options.activeClass&&this.element.removeClass(this.options.activeClass),i&&this._trigger("deactivate",t,this.ui(i))},_over:function(t){var i=e.ui.ddmanager.current;i&&(i.currentItem||i.element)[0]!==this.element[0]&&this.accept.call(this.element[0],i.currentItem||i.element)&&(this.options.hoverClass&&this.element.addClass(this.options.hoverClass),this._trigger("over",t,this.ui(i)))},_out:function(t){var i=e.ui.ddmanager.current;i&&(i.currentItem||i.element)[0]!==this.element[0]&&this.accept.call(this.element[0],i.currentItem||i.element)&&(this.options.hoverClass&&this.element.removeClass(this.options.hoverClass),this._trigger("out",t,this.ui(i)))},_drop:function(t,i){var s=i||e.ui.ddmanager.current,n=!1;return s&&(s.currentItem||s.element)[0]!==this.element[0]?(this.element.find(":data(ui-droppable)").not(".ui-draggable-dragging").each(function(){var i=e(this).droppable("instance");return i.options.greedy&&!i.options.disabled&&i.options.scope===s.options.scope&&i.accept.call(i.element[0],s.currentItem||s.element)&&e.ui.intersect(s,e.extend(i,{offset:i.element.offset()}),i.options.tolerance,t)?(n=!0,!1):void 0}),n?!1:this.accept.call(this.element[0],s.currentItem||s.element)?(this.options.activeClass&&this.element.removeClass(this.options.activeClass),this.options.hoverClass&&this.element.removeClass(this.options.hoverClass),this._trigger("drop",t,this.ui(s)),this.element):!1):!1},ui:function(e){return{draggable:e.currentItem||e.element,helper:e.helper,position:e.position,offset:e.positionAbs}}}),e.ui.intersect=function(){function e(e,t,i){return e>=t&&t+i>e}return function(t,i,s,n){if(!i.offset)return!1;var a=(t.positionAbs||t.position.absolute).left+t.margins.left,o=(t.positionAbs||t.position.absolute).top+t.margins.top,r=a+t.helperProportions.width,h=o+t.helperProportions.height,l=i.offset.left,u=i.offset.top,d=l+i.proportions().width,c=u+i.proportions().height;switch(s){case"fit":return a>=l&&d>=r&&o>=u&&c>=h;case"intersect":return a+t.helperProportions.width/2>l&&d>r-t.helperProportions.width/2&&o+t.helperProportions.height/2>u&&c>h-t.helperProportions.height/2;case"pointer":return e(n.pageY,u,i.proportions().height)&&e(n.pageX,l,i.proportions().width);case"touch":return(o>=u&&c>=o||h>=u&&c>=h||u>o&&h>c)&&(a>=l&&d>=a||r>=l&&d>=r||l>a&&r>d);default:return!1}}}(),e.ui.ddmanager={current:null,droppables:{"default":[]},prepareOffsets:function(t,i){var s,n,a=e.ui.ddmanager.droppables[t.options.scope]||[],o=i?i.type:null,r=(t.currentItem||t.element).find(":data(ui-droppable)").addBack();e:for(s=0;a.length>s;s++)if(!(a[s].options.disabled||t&&!a[s].accept.call(a[s].element[0],t.currentItem||t.element))){for(n=0;r.length>n;n++)if(r[n]===a[s].element[0]){a[s].proportions().height=0;continue e}a[s].visible="none"!==a[s].element.css("display"),a[s].visible&&("mousedown"===o&&a[s]._activate.call(a[s],i),a[s].offset=a[s].element.offset(),a[s].proportions({width:a[s].element[0].offsetWidth,height:a[s].element[0].offsetHeight}))}},drop:function(t,i){var s=!1;return e.each((e.ui.ddmanager.droppables[t.options.scope]||[]).slice(),function(){this.options&&(!this.options.disabled&&this.visible&&e.ui.intersect(t,this,this.options.tolerance,i)&&(s=this._drop.call(this,i)||s),!this.options.disabled&&this.visible&&this.accept.call(this.element[0],t.currentItem||t.element)&&(this.isout=!0,this.isover=!1,this._deactivate.call(this,i)))}),s},dragStart:function(t,i){t.element.parentsUntil("body").bind("scroll.droppable",function(){t.options.refreshPositions||e.ui.ddmanager.prepareOffsets(t,i)})},drag:function(t,i){t.options.refreshPositions&&e.ui.ddmanager.prepareOffsets(t,i),e.each(e.ui.ddmanager.droppables[t.options.scope]||[],function(){if(!this.options.disabled&&!this.greedyChild&&this.visible){var s,n,a,o=e.ui.intersect(t,this,this.options.tolerance,i),r=!o&&this.isover?"isout":o&&!this.isover?"isover":null;r&&(this.options.greedy&&(n=this.options.scope,a=this.element.parents(":data(ui-droppable)").filter(function(){return e(this).droppable("instance").options.scope===n}),a.length&&(s=e(a[0]).droppable("instance"),s.greedyChild="isover"===r)),s&&"isover"===r&&(s.isover=!1,s.isout=!0,s._out.call(s,i)),this[r]=!0,this["isout"===r?"isover":"isout"]=!1,this["isover"===r?"_over":"_out"].call(this,i),s&&"isout"===r&&(s.isout=!1,s.isover=!0,s._over.call(s,i)))}})},dragStop:function(t,i){t.element.parentsUntil("body").unbind("scroll.droppable"),t.options.refreshPositions||e.ui.ddmanager.prepareOffsets(t,i)}},e.ui.droppable,e.widget("ui.resizable",e.ui.mouse,{version:"1.11.4",widgetEventPrefix:"resize",options:{alsoResize:!1,animate:!1,animateDuration:"slow",animateEasing:"swing",aspectRatio:!1,autoHide:!1,containment:!1,ghost:!1,grid:!1,handles:"e,s,se",helper:!1,maxHeight:null,maxWidth:null,minHeight:10,minWidth:10,zIndex:90,resize:null,start:null,stop:null},_num:function(e){return parseInt(e,10)||0},_isNumber:function(e){return!isNaN(parseInt(e,10))},_hasScroll:function(t,i){if("hidden"===e(t).css("overflow"))return!1;var s=i&&"left"===i?"scrollLeft":"scrollTop",n=!1;return t[s]>0?!0:(t[s]=1,n=t[s]>0,t[s]=0,n)},_create:function(){var t,i,s,n,a,o=this,r=this.options;if(this.element.addClass("ui-resizable"),e.extend(this,{_aspectRatio:!!r.aspectRatio,aspectRatio:r.aspectRatio,originalElement:this.element,_proportionallyResizeElements:[],_helper:r.helper||r.ghost||r.animate?r.helper||"ui-resizable-helper":null}),this.element[0].nodeName.match(/^(canvas|textarea|input|select|button|img)$/i)&&(this.element.wrap(e("<div class='ui-wrapper' style='overflow: hidden;'></div>").css({position:this.element.css("position"),width:this.element.outerWidth(),height:this.element.outerHeight(),top:this.element.css("top"),left:this.element.css("left")})),this.element=this.element.parent().data("ui-resizable",this.element.resizable("instance")),this.elementIsWrapper=!0,this.element.css({marginLeft:this.originalElement.css("marginLeft"),marginTop:this.originalElement.css("marginTop"),marginRight:this.originalElement.css("marginRight"),marginBottom:this.originalElement.css("marginBottom")}),this.originalElement.css({marginLeft:0,marginTop:0,marginRight:0,marginBottom:0}),this.originalResizeStyle=this.originalElement.css("resize"),this.originalElement.css("resize","none"),this._proportionallyResizeElements.push(this.originalElement.css({position:"static",zoom:1,display:"block"})),this.originalElement.css({margin:this.originalElement.css("margin")}),this._proportionallyResize()),this.handles=r.handles||(e(".ui-resizable-handle",this.element).length?{n:".ui-resizable-n",e:".ui-resizable-e",s:".ui-resizable-s",w:".ui-resizable-w",se:".ui-resizable-se",sw:".ui-resizable-sw",ne:".ui-resizable-ne",nw:".ui-resizable-nw"}:"e,s,se"),this._handles=e(),this.handles.constructor===String)for("all"===this.handles&&(this.handles="n,e,s,w,se,sw,ne,nw"),t=this.handles.split(","),this.handles={},i=0;t.length>i;i++)s=e.trim(t[i]),a="ui-resizable-"+s,n=e("<div class='ui-resizable-handle "+a+"'></div>"),n.css({zIndex:r.zIndex}),"se"===s&&n.addClass("ui-icon ui-icon-gripsmall-diagonal-se"),this.handles[s]=".ui-resizable-"+s,this.element.append(n);this._renderAxis=function(t){var i,s,n,a;t=t||this.element;for(i in this.handles)this.handles[i].constructor===String?this.handles[i]=this.element.children(this.handles[i]).first().show():(this.handles[i].jquery||this.handles[i].nodeType)&&(this.handles[i]=e(this.handles[i]),this._on(this.handles[i],{mousedown:o._mouseDown})),this.elementIsWrapper&&this.originalElement[0].nodeName.match(/^(textarea|input|select|button)$/i)&&(s=e(this.handles[i],this.element),a=/sw|ne|nw|se|n|s/.test(i)?s.outerHeight():s.outerWidth(),n=["padding",/ne|nw|n/.test(i)?"Top":/se|sw|s/.test(i)?"Bottom":/^e$/.test(i)?"Right":"Left"].join(""),t.css(n,a),this._proportionallyResize()),this._handles=this._handles.add(this.handles[i])},this._renderAxis(this.element),this._handles=this._handles.add(this.element.find(".ui-resizable-handle")),this._handles.disableSelection(),this._handles.mouseover(function(){o.resizing||(this.className&&(n=this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i)),o.axis=n&&n[1]?n[1]:"se")}),r.autoHide&&(this._handles.hide(),e(this.element).addClass("ui-resizable-autohide").mouseenter(function(){r.disabled||(e(this).removeClass("ui-resizable-autohide"),o._handles.show())}).mouseleave(function(){r.disabled||o.resizing||(e(this).addClass("ui-resizable-autohide"),o._handles.hide())})),this._mouseInit()},_destroy:function(){this._mouseDestroy();var t,i=function(t){e(t).removeClass("ui-resizable ui-resizable-disabled ui-resizable-resizing").removeData("resizable").removeData("ui-resizable").unbind(".resizable").find(".ui-resizable-handle").remove()};return this.elementIsWrapper&&(i(this.element),t=this.element,this.originalElement.css({position:t.css("position"),width:t.outerWidth(),height:t.outerHeight(),top:t.css("top"),left:t.css("left")}).insertAfter(t),t.remove()),this.originalElement.css("resize",this.originalResizeStyle),i(this.originalElement),this},_mouseCapture:function(t){var i,s,n=!1;for(i in this.handles)s=e(this.handles[i])[0],(s===t.target||e.contains(s,t.target))&&(n=!0);return!this.options.disabled&&n},_mouseStart:function(t){var i,s,n,a=this.options,o=this.element;return this.resizing=!0,this._renderProxy(),i=this._num(this.helper.css("left")),s=this._num(this.helper.css("top")),a.containment&&(i+=e(a.containment).scrollLeft()||0,s+=e(a.containment).scrollTop()||0),this.offset=this.helper.offset(),this.position={left:i,top:s},this.size=this._helper?{width:this.helper.width(),height:this.helper.height()}:{width:o.width(),height:o.height()},this.originalSize=this._helper?{width:o.outerWidth(),height:o.outerHeight()}:{width:o.width(),height:o.height()},this.sizeDiff={width:o.outerWidth()-o.width(),height:o.outerHeight()-o.height()},this.originalPosition={left:i,top:s},this.originalMousePosition={left:t.pageX,top:t.pageY},this.aspectRatio="number"==typeof a.aspectRatio?a.aspectRatio:this.originalSize.width/this.originalSize.height||1,n=e(".ui-resizable-"+this.axis).css("cursor"),e("body").css("cursor","auto"===n?this.axis+"-resize":n),o.addClass("ui-resizable-resizing"),this._propagate("start",t),!0},_mouseDrag:function(t){var i,s,n=this.originalMousePosition,a=this.axis,o=t.pageX-n.left||0,r=t.pageY-n.top||0,h=this._change[a];return this._updatePrevProperties(),h?(i=h.apply(this,[t,o,r]),this._updateVirtualBoundaries(t.shiftKey),(this._aspectRatio||t.shiftKey)&&(i=this._updateRatio(i,t)),i=this._respectSize(i,t),this._updateCache(i),this._propagate("resize",t),s=this._applyChanges(),!this._helper&&this._proportionallyResizeElements.length&&this._proportionallyResize(),e.isEmptyObject(s)||(this._updatePrevProperties(),this._trigger("resize",t,this.ui()),this._applyChanges()),!1):!1},_mouseStop:function(t){this.resizing=!1;var i,s,n,a,o,r,h,l=this.options,u=this;return this._helper&&(i=this._proportionallyResizeElements,s=i.length&&/textarea/i.test(i[0].nodeName),n=s&&this._hasScroll(i[0],"left")?0:u.sizeDiff.height,a=s?0:u.sizeDiff.width,o={width:u.helper.width()-a,height:u.helper.height()-n},r=parseInt(u.element.css("left"),10)+(u.position.left-u.originalPosition.left)||null,h=parseInt(u.element.css("top"),10)+(u.position.top-u.originalPosition.top)||null,l.animate||this.element.css(e.extend(o,{top:h,left:r})),u.helper.height(u.size.height),u.helper.width(u.size.width),this._helper&&!l.animate&&this._proportionallyResize()),e("body").css("cursor","auto"),this.element.removeClass("ui-resizable-resizing"),this._propagate("stop",t),this._helper&&this.helper.remove(),!1},_updatePrevProperties:function(){this.prevPosition={top:this.position.top,left:this.position.left},this.prevSize={width:this.size.width,height:this.size.height}},_applyChanges:function(){var e={};return this.position.top!==this.prevPosition.top&&(e.top=this.position.top+"px"),this.position.left!==this.prevPosition.left&&(e.left=this.position.left+"px"),this.size.width!==this.prevSize.width&&(e.width=this.size.width+"px"),this.size.height!==this.prevSize.height&&(e.height=this.size.height+"px"),this.helper.css(e),e},_updateVirtualBoundaries:function(e){var t,i,s,n,a,o=this.options;a={minWidth:this._isNumber(o.minWidth)?o.minWidth:0,maxWidth:this._isNumber(o.maxWidth)?o.maxWidth:1/0,minHeight:this._isNumber(o.minHeight)?o.minHeight:0,maxHeight:this._isNumber(o.maxHeight)?o.maxHeight:1/0},(this._aspectRatio||e)&&(t=a.minHeight*this.aspectRatio,s=a.minWidth/this.aspectRatio,i=a.maxHeight*this.aspectRatio,n=a.maxWidth/this.aspectRatio,t>a.minWidth&&(a.minWidth=t),s>a.minHeight&&(a.minHeight=s),a.maxWidth>i&&(a.maxWidth=i),a.maxHeight>n&&(a.maxHeight=n)),this._vBoundaries=a},_updateCache:function(e){this.offset=this.helper.offset(),this._isNumber(e.left)&&(this.position.left=e.left),this._isNumber(e.top)&&(this.position.top=e.top),this._isNumber(e.height)&&(this.size.height=e.height),this._isNumber(e.width)&&(this.size.width=e.width)},_updateRatio:function(e){var t=this.position,i=this.size,s=this.axis;return this._isNumber(e.height)?e.width=e.height*this.aspectRatio:this._isNumber(e.width)&&(e.height=e.width/this.aspectRatio),"sw"===s&&(e.left=t.left+(i.width-e.width),e.top=null),"nw"===s&&(e.top=t.top+(i.height-e.height),e.left=t.left+(i.width-e.width)),e},_respectSize:function(e){var t=this._vBoundaries,i=this.axis,s=this._isNumber(e.width)&&t.maxWidth&&t.maxWidth<e.width,n=this._isNumber(e.height)&&t.maxHeight&&t.maxHeight<e.height,a=this._isNumber(e.width)&&t.minWidth&&t.minWidth>e.width,o=this._isNumber(e.height)&&t.minHeight&&t.minHeight>e.height,r=this.originalPosition.left+this.originalSize.width,h=this.position.top+this.size.height,l=/sw|nw|w/.test(i),u=/nw|ne|n/.test(i);return a&&(e.width=t.minWidth),o&&(e.height=t.minHeight),s&&(e.width=t.maxWidth),n&&(e.height=t.maxHeight),a&&l&&(e.left=r-t.minWidth),s&&l&&(e.left=r-t.maxWidth),o&&u&&(e.top=h-t.minHeight),n&&u&&(e.top=h-t.maxHeight),e.width||e.height||e.left||!e.top?e.width||e.height||e.top||!e.left||(e.left=null):e.top=null,e},_getPaddingPlusBorderDimensions:function(e){for(var t=0,i=[],s=[e.css("borderTopWidth"),e.css("borderRightWidth"),e.css("borderBottomWidth"),e.css("borderLeftWidth")],n=[e.css("paddingTop"),e.css("paddingRight"),e.css("paddingBottom"),e.css("paddingLeft")];4>t;t++)i[t]=parseInt(s[t],10)||0,i[t]+=parseInt(n[t],10)||0;return{height:i[0]+i[2],width:i[1]+i[3]}},_proportionallyResize:function(){if(this._proportionallyResizeElements.length)for(var e,t=0,i=this.helper||this.element;this._proportionallyResizeElements.length>t;t++)e=this._proportionallyResizeElements[t],this.outerDimensions||(this.outerDimensions=this._getPaddingPlusBorderDimensions(e)),e.css({height:i.height()-this.outerDimensions.height||0,width:i.width()-this.outerDimensions.width||0})},_renderProxy:function(){var t=this.element,i=this.options;this.elementOffset=t.offset(),this._helper?(this.helper=this.helper||e("<div style='overflow:hidden;'></div>"),this.helper.addClass(this._helper).css({width:this.element.outerWidth()-1,height:this.element.outerHeight()-1,position:"absolute",left:this.elementOffset.left+"px",top:this.elementOffset.top+"px",zIndex:++i.zIndex}),this.helper.appendTo("body").disableSelection()):this.helper=this.element},_change:{e:function(e,t){return{width:this.originalSize.width+t}},w:function(e,t){var i=this.originalSize,s=this.originalPosition;return{left:s.left+t,width:i.width-t}},n:function(e,t,i){var s=this.originalSize,n=this.originalPosition;return{top:n.top+i,height:s.height-i}},s:function(e,t,i){return{height:this.originalSize.height+i}},se:function(t,i,s){return e.extend(this._change.s.apply(this,arguments),this._change.e.apply(this,[t,i,s]))},sw:function(t,i,s){return e.extend(this._change.s.apply(this,arguments),this._change.w.apply(this,[t,i,s]))},ne:function(t,i,s){return e.extend(this._change.n.apply(this,arguments),this._change.e.apply(this,[t,i,s]))},nw:function(t,i,s){return e.extend(this._change.n.apply(this,arguments),this._change.w.apply(this,[t,i,s]))}},_propagate:function(t,i){e.ui.plugin.call(this,t,[i,this.ui()]),"resize"!==t&&this._trigger(t,i,this.ui())},plugins:{},ui:function(){return{originalElement:this.originalElement,element:this.element,helper:this.helper,position:this.position,size:this.size,originalSize:this.originalSize,originalPosition:this.originalPosition}}}),e.ui.plugin.add("resizable","animate",{stop:function(t){var i=e(this).resizable("instance"),s=i.options,n=i._proportionallyResizeElements,a=n.length&&/textarea/i.test(n[0].nodeName),o=a&&i._hasScroll(n[0],"left")?0:i.sizeDiff.height,r=a?0:i.sizeDiff.width,h={width:i.size.width-r,height:i.size.height-o},l=parseInt(i.element.css("left"),10)+(i.position.left-i.originalPosition.left)||null,u=parseInt(i.element.css("top"),10)+(i.position.top-i.originalPosition.top)||null;i.element.animate(e.extend(h,u&&l?{top:u,left:l}:{}),{duration:s.animateDuration,easing:s.animateEasing,step:function(){var s={width:parseInt(i.element.css("width"),10),height:parseInt(i.element.css("height"),10),top:parseInt(i.element.css("top"),10),left:parseInt(i.element.css("left"),10)};n&&n.length&&e(n[0]).css({width:s.width,height:s.height}),i._updateCache(s),i._propagate("resize",t)}})}}),e.ui.plugin.add("resizable","containment",{start:function(){var t,i,s,n,a,o,r,h=e(this).resizable("instance"),l=h.options,u=h.element,d=l.containment,c=d instanceof e?d.get(0):/parent/.test(d)?u.parent().get(0):d;c&&(h.containerElement=e(c),/document/.test(d)||d===document?(h.containerOffset={left:0,top:0},h.containerPosition={left:0,top:0},h.parentData={element:e(document),left:0,top:0,width:e(document).width(),height:e(document).height()||document.body.parentNode.scrollHeight}):(t=e(c),i=[],e(["Top","Right","Left","Bottom"]).each(function(e,s){i[e]=h._num(t.css("padding"+s))}),h.containerOffset=t.offset(),h.containerPosition=t.position(),h.containerSize={height:t.innerHeight()-i[3],width:t.innerWidth()-i[1]},s=h.containerOffset,n=h.containerSize.height,a=h.containerSize.width,o=h._hasScroll(c,"left")?c.scrollWidth:a,r=h._hasScroll(c)?c.scrollHeight:n,h.parentData={element:c,left:s.left,top:s.top,width:o,height:r}))},resize:function(t){var i,s,n,a,o=e(this).resizable("instance"),r=o.options,h=o.containerOffset,l=o.position,u=o._aspectRatio||t.shiftKey,d={top:0,left:0},c=o.containerElement,p=!0;c[0]!==document&&/static/.test(c.css("position"))&&(d=h),l.left<(o._helper?h.left:0)&&(o.size.width=o.size.width+(o._helper?o.position.left-h.left:o.position.left-d.left),u&&(o.size.height=o.size.width/o.aspectRatio,p=!1),o.position.left=r.helper?h.left:0),l.top<(o._helper?h.top:0)&&(o.size.height=o.size.height+(o._helper?o.position.top-h.top:o.position.top),u&&(o.size.width=o.size.height*o.aspectRatio,p=!1),o.position.top=o._helper?h.top:0),n=o.containerElement.get(0)===o.element.parent().get(0),a=/relative|absolute/.test(o.containerElement.css("position")),n&&a?(o.offset.left=o.parentData.left+o.position.left,o.offset.top=o.parentData.top+o.position.top):(o.offset.left=o.element.offset().left,o.offset.top=o.element.offset().top),i=Math.abs(o.sizeDiff.width+(o._helper?o.offset.left-d.left:o.offset.left-h.left)),s=Math.abs(o.sizeDiff.height+(o._helper?o.offset.top-d.top:o.offset.top-h.top)),i+o.size.width>=o.parentData.width&&(o.size.width=o.parentData.width-i,u&&(o.size.height=o.size.width/o.aspectRatio,p=!1)),s+o.size.height>=o.parentData.height&&(o.size.height=o.parentData.height-s,u&&(o.size.width=o.size.height*o.aspectRatio,p=!1)),p||(o.position.left=o.prevPosition.left,o.position.top=o.prevPosition.top,o.size.width=o.prevSize.width,o.size.height=o.prevSize.height)},stop:function(){var t=e(this).resizable("instance"),i=t.options,s=t.containerOffset,n=t.containerPosition,a=t.containerElement,o=e(t.helper),r=o.offset(),h=o.outerWidth()-t.sizeDiff.width,l=o.outerHeight()-t.sizeDiff.height;t._helper&&!i.animate&&/relative/.test(a.css("position"))&&e(this).css({left:r.left-n.left-s.left,width:h,height:l}),t._helper&&!i.animate&&/static/.test(a.css("position"))&&e(this).css({left:r.left-n.left-s.left,width:h,height:l})}}),e.ui.plugin.add("resizable","alsoResize",{start:function(){var t=e(this).resizable("instance"),i=t.options;e(i.alsoResize).each(function(){var t=e(this);t.data("ui-resizable-alsoresize",{width:parseInt(t.width(),10),height:parseInt(t.height(),10),left:parseInt(t.css("left"),10),top:parseInt(t.css("top"),10)})})},resize:function(t,i){var s=e(this).resizable("instance"),n=s.options,a=s.originalSize,o=s.originalPosition,r={height:s.size.height-a.height||0,width:s.size.width-a.width||0,top:s.position.top-o.top||0,left:s.position.left-o.left||0};e(n.alsoResize).each(function(){var t=e(this),s=e(this).data("ui-resizable-alsoresize"),n={},a=t.parents(i.originalElement[0]).length?["width","height"]:["width","height","top","left"];e.each(a,function(e,t){var i=(s[t]||0)+(r[t]||0);i&&i>=0&&(n[t]=i||null)}),t.css(n)})},stop:function(){e(this).removeData("resizable-alsoresize")}}),e.ui.plugin.add("resizable","ghost",{start:function(){var t=e(this).resizable("instance"),i=t.options,s=t.size;t.ghost=t.originalElement.clone(),t.ghost.css({opacity:.25,display:"block",position:"relative",height:s.height,width:s.width,margin:0,left:0,top:0}).addClass("ui-resizable-ghost").addClass("string"==typeof i.ghost?i.ghost:""),t.ghost.appendTo(t.helper)},resize:function(){var t=e(this).resizable("instance");t.ghost&&t.ghost.css({position:"relative",height:t.size.height,width:t.size.width})},stop:function(){var t=e(this).resizable("instance");t.ghost&&t.helper&&t.helper.get(0).removeChild(t.ghost.get(0))}}),e.ui.plugin.add("resizable","grid",{resize:function(){var t,i=e(this).resizable("instance"),s=i.options,n=i.size,a=i.originalSize,o=i.originalPosition,r=i.axis,h="number"==typeof s.grid?[s.grid,s.grid]:s.grid,l=h[0]||1,u=h[1]||1,d=Math.round((n.width-a.width)/l)*l,c=Math.round((n.height-a.height)/u)*u,p=a.width+d,f=a.height+c,m=s.maxWidth&&p>s.maxWidth,g=s.maxHeight&&f>s.maxHeight,v=s.minWidth&&s.minWidth>p,y=s.minHeight&&s.minHeight>f;s.grid=h,v&&(p+=l),y&&(f+=u),m&&(p-=l),g&&(f-=u),/^(se|s|e)$/.test(r)?(i.size.width=p,i.size.height=f):/^(ne)$/.test(r)?(i.size.width=p,i.size.height=f,i.position.top=o.top-c):/^(sw)$/.test(r)?(i.size.width=p,i.size.height=f,i.position.left=o.left-d):((0>=f-u||0>=p-l)&&(t=i._getPaddingPlusBorderDimensions(this)),f-u>0?(i.size.height=f,i.position.top=o.top-c):(f=u-t.height,i.size.height=f,i.position.top=o.top+a.height-f),p-l>0?(i.size.width=p,i.position.left=o.left-d):(p=l-t.width,i.size.width=p,i.position.left=o.left+a.width-p))}}),e.ui.resizable,e.widget("ui.selectable",e.ui.mouse,{version:"1.11.4",options:{appendTo:"body",autoRefresh:!0,distance:0,filter:"*",tolerance:"touch",selected:null,selecting:null,start:null,stop:null,unselected:null,unselecting:null},_create:function(){var t,i=this;
this.element.addClass("ui-selectable"),this.dragged=!1,this.refresh=function(){t=e(i.options.filter,i.element[0]),t.addClass("ui-selectee"),t.each(function(){var t=e(this),i=t.offset();e.data(this,"selectable-item",{element:this,$element:t,left:i.left,top:i.top,right:i.left+t.outerWidth(),bottom:i.top+t.outerHeight(),startselected:!1,selected:t.hasClass("ui-selected"),selecting:t.hasClass("ui-selecting"),unselecting:t.hasClass("ui-unselecting")})})},this.refresh(),this.selectees=t.addClass("ui-selectee"),this._mouseInit(),this.helper=e("<div class='ui-selectable-helper'></div>")},_destroy:function(){this.selectees.removeClass("ui-selectee").removeData("selectable-item"),this.element.removeClass("ui-selectable ui-selectable-disabled"),this._mouseDestroy()},_mouseStart:function(t){var i=this,s=this.options;this.opos=[t.pageX,t.pageY],this.options.disabled||(this.selectees=e(s.filter,this.element[0]),this._trigger("start",t),e(s.appendTo).append(this.helper),this.helper.css({left:t.pageX,top:t.pageY,width:0,height:0}),s.autoRefresh&&this.refresh(),this.selectees.filter(".ui-selected").each(function(){var s=e.data(this,"selectable-item");s.startselected=!0,t.metaKey||t.ctrlKey||(s.$element.removeClass("ui-selected"),s.selected=!1,s.$element.addClass("ui-unselecting"),s.unselecting=!0,i._trigger("unselecting",t,{unselecting:s.element}))}),e(t.target).parents().addBack().each(function(){var s,n=e.data(this,"selectable-item");return n?(s=!t.metaKey&&!t.ctrlKey||!n.$element.hasClass("ui-selected"),n.$element.removeClass(s?"ui-unselecting":"ui-selected").addClass(s?"ui-selecting":"ui-unselecting"),n.unselecting=!s,n.selecting=s,n.selected=s,s?i._trigger("selecting",t,{selecting:n.element}):i._trigger("unselecting",t,{unselecting:n.element}),!1):void 0}))},_mouseDrag:function(t){if(this.dragged=!0,!this.options.disabled){var i,s=this,n=this.options,a=this.opos[0],o=this.opos[1],r=t.pageX,h=t.pageY;return a>r&&(i=r,r=a,a=i),o>h&&(i=h,h=o,o=i),this.helper.css({left:a,top:o,width:r-a,height:h-o}),this.selectees.each(function(){var i=e.data(this,"selectable-item"),l=!1;i&&i.element!==s.element[0]&&("touch"===n.tolerance?l=!(i.left>r||a>i.right||i.top>h||o>i.bottom):"fit"===n.tolerance&&(l=i.left>a&&r>i.right&&i.top>o&&h>i.bottom),l?(i.selected&&(i.$element.removeClass("ui-selected"),i.selected=!1),i.unselecting&&(i.$element.removeClass("ui-unselecting"),i.unselecting=!1),i.selecting||(i.$element.addClass("ui-selecting"),i.selecting=!0,s._trigger("selecting",t,{selecting:i.element}))):(i.selecting&&((t.metaKey||t.ctrlKey)&&i.startselected?(i.$element.removeClass("ui-selecting"),i.selecting=!1,i.$element.addClass("ui-selected"),i.selected=!0):(i.$element.removeClass("ui-selecting"),i.selecting=!1,i.startselected&&(i.$element.addClass("ui-unselecting"),i.unselecting=!0),s._trigger("unselecting",t,{unselecting:i.element}))),i.selected&&(t.metaKey||t.ctrlKey||i.startselected||(i.$element.removeClass("ui-selected"),i.selected=!1,i.$element.addClass("ui-unselecting"),i.unselecting=!0,s._trigger("unselecting",t,{unselecting:i.element})))))}),!1}},_mouseStop:function(t){var i=this;return this.dragged=!1,e(".ui-unselecting",this.element[0]).each(function(){var s=e.data(this,"selectable-item");s.$element.removeClass("ui-unselecting"),s.unselecting=!1,s.startselected=!1,i._trigger("unselected",t,{unselected:s.element})}),e(".ui-selecting",this.element[0]).each(function(){var s=e.data(this,"selectable-item");s.$element.removeClass("ui-selecting").addClass("ui-selected"),s.selecting=!1,s.selected=!0,s.startselected=!0,i._trigger("selected",t,{selected:s.element})}),this._trigger("stop",t),this.helper.remove(),!1}}),e.widget("ui.sortable",e.ui.mouse,{version:"1.11.4",widgetEventPrefix:"sort",ready:!1,options:{appendTo:"parent",axis:!1,connectWith:!1,containment:!1,cursor:"auto",cursorAt:!1,dropOnEmpty:!0,forcePlaceholderSize:!1,forceHelperSize:!1,grid:!1,handle:!1,helper:"original",items:"> *",opacity:!1,placeholder:!1,revert:!1,scroll:!0,scrollSensitivity:20,scrollSpeed:20,scope:"default",tolerance:"intersect",zIndex:1e3,activate:null,beforeStop:null,change:null,deactivate:null,out:null,over:null,receive:null,remove:null,sort:null,start:null,stop:null,update:null},_isOverAxis:function(e,t,i){return e>=t&&t+i>e},_isFloating:function(e){return/left|right/.test(e.css("float"))||/inline|table-cell/.test(e.css("display"))},_create:function(){this.containerCache={},this.element.addClass("ui-sortable"),this.refresh(),this.offset=this.element.offset(),this._mouseInit(),this._setHandleClassName(),this.ready=!0},_setOption:function(e,t){this._super(e,t),"handle"===e&&this._setHandleClassName()},_setHandleClassName:function(){this.element.find(".ui-sortable-handle").removeClass("ui-sortable-handle"),e.each(this.items,function(){(this.instance.options.handle?this.item.find(this.instance.options.handle):this.item).addClass("ui-sortable-handle")})},_destroy:function(){this.element.removeClass("ui-sortable ui-sortable-disabled").find(".ui-sortable-handle").removeClass("ui-sortable-handle"),this._mouseDestroy();for(var e=this.items.length-1;e>=0;e--)this.items[e].item.removeData(this.widgetName+"-item");return this},_mouseCapture:function(t,i){var s=null,n=!1,a=this;return this.reverting?!1:this.options.disabled||"static"===this.options.type?!1:(this._refreshItems(t),e(t.target).parents().each(function(){return e.data(this,a.widgetName+"-item")===a?(s=e(this),!1):void 0}),e.data(t.target,a.widgetName+"-item")===a&&(s=e(t.target)),s?!this.options.handle||i||(e(this.options.handle,s).find("*").addBack().each(function(){this===t.target&&(n=!0)}),n)?(this.currentItem=s,this._removeCurrentsFromItems(),!0):!1:!1)},_mouseStart:function(t,i,s){var n,a,o=this.options;if(this.currentContainer=this,this.refreshPositions(),this.helper=this._createHelper(t),this._cacheHelperProportions(),this._cacheMargins(),this.scrollParent=this.helper.scrollParent(),this.offset=this.currentItem.offset(),this.offset={top:this.offset.top-this.margins.top,left:this.offset.left-this.margins.left},e.extend(this.offset,{click:{left:t.pageX-this.offset.left,top:t.pageY-this.offset.top},parent:this._getParentOffset(),relative:this._getRelativeOffset()}),this.helper.css("position","absolute"),this.cssPosition=this.helper.css("position"),this.originalPosition=this._generatePosition(t),this.originalPageX=t.pageX,this.originalPageY=t.pageY,o.cursorAt&&this._adjustOffsetFromHelper(o.cursorAt),this.domPosition={prev:this.currentItem.prev()[0],parent:this.currentItem.parent()[0]},this.helper[0]!==this.currentItem[0]&&this.currentItem.hide(),this._createPlaceholder(),o.containment&&this._setContainment(),o.cursor&&"auto"!==o.cursor&&(a=this.document.find("body"),this.storedCursor=a.css("cursor"),a.css("cursor",o.cursor),this.storedStylesheet=e("<style>*{ cursor: "+o.cursor+" !important; }</style>").appendTo(a)),o.opacity&&(this.helper.css("opacity")&&(this._storedOpacity=this.helper.css("opacity")),this.helper.css("opacity",o.opacity)),o.zIndex&&(this.helper.css("zIndex")&&(this._storedZIndex=this.helper.css("zIndex")),this.helper.css("zIndex",o.zIndex)),this.scrollParent[0]!==this.document[0]&&"HTML"!==this.scrollParent[0].tagName&&(this.overflowOffset=this.scrollParent.offset()),this._trigger("start",t,this._uiHash()),this._preserveHelperProportions||this._cacheHelperProportions(),!s)for(n=this.containers.length-1;n>=0;n--)this.containers[n]._trigger("activate",t,this._uiHash(this));return e.ui.ddmanager&&(e.ui.ddmanager.current=this),e.ui.ddmanager&&!o.dropBehaviour&&e.ui.ddmanager.prepareOffsets(this,t),this.dragging=!0,this.helper.addClass("ui-sortable-helper"),this._mouseDrag(t),!0},_mouseDrag:function(t){var i,s,n,a,o=this.options,r=!1;for(this.position=this._generatePosition(t),this.positionAbs=this._convertPositionTo("absolute"),this.lastPositionAbs||(this.lastPositionAbs=this.positionAbs),this.options.scroll&&(this.scrollParent[0]!==this.document[0]&&"HTML"!==this.scrollParent[0].tagName?(this.overflowOffset.top+this.scrollParent[0].offsetHeight-t.pageY<o.scrollSensitivity?this.scrollParent[0].scrollTop=r=this.scrollParent[0].scrollTop+o.scrollSpeed:t.pageY-this.overflowOffset.top<o.scrollSensitivity&&(this.scrollParent[0].scrollTop=r=this.scrollParent[0].scrollTop-o.scrollSpeed),this.overflowOffset.left+this.scrollParent[0].offsetWidth-t.pageX<o.scrollSensitivity?this.scrollParent[0].scrollLeft=r=this.scrollParent[0].scrollLeft+o.scrollSpeed:t.pageX-this.overflowOffset.left<o.scrollSensitivity&&(this.scrollParent[0].scrollLeft=r=this.scrollParent[0].scrollLeft-o.scrollSpeed)):(t.pageY-this.document.scrollTop()<o.scrollSensitivity?r=this.document.scrollTop(this.document.scrollTop()-o.scrollSpeed):this.window.height()-(t.pageY-this.document.scrollTop())<o.scrollSensitivity&&(r=this.document.scrollTop(this.document.scrollTop()+o.scrollSpeed)),t.pageX-this.document.scrollLeft()<o.scrollSensitivity?r=this.document.scrollLeft(this.document.scrollLeft()-o.scrollSpeed):this.window.width()-(t.pageX-this.document.scrollLeft())<o.scrollSensitivity&&(r=this.document.scrollLeft(this.document.scrollLeft()+o.scrollSpeed))),r!==!1&&e.ui.ddmanager&&!o.dropBehaviour&&e.ui.ddmanager.prepareOffsets(this,t)),this.positionAbs=this._convertPositionTo("absolute"),this.options.axis&&"y"===this.options.axis||(this.helper[0].style.left=this.position.left+"px"),this.options.axis&&"x"===this.options.axis||(this.helper[0].style.top=this.position.top+"px"),i=this.items.length-1;i>=0;i--)if(s=this.items[i],n=s.item[0],a=this._intersectsWithPointer(s),a&&s.instance===this.currentContainer&&n!==this.currentItem[0]&&this.placeholder[1===a?"next":"prev"]()[0]!==n&&!e.contains(this.placeholder[0],n)&&("semi-dynamic"===this.options.type?!e.contains(this.element[0],n):!0)){if(this.direction=1===a?"down":"up","pointer"!==this.options.tolerance&&!this._intersectsWithSides(s))break;this._rearrange(t,s),this._trigger("change",t,this._uiHash());break}return this._contactContainers(t),e.ui.ddmanager&&e.ui.ddmanager.drag(this,t),this._trigger("sort",t,this._uiHash()),this.lastPositionAbs=this.positionAbs,!1},_mouseStop:function(t,i){if(t){if(e.ui.ddmanager&&!this.options.dropBehaviour&&e.ui.ddmanager.drop(this,t),this.options.revert){var s=this,n=this.placeholder.offset(),a=this.options.axis,o={};a&&"x"!==a||(o.left=n.left-this.offset.parent.left-this.margins.left+(this.offsetParent[0]===this.document[0].body?0:this.offsetParent[0].scrollLeft)),a&&"y"!==a||(o.top=n.top-this.offset.parent.top-this.margins.top+(this.offsetParent[0]===this.document[0].body?0:this.offsetParent[0].scrollTop)),this.reverting=!0,e(this.helper).animate(o,parseInt(this.options.revert,10)||500,function(){s._clear(t)})}else this._clear(t,i);return!1}},cancel:function(){if(this.dragging){this._mouseUp({target:null}),"original"===this.options.helper?this.currentItem.css(this._storedCSS).removeClass("ui-sortable-helper"):this.currentItem.show();for(var t=this.containers.length-1;t>=0;t--)this.containers[t]._trigger("deactivate",null,this._uiHash(this)),this.containers[t].containerCache.over&&(this.containers[t]._trigger("out",null,this._uiHash(this)),this.containers[t].containerCache.over=0)}return this.placeholder&&(this.placeholder[0].parentNode&&this.placeholder[0].parentNode.removeChild(this.placeholder[0]),"original"!==this.options.helper&&this.helper&&this.helper[0].parentNode&&this.helper.remove(),e.extend(this,{helper:null,dragging:!1,reverting:!1,_noFinalSort:null}),this.domPosition.prev?e(this.domPosition.prev).after(this.currentItem):e(this.domPosition.parent).prepend(this.currentItem)),this},serialize:function(t){var i=this._getItemsAsjQuery(t&&t.connected),s=[];return t=t||{},e(i).each(function(){var i=(e(t.item||this).attr(t.attribute||"id")||"").match(t.expression||/(.+)[\-=_](.+)/);i&&s.push((t.key||i[1]+"[]")+"="+(t.key&&t.expression?i[1]:i[2]))}),!s.length&&t.key&&s.push(t.key+"="),s.join("&")},toArray:function(t){var i=this._getItemsAsjQuery(t&&t.connected),s=[];return t=t||{},i.each(function(){s.push(e(t.item||this).attr(t.attribute||"id")||"")}),s},_intersectsWith:function(e){var t=this.positionAbs.left,i=t+this.helperProportions.width,s=this.positionAbs.top,n=s+this.helperProportions.height,a=e.left,o=a+e.width,r=e.top,h=r+e.height,l=this.offset.click.top,u=this.offset.click.left,d="x"===this.options.axis||s+l>r&&h>s+l,c="y"===this.options.axis||t+u>a&&o>t+u,p=d&&c;return"pointer"===this.options.tolerance||this.options.forcePointerForContainers||"pointer"!==this.options.tolerance&&this.helperProportions[this.floating?"width":"height"]>e[this.floating?"width":"height"]?p:t+this.helperProportions.width/2>a&&o>i-this.helperProportions.width/2&&s+this.helperProportions.height/2>r&&h>n-this.helperProportions.height/2},_intersectsWithPointer:function(e){var t="x"===this.options.axis||this._isOverAxis(this.positionAbs.top+this.offset.click.top,e.top,e.height),i="y"===this.options.axis||this._isOverAxis(this.positionAbs.left+this.offset.click.left,e.left,e.width),s=t&&i,n=this._getDragVerticalDirection(),a=this._getDragHorizontalDirection();return s?this.floating?a&&"right"===a||"down"===n?2:1:n&&("down"===n?2:1):!1},_intersectsWithSides:function(e){var t=this._isOverAxis(this.positionAbs.top+this.offset.click.top,e.top+e.height/2,e.height),i=this._isOverAxis(this.positionAbs.left+this.offset.click.left,e.left+e.width/2,e.width),s=this._getDragVerticalDirection(),n=this._getDragHorizontalDirection();return this.floating&&n?"right"===n&&i||"left"===n&&!i:s&&("down"===s&&t||"up"===s&&!t)},_getDragVerticalDirection:function(){var e=this.positionAbs.top-this.lastPositionAbs.top;return 0!==e&&(e>0?"down":"up")},_getDragHorizontalDirection:function(){var e=this.positionAbs.left-this.lastPositionAbs.left;return 0!==e&&(e>0?"right":"left")},refresh:function(e){return this._refreshItems(e),this._setHandleClassName(),this.refreshPositions(),this},_connectWith:function(){var e=this.options;return e.connectWith.constructor===String?[e.connectWith]:e.connectWith},_getItemsAsjQuery:function(t){function i(){r.push(this)}var s,n,a,o,r=[],h=[],l=this._connectWith();if(l&&t)for(s=l.length-1;s>=0;s--)for(a=e(l[s],this.document[0]),n=a.length-1;n>=0;n--)o=e.data(a[n],this.widgetFullName),o&&o!==this&&!o.options.disabled&&h.push([e.isFunction(o.options.items)?o.options.items.call(o.element):e(o.options.items,o.element).not(".ui-sortable-helper").not(".ui-sortable-placeholder"),o]);for(h.push([e.isFunction(this.options.items)?this.options.items.call(this.element,null,{options:this.options,item:this.currentItem}):e(this.options.items,this.element).not(".ui-sortable-helper").not(".ui-sortable-placeholder"),this]),s=h.length-1;s>=0;s--)h[s][0].each(i);return e(r)},_removeCurrentsFromItems:function(){var t=this.currentItem.find(":data("+this.widgetName+"-item)");this.items=e.grep(this.items,function(e){for(var i=0;t.length>i;i++)if(t[i]===e.item[0])return!1;return!0})},_refreshItems:function(t){this.items=[],this.containers=[this];var i,s,n,a,o,r,h,l,u=this.items,d=[[e.isFunction(this.options.items)?this.options.items.call(this.element[0],t,{item:this.currentItem}):e(this.options.items,this.element),this]],c=this._connectWith();if(c&&this.ready)for(i=c.length-1;i>=0;i--)for(n=e(c[i],this.document[0]),s=n.length-1;s>=0;s--)a=e.data(n[s],this.widgetFullName),a&&a!==this&&!a.options.disabled&&(d.push([e.isFunction(a.options.items)?a.options.items.call(a.element[0],t,{item:this.currentItem}):e(a.options.items,a.element),a]),this.containers.push(a));for(i=d.length-1;i>=0;i--)for(o=d[i][1],r=d[i][0],s=0,l=r.length;l>s;s++)h=e(r[s]),h.data(this.widgetName+"-item",o),u.push({item:h,instance:o,width:0,height:0,left:0,top:0})},refreshPositions:function(t){this.floating=this.items.length?"x"===this.options.axis||this._isFloating(this.items[0].item):!1,this.offsetParent&&this.helper&&(this.offset.parent=this._getParentOffset());var i,s,n,a;for(i=this.items.length-1;i>=0;i--)s=this.items[i],s.instance!==this.currentContainer&&this.currentContainer&&s.item[0]!==this.currentItem[0]||(n=this.options.toleranceElement?e(this.options.toleranceElement,s.item):s.item,t||(s.width=n.outerWidth(),s.height=n.outerHeight()),a=n.offset(),s.left=a.left,s.top=a.top);if(this.options.custom&&this.options.custom.refreshContainers)this.options.custom.refreshContainers.call(this);else for(i=this.containers.length-1;i>=0;i--)a=this.containers[i].element.offset(),this.containers[i].containerCache.left=a.left,this.containers[i].containerCache.top=a.top,this.containers[i].containerCache.width=this.containers[i].element.outerWidth(),this.containers[i].containerCache.height=this.containers[i].element.outerHeight();return this},_createPlaceholder:function(t){t=t||this;var i,s=t.options;s.placeholder&&s.placeholder.constructor!==String||(i=s.placeholder,s.placeholder={element:function(){var s=t.currentItem[0].nodeName.toLowerCase(),n=e("<"+s+">",t.document[0]).addClass(i||t.currentItem[0].className+" ui-sortable-placeholder").removeClass("ui-sortable-helper");return"tbody"===s?t._createTrPlaceholder(t.currentItem.find("tr").eq(0),e("<tr>",t.document[0]).appendTo(n)):"tr"===s?t._createTrPlaceholder(t.currentItem,n):"img"===s&&n.attr("src",t.currentItem.attr("src")),i||n.css("visibility","hidden"),n},update:function(e,n){(!i||s.forcePlaceholderSize)&&(n.height()||n.height(t.currentItem.innerHeight()-parseInt(t.currentItem.css("paddingTop")||0,10)-parseInt(t.currentItem.css("paddingBottom")||0,10)),n.width()||n.width(t.currentItem.innerWidth()-parseInt(t.currentItem.css("paddingLeft")||0,10)-parseInt(t.currentItem.css("paddingRight")||0,10)))}}),t.placeholder=e(s.placeholder.element.call(t.element,t.currentItem)),t.currentItem.after(t.placeholder),s.placeholder.update(t,t.placeholder)},_createTrPlaceholder:function(t,i){var s=this;t.children().each(function(){e("<td>&#160;</td>",s.document[0]).attr("colspan",e(this).attr("colspan")||1).appendTo(i)})},_contactContainers:function(t){var i,s,n,a,o,r,h,l,u,d,c=null,p=null;for(i=this.containers.length-1;i>=0;i--)if(!e.contains(this.currentItem[0],this.containers[i].element[0]))if(this._intersectsWith(this.containers[i].containerCache)){if(c&&e.contains(this.containers[i].element[0],c.element[0]))continue;c=this.containers[i],p=i}else this.containers[i].containerCache.over&&(this.containers[i]._trigger("out",t,this._uiHash(this)),this.containers[i].containerCache.over=0);if(c)if(1===this.containers.length)this.containers[p].containerCache.over||(this.containers[p]._trigger("over",t,this._uiHash(this)),this.containers[p].containerCache.over=1);else{for(n=1e4,a=null,u=c.floating||this._isFloating(this.currentItem),o=u?"left":"top",r=u?"width":"height",d=u?"clientX":"clientY",s=this.items.length-1;s>=0;s--)e.contains(this.containers[p].element[0],this.items[s].item[0])&&this.items[s].item[0]!==this.currentItem[0]&&(h=this.items[s].item.offset()[o],l=!1,t[d]-h>this.items[s][r]/2&&(l=!0),n>Math.abs(t[d]-h)&&(n=Math.abs(t[d]-h),a=this.items[s],this.direction=l?"up":"down"));if(!a&&!this.options.dropOnEmpty)return;if(this.currentContainer===this.containers[p])return this.currentContainer.containerCache.over||(this.containers[p]._trigger("over",t,this._uiHash()),this.currentContainer.containerCache.over=1),void 0;a?this._rearrange(t,a,null,!0):this._rearrange(t,null,this.containers[p].element,!0),this._trigger("change",t,this._uiHash()),this.containers[p]._trigger("change",t,this._uiHash(this)),this.currentContainer=this.containers[p],this.options.placeholder.update(this.currentContainer,this.placeholder),this.containers[p]._trigger("over",t,this._uiHash(this)),this.containers[p].containerCache.over=1}},_createHelper:function(t){var i=this.options,s=e.isFunction(i.helper)?e(i.helper.apply(this.element[0],[t,this.currentItem])):"clone"===i.helper?this.currentItem.clone():this.currentItem;return s.parents("body").length||e("parent"!==i.appendTo?i.appendTo:this.currentItem[0].parentNode)[0].appendChild(s[0]),s[0]===this.currentItem[0]&&(this._storedCSS={width:this.currentItem[0].style.width,height:this.currentItem[0].style.height,position:this.currentItem.css("position"),top:this.currentItem.css("top"),left:this.currentItem.css("left")}),(!s[0].style.width||i.forceHelperSize)&&s.width(this.currentItem.width()),(!s[0].style.height||i.forceHelperSize)&&s.height(this.currentItem.height()),s},_adjustOffsetFromHelper:function(t){"string"==typeof t&&(t=t.split(" ")),e.isArray(t)&&(t={left:+t[0],top:+t[1]||0}),"left"in t&&(this.offset.click.left=t.left+this.margins.left),"right"in t&&(this.offset.click.left=this.helperProportions.width-t.right+this.margins.left),"top"in t&&(this.offset.click.top=t.top+this.margins.top),"bottom"in t&&(this.offset.click.top=this.helperProportions.height-t.bottom+this.margins.top)},_getParentOffset:function(){this.offsetParent=this.helper.offsetParent();var t=this.offsetParent.offset();return"absolute"===this.cssPosition&&this.scrollParent[0]!==this.document[0]&&e.contains(this.scrollParent[0],this.offsetParent[0])&&(t.left+=this.scrollParent.scrollLeft(),t.top+=this.scrollParent.scrollTop()),(this.offsetParent[0]===this.document[0].body||this.offsetParent[0].tagName&&"html"===this.offsetParent[0].tagName.toLowerCase()&&e.ui.ie)&&(t={top:0,left:0}),{top:t.top+(parseInt(this.offsetParent.css("borderTopWidth"),10)||0),left:t.left+(parseInt(this.offsetParent.css("borderLeftWidth"),10)||0)}},_getRelativeOffset:function(){if("relative"===this.cssPosition){var e=this.currentItem.position();return{top:e.top-(parseInt(this.helper.css("top"),10)||0)+this.scrollParent.scrollTop(),left:e.left-(parseInt(this.helper.css("left"),10)||0)+this.scrollParent.scrollLeft()}}return{top:0,left:0}},_cacheMargins:function(){this.margins={left:parseInt(this.currentItem.css("marginLeft"),10)||0,top:parseInt(this.currentItem.css("marginTop"),10)||0}},_cacheHelperProportions:function(){this.helperProportions={width:this.helper.outerWidth(),height:this.helper.outerHeight()}},_setContainment:function(){var t,i,s,n=this.options;"parent"===n.containment&&(n.containment=this.helper[0].parentNode),("document"===n.containment||"window"===n.containment)&&(this.containment=[0-this.offset.relative.left-this.offset.parent.left,0-this.offset.relative.top-this.offset.parent.top,"document"===n.containment?this.document.width():this.window.width()-this.helperProportions.width-this.margins.left,("document"===n.containment?this.document.width():this.window.height()||this.document[0].body.parentNode.scrollHeight)-this.helperProportions.height-this.margins.top]),/^(document|window|parent)$/.test(n.containment)||(t=e(n.containment)[0],i=e(n.containment).offset(),s="hidden"!==e(t).css("overflow"),this.containment=[i.left+(parseInt(e(t).css("borderLeftWidth"),10)||0)+(parseInt(e(t).css("paddingLeft"),10)||0)-this.margins.left,i.top+(parseInt(e(t).css("borderTopWidth"),10)||0)+(parseInt(e(t).css("paddingTop"),10)||0)-this.margins.top,i.left+(s?Math.max(t.scrollWidth,t.offsetWidth):t.offsetWidth)-(parseInt(e(t).css("borderLeftWidth"),10)||0)-(parseInt(e(t).css("paddingRight"),10)||0)-this.helperProportions.width-this.margins.left,i.top+(s?Math.max(t.scrollHeight,t.offsetHeight):t.offsetHeight)-(parseInt(e(t).css("borderTopWidth"),10)||0)-(parseInt(e(t).css("paddingBottom"),10)||0)-this.helperProportions.height-this.margins.top])},_convertPositionTo:function(t,i){i||(i=this.position);var s="absolute"===t?1:-1,n="absolute"!==this.cssPosition||this.scrollParent[0]!==this.document[0]&&e.contains(this.scrollParent[0],this.offsetParent[0])?this.scrollParent:this.offsetParent,a=/(html|body)/i.test(n[0].tagName);return{top:i.top+this.offset.relative.top*s+this.offset.parent.top*s-("fixed"===this.cssPosition?-this.scrollParent.scrollTop():a?0:n.scrollTop())*s,left:i.left+this.offset.relative.left*s+this.offset.parent.left*s-("fixed"===this.cssPosition?-this.scrollParent.scrollLeft():a?0:n.scrollLeft())*s}},_generatePosition:function(t){var i,s,n=this.options,a=t.pageX,o=t.pageY,r="absolute"!==this.cssPosition||this.scrollParent[0]!==this.document[0]&&e.contains(this.scrollParent[0],this.offsetParent[0])?this.scrollParent:this.offsetParent,h=/(html|body)/i.test(r[0].tagName);return"relative"!==this.cssPosition||this.scrollParent[0]!==this.document[0]&&this.scrollParent[0]!==this.offsetParent[0]||(this.offset.relative=this._getRelativeOffset()),this.originalPosition&&(this.containment&&(t.pageX-this.offset.click.left<this.containment[0]&&(a=this.containment[0]+this.offset.click.left),t.pageY-this.offset.click.top<this.containment[1]&&(o=this.containment[1]+this.offset.click.top),t.pageX-this.offset.click.left>this.containment[2]&&(a=this.containment[2]+this.offset.click.left),t.pageY-this.offset.click.top>this.containment[3]&&(o=this.containment[3]+this.offset.click.top)),n.grid&&(i=this.originalPageY+Math.round((o-this.originalPageY)/n.grid[1])*n.grid[1],o=this.containment?i-this.offset.click.top>=this.containment[1]&&i-this.offset.click.top<=this.containment[3]?i:i-this.offset.click.top>=this.containment[1]?i-n.grid[1]:i+n.grid[1]:i,s=this.originalPageX+Math.round((a-this.originalPageX)/n.grid[0])*n.grid[0],a=this.containment?s-this.offset.click.left>=this.containment[0]&&s-this.offset.click.left<=this.containment[2]?s:s-this.offset.click.left>=this.containment[0]?s-n.grid[0]:s+n.grid[0]:s)),{top:o-this.offset.click.top-this.offset.relative.top-this.offset.parent.top+("fixed"===this.cssPosition?-this.scrollParent.scrollTop():h?0:r.scrollTop()),left:a-this.offset.click.left-this.offset.relative.left-this.offset.parent.left+("fixed"===this.cssPosition?-this.scrollParent.scrollLeft():h?0:r.scrollLeft())}},_rearrange:function(e,t,i,s){i?i[0].appendChild(this.placeholder[0]):t.item[0].parentNode.insertBefore(this.placeholder[0],"down"===this.direction?t.item[0]:t.item[0].nextSibling),this.counter=this.counter?++this.counter:1;var n=this.counter;this._delay(function(){n===this.counter&&this.refreshPositions(!s)})},_clear:function(e,t){function i(e,t,i){return function(s){i._trigger(e,s,t._uiHash(t))}}this.reverting=!1;var s,n=[];if(!this._noFinalSort&&this.currentItem.parent().length&&this.placeholder.before(this.currentItem),this._noFinalSort=null,this.helper[0]===this.currentItem[0]){for(s in this._storedCSS)("auto"===this._storedCSS[s]||"static"===this._storedCSS[s])&&(this._storedCSS[s]="");this.currentItem.css(this._storedCSS).removeClass("ui-sortable-helper")}else this.currentItem.show();for(this.fromOutside&&!t&&n.push(function(e){this._trigger("receive",e,this._uiHash(this.fromOutside))}),!this.fromOutside&&this.domPosition.prev===this.currentItem.prev().not(".ui-sortable-helper")[0]&&this.domPosition.parent===this.currentItem.parent()[0]||t||n.push(function(e){this._trigger("update",e,this._uiHash())}),this!==this.currentContainer&&(t||(n.push(function(e){this._trigger("remove",e,this._uiHash())}),n.push(function(e){return function(t){e._trigger("receive",t,this._uiHash(this))}}.call(this,this.currentContainer)),n.push(function(e){return function(t){e._trigger("update",t,this._uiHash(this))}}.call(this,this.currentContainer)))),s=this.containers.length-1;s>=0;s--)t||n.push(i("deactivate",this,this.containers[s])),this.containers[s].containerCache.over&&(n.push(i("out",this,this.containers[s])),this.containers[s].containerCache.over=0);if(this.storedCursor&&(this.document.find("body").css("cursor",this.storedCursor),this.storedStylesheet.remove()),this._storedOpacity&&this.helper.css("opacity",this._storedOpacity),this._storedZIndex&&this.helper.css("zIndex","auto"===this._storedZIndex?"":this._storedZIndex),this.dragging=!1,t||this._trigger("beforeStop",e,this._uiHash()),this.placeholder[0].parentNode.removeChild(this.placeholder[0]),this.cancelHelperRemoval||(this.helper[0]!==this.currentItem[0]&&this.helper.remove(),this.helper=null),!t){for(s=0;n.length>s;s++)n[s].call(this,e);this._trigger("stop",e,this._uiHash())}return this.fromOutside=!1,!this.cancelHelperRemoval},_trigger:function(){e.Widget.prototype._trigger.apply(this,arguments)===!1&&this.cancel()},_uiHash:function(t){var i=t||this;return{helper:i.helper,placeholder:i.placeholder||e([]),position:i.position,originalPosition:i.originalPosition,offset:i.positionAbs,item:i.currentItem,sender:t?t.element:null}}}),e.widget("ui.accordion",{version:"1.11.4",options:{active:0,animate:{},collapsible:!1,event:"click",header:"> li > :first-child,> :not(li):even",heightStyle:"auto",icons:{activeHeader:"ui-icon-triangle-1-s",header:"ui-icon-triangle-1-e"},activate:null,beforeActivate:null},hideProps:{borderTopWidth:"hide",borderBottomWidth:"hide",paddingTop:"hide",paddingBottom:"hide",height:"hide"},showProps:{borderTopWidth:"show",borderBottomWidth:"show",paddingTop:"show",paddingBottom:"show",height:"show"},_create:function(){var t=this.options;this.prevShow=this.prevHide=e(),this.element.addClass("ui-accordion ui-widget ui-helper-reset").attr("role","tablist"),t.collapsible||t.active!==!1&&null!=t.active||(t.active=0),this._processPanels(),0>t.active&&(t.active+=this.headers.length),this._refresh()},_getCreateEventData:function(){return{header:this.active,panel:this.active.length?this.active.next():e()}},_createIcons:function(){var t=this.options.icons;t&&(e("<span>").addClass("ui-accordion-header-icon ui-icon "+t.header).prependTo(this.headers),this.active.children(".ui-accordion-header-icon").removeClass(t.header).addClass(t.activeHeader),this.headers.addClass("ui-accordion-icons"))},_destroyIcons:function(){this.headers.removeClass("ui-accordion-icons").children(".ui-accordion-header-icon").remove()},_destroy:function(){var e;this.element.removeClass("ui-accordion ui-widget ui-helper-reset").removeAttr("role"),this.headers.removeClass("ui-accordion-header ui-accordion-header-active ui-state-default ui-corner-all ui-state-active ui-state-disabled ui-corner-top").removeAttr("role").removeAttr("aria-expanded").removeAttr("aria-selected").removeAttr("aria-controls").removeAttr("tabIndex").removeUniqueId(),this._destroyIcons(),e=this.headers.next().removeClass("ui-helper-reset ui-widget-content ui-corner-bottom ui-accordion-content ui-accordion-content-active ui-state-disabled").css("display","").removeAttr("role").removeAttr("aria-hidden").removeAttr("aria-labelledby").removeUniqueId(),"content"!==this.options.heightStyle&&e.css("height","")},_setOption:function(e,t){return"active"===e?(this._activate(t),void 0):("event"===e&&(this.options.event&&this._off(this.headers,this.options.event),this._setupEvents(t)),this._super(e,t),"collapsible"!==e||t||this.options.active!==!1||this._activate(0),"icons"===e&&(this._destroyIcons(),t&&this._createIcons()),"disabled"===e&&(this.element.toggleClass("ui-state-disabled",!!t).attr("aria-disabled",t),this.headers.add(this.headers.next()).toggleClass("ui-state-disabled",!!t)),void 0)},_keydown:function(t){if(!t.altKey&&!t.ctrlKey){var i=e.ui.keyCode,s=this.headers.length,n=this.headers.index(t.target),a=!1;switch(t.keyCode){case i.RIGHT:case i.DOWN:a=this.headers[(n+1)%s];break;case i.LEFT:case i.UP:a=this.headers[(n-1+s)%s];break;case i.SPACE:case i.ENTER:this._eventHandler(t);break;case i.HOME:a=this.headers[0];break;case i.END:a=this.headers[s-1]}a&&(e(t.target).attr("tabIndex",-1),e(a).attr("tabIndex",0),a.focus(),t.preventDefault())}},_panelKeyDown:function(t){t.keyCode===e.ui.keyCode.UP&&t.ctrlKey&&e(t.currentTarget).prev().focus()},refresh:function(){var t=this.options;this._processPanels(),t.active===!1&&t.collapsible===!0||!this.headers.length?(t.active=!1,this.active=e()):t.active===!1?this._activate(0):this.active.length&&!e.contains(this.element[0],this.active[0])?this.headers.length===this.headers.find(".ui-state-disabled").length?(t.active=!1,this.active=e()):this._activate(Math.max(0,t.active-1)):t.active=this.headers.index(this.active),this._destroyIcons(),this._refresh()},_processPanels:function(){var e=this.headers,t=this.panels;this.headers=this.element.find(this.options.header).addClass("ui-accordion-header ui-state-default ui-corner-all"),this.panels=this.headers.next().addClass("ui-accordion-content ui-helper-reset ui-widget-content ui-corner-bottom").filter(":not(.ui-accordion-content-active)").hide(),t&&(this._off(e.not(this.headers)),this._off(t.not(this.panels)))
},_refresh:function(){var t,i=this.options,s=i.heightStyle,n=this.element.parent();this.active=this._findActive(i.active).addClass("ui-accordion-header-active ui-state-active ui-corner-top").removeClass("ui-corner-all"),this.active.next().addClass("ui-accordion-content-active").show(),this.headers.attr("role","tab").each(function(){var t=e(this),i=t.uniqueId().attr("id"),s=t.next(),n=s.uniqueId().attr("id");t.attr("aria-controls",n),s.attr("aria-labelledby",i)}).next().attr("role","tabpanel"),this.headers.not(this.active).attr({"aria-selected":"false","aria-expanded":"false",tabIndex:-1}).next().attr({"aria-hidden":"true"}).hide(),this.active.length?this.active.attr({"aria-selected":"true","aria-expanded":"true",tabIndex:0}).next().attr({"aria-hidden":"false"}):this.headers.eq(0).attr("tabIndex",0),this._createIcons(),this._setupEvents(i.event),"fill"===s?(t=n.height(),this.element.siblings(":visible").each(function(){var i=e(this),s=i.css("position");"absolute"!==s&&"fixed"!==s&&(t-=i.outerHeight(!0))}),this.headers.each(function(){t-=e(this).outerHeight(!0)}),this.headers.next().each(function(){e(this).height(Math.max(0,t-e(this).innerHeight()+e(this).height()))}).css("overflow","auto")):"auto"===s&&(t=0,this.headers.next().each(function(){t=Math.max(t,e(this).css("height","").height())}).height(t))},_activate:function(t){var i=this._findActive(t)[0];i!==this.active[0]&&(i=i||this.active[0],this._eventHandler({target:i,currentTarget:i,preventDefault:e.noop}))},_findActive:function(t){return"number"==typeof t?this.headers.eq(t):e()},_setupEvents:function(t){var i={keydown:"_keydown"};t&&e.each(t.split(" "),function(e,t){i[t]="_eventHandler"}),this._off(this.headers.add(this.headers.next())),this._on(this.headers,i),this._on(this.headers.next(),{keydown:"_panelKeyDown"}),this._hoverable(this.headers),this._focusable(this.headers)},_eventHandler:function(t){var i=this.options,s=this.active,n=e(t.currentTarget),a=n[0]===s[0],o=a&&i.collapsible,r=o?e():n.next(),h=s.next(),l={oldHeader:s,oldPanel:h,newHeader:o?e():n,newPanel:r};t.preventDefault(),a&&!i.collapsible||this._trigger("beforeActivate",t,l)===!1||(i.active=o?!1:this.headers.index(n),this.active=a?e():n,this._toggle(l),s.removeClass("ui-accordion-header-active ui-state-active"),i.icons&&s.children(".ui-accordion-header-icon").removeClass(i.icons.activeHeader).addClass(i.icons.header),a||(n.removeClass("ui-corner-all").addClass("ui-accordion-header-active ui-state-active ui-corner-top"),i.icons&&n.children(".ui-accordion-header-icon").removeClass(i.icons.header).addClass(i.icons.activeHeader),n.next().addClass("ui-accordion-content-active")))},_toggle:function(t){var i=t.newPanel,s=this.prevShow.length?this.prevShow:t.oldPanel;this.prevShow.add(this.prevHide).stop(!0,!0),this.prevShow=i,this.prevHide=s,this.options.animate?this._animate(i,s,t):(s.hide(),i.show(),this._toggleComplete(t)),s.attr({"aria-hidden":"true"}),s.prev().attr({"aria-selected":"false","aria-expanded":"false"}),i.length&&s.length?s.prev().attr({tabIndex:-1,"aria-expanded":"false"}):i.length&&this.headers.filter(function(){return 0===parseInt(e(this).attr("tabIndex"),10)}).attr("tabIndex",-1),i.attr("aria-hidden","false").prev().attr({"aria-selected":"true","aria-expanded":"true",tabIndex:0})},_animate:function(e,t,i){var s,n,a,o=this,r=0,h=e.css("box-sizing"),l=e.length&&(!t.length||e.index()<t.index()),u=this.options.animate||{},d=l&&u.down||u,c=function(){o._toggleComplete(i)};return"number"==typeof d&&(a=d),"string"==typeof d&&(n=d),n=n||d.easing||u.easing,a=a||d.duration||u.duration,t.length?e.length?(s=e.show().outerHeight(),t.animate(this.hideProps,{duration:a,easing:n,step:function(e,t){t.now=Math.round(e)}}),e.hide().animate(this.showProps,{duration:a,easing:n,complete:c,step:function(e,i){i.now=Math.round(e),"height"!==i.prop?"content-box"===h&&(r+=i.now):"content"!==o.options.heightStyle&&(i.now=Math.round(s-t.outerHeight()-r),r=0)}}),void 0):t.animate(this.hideProps,a,n,c):e.animate(this.showProps,a,n,c)},_toggleComplete:function(e){var t=e.oldPanel;t.removeClass("ui-accordion-content-active").prev().removeClass("ui-corner-top").addClass("ui-corner-all"),t.length&&(t.parent()[0].className=t.parent()[0].className),this._trigger("activate",null,e)}}),e.widget("ui.menu",{version:"1.11.4",defaultElement:"<ul>",delay:300,options:{icons:{submenu:"ui-icon-carat-1-e"},items:"> *",menus:"ul",position:{my:"left-1 top",at:"right top"},role:"menu",blur:null,focus:null,select:null},_create:function(){this.activeMenu=this.element,this.mouseHandled=!1,this.element.uniqueId().addClass("ui-menu ui-widget ui-widget-content").toggleClass("ui-menu-icons",!!this.element.find(".ui-icon").length).attr({role:this.options.role,tabIndex:0}),this.options.disabled&&this.element.addClass("ui-state-disabled").attr("aria-disabled","true"),this._on({"mousedown .ui-menu-item":function(e){e.preventDefault()},"click .ui-menu-item":function(t){var i=e(t.target);!this.mouseHandled&&i.not(".ui-state-disabled").length&&(this.select(t),t.isPropagationStopped()||(this.mouseHandled=!0),i.has(".ui-menu").length?this.expand(t):!this.element.is(":focus")&&e(this.document[0].activeElement).closest(".ui-menu").length&&(this.element.trigger("focus",[!0]),this.active&&1===this.active.parents(".ui-menu").length&&clearTimeout(this.timer)))},"mouseenter .ui-menu-item":function(t){if(!this.previousFilter){var i=e(t.currentTarget);i.siblings(".ui-state-active").removeClass("ui-state-active"),this.focus(t,i)}},mouseleave:"collapseAll","mouseleave .ui-menu":"collapseAll",focus:function(e,t){var i=this.active||this.element.find(this.options.items).eq(0);t||this.focus(e,i)},blur:function(t){this._delay(function(){e.contains(this.element[0],this.document[0].activeElement)||this.collapseAll(t)})},keydown:"_keydown"}),this.refresh(),this._on(this.document,{click:function(e){this._closeOnDocumentClick(e)&&this.collapseAll(e),this.mouseHandled=!1}})},_destroy:function(){this.element.removeAttr("aria-activedescendant").find(".ui-menu").addBack().removeClass("ui-menu ui-widget ui-widget-content ui-menu-icons ui-front").removeAttr("role").removeAttr("tabIndex").removeAttr("aria-labelledby").removeAttr("aria-expanded").removeAttr("aria-hidden").removeAttr("aria-disabled").removeUniqueId().show(),this.element.find(".ui-menu-item").removeClass("ui-menu-item").removeAttr("role").removeAttr("aria-disabled").removeUniqueId().removeClass("ui-state-hover").removeAttr("tabIndex").removeAttr("role").removeAttr("aria-haspopup").children().each(function(){var t=e(this);t.data("ui-menu-submenu-carat")&&t.remove()}),this.element.find(".ui-menu-divider").removeClass("ui-menu-divider ui-widget-content")},_keydown:function(t){var i,s,n,a,o=!0;switch(t.keyCode){case e.ui.keyCode.PAGE_UP:this.previousPage(t);break;case e.ui.keyCode.PAGE_DOWN:this.nextPage(t);break;case e.ui.keyCode.HOME:this._move("first","first",t);break;case e.ui.keyCode.END:this._move("last","last",t);break;case e.ui.keyCode.UP:this.previous(t);break;case e.ui.keyCode.DOWN:this.next(t);break;case e.ui.keyCode.LEFT:this.collapse(t);break;case e.ui.keyCode.RIGHT:this.active&&!this.active.is(".ui-state-disabled")&&this.expand(t);break;case e.ui.keyCode.ENTER:case e.ui.keyCode.SPACE:this._activate(t);break;case e.ui.keyCode.ESCAPE:this.collapse(t);break;default:o=!1,s=this.previousFilter||"",n=String.fromCharCode(t.keyCode),a=!1,clearTimeout(this.filterTimer),n===s?a=!0:n=s+n,i=this._filterMenuItems(n),i=a&&-1!==i.index(this.active.next())?this.active.nextAll(".ui-menu-item"):i,i.length||(n=String.fromCharCode(t.keyCode),i=this._filterMenuItems(n)),i.length?(this.focus(t,i),this.previousFilter=n,this.filterTimer=this._delay(function(){delete this.previousFilter},1e3)):delete this.previousFilter}o&&t.preventDefault()},_activate:function(e){this.active.is(".ui-state-disabled")||(this.active.is("[aria-haspopup='true']")?this.expand(e):this.select(e))},refresh:function(){var t,i,s=this,n=this.options.icons.submenu,a=this.element.find(this.options.menus);this.element.toggleClass("ui-menu-icons",!!this.element.find(".ui-icon").length),a.filter(":not(.ui-menu)").addClass("ui-menu ui-widget ui-widget-content ui-front").hide().attr({role:this.options.role,"aria-hidden":"true","aria-expanded":"false"}).each(function(){var t=e(this),i=t.parent(),s=e("<span>").addClass("ui-menu-icon ui-icon "+n).data("ui-menu-submenu-carat",!0);i.attr("aria-haspopup","true").prepend(s),t.attr("aria-labelledby",i.attr("id"))}),t=a.add(this.element),i=t.find(this.options.items),i.not(".ui-menu-item").each(function(){var t=e(this);s._isDivider(t)&&t.addClass("ui-widget-content ui-menu-divider")}),i.not(".ui-menu-item, .ui-menu-divider").addClass("ui-menu-item").uniqueId().attr({tabIndex:-1,role:this._itemRole()}),i.filter(".ui-state-disabled").attr("aria-disabled","true"),this.active&&!e.contains(this.element[0],this.active[0])&&this.blur()},_itemRole:function(){return{menu:"menuitem",listbox:"option"}[this.options.role]},_setOption:function(e,t){"icons"===e&&this.element.find(".ui-menu-icon").removeClass(this.options.icons.submenu).addClass(t.submenu),"disabled"===e&&this.element.toggleClass("ui-state-disabled",!!t).attr("aria-disabled",t),this._super(e,t)},focus:function(e,t){var i,s;this.blur(e,e&&"focus"===e.type),this._scrollIntoView(t),this.active=t.first(),s=this.active.addClass("ui-state-focus").removeClass("ui-state-active"),this.options.role&&this.element.attr("aria-activedescendant",s.attr("id")),this.active.parent().closest(".ui-menu-item").addClass("ui-state-active"),e&&"keydown"===e.type?this._close():this.timer=this._delay(function(){this._close()},this.delay),i=t.children(".ui-menu"),i.length&&e&&/^mouse/.test(e.type)&&this._startOpening(i),this.activeMenu=t.parent(),this._trigger("focus",e,{item:t})},_scrollIntoView:function(t){var i,s,n,a,o,r;this._hasScroll()&&(i=parseFloat(e.css(this.activeMenu[0],"borderTopWidth"))||0,s=parseFloat(e.css(this.activeMenu[0],"paddingTop"))||0,n=t.offset().top-this.activeMenu.offset().top-i-s,a=this.activeMenu.scrollTop(),o=this.activeMenu.height(),r=t.outerHeight(),0>n?this.activeMenu.scrollTop(a+n):n+r>o&&this.activeMenu.scrollTop(a+n-o+r))},blur:function(e,t){t||clearTimeout(this.timer),this.active&&(this.active.removeClass("ui-state-focus"),this.active=null,this._trigger("blur",e,{item:this.active}))},_startOpening:function(e){clearTimeout(this.timer),"true"===e.attr("aria-hidden")&&(this.timer=this._delay(function(){this._close(),this._open(e)},this.delay))},_open:function(t){var i=e.extend({of:this.active},this.options.position);clearTimeout(this.timer),this.element.find(".ui-menu").not(t.parents(".ui-menu")).hide().attr("aria-hidden","true"),t.show().removeAttr("aria-hidden").attr("aria-expanded","true").position(i)},collapseAll:function(t,i){clearTimeout(this.timer),this.timer=this._delay(function(){var s=i?this.element:e(t&&t.target).closest(this.element.find(".ui-menu"));s.length||(s=this.element),this._close(s),this.blur(t),this.activeMenu=s},this.delay)},_close:function(e){e||(e=this.active?this.active.parent():this.element),e.find(".ui-menu").hide().attr("aria-hidden","true").attr("aria-expanded","false").end().find(".ui-state-active").not(".ui-state-focus").removeClass("ui-state-active")},_closeOnDocumentClick:function(t){return!e(t.target).closest(".ui-menu").length},_isDivider:function(e){return!/[^\-\u2014\u2013\s]/.test(e.text())},collapse:function(e){var t=this.active&&this.active.parent().closest(".ui-menu-item",this.element);t&&t.length&&(this._close(),this.focus(e,t))},expand:function(e){var t=this.active&&this.active.children(".ui-menu ").find(this.options.items).first();t&&t.length&&(this._open(t.parent()),this._delay(function(){this.focus(e,t)}))},next:function(e){this._move("next","first",e)},previous:function(e){this._move("prev","last",e)},isFirstItem:function(){return this.active&&!this.active.prevAll(".ui-menu-item").length},isLastItem:function(){return this.active&&!this.active.nextAll(".ui-menu-item").length},_move:function(e,t,i){var s;this.active&&(s="first"===e||"last"===e?this.active["first"===e?"prevAll":"nextAll"](".ui-menu-item").eq(-1):this.active[e+"All"](".ui-menu-item").eq(0)),s&&s.length&&this.active||(s=this.activeMenu.find(this.options.items)[t]()),this.focus(i,s)},nextPage:function(t){var i,s,n;return this.active?(this.isLastItem()||(this._hasScroll()?(s=this.active.offset().top,n=this.element.height(),this.active.nextAll(".ui-menu-item").each(function(){return i=e(this),0>i.offset().top-s-n}),this.focus(t,i)):this.focus(t,this.activeMenu.find(this.options.items)[this.active?"last":"first"]())),void 0):(this.next(t),void 0)},previousPage:function(t){var i,s,n;return this.active?(this.isFirstItem()||(this._hasScroll()?(s=this.active.offset().top,n=this.element.height(),this.active.prevAll(".ui-menu-item").each(function(){return i=e(this),i.offset().top-s+n>0}),this.focus(t,i)):this.focus(t,this.activeMenu.find(this.options.items).first())),void 0):(this.next(t),void 0)},_hasScroll:function(){return this.element.outerHeight()<this.element.prop("scrollHeight")},select:function(t){this.active=this.active||e(t.target).closest(".ui-menu-item");var i={item:this.active};this.active.has(".ui-menu").length||this.collapseAll(t,!0),this._trigger("select",t,i)},_filterMenuItems:function(t){var i=t.replace(/[\-\[\]{}()*+?.,\\\^$|#\s]/g,"\\$&"),s=RegExp("^"+i,"i");return this.activeMenu.find(this.options.items).filter(".ui-menu-item").filter(function(){return s.test(e.trim(e(this).text()))})}}),e.widget("ui.autocomplete",{version:"1.11.4",defaultElement:"<input>",options:{appendTo:null,autoFocus:!1,delay:300,minLength:1,position:{my:"left top",at:"left bottom",collision:"none"},source:null,change:null,close:null,focus:null,open:null,response:null,search:null,select:null},requestIndex:0,pending:0,_create:function(){var t,i,s,n=this.element[0].nodeName.toLowerCase(),a="textarea"===n,o="input"===n;this.isMultiLine=a?!0:o?!1:this.element.prop("isContentEditable"),this.valueMethod=this.element[a||o?"val":"text"],this.isNewMenu=!0,this.element.addClass("ui-autocomplete-input").attr("autocomplete","off"),this._on(this.element,{keydown:function(n){if(this.element.prop("readOnly"))return t=!0,s=!0,i=!0,void 0;t=!1,s=!1,i=!1;var a=e.ui.keyCode;switch(n.keyCode){case a.PAGE_UP:t=!0,this._move("previousPage",n);break;case a.PAGE_DOWN:t=!0,this._move("nextPage",n);break;case a.UP:t=!0,this._keyEvent("previous",n);break;case a.DOWN:t=!0,this._keyEvent("next",n);break;case a.ENTER:this.menu.active&&(t=!0,n.preventDefault(),this.menu.select(n));break;case a.TAB:this.menu.active&&this.menu.select(n);break;case a.ESCAPE:this.menu.element.is(":visible")&&(this.isMultiLine||this._value(this.term),this.close(n),n.preventDefault());break;default:i=!0,this._searchTimeout(n)}},keypress:function(s){if(t)return t=!1,(!this.isMultiLine||this.menu.element.is(":visible"))&&s.preventDefault(),void 0;if(!i){var n=e.ui.keyCode;switch(s.keyCode){case n.PAGE_UP:this._move("previousPage",s);break;case n.PAGE_DOWN:this._move("nextPage",s);break;case n.UP:this._keyEvent("previous",s);break;case n.DOWN:this._keyEvent("next",s)}}},input:function(e){return s?(s=!1,e.preventDefault(),void 0):(this._searchTimeout(e),void 0)},focus:function(){this.selectedItem=null,this.previous=this._value()},blur:function(e){return this.cancelBlur?(delete this.cancelBlur,void 0):(clearTimeout(this.searching),this.close(e),this._change(e),void 0)}}),this._initSource(),this.menu=e("<ul>").addClass("ui-autocomplete ui-front").appendTo(this._appendTo()).menu({role:null}).hide().menu("instance"),this._on(this.menu.element,{mousedown:function(t){t.preventDefault(),this.cancelBlur=!0,this._delay(function(){delete this.cancelBlur});var i=this.menu.element[0];e(t.target).closest(".ui-menu-item").length||this._delay(function(){var t=this;this.document.one("mousedown",function(s){s.target===t.element[0]||s.target===i||e.contains(i,s.target)||t.close()})})},menufocus:function(t,i){var s,n;return this.isNewMenu&&(this.isNewMenu=!1,t.originalEvent&&/^mouse/.test(t.originalEvent.type))?(this.menu.blur(),this.document.one("mousemove",function(){e(t.target).trigger(t.originalEvent)}),void 0):(n=i.item.data("ui-autocomplete-item"),!1!==this._trigger("focus",t,{item:n})&&t.originalEvent&&/^key/.test(t.originalEvent.type)&&this._value(n.value),s=i.item.attr("aria-label")||n.value,s&&e.trim(s).length&&(this.liveRegion.children().hide(),e("<div>").text(s).appendTo(this.liveRegion)),void 0)},menuselect:function(e,t){var i=t.item.data("ui-autocomplete-item"),s=this.previous;this.element[0]!==this.document[0].activeElement&&(this.element.focus(),this.previous=s,this._delay(function(){this.previous=s,this.selectedItem=i})),!1!==this._trigger("select",e,{item:i})&&this._value(i.value),this.term=this._value(),this.close(e),this.selectedItem=i}}),this.liveRegion=e("<span>",{role:"status","aria-live":"assertive","aria-relevant":"additions"}).addClass("ui-helper-hidden-accessible").appendTo(this.document[0].body),this._on(this.window,{beforeunload:function(){this.element.removeAttr("autocomplete")}})},_destroy:function(){clearTimeout(this.searching),this.element.removeClass("ui-autocomplete-input").removeAttr("autocomplete"),this.menu.element.remove(),this.liveRegion.remove()},_setOption:function(e,t){this._super(e,t),"source"===e&&this._initSource(),"appendTo"===e&&this.menu.element.appendTo(this._appendTo()),"disabled"===e&&t&&this.xhr&&this.xhr.abort()},_appendTo:function(){var t=this.options.appendTo;return t&&(t=t.jquery||t.nodeType?e(t):this.document.find(t).eq(0)),t&&t[0]||(t=this.element.closest(".ui-front")),t.length||(t=this.document[0].body),t},_initSource:function(){var t,i,s=this;e.isArray(this.options.source)?(t=this.options.source,this.source=function(i,s){s(e.ui.autocomplete.filter(t,i.term))}):"string"==typeof this.options.source?(i=this.options.source,this.source=function(t,n){s.xhr&&s.xhr.abort(),s.xhr=e.ajax({url:i,data:t,dataType:"json",success:function(e){n(e)},error:function(){n([])}})}):this.source=this.options.source},_searchTimeout:function(e){clearTimeout(this.searching),this.searching=this._delay(function(){var t=this.term===this._value(),i=this.menu.element.is(":visible"),s=e.altKey||e.ctrlKey||e.metaKey||e.shiftKey;(!t||t&&!i&&!s)&&(this.selectedItem=null,this.search(null,e))},this.options.delay)},search:function(e,t){return e=null!=e?e:this._value(),this.term=this._value(),e.length<this.options.minLength?this.close(t):this._trigger("search",t)!==!1?this._search(e):void 0},_search:function(e){this.pending++,this.element.addClass("ui-autocomplete-loading"),this.cancelSearch=!1,this.source({term:e},this._response())},_response:function(){var t=++this.requestIndex;return e.proxy(function(e){t===this.requestIndex&&this.__response(e),this.pending--,this.pending||this.element.removeClass("ui-autocomplete-loading")},this)},__response:function(e){e&&(e=this._normalize(e)),this._trigger("response",null,{content:e}),!this.options.disabled&&e&&e.length&&!this.cancelSearch?(this._suggest(e),this._trigger("open")):this._close()},close:function(e){this.cancelSearch=!0,this._close(e)},_close:function(e){this.menu.element.is(":visible")&&(this.menu.element.hide(),this.menu.blur(),this.isNewMenu=!0,this._trigger("close",e))},_change:function(e){this.previous!==this._value()&&this._trigger("change",e,{item:this.selectedItem})},_normalize:function(t){return t.length&&t[0].label&&t[0].value?t:e.map(t,function(t){return"string"==typeof t?{label:t,value:t}:e.extend({},t,{label:t.label||t.value,value:t.value||t.label})})},_suggest:function(t){var i=this.menu.element.empty();this._renderMenu(i,t),this.isNewMenu=!0,this.menu.refresh(),i.show(),this._resizeMenu(),i.position(e.extend({of:this.element},this.options.position)),this.options.autoFocus&&this.menu.next()},_resizeMenu:function(){var e=this.menu.element;e.outerWidth(Math.max(e.width("").outerWidth()+1,this.element.outerWidth()))},_renderMenu:function(t,i){var s=this;e.each(i,function(e,i){s._renderItemData(t,i)})},_renderItemData:function(e,t){return this._renderItem(e,t).data("ui-autocomplete-item",t)},_renderItem:function(t,i){return e("<li>").text(i.label).appendTo(t)},_move:function(e,t){return this.menu.element.is(":visible")?this.menu.isFirstItem()&&/^previous/.test(e)||this.menu.isLastItem()&&/^next/.test(e)?(this.isMultiLine||this._value(this.term),this.menu.blur(),void 0):(this.menu[e](t),void 0):(this.search(null,t),void 0)},widget:function(){return this.menu.element},_value:function(){return this.valueMethod.apply(this.element,arguments)},_keyEvent:function(e,t){(!this.isMultiLine||this.menu.element.is(":visible"))&&(this._move(e,t),t.preventDefault())}}),e.extend(e.ui.autocomplete,{escapeRegex:function(e){return e.replace(/[\-\[\]{}()*+?.,\\\^$|#\s]/g,"\\$&")},filter:function(t,i){var s=RegExp(e.ui.autocomplete.escapeRegex(i),"i");return e.grep(t,function(e){return s.test(e.label||e.value||e)})}}),e.widget("ui.autocomplete",e.ui.autocomplete,{options:{messages:{noResults:"No search results.",results:function(e){return e+(e>1?" results are":" result is")+" available, use up and down arrow keys to navigate."}}},__response:function(t){var i;this._superApply(arguments),this.options.disabled||this.cancelSearch||(i=t&&t.length?this.options.messages.results(t.length):this.options.messages.noResults,this.liveRegion.children().hide(),e("<div>").text(i).appendTo(this.liveRegion))}}),e.ui.autocomplete;var c,p="ui-button ui-widget ui-state-default ui-corner-all",f="ui-button-icons-only ui-button-icon-only ui-button-text-icons ui-button-text-icon-primary ui-button-text-icon-secondary ui-button-text-only",m=function(){var t=e(this);setTimeout(function(){t.find(":ui-button").button("refresh")},1)},g=function(t){var i=t.name,s=t.form,n=e([]);return i&&(i=i.replace(/'/g,"\\'"),n=s?e(s).find("[name='"+i+"'][type=radio]"):e("[name='"+i+"'][type=radio]",t.ownerDocument).filter(function(){return!this.form})),n};e.widget("ui.button",{version:"1.11.4",defaultElement:"<button>",options:{disabled:null,text:!0,label:null,icons:{primary:null,secondary:null}},_create:function(){this.element.closest("form").unbind("reset"+this.eventNamespace).bind("reset"+this.eventNamespace,m),"boolean"!=typeof this.options.disabled?this.options.disabled=!!this.element.prop("disabled"):this.element.prop("disabled",this.options.disabled),this._determineButtonType(),this.hasTitle=!!this.buttonElement.attr("title");var t=this,i=this.options,s="checkbox"===this.type||"radio"===this.type,n=s?"":"ui-state-active";null===i.label&&(i.label="input"===this.type?this.buttonElement.val():this.buttonElement.html()),this._hoverable(this.buttonElement),this.buttonElement.addClass(p).attr("role","button").bind("mouseenter"+this.eventNamespace,function(){i.disabled||this===c&&e(this).addClass("ui-state-active")}).bind("mouseleave"+this.eventNamespace,function(){i.disabled||e(this).removeClass(n)}).bind("click"+this.eventNamespace,function(e){i.disabled&&(e.preventDefault(),e.stopImmediatePropagation())}),this._on({focus:function(){this.buttonElement.addClass("ui-state-focus")},blur:function(){this.buttonElement.removeClass("ui-state-focus")}}),s&&this.element.bind("change"+this.eventNamespace,function(){t.refresh()}),"checkbox"===this.type?this.buttonElement.bind("click"+this.eventNamespace,function(){return i.disabled?!1:void 0}):"radio"===this.type?this.buttonElement.bind("click"+this.eventNamespace,function(){if(i.disabled)return!1;e(this).addClass("ui-state-active"),t.buttonElement.attr("aria-pressed","true");var s=t.element[0];g(s).not(s).map(function(){return e(this).button("widget")[0]}).removeClass("ui-state-active").attr("aria-pressed","false")}):(this.buttonElement.bind("mousedown"+this.eventNamespace,function(){return i.disabled?!1:(e(this).addClass("ui-state-active"),c=this,t.document.one("mouseup",function(){c=null}),void 0)}).bind("mouseup"+this.eventNamespace,function(){return i.disabled?!1:(e(this).removeClass("ui-state-active"),void 0)}).bind("keydown"+this.eventNamespace,function(t){return i.disabled?!1:((t.keyCode===e.ui.keyCode.SPACE||t.keyCode===e.ui.keyCode.ENTER)&&e(this).addClass("ui-state-active"),void 0)}).bind("keyup"+this.eventNamespace+" blur"+this.eventNamespace,function(){e(this).removeClass("ui-state-active")}),this.buttonElement.is("a")&&this.buttonElement.keyup(function(t){t.keyCode===e.ui.keyCode.SPACE&&e(this).click()})),this._setOption("disabled",i.disabled),this._resetButton()},_determineButtonType:function(){var e,t,i;this.type=this.element.is("[type=checkbox]")?"checkbox":this.element.is("[type=radio]")?"radio":this.element.is("input")?"input":"button","checkbox"===this.type||"radio"===this.type?(e=this.element.parents().last(),t="label[for='"+this.element.attr("id")+"']",this.buttonElement=e.find(t),this.buttonElement.length||(e=e.length?e.siblings():this.element.siblings(),this.buttonElement=e.filter(t),this.buttonElement.length||(this.buttonElement=e.find(t))),this.element.addClass("ui-helper-hidden-accessible"),i=this.element.is(":checked"),i&&this.buttonElement.addClass("ui-state-active"),this.buttonElement.prop("aria-pressed",i)):this.buttonElement=this.element},widget:function(){return this.buttonElement},_destroy:function(){this.element.removeClass("ui-helper-hidden-accessible"),this.buttonElement.removeClass(p+" ui-state-active "+f).removeAttr("role").removeAttr("aria-pressed").html(this.buttonElement.find(".ui-button-text").html()),this.hasTitle||this.buttonElement.removeAttr("title")},_setOption:function(e,t){return this._super(e,t),"disabled"===e?(this.widget().toggleClass("ui-state-disabled",!!t),this.element.prop("disabled",!!t),t&&("checkbox"===this.type||"radio"===this.type?this.buttonElement.removeClass("ui-state-focus"):this.buttonElement.removeClass("ui-state-focus ui-state-active")),void 0):(this._resetButton(),void 0)},refresh:function(){var t=this.element.is("input, button")?this.element.is(":disabled"):this.element.hasClass("ui-button-disabled");t!==this.options.disabled&&this._setOption("disabled",t),"radio"===this.type?g(this.element[0]).each(function(){e(this).is(":checked")?e(this).button("widget").addClass("ui-state-active").attr("aria-pressed","true"):e(this).button("widget").removeClass("ui-state-active").attr("aria-pressed","false")}):"checkbox"===this.type&&(this.element.is(":checked")?this.buttonElement.addClass("ui-state-active").attr("aria-pressed","true"):this.buttonElement.removeClass("ui-state-active").attr("aria-pressed","false"))},_resetButton:function(){if("input"===this.type)return this.options.label&&this.element.val(this.options.label),void 0;var t=this.buttonElement.removeClass(f),i=e("<span></span>",this.document[0]).addClass("ui-button-text").html(this.options.label).appendTo(t.empty()).text(),s=this.options.icons,n=s.primary&&s.secondary,a=[];s.primary||s.secondary?(this.options.text&&a.push("ui-button-text-icon"+(n?"s":s.primary?"-primary":"-secondary")),s.primary&&t.prepend("<span class='ui-button-icon-primary ui-icon "+s.primary+"'></span>"),s.secondary&&t.append("<span class='ui-button-icon-secondary ui-icon "+s.secondary+"'></span>"),this.options.text||(a.push(n?"ui-button-icons-only":"ui-button-icon-only"),this.hasTitle||t.attr("title",e.trim(i)))):a.push("ui-button-text-only"),t.addClass(a.join(" "))}}),e.widget("ui.buttonset",{version:"1.11.4",options:{items:"button, input[type=button], input[type=submit], input[type=reset], input[type=checkbox], input[type=radio], a, :data(ui-button)"},_create:function(){this.element.addClass("ui-buttonset")},_init:function(){this.refresh()},_setOption:function(e,t){"disabled"===e&&this.buttons.button("option",e,t),this._super(e,t)},refresh:function(){var t="rtl"===this.element.css("direction"),i=this.element.find(this.options.items),s=i.filter(":ui-button");i.not(":ui-button").button(),s.button("refresh"),this.buttons=i.map(function(){return e(this).button("widget")[0]}).removeClass("ui-corner-all ui-corner-left ui-corner-right").filter(":first").addClass(t?"ui-corner-right":"ui-corner-left").end().filter(":last").addClass(t?"ui-corner-left":"ui-corner-right").end().end()},_destroy:function(){this.element.removeClass("ui-buttonset"),this.buttons.map(function(){return e(this).button("widget")[0]}).removeClass("ui-corner-left ui-corner-right").end().button("destroy")}}),e.ui.button,e.extend(e.ui,{datepicker:{version:"1.11.4"}});var v;e.extend(n.prototype,{markerClassName:"hasDatepicker",maxRows:4,_widgetDatepicker:function(){return this.dpDiv},setDefaults:function(e){return r(this._defaults,e||{}),this},_attachDatepicker:function(t,i){var s,n,a;s=t.nodeName.toLowerCase(),n="div"===s||"span"===s,t.id||(this.uuid+=1,t.id="dp"+this.uuid),a=this._newInst(e(t),n),a.settings=e.extend({},i||{}),"input"===s?this._connectDatepicker(t,a):n&&this._inlineDatepicker(t,a)},_newInst:function(t,i){var s=t[0].id.replace(/([^A-Za-z0-9_\-])/g,"\\\\$1");return{id:s,input:t,selectedDay:0,selectedMonth:0,selectedYear:0,drawMonth:0,drawYear:0,inline:i,dpDiv:i?a(e("<div class='"+this._inlineClass+" ui-datepicker ui-widget ui-widget-content ui-helper-clearfix ui-corner-all'></div>")):this.dpDiv}},_connectDatepicker:function(t,i){var s=e(t);i.append=e([]),i.trigger=e([]),s.hasClass(this.markerClassName)||(this._attachments(s,i),s.addClass(this.markerClassName).keydown(this._doKeyDown).keypress(this._doKeyPress).keyup(this._doKeyUp),this._autoSize(i),e.data(t,"datepicker",i),i.settings.disabled&&this._disableDatepicker(t))},_attachments:function(t,i){var s,n,a,o=this._get(i,"appendText"),r=this._get(i,"isRTL");i.append&&i.append.remove(),o&&(i.append=e("<span class='"+this._appendClass+"'>"+o+"</span>"),t[r?"before":"after"](i.append)),t.unbind("focus",this._showDatepicker),i.trigger&&i.trigger.remove(),s=this._get(i,"showOn"),("focus"===s||"both"===s)&&t.focus(this._showDatepicker),("button"===s||"both"===s)&&(n=this._get(i,"buttonText"),a=this._get(i,"buttonImage"),i.trigger=e(this._get(i,"buttonImageOnly")?e("<img/>").addClass(this._triggerClass).attr({src:a,alt:n,title:n}):e("<button type='button'></button>").addClass(this._triggerClass).html(a?e("<img/>").attr({src:a,alt:n,title:n}):n)),t[r?"before":"after"](i.trigger),i.trigger.click(function(){return e.datepicker._datepickerShowing&&e.datepicker._lastInput===t[0]?e.datepicker._hideDatepicker():e.datepicker._datepickerShowing&&e.datepicker._lastInput!==t[0]?(e.datepicker._hideDatepicker(),e.datepicker._showDatepicker(t[0])):e.datepicker._showDatepicker(t[0]),!1}))},_autoSize:function(e){if(this._get(e,"autoSize")&&!e.inline){var t,i,s,n,a=new Date(2009,11,20),o=this._get(e,"dateFormat");o.match(/[DM]/)&&(t=function(e){for(i=0,s=0,n=0;e.length>n;n++)e[n].length>i&&(i=e[n].length,s=n);return s},a.setMonth(t(this._get(e,o.match(/MM/)?"monthNames":"monthNamesShort"))),a.setDate(t(this._get(e,o.match(/DD/)?"dayNames":"dayNamesShort"))+20-a.getDay())),e.input.attr("size",this._formatDate(e,a).length)}},_inlineDatepicker:function(t,i){var s=e(t);s.hasClass(this.markerClassName)||(s.addClass(this.markerClassName).append(i.dpDiv),e.data(t,"datepicker",i),this._setDate(i,this._getDefaultDate(i),!0),this._updateDatepicker(i),this._updateAlternate(i),i.settings.disabled&&this._disableDatepicker(t),i.dpDiv.css("display","block"))},_dialogDatepicker:function(t,i,s,n,a){var o,h,l,u,d,c=this._dialogInst;return c||(this.uuid+=1,o="dp"+this.uuid,this._dialogInput=e("<input type='text' id='"+o+"' style='position: absolute; top: -100px; width: 0px;'/>"),this._dialogInput.keydown(this._doKeyDown),e("body").append(this._dialogInput),c=this._dialogInst=this._newInst(this._dialogInput,!1),c.settings={},e.data(this._dialogInput[0],"datepicker",c)),r(c.settings,n||{}),i=i&&i.constructor===Date?this._formatDate(c,i):i,this._dialogInput.val(i),this._pos=a?a.length?a:[a.pageX,a.pageY]:null,this._pos||(h=document.documentElement.clientWidth,l=document.documentElement.clientHeight,u=document.documentElement.scrollLeft||document.body.scrollLeft,d=document.documentElement.scrollTop||document.body.scrollTop,this._pos=[h/2-100+u,l/2-150+d]),this._dialogInput.css("left",this._pos[0]+20+"px").css("top",this._pos[1]+"px"),c.settings.onSelect=s,this._inDialog=!0,this.dpDiv.addClass(this._dialogClass),this._showDatepicker(this._dialogInput[0]),e.blockUI&&e.blockUI(this.dpDiv),e.data(this._dialogInput[0],"datepicker",c),this
},_destroyDatepicker:function(t){var i,s=e(t),n=e.data(t,"datepicker");s.hasClass(this.markerClassName)&&(i=t.nodeName.toLowerCase(),e.removeData(t,"datepicker"),"input"===i?(n.append.remove(),n.trigger.remove(),s.removeClass(this.markerClassName).unbind("focus",this._showDatepicker).unbind("keydown",this._doKeyDown).unbind("keypress",this._doKeyPress).unbind("keyup",this._doKeyUp)):("div"===i||"span"===i)&&s.removeClass(this.markerClassName).empty(),v===n&&(v=null))},_enableDatepicker:function(t){var i,s,n=e(t),a=e.data(t,"datepicker");n.hasClass(this.markerClassName)&&(i=t.nodeName.toLowerCase(),"input"===i?(t.disabled=!1,a.trigger.filter("button").each(function(){this.disabled=!1}).end().filter("img").css({opacity:"1.0",cursor:""})):("div"===i||"span"===i)&&(s=n.children("."+this._inlineClass),s.children().removeClass("ui-state-disabled"),s.find("select.ui-datepicker-month, select.ui-datepicker-year").prop("disabled",!1)),this._disabledInputs=e.map(this._disabledInputs,function(e){return e===t?null:e}))},_disableDatepicker:function(t){var i,s,n=e(t),a=e.data(t,"datepicker");n.hasClass(this.markerClassName)&&(i=t.nodeName.toLowerCase(),"input"===i?(t.disabled=!0,a.trigger.filter("button").each(function(){this.disabled=!0}).end().filter("img").css({opacity:"0.5",cursor:"default"})):("div"===i||"span"===i)&&(s=n.children("."+this._inlineClass),s.children().addClass("ui-state-disabled"),s.find("select.ui-datepicker-month, select.ui-datepicker-year").prop("disabled",!0)),this._disabledInputs=e.map(this._disabledInputs,function(e){return e===t?null:e}),this._disabledInputs[this._disabledInputs.length]=t)},_isDisabledDatepicker:function(e){if(!e)return!1;for(var t=0;this._disabledInputs.length>t;t++)if(this._disabledInputs[t]===e)return!0;return!1},_getInst:function(t){try{return e.data(t,"datepicker")}catch(i){throw"Missing instance data for this datepicker"}},_optionDatepicker:function(t,i,s){var n,a,o,h,l=this._getInst(t);return 2===arguments.length&&"string"==typeof i?"defaults"===i?e.extend({},e.datepicker._defaults):l?"all"===i?e.extend({},l.settings):this._get(l,i):null:(n=i||{},"string"==typeof i&&(n={},n[i]=s),l&&(this._curInst===l&&this._hideDatepicker(),a=this._getDateDatepicker(t,!0),o=this._getMinMaxDate(l,"min"),h=this._getMinMaxDate(l,"max"),r(l.settings,n),null!==o&&void 0!==n.dateFormat&&void 0===n.minDate&&(l.settings.minDate=this._formatDate(l,o)),null!==h&&void 0!==n.dateFormat&&void 0===n.maxDate&&(l.settings.maxDate=this._formatDate(l,h)),"disabled"in n&&(n.disabled?this._disableDatepicker(t):this._enableDatepicker(t)),this._attachments(e(t),l),this._autoSize(l),this._setDate(l,a),this._updateAlternate(l),this._updateDatepicker(l)),void 0)},_changeDatepicker:function(e,t,i){this._optionDatepicker(e,t,i)},_refreshDatepicker:function(e){var t=this._getInst(e);t&&this._updateDatepicker(t)},_setDateDatepicker:function(e,t){var i=this._getInst(e);i&&(this._setDate(i,t),this._updateDatepicker(i),this._updateAlternate(i))},_getDateDatepicker:function(e,t){var i=this._getInst(e);return i&&!i.inline&&this._setDateFromField(i,t),i?this._getDate(i):null},_doKeyDown:function(t){var i,s,n,a=e.datepicker._getInst(t.target),o=!0,r=a.dpDiv.is(".ui-datepicker-rtl");if(a._keyEvent=!0,e.datepicker._datepickerShowing)switch(t.keyCode){case 9:e.datepicker._hideDatepicker(),o=!1;break;case 13:return n=e("td."+e.datepicker._dayOverClass+":not(."+e.datepicker._currentClass+")",a.dpDiv),n[0]&&e.datepicker._selectDay(t.target,a.selectedMonth,a.selectedYear,n[0]),i=e.datepicker._get(a,"onSelect"),i?(s=e.datepicker._formatDate(a),i.apply(a.input?a.input[0]:null,[s,a])):e.datepicker._hideDatepicker(),!1;case 27:e.datepicker._hideDatepicker();break;case 33:e.datepicker._adjustDate(t.target,t.ctrlKey?-e.datepicker._get(a,"stepBigMonths"):-e.datepicker._get(a,"stepMonths"),"M");break;case 34:e.datepicker._adjustDate(t.target,t.ctrlKey?+e.datepicker._get(a,"stepBigMonths"):+e.datepicker._get(a,"stepMonths"),"M");break;case 35:(t.ctrlKey||t.metaKey)&&e.datepicker._clearDate(t.target),o=t.ctrlKey||t.metaKey;break;case 36:(t.ctrlKey||t.metaKey)&&e.datepicker._gotoToday(t.target),o=t.ctrlKey||t.metaKey;break;case 37:(t.ctrlKey||t.metaKey)&&e.datepicker._adjustDate(t.target,r?1:-1,"D"),o=t.ctrlKey||t.metaKey,t.originalEvent.altKey&&e.datepicker._adjustDate(t.target,t.ctrlKey?-e.datepicker._get(a,"stepBigMonths"):-e.datepicker._get(a,"stepMonths"),"M");break;case 38:(t.ctrlKey||t.metaKey)&&e.datepicker._adjustDate(t.target,-7,"D"),o=t.ctrlKey||t.metaKey;break;case 39:(t.ctrlKey||t.metaKey)&&e.datepicker._adjustDate(t.target,r?-1:1,"D"),o=t.ctrlKey||t.metaKey,t.originalEvent.altKey&&e.datepicker._adjustDate(t.target,t.ctrlKey?+e.datepicker._get(a,"stepBigMonths"):+e.datepicker._get(a,"stepMonths"),"M");break;case 40:(t.ctrlKey||t.metaKey)&&e.datepicker._adjustDate(t.target,7,"D"),o=t.ctrlKey||t.metaKey;break;default:o=!1}else 36===t.keyCode&&t.ctrlKey?e.datepicker._showDatepicker(this):o=!1;o&&(t.preventDefault(),t.stopPropagation())},_doKeyPress:function(t){var i,s,n=e.datepicker._getInst(t.target);return e.datepicker._get(n,"constrainInput")?(i=e.datepicker._possibleChars(e.datepicker._get(n,"dateFormat")),s=String.fromCharCode(null==t.charCode?t.keyCode:t.charCode),t.ctrlKey||t.metaKey||" ">s||!i||i.indexOf(s)>-1):void 0},_doKeyUp:function(t){var i,s=e.datepicker._getInst(t.target);if(s.input.val()!==s.lastVal)try{i=e.datepicker.parseDate(e.datepicker._get(s,"dateFormat"),s.input?s.input.val():null,e.datepicker._getFormatConfig(s)),i&&(e.datepicker._setDateFromField(s),e.datepicker._updateAlternate(s),e.datepicker._updateDatepicker(s))}catch(n){}return!0},_showDatepicker:function(t){if(t=t.target||t,"input"!==t.nodeName.toLowerCase()&&(t=e("input",t.parentNode)[0]),!e.datepicker._isDisabledDatepicker(t)&&e.datepicker._lastInput!==t){var i,n,a,o,h,l,u;i=e.datepicker._getInst(t),e.datepicker._curInst&&e.datepicker._curInst!==i&&(e.datepicker._curInst.dpDiv.stop(!0,!0),i&&e.datepicker._datepickerShowing&&e.datepicker._hideDatepicker(e.datepicker._curInst.input[0])),n=e.datepicker._get(i,"beforeShow"),a=n?n.apply(t,[t,i]):{},a!==!1&&(r(i.settings,a),i.lastVal=null,e.datepicker._lastInput=t,e.datepicker._setDateFromField(i),e.datepicker._inDialog&&(t.value=""),e.datepicker._pos||(e.datepicker._pos=e.datepicker._findPos(t),e.datepicker._pos[1]+=t.offsetHeight),o=!1,e(t).parents().each(function(){return o|="fixed"===e(this).css("position"),!o}),h={left:e.datepicker._pos[0],top:e.datepicker._pos[1]},e.datepicker._pos=null,i.dpDiv.empty(),i.dpDiv.css({position:"absolute",display:"block",top:"-1000px"}),e.datepicker._updateDatepicker(i),h=e.datepicker._checkOffset(i,h,o),i.dpDiv.css({position:e.datepicker._inDialog&&e.blockUI?"static":o?"fixed":"absolute",display:"none",left:h.left+"px",top:h.top+"px"}),i.inline||(l=e.datepicker._get(i,"showAnim"),u=e.datepicker._get(i,"duration"),i.dpDiv.css("z-index",s(e(t))+1),e.datepicker._datepickerShowing=!0,e.effects&&e.effects.effect[l]?i.dpDiv.show(l,e.datepicker._get(i,"showOptions"),u):i.dpDiv[l||"show"](l?u:null),e.datepicker._shouldFocusInput(i)&&i.input.focus(),e.datepicker._curInst=i))}},_updateDatepicker:function(t){this.maxRows=4,v=t,t.dpDiv.empty().append(this._generateHTML(t)),this._attachHandlers(t);var i,s=this._getNumberOfMonths(t),n=s[1],a=17,r=t.dpDiv.find("."+this._dayOverClass+" a");r.length>0&&o.apply(r.get(0)),t.dpDiv.removeClass("ui-datepicker-multi-2 ui-datepicker-multi-3 ui-datepicker-multi-4").width(""),n>1&&t.dpDiv.addClass("ui-datepicker-multi-"+n).css("width",a*n+"em"),t.dpDiv[(1!==s[0]||1!==s[1]?"add":"remove")+"Class"]("ui-datepicker-multi"),t.dpDiv[(this._get(t,"isRTL")?"add":"remove")+"Class"]("ui-datepicker-rtl"),t===e.datepicker._curInst&&e.datepicker._datepickerShowing&&e.datepicker._shouldFocusInput(t)&&t.input.focus(),t.yearshtml&&(i=t.yearshtml,setTimeout(function(){i===t.yearshtml&&t.yearshtml&&t.dpDiv.find("select.ui-datepicker-year:first").replaceWith(t.yearshtml),i=t.yearshtml=null},0))},_shouldFocusInput:function(e){return e.input&&e.input.is(":visible")&&!e.input.is(":disabled")&&!e.input.is(":focus")},_checkOffset:function(t,i,s){var n=t.dpDiv.outerWidth(),a=t.dpDiv.outerHeight(),o=t.input?t.input.outerWidth():0,r=t.input?t.input.outerHeight():0,h=document.documentElement.clientWidth+(s?0:e(document).scrollLeft()),l=document.documentElement.clientHeight+(s?0:e(document).scrollTop());return i.left-=this._get(t,"isRTL")?n-o:0,i.left-=s&&i.left===t.input.offset().left?e(document).scrollLeft():0,i.top-=s&&i.top===t.input.offset().top+r?e(document).scrollTop():0,i.left-=Math.min(i.left,i.left+n>h&&h>n?Math.abs(i.left+n-h):0),i.top-=Math.min(i.top,i.top+a>l&&l>a?Math.abs(a+r):0),i},_findPos:function(t){for(var i,s=this._getInst(t),n=this._get(s,"isRTL");t&&("hidden"===t.type||1!==t.nodeType||e.expr.filters.hidden(t));)t=t[n?"previousSibling":"nextSibling"];return i=e(t).offset(),[i.left,i.top]},_hideDatepicker:function(t){var i,s,n,a,o=this._curInst;!o||t&&o!==e.data(t,"datepicker")||this._datepickerShowing&&(i=this._get(o,"showAnim"),s=this._get(o,"duration"),n=function(){e.datepicker._tidyDialog(o)},e.effects&&(e.effects.effect[i]||e.effects[i])?o.dpDiv.hide(i,e.datepicker._get(o,"showOptions"),s,n):o.dpDiv["slideDown"===i?"slideUp":"fadeIn"===i?"fadeOut":"hide"](i?s:null,n),i||n(),this._datepickerShowing=!1,a=this._get(o,"onClose"),a&&a.apply(o.input?o.input[0]:null,[o.input?o.input.val():"",o]),this._lastInput=null,this._inDialog&&(this._dialogInput.css({position:"absolute",left:"0",top:"-100px"}),e.blockUI&&(e.unblockUI(),e("body").append(this.dpDiv))),this._inDialog=!1)},_tidyDialog:function(e){e.dpDiv.removeClass(this._dialogClass).unbind(".ui-datepicker-calendar")},_checkExternalClick:function(t){if(e.datepicker._curInst){var i=e(t.target),s=e.datepicker._getInst(i[0]);(i[0].id!==e.datepicker._mainDivId&&0===i.parents("#"+e.datepicker._mainDivId).length&&!i.hasClass(e.datepicker.markerClassName)&&!i.closest("."+e.datepicker._triggerClass).length&&e.datepicker._datepickerShowing&&(!e.datepicker._inDialog||!e.blockUI)||i.hasClass(e.datepicker.markerClassName)&&e.datepicker._curInst!==s)&&e.datepicker._hideDatepicker()}},_adjustDate:function(t,i,s){var n=e(t),a=this._getInst(n[0]);this._isDisabledDatepicker(n[0])||(this._adjustInstDate(a,i+("M"===s?this._get(a,"showCurrentAtPos"):0),s),this._updateDatepicker(a))},_gotoToday:function(t){var i,s=e(t),n=this._getInst(s[0]);this._get(n,"gotoCurrent")&&n.currentDay?(n.selectedDay=n.currentDay,n.drawMonth=n.selectedMonth=n.currentMonth,n.drawYear=n.selectedYear=n.currentYear):(i=new Date,n.selectedDay=i.getDate(),n.drawMonth=n.selectedMonth=i.getMonth(),n.drawYear=n.selectedYear=i.getFullYear()),this._notifyChange(n),this._adjustDate(s)},_selectMonthYear:function(t,i,s){var n=e(t),a=this._getInst(n[0]);a["selected"+("M"===s?"Month":"Year")]=a["draw"+("M"===s?"Month":"Year")]=parseInt(i.options[i.selectedIndex].value,10),this._notifyChange(a),this._adjustDate(n)},_selectDay:function(t,i,s,n){var a,o=e(t);e(n).hasClass(this._unselectableClass)||this._isDisabledDatepicker(o[0])||(a=this._getInst(o[0]),a.selectedDay=a.currentDay=e("a",n).html(),a.selectedMonth=a.currentMonth=i,a.selectedYear=a.currentYear=s,this._selectDate(t,this._formatDate(a,a.currentDay,a.currentMonth,a.currentYear)))},_clearDate:function(t){var i=e(t);this._selectDate(i,"")},_selectDate:function(t,i){var s,n=e(t),a=this._getInst(n[0]);i=null!=i?i:this._formatDate(a),a.input&&a.input.val(i),this._updateAlternate(a),s=this._get(a,"onSelect"),s?s.apply(a.input?a.input[0]:null,[i,a]):a.input&&a.input.trigger("change"),a.inline?this._updateDatepicker(a):(this._hideDatepicker(),this._lastInput=a.input[0],"object"!=typeof a.input[0]&&a.input.focus(),this._lastInput=null)},_updateAlternate:function(t){var i,s,n,a=this._get(t,"altField");a&&(i=this._get(t,"altFormat")||this._get(t,"dateFormat"),s=this._getDate(t),n=this.formatDate(i,s,this._getFormatConfig(t)),e(a).each(function(){e(this).val(n)}))},noWeekends:function(e){var t=e.getDay();return[t>0&&6>t,""]},iso8601Week:function(e){var t,i=new Date(e.getTime());return i.setDate(i.getDate()+4-(i.getDay()||7)),t=i.getTime(),i.setMonth(0),i.setDate(1),Math.floor(Math.round((t-i)/864e5)/7)+1},parseDate:function(t,i,s){if(null==t||null==i)throw"Invalid arguments";if(i="object"==typeof i?""+i:i+"",""===i)return null;var n,a,o,r,h=0,l=(s?s.shortYearCutoff:null)||this._defaults.shortYearCutoff,u="string"!=typeof l?l:(new Date).getFullYear()%100+parseInt(l,10),d=(s?s.dayNamesShort:null)||this._defaults.dayNamesShort,c=(s?s.dayNames:null)||this._defaults.dayNames,p=(s?s.monthNamesShort:null)||this._defaults.monthNamesShort,f=(s?s.monthNames:null)||this._defaults.monthNames,m=-1,g=-1,v=-1,y=-1,b=!1,_=function(e){var i=t.length>n+1&&t.charAt(n+1)===e;return i&&n++,i},x=function(e){var t=_(e),s="@"===e?14:"!"===e?20:"y"===e&&t?4:"o"===e?3:2,n="y"===e?s:1,a=RegExp("^\\d{"+n+","+s+"}"),o=i.substring(h).match(a);if(!o)throw"Missing number at position "+h;return h+=o[0].length,parseInt(o[0],10)},w=function(t,s,n){var a=-1,o=e.map(_(t)?n:s,function(e,t){return[[t,e]]}).sort(function(e,t){return-(e[1].length-t[1].length)});if(e.each(o,function(e,t){var s=t[1];return i.substr(h,s.length).toLowerCase()===s.toLowerCase()?(a=t[0],h+=s.length,!1):void 0}),-1!==a)return a+1;throw"Unknown name at position "+h},k=function(){if(i.charAt(h)!==t.charAt(n))throw"Unexpected literal at position "+h;h++};for(n=0;t.length>n;n++)if(b)"'"!==t.charAt(n)||_("'")?k():b=!1;else switch(t.charAt(n)){case"d":v=x("d");break;case"D":w("D",d,c);break;case"o":y=x("o");break;case"m":g=x("m");break;case"M":g=w("M",p,f);break;case"y":m=x("y");break;case"@":r=new Date(x("@")),m=r.getFullYear(),g=r.getMonth()+1,v=r.getDate();break;case"!":r=new Date((x("!")-this._ticksTo1970)/1e4),m=r.getFullYear(),g=r.getMonth()+1,v=r.getDate();break;case"'":_("'")?k():b=!0;break;default:k()}if(i.length>h&&(o=i.substr(h),!/^\s+/.test(o)))throw"Extra/unparsed characters found in date: "+o;if(-1===m?m=(new Date).getFullYear():100>m&&(m+=(new Date).getFullYear()-(new Date).getFullYear()%100+(u>=m?0:-100)),y>-1)for(g=1,v=y;;){if(a=this._getDaysInMonth(m,g-1),a>=v)break;g++,v-=a}if(r=this._daylightSavingAdjust(new Date(m,g-1,v)),r.getFullYear()!==m||r.getMonth()+1!==g||r.getDate()!==v)throw"Invalid date";return r},ATOM:"yy-mm-dd",COOKIE:"D, dd M yy",ISO_8601:"yy-mm-dd",RFC_822:"D, d M y",RFC_850:"DD, dd-M-y",RFC_1036:"D, d M y",RFC_1123:"D, d M yy",RFC_2822:"D, d M yy",RSS:"D, d M y",TICKS:"!",TIMESTAMP:"@",W3C:"yy-mm-dd",_ticksTo1970:1e7*60*60*24*(718685+Math.floor(492.5)-Math.floor(19.7)+Math.floor(4.925)),formatDate:function(e,t,i){if(!t)return"";var s,n=(i?i.dayNamesShort:null)||this._defaults.dayNamesShort,a=(i?i.dayNames:null)||this._defaults.dayNames,o=(i?i.monthNamesShort:null)||this._defaults.monthNamesShort,r=(i?i.monthNames:null)||this._defaults.monthNames,h=function(t){var i=e.length>s+1&&e.charAt(s+1)===t;return i&&s++,i},l=function(e,t,i){var s=""+t;if(h(e))for(;i>s.length;)s="0"+s;return s},u=function(e,t,i,s){return h(e)?s[t]:i[t]},d="",c=!1;if(t)for(s=0;e.length>s;s++)if(c)"'"!==e.charAt(s)||h("'")?d+=e.charAt(s):c=!1;else switch(e.charAt(s)){case"d":d+=l("d",t.getDate(),2);break;case"D":d+=u("D",t.getDay(),n,a);break;case"o":d+=l("o",Math.round((new Date(t.getFullYear(),t.getMonth(),t.getDate()).getTime()-new Date(t.getFullYear(),0,0).getTime())/864e5),3);break;case"m":d+=l("m",t.getMonth()+1,2);break;case"M":d+=u("M",t.getMonth(),o,r);break;case"y":d+=h("y")?t.getFullYear():(10>t.getYear()%100?"0":"")+t.getYear()%100;break;case"@":d+=t.getTime();break;case"!":d+=1e4*t.getTime()+this._ticksTo1970;break;case"'":h("'")?d+="'":c=!0;break;default:d+=e.charAt(s)}return d},_possibleChars:function(e){var t,i="",s=!1,n=function(i){var s=e.length>t+1&&e.charAt(t+1)===i;return s&&t++,s};for(t=0;e.length>t;t++)if(s)"'"!==e.charAt(t)||n("'")?i+=e.charAt(t):s=!1;else switch(e.charAt(t)){case"d":case"m":case"y":case"@":i+="0123456789";break;case"D":case"M":return null;case"'":n("'")?i+="'":s=!0;break;default:i+=e.charAt(t)}return i},_get:function(e,t){return void 0!==e.settings[t]?e.settings[t]:this._defaults[t]},_setDateFromField:function(e,t){if(e.input.val()!==e.lastVal){var i=this._get(e,"dateFormat"),s=e.lastVal=e.input?e.input.val():null,n=this._getDefaultDate(e),a=n,o=this._getFormatConfig(e);try{a=this.parseDate(i,s,o)||n}catch(r){s=t?"":s}e.selectedDay=a.getDate(),e.drawMonth=e.selectedMonth=a.getMonth(),e.drawYear=e.selectedYear=a.getFullYear(),e.currentDay=s?a.getDate():0,e.currentMonth=s?a.getMonth():0,e.currentYear=s?a.getFullYear():0,this._adjustInstDate(e)}},_getDefaultDate:function(e){return this._restrictMinMax(e,this._determineDate(e,this._get(e,"defaultDate"),new Date))},_determineDate:function(t,i,s){var n=function(e){var t=new Date;return t.setDate(t.getDate()+e),t},a=function(i){try{return e.datepicker.parseDate(e.datepicker._get(t,"dateFormat"),i,e.datepicker._getFormatConfig(t))}catch(s){}for(var n=(i.toLowerCase().match(/^c/)?e.datepicker._getDate(t):null)||new Date,a=n.getFullYear(),o=n.getMonth(),r=n.getDate(),h=/([+\-]?[0-9]+)\s*(d|D|w|W|m|M|y|Y)?/g,l=h.exec(i);l;){switch(l[2]||"d"){case"d":case"D":r+=parseInt(l[1],10);break;case"w":case"W":r+=7*parseInt(l[1],10);break;case"m":case"M":o+=parseInt(l[1],10),r=Math.min(r,e.datepicker._getDaysInMonth(a,o));break;case"y":case"Y":a+=parseInt(l[1],10),r=Math.min(r,e.datepicker._getDaysInMonth(a,o))}l=h.exec(i)}return new Date(a,o,r)},o=null==i||""===i?s:"string"==typeof i?a(i):"number"==typeof i?isNaN(i)?s:n(i):new Date(i.getTime());return o=o&&"Invalid Date"==""+o?s:o,o&&(o.setHours(0),o.setMinutes(0),o.setSeconds(0),o.setMilliseconds(0)),this._daylightSavingAdjust(o)},_daylightSavingAdjust:function(e){return e?(e.setHours(e.getHours()>12?e.getHours()+2:0),e):null},_setDate:function(e,t,i){var s=!t,n=e.selectedMonth,a=e.selectedYear,o=this._restrictMinMax(e,this._determineDate(e,t,new Date));e.selectedDay=e.currentDay=o.getDate(),e.drawMonth=e.selectedMonth=e.currentMonth=o.getMonth(),e.drawYear=e.selectedYear=e.currentYear=o.getFullYear(),n===e.selectedMonth&&a===e.selectedYear||i||this._notifyChange(e),this._adjustInstDate(e),e.input&&e.input.val(s?"":this._formatDate(e))},_getDate:function(e){var t=!e.currentYear||e.input&&""===e.input.val()?null:this._daylightSavingAdjust(new Date(e.currentYear,e.currentMonth,e.currentDay));return t},_attachHandlers:function(t){var i=this._get(t,"stepMonths"),s="#"+t.id.replace(/\\\\/g,"\\");t.dpDiv.find("[data-handler]").map(function(){var t={prev:function(){e.datepicker._adjustDate(s,-i,"M")},next:function(){e.datepicker._adjustDate(s,+i,"M")},hide:function(){e.datepicker._hideDatepicker()},today:function(){e.datepicker._gotoToday(s)},selectDay:function(){return e.datepicker._selectDay(s,+this.getAttribute("data-month"),+this.getAttribute("data-year"),this),!1},selectMonth:function(){return e.datepicker._selectMonthYear(s,this,"M"),!1},selectYear:function(){return e.datepicker._selectMonthYear(s,this,"Y"),!1}};e(this).bind(this.getAttribute("data-event"),t[this.getAttribute("data-handler")])})},_generateHTML:function(e){var t,i,s,n,a,o,r,h,l,u,d,c,p,f,m,g,v,y,b,_,x,w,k,T,D,S,N,M,C,P,A,I,H,z,F,E,W,L,O,j=new Date,R=this._daylightSavingAdjust(new Date(j.getFullYear(),j.getMonth(),j.getDate())),Y=this._get(e,"isRTL"),J=this._get(e,"showButtonPanel"),B=this._get(e,"hideIfNoPrevNext"),K=this._get(e,"navigationAsDateFormat"),U=this._getNumberOfMonths(e),V=this._get(e,"showCurrentAtPos"),q=this._get(e,"stepMonths"),G=1!==U[0]||1!==U[1],X=this._daylightSavingAdjust(e.currentDay?new Date(e.currentYear,e.currentMonth,e.currentDay):new Date(9999,9,9)),Q=this._getMinMaxDate(e,"min"),$=this._getMinMaxDate(e,"max"),Z=e.drawMonth-V,et=e.drawYear;if(0>Z&&(Z+=12,et--),$)for(t=this._daylightSavingAdjust(new Date($.getFullYear(),$.getMonth()-U[0]*U[1]+1,$.getDate())),t=Q&&Q>t?Q:t;this._daylightSavingAdjust(new Date(et,Z,1))>t;)Z--,0>Z&&(Z=11,et--);for(e.drawMonth=Z,e.drawYear=et,i=this._get(e,"prevText"),i=K?this.formatDate(i,this._daylightSavingAdjust(new Date(et,Z-q,1)),this._getFormatConfig(e)):i,s=this._canAdjustMonth(e,-1,et,Z)?"<a class='ui-datepicker-prev ui-corner-all' data-handler='prev' data-event='click' title='"+i+"'><span class='ui-icon ui-icon-circle-triangle-"+(Y?"e":"w")+"'>"+i+"</span></a>":B?"":"<a class='ui-datepicker-prev ui-corner-all ui-state-disabled' title='"+i+"'><span class='ui-icon ui-icon-circle-triangle-"+(Y?"e":"w")+"'>"+i+"</span></a>",n=this._get(e,"nextText"),n=K?this.formatDate(n,this._daylightSavingAdjust(new Date(et,Z+q,1)),this._getFormatConfig(e)):n,a=this._canAdjustMonth(e,1,et,Z)?"<a class='ui-datepicker-next ui-corner-all' data-handler='next' data-event='click' title='"+n+"'><span class='ui-icon ui-icon-circle-triangle-"+(Y?"w":"e")+"'>"+n+"</span></a>":B?"":"<a class='ui-datepicker-next ui-corner-all ui-state-disabled' title='"+n+"'><span class='ui-icon ui-icon-circle-triangle-"+(Y?"w":"e")+"'>"+n+"</span></a>",o=this._get(e,"currentText"),r=this._get(e,"gotoCurrent")&&e.currentDay?X:R,o=K?this.formatDate(o,r,this._getFormatConfig(e)):o,h=e.inline?"":"<button type='button' class='ui-datepicker-close ui-state-default ui-priority-primary ui-corner-all' data-handler='hide' data-event='click'>"+this._get(e,"closeText")+"</button>",l=J?"<div class='ui-datepicker-buttonpane ui-widget-content'>"+(Y?h:"")+(this._isInRange(e,r)?"<button type='button' class='ui-datepicker-current ui-state-default ui-priority-secondary ui-corner-all' data-handler='today' data-event='click'>"+o+"</button>":"")+(Y?"":h)+"</div>":"",u=parseInt(this._get(e,"firstDay"),10),u=isNaN(u)?0:u,d=this._get(e,"showWeek"),c=this._get(e,"dayNames"),p=this._get(e,"dayNamesMin"),f=this._get(e,"monthNames"),m=this._get(e,"monthNamesShort"),g=this._get(e,"beforeShowDay"),v=this._get(e,"showOtherMonths"),y=this._get(e,"selectOtherMonths"),b=this._getDefaultDate(e),_="",w=0;U[0]>w;w++){for(k="",this.maxRows=4,T=0;U[1]>T;T++){if(D=this._daylightSavingAdjust(new Date(et,Z,e.selectedDay)),S=" ui-corner-all",N="",G){if(N+="<div class='ui-datepicker-group",U[1]>1)switch(T){case 0:N+=" ui-datepicker-group-first",S=" ui-corner-"+(Y?"right":"left");break;case U[1]-1:N+=" ui-datepicker-group-last",S=" ui-corner-"+(Y?"left":"right");break;default:N+=" ui-datepicker-group-middle",S=""}N+="'>"}for(N+="<div class='ui-datepicker-header ui-widget-header ui-helper-clearfix"+S+"'>"+(/all|left/.test(S)&&0===w?Y?a:s:"")+(/all|right/.test(S)&&0===w?Y?s:a:"")+this._generateMonthYearHeader(e,Z,et,Q,$,w>0||T>0,f,m)+"</div><table class='ui-datepicker-calendar'><thead>"+"<tr>",M=d?"<th class='ui-datepicker-week-col'>"+this._get(e,"weekHeader")+"</th>":"",x=0;7>x;x++)C=(x+u)%7,M+="<th scope='col'"+((x+u+6)%7>=5?" class='ui-datepicker-week-end'":"")+">"+"<span title='"+c[C]+"'>"+p[C]+"</span></th>";for(N+=M+"</tr></thead><tbody>",P=this._getDaysInMonth(et,Z),et===e.selectedYear&&Z===e.selectedMonth&&(e.selectedDay=Math.min(e.selectedDay,P)),A=(this._getFirstDayOfMonth(et,Z)-u+7)%7,I=Math.ceil((A+P)/7),H=G?this.maxRows>I?this.maxRows:I:I,this.maxRows=H,z=this._daylightSavingAdjust(new Date(et,Z,1-A)),F=0;H>F;F++){for(N+="<tr>",E=d?"<td class='ui-datepicker-week-col'>"+this._get(e,"calculateWeek")(z)+"</td>":"",x=0;7>x;x++)W=g?g.apply(e.input?e.input[0]:null,[z]):[!0,""],L=z.getMonth()!==Z,O=L&&!y||!W[0]||Q&&Q>z||$&&z>$,E+="<td class='"+((x+u+6)%7>=5?" ui-datepicker-week-end":"")+(L?" ui-datepicker-other-month":"")+(z.getTime()===D.getTime()&&Z===e.selectedMonth&&e._keyEvent||b.getTime()===z.getTime()&&b.getTime()===D.getTime()?" "+this._dayOverClass:"")+(O?" "+this._unselectableClass+" ui-state-disabled":"")+(L&&!v?"":" "+W[1]+(z.getTime()===X.getTime()?" "+this._currentClass:"")+(z.getTime()===R.getTime()?" ui-datepicker-today":""))+"'"+(L&&!v||!W[2]?"":" title='"+W[2].replace(/'/g,"&#39;")+"'")+(O?"":" data-handler='selectDay' data-event='click' data-month='"+z.getMonth()+"' data-year='"+z.getFullYear()+"'")+">"+(L&&!v?"&#xa0;":O?"<span class='ui-state-default'>"+z.getDate()+"</span>":"<a class='ui-state-default"+(z.getTime()===R.getTime()?" ui-state-highlight":"")+(z.getTime()===X.getTime()?" ui-state-active":"")+(L?" ui-priority-secondary":"")+"' href='#'>"+z.getDate()+"</a>")+"</td>",z.setDate(z.getDate()+1),z=this._daylightSavingAdjust(z);N+=E+"</tr>"}Z++,Z>11&&(Z=0,et++),N+="</tbody></table>"+(G?"</div>"+(U[0]>0&&T===U[1]-1?"<div class='ui-datepicker-row-break'></div>":""):""),k+=N}_+=k}return _+=l,e._keyEvent=!1,_},_generateMonthYearHeader:function(e,t,i,s,n,a,o,r){var h,l,u,d,c,p,f,m,g=this._get(e,"changeMonth"),v=this._get(e,"changeYear"),y=this._get(e,"showMonthAfterYear"),b="<div class='ui-datepicker-title'>",_="";if(a||!g)_+="<span class='ui-datepicker-month'>"+o[t]+"</span>";else{for(h=s&&s.getFullYear()===i,l=n&&n.getFullYear()===i,_+="<select class='ui-datepicker-month' data-handler='selectMonth' data-event='change'>",u=0;12>u;u++)(!h||u>=s.getMonth())&&(!l||n.getMonth()>=u)&&(_+="<option value='"+u+"'"+(u===t?" selected='selected'":"")+">"+r[u]+"</option>");_+="</select>"}if(y||(b+=_+(!a&&g&&v?"":"&#xa0;")),!e.yearshtml)if(e.yearshtml="",a||!v)b+="<span class='ui-datepicker-year'>"+i+"</span>";else{for(d=this._get(e,"yearRange").split(":"),c=(new Date).getFullYear(),p=function(e){var t=e.match(/c[+\-].*/)?i+parseInt(e.substring(1),10):e.match(/[+\-].*/)?c+parseInt(e,10):parseInt(e,10);return isNaN(t)?c:t},f=p(d[0]),m=Math.max(f,p(d[1]||"")),f=s?Math.max(f,s.getFullYear()):f,m=n?Math.min(m,n.getFullYear()):m,e.yearshtml+="<select class='ui-datepicker-year' data-handler='selectYear' data-event='change'>";m>=f;f++)e.yearshtml+="<option value='"+f+"'"+(f===i?" selected='selected'":"")+">"+f+"</option>";e.yearshtml+="</select>",b+=e.yearshtml,e.yearshtml=null}return b+=this._get(e,"yearSuffix"),y&&(b+=(!a&&g&&v?"":"&#xa0;")+_),b+="</div>"},_adjustInstDate:function(e,t,i){var s=e.drawYear+("Y"===i?t:0),n=e.drawMonth+("M"===i?t:0),a=Math.min(e.selectedDay,this._getDaysInMonth(s,n))+("D"===i?t:0),o=this._restrictMinMax(e,this._daylightSavingAdjust(new Date(s,n,a)));e.selectedDay=o.getDate(),e.drawMonth=e.selectedMonth=o.getMonth(),e.drawYear=e.selectedYear=o.getFullYear(),("M"===i||"Y"===i)&&this._notifyChange(e)},_restrictMinMax:function(e,t){var i=this._getMinMaxDate(e,"min"),s=this._getMinMaxDate(e,"max"),n=i&&i>t?i:t;return s&&n>s?s:n},_notifyChange:function(e){var t=this._get(e,"onChangeMonthYear");t&&t.apply(e.input?e.input[0]:null,[e.selectedYear,e.selectedMonth+1,e])},_getNumberOfMonths:function(e){var t=this._get(e,"numberOfMonths");return null==t?[1,1]:"number"==typeof t?[1,t]:t},_getMinMaxDate:function(e,t){return this._determineDate(e,this._get(e,t+"Date"),null)},_getDaysInMonth:function(e,t){return 32-this._daylightSavingAdjust(new Date(e,t,32)).getDate()},_getFirstDayOfMonth:function(e,t){return new Date(e,t,1).getDay()},_canAdjustMonth:function(e,t,i,s){var n=this._getNumberOfMonths(e),a=this._daylightSavingAdjust(new Date(i,s+(0>t?t:n[0]*n[1]),1));return 0>t&&a.setDate(this._getDaysInMonth(a.getFullYear(),a.getMonth())),this._isInRange(e,a)},_isInRange:function(e,t){var i,s,n=this._getMinMaxDate(e,"min"),a=this._getMinMaxDate(e,"max"),o=null,r=null,h=this._get(e,"yearRange");return h&&(i=h.split(":"),s=(new Date).getFullYear(),o=parseInt(i[0],10),r=parseInt(i[1],10),i[0].match(/[+\-].*/)&&(o+=s),i[1].match(/[+\-].*/)&&(r+=s)),(!n||t.getTime()>=n.getTime())&&(!a||t.getTime()<=a.getTime())&&(!o||t.getFullYear()>=o)&&(!r||r>=t.getFullYear())},_getFormatConfig:function(e){var t=this._get(e,"shortYearCutoff");return t="string"!=typeof t?t:(new Date).getFullYear()%100+parseInt(t,10),{shortYearCutoff:t,dayNamesShort:this._get(e,"dayNamesShort"),dayNames:this._get(e,"dayNames"),monthNamesShort:this._get(e,"monthNamesShort"),monthNames:this._get(e,"monthNames")}},_formatDate:function(e,t,i,s){t||(e.currentDay=e.selectedDay,e.currentMonth=e.selectedMonth,e.currentYear=e.selectedYear);var n=t?"object"==typeof t?t:this._daylightSavingAdjust(new Date(s,i,t)):this._daylightSavingAdjust(new Date(e.currentYear,e.currentMonth,e.currentDay));return this.formatDate(this._get(e,"dateFormat"),n,this._getFormatConfig(e))}}),e.fn.datepicker=function(t){if(!this.length)return this;e.datepicker.initialized||(e(document).mousedown(e.datepicker._checkExternalClick),e.datepicker.initialized=!0),0===e("#"+e.datepicker._mainDivId).length&&e("body").append(e.datepicker.dpDiv);var i=Array.prototype.slice.call(arguments,1);return"string"!=typeof t||"isDisabled"!==t&&"getDate"!==t&&"widget"!==t?"option"===t&&2===arguments.length&&"string"==typeof arguments[1]?e.datepicker["_"+t+"Datepicker"].apply(e.datepicker,[this[0]].concat(i)):this.each(function(){"string"==typeof t?e.datepicker["_"+t+"Datepicker"].apply(e.datepicker,[this].concat(i)):e.datepicker._attachDatepicker(this,t)}):e.datepicker["_"+t+"Datepicker"].apply(e.datepicker,[this[0]].concat(i))},e.datepicker=new n,e.datepicker.initialized=!1,e.datepicker.uuid=(new Date).getTime(),e.datepicker.version="1.11.4",e.datepicker,e.widget("ui.dialog",{version:"1.11.4",options:{appendTo:"body",autoOpen:!0,buttons:[],closeOnEscape:!0,closeText:"Close",dialogClass:"",draggable:!0,hide:null,height:"auto",maxHeight:null,maxWidth:null,minHeight:150,minWidth:150,modal:!1,position:{my:"center",at:"center",of:window,collision:"fit",using:function(t){var i=e(this).css(t).offset().top;0>i&&e(this).css("top",t.top-i)}},resizable:!0,show:null,title:null,width:300,beforeClose:null,close:null,drag:null,dragStart:null,dragStop:null,focus:null,open:null,resize:null,resizeStart:null,resizeStop:null},sizeRelatedOptions:{buttons:!0,height:!0,maxHeight:!0,maxWidth:!0,minHeight:!0,minWidth:!0,width:!0},resizableRelatedOptions:{maxHeight:!0,maxWidth:!0,minHeight:!0,minWidth:!0},_create:function(){this.originalCss={display:this.element[0].style.display,width:this.element[0].style.width,minHeight:this.element[0].style.minHeight,maxHeight:this.element[0].style.maxHeight,height:this.element[0].style.height},this.originalPosition={parent:this.element.parent(),index:this.element.parent().children().index(this.element)},this.originalTitle=this.element.attr("title"),this.options.title=this.options.title||this.originalTitle,this._createWrapper(),this.element.show().removeAttr("title").addClass("ui-dialog-content ui-widget-content").appendTo(this.uiDialog),this._createTitlebar(),this._createButtonPane(),this.options.draggable&&e.fn.draggable&&this._makeDraggable(),this.options.resizable&&e.fn.resizable&&this._makeResizable(),this._isOpen=!1,this._trackFocus()},_init:function(){this.options.autoOpen&&this.open()},_appendTo:function(){var t=this.options.appendTo;return t&&(t.jquery||t.nodeType)?e(t):this.document.find(t||"body").eq(0)},_destroy:function(){var e,t=this.originalPosition;this._untrackInstance(),this._destroyOverlay(),this.element.removeUniqueId().removeClass("ui-dialog-content ui-widget-content").css(this.originalCss).detach(),this.uiDialog.stop(!0,!0).remove(),this.originalTitle&&this.element.attr("title",this.originalTitle),e=t.parent.children().eq(t.index),e.length&&e[0]!==this.element[0]?e.before(this.element):t.parent.append(this.element)},widget:function(){return this.uiDialog},disable:e.noop,enable:e.noop,close:function(t){var i,s=this;if(this._isOpen&&this._trigger("beforeClose",t)!==!1){if(this._isOpen=!1,this._focusedElement=null,this._destroyOverlay(),this._untrackInstance(),!this.opener.filter(":focusable").focus().length)try{i=this.document[0].activeElement,i&&"body"!==i.nodeName.toLowerCase()&&e(i).blur()}catch(n){}this._hide(this.uiDialog,this.options.hide,function(){s._trigger("close",t)})}},isOpen:function(){return this._isOpen},moveToTop:function(){this._moveToTop()},_moveToTop:function(t,i){var s=!1,n=this.uiDialog.siblings(".ui-front:visible").map(function(){return+e(this).css("z-index")}).get(),a=Math.max.apply(null,n);return a>=+this.uiDialog.css("z-index")&&(this.uiDialog.css("z-index",a+1),s=!0),s&&!i&&this._trigger("focus",t),s},open:function(){var t=this;
return this._isOpen?(this._moveToTop()&&this._focusTabbable(),void 0):(this._isOpen=!0,this.opener=e(this.document[0].activeElement),this._size(),this._position(),this._createOverlay(),this._moveToTop(null,!0),this.overlay&&this.overlay.css("z-index",this.uiDialog.css("z-index")-1),this._show(this.uiDialog,this.options.show,function(){t._focusTabbable(),t._trigger("focus")}),this._makeFocusTarget(),this._trigger("open"),void 0)},_focusTabbable:function(){var e=this._focusedElement;e||(e=this.element.find("[autofocus]")),e.length||(e=this.element.find(":tabbable")),e.length||(e=this.uiDialogButtonPane.find(":tabbable")),e.length||(e=this.uiDialogTitlebarClose.filter(":tabbable")),e.length||(e=this.uiDialog),e.eq(0).focus()},_keepFocus:function(t){function i(){var t=this.document[0].activeElement,i=this.uiDialog[0]===t||e.contains(this.uiDialog[0],t);i||this._focusTabbable()}t.preventDefault(),i.call(this),this._delay(i)},_createWrapper:function(){this.uiDialog=e("<div>").addClass("ui-dialog ui-widget ui-widget-content ui-corner-all ui-front "+this.options.dialogClass).hide().attr({tabIndex:-1,role:"dialog"}).appendTo(this._appendTo()),this._on(this.uiDialog,{keydown:function(t){if(this.options.closeOnEscape&&!t.isDefaultPrevented()&&t.keyCode&&t.keyCode===e.ui.keyCode.ESCAPE)return t.preventDefault(),this.close(t),void 0;if(t.keyCode===e.ui.keyCode.TAB&&!t.isDefaultPrevented()){var i=this.uiDialog.find(":tabbable"),s=i.filter(":first"),n=i.filter(":last");t.target!==n[0]&&t.target!==this.uiDialog[0]||t.shiftKey?t.target!==s[0]&&t.target!==this.uiDialog[0]||!t.shiftKey||(this._delay(function(){n.focus()}),t.preventDefault()):(this._delay(function(){s.focus()}),t.preventDefault())}},mousedown:function(e){this._moveToTop(e)&&this._focusTabbable()}}),this.element.find("[aria-describedby]").length||this.uiDialog.attr({"aria-describedby":this.element.uniqueId().attr("id")})},_createTitlebar:function(){var t;this.uiDialogTitlebar=e("<div>").addClass("ui-dialog-titlebar ui-widget-header ui-corner-all ui-helper-clearfix").prependTo(this.uiDialog),this._on(this.uiDialogTitlebar,{mousedown:function(t){e(t.target).closest(".ui-dialog-titlebar-close")||this.uiDialog.focus()}}),this.uiDialogTitlebarClose=e("<button type='button'></button>").button({label:this.options.closeText,icons:{primary:"ui-icon-closethick"},text:!1}).addClass("ui-dialog-titlebar-close").appendTo(this.uiDialogTitlebar),this._on(this.uiDialogTitlebarClose,{click:function(e){e.preventDefault(),this.close(e)}}),t=e("<span>").uniqueId().addClass("ui-dialog-title").prependTo(this.uiDialogTitlebar),this._title(t),this.uiDialog.attr({"aria-labelledby":t.attr("id")})},_title:function(e){this.options.title||e.html("&#160;"),e.text(this.options.title)},_createButtonPane:function(){this.uiDialogButtonPane=e("<div>").addClass("ui-dialog-buttonpane ui-widget-content ui-helper-clearfix"),this.uiButtonSet=e("<div>").addClass("ui-dialog-buttonset").appendTo(this.uiDialogButtonPane),this._createButtons()},_createButtons:function(){var t=this,i=this.options.buttons;return this.uiDialogButtonPane.remove(),this.uiButtonSet.empty(),e.isEmptyObject(i)||e.isArray(i)&&!i.length?(this.uiDialog.removeClass("ui-dialog-buttons"),void 0):(e.each(i,function(i,s){var n,a;s=e.isFunction(s)?{click:s,text:i}:s,s=e.extend({type:"button"},s),n=s.click,s.click=function(){n.apply(t.element[0],arguments)},a={icons:s.icons,text:s.showText},delete s.icons,delete s.showText,e("<button></button>",s).button(a).appendTo(t.uiButtonSet)}),this.uiDialog.addClass("ui-dialog-buttons"),this.uiDialogButtonPane.appendTo(this.uiDialog),void 0)},_makeDraggable:function(){function t(e){return{position:e.position,offset:e.offset}}var i=this,s=this.options;this.uiDialog.draggable({cancel:".ui-dialog-content, .ui-dialog-titlebar-close",handle:".ui-dialog-titlebar",containment:"document",start:function(s,n){e(this).addClass("ui-dialog-dragging"),i._blockFrames(),i._trigger("dragStart",s,t(n))},drag:function(e,s){i._trigger("drag",e,t(s))},stop:function(n,a){var o=a.offset.left-i.document.scrollLeft(),r=a.offset.top-i.document.scrollTop();s.position={my:"left top",at:"left"+(o>=0?"+":"")+o+" "+"top"+(r>=0?"+":"")+r,of:i.window},e(this).removeClass("ui-dialog-dragging"),i._unblockFrames(),i._trigger("dragStop",n,t(a))}})},_makeResizable:function(){function t(e){return{originalPosition:e.originalPosition,originalSize:e.originalSize,position:e.position,size:e.size}}var i=this,s=this.options,n=s.resizable,a=this.uiDialog.css("position"),o="string"==typeof n?n:"n,e,s,w,se,sw,ne,nw";this.uiDialog.resizable({cancel:".ui-dialog-content",containment:"document",alsoResize:this.element,maxWidth:s.maxWidth,maxHeight:s.maxHeight,minWidth:s.minWidth,minHeight:this._minHeight(),handles:o,start:function(s,n){e(this).addClass("ui-dialog-resizing"),i._blockFrames(),i._trigger("resizeStart",s,t(n))},resize:function(e,s){i._trigger("resize",e,t(s))},stop:function(n,a){var o=i.uiDialog.offset(),r=o.left-i.document.scrollLeft(),h=o.top-i.document.scrollTop();s.height=i.uiDialog.height(),s.width=i.uiDialog.width(),s.position={my:"left top",at:"left"+(r>=0?"+":"")+r+" "+"top"+(h>=0?"+":"")+h,of:i.window},e(this).removeClass("ui-dialog-resizing"),i._unblockFrames(),i._trigger("resizeStop",n,t(a))}}).css("position",a)},_trackFocus:function(){this._on(this.widget(),{focusin:function(t){this._makeFocusTarget(),this._focusedElement=e(t.target)}})},_makeFocusTarget:function(){this._untrackInstance(),this._trackingInstances().unshift(this)},_untrackInstance:function(){var t=this._trackingInstances(),i=e.inArray(this,t);-1!==i&&t.splice(i,1)},_trackingInstances:function(){var e=this.document.data("ui-dialog-instances");return e||(e=[],this.document.data("ui-dialog-instances",e)),e},_minHeight:function(){var e=this.options;return"auto"===e.height?e.minHeight:Math.min(e.minHeight,e.height)},_position:function(){var e=this.uiDialog.is(":visible");e||this.uiDialog.show(),this.uiDialog.position(this.options.position),e||this.uiDialog.hide()},_setOptions:function(t){var i=this,s=!1,n={};e.each(t,function(e,t){i._setOption(e,t),e in i.sizeRelatedOptions&&(s=!0),e in i.resizableRelatedOptions&&(n[e]=t)}),s&&(this._size(),this._position()),this.uiDialog.is(":data(ui-resizable)")&&this.uiDialog.resizable("option",n)},_setOption:function(e,t){var i,s,n=this.uiDialog;"dialogClass"===e&&n.removeClass(this.options.dialogClass).addClass(t),"disabled"!==e&&(this._super(e,t),"appendTo"===e&&this.uiDialog.appendTo(this._appendTo()),"buttons"===e&&this._createButtons(),"closeText"===e&&this.uiDialogTitlebarClose.button({label:""+t}),"draggable"===e&&(i=n.is(":data(ui-draggable)"),i&&!t&&n.draggable("destroy"),!i&&t&&this._makeDraggable()),"position"===e&&this._position(),"resizable"===e&&(s=n.is(":data(ui-resizable)"),s&&!t&&n.resizable("destroy"),s&&"string"==typeof t&&n.resizable("option","handles",t),s||t===!1||this._makeResizable()),"title"===e&&this._title(this.uiDialogTitlebar.find(".ui-dialog-title")))},_size:function(){var e,t,i,s=this.options;this.element.show().css({width:"auto",minHeight:0,maxHeight:"none",height:0}),s.minWidth>s.width&&(s.width=s.minWidth),e=this.uiDialog.css({height:"auto",width:s.width}).outerHeight(),t=Math.max(0,s.minHeight-e),i="number"==typeof s.maxHeight?Math.max(0,s.maxHeight-e):"none","auto"===s.height?this.element.css({minHeight:t,maxHeight:i,height:"auto"}):this.element.height(Math.max(0,s.height-e)),this.uiDialog.is(":data(ui-resizable)")&&this.uiDialog.resizable("option","minHeight",this._minHeight())},_blockFrames:function(){this.iframeBlocks=this.document.find("iframe").map(function(){var t=e(this);return e("<div>").css({position:"absolute",width:t.outerWidth(),height:t.outerHeight()}).appendTo(t.parent()).offset(t.offset())[0]})},_unblockFrames:function(){this.iframeBlocks&&(this.iframeBlocks.remove(),delete this.iframeBlocks)},_allowInteraction:function(t){return e(t.target).closest(".ui-dialog").length?!0:!!e(t.target).closest(".ui-datepicker").length},_createOverlay:function(){if(this.options.modal){var t=!0;this._delay(function(){t=!1}),this.document.data("ui-dialog-overlays")||this._on(this.document,{focusin:function(e){t||this._allowInteraction(e)||(e.preventDefault(),this._trackingInstances()[0]._focusTabbable())}}),this.overlay=e("<div>").addClass("ui-widget-overlay ui-front").appendTo(this._appendTo()),this._on(this.overlay,{mousedown:"_keepFocus"}),this.document.data("ui-dialog-overlays",(this.document.data("ui-dialog-overlays")||0)+1)}},_destroyOverlay:function(){if(this.options.modal&&this.overlay){var e=this.document.data("ui-dialog-overlays")-1;e?this.document.data("ui-dialog-overlays",e):this.document.unbind("focusin").removeData("ui-dialog-overlays"),this.overlay.remove(),this.overlay=null}}}),e.widget("ui.progressbar",{version:"1.11.4",options:{max:100,value:0,change:null,complete:null},min:0,_create:function(){this.oldValue=this.options.value=this._constrainedValue(),this.element.addClass("ui-progressbar ui-widget ui-widget-content ui-corner-all").attr({role:"progressbar","aria-valuemin":this.min}),this.valueDiv=e("<div class='ui-progressbar-value ui-widget-header ui-corner-left'></div>").appendTo(this.element),this._refreshValue()},_destroy:function(){this.element.removeClass("ui-progressbar ui-widget ui-widget-content ui-corner-all").removeAttr("role").removeAttr("aria-valuemin").removeAttr("aria-valuemax").removeAttr("aria-valuenow"),this.valueDiv.remove()},value:function(e){return void 0===e?this.options.value:(this.options.value=this._constrainedValue(e),this._refreshValue(),void 0)},_constrainedValue:function(e){return void 0===e&&(e=this.options.value),this.indeterminate=e===!1,"number"!=typeof e&&(e=0),this.indeterminate?!1:Math.min(this.options.max,Math.max(this.min,e))},_setOptions:function(e){var t=e.value;delete e.value,this._super(e),this.options.value=this._constrainedValue(t),this._refreshValue()},_setOption:function(e,t){"max"===e&&(t=Math.max(this.min,t)),"disabled"===e&&this.element.toggleClass("ui-state-disabled",!!t).attr("aria-disabled",t),this._super(e,t)},_percentage:function(){return this.indeterminate?100:100*(this.options.value-this.min)/(this.options.max-this.min)},_refreshValue:function(){var t=this.options.value,i=this._percentage();this.valueDiv.toggle(this.indeterminate||t>this.min).toggleClass("ui-corner-right",t===this.options.max).width(i.toFixed(0)+"%"),this.element.toggleClass("ui-progressbar-indeterminate",this.indeterminate),this.indeterminate?(this.element.removeAttr("aria-valuenow"),this.overlayDiv||(this.overlayDiv=e("<div class='ui-progressbar-overlay'></div>").appendTo(this.valueDiv))):(this.element.attr({"aria-valuemax":this.options.max,"aria-valuenow":t}),this.overlayDiv&&(this.overlayDiv.remove(),this.overlayDiv=null)),this.oldValue!==t&&(this.oldValue=t,this._trigger("change")),t===this.options.max&&this._trigger("complete")}}),e.widget("ui.selectmenu",{version:"1.11.4",defaultElement:"<select>",options:{appendTo:null,disabled:null,icons:{button:"ui-icon-triangle-1-s"},position:{my:"left top",at:"left bottom",collision:"none"},width:null,change:null,close:null,focus:null,open:null,select:null},_create:function(){var e=this.element.uniqueId().attr("id");this.ids={element:e,button:e+"-button",menu:e+"-menu"},this._drawButton(),this._drawMenu(),this.options.disabled&&this.disable()},_drawButton:function(){var t=this;this.label=e("label[for='"+this.ids.element+"']").attr("for",this.ids.button),this._on(this.label,{click:function(e){this.button.focus(),e.preventDefault()}}),this.element.hide(),this.button=e("<span>",{"class":"ui-selectmenu-button ui-widget ui-state-default ui-corner-all",tabindex:this.options.disabled?-1:0,id:this.ids.button,role:"combobox","aria-expanded":"false","aria-autocomplete":"list","aria-owns":this.ids.menu,"aria-haspopup":"true"}).insertAfter(this.element),e("<span>",{"class":"ui-icon "+this.options.icons.button}).prependTo(this.button),this.buttonText=e("<span>",{"class":"ui-selectmenu-text"}).appendTo(this.button),this._setText(this.buttonText,this.element.find("option:selected").text()),this._resizeButton(),this._on(this.button,this._buttonEvents),this.button.one("focusin",function(){t.menuItems||t._refreshMenu()}),this._hoverable(this.button),this._focusable(this.button)},_drawMenu:function(){var t=this;this.menu=e("<ul>",{"aria-hidden":"true","aria-labelledby":this.ids.button,id:this.ids.menu}),this.menuWrap=e("<div>",{"class":"ui-selectmenu-menu ui-front"}).append(this.menu).appendTo(this._appendTo()),this.menuInstance=this.menu.menu({role:"listbox",select:function(e,i){e.preventDefault(),t._setSelection(),t._select(i.item.data("ui-selectmenu-item"),e)},focus:function(e,i){var s=i.item.data("ui-selectmenu-item");null!=t.focusIndex&&s.index!==t.focusIndex&&(t._trigger("focus",e,{item:s}),t.isOpen||t._select(s,e)),t.focusIndex=s.index,t.button.attr("aria-activedescendant",t.menuItems.eq(s.index).attr("id"))}}).menu("instance"),this.menu.addClass("ui-corner-bottom").removeClass("ui-corner-all"),this.menuInstance._off(this.menu,"mouseleave"),this.menuInstance._closeOnDocumentClick=function(){return!1},this.menuInstance._isDivider=function(){return!1}},refresh:function(){this._refreshMenu(),this._setText(this.buttonText,this._getSelectedItem().text()),this.options.width||this._resizeButton()},_refreshMenu:function(){this.menu.empty();var e,t=this.element.find("option");t.length&&(this._parseOptions(t),this._renderMenu(this.menu,this.items),this.menuInstance.refresh(),this.menuItems=this.menu.find("li").not(".ui-selectmenu-optgroup"),e=this._getSelectedItem(),this.menuInstance.focus(null,e),this._setAria(e.data("ui-selectmenu-item")),this._setOption("disabled",this.element.prop("disabled")))},open:function(e){this.options.disabled||(this.menuItems?(this.menu.find(".ui-state-focus").removeClass("ui-state-focus"),this.menuInstance.focus(null,this._getSelectedItem())):this._refreshMenu(),this.isOpen=!0,this._toggleAttr(),this._resizeMenu(),this._position(),this._on(this.document,this._documentClick),this._trigger("open",e))},_position:function(){this.menuWrap.position(e.extend({of:this.button},this.options.position))},close:function(e){this.isOpen&&(this.isOpen=!1,this._toggleAttr(),this.range=null,this._off(this.document),this._trigger("close",e))},widget:function(){return this.button},menuWidget:function(){return this.menu},_renderMenu:function(t,i){var s=this,n="";e.each(i,function(i,a){a.optgroup!==n&&(e("<li>",{"class":"ui-selectmenu-optgroup ui-menu-divider"+(a.element.parent("optgroup").prop("disabled")?" ui-state-disabled":""),text:a.optgroup}).appendTo(t),n=a.optgroup),s._renderItemData(t,a)})},_renderItemData:function(e,t){return this._renderItem(e,t).data("ui-selectmenu-item",t)},_renderItem:function(t,i){var s=e("<li>");return i.disabled&&s.addClass("ui-state-disabled"),this._setText(s,i.label),s.appendTo(t)},_setText:function(e,t){t?e.text(t):e.html("&#160;")},_move:function(e,t){var i,s,n=".ui-menu-item";this.isOpen?i=this.menuItems.eq(this.focusIndex):(i=this.menuItems.eq(this.element[0].selectedIndex),n+=":not(.ui-state-disabled)"),s="first"===e||"last"===e?i["first"===e?"prevAll":"nextAll"](n).eq(-1):i[e+"All"](n).eq(0),s.length&&this.menuInstance.focus(t,s)},_getSelectedItem:function(){return this.menuItems.eq(this.element[0].selectedIndex)},_toggle:function(e){this[this.isOpen?"close":"open"](e)},_setSelection:function(){var e;this.range&&(window.getSelection?(e=window.getSelection(),e.removeAllRanges(),e.addRange(this.range)):this.range.select(),this.button.focus())},_documentClick:{mousedown:function(t){this.isOpen&&(e(t.target).closest(".ui-selectmenu-menu, #"+this.ids.button).length||this.close(t))}},_buttonEvents:{mousedown:function(){var e;window.getSelection?(e=window.getSelection(),e.rangeCount&&(this.range=e.getRangeAt(0))):this.range=document.selection.createRange()},click:function(e){this._setSelection(),this._toggle(e)},keydown:function(t){var i=!0;switch(t.keyCode){case e.ui.keyCode.TAB:case e.ui.keyCode.ESCAPE:this.close(t),i=!1;break;case e.ui.keyCode.ENTER:this.isOpen&&this._selectFocusedItem(t);break;case e.ui.keyCode.UP:t.altKey?this._toggle(t):this._move("prev",t);break;case e.ui.keyCode.DOWN:t.altKey?this._toggle(t):this._move("next",t);break;case e.ui.keyCode.SPACE:this.isOpen?this._selectFocusedItem(t):this._toggle(t);break;case e.ui.keyCode.LEFT:this._move("prev",t);break;case e.ui.keyCode.RIGHT:this._move("next",t);break;case e.ui.keyCode.HOME:case e.ui.keyCode.PAGE_UP:this._move("first",t);break;case e.ui.keyCode.END:case e.ui.keyCode.PAGE_DOWN:this._move("last",t);break;default:this.menu.trigger(t),i=!1}i&&t.preventDefault()}},_selectFocusedItem:function(e){var t=this.menuItems.eq(this.focusIndex);t.hasClass("ui-state-disabled")||this._select(t.data("ui-selectmenu-item"),e)},_select:function(e,t){var i=this.element[0].selectedIndex;this.element[0].selectedIndex=e.index,this._setText(this.buttonText,e.label),this._setAria(e),this._trigger("select",t,{item:e}),e.index!==i&&this._trigger("change",t,{item:e}),this.close(t)},_setAria:function(e){var t=this.menuItems.eq(e.index).attr("id");this.button.attr({"aria-labelledby":t,"aria-activedescendant":t}),this.menu.attr("aria-activedescendant",t)},_setOption:function(e,t){"icons"===e&&this.button.find("span.ui-icon").removeClass(this.options.icons.button).addClass(t.button),this._super(e,t),"appendTo"===e&&this.menuWrap.appendTo(this._appendTo()),"disabled"===e&&(this.menuInstance.option("disabled",t),this.button.toggleClass("ui-state-disabled",t).attr("aria-disabled",t),this.element.prop("disabled",t),t?(this.button.attr("tabindex",-1),this.close()):this.button.attr("tabindex",0)),"width"===e&&this._resizeButton()},_appendTo:function(){var t=this.options.appendTo;return t&&(t=t.jquery||t.nodeType?e(t):this.document.find(t).eq(0)),t&&t[0]||(t=this.element.closest(".ui-front")),t.length||(t=this.document[0].body),t},_toggleAttr:function(){this.button.toggleClass("ui-corner-top",this.isOpen).toggleClass("ui-corner-all",!this.isOpen).attr("aria-expanded",this.isOpen),this.menuWrap.toggleClass("ui-selectmenu-open",this.isOpen),this.menu.attr("aria-hidden",!this.isOpen)},_resizeButton:function(){var e=this.options.width;e||(e=this.element.show().outerWidth(),this.element.hide()),this.button.outerWidth(e)},_resizeMenu:function(){this.menu.outerWidth(Math.max(this.button.outerWidth(),this.menu.width("").outerWidth()+1))},_getCreateOptions:function(){return{disabled:this.element.prop("disabled")}},_parseOptions:function(t){var i=[];t.each(function(t,s){var n=e(s),a=n.parent("optgroup");i.push({element:n,index:t,value:n.val(),label:n.text(),optgroup:a.attr("label")||"",disabled:a.prop("disabled")||n.prop("disabled")})}),this.items=i},_destroy:function(){this.menuWrap.remove(),this.button.remove(),this.element.show(),this.element.removeUniqueId(),this.label.attr("for",this.ids.element)}}),e.widget("ui.slider",e.ui.mouse,{version:"1.11.4",widgetEventPrefix:"slide",options:{animate:!1,distance:0,max:100,min:0,orientation:"horizontal",range:!1,step:1,value:0,values:null,change:null,slide:null,start:null,stop:null},numPages:5,_create:function(){this._keySliding=!1,this._mouseSliding=!1,this._animateOff=!0,this._handleIndex=null,this._detectOrientation(),this._mouseInit(),this._calculateNewMax(),this.element.addClass("ui-slider ui-slider-"+this.orientation+" ui-widget"+" ui-widget-content"+" ui-corner-all"),this._refresh(),this._setOption("disabled",this.options.disabled),this._animateOff=!1},_refresh:function(){this._createRange(),this._createHandles(),this._setupEvents(),this._refreshValue()},_createHandles:function(){var t,i,s=this.options,n=this.element.find(".ui-slider-handle").addClass("ui-state-default ui-corner-all"),a="<span class='ui-slider-handle ui-state-default ui-corner-all' tabindex='0'></span>",o=[];for(i=s.values&&s.values.length||1,n.length>i&&(n.slice(i).remove(),n=n.slice(0,i)),t=n.length;i>t;t++)o.push(a);this.handles=n.add(e(o.join("")).appendTo(this.element)),this.handle=this.handles.eq(0),this.handles.each(function(t){e(this).data("ui-slider-handle-index",t)})},_createRange:function(){var t=this.options,i="";t.range?(t.range===!0&&(t.values?t.values.length&&2!==t.values.length?t.values=[t.values[0],t.values[0]]:e.isArray(t.values)&&(t.values=t.values.slice(0)):t.values=[this._valueMin(),this._valueMin()]),this.range&&this.range.length?this.range.removeClass("ui-slider-range-min ui-slider-range-max").css({left:"",bottom:""}):(this.range=e("<div></div>").appendTo(this.element),i="ui-slider-range ui-widget-header ui-corner-all"),this.range.addClass(i+("min"===t.range||"max"===t.range?" ui-slider-range-"+t.range:""))):(this.range&&this.range.remove(),this.range=null)},_setupEvents:function(){this._off(this.handles),this._on(this.handles,this._handleEvents),this._hoverable(this.handles),this._focusable(this.handles)},_destroy:function(){this.handles.remove(),this.range&&this.range.remove(),this.element.removeClass("ui-slider ui-slider-horizontal ui-slider-vertical ui-widget ui-widget-content ui-corner-all"),this._mouseDestroy()},_mouseCapture:function(t){var i,s,n,a,o,r,h,l,u=this,d=this.options;return d.disabled?!1:(this.elementSize={width:this.element.outerWidth(),height:this.element.outerHeight()},this.elementOffset=this.element.offset(),i={x:t.pageX,y:t.pageY},s=this._normValueFromMouse(i),n=this._valueMax()-this._valueMin()+1,this.handles.each(function(t){var i=Math.abs(s-u.values(t));(n>i||n===i&&(t===u._lastChangedValue||u.values(t)===d.min))&&(n=i,a=e(this),o=t)}),r=this._start(t,o),r===!1?!1:(this._mouseSliding=!0,this._handleIndex=o,a.addClass("ui-state-active").focus(),h=a.offset(),l=!e(t.target).parents().addBack().is(".ui-slider-handle"),this._clickOffset=l?{left:0,top:0}:{left:t.pageX-h.left-a.width()/2,top:t.pageY-h.top-a.height()/2-(parseInt(a.css("borderTopWidth"),10)||0)-(parseInt(a.css("borderBottomWidth"),10)||0)+(parseInt(a.css("marginTop"),10)||0)},this.handles.hasClass("ui-state-hover")||this._slide(t,o,s),this._animateOff=!0,!0))},_mouseStart:function(){return!0},_mouseDrag:function(e){var t={x:e.pageX,y:e.pageY},i=this._normValueFromMouse(t);return this._slide(e,this._handleIndex,i),!1},_mouseStop:function(e){return this.handles.removeClass("ui-state-active"),this._mouseSliding=!1,this._stop(e,this._handleIndex),this._change(e,this._handleIndex),this._handleIndex=null,this._clickOffset=null,this._animateOff=!1,!1},_detectOrientation:function(){this.orientation="vertical"===this.options.orientation?"vertical":"horizontal"},_normValueFromMouse:function(e){var t,i,s,n,a;return"horizontal"===this.orientation?(t=this.elementSize.width,i=e.x-this.elementOffset.left-(this._clickOffset?this._clickOffset.left:0)):(t=this.elementSize.height,i=e.y-this.elementOffset.top-(this._clickOffset?this._clickOffset.top:0)),s=i/t,s>1&&(s=1),0>s&&(s=0),"vertical"===this.orientation&&(s=1-s),n=this._valueMax()-this._valueMin(),a=this._valueMin()+s*n,this._trimAlignValue(a)},_start:function(e,t){var i={handle:this.handles[t],value:this.value()};return this.options.values&&this.options.values.length&&(i.value=this.values(t),i.values=this.values()),this._trigger("start",e,i)},_slide:function(e,t,i){var s,n,a;this.options.values&&this.options.values.length?(s=this.values(t?0:1),2===this.options.values.length&&this.options.range===!0&&(0===t&&i>s||1===t&&s>i)&&(i=s),i!==this.values(t)&&(n=this.values(),n[t]=i,a=this._trigger("slide",e,{handle:this.handles[t],value:i,values:n}),s=this.values(t?0:1),a!==!1&&this.values(t,i))):i!==this.value()&&(a=this._trigger("slide",e,{handle:this.handles[t],value:i}),a!==!1&&this.value(i))},_stop:function(e,t){var i={handle:this.handles[t],value:this.value()};this.options.values&&this.options.values.length&&(i.value=this.values(t),i.values=this.values()),this._trigger("stop",e,i)},_change:function(e,t){if(!this._keySliding&&!this._mouseSliding){var i={handle:this.handles[t],value:this.value()};this.options.values&&this.options.values.length&&(i.value=this.values(t),i.values=this.values()),this._lastChangedValue=t,this._trigger("change",e,i)}},value:function(e){return arguments.length?(this.options.value=this._trimAlignValue(e),this._refreshValue(),this._change(null,0),void 0):this._value()},values:function(t,i){var s,n,a;if(arguments.length>1)return this.options.values[t]=this._trimAlignValue(i),this._refreshValue(),this._change(null,t),void 0;if(!arguments.length)return this._values();if(!e.isArray(arguments[0]))return this.options.values&&this.options.values.length?this._values(t):this.value();for(s=this.options.values,n=arguments[0],a=0;s.length>a;a+=1)s[a]=this._trimAlignValue(n[a]),this._change(null,a);this._refreshValue()},_setOption:function(t,i){var s,n=0;switch("range"===t&&this.options.range===!0&&("min"===i?(this.options.value=this._values(0),this.options.values=null):"max"===i&&(this.options.value=this._values(this.options.values.length-1),this.options.values=null)),e.isArray(this.options.values)&&(n=this.options.values.length),"disabled"===t&&this.element.toggleClass("ui-state-disabled",!!i),this._super(t,i),t){case"orientation":this._detectOrientation(),this.element.removeClass("ui-slider-horizontal ui-slider-vertical").addClass("ui-slider-"+this.orientation),this._refreshValue(),this.handles.css("horizontal"===i?"bottom":"left","");break;case"value":this._animateOff=!0,this._refreshValue(),this._change(null,0),this._animateOff=!1;break;case"values":for(this._animateOff=!0,this._refreshValue(),s=0;n>s;s+=1)this._change(null,s);this._animateOff=!1;break;case"step":case"min":case"max":this._animateOff=!0,this._calculateNewMax(),this._refreshValue(),this._animateOff=!1;break;case"range":this._animateOff=!0,this._refresh(),this._animateOff=!1}},_value:function(){var e=this.options.value;return e=this._trimAlignValue(e)},_values:function(e){var t,i,s;if(arguments.length)return t=this.options.values[e],t=this._trimAlignValue(t);if(this.options.values&&this.options.values.length){for(i=this.options.values.slice(),s=0;i.length>s;s+=1)i[s]=this._trimAlignValue(i[s]);return i}return[]},_trimAlignValue:function(e){if(this._valueMin()>=e)return this._valueMin();if(e>=this._valueMax())return this._valueMax();var t=this.options.step>0?this.options.step:1,i=(e-this._valueMin())%t,s=e-i;return 2*Math.abs(i)>=t&&(s+=i>0?t:-t),parseFloat(s.toFixed(5))},_calculateNewMax:function(){var e=this.options.max,t=this._valueMin(),i=this.options.step,s=Math.floor(+(e-t).toFixed(this._precision())/i)*i;e=s+t,this.max=parseFloat(e.toFixed(this._precision()))},_precision:function(){var e=this._precisionOf(this.options.step);return null!==this.options.min&&(e=Math.max(e,this._precisionOf(this.options.min))),e},_precisionOf:function(e){var t=""+e,i=t.indexOf(".");return-1===i?0:t.length-i-1},_valueMin:function(){return this.options.min},_valueMax:function(){return this.max},_refreshValue:function(){var t,i,s,n,a,o=this.options.range,r=this.options,h=this,l=this._animateOff?!1:r.animate,u={};this.options.values&&this.options.values.length?this.handles.each(function(s){i=100*((h.values(s)-h._valueMin())/(h._valueMax()-h._valueMin())),u["horizontal"===h.orientation?"left":"bottom"]=i+"%",e(this).stop(1,1)[l?"animate":"css"](u,r.animate),h.options.range===!0&&("horizontal"===h.orientation?(0===s&&h.range.stop(1,1)[l?"animate":"css"]({left:i+"%"},r.animate),1===s&&h.range[l?"animate":"css"]({width:i-t+"%"},{queue:!1,duration:r.animate})):(0===s&&h.range.stop(1,1)[l?"animate":"css"]({bottom:i+"%"},r.animate),1===s&&h.range[l?"animate":"css"]({height:i-t+"%"},{queue:!1,duration:r.animate}))),t=i}):(s=this.value(),n=this._valueMin(),a=this._valueMax(),i=a!==n?100*((s-n)/(a-n)):0,u["horizontal"===this.orientation?"left":"bottom"]=i+"%",this.handle.stop(1,1)[l?"animate":"css"](u,r.animate),"min"===o&&"horizontal"===this.orientation&&this.range.stop(1,1)[l?"animate":"css"]({width:i+"%"},r.animate),"max"===o&&"horizontal"===this.orientation&&this.range[l?"animate":"css"]({width:100-i+"%"},{queue:!1,duration:r.animate}),"min"===o&&"vertical"===this.orientation&&this.range.stop(1,1)[l?"animate":"css"]({height:i+"%"},r.animate),"max"===o&&"vertical"===this.orientation&&this.range[l?"animate":"css"]({height:100-i+"%"},{queue:!1,duration:r.animate}))},_handleEvents:{keydown:function(t){var i,s,n,a,o=e(t.target).data("ui-slider-handle-index");switch(t.keyCode){case e.ui.keyCode.HOME:case e.ui.keyCode.END:case e.ui.keyCode.PAGE_UP:case e.ui.keyCode.PAGE_DOWN:case e.ui.keyCode.UP:case e.ui.keyCode.RIGHT:case e.ui.keyCode.DOWN:case e.ui.keyCode.LEFT:if(t.preventDefault(),!this._keySliding&&(this._keySliding=!0,e(t.target).addClass("ui-state-active"),i=this._start(t,o),i===!1))return}switch(a=this.options.step,s=n=this.options.values&&this.options.values.length?this.values(o):this.value(),t.keyCode){case e.ui.keyCode.HOME:n=this._valueMin();break;case e.ui.keyCode.END:n=this._valueMax();break;case e.ui.keyCode.PAGE_UP:n=this._trimAlignValue(s+(this._valueMax()-this._valueMin())/this.numPages);break;case e.ui.keyCode.PAGE_DOWN:n=this._trimAlignValue(s-(this._valueMax()-this._valueMin())/this.numPages);break;case e.ui.keyCode.UP:case e.ui.keyCode.RIGHT:if(s===this._valueMax())return;n=this._trimAlignValue(s+a);break;case e.ui.keyCode.DOWN:case e.ui.keyCode.LEFT:if(s===this._valueMin())return;n=this._trimAlignValue(s-a)}this._slide(t,o,n)},keyup:function(t){var i=e(t.target).data("ui-slider-handle-index");this._keySliding&&(this._keySliding=!1,this._stop(t,i),this._change(t,i),e(t.target).removeClass("ui-state-active"))}}}),e.widget("ui.spinner",{version:"1.11.4",defaultElement:"<input>",widgetEventPrefix:"spin",options:{culture:null,icons:{down:"ui-icon-triangle-1-s",up:"ui-icon-triangle-1-n"},incremental:!0,max:null,min:null,numberFormat:null,page:10,step:1,change:null,spin:null,start:null,stop:null},_create:function(){this._setOption("max",this.options.max),this._setOption("min",this.options.min),this._setOption("step",this.options.step),""!==this.value()&&this._value(this.element.val(),!0),this._draw(),this._on(this._events),this._refresh(),this._on(this.window,{beforeunload:function(){this.element.removeAttr("autocomplete")}})},_getCreateOptions:function(){var t={},i=this.element;return e.each(["min","max","step"],function(e,s){var n=i.attr(s);void 0!==n&&n.length&&(t[s]=n)}),t},_events:{keydown:function(e){this._start(e)&&this._keydown(e)&&e.preventDefault()},keyup:"_stop",focus:function(){this.previous=this.element.val()},blur:function(e){return this.cancelBlur?(delete this.cancelBlur,void 0):(this._stop(),this._refresh(),this.previous!==this.element.val()&&this._trigger("change",e),void 0)},mousewheel:function(e,t){if(t){if(!this.spinning&&!this._start(e))return!1;this._spin((t>0?1:-1)*this.options.step,e),clearTimeout(this.mousewheelTimer),this.mousewheelTimer=this._delay(function(){this.spinning&&this._stop(e)},100),e.preventDefault()}},"mousedown .ui-spinner-button":function(t){function i(){var e=this.element[0]===this.document[0].activeElement;e||(this.element.focus(),this.previous=s,this._delay(function(){this.previous=s}))}var s;s=this.element[0]===this.document[0].activeElement?this.previous:this.element.val(),t.preventDefault(),i.call(this),this.cancelBlur=!0,this._delay(function(){delete this.cancelBlur,i.call(this)}),this._start(t)!==!1&&this._repeat(null,e(t.currentTarget).hasClass("ui-spinner-up")?1:-1,t)},"mouseup .ui-spinner-button":"_stop","mouseenter .ui-spinner-button":function(t){return e(t.currentTarget).hasClass("ui-state-active")?this._start(t)===!1?!1:(this._repeat(null,e(t.currentTarget).hasClass("ui-spinner-up")?1:-1,t),void 0):void 0},"mouseleave .ui-spinner-button":"_stop"},_draw:function(){var e=this.uiSpinner=this.element.addClass("ui-spinner-input").attr("autocomplete","off").wrap(this._uiSpinnerHtml()).parent().append(this._buttonHtml());this.element.attr("role","spinbutton"),this.buttons=e.find(".ui-spinner-button").attr("tabIndex",-1).button().removeClass("ui-corner-all"),this.buttons.height()>Math.ceil(.5*e.height())&&e.height()>0&&e.height(e.height()),this.options.disabled&&this.disable()
},_keydown:function(t){var i=this.options,s=e.ui.keyCode;switch(t.keyCode){case s.UP:return this._repeat(null,1,t),!0;case s.DOWN:return this._repeat(null,-1,t),!0;case s.PAGE_UP:return this._repeat(null,i.page,t),!0;case s.PAGE_DOWN:return this._repeat(null,-i.page,t),!0}return!1},_uiSpinnerHtml:function(){return"<span class='ui-spinner ui-widget ui-widget-content ui-corner-all'></span>"},_buttonHtml:function(){return"<a class='ui-spinner-button ui-spinner-up ui-corner-tr'><span class='ui-icon "+this.options.icons.up+"'>&#9650;</span>"+"</a>"+"<a class='ui-spinner-button ui-spinner-down ui-corner-br'>"+"<span class='ui-icon "+this.options.icons.down+"'>&#9660;</span>"+"</a>"},_start:function(e){return this.spinning||this._trigger("start",e)!==!1?(this.counter||(this.counter=1),this.spinning=!0,!0):!1},_repeat:function(e,t,i){e=e||500,clearTimeout(this.timer),this.timer=this._delay(function(){this._repeat(40,t,i)},e),this._spin(t*this.options.step,i)},_spin:function(e,t){var i=this.value()||0;this.counter||(this.counter=1),i=this._adjustValue(i+e*this._increment(this.counter)),this.spinning&&this._trigger("spin",t,{value:i})===!1||(this._value(i),this.counter++)},_increment:function(t){var i=this.options.incremental;return i?e.isFunction(i)?i(t):Math.floor(t*t*t/5e4-t*t/500+17*t/200+1):1},_precision:function(){var e=this._precisionOf(this.options.step);return null!==this.options.min&&(e=Math.max(e,this._precisionOf(this.options.min))),e},_precisionOf:function(e){var t=""+e,i=t.indexOf(".");return-1===i?0:t.length-i-1},_adjustValue:function(e){var t,i,s=this.options;return t=null!==s.min?s.min:0,i=e-t,i=Math.round(i/s.step)*s.step,e=t+i,e=parseFloat(e.toFixed(this._precision())),null!==s.max&&e>s.max?s.max:null!==s.min&&s.min>e?s.min:e},_stop:function(e){this.spinning&&(clearTimeout(this.timer),clearTimeout(this.mousewheelTimer),this.counter=0,this.spinning=!1,this._trigger("stop",e))},_setOption:function(e,t){if("culture"===e||"numberFormat"===e){var i=this._parse(this.element.val());return this.options[e]=t,this.element.val(this._format(i)),void 0}("max"===e||"min"===e||"step"===e)&&"string"==typeof t&&(t=this._parse(t)),"icons"===e&&(this.buttons.first().find(".ui-icon").removeClass(this.options.icons.up).addClass(t.up),this.buttons.last().find(".ui-icon").removeClass(this.options.icons.down).addClass(t.down)),this._super(e,t),"disabled"===e&&(this.widget().toggleClass("ui-state-disabled",!!t),this.element.prop("disabled",!!t),this.buttons.button(t?"disable":"enable"))},_setOptions:h(function(e){this._super(e)}),_parse:function(e){return"string"==typeof e&&""!==e&&(e=window.Globalize&&this.options.numberFormat?Globalize.parseFloat(e,10,this.options.culture):+e),""===e||isNaN(e)?null:e},_format:function(e){return""===e?"":window.Globalize&&this.options.numberFormat?Globalize.format(e,this.options.numberFormat,this.options.culture):e},_refresh:function(){this.element.attr({"aria-valuemin":this.options.min,"aria-valuemax":this.options.max,"aria-valuenow":this._parse(this.element.val())})},isValid:function(){var e=this.value();return null===e?!1:e===this._adjustValue(e)},_value:function(e,t){var i;""!==e&&(i=this._parse(e),null!==i&&(t||(i=this._adjustValue(i)),e=this._format(i))),this.element.val(e),this._refresh()},_destroy:function(){this.element.removeClass("ui-spinner-input").prop("disabled",!1).removeAttr("autocomplete").removeAttr("role").removeAttr("aria-valuemin").removeAttr("aria-valuemax").removeAttr("aria-valuenow"),this.uiSpinner.replaceWith(this.element)},stepUp:h(function(e){this._stepUp(e)}),_stepUp:function(e){this._start()&&(this._spin((e||1)*this.options.step),this._stop())},stepDown:h(function(e){this._stepDown(e)}),_stepDown:function(e){this._start()&&(this._spin((e||1)*-this.options.step),this._stop())},pageUp:h(function(e){this._stepUp((e||1)*this.options.page)}),pageDown:h(function(e){this._stepDown((e||1)*this.options.page)}),value:function(e){return arguments.length?(h(this._value).call(this,e),void 0):this._parse(this.element.val())},widget:function(){return this.uiSpinner}}),e.widget("ui.tooltip",{version:"1.11.4",options:{content:function(){var t=e(this).attr("title")||"";return e("<a>").text(t).html()},hide:!0,items:"[title]:not([disabled])",position:{my:"left top+15",at:"left bottom",collision:"flipfit flip"},show:!0,tooltipClass:null,track:!1,close:null,open:null},_addDescribedBy:function(t,i){var s=(t.attr("aria-describedby")||"").split(/\s+/);s.push(i),t.data("ui-tooltip-id",i).attr("aria-describedby",e.trim(s.join(" ")))},_removeDescribedBy:function(t){var i=t.data("ui-tooltip-id"),s=(t.attr("aria-describedby")||"").split(/\s+/),n=e.inArray(i,s);-1!==n&&s.splice(n,1),t.removeData("ui-tooltip-id"),s=e.trim(s.join(" ")),s?t.attr("aria-describedby",s):t.removeAttr("aria-describedby")},_create:function(){this._on({mouseover:"open",focusin:"open"}),this.tooltips={},this.parents={},this.options.disabled&&this._disable(),this.liveRegion=e("<div>").attr({role:"log","aria-live":"assertive","aria-relevant":"additions"}).addClass("ui-helper-hidden-accessible").appendTo(this.document[0].body)},_setOption:function(t,i){var s=this;return"disabled"===t?(this[i?"_disable":"_enable"](),this.options[t]=i,void 0):(this._super(t,i),"content"===t&&e.each(this.tooltips,function(e,t){s._updateContent(t.element)}),void 0)},_disable:function(){var t=this;e.each(this.tooltips,function(i,s){var n=e.Event("blur");n.target=n.currentTarget=s.element[0],t.close(n,!0)}),this.element.find(this.options.items).addBack().each(function(){var t=e(this);t.is("[title]")&&t.data("ui-tooltip-title",t.attr("title")).removeAttr("title")})},_enable:function(){this.element.find(this.options.items).addBack().each(function(){var t=e(this);t.data("ui-tooltip-title")&&t.attr("title",t.data("ui-tooltip-title"))})},open:function(t){var i=this,s=e(t?t.target:this.element).closest(this.options.items);s.length&&!s.data("ui-tooltip-id")&&(s.attr("title")&&s.data("ui-tooltip-title",s.attr("title")),s.data("ui-tooltip-open",!0),t&&"mouseover"===t.type&&s.parents().each(function(){var t,s=e(this);s.data("ui-tooltip-open")&&(t=e.Event("blur"),t.target=t.currentTarget=this,i.close(t,!0)),s.attr("title")&&(s.uniqueId(),i.parents[this.id]={element:this,title:s.attr("title")},s.attr("title",""))}),this._registerCloseHandlers(t,s),this._updateContent(s,t))},_updateContent:function(e,t){var i,s=this.options.content,n=this,a=t?t.type:null;return"string"==typeof s?this._open(t,e,s):(i=s.call(e[0],function(i){n._delay(function(){e.data("ui-tooltip-open")&&(t&&(t.type=a),this._open(t,e,i))})}),i&&this._open(t,e,i),void 0)},_open:function(t,i,s){function n(e){l.of=e,o.is(":hidden")||o.position(l)}var a,o,r,h,l=e.extend({},this.options.position);if(s){if(a=this._find(i))return a.tooltip.find(".ui-tooltip-content").html(s),void 0;i.is("[title]")&&(t&&"mouseover"===t.type?i.attr("title",""):i.removeAttr("title")),a=this._tooltip(i),o=a.tooltip,this._addDescribedBy(i,o.attr("id")),o.find(".ui-tooltip-content").html(s),this.liveRegion.children().hide(),s.clone?(h=s.clone(),h.removeAttr("id").find("[id]").removeAttr("id")):h=s,e("<div>").html(h).appendTo(this.liveRegion),this.options.track&&t&&/^mouse/.test(t.type)?(this._on(this.document,{mousemove:n}),n(t)):o.position(e.extend({of:i},this.options.position)),o.hide(),this._show(o,this.options.show),this.options.show&&this.options.show.delay&&(r=this.delayedShow=setInterval(function(){o.is(":visible")&&(n(l.of),clearInterval(r))},e.fx.interval)),this._trigger("open",t,{tooltip:o})}},_registerCloseHandlers:function(t,i){var s={keyup:function(t){if(t.keyCode===e.ui.keyCode.ESCAPE){var s=e.Event(t);s.currentTarget=i[0],this.close(s,!0)}}};i[0]!==this.element[0]&&(s.remove=function(){this._removeTooltip(this._find(i).tooltip)}),t&&"mouseover"!==t.type||(s.mouseleave="close"),t&&"focusin"!==t.type||(s.focusout="close"),this._on(!0,i,s)},close:function(t){var i,s=this,n=e(t?t.currentTarget:this.element),a=this._find(n);return a?(i=a.tooltip,a.closing||(clearInterval(this.delayedShow),n.data("ui-tooltip-title")&&!n.attr("title")&&n.attr("title",n.data("ui-tooltip-title")),this._removeDescribedBy(n),a.hiding=!0,i.stop(!0),this._hide(i,this.options.hide,function(){s._removeTooltip(e(this))}),n.removeData("ui-tooltip-open"),this._off(n,"mouseleave focusout keyup"),n[0]!==this.element[0]&&this._off(n,"remove"),this._off(this.document,"mousemove"),t&&"mouseleave"===t.type&&e.each(this.parents,function(t,i){e(i.element).attr("title",i.title),delete s.parents[t]}),a.closing=!0,this._trigger("close",t,{tooltip:i}),a.hiding||(a.closing=!1)),void 0):(n.removeData("ui-tooltip-open"),void 0)},_tooltip:function(t){var i=e("<div>").attr("role","tooltip").addClass("ui-tooltip ui-widget ui-corner-all ui-widget-content "+(this.options.tooltipClass||"")),s=i.uniqueId().attr("id");return e("<div>").addClass("ui-tooltip-content").appendTo(i),i.appendTo(this.document[0].body),this.tooltips[s]={element:t,tooltip:i}},_find:function(e){var t=e.data("ui-tooltip-id");return t?this.tooltips[t]:null},_removeTooltip:function(e){e.remove(),delete this.tooltips[e.attr("id")]},_destroy:function(){var t=this;e.each(this.tooltips,function(i,s){var n=e.Event("blur"),a=s.element;n.target=n.currentTarget=a[0],t.close(n,!0),e("#"+i).remove(),a.data("ui-tooltip-title")&&(a.attr("title")||a.attr("title",a.data("ui-tooltip-title")),a.removeData("ui-tooltip-title"))}),this.liveRegion.remove()}})});//download.js v4.1, by dandavis; 2008-2015. [CCBY2] see http://danml.com/download.html for tests/usage
(function(q,k){"function"==typeof define&&define.amd?define([],k):"object"==typeof exports?module.exports=k():q.download=k()})(this,function(){return function k(b,c,e){function r(n){var a=n.split(/[:;,]/);n=a[1];var a=("base64"==a[2]?atob:decodeURIComponent)(a.pop()),b=a.length,d=0,c=new Uint8Array(b);for(d;d<b;++d)c[d]=a.charCodeAt(d);return new g([c],{type:n})}function l(a,b){if("download"in d)return d.href=a,d.setAttribute("download",m),d.className="download-js-link",d.innerHTML="downloading...",h.body.appendChild(d),setTimeout(function(){d.click(),h.body.removeChild(d),!0===b&&setTimeout(function(){f.URL.revokeObjectURL(d.href)},250)},66),!0;if("undefined"!=typeof safari)return a="data:"+a.replace(/^data:([\w\/\-\+]+)/,"application/octet-stream"),!window.open(a)&&confirm("Displaying New Document\n\nUse Save As... to download, then click back to return to this page.")&&(location.href=a),!0;var c=h.createElement("iframe");h.body.appendChild(c),b||(a="data:"+a.replace(/^data:([\w\/\-\+]+)/,"application/octet-stream")),c.src=a,setTimeout(function(){h.body.removeChild(c)},333)}var f=window,a=e||"application/octet-stream";e=!c&&!e&&b;var h=document,d=h.createElement("a"),p=function(a){return String(a)},g=f.Blob||f.MozBlob||f.WebKitBlob||p,m=c||"download",g=g.call?g.bind(f):Blob;"true"===String(this)&&(b=[b,a],a=b[0],b=b[1]);if(e&&2048>e.length&&(m=e.split("/").pop().split("?")[0],d.href=e,-1!==d.href.indexOf(e)))return a=new XMLHttpRequest,a.open("GET",e,!0),a.responseType="blob",a.onload=function(a){k(a.target.response,m,"application/octet-stream")},a.send(),a;if(/^data\:[\w+\-]+\/[\w+\-]+[,;]/.test(b))return navigator.msSaveBlob?navigator.msSaveBlob(r(b),m):l(b);c=b instanceof g?b:new g([b],{type:a});if(navigator.msSaveBlob)return navigator.msSaveBlob(c,m);if(f.URL)l(f.URL.createObjectURL(c),!0);else{if("string"==typeof c||c.constructor===p)try{return l("data:"+a+";base64,"+f.btoa(c))}catch(n){return l("data:"+a+","+encodeURIComponent(c))}a=new FileReader,a.onload=function(a){l(this.result)},a.readAsDataURL(c)}return!0}});
/*global ga:true*/
// javascript Camp Barakel menus & misc.

var CBMod = {
	cbLinks: [ // Main menu.
		{ name: 'Home', bhtm: '/', menu: false },
		{ name: 'Camps & Retreats', bhtm: '/events', menu:
			[['Schedule', '/events'],
			['Children', '/events/kids'],
			['Teens', '/events/teens'],
			['Adults', '/events/adults'],
			['Chapel Podcasts', '/chapel-messages'],
			['Special Needs', '/special-needs']]
		},
		//Contents for the "About" menu.
		{ name: 'About', bhtm: '/about-us', menu:
			[['Tour', '/camp-tour'],
			['Directions', '/directions'],
			['Forms', '/forms'],
			['About', '/about-us'],
			['Contact', '/contact'],
			['History', '/heritage'],
			['News & Events', '/news'],
			['Encouragement', '/encouragement']]
		},
		//Contents for "Staff" menu.
		{ name: 'Staff', bhtm: '/staff', menu:
			[['Resident', '/staff'],
			['High School', '/staff/high-school-staff'],
			['College', '/staff/college-age-staff'],
			['Adult', '/staff/adult'],
			['Work Groups', '/staff/work-groups'],
			['Prayer', '/prayer']]
		},
		//Contents for "S'More" menu.
		{ name: 'S&rsquo;More', bhtm: '/smore/pictures', menu:
			[['Pictures','/smore/pictures'],
			['Wallpaper','/wallpaper'],
			['Song List','/song-list'],
			['Camp Song','/camp-barakel-song'],
			['Barakel Book','/book-miracle']]
		}
	],

	cbMonList: [ 'Jan', 'Feb', 'Mar',
		'Apr', 'May', 'Jun',
		'Jul', 'Aug', 'Sep',
		'Oct', 'Nov', 'Dec'
	],
	nextBannerPhotoImg: false,
	mainLakePic: '/pics/LakeWinter.jpg',

	// This section is for the rotating banners.
	currentBannerPhotoNum: -1, // -1 means we're showing the original one.
	logoGIF: "<img src='/pics/cblogo.gif' border=0 alt='Camp Barakel Logo' >",
	// try to get SVG logo from server and put it
	// in el.innerHTML.
	// on error or otherwise, fill it with GIF logo.
	getSVGLogo: function getSVGLogo(el, cbSuccess) {
		_CB.get('/pics/cb_logo16op-p.svg', function(d) {
			el.innerHTML = _CB.wghbMsg + d;
			if (cbSuccess) { cbSuccess(); }
		}, function() {
			console.log('error getting SVG');
			el.innerHTML = _CB.logoGIF;
		})
	},
	// get logo and banner set up on the page.
	// don't have to wait for everything to be loaded
	// to do this.
	setupHeader: function setupHeader() {
		var ua = navigator.userAgent;
		document.documentElement.setAttribute(
			'data-useragent',  ua);

		var logo = _CB.ge('cb_logotbl');
		if (logo && !/\S/.test(logo.innerHTML))
		{
			logo.innerHTML = "<div><a href='/' title='Camp Barakel Home'>" +
				"</a></div>" +
				(screen.width > 520 ?
				"<div id='lakepic_div'><img src='" +
				_CB.mainLakePic + "' alt='Shear Lake - Camp Barakel' id='lakepic'" +
				" onload='lakepicloaded()'" +
				"></div>" : '');

			var l1 = logo.querySelector('div a');
			var svg2 = _CB.ge('logo_svg2');
			if (svg2 && /svg/i.test(svg2.tagName)) {
				// inline SVG already on the page as logo_svg2.
				// put it in its place in cb_logotbl.
				l1.innerHTML = _CB.wghbMsg;
				l1.appendChild(svg2);
			} else {
				// no inline SVG logo.
				_CB.getSVGLogo(l1);
			}
		}
		var menuTbl = _CB.ge('cbMenuTableId');
		if (menuTbl && !/\S/.test(menuTbl.innerHTML))
		{
			// fill in the menu.
			menuTbl.innerHTML = [
				"<div id='dropmenudiv' class='hidden'></div><table id='cbMT' align=center><TR>",
				_CB.cbLinks.map(function(val) {
					return "<td>" + val.name + "</td>";
				}).join(''),
				"</TR></table>"
			].join('');

			// add menu events.
			dropmenuobj= _CB.ge("dropmenudiv");
			dropmenuobj.onmouseover = clearhidemenu;
			dropmenuobj.onmouseout = dynamichide;
			_CB.nar(menuTbl.getElementsByTagName('TD'))
			.forEach(function(td, i) {
				td.cbMenu1 = _CB.cbLinks[i];
				td.onmouseover = mover;
				td.onmouseout = mout;
				td.onclick= mclick;
			})
		}

		// make .ssContTbl visible (hidden during init)
		var sscont = _CB.qs('.ssContTbl');
		if (sscont) {
			sscont.classList.add('s');
		}
	},
	// AJAX GET request.
	// with response from GET request uri.
	// call callback function cb on success after loading.
	get: function(uri, cb, cbErr)
	{
		var xhr = new XMLHttpRequest();
		xhr.open('GET', uri);
		xhr.onreadystatechange = function() {
			//ready?
			if (xhr.readyState != 4)
				return false;

			//maybe not successful?
			if (xhr.status != 200) {
				if (cbErr) { cbErr(xhr); }
				return false;
			}

			//Got result. All is well.
			if (cb) { cb(xhr.responseText); }
			return true;
		}
		xhr.send();
	},

	// AJAX GET request to fill in element id with response from GET request
	// uri. call callback function cb on success after loading.
	loadHTML: function (id, uri, cb)
	{
		function sid(t) { _CB.setHTML(id, t) }

		function loadErr(xhr) {
			sid('Request failed. ' + xhr.status);
		}
		function loadSuccess(t) {
			sid(t);
			if (cb) { cb(t); }
		}

		_CB.get(uri, loadSuccess, loadErr);
	},
	setHTML: function(id, content) {
		_CB.setEl(_CB.ge(id), content);
	},
	setEl: function(el, content) {
		if (el) {
			el.innerHTML = content;
		}
	},
	setqs: function(q, content) {
		_CB.setEl(_CB.qs(q), content);
	},
	zdt:  function zdt(d) {
		return new Date(d + 'Z');
	},
	forceSecure: function forceSecure() {
		// make sure we're on HTTPS if we are on campbarakel..
		let url = location;
		if (! /localhost/i.test(url.hostname)) {
			if ('https:' != url.protocol || 'www.campbarakel.org' != url.hostname) {
				location.href = 'https://www.campbarakel.org' + url.pathname + url.hash;
				return;
			}
		}
	},
	dateDiffMinutes : function dateDiffMinutes(d1, d2) {
		function decode(d) {
			if (d instanceof Date) {
				return d.getTime();
			}
			if (typeof d == "string") {
				return _CB.zdt(d);
			}
			return d;
		}
		return Math.round((decode(d2) - decode(d1))/60000);
	},
	dateDiffHours: function dateDiffHours(d1, d2) {
		return _CB.dateDiffMinutes(d1, d2) / 60;
	},
	dateDiffDays: function dateDiffDays(d1, d2) {
		return _CB.dateDiffMinutes(d1, d2) / 1440;
	},
	ge: function ge(id) {
		return document.getElementById(id);
	},
	qs: function qs(s) { return document.querySelector(s); },
	qsa: function qsa(s) { return document.querySelectorAll(s); },
	nar: function nar(col) {
		return Array.prototype.map.call(col, function(a) { return a });
	},
	append: function append(id, s) {
		var el = _CB.ge(id);
		if (el) {
			el.insertAdjacentHTML('beforeend', s);
		}
		return el;
	},
	// QuerySelectorAll, iterate to fn.
	qsafn: function qsafn(s, fn) {
		Array.prototype.forEach.call(
			document.querySelectorAll(s), fn);
	},
	wghbMsg: '<p class="wghb">&ldquo;Where God Has Blessed&rdquo;</p>',
	svgLogo: function() {
		return _CB.wghbMsg + '<svg id="logo_svg2"> <use xlink:href="/pics/cb_logo16op-p.svg#logo_svg2"></use> </svg>'
	},
	// expand embedded campshots found in selector s.
	csExpand: function csExpand(s) {
		_CB.qsafn(s + ' img[cs-src]', function(el) {
			var cssrc = el.getAttribute('cs-src');
			if (/^localhost$/i.test(location.hostname)) {
				cssrc = 'http://www.campbarakel.org' + cssrc;
			}
			// use smaller size if appropriate.
			// here we assume the smaller size exists..
			if (screen.width < 670 && screen.height < 670 &&
				cssrc.match(/(.+\/)(.+)$/)) {
				cssrc = RegExp.$1 + 'sm/' + RegExp.$2;
			}
			el.setAttribute('src', cssrc);
		});
	},
	/* look for IMG with attribute data-src and assume these
		* images are the basis for a PICTURE we will create.
		* a small version of the photo has suffix o.suffix and
		* a larger version has no suffix.
		*
		* expand based on HTML attributes in s */
	dsExpand: function(s) {
		var b = document.querySelector(s);
		if (!b) {
			return;
		}
		var size = 420; // default size
		var suf; // default suffix
		var dir = '.'; // default directory
		Array.prototype.forEach.call(
			b.querySelectorAll('img[data-src]:not([src])'),
			function(el) {
				function g(a, d) {
					return el.getAttribute(a) || d;
				}
				var src = g('data-src');
				size = g('data-size', size);
				suf = g('data-suffix', '_' + size);
				dir = g('data-dir', dir);

				var pc = '<picture>' +
					'<source srcset="' + dir + src + suf + '.jpg"' +
					' media="(max-width: ' + size + 'px)">' +
					'<img src="' + dir + src + '.jpg" />' +
					'</picture>';
				el.insertAdjacentHTML('afterend', pc);
				el.nextSibling.querySelector('img').className = el.className;
				el.parentNode.removeChild(el);
			}
		)
	},
	ready: addReadyFunction,
	matchCID: function matchCID(cid) {
		// predicate for matching cid on campevent_id.
		var re = new RegExp(cid, 'i');

		return function(el) {
			return re.test(el.campevent_id);
		}
	},
	edDateList: function edDateList(filterFn, bNoRegLink) {
		// filterFn is a predicate that takes events as an input.
		var dateLS = _CB.ed
			.filter(filterFn)
			.map(function(ev) {
				return '<span class="evtD">' +
					evDateRange(
						_CB.zdt(ev.start_date),
						_CB.zdt(ev.end_date), true) +
					(bNoRegLink ? '' : _CB.regLink(ev)) +
					'</span>';
			}).join('');
		if (! /register/.test(dateLS)) {
			dateLS = dateLS.replace(/evtD/g, 'evtDNR');
		}
		return dateLS;
	},
	regLink: function regLink(ev) {
		if (!ev.online_OK || !ev.available_space ||
			(ev.available_space - ev.wait_list) < 1) {
			return '';
		}

		if (_CB.dateDiffDays((new Date()), ev.start_date) <= 2) {
			return ''; // too near to the start date.
		}

		var theLink = '/register';
		if (!/^summ/i.test(ev.season)) {
			theLink += '#event/' + ev.campevent_id;
		}
		return ' &mdash; <a href="' + theLink + '"' +
			' title="Register On Line">[OnLine&nbsp;Reg]</a>';
	},
	// find first schedule event that matches cid.
	findEvent: function findEvent(cid) {
		var f = _CB.ed.filter(_CB.matchCID(cid));
		return f.length > 0 ? f[0] : null;
	},
	fillEvents: function fillEvents() {
		// fill in Camp Event data - name, dates, registration.
		// .eventHeadingDiv is where everything usually goes.
		var ehd = document.querySelector('.eventHeadingDiv');
		if (!ehd)
			return; // no 'Event' header.
		if (! /\S/.test(ehd.innerHTML)) {
			// blank means this event gets
			// the default treatment.
			var eventName = _CB.ed[0].name;
			if (eventName.match(/^(.*) #\d$/)) {
				eventName = RegExp.$1;
			}
			// . in ev-data will match all events in _CB.ed
			ehd.innerHTML = '<p id="eventNameP" class="pageHeader">' +
				eventName + '</p>' +
				'<p class="eventDateP">' +
				'<span class="eventDateList" ev-data="."></span>' +
				'<span class="eventPDF" ev-data="."></span>' +
				'</p>';
			document.title = eventName.replace(/&rsquo;/g, "'") + ' - Camp Barakel';
		}

		// fill in eventPin, Pin It button.
		if (!_CB.ge('eventPin')) {
			var en = _CB.ge('eventNameP');
			if (en) {
				en.insertAdjacentHTML('afterend',
					'<p id="eventPin">' +
					"<a href='//www.pinterest.com/pin/create/button/'" +
					" data-pin-do='buttonBookmark'  data-pin-height='28'>" +
					'<img src="//assets.pinterest.com/images/pidgets/pinit_fg_en_rect_gray_28.png" /></a>' +
					'<script async defer src="//assets.pinterest.com/js/pinit.js"></' +
					'script></p>')
			}
		}

		// fill in dates on "eventDateList" elements.
		// start with those that have an age.
		_CB.qsafn('.mainDiv .eventDateList[ev-data][ev-data-age]:empty', function(el) {

			var age = el.getAttribute('ev-data-age');
			var m = _CB.matchCID(el.getAttribute('ev-data'));
			function f(ev) {
				return m(ev) && ev.age && ev.age == age;
			}

			el.innerHTML = _CB.edDateList(f);
		});
		_CB.qsafn('.mainDiv .eventDateList[ev-data]:not([ev-data-age]):empty', function(el) {

			el.innerHTML = _CB.edDateList(
				_CB.matchCID(el.getAttribute('ev-data')));
		});

		// fill in registration PDF links and what to bring links
		// on "eventPDF" elements.
		_CB.qsafn('.mainDiv .eventPDF[ev-data]:empty', function(el) {

			var ev = _CB.findEvent(el.getAttribute('ev-data'));
			if (ev && ev.reg_form || ev.online_OK) {
				var rf = ev.reg_form ? ('<a class="mr2" href="' + ev.reg_form +
					'">[Registration Form]</a>') : '';
				var wtbf = '';
				if ((ev.online_OK || /family/i.test(ev.name)) &&
					!el.classList.contains('noWTB')) {
					// noWTB class means don't show What to Bring.
					wtbf = ev.wtbf ? (' <a href="' + ev.wtbf +
					'">[What to Bring]</a>') :
					' <span title="Check Back Later for What to Bring">[What to Bring - check later]</span>';
				}
				el.innerHTML = "<span class='rflnk'>" +
					rf + wtbf + '</span>';
			}
		});
	}
};
var _CB = CBMod; // shortcut
var strFadingImgID = 'lakepic';
var strFadingImgID2 = 'lakepic_hidden';
var strFadingImgDefault = _CB.mainLakePic;
var dropmenuobj;

addReadyFunction(loadCBContent);

/**  add function fn to be called when the DOM is loaded.
 *	@param {function} fn Function to be called.
 */
function addReadyFunction(fn)
{
	if (document.addEventListener)
	{
		document.addEventListener('DOMContentLoaded', fn);
	} else {
		if (document.attachEvent)
		{
			document.attachEvent('onreadystatechange', function() {
				if (document.readyState == 'complete') {
					fn();
				}
			});
		}
	}
}

// DOM loaded. set up the rest of the page.
function loadCBContent()
{
	var footPlace = _CB.ge('cbFP');
	if (footPlace && !footPlace.innerHTML.match(/\S/))
	{
		var tDate = new Date();
		footPlace.innerHTML = "<table id='cbFooterCopy1'><tr>" +
			"<td align='left'><p>&copy; " + tDate.getFullYear() +
			" Camp Barakel</p></td><td align='right'>" +
			"<p><a href='mailto:info@campbarakel.org'>" +
			"info@campbarakel.org</a></p></td></tr></table>";
	}

	// and initialize embedded campshots responsive pics.
	// check embedded campshots.
	_CB.csExpand('.mainDiv');

	_CB.dsExpand('.mainDiv');

	if ("ed" in _CB)
		_CB.fillEvents();

	// do google analytics.
	window.setTimeout(function() {
        let s = document.createElement('script');
        s.type = 'text/javascript';
        s.async = true;
        s.src = 'https://www.googletagmanager.com/gtag/js?id=G-7CC8D3MG4W';
        document.getElementsByTagName('head')[0].appendChild(s);
		function gtag() {
			window.dataLayer = window.dataLayer || [];
			window.dataLayer.push(arguments);
		}
        gtag('js', new Date());
        gtag('config', 'G-7CC8D3MG4W');
	}, 1000);
}

// lake pic is loaded.
// CSS has some things in an initialization state
// until after we add class "s" to cb_logotbl.
function lakepicloaded()
{
	var cbl = _CB.ge('cb_logotbl');
	if (cbl)
		cbl.classList.add('s');
}

// mouse goes over TD element
function mover(e)
{
	e = e || window.event;
	dropdownmenu(this, e);
}

// mouse goes out of TD element
function mout()
{
	delayhidemenu();
}

// mouse click on TD element
function mclick(e)
{
	e = e || window.event;
	var td = this;
	if (td.cbMenu1.menu) {
		// is there already a menu visible?
		// if this is a tablet and there is a mouse click
		// before dropdown, then we dropdown a menu here first.
		dropmenuobj= _CB.ge("dropmenudiv");
		if (dropmenuobj.style.visibility == 'hidden') {
			dropdownmenu(td, e);
		}
		return;
	}

	top.location.href = td.cbMenu1.bhtm;
}


/**  Setup for rotating photos.
 *   Called on page load.
 * */
function barakelPageLoaded()
{
	_CB.bannerList.allDone = false;
	loadNextBannerPhoto(5000);
}

// start the process of showing the next banner photo
function loadNextBannerPhoto(delayTime)
{
	if (_CB.bannerList.allDone || !_CB.ge(strFadingImgID2))
		return; // nothing to load into.

	_CB.nextBannerPhotoImg = new Image(485, 160);

	if (_CB.bannerList.length == 0)
	{
		// no more photos to display, so go back
		// to the original one.
		_CB.nextBannerPhotoImg.src = strFadingImgDefault;
		_CB.bannerList.allDone = true;
	}
	else
	{
		var next = Math.floor(Math.random() * _CB.bannerList.length);
		_CB.currentBannerPhotoNum = next;
		_CB.nextBannerPhotoImg.src = _CB.bannerDir + _CB.bannerList[next];

		// splice to remove this ('next') photo from the list
		_CB.bannerList.splice(next, 1);
	}

	window.setTimeout(showNextBannerPhoto, delayTime || 5000);
}

function showNextBannerPhoto()
{
	if (!_CB.nextBannerPhotoImg.complete)
	{
		window.setTimeout(showNextBannerPhoto, 1000);
		return;
	}

	var i2 = _CB.ge(strFadingImgID2);
	var i1 = _CB.ge(strFadingImgID);
	i2.setAttribute('src', _CB.nextBannerPhotoImg.src);
	i2.classList.add('fadeIn');
	window.setTimeout(function() {
		i1.setAttribute('src', _CB.nextBannerPhotoImg.src);
		i2.classList.remove('fadeIn');
		loadNextBannerPhoto();
	}, 1000)

	// fool with opacity.
}

function evDateRange(ds, de, bIncludeYear)
{
	// we use the .getUTCxxx functions here because the javascript date
	// objects are parsed in UTC timezone (by default).  it makes it
	// easier to just work with everything in UTC.
	var strBegin = _CB.cbMonList[ds.getUTCMonth()] + "&nbsp;" + ds.getUTCDate();
	//var strEnd = "&#8209;" + de.getUTCDate();
	var strEnd = '-' + de.getUTCDate();
	if (ds.getUTCMonth() != de.getUTCMonth()){
		strEnd = " - " + _CB.cbMonList[de.getUTCMonth()] + "&nbsp;" + de.getUTCDate();
	}
	var rv = strBegin;
	if (ds.getUTCDate() != de.getUTCDate() ||
		ds.getUTCMonth() != de.getUTCMonth())
	{
		rv += strEnd;
	}
	if (bIncludeYear)
	{
		rv += ", " + de.getUTCFullYear();
	}
	return rv;
}

/***********************************************
* AnyLink Drop Down Menu- ? Dynamic Drive (www.dynamicdrive.com)
* This notice MUST stay intact for legal use
* Visit http://www.dynamicdrive.com/ for full source code
***********************************************/
var disappeardelay= 100;  //menu disappear speed onMouseout (in miliseconds)
var hidemenu_onclick="no"; //hide menu when user clicks within menu?
var delayhide;

/////No further editing needed

var ie4=document.all;
var ns6=document.getElementById&&!document.all;

function getposOffset(what, offsettype){
	var totaloffset=(offsettype=="left")? what.offsetLeft : what.offsetTop;
	var parentEl=what.offsetParent;
	while (parentEl!=null){
		totaloffset=(offsettype=="left")? totaloffset+parentEl.offsetLeft : totaloffset+parentEl.offsetTop;
		parentEl=parentEl.offsetParent;
	}
	return totaloffset;
}

function iecompattest(){
	return (document.compatMode && document.compatMode!="BackCompat")?
		document.documentElement : document.body;
}

function clearbrowseredge(obj, whichedge){
	var edgeoffset=0;
	var windowedge;
	if (whichedge=="rightedge"){
		windowedge=ie4 && !window.opera? iecompattest().scrollLeft+iecompattest().clientWidth-15 : window.pageXOffset+window.innerWidth-15;
		dropmenuobj.contentmeasure=dropmenuobj.offsetWidth;
		if (windowedge-dropmenuobj.x < dropmenuobj.contentmeasure)
			edgeoffset=dropmenuobj.contentmeasure-obj.offsetWidth;
	}
	else{
		windowedge=ie4 && !window.opera? iecompattest().scrollTop+iecompattest().clientHeight-15 : window.pageYOffset+window.innerHeight-18;
		dropmenuobj.contentmeasure=dropmenuobj.offsetHeight;
		if (windowedge-dropmenuobj.y < dropmenuobj.contentmeasure)
			edgeoffset=dropmenuobj.contentmeasure+obj.offsetHeight;
	}
	return edgeoffset;
}

// this gets things started off.  It's called
// from the onMouseover event of the reference.
function dropdownmenu(obj, e)
{
	if (!obj.cbMenu1.menu)
		return;

	if (window.event)
		event.cancelBubble=true;
	else if (e.stopPropagation)
		e.stopPropagation();

	clearhidemenu();
	dropmenuobj= _CB.ge("dropmenudiv");
	// fill the contents of the menu
	dropmenuobj.innerHTML = obj.cbMenu1.menu.map(function(wi) {
		return '<a target="_top" href="' + wi[1] + '">' +
			   wi[0] + '</a>';
	}).join('');

	var ds = dropmenuobj.style;
	ds.left=ds.top='-500px';
	if (e.type=="click" && dropmenuobj.classList.contains('hidden') || e.type=="mouseover")
		dropmenuobj.classList.remove('hidden');
	else if (e.type=="click")
		hidemenu();

	dropmenuobj.x=getposOffset(obj, "left");
	dropmenuobj.y=getposOffset(obj, "top");
	dropmenuobj.style.left=dropmenuobj.x-clearbrowseredge(obj, "rightedge")+"px";
	dropmenuobj.style.top=dropmenuobj.y-clearbrowseredge(obj, "bottomedge")+obj.offsetHeight+"px";
}

function contains_ns6(a, b) {
	while (b && b.parentNode)
		if ((b = b.parentNode) == a)
			return true;
	return false;
}

function dynamichide(e){
	e = e || window.event;

	if (ie4&&!dropmenuobj.contains(e.toElement))
		delayhidemenu();
	else if (ns6&&e.currentTarget!= e.relatedTarget&& !contains_ns6(e.currentTarget, e.relatedTarget))
		delayhidemenu();
}

function hidemenu(){
	if (typeof dropmenuobj!="undefined"){
		dropmenuobj.classList.add('hidden');
	}
}

function delayhidemenu(){
	delayhide=setTimeout(hidemenu,disappeardelay);
}

function clearhidemenu(){
	if (typeof delayhide!="undefined")
		clearTimeout(delayhide);
}

if (hidemenu_onclick=="yes")
	document.onclick=hidemenu;

_CB.setupHeader();
/*global _CB:true,
evDateRange:true,displayReportsPage:true,
chooseEffectiveUser:true,uspsvalidate:true,
registrarEditEvents:true,bkEditEvents:true,adminConfirmationEmails:true,
earlybirdEdit:true,sendMassEmail:true,reverseOfficePayment:true,
paypal:true,paypalTXNID:true,cancelRW:true,paymentAdjustment:true,
partialRefund:true,getFeesPayments:true,
*/
"use strict";

var rpd = {};
var rpdstate = {
	alreadySawHeader: false,
};
const PD_TP_TYPE = 3;
const PD_TPFEE_TYPE = 5;
const PD_RKEPT_TYPE = 6;
const PD_TPKEPT_TYPE = 7;
const PD_TPFKEPT_TYPE = 8;

_CB.ready(regStartFresh);

// get package of data from the server
// and initialize.
function regStartFresh()
{
	let tt = _CB.ge('ttdiv');
	if (tt) {
		return; // in library mode for tribe tool
	}

    // first put a regdiv in its place.
	_CB.ge('cb-page-content-container').innerHTML = `
		<div class="d-block">
		<div id="banner">
			<img src="https://www.lvalive.com/cf/19/images/24/img_banner_tug24-1800-c65.jpg"
			srcset="https://www.lvalive.com/cf/19/images/24/img_banner_tug24-1800-q60.webp 1800w,
			https://www.lvalive.com/cf/19/images/24/img_banner_tug24-800-q50.webp 800w"
				alt="Camp Barakel">
		</div>
		<div class="container">
		<div class="body-content">
		<div id='regdiv'>
            <div style="height:70vh"><h2 class="loading">Loading...</h2></div>
		</div></div></div>
		<div class="clearfix"></div>
		<div id="regtemplates"></div>
		</div>`

	// (for production server) make sure we're on https://www.campbarakel.org/
	// if not, go to the secure site.
	let url = location;
	if (! /localhost/i.test(url.hostname) && ! /192.168.1/i.test(url.hostname)) {
		if ('https:' != url.protocol || 'www.campbarakel.org' != url.hostname) {
			location.href = 'https://www.campbarakel.org' + url.pathname;
			return;
		}
	}

	if (! /^\/(reg19|register|regdev)$/i.test(location.pathname))
		return;

	// first we need to load the regevent templates.
	_CB.loadHTML('regtemplates', '/19/reg19/regevent.htm',
	function() {
		if (/#opaymore/i.test(location.hash)) {
			// special case for paymore.  skip initial package.
			regInit();
			payMore();
			return;
		}

		processEarlybirdCode();
	
		updateDB( { cmd: 'package'}, function(d) {
			try {
				rpd = JSON.parse(d);
			} catch(e) {
				popAlert('Package not loaded: ' + d);
				_CB.setHTML('regdiv', '<p>' + d + '</p>');
				return;
			}
			regInit();
			regShowPage();
		});
	});

}

// if the URL(hash) contains earlybird code then deal with it.
function processEarlybirdCode() {
	if (/^#ebc=\d+-\w{4,}/.test(location.hash)) {
		rpd.ebc = location.hash.substring(5);
		location.hash = '#';
	}
}

// get valid earlybird row id - eb_id
// from rpd.ebc if it has been validated.
function earlybirdGetid() {
	if (typeof rpd.ebc == 'string' && rpd.ebc.match(/(\d+)-/) &&
		Array.isArray(rpd.eb) && rpd.eb.length)
	{
		return Number(RegExp.$1);
	}
	return 0;
}

// return earlybird row for this event
// if it exists and is active for this user.
function earlybirdRow(ce) {
	if (ce.online_OK || !ce.eb_OK) {
		return false;
	} 
	let ebid = earlybirdGetid();
	if (!ebid) {
		return false;
	}
	return rpd.eb.find(e => e.eb_id == ebid &&
		ce.start_date &&
		e.year == rpd.zdt(ce.start_date).getFullYear() &&
		e.event_type == ce.event_type);
}

// earlybird slots available for this user for this campevent
function earlybirdSlots(ce) {
	let ebrow = earlybirdRow(ce);
	if (ebrow) {
		if (ebrow.count && /winter teen/i.test(ebrow.event_type)) {
			// winter teen - can use up all the available space in
			// the event.
			return rpd.available_space(ce, true);
		}
		return Math.min(ebrow.count, rpd.available_space(ce, true));
	}
	return 0;
}

// navigate to the appropriate view within the registration process.
function regShowPage()
{
	// update the login link on the nav header.
	let ll = document.querySelector('.navbar-nav #login-nav-link');
    if (ll) {
        ll.innerHTML = rpd.getCookieValue('EMAIL') ? 'Register' : 'Log In';
    }

    var hash = window.location.hash;
	console.log(`regShowPage hash: ${hash}  - ${Date.now()}`);
	if (hash.match(/^#(.+)/)) {
		var page = RegExp.$1;

		if (page.match(/sha=(\S{40,})/i)) {
			forgotPWIncoming(RegExp.$1);
			return;
		}

		if (/opaymore/i.test(page)) {
			payMore();
			return;
		}

		if ('reference' == page && !rpd.email) {
			rpd.email = -1; // no login required. continue.
		}

		processEarlybirdCode();
		if (typeof rpd.ebc == 'string' && rpd.ebc.length > 2 &&
			(!Array.isArray(rpd.eb) || 0 == rpd.eb.length) &&
			/^ebc=/.test(page)) {
			// maybe user cut and pasted earlybird code
			// after we had already started things. We need
			// to validate the eb code on the server.
			updatePackage(regShowPage)
			return;
		}

		if (!rpd.email) {
			resetViewToDefault();
			return;
		}
		/* after this user must be logged in */

		// routing..
		var mtch = rpd.hashMap.find(function(a) {
			var tst = new RegExp('^' + a[0], 'i');
			return tst.test(page) });
		if (mtch) {
			mtch[1](page);
			rpd.smoothScrollToTop();
			return;
		}
	}

	// default to regmain/signinShow.
	if (rpd.email) {
		rpd.regMain();
	} else {
		signinShow();
	}
	rpd.smoothScrollToTop();
}

// return true if impersonating someone else.
function impersonating()
{
	return rpd.userIsAdmin && rpd.efEmail &&
		rpd.efEmail != rpd.email;
}

// if (effective) user doesn't have any contacts yet,
// force them to the editPerson() page.
function forceAddContacts()
{
	if (Array.isArray(rpd.campers) &&
		!rpd.campers.filter(rpd.cuf).length)
	{
		location.hash = '#edit';
		return true;
	}
	return false;
}

// regmain lists available events for registration.
// Also before the list, users get their current registrations and waitlist entries.
// This is the "Register for Events" / "Events" page.
function regMain()
{
	var bUnfinishedRegistration = false;

	// before we do anything, check if this user has contacts.
	// new users need to first enter their contacts.
	if (forceAddContacts()) {
		return;
	}

	loadTemplate('regmain');
	let instrID;
	// if there are outstanding registrations that need payment
	// then show that first.
	if (rpd.getPE1s().some(pe => pe.reg_status == 'unpaid') ||
		rpd.pendingCampers.length > 0)
	{
		bUnfinishedRegistration = true;
		instrID = '<p>You have an unfinished registration.<BR>' +
			' <a href="javascript:registerForEvent()">' +
			'Complete or Cancel registration</a></p>';
	} else {
		instrID = `<h3 class="icon border-bottom"><i class="fas fa-info-circle"></i> Instructions</h3>
			Choose an Event by clicking one of the
			&lsquo;Register&rsquo; buttons.
			If you see a &lsquo;Wait List &rsquo; button
			that means the event is full and you can add someone
			to the wait list for the event.
			</p>`;
	}

	// if this user has some other payment outstanding then
	// take care of that first.
	if (!bUnfinishedRegistration && unfinishedPayment()) {
		return;
	}
	if (rpd.isBlocked()) {
		instrID = rpd.isBlockedMsg;
	}
	_CB.setHTML('instrID', instrID);

	// list current user's registrations in the 'My Registrations' section.
	// filter1 gets just first person for a multiperson event.
	let mype = rpd.personEvent.filter(rpd.cuf);
	let myRegs = mype.filter(rpd.filter1); // filter main registrant - person1.
	let uniqRegs = [... new Set(myRegs.map(pe => pe.regnum))];
	if (myRegs.length) {
		// there are outstanding registrations.
		let myRegStr = uniqRegs.map(function(regnum) {
			let pear = mype.filter(pe1 => pe1.regnum == regnum);
			let pe1 = rpd.findReg1(pear.filter(pe => !pe.wl));
			// if no regular registrations or the regular registration
			// has been cancelled, the first waitlist
			// pe is a candidate for the main one.
			if (!pe1 || !rpd.notCanc(pe1)) {
				pe1 = rpd.findReg1(pear);
			}
			let rps = rpd.rpstats(pear);
			let e = rpd.findCE(pe1.campevent_id);
			if (!e) {
				return ['0', 'unknown event for rn: ' + regnum];
			}

			let additionalPeople = mype.filter(pe => pe.regnum == regnum &&
				pe1.camper_id != pe.camper_id);
			let totalPeopleStr = '';
			let aps = '';
			if (additionalPeople.length) {
				totalPeopleStr = `(${additionalPeople.length + 1})`;
				if (/couple/i.test(e.name)) {
					totalPeopleStr = '';
				}
				let namedPeopleA = additionalPeople.filter(pe => pe.camper_id > 0);
				let unnamedStr = '';
				if (additionalPeople.length > namedPeopleA.length) {
					unnamedStr = ` (+${additionalPeople.length - namedPeopleA.length} unassigned people)`;
				}
				aps = '<div class="ml-3">' +
					namedPeopleA.map(p => personNameNS(p.camper_id))
					.join(', ') +
					unnamedStr +
					'</div>';
			}

			// additional waitlists
			let additionalWaitlists = '';
			let awl = pear.filter(rpd.filter1).filter(pe =>
				pe.campevent_id != pe1.campevent_id);
			if (awl.length) {
				additionalWaitlists = awl.map(function(pe) {
					let wle = rpd.findCE(pe.campevent_id);
					let ev = wle ? `${rpd.dr(wle)} ${wle.name}` : '';
					
					return `<div class="ml-3">WAIT LIST:
					${ev} ${rpd.waitlistPositionString(pe)}
					</div>`
				})
				.join('');
			}

			let divStyle = '';
			let warningHeader = '';
			let waitlistHeader = '';
			let unpaidBalanceText = `Unpaid Balance: $${rps.balance}`;
			if (pe1.wl) {
				divStyle = ' style="background-color:#f7fdff"';
				waitlistHeader = ` &mdash; <strong>WAIT LIST ${rpd.waitlistPositionString(pe1)}</strong>`;
				if (rps.paid) {
					unpaidBalanceText = `Wait list Deposit Paid: $${rps.paid}`;
				}
			}
			if (! /completed/i.test(pe1.reg_status)) {
				divStyle = ' style="background-color:#ffeed0"';
				let t = rpd.notCanc(pe1) ? 'UNFINISHED' : 'CANCELLED';
				warningHeader = `<div class="p-1"><strong>${t} REGISTRATION</strong></div>`;
			}

			return [e.start_date, `<div class="pointer" data-regnum="${regnum}"${divStyle}>
				${warningHeader}
				${rpd.dr(e)} ${e.name} ${totalPeopleStr} ${waitlistHeader}
				<div class="ml-3">${personNameNS(pe1.camper_id)}</div>
				${aps}
				${additionalWaitlists}
				<div class="ml-3">${unpaidBalanceText}</div>
				</div>`];
		})
		.sort(function(a, b) {
			return a[0] > b[0] ? 1 : -1; // sort based on start_date
		})
		.map(a => a[1])
		.join('');
		rpd.qs('.myregistrations').innerHTML = myRegStr;

		// make the registrations clickable.
		rpd.qsa('.myregistrations div[data-regnum]').forEach(function(el) {
			el.onclick = function() {
				// in progress registrations go to registerForEvent,
				// paid registrations go to doViewRegistration.
				if (rpd.personEvent.find(pe => pe.regnum == el.dataset.regnum &&
					/unpaid/i.test(pe.reg_status))) {
					registerForEvent();
					return;
				}
				doViewRegistration(el.dataset.regnum, rpd.efWL);
			}
		})
	} else {
		// no registrations, hide the my registrations containers.
		rpd.hideEl(rpd.qs('.myreg-container'));
	}
	// done with the myregistrations section of the page.

	// List the events that allow web registration.
	if (rpd.events.length == 0) {
		rpd.qs('.thelist').innerHTML = 'No Events available for on line registration.<BR>';
		return;
	}
	rpd.unhideEl(rpd.qs('.thelistheader'));
	var cbg = rpd.qs('#cbalready'), cbp = rpd.qs('#cbpot');
	cbg.addEventListener('change', doList);
	cbp.addEventListener('change', doList);

	// filter events based on checkboxes.
	function cbFilts(ev)
	{
		if (ev.total_space <= 0) {
			return false;  // no registrations through this system.
		}
		if (cbg.checked || cbp.checked) {
			// filter only events that ef user has someone
			// signed up for.  false if every registration is not
			// one of ours.
			if (rpd.personEvent.every(function(pe) {
				return !rpd.cuf(pe) || pe.campevent_id != ev.campevent_id;
			})) {
				if (!cbp.checked) {
					return false; // no one is going.
				}
			} else {
				return true; // someone is going.
			}
		}
		if (cbp.checked) {
			// is there anyone on the contact list who
			// has the potential to go?
			// false if no contacts.
			if (rpd.campers.filter(rpd.cuf).length == 0)
				return false;

			// false if every person is not eligible.
			if (rpd.campers.filter(rpd.cuf).every(function(c) {
				cbER.setup(c, ev);
				return cbER.allowed() != '';
			})) {
				return false; // no one is allowed.
			}
		}
		return true;
	}
	doList();

	// create list of events.  put it in .thelist.
	function doList() {
		// header for the table.  'Space' vs '?' is determined
		// in CSS based on the screen width.
		var cList = [
			'<table id="cTblID" class="evlist">' +
			'<TR id="cTblHeaderRowID" class="cbhfont">' +
			'<TD><p>Date</p></TD>' +
			'<TD><p>Event</p></TD>' +
			'<TD><p><span class="opop">Space</span>' +
			'<span class="opq">?</span></p></TD>' +
			'<TD><p><span class="opop">Register</span></p></TD>' +
			'</TR>'];
		var prev_sd = new Date(1900,1,1);
		let prev_ed = new Date(1900,1,1);
		var prev_season = '';
		var bShowWeek = true;
		rpd.events.filter(cbFilts)
		  .forEach(function(v) {

			if (dateDiffDays(rpd.now, v.end_date) <= 0) {
				return; // event has already past, can't register.
			}

			// don't show family camp.
			if (/family/i.test(v.name)) {
				return;
			}

			var available_space = rpd.available_space(v);
			var campevent_id = v.campevent_id;
			var summerGrade = v.season == 'summer' && v.age.match(/\d/) ?
				('<span class="sg"> <span class="opq"><BR></span>(Grades ' +
				v.age + ')</span>') : '';
			var evDate = '&nbsp;';
			var ndRow = '';

			if (v.start_date != prev_sd || v.end_date != prev_ed) {
				evDate = rpd.dr(v);
				ndRow = ' class="ndr"'; // new date
				if (v.season != prev_season) {
					prev_season = v.season;
					// season header row
					cList.push('<TR class="season-header ndr">' +
						'<TD class="p-2 pl-4 pt-3 termina" colspan="4">' +
						prev_season[0].toUpperCase() +
						prev_season.substring(1) +
						' ' + v.start_date.substring(0, 4) +
						'</TD></TR>');
				}
				bShowWeek = true;
			} else {
				if (v.season == 'summer' && bShowWeek) {
					// skip showing week number for now.
					//evDate = '<span class="sw">Week ' +
					//	rpd.wwk(v.start_date) + '</span>';
					bShowWeek = false;
				}
			}
			prev_sd = v.start_date;
			prev_ed = v.end_date;
			let nameStr = v.name;
			if (rpd.userIsAdmin) {
				nameStr = `<a href="javascript:rpd.goto('#prts/${v.campevent_id}')">${v.name}</a>`;
			}

			cbER.setup(null, v);
			let available_space_str = available_space;
			if ((0 == available_space || v.wait_list > 0)
				&& cbER.awl) {
				// show waitlist info
				let wli = 0 == v.wait_list ? 'empty' : v.wait_list;
				available_space_str = `Openings: ${available_space}<br>Waitlist: ${wli}`;
			}

			cList.push('<TR' + ndRow + '>' +
				 '<TD><p class="mx-2">' + evDate + '</p></TD>' +
				 '<TD><p class="mx-2">' + nameStr + summerGrade + '</p></TD>' +
				 '<TD class="tc"><p>' + available_space_str + '</p></TD>' +
				 '<TD class="tc">');

			// now show current info for this user for this event.
			// can they register someone? is someone already registered?
			cbER.setup(null, v);
			let allowedReason = cbER.allowed();
			if (!bUnfinishedRegistration && !rpd.isBlocked() &&
				('' == allowedReason || /waitlist/i.test(allowedReason)))
			{
				// allow on-line registration or wait list for new people
				if ('' == allowedReason) {
					let o = '';
					if (!v.online_OK) {
						o = earlybirdSlots(v) ? '<BR>-Early' : '<BR>-Office';
					}
					cList.push(`<a 
						class="btn btn-primary my-3 mx-1"
						title="Register for this event"
						href="javascript:registerForEvent('${campevent_id}')" >
						Register${o}</a>`);
				}
				if (cbER.awl && (0 == available_space || 0 != v.wait_list)) {
					// show a waitlist button.
					cList.push(`<a 
						class="btn btn-primary my-3 mx-1"
						title="Join the wait list for this event"
						href="javascript:registerForEvent('${campevent_id}')" >
						Wait List</a>`);
				}

			} else if (v.online_OK && !v.isCanc &&
				 available_space < cbER.minNeeded) {
				// Full Event
				var waitListCount = v.wait_list ? v.wait_list : '';
				cList.push('<p style="margin:4pt 0;line-height:1.2">' +
					'<span class="smallC wait black-70" data-id="' +
					campevent_id + '">' +
					'(Full)' +
					'<BR>Wait List ' + waitListCount +
					'</span></p>');
			} else if (allowedReason != '') {
				cList.push('<p><span class="smallC">' +
					allowedReason + '</span></p>');
			}

			// if this user has someone signed up for this event
			// already then let them see this.
			var pAr = [];
			var pperson = function(person, msg) {
				pAr.push('<a style="background-color:#ff0" ' +
					'href="javascript:registerForEvent(\'' +
					campevent_id + '\')">' +
					person +
					'</a> (' + msg + ')');
			};
			rpd.getPE1s()
				.filter(pe => pe.campevent_id == campevent_id)
				.forEach(function(pe) {
					// for each existing registration for this event.
					var reg_status = pe.reg_status;
					var pName = personName(pe.camper_id);
					let wlText = pe.wl ? ' (waitlist)' : '';
					let rCnt = rpd.filterReg(pe.regnum, pe.weblogin_id).length;
					if (rCnt > 1) { // count of the people on this registration.
						pName += ` (${rCnt})`;
					}
					if (reg_status != null && reg_status.match(/unpaid/i)) {
						pperson(pName, `partial${wlText}`);
					} else {
						pAr.push('<a href="javascript:doViewRegistration(' +
							pe.regnum + ',' + rpd.efWL + ')">' +
							pName + '</a>' + wlText);
					}
				});
			if (rpd.ce && rpd.ce.campevent_id == campevent_id &&
				!rpd.personEvent.find(function(pe) {
					return pe.camper_id == rpd.pendingCampers[0] &&
						pe.campevent_id == campevent_id;
				})) {
				// also add pending campers for this event
				// if they weren't already listed.
				rpd.pendingCampers
					.filter(cid => cid > 0)
					.forEach(cid => pperson(personName(cid),'pending'));
			}

			if (pAr.length > 0) {
				cList.push('<p class="cbhfont smallC m-0 ml-2 tl">' +
					'Existing:</p><p class="smallC tl">' +
					pAr.join('<BR>') + '</p>');
			}

			cList.push('</TD></TR>');
		});
		cList.push('</table>');
		rpd.qs('.thelist').innerHTML = cList.join('');
	}

	if (rpd.userIsAdmin) {
		let ree = rpd.qbv('REE');
		rpd.unhideEl(ree);
		ree.onclick = function() {
			rpd.goto('ree');
		}
		let lastButton = ree;

		// set up bee button.
		if (rpd.sr.roles.accountingAdmin) {
			ree.insertAdjacentHTML('afterend',
			rpd.btn('BEE'));
			ree.setAttribute('title', 'Registrar');
			let bee = rpd.qbv('BEE');
			bee.classList.add('normal-fv');
			bee.onclick = function() {
				rpd.goto('bee');
			}
			bee.setAttribute('title', 'Accounting');
			lastButton = bee;
		}

		// set up confirmation email and edit earlybird buttons
		if (rpd.regAdmin()) {
			lastButton.insertAdjacentHTML('afterend',
			rpd.btn('CEmail'));
			let cemail = rpd.qbv('CEmail')
			cemail.classList.add('normal-fv');
			cemail.onclick = function() {
				rpd.goto('confemail');
			};
			cemail.setAttribute('title', 'Confirmation Emails');

			lastButton = cemail;
			lastButton.insertAdjacentHTML('afterend',
				rpd.btn('EB Edit'));
			let ebedit = rpd.qbv('EB Edit');
			ebedit.classList.add('normal-fv');
			ebedit.onclick = function() {
				rpd.goto('ebedit');
			}
			ebedit.setAttribute('title', 'Edit Earlybird Counts');
		}

	}
	// add wait list help pop up.
	rpd.qs('.thelist').addEventListener('click',
		function(e) {
			let cl = e.target.classList;
			if (cl.contains('wait')) {
				let campevent_id = e.target.getAttribute('data-id');
				var wli = _CB.ge('wait-list-instructions');
				let tce = rpd.findCE(campevent_id);
				wli.querySelectorAll('p').forEach(e => rpd.hideEl(e));
				rpd.unhideEl(
					wli.querySelector(/teen/i.test(tce.name) ? '.teen-wl-instructions' : '.rr-wl-instructions'))

				popAlert(wli.innerHTML, 'Waitlist Information');
				return;
			}
		});
} // regMain


/* edit one contact/BP contact. edit contact */
function editPerson(page)
{
	// before we get very far... if there are no
	// addresses defined yet for this account
	// that's what we need first.
	if (!rpd.addressList.filter(rpd.cuf).length) {
		enterNewAddress();
		return;
	}
	loadTemplate('editperson');

	function churchnameAutocomplete() {

		if (!_CB.churchnames) {
			updateDB( { cmd: 'getchurchnamelist'}, function(d) {
				try {
					_CB.churchnames = JSON.parse(d);
					churchnameAutocomplete();
				} catch(e) {
					console.log(`churchname list error: ${d}`);
				}
			});
			return;
		}
		autocomplete(rpd.qs('input[name="churchname"]'),
			_CB.churchnames);
	}

	// set up autocomplete on churches
	// after we load the church list.
	churchnameAutocomplete();

	let birth_date = rpd.qin('birth_date');

	// assume birth_date is an HTML5 date.
	// we are not gracefully handling the browsers
	// that don't support HTML5 date.
	let curYear = rpd.now.getUTCFullYear();
	birth_date.min = (curYear-110) + '-01-01';
	birth_date.max = (curYear+1) + '-12-31';

	// set up age select. value for the select doesn't contain
	// the word 'Grade'.
	var ageSelAr = ['Adult','College','Pre-K/K'];
	for (let i=1; i<=12; i++) {
		ageSelAr.push('Grade ' + i);
	}
	loadSelectFromArray(ageSelAr, rpd.qs('select[name=age]'),
		ageSelAr.map(function(a) {
			if (a.match(/^grade (\d+)$/i))
				return RegExp.$1;
			return a;
		}));

	// load up the address select from the known address list.
	var address_sel = rpd.qs('select[name=address]');
	var adrLName = rpd.addressList.filter(rpd.cuf).map(
		function(a) { return [a.address, a.street];	} );
	loadSelectFromArray(
		adrLName.map(function(a) { return a[0] + ' - ' + a[1]}),
		address_sel,
		adrLName.map(function(a) { return a[0] } )
	);
	if (rpd.addressList.filter(rpd.cuf).length == 1) {
		// only one address, so select it by default.
		address_sel.selectedIndex = 1;
	}

	// specific camper_id?
	var camper_id = page && page.match(/\/(\d+)$/) ?
		Number(RegExp.$1) : false;

	// load the parent/guardian list from adults on this
	// account.
	let parent_sel = rpd.qs('select[name=prt]');
	let pChoices = rpd.campers.filter(rpd.cuf)
		.filter(c => /adult|college/i.test(c.age) && c.camper_id != camper_id);
	loadSelectFromArray(
		pChoices.map(c => `${c.firstname} ${c.lastname}`),
		parent_sel,
		pChoices.map(c => c.camper_id)
	)

	if (!camper_id)
	{
		// Add New Contact case.
		rpd.campers.current_camper_idx = -1;
		rpd.sqs('.card-title', 'New Contact Information');

		addCamperSetupValidation();
		return;
	}


	// find camper_id in rpd.campers.
	let camperIndex = rpd.campers.findIndex(v => 
		v.camper_id == camper_id
	);

	if (camperIndex == -1) {
		location.hash = '#list'; // not found.
		return;
	}
	rpd.campers.current_camper_idx = camperIndex;

	/* load up the person's data into the form */
	let cd = rpd.campers[camperIndex]; // camper data
	rpd.sqs('.card-title', `${cd.firstname} ${cd.lastname}`);

	['input:not([type=button])', 'select'].forEachQAll(
		function(el) {
			if (el.type == "radio") {
				if (cd[el.name] == el.value) {
					el.checked = true;
				}
			} else if (el.name == "birth_date") {
				var d = '';
				if (cd[el.name].match(/^([12][890]\d\d-\d\d-\d\d)/)) {
					d = RegExp.$1;

					if (birth_date.type == "date") {
						birth_date.value = d;
					}
				}
				birth_date.origDate = d;
			} else {
				if (cd[el.name]) {
					el.value = cd[el.name];
				}
			}
		}
	);

	// allow deleting if the camper isn't registered for any events
	// and has no donations and isn't parent of child.
	let bAnyEvents = rpd.personEvent.some(function(v) {
		return v.camper_id == camper_id;
	});
	let bAnyDonations = rpd.paymentDetails.some(pd => camper_id == pd.ci);
	let bIsParentOfChild = rpd.campers.some(c => camper_id == c.prt);
	let dBtn = rpd.qbv('Delete');
	dBtn.disabled = bAnyEvents || bAnyDonations || bIsParentOfChild;
	let bdt = '';
	if (dBtn.disabled) {
		if (bAnyEvents) {
			bdt = 'Registered to an Event.';
		}
		if (bAnyDonations) {
			bdt += ' Made a donation.';
		}
		if (bIsParentOfChild) {
			bdt += ' Parent of a child.';
		}
		bdt += ' Can&rsquo;t be deleted.';
	}
	rpd.sqs('#ep-button-desc', `<p style="font-size:0.8rem;color:#aaa">${bdt}</p>`);
	addCamperSetupValidation();
} // editPerson

// user wants to enter a new address.
function enterNewAddress()
{
	rpd.addressList.returnToHash = location.hash;
	location.hash = '#addresslist/enterNewAddress';
}

// delete address - 1st step
// user has clicked the 'Delete' address button.
function deleteAddress(linenum)
{
	let idx = rpd.addressList.findIndex(function(a) {
		return a.weblogin_id == rpd.efWL &&
			a.linenum == linenum;
	});
	if (idx < 0) {
		return;
	}
	// find adrKey in the list
	popConfirm(`Do you want to delete "${rpd.addressList[idx].address}"?`,
	function() {
		let address = {
			linenum: linenum,
			address: '_delete_'
		};
		updateDB( { address: JSON.stringify(address) },
			function(d) {
				try {
					JSON.parse(d);
				} catch(e) {
					popAlert('Not deleted. Server returns ' + e.message);
					return;
				}
				rpd.addressList.splice(idx, 1);
				editAddressList(); // refresh page.
			});
	});
}

// return true if ok to delete this address.
function deleteAddressAllowed(ad) {
	// not allowed for readonly admin
	if (rpd.userIsAdmin && !rpd.regAdmin()) {
		return false;
	}

	// ok if every camper not assigned to this address.
	return rpd.campers.filter(rpd.cuf)
		.every(c => c.address != ad.address );
}

// user wants to edit address or display address list - BP addresses
function editAddressList(page)
{
	let adrKey = page && page.match(/ist\/(\S.+)/i) ?
		decodeURI(RegExp.$1) : false;
	if (!adrKey && rpd.addressList.filter(rpd.cuf).length) {
		// No specific address wanted.
		// List all the addresses for this user.
		loadTemplate('listaddress');

		var aL = rpd.addressList.filter(rpd.cuf)
			.map(function(ad) {
				let da = '<span class="notAllowed" title="You may not delete an address in use.">Delete</span> ';
				if (deleteAddressAllowed(ad)) {
					da = '<a class="btn btn-sm btn-primary" href="javascript:deleteAddress(' +
					ad.linenum + ')">Delete</a> ';
				}
				return `<tr><td><p>${da}</p></td>` +
					'<td><p>' +
					`<a href="#addresslist/${ad.address}">${ad.address} - ` +
					ad.street + ' ' + ad.city +
					', ' + ad.state + '&nbsp;&nbsp;' +
					ad.zipcode + '</a></p></td></tr>';
			});
		aL.push('</table>');
		aL.unshift('<table id="cTblID">' +
			'<TR>' +
			'<TH><p>Delete</p></TH>' +
			'<TH><p>Address</p></TH>' +
			'</TR>');
		rpd.sqs('#adrList', aL.join(''));
		return;
	}

	// user wants to edit a specific address 'adrKey' or
	// start a new address.
	loadTemplate('editaddress');

	// load up state with the state abbreviations.
	loadSelectFromArray(
		['MI','AL','AK','AZ','AR','CA','CO','CT','DE','DC','FL',
		'GA','HI','ID','IL','IN','IA','KS','KY','LA','ME','MD',
		'MA','MN','MS','MO','MT','NE','NV','NH','NJ','NM','NY',
		'NC','ND','OH','OK','OR','PA','RI','SC','SD','TN','TX',
		'UT','VT','VA','WA','WV','WI','WY','ON'],
		rpd.qs('select[name=state]'));

	setupUSPSValidation();
	rpd.addressList.idx = -1;
	var lnIn = rpd.qin('linenum'); // linenum of this address.
	if (adrKey && adrKey != 'enterNewAddress') {
		// make sure adrKey is on our list.
		rpd.addressList.idx = rpd.addressList.findIndex(function(ad) {
			return ad.address == adrKey && ad.weblogin_id == rpd.efWL;
		});
		if (rpd.addressList.idx == -1) {
			console.log('did not find adrKey: ' + adrKey);
			// invalid address.
			location.hash = '#addresslist';
			return;
		}

		// load up form fields from the data.
		var adrA = rpd.addressList[rpd.addressList.idx]
		loadFormValues(adrA);

		// set card title with the address name.
		rpd.sqs('.card-title', `Edit '${adrA.address}'`);

		// linenum '0' is special case we need to load since
		// it is a number that needs a value for the server.
		if (adrA.linenum === 0) {
			lnIn.value = '0';
		}

		// disable the name of the address if the name can't be
		// changed because it is in use.
		if (!deleteAddressAllowed(adrA)) {
			rpd.qin('address').disabled = true;
		}
	} else {
		// new address, we fill in linenum as new linenum.
		// linenum is max(linenum) + 1 (or zero if there are no existing adrs).
		lnIn.value = 0;
		if (rpd.addressList.filter(rpd.cuf).length > 0) {
			lnIn.value =
				Math.max.apply(null,
					rpd.addressList.filter(rpd.cuf).map(function(a) { return a.linenum; })) + 1;
		} else {
			// first address, show instructions.
			rpd.unhideID('instrID');
		}
		rpd.smoothScrollCenter(rpd.qin('street'));
	}

	xxSetupValidation(doAddressFormValidation);
}

// return all the address input fields as an array.
function adrfieldsAr() {
	return rpd.qsaa('form[name="eaform"] input:not([type=button]):not([type=hidden]), form[name="eaform"] select');
}

// validate that user has filled in the inputs.
// This doesn't actually do the USPS validation.
function doAddressFormValidation()
{
	// also see if anything is changed that needs saving or validating.
	// values as of last save are in el.lastSavedValue
	// values as of last validate are in el.lastValidatedValue
	let bUnvalidated = false;
	let bUnsaved = false;
	adrfieldsAr().forEach(el =>
		 {
			if (el.lastSavedValue == undefined) {
				el.lastSavedValue = '';
			}
			bUnsaved = bUnsaved || (el.value != el.lastSavedValue);

			if (el.name != 'street2') {
				// all fields must have values except street2.
				setInvalidField(!el.value.match(/\S/), el);
			}

			// we don't validate street2 or address name.
			if (el.name != 'street2' && el.name != 'address') {
				bUnvalidated = bUnvalidated || (el.value != el.lastValidatedValue);
			}
		}
	);

	let ivAddressInfo = '';
	// invalid if address name is not unique for this user
	var bAdr = rpd.qs('input[name=address]:not(.invalidField)');
	if (bAdr) {
		var bAdrVU = bAdr.value.trim().toUpperCase();
		let notUnique = rpd.addressList.some(
			function(el,idx) {
				return (idx != rpd.addressList.idx &&
					el.weblogin_id == rpd.efWL &&
					el.address.toUpperCase() == bAdrVU);
			})
		setInvalidField(notUnique, bAdr);
		if (notUnique) {
			ivAddressInfo = `This address name, &ldquo;${bAdrVU}&rdquo;, is not unique.`;
		}
	} else {
		ivAddressInfo = 'Fill in a unique address name.'
	}
	rpd.sqs('#address-name-valid-info', ivAddressInfo);

	let bSave = rpd.qbv('Save');
	let roAdmin = rpd.userIsAdmin && !rpd.regAdmin();
	bSave.disabled = rpd.qs('.invalidField') || !bUnsaved || roAdmin ? true : false;

	// should we allow validation? not if too many validation attempts
	// or there's nothing changed since the last successful validation.
	let cavEl = _CB.ge('usps-address-validation');
	let vBut = rpd.qbv('Validate');
	let pcT = rpd.qs('span.please-confirm-text');
	if (uspsvalidate.tooManyAttempts() || !bUnvalidated) {
		// no validation possible.
		rpd.hideEl(cavEl);
		if (vBut) {
			vBut.disabled = true;
		}
		if (pcT) {
			pcT.classList.add('moon-gray');
		}
	} else {
		// validation is now possible.
		if (pcT) {
			pcT.classList.remove('moon-gray');
		}
		rpd.unhideEl(cavEl);
		if (vBut) {
			vBut.disabled = false;
		}
	}
}

// the usps and google validation is in file uspsvalidate.js
function setupUSPSValidation()
{
	// set up address validation.  load google API
	if (!uspsvalidate.geocoder) {
		let vals = document.createElement('script');
		vals.src = 'https://maps.googleapis.com/maps/api/js?key=AIzaSyAiDr4PfHh6SuUBxGLNDWdVBTtS89f4rHM&libraries=places&loading=async&callback=uspsvalidate_initAV';
		document.head.appendChild(vals);
	}

	// allow Current Address button if we can do geolocation
	let ca = rpd.qs('input[value="Current Address"]');
	if ("geolocation" in navigator) {
		/* geolocation is available */
		ca.disabled = false;
	  } else {
		ca.disabled = true;
		ca.title = 'not able to do geolocation'
	  }

	// let uspsvalidate.js know where input/output fields are
	uspsvalidate.init({
		street: 'input[name="street"]',
		street2: 'input[name="street2"]',
		city: 'input[name="city"]',
		state: 'select[name="state"]',
		zip: 'input[name="zipcode"]',
		rdiv: '#usps-address-val-rdiv',
		validAddressFn: function() {
			window.setTimeout(function() {
				// validation success.
				// save the validated values.
				adrfieldsAr().forEach(el => {
					el.lastValidatedValue = el.value;
				});
				doAddressFormValidation();
			}, 1000);
		}
	});
}

// user wants to cancel the address.
function doAddressCancel()
{
	if (rpd.addressList.returnToHash) {
		var loc = rpd.addressList.returnToHash;
		rpd.addressList.returnToHash = '';
		location.hash = loc;
		return;
	}
	rpd.goto('addresslist');
}

// user wants to save this address from the form.
function saveAddress()
{
	var idx = rpd.addressList.idx;
	var address = {};
	collectFormValues(address);
	address.weblogin_id = rpd.efWL;

	updateDB( { address: JSON.stringify(address) },
		function(d) {
			// upon getting back from the server
			// we want to update our info.
			var bFirstAddress = rpd.addressList.filter(rpd.cuf).length == 0;
			try {
				var jC = JSON.parse(d);

				if (idx != -1) {
					// overwrite existing entry
					rpd.addressList[idx] = jC;
				} else {
					rpd.addressList.push(jC); // new entry in addresses.
				}
				rpd.addressList.sort(function(a,b) {
					if (a.address > b.address)
						return 1;
					if (b.address > a.address)
						return -1;
					return 0;
				});

			} catch(e) {
				popAlert('Server says: ' + e.message);
				return;
			}
			if (bFirstAddress && !rpd.campers.filter(rpd.cuf).length) {
				forceAddContacts();
				return;
			}
			doAddressCancel();
		});
}

// initialization.  no events except those in personEvent.
// set up rpd.ope - outstanding person event.
//		rpd.ce - current event - from events.
function initRPDevent()
{
	rpd.pendingCampers = [];
	rpd.pendingHousingInfo = false;
	rpd.pendingTradingPost = '';
	rpd.pendingWaitlist = false;
	rpd.ce = null;
	if (_CB.wt) {
		_CB.wt.initWT();
	}

	if (!rpd.personEvent) {
		return; // in library mode.
	}

	rpd.setupWaitlistArrays();

	// check outstanding person events...
	rpd.ope = rpd.getPE1s()
		.find(pe =>
		pe.reg_status && /^unpaid/i.test(pe.reg_status));

	if (rpd.ope) {
		// set up CE with the current event,
		// the one with an outstanding unpaid registration.
		rpd.ce = rpd.findCE(rpd.ope.campevent_id);
		if (rpd.ce)
		{
			// set up the pendingCampers and pendingHousingInfo.
			// for the pending event registration.
			rpd.filterReg(rpd.ope.regnum, rpd.efWL)
				.forEach(function(pe) {
					// save camper_id of the campers
					// onto pendingCampers.
					rpd.pendingCampers.push(pe.camper_id);

					if (rpd.filter1(pe)) {
						rpd.pendingHousingInfo = pe.note_to_camp;
						rpd.pendingWaitlist = pe.wl;
					}
			});

			if (_CB.wt && _CB.wt.wtMatch(rpd.ce)) {
				// initialize winter teen variables
				_CB.wt.initWT(rpd.ope.regnum);
			}
			cbER.setup(null, rpd.ce);

			// look for trading post money user already
			// specified.
			if (cbER.tradingPostMoney) {
				let pd = rpd.paymentDetails.find(pd => !pd.c &&
					pd.r == rpd.ope.regnum && 3 == pd.t);
				if (pd) {
					// save the Trading Post amount in the form
					rpd.pendingTradingPost = pd.a;
				}
			}
		}
	}
}


// #event
// display choices user has for registering one or more
// people for a camp event.
// figure out the event from the URL or the saved info in rpd.ce
// As each camper is added to the event (addCamperToEvent),
// we come back here again.
function regEvent(page)
{
	var campevent_id = page && page.match(/event\/(\S+)/i) ?
		RegExp.$1 : false;
	var bAnyEligible = false;

	if (rpd.ce && !campevent_id) {
		campevent_id = rpd.ce.campevent_id;
	}
	if (!rpd.ce || (campevent_id && rpd.ce.campevent_id != campevent_id))
	{
		// figure out which campevent we're working on.
		// set up rpd.ope if there is an outstanding
		// unpaid registration we're working on.
		initRPDevent();

		// normal case, incoming campevent_id.
		// find the event.
		rpd.ce = rpd.findCE(campevent_id);
	}

	if (unfinishedPayment()) {
		return;
	}

	if (!rpd.ce) {
		// event not found. nothing to act on.
		resetViewToDefault();
		return;
	}

	// make sure hash location is correct.
	if (rpd.ce.campevent_id != campevent_id) {
		registerForEvent(rpd.ce.campevent_id);
		return;
	}

	if (forceAddContacts()) { // force user to add contacts if there are none.
		return;
	} 

	// are there already max number of people registered
	cbER.setup(null, rpd.ce);
	if (rpd.pendingCampers.length == cbER.maxAllowed) {
		// on to housing.
		doHousing();
		return;
	}
	loadTemplate('regevent');
	// some event names are too long when their '/' character doesn't
	// allow line breaks.  Add zero-width space.
	_CB.setHTML('eventname', rpd.ce.name.replace('/', '/&#8203;'));

	// update gender in the instructions if this is an
	// event that only allows one gender.
	if (/^g/i.test(rpd.ce.gender)) {
		let gs = rpd.qs('#instrID #hisher-gen');
		if (gs) {
			gs.innerHTML = /gal/i.test(rpd.ce.gender) ? 'her' : 'his';
		}
	}
	if (rpd.ce.online_OK && rpd.ce.awl &&
		rpd.available_space(rpd.ce) <= 0) {
		// since the event is full, show instructions for waitlist.
		rpd.qs('#instrID .reg-instructions').classList.add('d-none');
		rpd.qs('#instrID .wl-instructions').classList.remove('d-none');
	}

	/* create contact list for this event,
	 * note who can go, who is already signed up,
	 * and who is ineligible.
	 */
	var cl = rpd.campers.filter(rpd.cuf).map(function(c) {

		// cbER setup infor for this event and this camper.
		cbER.setup(c, rpd.ce);
		var strRowColor = '';
		var strAddCamper = ' ';

		var strAllowed = cbER.allowed();
		if (strAllowed) {
			// not allowed.
			if (strAllowed.match(/already/i)) {
				// get personEvent for this person and this event
				if (strAllowed.match(/unpaid/i)) {
					// let user know that this person's registration is unpaid
					strAddCamper = 'Now: $' + cbER.pe.payment_auth;
					strRowColor = 'unpaid';
				} else {
					// already registered but we cannot delete them.
					strAddCamper = 'Already Registered';
					if (/waitlist/i.test(strAllowed)) {
						strAddCamper = 'Already Waitlisted';
					}
					if (strAllowed.match(/pending/i)) {
						strAddCamper += '<BR>' +
						'<span style="font-size:0.7rem;color:#666">' +
						'(payment pending)</span>';
					}
					strRowColor = 'already-reg';
				}
			} else if (/waitlist/i.test(strAllowed)) {
				// we can add this person to the waitlist.
				// only need to have a deposit if the person isn't already
				// on a waitlist or registered for a similar event.
				let fAr = cbER.fees(rpd.pendingCampers.length);
				let strFeeInfo = ' $' + fAr[0];
				if (rpd.getSimilarPE(c.camper_id, rpd.ce)) {
					strFeeInfo = '';
				}
				bAnyEligible = true;
				// it's ok to add this person to the waitlist for this event
				// so we allow the add camper action on this person.
				strAddCamper = '<div class="tc"><button type="button" title="Wait List"' +
				` class="btn" onclick="addCamperToEvent(${c.camper_id}, true)"
				>Waitlist${strFeeInfo}</button></div>`;
			} else {
				// this person is not allowed to go
				strRowColor = 'cbNotAld';
				strAddCamper = strAllowed;
			}
			strAddCamper = '<p class="aci">' + strAddCamper + '</p>';
		} else {
			let fAr = cbER.fees(rpd.pendingCampers.length);
			let strFeeInfo = fAr[1] ? ' $' + fAr[0] + '/$' + fAr[1] : '';
			// it's ok to add this person to the event
			// so we allow the add camper action on this person.
			strAddCamper = '<div class="tc"><button type="button" title="Register"' +
				' class="btn" onclick="addCamperToEvent(' + c.camper_id +
				')">' +'Register' + strFeeInfo + '</button></div>';

			bAnyEligible = true;
		}

		// elements of cl: each camper gets a DIV.
		return `<div class="overflow-hidden m-1 p-1 rounded ${strRowColor}">` +
			'<p>' + personName(c.camper_id) + '</p>' +
			'<p>' +
			(/^\d+$/.test(c.age) ? 'Grade ' : '') + c.age +
			'</p>' +
			strAddCamper +
			'</div>';
	});
	let rm2 = bAnyEligible ? `<p>Click Register button below to register someone.</p>` : '';
	_CB.setHTML('reRightPanel',
		'<h3>Contact List</h3>' +
		rm2 +
		'<div class="c-list mt-1">' +
		cl.join('') +
		'</div>' +
		'<p id="buttonP" class="m-3 tc"><input type=button value="Add Person to Contact List"' +
		' class="btn btn-primary"' +
		' onclick="location.hash=\'#edit\'">' +
		' <input type="button" value="Edit Contact List"' +
		' class="btn btn-primary"' +
		' onclick="location.hash=\'#list\'">' +
		'</p>');

	// if no one is eligible then change the instructions.
	if (!bAnyEligible) {
		let strElse = rpd.pendingCampers.length ? ' else' : '';
		let adInstr = /summer/i.test(rpd.ce.season) ?
			('<p>You must indicate a parent or '+
			'guardian for each child.  Edit the child in your' +
			' <a href="#list">Contact List</a> to include parent.' +
			'</p>') : '';
		_CB.setHTML('instrID', '<p>Since no one' + strElse +
			' from your contact list is eligible for this event you' +
			' need to update your <a href="#list">Contact List</a>' +
			' to add or modify the person you want to register.' +
			'</p>' + adInstr);
		
		// different message if the event is full.
		if (rpd.ce.available_space < cbER.minNeeded && !rpd.ce.awl) {
			_CB.setHTML('instrID', '<p>' +
			'This event is full.' +
			' You may send in a registration to the office if' +
			' you would like to be on the waiting list in case' +
			' there are cancellations' +
			'</p>' + adInstr);	
		}
	}
	if (cbER.awl && /summer/.test(cbER.ev.season)) {
		// append message at the end of the instructions.
		let feeAmount = '';
		if (cbER.ev.fees && cbER.ev.fees.length > 4) {
			feeAmount = `$${cbER.ev.fees[4]} `; // waitlistdepositamount
		}
		let p = document.createElement('p');
		p.innerHTML = `You can add your camper to multiple event waitlists 
		using the same ${feeAmount}deposit.<BR>
		<strong>Please make sure to update your child’s grade in their
		<a href="#list">contact information</a> before registering them.
		It must be the grade they are going into in the fall.</strong>`
		rpd.qs('#instrID').append(p);
	}

	// special message for college career fees
	if (/college/i.test(cbER.ev.name)) {
		let p = document.createElement('p');
		p.innerHTML = `<strong>College students get a discount on this event.</strong>
		If you are in college, make sure you let us know by updating your 
		contact information. Under the 
		<a href="#list">contact list</a>,
		edit your contact 
		information to say that your “Age/Grade” is College rather than Adult. 
		This will make sure the discount is applied. 
		If you are no longer in college, please make sure it says 
		Adult rather than College so that the discount is not applied. 
		Make this update before you register for this event.`;
		rpd.qs('#instrID').append(p);
	}

	// fill in the cbEventInfo. Date/Age/Gender/Space Available.
	rpd.fillEventInfo();
	rpd.setSpaceAvailable(rpd.pendingCampers.length);

	// do we have min # people registered so we can go to housing?
	var btnNext = rpd.qs('#nextbutton');
	btnNext.disabled = (rpd.pendingCampers.length < cbER.minNeeded)

	// if only max==min then user doesn't need to push next.
	btnNext.style.display = (cbER.maxAllowed == cbER.minNeeded) ?
		'none' : 'inline';

	if (cbER.regEventFn) {
		cbER.regEventFn();
	}

	if (rpd.isBlocked()) {
		// user is blocked from new registrations.
		rpd.qs('#instrID').innerHTML = rpd.isBlockedMsg;
		// disable register buttons.
		_CB.qsafn('#reRightPanel button:not(:disabled)',
		function(el) {
			el.disabled = true;
		})
	}

	// if we haven't updated data in a while
	// and there isn't much space left in this
	// event, then update data.
	let aspace = rpd.available_space(rpd.ce);
	if (!rpd.userIsAdmin &&
		aspace < 15 && aspace > 0)
	{
		let dn = new Date();
		let elapsedSecs = (dn - rpd.utmo) / 1000;
		if (elapsedSecs > 30) {
			// refresh the database and refresh the page
			// with the updated data.
			updatePackage(regEvent);
		}
	}
}

function updatePackage(cb)
{
	updateDB( { cmd: 'package'}, function(d) {
		try {
			let rpdu = JSON.parse(d);
			rpd.events = rpdu.events;
			rpd.personEvent = rpdu.personEvent;
			rpd.eb = rpdu.eb;
			rpd.ebc = rpdu.ebc;
			rpd.utmo = new Date();
			if (cb) {
				cb();
			}
		} catch(e) {
			console.log(`updatepackage error: ${e.message}\n${d}`);
			return;
		}
	}, false, true);
}

// user wants to donate.
// come here on #donate
function donate()
{
	loadTemplate('donate');

	// display list of previous donations, if any.
	let paidDonations = rpd.payments.filter(p => p.regnum < 0 &&
		rpd.efWL == p.weblogin_id);
	if (paidDonations.length) {
		rpd.unhideID('recent-donations-col');
		rpd.sqs('#recent-donations-list',
			'<span class="paylist">' +
			paidDonations.map(function(p) {
				let d = rpd.zdt(p.timestamp);
				// look up designation
				let pda = rpd.paymentDetails.filter(pd1 => rpd.efWL == pd1.w &&
					p.regnum == pd1.r && p.pnum == pd1.p);
				let designation = '?';
				let donor = '?';
				let staffFamily = '';
				let pdd = pda.find(pd1 => pd1.t == 2);
				if (pdd) {
					donor = pdd.d;
					designation = rpd.dDesignations.find(dd => dd.id == pdd.ds)?.designation;
					if (4 == pdd.ds) {
						// find staff family
						staffFamily = `<BR><span class="staff-family-name" data-id="${pdd.cn}"></span>`;
					}
				}
				return '<div class="mb-3 pt-1" style="border-top: 1px solid #ddd">' +
					(d.getUTCMonth()+1) + '/' + d.getUTCDate() +
					'/' + d.getUTCFullYear() +
					' -- $' + p.mc_gross + ' ' +
					`<div class="ml-2">
					Donor: ${donor}<BR>
					Designation: ${designation}
					${staffFamily}
					</div>
					</div>`
			})
			.join('') + '</span>'
		);
		// if there are any staff families then fill in their names.
		let sfna = rpd.qsaa('.staff-family-name[data-id]');
		if (sfna.length) {
			function fillStaffFamilyNames() {
				if (!rpd.staffFamily) {
					// load the staff family data from the server.
					fetch('/cr/sched_update.aspx?dt=staff', { method: 'get' })
					.then(r => r.json())
					.then(j => { rpd.staffFamily = j;
								fillStaffFamilyNames()} )
					return;
				}
				
				sfna.forEach(function(f) {
					let c = f.dataset.id;
					let s = rpd.staffFamily.find(sf => c == sf.CATNUM);
					if (s) {
						f.innerHTML = `Family: ${s.donationpagename}`;
					}
				})
			}
			fillStaffFamilyNames();
		}
	}

	// must have a valid adult/college contact, we need to know who
	// the donation is coming from.
	let myad = rpd.addressList.filter(rpd.cuf);
	let contacts = rpd.campers.filter(c => c.weblogin_id == rpd.efWL &&
		/college|adult/i.test(c.age))
		.filter(c => myad.find(a => c.address == a.address))
	if (!contacts || !contacts.length) {
		// go to the add contact page.
		popAlert('You must add an adult or college-age contact with an address so we know who the donation is from.',
		'Please Add Contact', function() {
			location.hash = '#list';
			return;
		})
		return;
	}

	if (unfinishedPayment()) {
		// could be a registration or a donation.
		// for now, if not a donation, we're done.
		let upd = rpd.paymentDetails.find(pd => !pd.c && 2 == pd.t &&
			rpd.efWL == pd.w);
		if (!upd) {
			// unfinished, non-donation
			return;
		}
		// to determine total amount get all the paymentDetails records with this
		// regnum
		let r = upd.r;
		let pda = unpaidPaymentDetails(r);
		let totalAmount = 0;
		pda.forEach(pd => totalAmount += pd.a);

		// set things up for the user to decide whether to
		// complete the donation already started.
		_CB.setHTML('donation-text',
		`<p>You have started a donation of $${totalAmount}. Would you like to continue?</p>`)
		rpd.qbv('Donate').onclick = function() {
			// since the payment details are already recorded
			// at this point we just need to set up paypal buttons.

			// disable the donate button.
			rpd.qbv('Donate').disabled = true;
			paypalDonate(pda);
		};
		rpd.qbv('Cancel').onclick = function() {
			cancelUnpaidPayment(resetViewToDefault);
		};
		return;
	}

	// set up for calculating the finance charges if
	// the checkbox is checked.
	rpd.unhideID('pp-finance-charges-p');
	let fcCheckbox = rpd.qs('#pp-finance-checkbox');
	let da = rpd.qs('#donate-amount');
	fcCheckbox.onchange = showFinanceCharge;
	da.oninput = showFinanceCharge;

	// take checkbox and amount into account.
	function showFinanceCharge() {
		let fcd = rpd.qs('#pp-finance-charge-display');
		let a = donateAmount();
		if (!fcCheckbox.checked || a == '' || a == 0) {
			fcd.innerHTML = '';
		} else {
			// display finance charge amount.
			fcd.innerHTML = `Estimated Finance Charges: $${rpd.calcPPFees(a)}<BR>
			Total Donation: $${Number(Number(a) + Number(rpd.calcPPFees(a))).toFixed(2)}`;
		}
	}

	function donateAmount() {
		if (!da.validity.valid) {
			return 0;
		}
		return da.value.trim();
	}

	rpd.unhideID('choose-donor-div');
	let dSel = rpd.qs('#donor-id');
	// setup the donor select if there is more than
	// one contact.
	if (contacts.length > 1) {
		loadSelectFromArray(
			contacts.map(c => `${c.firstname} ${c.lastname}`),
			dSel,
			contacts.map(c => c.camper_id)
		);

	} else {
		// get rid of the select, item since we don't need that.
		dSel.remove();

		// indicate the donor, since there is only one contact.
		rpd.sqs('#choose-donor-text',
		`<p>This gift is from ${contacts[0].firstname} ${contacts[0].lastname}.
		</p>
		<input id="donor-id" type="hidden" value="${contacts[0].camper_id}">`
		);
	}

	// set up donation designation select element
	// donation-designation
	let ddsel = rpd.qs('#donation-designation');
	let ddar = rpd.dDesignations;
	if (ddsel && ddar && ddar.length > 1) {
		rpd.unhideID('designation-text');
		loadSelectFromArray(
			ddar.map(d => d.designation),
			ddsel,
			ddar.map(d => d.id)
		);
		ddar.forEach(d => 
			// unhide the text for each designation that is active.
			rpd.unhideEl(rpd.qs(`#designation-text li[data-id="${d.id}"]`))
		)
	}

	let sfsel = rpd.qs('#donation-staff-family');
	let imoInput = rpd.qs('#donation-memorial-imo');

	// load the list of Resident Missionary Staff families into the
	// select so the user can choose which of them to receive the
	// donated money.
	function loadStaffFamilyList() {
		let picdiv = rpd.qs('#des-staff-family-pic-div');
		picdiv.innerHTML = '';

		if (!rpd.staffFamily) {
			// load the staff family data from the server.
			fetch('/cr/sched_update.aspx?dt=staff', { method: 'get' })
			.then(r => r.json())
			.then(j => { rpd.staffFamily = j;
						loadStaffFamilyList()} )
			return;
		}
		let sf = rpd.staffFamily.filter(s => s.donationpageactive);
		if (sfsel.options.length < 2) {
			loadSelectFromArray(
				sf.map(s => s.donationpagename),
				sfsel,
				sf.map(s => s.CATNUM));
		}
		sfsel.selectedIndex = 0;

		sfsel.onchange = function() {
			// show picture of the selected staff family.
			let newPic = '';
			let sfCAT = sfsel.value;
			if (sfCAT) {
				let sfData = rpd.staffFamily.find(s => sfCAT == s.CATNUM);
				if (sfData) {
					newPic = `<img style="max-width:150px;width:98%" src="https://www.campbarakel.org${sfData.BIGPHOTO}">`;
				}
			}
			picdiv.innerHTML = newPic;
			window.setTimeout(function() {
				rpd.smoothScrollCenter(rpd.qs('#donate-amount'));
			}, 150);
		}
		rpd.smoothScrollCenter(sfsel);
	}

	ddsel.onchange = function() {
		let sfd = rpd.qs('#des-staff-family-div');
		if (4 == ddsel.value) {
			rpd.unhideEl(sfd);
			// fill in the family names if they're not already loaded
			loadStaffFamilyList();
		} else {
			rpd.hideEl(sfd);
		}

		// in memorial of
		let imo = rpd.qs('#des-memorial-div');
		if (5 == ddsel.value) {
			rpd.unhideEl(imo);
		} else {
			rpd.hideEl(imo);
		}
	}

	// no unfinished payment, start a new payment.
	rpd.qbv('Cancel').onclick = function() {
		// check to see if a donation was started.
		// if there is a partial donation payment in
		// progress, then cancel it.
		let pd = rpd.paymentDetails.find(p => !p.c &&
			2 == p.t && p.w == rpd.efWL);
		if (pd) {
			cancelUnpaidPayment(resetViewToDefault);
		} else {
			// nothing in progress, go to default.
			resetViewToDefault();
		}
	}

	// get the details on the donor for the record.
	function donorDetails() {
		let cid = rpd.qs('#donor-id').value;
		if (!cid) {
			return false;
		}
		return rpd.findCamper(cid);
	}

	rpd.qbv('Donate').onclick = function() {
		let amount = donateAmount();
		if (!amount) {
			popAlert('Please choose a whole dollar amount $5-$99999', 'Donation');
			return;
		}

		let totalAmount = amount;

		if (fcCheckbox.checked) {
			totalAmount = Number(Number(amount) + Number(rpd.calcPPFees(amount))).toFixed(2);
		}


		let donor = donorDetails();

		// set up a payments_detail record for this donation
		// and then set up the paypal buttons.
		let pda = [{
			r: -1,
			a: amount,
			d: donor ? `${donor.firstname} ${donor.lastname}` : '',
			ci: donor ? donor.camper_id : 0, // camper_id of donor
			t: 2, // donation
			ds: ddsel.value, // designation
			cn: 0,
		}];

		if (4 == ddsel.value) {
			// RMS Family.
			pda[0].cn = sfsel.value;
			if (!sfsel.value) {
				popAlert('Please choose Resident Missionary Staff family.');
				return;
			}
		}

		if (5 == ddsel.value) {
			// In Memory of. Include memorial designation in details
			if (!imoInput.value) {
				popAlert('Please enter memorial designation.');
				return;
			}
			pda[0].d = imoInput.value.substring(0, 48);
		}

		_CB.setHTML('donation-text',
		`<p>Complete your donation of $${totalAmount} with Paypal
		or your debit or credit card.</p>`);
		rpd.qbv('Donate').disabled = true;

		// if user is covering finance charges, list that separately.
		if (fcCheckbox.checked) {
			pda.push({
				r: -1,
				a: rpd.calcPPFees(amount),
				t: 4, // Fees
				d: pda[0].d,
				ci: pda[0].ci,
				ds: pda[0].ds,
				cn: pda[0].cn,
			});
		}
		recordExpectedPayment(pda, paypalDonate);

	};
} // donate()

// load paypal javascript and get ready
// to start Paypal buttons.
function loadPaypalScript()
{
	const disableFunding = 'credit';
	let ppClientID = '';
	if (rpd.testdb()) { // sandbox vs production paypal.
		ppClientID = 'Ac1kTgRGH4ykplpNBZnuCRgLpLMYhuCSIO78SCs_s26lz-DETkWZLTssrv_dvSI9vSfFWhEYubyN0CCO';
	} else {
		// production
		ppClientID = 'Adcr_rcZO-Yy-4HlvXRFMbzVENG5KO1SsJqJvUXS_4j_g555ZPcObzTdBGtghhiGhNBIl8hCzHIQlrV0';
	}

	// are we on a page with a paypal-button-container?
	if (!rpd.qs('#paypal-button-container')) {
		loadTemplate('paypalpay');	// no.  load paypal pay page.
	}

	// load paypal script info if not loaded already
	if (typeof paypal == 'undefined') {
		rpd.sqs('#paypal-button-container', 'Loading Paypal...');
		let pays = document.createElement('script');
		pays.src = `https://www.paypal.com/sdk/js?client-id=${ppClientID}&disable-funding=${disableFunding}`;
		pays.async = false;
		document.head.appendChild(pays);
	}
	rpd.sqs('#paypal-button-container', '');
} // loadPaypalScript()

// user wants to donate and we have already
// set up a payments_detail record for the payment.
// Now set up paypal buttons.
function paypalDonate(pdArray)
{
	let nowFee = 0;
	pdArray.forEach(pd => nowFee += pd.a);

	loadPaypalScript();
	const descrStr = 'Donation to Camp Barakel';
	
	// rn is a random number that becomes part of the invoice id.
	let rn = Math.floor(Math.random() * 9999) + '-' + rpd.now.getTime();
	let invoice_id = rpd.email + ' ' + pdArray[0].r + ' ' + rn;

	waitForPaypal();

	function waitForPaypal() {
		// wait for paypal to be ready.
		// render the Paypal buttons and provide hooks for events.
		if (typeof paypal == 'undefined') {
			window.setTimeout(waitForPaypal, 50);
			return;
		}
		paypal.Buttons({
		createOrder: function(data, actions) { // create the paypal order
			return actions.order.create({
				purchase_units: [{
				amount: {
					value: nowFee
				},
				invoice_id: invoice_id,
				description: descrStr,
				}]
			});
			},
		onCancel: function() { // user has cancelled the donation

			cancelUnpaidPayment(resetViewToDefault);
		},
		onApprove: function(data, actions) {
			waitMessage(true);
			return actions.order.capture().then(
				function(details) {
					let payment = {
						mc_gross: nowFee,
						cash: 0,
						checkno: 1,
						remarks: "Paypal",
						payment_status: 'Completed',
						email: rpd.email,
						regnum: pdArray[0].r,
						ipn: JSON.stringify(details),
						invoice: invoice_id,
						adjustment: 0
					};
					
					// save payment info on the server and
					// update local info to reflect the update.
					updateDB(
						{
							payment: JSON.stringify(payment),
							email: rpd.email
						}, donationComplete						
					);
				})
		}}).render('#paypal-button-container'); // Display payment options on your web page
	}

} // paypalDonate

function donationComplete(d)
{
	let donationAmount = 0;
	waitMessage(false);
	try {
		let sr = JSON.parse(d);
		if (!Array.isArray(sr.payments) ||
			!sr.payments.length) {
			popAlert('donation complete - srv error<BR>' + d);
			return;
		}
		let payment = sr.payments[0];
		donationAmount = payment.mc_gross;

		// add this latest payment to the top since it will have the
		// most negative regnum.
		rpd.payments.unshift(payment);

		// update the payment_details row(s).
		if (Array.isArray(sr.paymentDetails) && sr.paymentDetails.length) {
			rpd.paymentDetails = rpd.paymentDetails.filter(pd =>
				pd.r != payment.regnum || pd.w != payment.weblogin_id);
			rpd.paymentDetails = rpd.paymentDetails.concat(sr.paymentDetails);
		}

	} catch(e) {
		popAlert('Server says:<BR>' + e.message + '<br>' + d);
		return;
	}
	// show a thank you page.
	loadTemplate('donate');
	_CB.setHTML('donation-text',
		`<p>Thank you for your donation of $${donationAmount}.
		</p>`);
	// remove the donate buttons
	_CB.setHTML('donation-buttons', '');
}

// if there is an unfinished transaction outstanding
// (payment or registration) set up to have
// user complete the transaction and return true.
// return false if no unfinished transaction.
function unfinishedPayment()
{
	if (rpd.ope && rpd.ce) {
		// there is an outstanding unpaid registration.
		gotoPayEvent();
		return true;
	}

	let pd = rpd.paymentDetails.find(pd => !pd.c && rpd.efWL == pd.w);
	if (!pd) {
		// no incomplete payments
		// for this user in payment_details.
		return false;
	}

	if (2 == pd.t) {
		// unfinished donation. Let the donate normal
		// flow handle this.
		location.hash = '#donate';
		return true;
	}

	if (!impersonating()) {
		// For non-admin
		// Anything else unpaid (trading post money or fees)
		// we just cancel it.
		// Admins will need to deal with this
		// if they want to change the registration with
		// unfinished payments.
		cancelUnpaidPayment(regMain);
	}

	return false;
}

// go to the housing page.
// this updates hash and transitions nicely
// to regHousing()
function doHousing()
{
	rpd.goto('housing');
}

// current event ready for checkout?
function regReadyForCheckout()
{
	if (rpd.isBlocked()) {
		return false;
	}

	if (rpd.pendingCampers.length < 1 || !rpd.ce) {
		// no people/event to work with.
		doCancelEvent();
		return false;
	}
	cbER.setup(null, rpd.ce);
	if (rpd.pendingCampers.length < cbER.minNeeded ||
		rpd.pendingCampers.length > cbER.maxAllowed)
	{
		// not enough or too many campers.  should not be here...
		doCancelEvent();
		return false;
	}
	return true;
}

// for housing and payment.
function setEventNameAndCampers(template_id, bNoBirthday)
{
	loadTemplate(template_id);
	rpd.sqs('#eventName', rpd.ceNameDate(rpd.ce));

	function personInfo(camper_id) {
		if (camper_id <= 0)
			return ' ';
		let c = rpd.findCamper(camper_id);
		if (!c)
			return '';
		let r = [ c.gender == 'girl' ? 'Female' : 'Male',
			c.age.match(/^\d+$/) ? 'Grade ' + c.age : c.age
	 	];
		if (!c.birth_date.match(/^0001/) && rpd.ce &&
			!bNoBirthday) {
			var bd = rpd.zdt(c.birth_date);
			var ageAtBegin = dateDiffDays(bd, rpd.ce.start_date) / 365;
			r.push(rpd.shrtDate(bd, true) +
				' -- Age ' + ageAtBegin.toFixed(1));
		}
		let ad = rpd.findAddress(c.address, rpd.efWL);
		[	[ad, ad ? (ad.city + ', ' + ad.state) : ''],
			[c.email, c.email],
			[c.cell_phone, c.cell_phone + ' (C)'],
			[c.home_phone, c.home_phone + ' (H)'],
			[c.churchname, 'Church: ' + c.churchname]].forEach(function(s) {
				if (s[0] && s[0] != '')
					r.push(s[1]);
			})
		
		// for summer camper, include information about parent.
		if ('summer' == rpd.ce.season) {
			let prt = c.prt && rpd.findCamper(c.prt);
			if (!prt) {
				r.push('<BR>No parent info.');
			} else {
				r.push('<BR>PARENT:');
				r.push(personName(prt));
				[	[prt.email, prt.email],
					[prt.cell_phone, prt.cell_phone + ' (C)'],
					[prt.home_phone, prt.home_phone + ' (H)'],
					[prt.churchname, 'Church: ' + prt.churchname]]
				.forEach(function(s) {
					if (s[0] && s[0] != '')
						r.push(s[1]);
				})
			}

		}
		return '<div class="ci ml-2">' +
			r.join('<BR>') + '</div>';
	}
	// create and fill in camper list.
	_CB.setHTML('cTblID',
		rpd.pendingCampers
		.filter(pc => pc > 0)
		.map(pc => '<div class="collapsed-children ml-2 mr-2 pointer">' +
			personName(pc) + personInfo(pc) + '</div>')
	.join(''));

	// toggle collapsed-children on click.
	_CB.qsafn('#cTblID .collapsed-children', function(el) {
		el.onclick = function(ev) {
			ev.target.classList.toggle('show');
		}
	})
	if (_CB.wt) { // winter teen specifics.
		_CB.wt.setCamperInfo();
	}
}

// read the housing/buddy info from the housingdiv form.
function getNewHousingValueFromForm()
{
	let f = rpd.qs('#housingdiv form');
	if (!f) {
		return '';
	}
	let newHousing = '';
	if (cbER.housingWanted) {
		newHousing = rpd.ptas(f.housing.value);

		if (cbER.extraHousingQuestions?.getFormValue) {
			newHousing = cbER.extraHousingQuestions.getFormValue(f, newHousing);
		}
	}

	return newHousing;
}

// interface with the server's changeCamper command.
// cc is ChangeCamper type.
// cb is the callback on success.
function changeCamperCmd(cc, cb) {
	// fill in fees if needed
	if (!cc.hasOwnProperty('newDepositAmount') ||
		!cc.hasOwnProperty('newTotalFees')) {

		let fees = rpd.totalRegistrationFees(cc.regnum, cc.campevent_id, 0);
		cc.newDepositAmount = fees[0];
		cc.newTotalFees = fees[1];
	}
	cc.changeCamperVersion = 2;
	updateDB({ changeCamper: JSON.stringify(cc)},
	function(d) {
		if (rpd.notOKFail(d))
			return;

		// update fees on the main pe in local data.
		let pe1 = rpd.filterReg(cc.regnum, rpd.efWL)
			.filter(rpd.filter1)
			.filter(pe => pe.campevent_id == cc.campevent_id);
		if (pe1.length) {
			pe1.forEach(function(pe11) {
				pe11.payment_auth = cc.newDepositAmount;
				pe11.balance_remaining = cc.newTotalFees;
			})
		}

		cb();
	});
}

function saveHousing(pe1, newHousing, cb)
{
	changeCamperCmd(
		{
			campers: [pe1.camper_id],
			regnum: pe1.regnum,
			ad: true,
			newHousingNote: newHousing,
			waitlist: pe1.wl,
			campevent_id: pe1.campevent_id,
		},
		function() {
			// update internal variables
			pe1.note_to_camp = newHousing;
			saveDone();
		}
	)

	function saveDone() {
		// if needed, extra saving for this type of event.
		if (cbER.extraHousingQuestions?.saveDB) {
			cbER.extraHousingQuestions.saveDB(pe1, newHousing, cb);
		} else {
			if (cb) {
				cb();
			}
		}
	}
}

// edit housing - this is for an already-existing registration.
// we come here from the viewregistration page but don't change the hash.
function editHousing(regnum, wlid)
{
	function resetView() {
		// back to viewRegistration where we started.
		viewRegistration(location.hash);
	}
	let pear = rpd.loadRegnum(regnum, wlid);
	let pe1 = rpd.findReg1(pear);
	rpd.pendingHousingInfo = pe1.note_to_camp;
	regHousingCommon();

	let paybutton = rpd.qs('.pay-button');
	// Pay/First button should say 'Save'.
	paybutton.value = 'Save';
	paybutton.onclick = function shClicked() {
		let newHousing = getNewHousingValueFromForm();
		if (newHousing == pe1.note_to_camp) {
			// no change, we are done.
			resetView();
			return;
		}
		saveHousing(pe1, newHousing, resetView);
	}
	rpd.qbv('Cancel').onclick = resetView;
}

// render page - set up for entering housing preferences.
// we come here with rpd.pendingCampers and rpd.ce set.
function regHousing() {
	if (!regReadyForCheckout()) {
		return;
	}

	// for winter teen we don't save placeholder immediately
	// since we don't know total number of campers/sponsors yet.
	if (_CB.wt && _CB.wt.wtMatch(rpd.ce)) {
		regHousingCommon();
		return;
	}

	// check if this person is already registered or
	// waitlisted on a similar event so that we need to
	// add personevent record. The normal flow for a new registration
	// not already on a waitlist or registered is recordUnpaidReg.
	if (cbER.awl) {
		// find a similar personevent if there is one.
		let spe = rpd.getSimilarPE(rpd.pendingCampers[0], rpd.ce);
		if (spe) {
			// use the regnum from the similar personevent
			let fees = cbER.fees(0); // assumes only one camper for now.
			changeCamperCmd(
				{
					campers: rpd.pendingCampers,
					regnum: spe.regnum,
					ad: true,
					newHousingNote: rpd.pendingHousingInfo || '',
					campevent_id: rpd.ce.campevent_id,
					waitlist: rpd.pendingWaitlist ? 1 : 0,
					newDepositAmount: fees[0],
					newTotalFees: fees[1],
				},
				function() {
					// update our internal variables
					// to show the new personEvent table entry.
					let npe = Object.assign({}, spe);
					npe.payment_auth = fees[0];
					npe.balance_remaining = fees[1];
					npe.campevent_id = rpd.ce.campevent_id;
					npe.wl = rpd.pendingWaitlist ? 1 : 0;
					npe.wl_date = Date.now();
					rpd.personEvent.push(npe);
					// if this was a real registration then we
					// subtract the new people from availble space in
					// the event.
					if (!rpd.pendingWaitlist) {
						rpd.updateAvailableSpace(rpd.ce.campevent_id, -rpd.pendingCampers.length)
					}

					if (!rpd.userIsAdmin && rpd.pendingWaitlist) {
						// need to get waitlist data for this
						// event so user knows their place in line.
						// we'll just get the whole package.
						updateDB( { cmd: 'package' }, function(d) {
							try {
								let rpdUpdate = JSON.parse(d);
								rpd.events = rpdUpdate.events;
								rpd.personEvent = rpdUpdate.personEvent;
								rpd.utmo = new Date();
							} catch(e) {
								console.log(`package error: ${e.message}\n${d}`);
							}
							regHousingCommon();
						});
						return;
					}
					// keep going forward with
					// housing/buddy preferences
					regHousingCommon();
				}
			);
			return;
		}
	}
	// first save the unpaid registration so that the place in
	// the event is reserved.
	recordUnpaidReg(regHousingCommon);
}


// User either wants to enter housing for the first time
// or edit housing preferences.
function regHousingCommon()
{
	if (!cbER.housingWanted) {
		gotoPayEvent();
		return;
	}

	setEventNameAndCampers('housingdiv');

	// load any existing housing/buddy info
	if (rpd.pendingHousingInfo) {
		var f = rpd.qs('form');
		if (cbER.housingWanted) {
			if (rpd.pendingHousingInfo.match(/none. i have no housing preferences/i)) {
				f.housingNone.checked = true;
			} else {
				f.housing.value = rpd.pendingHousingInfo;
			}

			// finish setting up the form for other "housing" questions.
			if (cbER.extraHousingQuestions?.loadForm) {
				cbER.extraHousingQuestions.loadForm(f);
			}
		}
	}

	if (cbER.extraHousingQuestions?.showForm) {
		cbER.extraHousingQuestions.showForm();
	}

	// special housing message for this event?
	if (cbER.housingMessage) {
		rpd.qs('textarea[name="housing"]')
			.insertAdjacentHTML('beforebegin', cbER.housingMessage);
	}

	// winter teen housing is handled separately.
	if (_CB.wt && _CB.wt.regHousing()) {
		return;
	}
	xxSetupValidation(housingValidation);
}

// validation for the housing page.
// don't enable the Pay button on the housing page
// unless the user has told us something about their
// housing preferences (or indicated they have no preferences).
function housingValidation()
{
	let f = rpd.qs('form');
	if (cbER.housingWanted) {
		// for everything except summer camp, we need a response for
		// the standard housing question.
		// did user check the 'no preference' checkbox?
		let bHousingInvalid = false;

		if (! /summer/i.test(cbER.ev.season)) {
			if (f.housingNone.checked) {
				// no housing preferences
				f.housing.value = rpd.noHousingPreferencesString;
				f.housing.disabled = true;
			}
			if (!f.housingNone.checked && f.housing.disabled) {
				f.housing.disabled = false;
				f.housing.value = '';
			}
	
			bHousingInvalid = f.housing.value.trim() == '';
		}

		setInvalidField(bHousingInvalid, f.housing);
		if (cbER.extraHousingQuestions?.formInvalid) {
			bHousingInvalid = cbER.extraHousingQuestions.formInvalid(f, bHousingInvalid);
		}
		rpd.qs('.pay-button').disabled = bHousingInvalid;
	}
}

// is it ok for user to pay deposit only
// based on number of days until rpd.ce event starts.
function depositOnlyDaysOK() {
	return daysToGo() > 27;
}

// days to go from now until rpd.ce begins
function daysToGo()
{
	return dateDiffDays(Date.now(), rpd.ce.start_date);
}

// return the difference between the two dates in days. (d2-d1)
function dateDiffDays(d1, d2)
{
	return _CB.dateDiffDays(d1, d2);
}

// set up to pay for the event.
// this is handled by payEvent()
function gotoPayEvent()
{
	rpd.goto('pay');
}

// Ask user if they want to include trading post
// money in the initial registration.
function askAboutTradingPost(pe1)
{
	if (!cbER.tradingPostMoney) {
		return false; // no TP money allowed for this event.
	}

	// do we already have trading post money recorded
	// for this registration?
	if ('' !== rpd.pendingTradingPost) {
		return false;
	}

	// if this is a wait list addition
	// rather than a registration then
	// we don't ask about trading post.
	if (rpd.pendingWaitlist) {
		return false;
	}

	// we need to ask for trading post money
	setEventNameAndCampers('paypalpay');
	rpd.hideID('paymentNormalInstructions');
	rpd.unhideID('tradingPostInstructions');
	rpd.qs('h1').innerHTML = 'Trading Post';
	let cbut = rpd.qs('.paybuttons input[name="payt"]');
	cbut.value = "Continue";
	rpd.setupTPPay(pe1);
	// if user presses the continue button then
	// we capture the amount for the trading post
	// and move on to the payment.
	cbut.onclick = function() {
		let tp = rpd.qin('tp-money');
		rpd.pendingTradingPost = tp.value;
		if ('' == rpd.pendingTradingPost) {
			rpd.pendingTradingPost = 0;
		}
		payEvent();
	}

	return true;
}

// show form and buttons to set up for paying.
// this is the normal flow for paying for the first
// time on a registration.
// at this point the registration has already been reserved.
// we may need to ask for and/or save housing.
// we may need to ask for and/or save trading post.
function payEvent()
{
	if (!regReadyForCheckout()) {
		resetViewToDefault();
		return;
	}

	if (rpd.qs('#housingdiv')) {
		// we're on the housing page so get the housing info.
		rpd.pendingHousingInfo = getNewHousingValueFromForm();
	}
	if (cbER.housingWanted && !rpd.pendingHousingInfo) {
		// we are missing required housing info.
		doHousing();
		return;
	}

	let r1 = rpd.getPE1s()
		.filter(pe => pe.campevent_id == rpd.ce.campevent_id &&
			rpd.pendingCampers.includes(pe.camper_id));
	if (1 != r1.length) {
		rpd.popAlert('payEvent - Data issue - r1.length=' + r1.length);
		resetViewToDefault();
		return;
	}
	let thisPE1 = r1[0];

	// do we need to save the housing info?
	if (cbER.housingWanted &&
		thisPE1.note_to_camp != rpd.pendingHousingInfo)
	{
		saveHousing(thisPE1, rpd.pendingHousingInfo, payEvent);
		return;
	}

	// if this new registration/waitlist has already been paid
	// via another similar registration/waitlist then we don't need
	// to pay again. Check on that.
	if (/completed/i.test(thisPE1.reg_status)) {
		// this has already been paid.
		// We are done, view the registration.
		rpd.popAlert(`Successful ${thisPE1.wl ? 'waitlist addition' : 'registration'}`)
		doViewRegistration(thisPE1.regnum, rpd.efWL);
		return;
	}

	// set up the pay buttons with the right amounts.
	var deposit = 0;
	var totalBalance = 0;
	rpd.pendingCampers.forEach(function(ci, idx) {
		var fees = cbER.fees(idx);
		deposit += fees[0];
		totalBalance += fees[1];
	});

	// if total balance is zero (because this is a non-paid event)
	// then we mark this as completed, 0 payment, and we're done.
	if (0 == totalBalance) {
		let email = impersonating() ? rpd.efEmail : rpd.email;

		// save pseudo-payment info on the server and
		// update local info to reflect the update.
		updateDB(
			{
				payment: JSON.stringify({ 
					mc_gross: 0,
					cash: 1,
					checkno: 0,
					remarks: 'No Payment',
					payment_status: 'Completed',
					email: email,
					regnum: thisPE1.regnum,
					ipn: 'no pay event - ' + rpd.ce.name,
					invoice: 'No invoice',
					adjustment: 0
				}),
				email: email
			},
			rpd.afterPaymentRecorded
		);
		return;
	}

	// if this is office work we set up office payment
	if (impersonating()) {
		officePay();
		return;
	}

	if (askAboutTradingPost(thisPE1)) {
		// we are asking about trading post money.
		return;
	}

	// this is someone who is heading towards paying their
	// own registration via paypal.
	setEventNameAndCampers('paypalpay');
	let btnPayDeposit = rpd.qin('payd');
	btnPayDeposit.value = 'Pay Deposit $' + deposit;
	btnPayDeposit.onclick = function() { doPay(deposit) };

	let btnPayTotal = rpd.qin('payt');
	if (depositOnlyDaysOK()) {
		// it is not too late to pay deposit only
		// so we unhide the pay deposit button.
		rpd.unhideEl(btnPayDeposit);
		rpd.unhideID('pay-deposit-text');
	} else {
		rpd.sqs("#depOrTotal", 'Since there isn&rsquo;t ' +
			'much time until the event begins, you need to pay the ' +
			'total fee.');
	}

	btnPayTotal.value = 'Pay Total $' + totalBalance;
	btnPayTotal.onclick = function() { doPay(totalBalance) };

	if (rpd.pendingWaitlist) {
		// for this waitlist that requires money,
		// user only pays the deposit amount.
		rpd.unhideEl(btnPayDeposit);
		rpd.hideEl(btnPayTotal);
		rpd.sqs("#pay-deposit-text",
			`Pay the deposit fee to join the waitlist for this event.`);
		rpd.unhideID('pay-deposit-text');

		rpd.sqs("#paymentNormalInstructions", `<p>Pay the Deposit now
		using your Paypal account or a credit or debit card.
		</p><p>
		If you are eventually registered for this event, you will need
		to pay the remaining balance at least one week before
		the event begins.</p>`);
		doPay(deposit);
	}


	// fill in trading post money
	if ('' !== rpd.pendingTradingPost) {
		rpd.qin('tp-money').value = rpd.pendingTradingPost;
	}

	// hook for event-specific pay code. (i.e. winterteen)
	if (cbER.payScreenFn) {
		cbER.payScreenFn();
	}

	// if payment details have already been recorded then we
	// go directly to show the paypal buttons for the amount
	// the user has already asked for.
	let pda = unpaidPaymentDetails(rpd.ope.regnum);
	if (pda.length) {
		doPay(0); // get the amount from paymentDetails.
		return;
	}

} // payEvent()

// random person wants to pay more on this registration. - opaymore
function payMore() {
	// parse out the incoming hash.
	loadTemplate('paypalpay');
	hideRN();
	function hideRN() {
		// hide navigation if not logged in.
		if (!rpd.email) {
			rpd.hideID('regnav');
		}

		// hide the normal pay & cancel buttons on this page.
		rpd.hideEl(rpd.qin('payt'));
		rpd.hideEl(rpd.qbv('Cancel'));
	}

	if (!location.hash.match(/opaymore\/(\d+)\/(\d+)\/(\d+)\/(\w{8})$/)) {
		// invalid.
		_CB.setHTML('instrID', '<p>Invalid Pay More URL</p>');
		return;
	}
	let regnum = RegExp.$1;
	let wlid = RegExp.$2;
	let cid = RegExp.$3;
	let rkey = RegExp.$4;

	// get info for this registration.
	// if we don't already have it.
	let pear = rpd.personEvent && rpd.filterReg(regnum, wlid);

	if (pear && pear.length) {
		showPMResults();
		return;
	}
	rpd.qs('#instrID').innerHTML = `<p>Retreiving data.</p>`;
	rpd.ebc = '';
	// get the info.
	updateDB( { cmd: 'package-1reg',
			reg: JSON.stringify({regnum, wlid, cid, rkey})
		},
		function(d) {
			try {
				rpd = JSON.parse(d);
				rpd.efWL = wlid;
			} catch(e) {
				popAlert('package error: ' + d, 'Error');
				_CB.setHTML('instrID', '');
				rpd.qs('.paybuttons').insertAdjacentHTML('beforebegin',
				'<p>ERROR</p>' +
				'<P>' + d + '</p>');
				return;
			}
			regInit();
			showPMResults();
		}
	);

	// display info for the one registration and set up
	// for the person to pay.
	function showPMResults() {
		pear = rpd.personEvent && rpd.loadRegnum(regnum, wlid);
		if (!pear || !pear.length) {
			_CB.setHTML('instrID', '<P>Still bad.</p>');
		}
		setEventNameAndCampers('paypalpay', true); // no birthday info

		let rps = rpd.rpstats(pear);
		if (pear && pear.length && 1 == pear.length &&
				cbER.tradingPostMoney)
		{
			let pe1 = pear[0];
			if (/latetp/i.test(pe1.note_from_camp)) {
				cbER.tradingPostMoreMoney = true;
			}
		}

		// is there a payment already in progress on this registration?
		let pda = unpaidPaymentDetails(regnum);
		if (pda.length) {
			rpd.qs('.paybuttons').insertAdjacentHTML('beforebegin',
			`<p>There is already an unfinished payment in progress on this registration.
			Please Cancel and restart if this is yours, otherwise please coordinate
			with others who are paying money towards this registration.</p>`);
			rpd.hideEl(rpd.qs('.paybuttons [name="payt"]'));
			rpd.qs('.paybuttons [value="Cancel"]').onclick = function() {
				cancelUnpaidPayment(function() {
					payMore();
				})
			}
			return;
		}
		hideRN();
		let strI = 'You can pay more on this registration.';
		if (rps.balance <= 0) {
			strI = 'There is no balance due on this' +
				' registration so you cannot pay any more towards the registration fees.';
		}
		if (cbER.tradingPostMoreMoney) {
			strI += ' You can add to the Trading Post money if you&rsquo;d like.';
		} else {
			if (cbER.tradingPostMoney) {
				strI += ' It is too late to add trading post money.';
			}
		}

		_CB.setHTML('instrID',
			`<p>${strI}<BR><BR>
			Cost: $${rps.total}<BR>
			Paid: $${rps.paid}<BR>
			Balance: $${rps.balance}
			</p>`);

		// remove the default collapsable Trading Post section
		// that's normally on the paypalpay page.
		// we want to use a custom version added in rpd.payMoreButton.
		rpd.qs('#pay-trading-post').remove();
		rpd.qs('.paybuttons').insertAdjacentHTML('beforebegin',
			rpd.payMoreButton);
		if (rps.balance <= 0) {
			let regmoneyInput = rpd.qs('#reg-money input[name="amt"]');
			if (regmoneyInput) {
				regmoneyInput.disabled = true;
			} else {
				console.log('no regmoneyInput')
			}
		}

		// set up trading post functionality if appropriate.
		rpd.setupTPPay(pear[0]);
		rpd.payMoreButtonClick(rps.balance, function(amt) {
			// gotoPaypal uses rpd.email as part of invoice
			// for paypal.
			// We then use this on the server to validate
			// we have the right registration to credit.
			let wl = rpd.findWLID(wlid);
			if (!wl) {
				return;
			}
			rpd.email = wl.email;

			// pay more was clicked with valid amt.
			recordTradingPostPD(gotoPaypal, {
				payNow: amt,
				regnum: regnum
			});
		});

		// we don't want a default value for the amount
		// but the max amount (rps.balance) was filled in
		// as the default amount in payMoreButtonClick.
		rpd.qs('#upm [name="amt"]').value = '0';
	}
} // payMore()

// go to the viewRegistration page.
function doViewRegistration(regnum, wlid)
{
	// in the special case of an opaymore page we refresh the page.
	if (/opaymore/i.test(location.hash)) {
		payMore();
		return;
	}
	let newHash = '#viewreg/' + regnum + '/' + wlid;
	if (newHash == location.hash) {
		viewRegistration(newHash);
		return;
	}
	location.hash = newHash;
}

// show a registration
function viewRegistration(page)
{
	waitMessage(false);
	if (!page.match(/\/(\d+)\/(\d+)$/)) {
		// if we just have regnum in the URL, try to look up weblogin_id
		if (page.match(/\/(\d+)$/)) {
			const r = +RegExp.$1;
			let peA = rpd.personEvent.find(pe => pe.regnum == r);
			if (peA) {
				doViewRegistration(r, peA.weblogin_id);
				return;
			}
		}
		popAlert('bad parameter');
		return;
	}
	var regnum = +RegExp.$1;
	var wlid = +RegExp.$2;

	// pear gets personevents of interest.
	// rpd.ce set up with this campevent.
	// pending campers set up.
	var pear = rpd.loadRegnum(regnum, wlid);
	if (!pear) {
		return; // invalid
	}

	// if this is an unpaid registrations then work on paying.
	if (impersonating() && pear.some(pe => /unpaid/i.test(pe.reg_status))) {
		initRPDevent();
		officePay();
		return;
	}

	// incomplete payment details for this registration?
	// probably trading post payment not finished.
	let pda = unpaidPaymentDetails(regnum);
	if (pda.length) {
		if (impersonating()) {
			// for admin, we just note the details are outstanding
			// but don't cancel them because maybe the user
			// is still working on the payment.
			popAlert('Incomplete payment. ' + 
				'Someone has started but not completed a payment.<BR><BR>' + 
				pda.map(paymentDetailsTextLine)
				.join('<BR>'), 'WARNING');
		} else {
			// for normal users we just cancel the extraneous
			// paymentdetails. User is probably done with the
			// old trading post payment.
			cancelUnpaidPayment(function() {
				viewRegistration(page);
			})
			return;
		}
	}

	// are there any non-cancelled registrations/waitlist entries
	// on this regnum?
	let anyNonCancelled = pear.some(rpd.notCanc);

	// need to set up the event and registration.
	setEventNameAndCampers('viewregistration');
	if (!rpd.ce) {
		return;
	}
	var campevent_id = rpd.ce.campevent_id;
	var ce = rpd.ce;

	let fp = getFeesPayments(pear);
	let rps = fp.rps;
	let pe1 = rpd.findReg1(pear);
	let bAnyKeptFees = fp.bAnyKeptFees;
	
	rpd.opw.setInvoice();

	if (/latetp/i.test(pe1.note_from_camp)) {
		cbER.tradingPostMoreMoney = true;
	}

	// instead of event name for header, we want the camper name(s).
	let cnsa = pear.filter(pe => pe.camper_id != pe1.camper_id &&
		pe.camper_id > 0 &&
		pe.campevent_id == pe1.campevent_id)
		.map(pe => pe.camper_id);
	cnsa.unshift(pe1.camper_id);
	if (cnsa.length > 2) {
		cnsa = cnsa.slice(0, 1);
	}
	let camperNameHeader = cnsa.map(personName)
		.join('<BR>');

	rpd.sqs('#eventName', camperNameHeader);

	// list of payments so far for this registration.
	let paymentList = fp.payments
		.map(function(p) {
			let d = rpd.zdt(p.timestamp);
			let txn = '';
			if (rpd.userIsAdmin) {
				let sb = /api.sandbox.paypal/i.test(p.ipn);
				let tid = paypalTXNID(p); // paypal transaction id.
				if (tid) {
					// admin user can click on paypal transaction id to
					// get details about the paypal transaction.
					let sbt = sb ? ' (Sandbox) ' : '';
					if (p.mc_gross < 0) {
						sbt = ' Refund' + sbt;
					}
					txn = `${sbt} - <a class="pointer" data-sb="${sb}"
						data-txn="${tid}" onclick="ppTXNClick(this)">${tid}</a>`;

					// allow reg admin user to refund this transaction if it's
					// a payment and hasn't already been fully refunded.
					if (rpd.regAdmin()) {
						let refundedSoFarAmount = rpd.payments.filter(p1 =>
							p1.mc_gross < 0 && p1.regnum == p.regnum &&
							p1.weblogin_id == wlid && tid == paypalTXNID(p1))
							.map(p1 => -p1.mc_gross)
							.reduce(rpd.add, 0);
						if (p.mc_gross > 0 && p.mc_gross > refundedSoFarAmount)
						{
							if (refundedSoFarAmount > 0) {
								txn += ` (refunded $${refundedSoFarAmount})`
							}
							if (!bAnyKeptFees && !refundedSoFarAmount) {
								txn += ` <button class="btn btn-primary btn-sm"
								onclick="refundCapturedIfSure(this)"
								data-sb="${sb}" data-txn="${tid}">Refund</button>`;
							}
							txn += `<button class="btn btn-primary btn-sm"
							onclick="partialRefundClick(this)"
							data-regnum="${regnum}" data-wlid="${wlid}"
							data-pnum="${p.pnum}">Partial Refund</button>
							`;
						} else {
							if (p.mc_gross > 0) {
								txn += ' (already refunded)';
							}
						}
					}
				}
				if (! /^paypal/i.test(p.remarks) && /office/i.test(p.ipn)) {
					// office payment.
					txn = ` -- ${p.ipn}` + txn;

					// has this payment already been reversed?
					let re = new RegExp(`reverse office payment ${p.pnum}`);
					let bAlreadyReversed = rpd.payments.filter(rpd.onereg(regnum, rpd.efWL))
						.find(p1 => re.test(p1.remarks));

					// allow registrar to reverse the transaction
					// if it hasn't already been reversed.
					if (rpd.regAdmin() && p.mc_gross > 0 && !bAlreadyReversed) {
						txn += ` <button class="btn btn-primary btn-sm"
						title="Reverse this office payment"
						onclick="reverseOfficePayment(this)"
						data-pnum="${p.pnum}" data-rn="${regnum}">Reverse</button>`;
					}
				}
			}
			let breakdown = '';
			// are there fees or trading post money that need to be noted?
			let dc = fp.pda.filter(pd => pd.p == p.pnum);
			if (dc.length > 0 && (dc.length > 1 || dc[0].t != 1)) {
				breakdown = '<div class="ml-3 mr-3">' +
					dc.map(paymentDetailsTextLine)
					.join('<BR>') + '</div>';
			}
			let yearStr = d.getFullYear() == rpd.currentYearNow ? '' : `/${d.getFullYear()}`;
			
			return '<div>' + (d.getMonth()+1) + '/' + d.getDate() + yearStr +
				' -- $' + rpd.dollarsOrCents(p.mc_gross) + ' ' +
				p.remarks + txn + breakdown +
				'</div>';
		});
	
	let unfinishedPDAText = '';
	// for admin, if there are unfinished payment details, show those too.
	if (impersonating() && pda.length) {
		unfinishedPDAText = `<div class="mt-3"><strong>Unfinished payment:</strong>
			<input type="button" value="Cancel Unfinished Payment" 
				class="btn btn-primary btn-sm">
			<BR>
			${pda.map(paymentDetailsTextLine).join('<BR>')}
			</div>`
	}
	paymentList = paymentList.length ? '<div class="card card-body mb-3">' +
		'<div><u>Payment Details:</u></div>' +
		paymentList.join('') + unfinishedPDAText +
		'</div>' : '';


	function housing() { // view registration - housing info. section
		let housingText = `Housing:<BR>${pe1.note_to_camp}`;
		let opaymore = '';

		// opaymore link possible if not winter teen if balance
		// or summer camper for trading post money.
		if (!(_CB.wt && _CB.wt.wtMatch(rpd.ce)) &&
			rpd.notCanc(pe1) &&
			(rps.balance > 0 || cbER.tradingPostMoreMoney)) {
			if (!pe1.wl) {
				if (rpd.impersonating()) {
					// admins need to look something up to come up with the link.
					opaymore = `<div class="hs d-inline-block"><button class="btn btn-secondary"
						style="font-size:0.7rem"
						onclick="rpd.lookupopm(this)" data-regnum="${regnum}" data-wlid="${wlid}"
						data-cid="${pe1.camper_id}"
						>Lookup opaymore.</button></div>`
				} else {
					let pml = '';
					let url = location.href;
					let rkey = rpd.getCookieValue('EMAIL');
					if (rpd.findCamper(pe1.camper_id) &&
						rkey && rkey.length > 40 &&
						url.match(/^(.+)#/))
					{
						// last 8 chars of EMAIL cookie.
						url = RegExp.$1 + `#opaymore/${regnum}/${wlid}/${pe1.camper_id}/` +
							rkey.substr(rkey.length-8);
						pml = `<p class="seriffont m-0" style="font-size:0.85vw">
For someone else to pay towards this registration they
should follow this link:<BR><a href="${url}">${url}</a></p>`;
					}
					opaymore = `<div class="hs d-inline-block"
					style="overflow-wrap:break-word;word-break:break-word">${pml}</div>`;
				}
			}
		}

		if (cbER.tradingPostMoney) {
			let keepTPMoney = '';
			// does user want Camp to donate any unused trading post money?
			// Only have to worry about this if there is trading post money on
			// this account.
			if (cbER.tradingPostMoney && fp.ppt[PD_TP_TYPE]) {
				let ktChecked = pe1.ktp ? 'checked' : '';
				keepTPMoney = `<div style="display:flex;justify-content:flex-start;align-items:flex-start">
				<input style="margin:5px" type="checkbox" id="keeptpmoneychk" ${ktChecked}>
				<label for="keeptpmoneychk" style="max-width:80%">
				Check here if you want any unspent Trading Post money to be
				donated to the Educational Assistance Fund for our Summer Staff.
				</label></div>`;
			}
			opaymore += keepTPMoney;
		}
		if (cbER.extraHousingQuestions?.housingText) {
			housingText = cbER.extraHousingQuestions.housingText(pe1);
		}

		// allow user or admin to edit housing preferences.
		return opaymore +
			`<div class="hs">
			<div class="btns"><input type="button" value="Edit"
			 style="color: #111;"
			 title="Update" />
			</div>
			<span>${housingText}</span>
			</div>`;
	}

	// show each registration/waitlist for this regnum.
	function eventInfo() {
		let anyRegs = pear.some(pe => !pe.wl && rpd.notCanc(pe));
		return pear.filter(rpd.filter1)
			.sort(function(a, b) {
				// sort to show registrations before waitlists.
				return a.wl - b.wl;
			})
			.map(function(pe) {
				let ce = rpd.findCE(pe.campevent_id);
				if (!ce) {
					return `<div>UNKNOWN EVENT ${pe.campevent_id}</div>`;
				}
				let cancelBtn = `<button class="cancel-button ml-3 mb-2" data-rn="${regnum}"
						data-ce="${ce.campevent_id}">Cancel</button>
						<button class="send-confirmation-email-button ml-3 mb-2"
						title="Resend Confirmation Email"
						>Resend Email</button>`;

				let nameDate = `${ce.name} - ${rpd.dr(ce)}`;
				if (rpd.userIsAdmin) {
					nameDate = `<a href="javascript:rpd.goto('#prts/${pe.campevent_id}')">${nameDate}</a> - `;
				} else {
					nameDate += ' - ';
				}
				let cancelledStatus = rpd.notCanc(pe) ? '' : ' <strong>CANCELLED</strong> ';
				if (cancelledStatus) {
					cancelBtn = '';
					if (rpd.regAdmin() && !pe.wl) {
						// allow uncancelling if this person is allowed
						// to register for this event.
						// the preconditions for cbER.allowed() are too
						// complicated so we'll just do some simple
						// checks. Is the event full? Is this person
						// already registered?
						cancelBtn = `<button class="uncancel-button ml-3 mb-2" data-rn="${regnum}"
						data-ce="${ce.campevent_id}">Un-Cancel</button>`;
						let notallowedReason = '';
						let pedup = rpd.personEvent.find(pe2 => pe2.camper_id == pe.camper_id &&
							rpd.notCanc(pe2) &&
							pe2.campevent_id == ce.campevent_id)
						if (pedup) {
							notallowedReason = `Already ${pedup.wl ? 'waitlisted' : 'attending'} ${pedup.regnum}`;
						} else {
							let thisCancelledReg = rpd.filterReg(pe.regnum, pe.weblogin_id)
								.filter(pex => pex.campevent_id == pe.campevent_id)
								.filter(pex => !rpd.notCanc(pex))
							if (rpd.available_space(ce) < thisCancelledReg.length) {
								notallowedReason = 'Event is full.';
							}
						}
						if (notallowedReason) {
							cancelBtn = `- <span>Can&rsquo;t uncancel. ${notallowedReason}</span>`;
						}
					}
				}

				if (pe.wl) {
					let wlConvertBtn = '';
					// can convert if admin and space available
					// and not already registered on this regnum.
					if (!anyRegs && rpd.regAdmin() &&
						rpd.available_space(ce) &&
						rpd.notCanc(pe)) {
						wlConvertBtn = `<button class="convert-button ml-3 mb-2"
						title="Convert to Registration"
						data-rn="${regnum}"
						data-ce="${ce.campevent_id}">Convert</button>`
					}
					if (impersonating() && !rpd.regAdmin()) {
						// READONLY admin can't cancel.
						cancelBtn = '';
					}
					return `<div>
						 ${nameDate} WAITLIST ${rpd.waitlistPositionString(pe)} ${cancelledStatus}
						${cancelBtn} ${wlConvertBtn}
						</div>`
				} else {
					if (rpd.regAdmin()) {
						if (!cancelledStatus && ce.awl) {
							// move from registered to waitlist
							cancelBtn += `<button class="regtowl-button ml-3 mb-2"
								data-rn="${regnum}" title="Convert Registration to Waitlist"
								data-ce="${ce.campevent_id}">Reg->WL</button>`
						}
					} else {
						// non-admins can't cancel registrations.
						cancelBtn = '';
					}
					let regStr = cancelledStatus ? '<strike>Registered</strike>' : 'Registered';
					return `<div>
					${nameDate} ${regStr} ${cancelledStatus}
					${cancelBtn}
					</div>`
				}
			})
			.join('');
	}

	// view registration info.
	let officeInfo = '';
	if (rpd.userIsAdmin) {
		let w = rpd.findWLID(wlid);
		let bpid = w ? w.cc : '(none)';
		officeInfo = `<div class="bdr1 d-inline-block my-2">
			<div class="d-inline-block mr-4 ml-1" title="regnum">rn: ${regnum}</div>
			<div class="d-inline-block mr-4" title="Weblogin ID">wl: ${wlid}</div>
			<div class="d-inline-block mr-1" title="SAP BPID">BPID: ${bpid}</div>
			${/latetp/i.test(pe1.note_from_camp) ? '<div class="ml-1">Late TP Enabled</div>' : ''}
			</div>`;
	}

	let strKeptRegPayments = '';
	let keptRegFees = fp.ppt[6];
	if (keptRegFees != 0) {
		strKeptRegPayments = ` (Kept Fees: $${-fp.ppt[6]})`

	}
	let totalBalanceDueLines = pe1.wl ?
		`Waitlist Deposit Total: $${rps.total}<BR>Balance Due: $${rps.balance}<BR>Waitlist Deposit` :
		`Total: $${rps.total}<BR>Balance Due: $${rps.balance}<BR>`;

	if (rpd.regAdmin()) {
		let fees = rpd.totalRegistrationFees(regnum, pe1.campevent_id, 0);
		let problemStr = fees[1] == rps.total ? '' :
			' <span style="background-color:#fdd">FEE PROBLEM</span>';
		totalBalanceDueLines = `Calculated Fees: $${fees[0]} $${fees[1]}${problemStr}<BR>` +
			totalBalanceDueLines;
	}

	// if any trading post fees or trading post money has been paid, then
	// note that as well.
	let tpTotalLines = '';
	if (cbER.tradingPostMoney) {
		let tpSum = fp.ppt[PD_TP_TYPE];
		let tpfSum = fp.ppt[PD_TPFEE_TYPE];

		if (tpSum || tpfSum) {
			tpTotalLines = `${paypalFeeType(PD_TP_TYPE)}: $${rpd.dollarsOrCents(tpSum)}<BR>`
			if (fp.ppt[7]) {
				tpTotalLines += `Trading Post Kept: $${rpd.dollarsOrCents(-fp.ppt[7])}<BR>`
			}
			tpTotalLines += `${paypalFeeType(PD_TPFEE_TYPE)}: $${rpd.dollarsOrCents(tpfSum)}<BR>`;
			if (fp.ppt[8]) {
				tpTotalLines += `Trading Post Finance Fees Kept: $${rpd.dollarsOrCents(-fp.ppt[8])}<BR>`
			}
		}
	}

	// Here we put together all the different parts
	// of the #reg1 section of the viewRegistration page.
	rpd.qs('#reg1').innerHTML = `
		${eventInfo()}
		<hr>
		${housing()}
		<p class="mt-2 mb-1">
		${totalBalanceDueLines}
		Paid: $${rps.paid}${strKeptRegPayments}<BR>
		${tpTotalLines}</p>
		${officeInfo}`;
	rpd.qs('#payment-details').innerHTML = paymentList;
	let editHousingButton = rpd.qs('.hs input[value="Edit"]');
	if (editHousingButton) {
		editHousingButton.onclick = function() {
			editHousing(regnum, wlid);
		};
		// for summer, if there is less than two weeks before the event
		// then we don't allow normal users to edit their buddies.
		// read-only admins can't edit this
		if ((rpd.userIsAdmin && !rpd.sr.roles.regAdmin) ||
			(!rpd.userIsAdmin &&
			cbER.tradingPostMoney && daysToGo() < 14)) {
			rpd.hideEl(editHousingButton);
		}
	}

	// keep trading post money checkbox operations
	const ktpm = rpd.qs('#keeptpmoneychk');
	if (ktpm && !ktpm.disabled) {
		ktpm.onchange = function() {
			rpd.keepTPMoneyUpdate(pe1, ktpm)
		}
	}

	// send confirmation email buttons
	rpd.qsa('.send-confirmation-email-button').forEach(function(el) {
		el.onclick = resendConfirmationEmail;
	});
	
	// cancel buttons
	rpd.qsa('.cancel-button[data-rn][data-ce]').forEach(function(el) {
		el.onclick = cancelRegistration;
	});

	// uncancel button
	rpd.qsa('.uncancel-button[data-rn][data-ce]').forEach(
		el => el.onclick = uncancelRegistration);

	// convert buttons
	rpd.qsa('.convert-button[data-rn][data-ce]').forEach(function(el) {
		el.onclick = convertToRegistration;
	});

	// reg->wl buttons
	rpd.qsa('.regtowl-button[data-rn][data-ce]').forEach(
		el => el.onclick = regToWL);

	// cancel unfinished payment button
	rpd.qsa('#payment-details input.btn[value="Cancel Unfinished Payment"]').forEach(
		el => el.onclick = function() {
			cancelUnpaidPayment(function() {
				viewRegistration(page);
			})
		}
	);

	// let user select to move this registration to
	// a different event.  (Move from week1 to week2).
	function moveRegistration() {
		var camper = rpd.findCamper(pear[0].camper_id);
		var evList = rpd.events.filter(function(e) {
			return e.online_OK == 1 &&
				e.gender == ce.gender &&
				e.campevent_id != campevent_id &&
				e.season == ce.season &&
				(e.season != 'summer' || rpd.sumAgeMatch(camper, e)) &&
				rpd.available_space(e) >= pear.length; });

		if (evList.length == 0) {
			popAlert('nothing to move to.');
			return;
		}

		rpd.qbv('Move').disabled = true; 		// disable the move button.
		var dst = rpd.qs('#viewregistration .left-panel');
		var src = _CB.ge('moveregistration');
		dst.appendChild(src.cloneNode(true));
		var selev = rpd.qs('select[name=eventlist]');
		var new_id;
		// fill up the select with the campevents.
		loadSelectFromArray(
			evList.map(function(e) { return rpd.ceNameDate(e) }),
			selev,
			evList.map(function(e) { return e.campevent_id; })
		);
		rpd.smoothScrollCenter(selev);
		function moveResults(d) {
			var payments;
			try {
				payments = JSON.parse(d);
			} catch(e) {
				popAlert('error: ' + d);
				return;
			}
			popAlert('Success');
			// save the payments.  last entry of
			// the results we just got is a new dummy payment
			// indicating this move.
			if (payments.length) {
			 	var np = payments.pop();
				if (np.remarks && /^move/i.test(np.remarks)) {
					rpd.payments.push(np);
				}
			}

			// adjust available space for the two events.
			ce.available_space++;
			rpd.findCE(new_id).available_space--;
			rpd.filterReg(regnum, wlid)
				.filter(pe => pe.campevent_id == campevent_id)
				.forEach(function(pe) {
				pe.campevent_id = new_id;// update registration.
			})
			regShowPage();// refresh the page.
		}
		// make the request to the server to do the move.
		function doMove() {
			if (selev.selectedIndex < 1) {
				popAlert('select event');
				return;
			}
			new_id = selev.value;
			updateDB( { moveRegistration: JSON.stringify({
				old_id: campevent_id,
				new_id: new_id,
				regnum: regnum,
				wlid: wlid
			})}, moveResults);
		}

		// doMove goes with the move button
		let mb2 = rpd.qs('#viewregistration #moveregistration input[type="button"][value="Move"]');
		if (mb2) {
			mb2.onclick = doMove;
		}
	} // moveRegistration()

	// Have any office payments been refunded for this
	// registration? This is needed in order to cancel the
	// registration.
	function officePaymentsSum0(rn) {
		let op = rpd.payments.filter(p => rn == p.regnum && 
			!/paypal/i.test(p.remarks) && /office/i.test(p.ipn));

		let sum = 0;
		op.forEach(o => sum += o.mc_gross);
		return 0 == Number(sum).toFixed(2);
	}

	// button click - convert registration to waitlist
	function regToWL(t) {
		function regToWLSure() {
			let cid = t.target.dataset.ce;
			let rn = t.target.dataset.rn;

			// the new wl_date should put this person at
			// the beginning of the waitlist for this event.
			let newwldate = new Date();
			let pe = rpd.personEvent.filter(pe => rn == pe.regnum &&
					cid == pe.campevent_id)
					.filter(rpd.notWLCanc)
					.filter(rpd.filter1);
			if (!pe.length) {
				return;
			}
			pe = pe[0];
			let wlid = pe.weblogin_id;
			let ce = rpd.findCE(cid);
			if (!ce) {
				return;
			}
			if (Array.isArray(ce.waitlistArray) && ce.waitlistArray.length) {
				// there is already a waitlist, we'll put
				// this guy 2 minutes ahead of the person that
				// is currently first on the waitlist.
				newwldate = new Date(
					_CB.zdt(ce.waitlistArray[0].wl_date).getTime() -
					(1000*60*2));
			}

			console.log(`wldate ${newwldate}`);
			updateDB({ regtowl: JSON.stringify({
				regnum: rn,
				campevent_id: cid,
				wldate: newwldate
			})},
			function(d) {
				if (rpd.notOKFail(d))
					return;

				// update internal data with this registration
				// now a waitlist entry.
				pe.wl = 1;
				pe.wl_date = newwldate.toJSON().substring(0, 19);
				rpd.updateAvailableSpace(cid, -1);
				doViewRegistration(regnum, wlid);
			});
		}
		popConfirm(`Are you sure you want to convert this
			registration to a waitlist entry?`, regToWLSure
		);
	}

	// user wants to convert this waitlist entry to a registration.
	function convertToRegistration(t) {
		let cid = t.target.dataset.ce;

		function convertToRegistrationSure(cid) {
			let campers = pear
				.filter(pe => pe.campevent_id == cid)
				.filter(rpd.notCanc)
				.map(pe => pe.camper_id);
			changeCamperCmd(
				{ campers: campers,
				regnum: regnum,
				waitlist: 0,
				campevent_id: cid,
				ad: true },
			function() {
				// update internal variables to convert waitlist
				// to registration.
				rpd.personEvent.filter(pe => pe.regnum == regnum &&
						pe.campevent_id == cid &&
						pe.weblogin_id == wlid)
					.forEach(pe => pe.wl = 0);
				rpd.updateAvailableSpace(cid, -campers.length);
				doViewRegistration(regnum, wlid);
			});
		}

		popConfirm(`Are you sure you want to convert this
				from waitlist to a regular registration?`, function() {
			convertToRegistrationSure(cid);
		} );

	}

	// resend confirmation email to user
	function resendConfirmationEmail(t)
	{
		// user is sure they want to send mail
		function userSure()
		{
			updateDB( { sendAcknowledgementEmail: JSON.stringify({
				regnum: regnum,
				wlid: wlid,
				email: rpd.efEmail
			})}, mailSent);
		}

		function mailSent(d) {
			if (rpd.notOKFail(d)) {
				return;
			}
			popAlert('Your mail was queued.', 'Success');
		}

		popConfirm(`Are you sure you want to resend this
			confirmation email?`, userSure);
	}

	// uncancel registration
	function uncancelRegistration(t)
	{
		let tel = t.target;
		let pear = rpd.filterReg(tel.dataset.rn, rpd.efWL)
			.filter(pe => !rpd.notCanc(pe))
			.filter(rpd.filter1)
			.filter(pe => pe.campevent_id == tel.dataset.ce);
		if (pear.length > 1) {
			popAlert('More than one possiblity to uncancel.', 'Not allowed');
			return;
		}
		if (pear.length == 0) {
			popAlert('Nothing to uncancel?', 'Error');
			return;			
		}
		popConfirm('Are you sure you want to uncancel?', function() {
			updateDB( { uncancelRegistration: JSON.stringify( {
				pe: pear[0]
			} ) },
			function(d) {
				if (rpd.notOKFail(d)) {
					return;
				}

				let unlst = rpd.filterReg(tel.dataset.rn, rpd.efWL)
					.filter(pe => pe.campevent_id == tel.dataset.ce)
					.filter(pe => !rpd.notCanc(pe));
				unlst.forEach(pe => pe.reg_status = 'Completed');
				rpd.updateAvailableSpace(unlst[0].campevent_id, -unlst.length);
				doViewRegistration(pear[0].regnum, pear[0].weblogin_id);
			});
		})
	}

	// cancel registration or waitlist entry
	function cancelRegistration(t)
	{
		// user is sure they want to cancel registration/waitlist
		// with campevent_id cid
		function cancelRegistrationSure()
		{
			cancelRW(regnum, wlid, cid, function() {
				rpd.popAlert('Cancellation was successful.', 'Success', function() {
					if (1 == r1list.length) {
						initRPDevent();
						resetViewToDefault();
						return;
					}
					doViewRegistration(regnum, wlid);
				});
			})
		}

		let cid = '';
		if (t.target.dataset.ce) {
			cid = t.target.dataset.ce;
		} else {
			// cancel the main registration.
			cid = pe1.campevent_id;
		}

		let cancelPE = pear.filter(rpd.filter1)
			.filter(rpd.notCanc)
			.find(pe => cid == pe.campevent_id);
		if (!cancelPE) {
			popAlert('Error cancelling.');
			return;
		}
		// only admins can cancel registrations.
		if (!rpd.userIsAdmin && !cancelPE.wl) {
			popAlert('Only administrators can cancel registrations.');
			return;
		}
		// are we trying to cancel a waitlist/registration entry that is not
		// the only waitlist/registration on this regnum?
		let r1list = pear.filter(rpd.filter1);

		if (1 == r1list.length && 0!=rps.paid && !officePaymentsSum0(regnum)) {
			popAlert('Can&rsquo;t cancel.  Refund office payments first.');
			return;
		}
		popConfirm(`Are you sure you want to cancel this
			${cancelPE.wl ? 'waitlist entry' : 'registration'}?`,
			function() {
			cancelRegistrationSure(cid);
		} );
	}

	// show list of contacts and let user (admin) choose whether
	// to add or delete people from this registration.
	function showChangeCampers() {

		// button was clicked. ask for confirmation.
		function doChangeCamper(el) {
			let dm = /add/i.test(el.target.value) ? 'Add' : 'Delete';
			let fee = '';
			if ('Add' == dm) {
				fee = ` - Fee $${cbER.fees()[1]}`;
			}
			let cid = +el.target.getAttribute('camper-data');
			let c = rpd.campers.find(a => a.camper_id == cid);
			if (c) {
				dm = `<BR>(${dm} ${c.firstname} ${c.lastname}${fee})`;
			}

			popConfirm(`Are you sure?${dm}`,
				function() { doChangeCamperConfirmed(el) } );
		}

		// User has confirmed they
		// want to add or delete a person on this registration.
		// el is the button causing the change.  Add or Del
		function doChangeCamperConfirmed(el) {
			let c = Number(el.target.getAttribute('camper-data'));
			let ad = /add/i.test(el.target.value);

			// adjust the fees for this registration.
			let fees = rpd.totalRegistrationFees(regnum, campevent_id, ad ? 1 : -1);
			changeCamperCmd({
				campers: [c],
				regnum: regnum,
				campevent_id: campevent_id,
				newDepositAmount: fees[0],
				newTotalFees: fees[1],
				ad: ad 
			},
			function() {
				// add or remove camper from personEvent
				if (ad) {
					// Add - new entry in personEvent and
					// adjust balance_remaining for main entry.
					rpd.addOnePersonEvent(regnum, wlid, c);
				} else {
					// Delete this person from the registration.
					rpd.removeOnePersonEvent(regnum, wlid, c);
				}
				// redraw the registration page with updated camper list
				// and updated fees.
				doViewRegistration(regnum, wlid);
			}
			)
		}

		_CB.setHTML('payMore', '');

		// list of campers that are already on this registration.
		rpd.pendingCampers = pear.map(pe => pe.camper_id);
		// first person on the registration can't be deleted.
		let firstPerson = rpd.findReg1(pear).camper_id;

		const intpcls = ` type="button" class="my-3 mr-2 btn btn-primary" `;

		// render the buttons for adding or deleting campers.
		_CB.setHTML('change-campers',
			rpd.campers.filter(rpd.cuf).map(function(c) {
				let cantAddReason = '';
				let g = `<input ${intpcls} value="+Add"
				title="Add" camper-data="${c.camper_id}" />`;
				if (rpd.pendingCampers.indexOf(c.camper_id) != -1) {
					// going
					g = `<input ${intpcls} value="-Del"
					title="Delete" camper-data="${c.camper_id}" />`;
					cantAddReason = ` (Already registered)`;
					if (firstPerson == c.camper_id) {
						// going but can't be deleted.
						g = `<input ${intpcls} disabled
							 value="first" title="Cannot delete first person" />`;
					} else {
						if (!rpd.regAdmin()) {
							// non-admins are not allowed to delete people.
							g = `<input ${intpcls} disabled
							 value="Going" title="Already Going" />`;
						}
					}
				} else {
					cbER.setup(c, ce);
					const nar = cbER.allowed();
					if (nar != '') {
						// not allowed
						g = `<input ${intpcls} disabled value="na"
						 title="Not Allowed - ${nar}" \>`;
						cantAddReason = ` (${nar})`;
					}
				}

				let genmap = /boy/i.test(c.gender) ? 'male' : 'female';
				return `<div>${g} ${c.firstname} ${c.lastname} - ${c.age} ${genmap} ${cantAddReason}</div>`;
			}).join(''));

		// setup the clickable buttons for add and delete.
		_CB.qsafn('#change-campers input[type=button]:not(:disabled)',
			el => el.onclick = doChangeCamper);

		let cc = rpd.qs('#change-campers');
		// give a message at the beginning of the change campers
		if (!rps.userIsAdmin) {
			let msg = '';
			if (rpd.qs('#change-campers input:not(:disabled)')) {
				// there are people to add.
				msg = 'Click one of the &ldquo;Add&rdquo; buttons below to add one of your contacts to this registration.';

			} else {
				// no people to add. either no one eligible or the event is full.
				// any of the reasons 'no more space'?
				if (rpd.qs('#change-campers input[title*="o more space"]')) {
					msg = 'The event is full. You can&rsquo;t add anyone else.';
				} else {
					msg = 'Of your <a href="#list">contacts</a>, no one else is eligible for this event.';
				}
			}
			cc.insertAdjacentHTML('afterbegin', `<p class="mb-1">${msg}</p>`);
		}
		// scroll to change campers.
		rpd.smoothScrollCenter(cc);

		rpd.pendingCampers = [];
	} // showChangeCampers()

	if (dateDiffDays(rpd.now, rpd.ce.end_date) > -5 && anyNonCancelled) {
		if (cbER.maxAllowed > 2) {
			rpd.unhideEl(rpd.qbv('Change Campers'));
			rpd.bclk(['Change Campers', showChangeCampers]);
		}

		if (rpd.regAdmin()) {
			rpd.unhideEl(rpd.qbv('Cancel'));
			rpd.bclk(['Cancel', cancelRegistration]);
			rpd.unhideEl(rpd.qbv('Move'));
			rpd.bclk(['Move', moveRegistration]);
		} else {
			if (!pe1.wl) {
				// normal users can't cancel or remove people from regular registrations.
				let rps = rpd.pendingCampers.length > cbER.minNeeded ?
					'remove people or' : '';
				rpd.qbv('Cancel').parentNode.insertAdjacentHTML('afterend',
				'<p style="margin-top:2px;font-size:0.7rem">If you need to ' +
				`${rps} cancel this registration, please` +
				' email us at Registrar@CampBarakel.org</p>');
			}
		}
	}

	let userPayMore = false;
	if (!impersonating() && !pe1.wl &&
		(rps.balance > 0 || cbER.tradingPostMoreMoney)) {
		// user can pay more if there is money left to be paid
		// or user can add to the trading post money for a registration.
		userPayMore = true;
	}

	// swap primary functionality. For relational retreat,
	// swap the primary camper to another person.
	function setupSwapPrimary() {
		let swapCID = '';
		function swapSure(c) {
			swapCID = c;
			popConfirm(`Are you sure - ${swapCID} ${personName(swapCID)} becomes primary?`, doSwap);
		}
		function doSwap() {
			// ask the server to do the swap.
			updateDB({ swapPrimary: JSON.stringify({
					regnum: regnum,
					campevent_id: campevent_id,
					swapcid: swapCID
				})
			},
			function(d) {
				if (rpd.notOKFail(d)) {
					return;
				}

				// success. update local db
				let pe = pear.find(e => e.regnum == regnum &&
					e.camper_id == swapCID &&
					e.campevent_id == campevent_id);
				if (pe) {
					pe.camper_id = pe1.camper_id;
				}
				pe = pear.filter(rpd.filter1).find(e => e.regnum == regnum &&
					e.camper_id == pe1.camper_id &&
					e.campevent_id == campevent_id);
				if (pe) {
					pe.camper_id = swapCID;
				}
				doViewRegistration(regnum, wlid);
			});
		}
		let spf =  rpd.qs('#adminswapprimary');
		let dst = _CB.ge('swapPrimary');
		// add HTML if it isn't there already.
		if (!spf) {
			let src = _CB.ge('adminswapprimary');
			dst.appendChild(src.cloneNode(true));
			spf = rpd.qs('#adminswapprimary');
		} else {
			// HTML is there, make sure not hidden.
			// there is a button on the form that hides it
			// so the div could be hidden.
			rpd.unhideEl(spf);
		}

		// find other adults on the contact list that could become primary.
		let txt = rpd.campers.filter(c => 
			pe1.weblogin_id == c.weblogin_id &&
			pe1.camper_id != c.camper_id &&
			/adult|college/i.test(c.age))
			.map(function(c) {
				// is this person already going to this event on this registration?
				let goingStr = pear.some(pe => pe.camper_id == c.camper_id) ?
					'<span title="going">*</span>' : '';
				let genderStr = /girl/i.test(c.gender) ? '(F)' : '(M)';
				
				let btn = `<input type="button" class="btn btn-primary"
				data-camperid="${c.camper_id}"
				value="Swap">`;

				return `<div class="p-1">${personName(c.camper_id)} &mdash; 
					${btn} ${genderStr} ${goingStr}</div>`
			})
			.join('');
		
		if ('' == txt) {
			txt = 'No adults to become primary.';
		}

		rpd.qs('#adminswapprimary .non-primary-adults').innerHTML = txt;

		// set up swap buttons
		rpd.qsa('#adminswapprimary input.btn[value="Swap"]').forEach(function(el) {
			el.onclick = function() {
				swapSure(Number(el.dataset.camperid));
			}
		})

		// scroll into view.
		rpd.smoothScrollCenter(spf);
	}

	// enable swap primary button if appropriate
	// for this registration.
	let btnSwapP = rpd.qbv('SwapP');
	if (rpd.regAdmin() &&
		(cbER.maxAllowed > 1 || _CB.wt.wtMatch(rpd.ce)))
	{
		rpd.unhideEl(btnSwapP);
		btnSwapP.onclick = setupSwapPrimary;
	} else {
		// swap primary person not allowed.
		rpd.hideEl(btnSwapP);
	}

	var btnPay = rpd.qbv('Pay More');
	if (impersonating() && anyNonCancelled) {
		if (rpd.regAdmin()) {
			btnPay.onclick = function() {
				// admin user wants to do an office payment.
				_CB.setHTML('change-campers', '');
				rpd.opw.setup(rps.balance, regnum, 'payMore');
			};
		} else {
			rpd.hideEl(btnPay);
		}

	} else if (userPayMore) {
		btnPay.onclick = function userPayMoreFn() {
			// This gives an input field for the user to enter the
			// amount and then a 'Pay' button
			_CB.setHTML('change-campers',
				rpd.payMoreButton +
				'<div id="paypal-button-container"></div>');
			btnPay.disabled = true;
			rpd.setupTPPay(pe1); // set up trading post pay fields
			rpd.smoothScrollCenter(rpd.qs('#change-campers'));
			rpd.payMoreButtonClick(rps.balance,
				function(amt) {
				// this is called when the 'Pay' button
				// is clicked.
				// get rid of the 'Pay' button and the
				// input field
				rpd.hideID('upm');

				// hide the trading post input field.
				rpd.hideID('pay-trading-post');

				// save paymentDetails if needed (tradingPost)
				// then gotoPaypal so the user can pay.
				// when payment is approved we
				// will tell the server.
				rpd.ce = rpd.findCE(campevent_id);
				recordTradingPostPD(gotoPaypal, {
					payNow: amt,
					regnum: regnum
				});
			});
		}
	} else {
		rpd.hideEl(btnPay);
	}

	// can the user edit this registration?
	if (cbER.userEditRegFn) {
		let btnEdit = rpd.qs('div:not(.btns) > [type="button"][value="Edit"]');
		// save values for regnum and wlid so userEditRegFn can
		// get at them as needed.
		btnEdit.regnum = regnum;
		btnEdit.wlid = wlid;
		rpd.unhideEl(btnEdit);
		btnEdit.onclick = cbER.userEditRegFn;
	}

	// payment adjustments
	if (rpd.regAdmin()) {
		rpd.unhideEl(rpd.qbv('Payment Adj'));
		rpd.bclk(['Payment Adj', function() { 
			rpd.goto(`adjustpayment/${regnum}/${wlid}`)}]);
	}

	function setNewLateTPVal(val) {
		rpd.setNewLateTPValue(pe1, val, function() {
			doViewRegistration(regnum, wlid);
		});
	}

	// late trading post money button
	if (!pe1.wl && cbER.tradingPostMoney &&
		rpd.lateTPAdmin() && anyNonCancelled)
	{
		let ltpBtn = rpd.qbv('LateTP');

		// unhide and enable the button if it may be needed
		if (!cbER.tradingPostMoreMoney) {
			rpd.unhideEl(ltpBtn);
			ltpBtn.onclick = function() {
				setNewLateTPVal('latetp');
			}
		}

		// if this registration is already late TP then
		// allow admin to revoke.
		if (/latetp/i.test(pe1.note_from_camp)) {
			// unhide the button, rename it to 'RevokeTP'
			rpd.unhideEl(ltpBtn);
			ltpBtn.value = 'RevokeTP';
			ltpBtn.onclick = function() {
				setNewLateTPVal('');
			}
		}
	}

	// custom work for this event type.
	if (cbER.viewRegistrationFn) {
		cbER.viewRegistrationFn();
	}
	initRPDevent();
	rpdstate.alreadySawHeader = true; // don't scroll to top
}

// return array of paymentDetails for incomplete
// payments matching regnum
function unpaidPaymentDetails(regnum)
{
	return rpd.paymentDetails.filter(pd => !pd.c
		&& pd.r == regnum && pd.w == rpd.efWL);
}

function paymentDetailsTextLine(pd) {
	function money(a) {
		return `$${Number(a).toFixed(2)}`;
	}
	return `${paypalFeeType(pd.t)} - ${money(pd.a)}`;
}

// if there is any trading post money,
// record it in payment_details.
// otherwise, or when the payment_details
// is recorded, then call cb with payInfo
function recordTradingPostPD(cb, payInfo) {
	// check if there are already expected payments saved
	// on the server. If so, we don't need to save anything else.
	let pda = unpaidPaymentDetails(payInfo.regnum);
	if (pda.length) {
		cb(payInfo);
		return;
	}

	pda = rpd.pdRegistrationArray(payInfo.payNow, payInfo.regnum);
	if (pda.length < 2 && pda[0].t != 3) {
		// no trading post money to record, so just continue on
		// right away.
		cb(payInfo);
		return;
	}

	recordExpectedPayment(pda, function() {
		cb(payInfo);
	})
}

// office worker is ready to record payment
// for a new registration.
// come here after personevent is set up on server
function officePay()
{
	setEventNameAndCampers('officepay');
	rpd.opw.setInvoice();
	let totalBalance = rpd.ope.balance_remaining;
	let deposit = rpd.ope.payment_auth;
	rpd.opw.setup(totalBalance, rpd.ope.regnum, 'opp');
	let mc = rpd.opw.mc_gross();

	function setupButton(name, amt) {
		var b = rpd.qin(name);
		b.value = amt;
		b.onclick = function() {
			var adj = rpd.opw.adjAmtVal();
			mc.value = amt - adj;
			rpd.opw.val(); };
	}
	setupButton('payt', totalBalance);
	setupButton('payd', deposit);

	// since nothing has been paid yet
	// we will give the office worker the chance
	// to cancel this registration
	let cancelBtn = rpd.qbv('Cancel');
	rpd.unhideEl(cancelBtn);
	cancelBtn.onclick = doCancelEvent;

	// office worker can also choose to
	// not pay anything and come back to this registration
	// later.
	let noPaymentBtn = rpd.qbv('No Payment');
	rpd.unhideEl(noPaymentBtn);
	noPaymentBtn.onclick = function() {
		let remEl = rpd.qs('[name=remarks]');
		let remStr = remEl.value.trim();
		if (remStr && remEl.placeholder == remStr) {
			remStr = '';
		}
		// set status to completed with no payment.
		let payment = {
			mc_gross: 0,
			cash: 1,
			checkno: 0,
			remarks: 'No Payment. ' + remStr,
			payment_status: 'Completed',
			email: rpd.efEmail,
			regnum: rpd.opw.regnum,
			ipn: 'office payment: ' + rpd.email,
			invoice: 'No invoice',
			adjustment: 0
		};
		updateDB({ payment: JSON.stringify(payment),
			email: rpd.qin('emailConf').value.trim() },
			rpd.afterPaymentRecorded);
	}
}

// registrations.
// set up paypal buttons. create order. capture authorization.
// inform the server of progress.
function gotoPaypal(payInfo)
{
	if (impersonating()) {
		// since we're impersonating, we don't go to paypal.
		// let user (office worker) enter check info.
		gotoPayEvent();
		return;
	}
	
	let nowFee = payInfo.payNow;

	// if there are paymentDetails pending for this registration
	// then we get the sum of those amounts for the nowFee for paypal.
	// this one paypal payment could include registration fees,
	// trading post money, and fees.
	let pda = unpaidPaymentDetails(payInfo.regnum);
	let pdNow = 0;
	pda.forEach(pd => pdNow += pd.a);
	if (pdNow) {
		nowFee = pdNow;
	}

	loadPaypalScript(); // set up paypal buttons

	// if there is no payInfo.campers then use the list of
	// all the campers for this registration.
	if (!payInfo.campers) {
		payInfo.campers = rpd.filterReg(payInfo.regnum, rpd.efWL)
			.map(pe => pe.camper_id);
	}
	let camperNames = payInfo.campers
		.map(p => personName(p, true)) // no extra HTML.
		.join(',');
	let descrStr = rpd.ce.name + ' ' + rpd.dr() + '-' + camperNames;
	if (descrStr.length > 127) {
		descrStr = descrStr.substring(0,120) + '...';
	}

	function paymentDetailsInfo() {
		function money(a) {
			return `$${Number(a).toFixed(2)}`;
		}
		if (pda.length > 1) {
			return pda.map(paymentDetailsTextLine)
			.join('<BR>') +
			`<BR><BR>Total: ${money(nowFee)}`;
		}
		return 'Registration Fees: ' + money(nowFee);
	}

	// show user the details on what they're paying for.
	let pbc = rpd.qs('#paypal-button-container');
	if (pbc) {
		pbc.insertAdjacentHTML('beforebegin',
		`<div class="card card-body mb-3">
		<h5>Payment Details:</h5>
		<div class="ml-3">
		${paymentDetailsInfo()}
		</div>
		</div>`);
		rpd.smoothScrollCenter(pbc);
	}
	
	// rn is a random number that becomes part of the invoice id.
	let rn = Math.floor(Math.random() * 9999) + '-' + Date.now();
	let invoice_id = rpd.email + ' ' + payInfo.regnum + ' ' + rn;

	waitForPaypal();

	function waitForPaypal() {
		// wait for paypal to be ready.
		// render the Paypal buttons and provide hooks for events.
		if (typeof paypal == 'undefined') {
			window.setTimeout(waitForPaypal, 50);
			return;
		}
		paypal.Buttons({
		createOrder: function(data, actions) { // create the paypal order
			return actions.order.create({
				purchase_units: [{
				amount: {
					value: rpd.dollarsOrCents(nowFee)
				},
				invoice_id: invoice_id,
				description: descrStr,
				}]
			});
			},
		onCancel: function() { // user has cancelled the payment
			let regnum = payInfo.regnum;
			let wlid = rpd.weblogin_id;
			let r = rpd.personEvent.find(e => 
				e.regnum == regnum && e.weblogin_id == wlid);
			if (!r) {
				return;
			}

			// if the registration is 'unpaid' then cancel it.
			if (/unpaid/i.test(r.reg_status)) {
				updateDB( { cancelUnpaid : regnum },
					function(d) {
						if (d != "OK") {
							popAlert(d);
							return;
						}
						rpd.cancelRegistration(regnum, wlid);
						initRPDevent();
						resetViewToDefault();
				});
				return;
			}

			// for completed registrations we go
			// to viewRegistration
			if (/completed/i.test(r.reg_status)) {
				doViewRegistration(regnum, wlid);
			}
		},
		onApprove: function(data, actions) {
			waitMessage(true);
			return actions.order.capture().then(
				function(details) {
					let payment = {
						mc_gross: nowFee,
						cash: 0,
						checkno: 1,
						remarks: "Paypal",
						payment_status: 'Completed',
						email: rpd.email,
						regnum: payInfo.regnum,
						ipn: JSON.stringify(details),
						invoice: invoice_id,
						adjustment: 0
					};
					
					// save payment info on the server and
					// update local info to reflect the update.
					updateDB(
						{
							payment: JSON.stringify(payment),
							email: rpd.email
						},
						rpd.afterPaymentRecorded
					);
				})
		}}).render('#paypal-button-container'); // Display payment options on your web page
	}

} // gotoPaypal

function paypalFeeType(t) {
	if (t < 1 || t > 8) {
		return `unknown type ${t}`;
	}
	return ['',
		'Registration Payment',		// 1
		'Donation',					// 2
		'Trading Post',				// 3
		'Finance Fees (donation)',	// 4
		'Finance Fees (TP)',		// 5
		'Registration Kept',		// 6
		'Trading Post Kept',		// 7
		'Trading Post PP Fees Kept' // 8
	][t];	
}

// record ope as unpaid registration,
// reserve a place in the database for this registration.
function recordUnpaidReg(cb)
{
	if (!regReadyForCheckout()) {
		resetViewToDefault();
		return;
	}

	if (rpd.ope) { // outstanding person events..
		// if the registration is outstanding, it has already
		// been recorded in the database so we don't
		// need to save it again.
		cb();
		return;
	}

	// calculate deposit and total balence for this registration.
	let deposit = 0;
	let totalBalance = 0;
	rpd.pendingCampers.forEach(function(ci, idx) {
		let fees = cbER.fees(idx);
		deposit += fees[0];
		totalBalance += fees[1];
	});

	let payInfo = {
		campers: rpd.pendingCampers,
		housing: rpd.pendingHousingInfo,
		campevent_id: rpd.ce.campevent_id,
		payNow: deposit,
		payTotal: totalBalance,
		waitlist: rpd.pendingWaitlist ? 1 : 0
	};

	updateDB( { recordUnpaidReg: JSON.stringify(payInfo) },
		function(d) {
			try {
				let sr = JSON.parse(d);
				if (!Array.isArray(sr.personEvent) ||
					!sr.personEvent.length) {
					popAlert('Record unpaid - server error.<BR>' + d);
					return;
				}
				sr.personEvent.forEach(function(pe) {
					// add new pe entries, but don't repeat entries
					// we already know about.
					if (!rpd.personEvent.find(pe1 =>
						pe.weblogin_id == pe1.weblogin_id &&
						pe.regnum == pe1.regnum &&
						pe.camper_id == pe1.camper_id &&
						pe.campevent_id == pe1.campevent_id))
					{
						rpd.personEvent.unshift(pe);
					}

				});

				if (!rpd.pendingWaitlist) {
					// reduce space available by the number of people
					// we just added.
					rpd.updateAvailableSpace(
						payInfo.campevent_id, -sr.personEvent.length);
				}

				if (Array.isArray(sr.eb) && sr.eb.length) {
					// updated row in rpd.eb
					let ebrindex = rpd.eb.findIndex(eb => eb.eb_id == sr.eb[0].eb_id)
					if (-1 == ebrindex) {
						console.log(`no rpd.eb row to update? eb_id=${sr.eb[0].eb_id}`);
					} else {
						rpd.eb[ebrindex] = sr.eb[0];
					}
				}

				initRPDevent(); // setup rpd.ope
			} catch(e) {
				let title = 'Problem';
				if (/not enough room/i.test(d)) {
					title = 'Event Has Filled';
				}
				popAlert('Server says: ' + d + '<BR>' + e.message, title, function() {
					// since the registration wasn't recorded we
					// will cancel and get out.
					// reinitialize everything.
					regStartFresh();
				});
			}
			cb();
	});
}

// record unpaid donation, getting ready
// for paypal.
function recordExpectedPayment(paymentDetailsArray, cb) {

	updateDB( { recordExpectedPayment: JSON.stringify(paymentDetailsArray) },
		function(d) {
			try {
				let rsrpd = JSON.parse(d);
				if (!Array.isArray(rsrpd.paymentDetails) ||
					!rsrpd.paymentDetails.length) {
					popAlert('recordExpectedPayment error<BR>' + d);
					return;
				}

				// save the new paymentDetails rows
				rpd.paymentDetails = rpd.paymentDetails.concat(rsrpd.paymentDetails);
				cb(rsrpd.paymentDetails);
			} catch(e) {
				popAlert('Record Expected Payment Error:<BR>' +
					`Server says:<BR>&nbsp;<strong>${d}</strong>`, 'Error');
			}
	});
} // recordExpectedPayment

// cancel any unpaid payments from this user.
function cancelUnpaidPayment(cb) {
	// if there are any unpaid registrations
	// then we should first cancel them
	let unpaidRegistration = rpd.personEvent.find(p =>
		p.weblogin_id == rpd.efWL && p.reg_status == 'unpaid');
	if (unpaidRegistration) {
		let regnum = unpaidRegistration.regnum;
		updateDB( { cancelUnpaid: regnum },
			function(d) {
				if (d != "OK") {
					popAlert(d);
					return;
				}
				rpd.cancelRegistration(regnum, rpd.efWL);
				cancelUnpaidPayment(cb);
			});
		return;
	}
	updateDB( 
		{ cancelUnpaidPayment: 1, efWL: rpd.efWL },
		function(d) {
			if (d != 'OK') {
				popAlert('cancelUnpaidPayment srv error:<BR>' + d);
				return;
			}

			// remove unpaid payment_details from
			// our records since that is what the server did.
			rpd.paymentDetails = rpd.paymentDetails.filter(pd => pd.c ||
				pd.w != rpd.efWL);

			cb();
	});
} // cancelUnpaidPayment

// User has clicked a pay button
// and wants to pay either deposit or total.
// go to paypal after recording on server
// any trading post and registration payment_details.
function doPay(regPayAmount)
{
	// disable pay buttons.
	rpd.qsaa('.paybuttons input[type="button"]:not([value="Cancel"])')
		.forEach(b => b.disabled = true);
	recordTradingPostPD(gotoPaypal, {
		payNow: regPayAmount,
		regnum: rpd.ope.regnum,
		campers: rpd.pendingCampers
	});
}

function incompletePackage()
{
	return rpd.campers[0].lastname.match(/^incomplete-package$/i);
}

function getFullPackage(cb)
{
	// if we don't have the complete package, then we need that.
	// we start off the admin data with just data on registered
	// users, then download everything here if it looks like
	// it will be necessary.
	if (incompletePackage()) {
		updateDB( { cmd: 'full-package'}, function(d) {
			try {
				rpd = JSON.parse(d);
				if (incompletePackage()) {
					popAlert('full-package error: still incomplete.');
					return;
				}
			} catch (e) {
				popAlert('package problem. ' + e.message);
				return;
			}
			regInit();
			cb();
		})
		return;
	}
}

// login as user cu
function loginAs(cu)
{
	var tw = rpd.efWL;
	rpd.efWL = cu;
	var w = rpd.weblogin.find(rpd.cuf);
	if (w) {
		rpd.efWL = cu;
		rpd.efEmail = w.email;

		initRPDevent();

		// listing contacts seems like a good place to go
		location.hash = '#list';
	} else {
		rpd.efWL = tw;
		popAlert('ID not found: ' + cu);
	}
}


// admin - create new account - show form.
function createNewAccountSF()
{
	if (!rpd.email || !rpd.regAdmin()) {
		resetViewToDefault();
		return;
	}
	loadTemplate('cuNew');

	var email = rpd.qs('form[name=cuNewForm]').email;
	// generate random email address.
	var genRndEmail = function genRndEmail() {
		email.value = (1+Math.random()).toString(36).substring(2);
		vf();
		if (email.classList.contains('invalidField')) {
			genRndEmail(); // try again if problem.
		}
	}
	var btnCreate = rpd.qbv('Create');
	btnCreate.onclick = createNewAccountGo;
	rpd.qbv('No Email').onclick = genRndEmail;

	var cardcode = rpd.qin('cardcode');

	// validation for creating pseudo account
	var vf = function vf() {
		var emv = email.value.trim();
		var cc = cardcode.value.trim();
		// invalid email if not unique or < 4 chars
		var aDup = rpd.findWLEmail(emv);
		var bInv = emv.length > 0 &&
			((emv.length < 4) || aDup);
		setInvalidField(bInv, email);
		rpd.setupDup(emv);

		setInvalidField(cc && cc.length<4, cardcode);

		// if card code is good then we don't need email.

		btnCreate.disabled = rpd.qs('.invalidField') ||
			(emv.length==0 && cc.length==0);
	}
	xxSetupValidation(vf);
	vf();
}

// admin user wants to create new user.
function createNewAccountGo()
{
	popConfirm('Create New User?', function() {
		// first step is ask server to create the new login.
		var f = rpd.qs('form[name=cuNewForm]');
		var nup = {
			email: f.email.value.trim(),
			cardcode: f.cardcode.value.trim()
		}
		updateDB( { newweblogin: JSON.stringify(nup)}, function(d) {
			// response from server for newweblogin.
			try {
				var wl = JSON.parse(d);
				if (wl.length != 1) {
					popAlert('error wl: length ' + wl.length);
					return;
				}
				rpd.weblogin.push(wl[0]);
				loginAs(wl[0].weblogin_id);
			} catch(e) {
				popAlert('Server says: ' + d);
				return;
			}
		});

	})
}

// show event participants. -> Prts
function shPrts(page)
{
	let selected_campevent_id = '';

	loadTemplate('participants');
	let plist = rpd.qs('#plist');
	plist.addEventListener('click', function(e) {
		// if e is a checkbox then we don't do anything here.
		if (e.target.type == 'checkbox') {
			return;
		}
		let t = e.target.closest('.rn');
		if (t) {
			doViewRegistration(
				t.getAttribute('data-rn'),
				t.getAttribute('data-wl'));
		}
	});
	showWLRCheckboxes(false);
	const bdd = rpd.qs('#unpaid-balance-checkbox-div');
	const cbel = bdd.querySelector('#ub-checkbox');
	const sopenbal = bdd.querySelector('#bd-send-open-balance');
	const soverdue = bdd.querySelector('#bd-send-overdue');
	
	showBalanceDueActions(false);

	// checkboxes filtering waitlist people and/or registrations
	function showWLRCheckboxes(s) {
		let wrc = rpd.qs('#wl-reg-checkboxes');

		if (s) {
			// show
			wrc.classList.add('d-inline-block');
			wrc.classList.remove('d-none');
		} else {
			// hide
			wrc.classList.remove('d-inline-block');
			wrc.classList.add('d-none');
		}
	}

	function setupOpenBalanceCheckboxes() {
		const regList = rpd.qsaa('div.rn[data-rn]');
		function gcb(el) {
			return el.querySelector('input.select-registration[type="checkbox"]');
		}

		// sendMassEmail for each of the registrations checked.
		function sendMassChecked(notificationProcessName) {
			let peList = rpd.qsaa('div.rn[data-bd="1"] input.select-registration:checked')
				.map(el => {
					let d = el.closest('div.rn');
					return rpd.findReg1(rpd.filterReg(d.dataset.rn, d.dataset.wl)) });
			if (!peList.length) {
				popAlert('No registrations selected.<BR>Nothing to send.', 'Error');
				return;
			}
			sendMassEmail(peList, notificationProcessName, function doneFn() {
				popAlert('Done queuing emails', 'Mail Queued');
			});			
		}
		if (cbel.checked && regList.length) {
			// show only registrations with open balance
			// so hide waitlists and fully paid registrations.
			// also enable and check the checkboxs
			// to set up for sending mail.
			regList.forEach(function (el) {
				let sr = gcb(el);
				sr.classList.remove('d-none');
				// if this registration doesn't have a balance due then hide it
				// and uncheck its checkbox.
				if ('0' == el.dataset.bd) {
					el.classList.add('d-none');
					sr.checked = false;
				} else {
					sr.checked = true;
				}
			});
			sopenbal.disabled = false;
			soverdue.disabled = false;
			sopenbal.onclick = function() {
				// "Send Open Balance Mail" button clicked.
				// Queue the emails.
				sendMassChecked('open-balance');
			}
			soverdue.onclick = function() {
				// "Send Overdue Mail" button clicked.
				// Queue the emails.
				sendMassChecked('overdue-notice');
			}
		} else {
			// show all the registrations.
			// hide all the select-registration checkboxes
			// and disable the mail buttons
			regList.forEach(function (el) {
				el.classList.remove('d-none');
				let sr = gcb(el);
				sr.classList.add('d-none');
				sr.checked = false;
			});
			sopenbal.disabled = true;
			soverdue.disabled = true;
		}
	}

	function showBalanceDueActions(s) {
		if (s) {
			bdd.classList.add('d-block');
			bdd.classList.remove('d-none');
		} else {
			bdd.classList.remove('d-block');
			bdd.classList.add('d-none');			
		}

		cbel.onchange = setupOpenBalanceCheckboxes;
	}

	// show registration regnum r on prts page.
	// this gives a summary of the registration in a couple lines.
	function seRegnum(r) {
		var p2, ce;

		function housingNote(pe) {
			if (!pe.note_to_camp)
				return '';

			// don't show anything if there are no housing preferences.
			let ntc = pe.note_to_camp.replace(rpd.noHousingPreferencesString, '');

			if (cbER.extraHousingQuestions?.housingTextSummary) {
				ntc = cbER.extraHousingQuestions.housingTextSummary(ntc);
			}
			return rpd.isNoHousing(ntc) ? '' :
			` - <span class="hn">${ntc}</span>`
		}

		// waitlist message for this personevent
		function wlMsg(pe) {
			return pe.wl ? ` -- WAITLIST ${rpd.waitlistPositionString(pe)} ` : '';
		}

		// registrations for this regnum.
		// sort them by weblogin.
		var pear = rpd.personEvent.filter(pe => pe.regnum == r)
		.sort((a,b) => a.weblogin_id - b.weblogin_id);

		// small possibility of more than one weblogin_id
		// for a regnum.
		var rv = [];
		while (pear.length) {
			var wlid = pear[0].weblogin_id;
			p2 = pear.filter(pe => pe.weblogin_id == wlid)
				.filter(rpd.notCanc);
			ce = rpd.findCE(selected_campevent_id ? selected_campevent_id : p2[0].campevent_id);
			if (!ce) {
				pear = pear.filter(pe => pe.weblogin_id != wlid);
				continue;
			}
			var rps = rpd.rpstats(p2);
			var pay1 = rpd.payments.find(rpd.onereg(r, wlid));
			var ppStr = pay1 && /paypal/i.test(pay1.remarks) ? ' PP ' : '';

			// find the first pe of this registration.
			let p21 = p2[0];
			if (selected_campevent_id) {
				let ca = p2.filter(rpd.filter1)
					.filter(rpd.filterCID(selected_campevent_id))
				if (ca.length) {
					p21 = ca[0];
				}
			}
			// unusual registration status?
			var sNN = /completed/i.test(p21.reg_status) ? '' :
				'<span class="sNN">' + p21.reg_status + '</span>';
			var evtString = (evtsel.value == '') ? ` -- ${rpd.ceNameDate(ce)} ` : '';
			let regPeople = '';
			if (_CB.wt && _CB.wt.wtMatch(ce)) {
				regPeople = _CB.wt.seRegnum(p2);
			} else {
				if (ce.awl && p2.length > 1) {
					let rpa = [`<div><span class="pn">${personName(p2[0].camper_id)}</span></div>`];
					if (selected_campevent_id) {
						// start with the currently selected campevent_id
						let pesel = p2.find(pe => pe.campevent_id == selected_campevent_id);
						if (pesel) {
							rpa.push(`<div class="ml-3">${pesel.wl ? wlMsg(pesel) : ' -- REGISTERED'}</div>`);
							p2 = p2.filter(pe => pe.campevent_id != selected_campevent_id);
						}
					}
					p2.forEach(function(pe) {
						rpa.push(`<div class="ml-3">${rpd.ceNameDate(pe.campevent_id)} ${wlMsg(pe)}</div>`);
					})
					regPeople = rpa.join('');
				} else {
					regPeople = p2.map(function(pe) {
						let maleFemale = '';
						if (!/g/i.test(ce.gender)) {
							// mixed gender event
							let c = rpd.findCamper(pe.camper_id);
							if (c) {
								maleFemale = /boy/i.test(c.gender) ? ' 👨' : ' 👩';
							}
						}

						return '<div><span class="pn">' +
							personName(pe.camper_id) + maleFemale + '</span>' +
							wlMsg(pe) +
							housingNote(pe) + '</div>';
					}).join('');
				}
			}
			// is this registration with balance due?
			let abd = (rps.balance == 0 || p21.wl) ? '0' : '1';
			rv.push(
				`<div class="rn" data-rn="${r}" data-wl="${wlid}" data-bd="${abd}">
				<input type="checkbox" class="select-registration d-none">
				<div class="d-inline-block">${regPeople}</div><BR>` +
				'<p class="bl">' + sNN + '$' + rps.balance +
				'= $' + rps.total + '-$' + rps.paid +
				' ' + ppStr + r +
				' -- ' + rpd.shrtDT(p2[0].last_updated) +
				evtString +
				'</p></div>'
			);

			// now that we've used wlid, delete those elements from pear.
			pear = pear.filter(pe => pe.weblogin_id != wlid);
		}

		return rv.join('');
	} // seRegnum() - within shPrts()

	// this is the count for an automated waitlist.
	function getEventWaitlistCount(campevent_id) {
		let ce = rpd.findCE(campevent_id);
		if (!ce || !Array.isArray(ce.waitlistArray)) {
			return 0;
		}
		return ce.waitlistArray.length;
	}

	// show all the registrations associated with a specific event.
	function showEventPeople() {

		plist.innerHTML = evtsel.value;
		if (evtsel.value != '')
		{
			let sp = evtsel.value.split(' - ');
			let showReg = true;
			let showWL = false;
			selected_campevent_id = sp[0];
			cbER.setup(null, rpd.findCE(selected_campevent_id));
			let eventCount = sp[1];
			let wlCount = getEventWaitlistCount(selected_campevent_id);
			if (wlCount) {
				eventCount = `${eventCount}/${wlCount}`;
				showReg = rpd.qs('#wl-reg-checkboxes-reg').checked;
				showWL = rpd.qs('#wl-reg-checkboxes-wl').checked;
			}
			showWLRCheckboxes(wlCount);

			if (rpd.regAdmin() && eventCount) {
				showBalanceDueActions(true);
			}

			plist.innerHTML = `<p class="sep-head termina">
				${rpd.ceNameDate(selected_campevent_id)}
				&ndash; (${eventCount})</p><div class="shprts-reglist">` +
				rpd.personEvent
					.filter(rpd.filterCID(selected_campevent_id))
					.filter(rpd.notCanc)
					.filter(function(pe) {
						if (!wlCount || (showReg && !pe.wl) || (showWL && pe.wl)) {
							return true;
						}
						if (!showReg && !showWL) {
							return true;
						}
						return false;
					})
					.sort(function(a, b) {
						if (a.wl && b.wl) {
							// sort based on waitlist position
							let wlpa = rpd.waitlistPosition(a);
							let wlpb = rpd.waitlistPosition(b);
							return wlpa[0] - wlpb[0];
						}
						if (a.wl != b.wl) {
							// sort waitlist vs registrations
							return a.wl - b.wl;
						}
						return 0;
					})
					.map(pe => pe.regnum)
					.filter(rpd.onlyUnique)
					.map(seRegnum)
					.join('') +
				'</div>';

		} else {
			selected_campevent_id = '';
			plist.innerHTML += '<BR>Missing info.';
		}
	}

	// set up the event list.
	let evtsel = rpd.qs('#evtsel');
	let evm = rpd.events.map(function(e) {
		return [rpd.ceNameDate(e), rpd.eventCount(e.campevent_id),
			e.campevent_id, e.waitlistArray.length];
	}).filter(function(e1) {
		// show events with any registrations
		// or waitlist entries.
		return e1[1] > 0 || e1[3] > 0;
	});
	loadSelectFromArray(
		evm.map(function(e1) {
			let w = getEventWaitlistCount(e1[2]);
			let wlStr = w ? `/${w}` : '';
			return `${e1[0]} - ${e1[1]}${wlStr}`;
		}),
		evtsel,
		evm.map(function(e1) {
			return e1[2] + ' - ' + e1[1];
		}));
	evtsel.addEventListener('change', function() {
		let sid = evtsel.value;
		if (sid != '') {
			sid = '/' + evtsel.value.split(' - ')[0];
		}
		rpd.goto(`#prts${sid}`);
	});

	rpd.qsa('#wl-reg-checkboxes [type="checkbox"]').forEach(function(e) {
		e.addEventListener('change', showEventPeople);
	});

	if (rpd.regAdmin()) {
		rpd.bclk(['Empty Waitlist', emptyWaitlist]);
	} else {
		rpd.hideEl(rpd.qbv('Empty Waitlist'));
	}

	function emptyWaitlist() {
		function emptyWaitlistSure() {
			// starting with the last waitlisted person
			// cancel the registrations. If unsucessful then stop.
			rpd.setupWaitlistArrays();
			rpd.efWL = rpd.weblogin_id;
			let ce = rpd.findCE(selected_campevent_id);
			if (0 == ce.waitlistArray.length) {
				popAlert('Empty Waitlist Success', 'SUCCESS');
				return;
			}
			let lastCamper = ce.waitlistArray[ce.waitlistArray.length - 1].camper_id;
			if (camper == lastCamper) {
				popAlert('Cancel error');
				return;
			}
			camper = lastCamper;
			let lastPE = rpd.personEvent.find(pe => pe.wl &&
				pe.camper_id == camper &&
				pe.campevent_id == selected_campevent_id);
			if (!lastPE) {
				popAlert(`error finding ${camper} ${selected_campevent_id}`);
				return;
			}
			// set up for cancel
			rpd.efWL = lastPE.weblogin_id;
			cancelRW(lastPE.regnum, lastPE.weblogin_id,
				selected_campevent_id, emptyWaitlistSure);
		}
		let camper = -100;

		popConfirm('Are you sure you want to remove all the waitlist' +
		' people for this event?', emptyWaitlistSure);
	}

	// if shPrts was called with a specific event then
	// set that up.
	if (page && page.match(/prts\/([a-z0-9_\-]+)$/i))
	{
		let id = RegExp.$1;
		let fo = evtsel.querySelector(
			'option[value^="' + id + '"]');
		if (fo) {
			fo.selected = "selected";
			showEventPeople();
		}
	}

	function latestRegistrations() {
		evtsel.selectedIndex = 0;
		selected_campevent_id = '';
		plist.innerHTML = 'Past 30 days:<BR>' +
			rpd.personEvent
			.filter(rpd.notCanc)
			.filter(function(pe) {
				return dateDiffDays(pe.last_updated, rpd.now) < 30;
			}).map(function(pe) { return pe.regnum; })
			.filter(rpd.onlyUnique)
			.map(seRegnum)
			.join('');
	}

	// take care of Latest Registrations button.
	rpd.bclk(['Latest Registrations', latestRegistrations]);

	// Find Reg
	function findReg()
	{
		var rni = rpd.qin('rninput');
		var rn = parseInt(rni.value);
		if (isNaN(rn) || rn <= 0) {
			plist.innerHTML = 'Invalid Regnum';
			rni.classList.add('invalidField');
			window.setTimeout(function() {
				rni.classList.remove('invalidField');
			}, 1000);
			return;
		}
		let rar = rpd.personEvent.filter(pe => pe.regnum == rn);
		if (rar.length == 0) {
			plist.innerHTML = 'Regnum ' + rn + ' not found.';
			if (rpd.userIsAdmin) {
				// allow admin to get old registrations
				plist.innerHTML += `<BR><BR><input class="btn btn-primary" type="button" title="Lookup old registration?" value="View Old Registration?">`;
				rpd.qs('#plist input[type="button"]').onclick = function() {
					window.open(`/old-reg#${rn}`, 'oldreg');
				}
			}
			return;
		}
		if (rar.length == 1 || rar.filter(pe => pe.weblogin_id != rar[0].weblogin_id).length == 0) {
			// normal case, go to this reg.
			doViewRegistration(rn, rar[0].weblogin_id);
			return;
		}
		selected_campevent_id = '';
		plist.innerHTML = 'Find ' + rn + ':<BR>' +
			seRegnum(rn);
	}
	rpd.bclk(['Find Reg', findReg]);

	// if user presses 'enter' in the regnum
	// text box then findReg.
	rpd.qin('rninput').addEventListener('keyup', function(event) {
		if ('Enter' == event.key) {
			findReg();
		}
	});

} // shPrts()

// show contact list for this user.
// allow user to edit individuals.
function contactList()
{
	// if there are no contacts to list, then we
	// just work on adding a contact.
	if (forceAddContacts()) {
		return;
	}

	loadTemplate('contactlist');
	_CB.append('contact-list-instrID', '<p style="margin-bottom: 0.2em">If you are registering' +
' a child for summer camp:</p><p style="margin: 0 1em 0 1em">1. Add the parent or guardian' +
' of that child to this Contact List.</p><p style="margin: 0 1em 0.5em 1em">' +
'2. Add the child, or edit the child to note ' +
' their parent or guardian (near the bottom of the form).</p>'
);
	var cList = [];
	cList.push(
		'<table id="cTblID">' +
		'<TR>' +
		'<th><p>Name</p></th>' +
		'<th><p>Age / Grade</p></th>' +
		'<th><p>Gender</p></th>' +
		'</TR>');

	rpd.campers
	.filter(rpd.cuf).forEach(function(v) {

		cList.push('<TR><TD><p>' +
			'<a href="#edit/' + v.camper_id + '">' +
			v.firstname + ' ' + v.lastname +
			'</a></p></TD><TD><p>');

		if (v.age != null)
		{
			var age = v.age;
			if (age.match(/^\d+$/))
			{
				age = 'Grade ' + age;
			}
			cList.push(age);
		}
		cList.push('</p></TD><TD><p>');
		var personGender = '';
		if (v.gender != null)
		{
			personGender = v.gender;
			if (personGender.match(/l/i))
			{
				cList.push('Female');
			}
			else
			{
				cList.push('Male');
			}
		}
		cList.push('</p></TD></TR>');
	});
	cList.push('</table>');
	rpd.qs('.thelist').innerHTML = cList.join('');
	if (rpd.contactListFn) {
		rpd.contactListFn();
	}
}

// register a camper for an event.
function registerForEvent(campevent_id)
{
	let h = '#event';
	if (campevent_id) {
		if (typeof campevent_id == 'string') {
			h += '/' + campevent_id;
		}
	}

	window.location.hash = h;
}

// user clicked the button that they want this camper
// to register for this event.
function addCamperToEvent(camper_id, bWaitList)
{
	rpd.pendingCampers.push(camper_id);
	rpd.pendingWaitlist = bWaitList;

	// redraw current event including new registration.
	// if max number of users have now been added then
	// we go to the next step of registration.
	regEvent();
}

// user wants to cancel this unpaid registration.
function doCancelEvent()
{
	if (rpd.ope) {
		popConfirm("Are you sure you want to cancel this registration?",
			function() {
				updateDB( { cancelUnpaid : rpd.ope.regnum }, function(d) {
					if (d != "OK") {
						popAlert(d);
						return;
					}
					rpd.cancelRegistration(rpd.ope.regnum, rpd.efWL);
					initRPDevent();
					resetViewToDefault();
				});
		});
		return;
	}
	initRPDevent();
	resetViewToDefault();
}

// personName with non-breakable spaces instead of spaces.
function personNameNS(camper_id, bSilentTruc) {
	return personName(camper_id, bSilentTruc).replace(/ /g, '&nbsp;');
}

function personName(camper, bSilentTruc)
{
	let c = camper;
	if ('number' == typeof camper) {
		c = camper >= 1 && rpd.findCamper(camper);
	}

	let r = c ? c.firstname + ' ' + c.lastname :
		`unknown (${camper})`;
	if (r.length > 23) {
		// truncate long names.
		r = c.firstname.substring(0,17) + ' ' +
			c.lastname.substring(0,17);
		if (!bSilentTruc) {
			r = '<span title="' +
				c.firstname + ' ' + c.lastname + '">' +
				r + '</span>';
		}
	}
	return r;
}

// 'table' where the first part contains an "a1" paragraph.
function show_a1_2Table(a1, td2)
{
	return '<div class="s2Tbl"><div><p class="a1 cbhfont">' +
		a1 + '</p></div><div><p class="t1">' +
		td2 + '</p></div></div>';
}

// update server database to delete this camper.
function deleteCamperConfirmed()
{
	var camper_idx = rpd.campers.current_camper_idx;
	var camper_id = rpd.campers[camper_idx].camper_id;
	var camper = {
		camper_id: camper_id,
		bp_line: rpd.campers[camper_idx].bp_line,
		firstname: "deleteCamper",
		lastname: "deleteCamper"
	};
	updateDB( { camper: JSON.stringify(camper) },
		function(d) {
			if (d != 'OK') {
				if (/registered/i.test(d)) {
					popAlert(`Sorry, this person was registered for an event
					 in the past so you may not delete them.`, 'Sorry');
					return;
				}
				popAlert('Not deleted. Server returns ' + d);
				return;
			}
			rpd.campers.splice(camper_idx, 1);
			if (location.hash.match(/edit/i)) {
				location.hash = '#list';
			}
		}
	);
}

// user wants to delete this camper.
function doDeleteCamper()
{
	var camper = rpd.campers[rpd.campers.current_camper_idx];
	popConfirm('Are you sure you want to delete ' +
		camper.firstname + ' ' + camper.lastname + '?',
		deleteCamperConfirmed);
}

// add events to listen for form validation
function addCamperSetupValidation()
{
	xxSetupValidation(addCamperValidateForm);
}

function addCamperValidateForm()
{
	var f = rpd.qs('form[name=regForm]');

	// these are required fields
	['firstname', 'lastname'].forEach(
		function(v) {
			setInvalidField(!f[v].value.match(/\S/), f[v]);
		});

	// must have selected an address.
	setInvalidField(f.address.selectedIndex == 0,
		f.address);

	// one or the other of the gender buttons must be checked.
	// since radio buttons aren't nicely manipulated with CSS
	// we also set styles on the Male/Female labels' table.
	setInvalidField(!f.gender[0].checked && !f.gender[1].checked,
		rpd.qs('.gagsp table:first-child table'));

	// must have valid age
	setInvalidField(f.age.selectedIndex < 1, f.age);

	// must have valid phone
	setInvalidField(!f.cell_phone.value.match(/\d/) &&
		!f.home_phone.value.match(/\d/), f.cell_phone,f.home_phone);
	// phone numbers must be at least 10 digits
	if (f.cell_phone.value != '' && f.cell_phone.value.length < 10)
	{
		setInvalidField(1, f.cell_phone);
	}
	if (f.home_phone.value != '' && f.home_phone.value.length < 10)
	{
		setInvalidField(1, f.home_phone);
	}

	let bAdult = /adult|college/i.test(f.age.value);

	// for children, we need a birth date.
	setInvalidField(!bAdult && f.birth_date.value == '',
		f.birth_date);

	// for adults, the parent/guardian field is not needed
	f.prt.disabled = bAdult;
	if (bAdult) {
		f.prt.selectedIndex = 0;
		f.prt.parentNode.classList.add('black-40');
	} else {
		f.prt.parentNode.classList.remove('black-40');
	}

	// for adults/college we need an email address.
	let emailEl = f.email;
	let emailValid = emailEl.validity.valid &&
		(!bAdult || '' != emailEl.value);
	setInvalidField(!emailValid, emailEl);

	var bAnyChange = false;
	if (rpd.campers.current_camper_idx < 0) {
		bAnyChange = true;
	} else {
		// we only enable the Done field if any data
		// has changed from what is already in the database.
		var cmprd = rpd.campers[rpd.campers.current_camper_idx];
		['input[type=text],input[type=email],input[type=date],' +
		'input[type=tel],input[type=radio]:checked,' +
		'select'].forEachQAll(
			function(el) {
				if (el.name == "birth_date") {
					if (el.value != el.origDate) {
						bAnyChange = true;
					}
				} else if (el.value != cmprd[el.name]) {
					bAnyChange = true;
				}
			});
	}

	var btnDone = rpd.qbv('Done');
	var nvld = rpd.qs('.invalidField');
	btnDone.disabled = nvld || !bAnyChange ? true : false;

	// readonly admins don't get to change anything so
	// the buttons are always disabled.
	if (rpd.userIsAdmin && !rpd.regAdmin()) {
		btnDone.disabled = true;
		rpd.qbv('Delete').disabled = true;
	}
}

// User clicked the 'Done' button
function doAddCamperDone()
{
	var f = rpd.qs('form[name=regForm]');
	if (rpd.campers.current_camper_idx != -1)
	{
		var cc = rpd.campers[rpd.campers.current_camper_idx];
		if (cc.firstname != f.firstname.value ||
			cc.lastname != f.lastname.value)
		{
			// warning if user is trying to change the name of a camper.
			popConfirm('Are you sure you want to overwrite "' +
						 cc.firstname + ' ' +
						 cc.lastname + '"?',
					 updateCampersDB);
			return;
		}
	}
	updateCampersDB();
}

// update the camper's info on the server
// from the information in the form fields.
function updateCampersDB()
{
	var camper_idx = rpd.campers.current_camper_idx;
	var camper_id = camper_idx;
	if (camper_idx != -1) {
		camper_id = rpd.campers[camper_idx].camper_id;
	}
	var camper = {
		camper_id: camper_id
	};

	// collect the form data into camper.
	// querying for all the selectors below finds
	// all the form fields of interest that we need to
	// include in our data to the server.
	collectFormValues(camper);

	// birth_date should never be '' since
	// it will be parsed into a date on server.
	if (!camper.birth_date) {
		camper.birth_date = '0001-01-01T00:00:00';
	}

	// prt/parent must be a number.
	camper.prt = Number(camper.prt);

	// no '' for bp_line either since that will be int on server.
	if (camper.bp_line === '') {
		camper.bp_line = 0;
	} else {
		camper.bp_line = Number(camper.bp_line);
	}
	camper.weblogin_id = rpd.efWL;

	updateDB( { camper: JSON.stringify(camper) },
		function(d) {
			// upon getting back from the server
			// we want to update our info.
			try {
				var jC = JSON.parse(d);

				if (camper_idx != -1)
				{
					// overwrite existing entry, may have new camper_id
					// and/or new bp_line depending on sync.
					rpd.campers[camper_idx] = jC;
				} else {
					rpd.campers.push(jC); // new entry in campers.
				}
				// sort the new list by name.
				rpd.campers.sort(function(a,b) {
					var an = a.firstname + a.lastname;
					var bn = b.firstname + b.lastname;
					if (an > bn) {
						return 1;
					}
					if (an < bn) {
						return -1;
					}
					return 0;
				});
			} catch(e) {
				popAlert('Save error:<BR>' + d);
				return;
			}
			if (location.hash.match(/edit/i)) {
				// go back to the contact list
				// (if we haven't already gone elsewhere.)
				location.hash = '#list';
			}
		});
}

// show log in screen.
function signinShow()
{
	loadTemplate('signin');
	rpd.bclk(['Continue', signIn]);
	xxSetupValidation(assureValidEP);
	// setup proper instructions.
	if (rpd.signinFn) {
		rpd.signinFn();
	}
}

// set up for change email.
// admins can change weblogin.email for the account.
function changeEmailShow()
{
	if (!impersonating()) {
		resetViewToDefault();
		return;
	}
	loadTemplate('changeemail');
	var oldemail = rpd.qs('#oldemail');
	var email = rpd.qin('email');
	var change = rpd.qbv('Change');
	if (email) {
		email.focus();
	}

	var chgEmail = function chgEmail() {
		var newEmail = email.value.trim();
		updateDB( { cemail : newEmail },
			function(d) {
				if (d != 'OK') {
					popAlert('Error: ' + d);
					return;
				}
				// success.  update browser's data.
				rpd.efEmail = newEmail;
				rpd.findWLID(rpd.efWL).email = newEmail;
				changeEmailShow();
				popAlert('Success');
			}
		);
	}

	var val = function val()
	{
		// change email validation
		var emv = email.value.trim();
		var bVal = rpd.validEmail(emv);
		var hint = 'Old email: ' + rpd.efEmail;
		if (bVal) {
			// duplicate?
			rpd.setupDup(emv);
		}
		setInvalidField(!bVal, email);
		change.disabled = !bVal;
		oldemail.innerHTML = hint;
	}

	rpd.bclk(['Change', chgEmail]);
	xxSetupValidation(val);
}

// set up for change password
function changePasswordShow()
{
	if (impersonating()) {
		resetViewToDefault();
		return;
	}
	loadTemplate('changepassword');

	xxSetupValidation(cpwValidation);
}

// validate whether it is ok to change to the new password:  PASSWORD.
function cpwValidation()
{
	var f = rpd.qs('form[name=cpForm]');
	var pw = f.PASSWORD;
	var bInv = !pw.value.match(/^\S{6,26}$/);
	setInvalidField(bInv, pw);
	f.cBtn.disabled = bInv;
}

// user clicked "Change" password button
function cpwClick()
{
	cpwValidation();

	if (impersonating() || rpd.qs('.invalidField')) {
		return;
	}

	var f = rpd.qs('form[name=cpForm]');
	var cpMsg = _CB.ge('cpMsg');
	cpMsg.innerHTML = '<p>Changing password...</p>';
	// try to change this guy's password.
	updateDB( { cpwd : f.PASSWORD.value },
		function(d) {
			if (d != 'OK') {
				cpMsg.innerHTML = '';
				popAlert('Not changed.  Server says ' + d);
				return;
			}
			cpMsg.innerHTML = '<p>Change success...</p>';
			setTimeout(function() {
				cpMsg.innerHTML = '<p>Redirecting...</p>';
				resetViewToDefault();
			}, 500);
		}
	);
}

function resetViewToDefault()
{
	if (location.hash == '' || location.hash == '#') {
		regShowPage(); // redraw the page.
	} else {
		location.hash = '#';
	}
}

// back from new User or new login.
// Set things up again.
// d - json from the server with new user info.
function reInitAfterLogin(d)
{
	if (rpd.afterLoginFn) {
		rpd.afterLoginFn();
		return;
	}
	try {
		var r = JSON.parse(d);
		if (r.msg) {
			var siMsg = rpd.qs('#siMsg');
			if (siMsg) {
				siMsg.innerHTML = '';
			}
			if (r.msg.match(/you must validate email/i)) {
				forgotPassword(true); // send the validate email link.
				return;
			} else {
				popAlert('Message from server: ' + r.msg);
			}
		} else {
			// update rpd with the data for this user.
			for (var re in r) {
				if (!r.hasOwnProperty(re)) {
					continue;
				}
				rpd[re] = r[re];
			}
		}
	} catch(e) {
		popAlert('Invalid return ' + e.message + '<BR>' + d);
	}
	

	rpd.calc_sw1();		// calculate summer week1 start date.
	initRPDevent();

	// if we came here after processing the forgot password
	// (but not the validate email link...)
	// link, then we want to go to the change password page.
	if (/sha=\S{40,}/.test(location.hash) &&
			/chgpwd/i.test(location.hash))
	{
		location.hash = '#cpw';
		return;
	}

	resetViewToDefault();
}

// User clicked the Continue on the sign in page.
function signIn() {
    // new or old?
	assureValidEP();
	var f = rpd.qs('form[name=regForm]');
    var bNew = f.yesno[0].checked; // new user

	if (rpd.qs('.invalidField')) {
		return;
	}
	var siMsg = rpd.qs('#siMsg');
	var np = {
		email: f.EMAIL.value,
		pw: f.PASSWORD.value
	}
    if (bNew) {
		siMsg.innerHTML = '<p>Creating new user...</p>';
		// try to register new person.
		// normal flow is the new person needs to wait
		// for validation email and then click it.
		updateDB( { newweblogin: JSON.stringify(np) },
			function(d) {
				if (d == "OK") {
					// in this case we are creating
					// a new user and send a link to validate the email.
					forgotPassword(true);
				} else {
					siMsg.innerHTML = d;
					siMsg.classList.add('hilite');
				}
			}
		);
		return;
    }

	// try to log in.
	siMsg.innerHTML = '<p>Logging in...</p>';
	updateDB( { login: JSON.stringify(np) }, reInitAfterLogin);
}

// user wants to sign out.
function signOut() {

	var siMsg = rpd.qs('#siMsg');
	// try to log out.
	if (siMsg) {
		siMsg.innerHTML = '<p>Logging out...</p>';
	}
	updateDB( { cmd: 'logout' },
		function(d) {
			if (d != 'OK') {
				if (siMsg) {
					siMsg.innerHTML = '';
				}
				popAlert('Log out fails.  Server says ' + d);
			} else {
				if (siMsg) {
					siMsg.innerHTML = '<p>Logout success...</p>';
				}
				rpd.email = false;
			}
			resetViewToDefault();
		}
	);
}

// either the user forgot their password or they needed to validate their email.
// URL contains sha=.  If this is valid SHA
// then we log in with this userid.
// deal with distinction between 'forgot password' and 'validate email'
// in reInitAfterLogin().
function forgotPWIncoming(sha)
{
	console.log(`forgotPWIncoming ${sha}`);
	if (rpd.email) {  // don't bother if already logged in
		resetViewToDefault();
		return;
	}

	loadTemplate('signin');
	rpd.qs('#siMsg').innerHTML = '<p>Validating link...</p>';
	updateDB( { sha: sha }, reInitAfterLogin);
}

// user needs the SHA link.  either they forgot password
// or need to validate their email.
// send email to user.
function forgotPassword(newUser) {

	// invalid email?
	if (rpd.qs('input[name=EMAIL].invalidField')) {
		popAlert('Enter email.');
		return;
	}

	var siMsg = rpd.qs('#siMsg');
	var EMAIL = rpd.qin('EMAIL');
	siMsg.innerHTML = "<p>Requesting email...</p>";
	updateDB( { forgot: EMAIL.value,
	 	url: location.href.replace(/#.*/, '')},
		function(d) {
			if (d.match(/sent a validation link/i)) {
				if (newUser) {
					siMsg.innerHTML = '<h3>Welcome!</h3><p>Before we go any further, let&rsquo;s' +
						' check to make sure your e-mail is working. ' +
						'We&rsquo;ll send you an e-mail with a link to login' +
						' right away. Check your inbox (including your spam' +
						' folders).</p>';
				} else {
					siMsg.innerHTML = '<h3>OK!</h3>' + 
					'<p>We&rsquo;ve sent you an email with a link to reset your password. ' +
					'Check your inbox (including spam folders).</p>';
				}
			} else {
				siMsg.innerHTML = d;
			}
			siMsg.classList.add('hilite');
			rpd.smoothScrollCenter(siMsg);
		}
	);
}

// make sure that valid EMAIL and PASSWORD have been entered.
function assureValidEP() {
	var f = rpd.qs('form[name=regForm]');

	// show help on invalid.
	var strHelp = '';
	var bIEmail = !rpd.validEmail(f.EMAIL.value);
    // must provide password and email address.
	setInvalidField(bIEmail, f.EMAIL);
	if (bIEmail && f.EMAIL.value != '') {
		strHelp += 'Invalid email.<BR>';
	}

	// new users:  password must be 6 chars or greater.
	var pw = f.PASSWORD.value;
	var bIPW = !pw.match(/^\S{2,26}$/) ||
		(f.yesno[0].checked && pw.length < 6);
	setInvalidField(bIPW, f.PASSWORD);
	if (bIPW && pw != '') {
		strHelp += 'Invalid Password.' +
			(f.yesno[0].checked ? ' (At least 6 characters.)' : '') +
			'<BR>';
	}

	var aynBox = rpd.qs('#aynBox');
	var bIcb = !f.yesno[0].checked && !f.yesno[1].checked;
	setInvalidField(bIcb, aynBox);
	if (bIcb && !bIEmail) {
		strHelp += 'Are you new?<BR>';
	}

	var cBtn = rpd.qbv('Continue');
	var bAnyInvalid = rpd.qs('.invalidField') ? true : false
	cBtn.disabled = bAnyInvalid;

	var dv = rpd.qs('#instrID .val');
	if (dv) {
		if (strHelp != '') {
			dv.innerHTML = '<p>' + strHelp + '</p>';
		} else {
			dv.innerHTML = '';
		}
	}
}

function regInit()
{
	rpd.rd = _CB.ge('regdiv');
	rpd.qs = function(a) { return rpd.rd.querySelector(a); };
	rpd.qsa = function(s) { return rpd.rd.querySelectorAll(s); };
	rpd.nar = function(col) { return Array.from(col); }; // collection as Array
	rpd.qsaa = function(s) { return rpd.nar(rpd.qsa(s)) };
	rpd.sqs = function(s, c) { _CB.setEl(rpd.qs(s), c) };
	rpd.now = new Date();
	rpd.currentYearNow = rpd.now.getFullYear();
	rpd.utmo = rpd.now; // package updated timestamp

	// figure out browser time inaccuracy (milliseconds)
	rpd.browserTimeDelta = 99999;
	if (rpd.utm) {
		rpd.browserTimeDelta = (rpd.utm*1000) - rpd.utmo.getTime();
	}

	rpd.adjustedTimeNow = function() {
		return Date.now() + rpd.browserTimeDelta;
	}

	// which week of summer?
	// This reflects new numbering system where the first
	// week campers come is week 4.
	rpd.wwk = function(theDate) {
		return 4 + Math.round(dateDiffDays(rpd.sw1, theDate)/7);
	}

	// IE/Firefox like a Z on the end of the JSON dates for UTC.
	rpd.zdt = function(d) { return new Date(d + 'Z'); }

	// date range from campevent ce
	rpd.dr = function(ce) {
		if (!ce) {
			ce = rpd.ce;
		}
		let ds = rpd.zdt(ce.start_date);
		let de = rpd.zdt(ce.end_date);
		let includeYear = ds.getFullYear() != rpd.currentYearNow;
		return evDateRange(ds, de, includeYear);
	}
	// make string safe to send to Paypal.
	rpd.ppSafe = function(s) {
		return String(s).replace(/&nbsp;/g, ' ');
	}
	rpd.unhideEl = function(el) {
		if (el) {
			el.classList.remove('hidden');
		}
		return el;
	}
	rpd.unhideID = function(id) {
		return rpd.unhideEl(_CB.ge(id));
	}
	rpd.hideEl = function(el) {
		if (el) {
			el.classList.add('hidden');
		}
		return el;
	}
	rpd.hideID = function(id) {
		return rpd.hideEl(_CB.ge(id));
	}

	// navigation within the registration.
	rpd.regNav = function regNav() {
		let mnu = [
			['', 'Events'],
			['list', 'Contacts'],
			['addresslist', 'Addresses']
		];
		if (rpd.userIsAdmin) {
			mnu.push(['prts', 'Prts'],
				['ef', 'Users'],
				['reports', 'Rpts']
			);
		}
		if (!impersonating()) {
			mnu.push(['cpw', 'Password'],['donate', 'Donate']);
		} else {
			if (rpd.regAdmin()) {
				mnu.push(['cemail', 'ChEmail']);
			}
		}
		mnu.push(['signout', 'Sign&nbsp;Out']);

		let roStr = '';
		if (rpd.userIsAdmin && !rpd.regAdmin()) {
			roStr = ' - READONLY';

			if (rpd.sr.roles.accountingAdmin) {
				roStr = ' - ACCOUNTING';
			}
		}

		// login info
		let li = `${rpd.email}&nbsp;${rpd.weblogin_id}${roStr}`;
		if (!rpd.userIsAdmin && -1 == rpd.weblogin_id && 1 == rpd.events.length) {
			// special case for opaymore and not logged in.
			li = 'OPAYMORE';
		}

		let earlybird = '';
		let ebid = earlybirdGetid();
		if (ebid)
		{
			// look up earlybird info
			let eb = rpd.eb.find(e => e.eb_id == ebid);
			if (eb) {
				earlybird = `<div class="col-12">Early Registration - 
					${eb.year} ${eb.event_type} - ${eb.group_name} - ${eb.count} remaining
				</div>`;
				// do any events have early registration
				// that match this event_type?
				if (!rpd.events.find(earlybirdRow)) {
					earlybird += `<div class="col-12">No events match this Early Registration code now.</div>`;
				}
			}
		}

		return '<div class="col-md-8"><p class="p11">' +
			mnu.map(m =>
				`<a href="#${m[0]}">${m[1]}</a> `).join('') +
			'</p></div>' +
			`<div class="col-md-4">
			<p id="wlid" title="login info" class="p11 text-right">${li}</p></div>
			${earlybird}`;
	}

	rpd.popAlert = popAlert;
	rpd.popConfirm = popConfirm;
	rpd.updateDB = updateDB;
	rpd.doViewRegistration = doViewRegistration;
	rpd.gotoPaypal = gotoPaypal;
	rpd.doHousing = doHousing;
	rpd.notOKFail = function notOKFail(d) {
		if (d != 'OK') {
			popAlert('Failure:<BR>' + d);
			return true;
		}
		return false;
	}
	rpd.ptas = function ptas(s) {
		// process textarea string.  get rid of special chars
		// that could be in a textarea.
		return s
			.trim()
			.replace(/\&/g, '&amp;')
			.replace(/\</g, '&lt;')
			.replace(/\>/g, '&gt;')
			.substring(0,2000);
	}
	rpd.isBlocked = function(e) {
		// is user blocked from new registrations?
		return /\|BLOCKED$/i.test(e || rpd.email);
	}
	rpd.isAdult = function isAdult(c) {
		// is this camper an adult?
		return /adult|college/i.test(c.age);
	}
	rpd.isBlockedMsg = `<p style="font-weight:bold;max-width:20em">
		Your account has been blocked due to late payment of the remaining
		balance on a prior registration(s). Please email the Registrar directly
		at registrar@campbarakel.org or contact the Camp Barakel office.
		</p>`;

	// uppercase first letter.
	rpd.up1 = function(s) {
		if (!s)
			return '';

		return s[0].toUpperCase() + s.substring(1);
	}

	// current user filter
	rpd.cuf = function(e) { return e.weblogin_id == rpd.efWL };

	rpd.testdb = function() { return rpd.db && rpd.db.match(/test$/i) };

	rpd.validEmail = function(e) { // valid email address syntax?
		return typeof e == "string" &&
			e.match(/^[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[a-z]{2,4}$/i);
	}

	rpd.onlyUnique = function(value, index, self) {
		return self.indexOf(value) === index;
	}

	rpd.xlsHEADER = `<!DOCTYPE html>
<html>
<head>
<title></title>
<meta http-equiv="content-type" content="application/vnd.ms-excel; charset=UTF-8">
<meta charset="UTF-8">
</head>
<body>
<table>`;
	rpd.xlsFOOTER = `</table></body></html>`;
	rpd.payMoreButton = `<p id="tp-time-running-out-msg" class="hidden">time running out</p>
	<div class="card card-body" id="upm" style="transition: all 0.25s ease-in-out">
	<P>Enter the amount you want to pay now:</p>
		<p>Amount:<BR>
		<span id="reg-money">
		$ <input name="amt" type="number" min="0" max="50000" step="0.01"
			class="mb-3" /> (Registration Fees)
		</span><BR>
		<span id="pay-trading-post" class="hidden">
		$ <input id="tp-money" type="number" min="0" max="500"
			value="0" step="0.01" > (Trading Post)<BR>
		<span id="tp-finance-fee"><BR></span>
		</span>
		</p>
		<p>
		<input type="button" class="btn btn-primary" value="Pay" />
		</p></div>`;
	// set max and onclick function for paymore button.
	// call fn with amt if successfully validated click.
	rpd.payMoreButtonClick = function pmbc(max, fn) {
		let pmb = rpd.qs('#upm [type="button"]');
		let iAmt = rpd.qs('#upm [name="amt"]');
		let tpAmt = rpd.qs('#pay-trading-post #tp-money');
		if (!iAmt || !pmb || !tpAmt) {
			return;
		}
		iAmt.max = max;
		iAmt.value = max;
		pmb.onclick = function pmc() {
			let amt = parseFloat(iAmt.value) || 0;
			let tp = parseFloat(tpAmt.value) || 0;
			if ((amt + tp) <= 0 || amt > max) {
				popAlert('Invalid Amounts.', 'Error');
				return;
			}
			fn(amt);
		}
	}

	rpd.keepTPMoneyUpdate = function ktpmu(pe1, ktchkbox) {
		let val = ktchkbox.checked ? 1 : 0;
		updateDB(
			{ updateKeepTP: JSON.stringify(
				{
					regnum: pe1.regnum,
					newKeepVal: val
				}
			)}, function(d) {
				if (rpd.notOKFail(d)) {
					return;
				}
				pe1.ktp = val;
			}
		);
	}

	// set up Trading Post Pay functionality on this page.
	// Calculate and show finance fees as the user
	// changes the trading post amount.
	rpd.setupTPPay = function(pe1) {
		if (!cbER.tradingPostMoreMoney) {
			return;
		}
		rpd.unhideID('pay-trading-post');

		let tpm = _CB.ge('tp-money');
		let tpfee = _CB.ge('tp-finance-fee');
		if (!tpm || !tpfee) {
			return; // not set up for Trading Post.
		}

		// watch the input field and update trading post
		// fees as the user changes the trading post money.
		tpm.oninput = function() {
			// respond to changes in tp-money
			// and update tp-finance-fee
			let tpm = rpd.qs('#tp-money');
			let tpfee = rpd.qs('#tp-finance-fee');
			let tp = tpm.value.trim();
			if (0 == tp || '' == tp) {
				tpfee.innerHTML = ' <br>';
				return;
			}
			tpfee.innerHTML = `Fees: $${rpd.calcPPFees(tp)}`;
		}

		// if this is a situation where the balance has been paid
		// then don't allow the user to pay more on the balance
		let regmoneyInput = rpd.qs('#reg-money input[name="amt"]');
		if (regmoneyInput && pe1) {
			let pear = rpd.filterReg(pe1.regnum, pe1.weblogin_id);
			let rps = rpd.rpstats(pear);
			if (rps.balance <= 0) {
				regmoneyInput.disabled = true;
			}

			// cutoff time message is for users who want to
			// add trading post money to their account after the
			// registration has been at least partially paid.
			function cutoffTimeMessage() {
				let ctd = new Date(cbER.tradingPostCutoffTime);
				let msDelta = cbER.tradingPostCutoffTime - rpd.adjustedTimeNow();
				let minutesLeft = Math.floor(msDelta / (1000 * 60));
				let secondsLeft = Math.floor(msDelta / 1000) - (minutesLeft * 60);
				let m = rpd.qs('#tp-time-running-out-msg');
				if (!m) {
					return;
				}

				if (minutesLeft < 24*60) {
					let countdownMsg = '';
					if (minutesLeft < 30) {
						if (minutesLeft < 6) {
							countdownMsg = ` (${minutesLeft} minutes, ${secondsLeft} seconds)`
						} else {
							countdownMsg = ` (${minutesLeft} minutes)`
						}
					}
					m.innerHTML = 'You have until ' +
						ctd.toLocaleDateString('en-US', 
							{	weekday: 'short',
								hour: 'numeric',
								minute: 'numeric',
							}) +
						countdownMsg + ' to add trading post money.';
					rpd.unhideEl(m);
				}

				if (msDelta > 0) {
					setTimeout(cutoffTimeMessage, 250);
				} else {
					// out of time.
					// we go to the registration, cancelling any payment in progress.
					doViewRegistration(pe1.regnum, pe1.weblogin_id);
				}
			}
			if (!/latetp/i.test(pe1.note_from_camp) &&
				/completed/i.test(pe1.reg_status)) {
				cutoffTimeMessage();
			}
		}

		// respond to changes in the keeptp checkbox.
		// update server
		const ktpm = rpd.qs('#keeptpmoneychk-1');
		if (ktpm && pe1) {
			rpd.unhideID('divktp-1');
			ktpm.onchange = function() {
				rpd.keepTPMoneyUpdate(pe1, ktpm);
			}
		}
	}

	// calculate PayPal Fees for this amount.
	rpd.calcPPFees = function(a) {
		return Number(a * 0.0349 + .49).toFixed(2)
	}

	// create array of paymentDetails to be sent
	// to the server based on this upcoming registration payment.
	// include registration, trading post, and fees.
	rpd.pdRegistrationArray = function(amt, regnum) {
		let r = [{
			a: amt,
			t: 1, // registration
			r: regnum
		}];

		// look for trading post input fields and add more
		// pd elements if needed.
		let tpm = rpd.qs('#tp-money');
		if (!tpm) {
			return r;
		}
		let tp = tpm.value.trim();
		if (0 == tp || '' == tp) {
			return r; // no trading post fees.
		}

		// if the registration fee amount is 0 and
		// we're just working with trading post money
		// then we don't need a row for registration fees.
		if (amt == 0) {
			r = [];
		}

		r.push(
			{ a: tp, t: 3, r: regnum } // TRADING POST
		);
		if (!impersonating()) {
			r.push(
				{ a: rpd.calcPPFees(tp), t: 5, r: regnum } // FEES
			);
		}

		return r;
	}

	rpd.impersonating = impersonating;

	rpd.camperAgeYears = function(c, d1) {
		if (!c.birth_date)
			return 0;
		if (!d1)
			d1 = rpd.now;

		return _CB.dateDiffDays(c.birth_date, d1) / 365;
	}

	// clear HTML of DOM element.
	rpd.clearHTML = function(el) {
		while (el.firstChild) {
			el.removeChild(el.firstChild);
		}
	}
	rpd.qin = function(nm) { // query input name
		return rpd.qs('input[name="' + nm + '"]');
	}
	rpd.qbv = function(bv) { // query button with value 'bv'
		return rpd.qs('[type=button][value="' + bv + '"]');
	}
	rpd.bclk = function bclk(ba) { // [btn value, btn onclick fn]
		if (rpd.qbv(ba[0]))
			rpd.qbv(ba[0]).onclick = ba[1];
	}
	rpd.shrtDate = function(d, bShowYear) {
		if (typeof d == "string") {
			d = rpd.zdt(d);
		}
		var y = bShowYear ? '/' + d.getUTCFullYear() : '';
		return (d.getUTCMonth()+1) + '/' + (d.getUTCDate() + y);
	}
	rpd.dig2 = function(n) { // pad to two digits.
		return ('00' + n).slice(-2);
	}
	rpd.shrtDT = function(d) {
		if (typeof d == "string") {
			d = rpd.zdt(d);
		}
		return rpd.shrtDate(d) + ' ' +
			rpd.dig2(d.getUTCHours()) +
			':' + rpd.dig2(d.getUTCMinutes());
	}
	rpd.regMain = regMain;
	rpd.goto = function(hash) {
		if (hash == location.hash || '#' + hash == location.hash) {
			// look up function in hashMap
			let i = rpd.hashMap.find(f => f[0] == hash);
			if (i) {
				i[1]();
			}
			rpd.smoothScrollToTop();
			return;
		}
		location.hash = hash;
	};
	rpd.smoothScrollToTop = function smoothScrollToTop() {
		if (rpdstate.alreadySawHeader) {
			// show the breadcrumbs at top
			// breadcrumbs are hidden by header, so
			// this seems good.
			let rn = _CB.qs('.breadcrumb-nav');
			if (rn) {
				if (rn.scrollIntoView) {
					rn.scrollIntoView(
						{behavior: 'smooth',
						block: 'start',
						inline: 'center'});
				}
			}
	
		} else {
			// scroll to the top of the page.
			window.scrollTo(0, 0);
			rpdstate.alreadySawHeader = true;
		}
	};

	rpd.smoothScrollCenter = function smoothScrollCenter(el) {
		if (el && el.scrollIntoView) {
			el.scrollIntoView(
				{behavior: 'smooth', block: 'center', inline: 'center'});
		}
	};

	rpd.btn = function(v) {
		return `<input type="button" value="${v}" />`;
	}
	rpd.hashMap = [ ['housing', regHousing],
			['edit', editPerson],
			['addresslist', editAddressList],
			['event', regEvent],
			['pay', payEvent],
			['opaymore', payMore],
			['list', contactList],
			['cpw', changePasswordShow],
			['cemail', changeEmailShow],
			['signout', signOut],
			['ef', chooseEffectiveUser],
			['newact', createNewAccountSF],
			['prts', shPrts],
			['ree', registrarEditEvents],
			['bee', bkEditEvents],
			['confemail', adminConfirmationEmails],
			['ebedit', earlybirdEdit],
			['viewreg', viewRegistration],
			['adjustpayment', paymentAdjustment],
			['partialrefund', partialRefund],
			['reports', displayReportsPage],
			['donate', donate],
		];

	// return predicate for filtering on campevent_id.
	rpd.filterCID = function(campevent_id) {
		return function(c) {
			return c.campevent_id == campevent_id;
		}
	}

	// total number of slots available
	// in this campevent. This looks at total
	// slots but not whether the event is open.
	rpd.available_space = function(ce, bExcludeEarlybird) {
		let a = ce.available_space;
		if (rpd.userIsAdmin) {
			if (ce.oho) {
				a += ce.oho
			}
		} else {
			if (a && ce.wait_list) {
				// normal users can't register
				// if there is a wait list.
				a = 0;
			}
		}

		if (!bExcludeEarlybird) {
			let ebrow = earlybirdRow(ce);
			if (ebrow) {
				return earlybirdSlots(ce);
			}
		}

		return a;
	}

	// find campevent from campevent_id.
	rpd.findCE = function(campevent_id) {
		return rpd.events.find(rpd.filterCID(campevent_id));
	}

	// does this camper match the grade limitations for
	// this week of summer camp.
	rpd.sumAgeMatch = function(c, ce) {
		if (!ce.age.match(/^(\d{1,2})-(\d{1,2})$/)) {
			return false;
		}
		var minG = Number(RegExp.$1);
		var maxG = Number(RegExp.$2);
		var cG = Number(c.age);
		return cG <= maxG && cG >= minG;
	}

	// calculate summer week1 start date.
	rpd.calc_sw1 = function() {
		var sw1 = rpd.zdt(new Date(2020, 5,16));
		if (rpd.events && rpd.events.length > 1) {
			// find the first event of summer camping.
			var ce = rpd.events.find(e =>
				/summer/.test(e.season) && !/(ability|plant)/i.test(e.name));
			if (ce) {
				sw1 = rpd.zdt(ce.start_date);
			}
		}
		rpd.sw1 = sw1;
		return sw1;
	}
	rpd.calc_sw1();

	rpd.findWLID = function(wlid) {
		return rpd.weblogin.find(w => w.weblogin_id ==  wlid);
	}

	// is emv a duplicate of an already-existing email?
	// if so, set up #cuNewDup with message.
	// if not, clear the message in #cuNewDup.
	rpd.setupDup = function(emv) {
		var aDup = rpd.findWLEmail(emv);
		var dup = rpd.qs('#cuNewDup');
		if (aDup) {
			dup.style.display = 'table';
			dup.classList.add('invalidField');
			dup.innerHTML = '<p style="cursor:pointer">' +
				'Duplicate of weblogin ' +
				aDup.weblogin_id + '</p>';
			rpd.qs('#cuNewDup p').addEventListener('click',
				function() { loginAs(aDup.weblogin_id)});
		} else {
			dup.innerHTML = '';
			dup.style.display = 'none';
			dup.classList.remove('invalidField')
		}
	}

	rpd.findWLEmail = function(email) {
		var emre = new RegExp('^' + email + '$', 'i');
		return rpd.weblogin.find(function(w) {
			return emre.test(w.email)
		});
	}

	// return true if this pe is not waitlisted and not cancelled.
	// pe is one element of a personevent
	rpd.notWLCanc = function notWLCanc(pe) {
		return !pe.wl && !/cancelled/i.test(pe.reg_status);
	}

	rpd.notCanc = function notCanc(pe) {
		return !/cancelled/i.test(pe.reg_status);
	}

	// number of people registered (not waitlisted) for an event.
	rpd.eventCount = function eventCount(campevent_id) {
		return rpd.personEvent
			.filter(rpd.filterCID(campevent_id))
			.filter(rpd.notWLCanc)
			.length;
	}

	// campevent name and date
	rpd.ceNameDate = function ceNameDate(campevent, bNoCls) {
		var ce = campevent;
		if (!ce) {
			return 'Unknown Event';
		}
		if (typeof campevent == "string") {
			ce = rpd.findCE(campevent); // turn into campevent.
			if (!ce) {
				return campevent;
			}
		}
		let summerWeek = /summer/i.test(ce.season) ?
			' Summer Camp' : '';
		let dStr = rpd.dr(ce);
		if (bNoCls) {
			dStr = dStr.replace(/&nbsp;/g, ' ');
		} else {
			dStr = '<span class="ndd">' + dStr + '</span>';
		}
		return ce.name + summerWeek + ' - ' + dStr;
	}

	// show whole dollars or cents
	rpd.dollarsOrCents = function docents(a) {
		a = Number(a).toFixed(2);
		if (a == Math.round(a)) {
			// don't show .00 for whole dollars
			a = Math.round(a);
		}
		return a;
	}

	rpd.add = function add(a,b) { return a + b; }

	// registration pay statistics.
	// calculate total paid towards registration,
	// balance remaining.
	rpd.rpstats = function rpstats(pear) {
		var add = function(a,b) { return a + b };
		var sumf = function(ar, f) {
			return ar.map(f).reduce(add, 0);
		}

		let rn = pear[0].regnum;
		let wl = pear[0].weblogin_id;

		// total fee for this regnum.
		let total = sumf(pear.filter(rpd.notWLCanc), p => p.balance_remaining);

		// if there are no registrations, but only waitlist(s) then
		// the total is the waitlist deposit amount.
		if (0 == total) {
			let anyWL = rpd.findReg1(pear);
			if (anyWL && anyWL.wl) {
				total = anyWL.payment_auth;
			}
		}

		// get payments for this regnum,wlid
		let paid = sumf(rpd.payments.filter(
			rpd.onereg(rn, wl)
			), p => p.mc_gross);

		// dc - don't count any trading post money or
		// fees paid towards the amount paid.
		// do count registration fees paid and registration fees kept
		let dc = sumf(rpd.paymentDetails.filter(pd => pd.c &&
			pd.r == rn && pd.w == wl && 
			pd.t != 1 && pd.t != 6), pd => pd.a);

		paid = rpd.dollarsOrCents(paid - dc);

		return {
			balance: rpd.dollarsOrCents(total-paid),
			paid: paid,
			total: total
		};
	}

	rpd.lookupopm = function lookupopm(e) {
		let r = e.dataset.regnum;
		let w = e.dataset.wlid;
		let c = e.dataset.cid;
		let url = location.href;
		if (!url.match(/^(.+)#/)) {
			popAlert('bad url ' + url);
			return;
		}
		url = RegExp.$1;
		updateDB( {
			lookupwlsha: w
		}, function showopm(d) {
			try {
				let rs = JSON.parse(d);
				if (!('sha' in rs)) {
					popAlert('no sha');
					return;
				}
				let sha = rs.sha;
				popAlert(`${url}#opaymore/${r}/${w}/${c}/` +
				sha.substr(sha.length-8), 'opaymore link');
			} catch(e) {
				popAlert('lookupwlsha fails:<BR>' + d +
				`<BR>${e.message}`);
			}
		})
	}

	rpd.findCamper = function findCamper(camper_id) {
		return rpd.campers.find(function(c) {
			return c.camper_id == camper_id;
		});
	}

	rpd.findAddress = function findAddress(a, id) {
		return rpd.addressList.find(function(l) {
			return l.weblogin_id == id && l.address == a;
		});
	}

	rpd.onereg = function(rn, wlid) {
		return function(p) {
			return p.regnum == rn &&
				p.weblogin_id == wlid;
		}
	}

	// filter for registrations for this regnum/wlid.
	rpd.filterReg = function filterReg(regnum, wlid) {
		return rpd.personEvent.filter(rpd.onereg(regnum, wlid));
	}

	// add a new camper to an existing registration in memory.
	// the server has responded "OK" to the changeCamper(add) request.
	rpd.addOnePersonEvent = function addOnePersonEvent(rn, wl, cid) {
		let r = rpd.filterReg(rn, wl);
		if (!r) {
			console.log(`addOnePersonEvent: no registration ${rn} ${wl}`);
			return true;
		}
		let npe = Object.assign({}, r[0]);
		npe.camper_id = cid;
		npe.note_from_camp = null;
		npe.note_to_camp = null;
		npe.balance_remaining = 0;
		npe.payment_auth = 0;
		rpd.personEvent.push(npe);
		rpd.updateAvailableSpace(npe.campevent_id, -1);

		if (!rpd.userIsAdmin) {
			// for non-admin, we
			// set up to pay for the newly added person.
			// first we update the viewRegistration page with the new
			// data.
			doViewRegistration(rn, wl);
			_CB.setHTML('change-campers',
				rpd.payMoreButton +
				'<div id="paypal-button-container"></div>');
			let pear = rpd.loadRegnum(rn, wl);
			let rps = rpd.rpstats(pear);
			// if somehow there is no balance due then
			// user can't pay any more and
			// we are done adding the additional camper.
			if (rps.balance <= 0) {
				return true;
			}
			// we're going to act as if "Pay More" was clicked so we
			// disable that button.
			rpd.qbv('Pay More').disabled = true;
			rpd.smoothScrollCenter(rpd.qs('#change-campers'));
			rpd.payMoreButtonClick(rps.balance,
				function(amt) {
					// this is called when the 'Pay' button
					// is clicked. amt is the amount
					// the user wants to pay towards Registration.
					// get rid of the 'Pay' button and the
					// input field
					rpd.sqs('#upm', '');
					// set up paypal with this amount.
					// when payment is approved we
					// will tell the server.
					// user can't add trading post money
					// at this point so we don't worry about
					// adding expected payments/paymentDetails.
					gotoPaypal({
						regnum: rn,
						payNow: amt,
						payTotal: amt,
						campers: [cid],
						campevent_id: npe.campevent_id,
						housing: ''
					});
				}
			);
			// set the minimum amount allowed.
			// either deposit only amount or total amount for
			// the extra person.
			let iAmt = rpd.qs('#upm [name="amt"]');
			iAmt.min = tad;

			if (depositOnlyDaysOK()) {
				let minPay = cbER.fees(2)[0];
				if (_CB.wt && _CB.wt.wtMatch(cbER.ev)) {
					minPay = _CB.wt.depositDueNow(rn);
				}
				if (minPay > 0) {
					// give a message about how much must be paid
					rpd.qs('#upm p').insertAdjacentHTML('beforebegin',
						`<h5 class="card-title">Pay</h5><p>You may pay any amount between the $${minPay}
						deposit due and the total due of $${rps.balance}.</p>`
					);
				}
			}
		}

		// return whether we are done and the viewRegistration should
		// be re-rendered.
		// we are done for admins, but not non-admins, who need to pay.
		return true;
	}

	rpd.removeOnePersonEvent = function removeOnePersonEvent(rn, wl, cid) {
		// Delete this person from the registration.
		const i = rpd.personEvent
			.findIndex(pe => pe.camper_id == cid &&
				pe.regnum == rn &&
				pe.weblogin_id == wl);
		if (i == -1) {
			console.log(`removeOnePersonEvent: no registration ${rn} ${wl} ${cid}`)
			return;
		}
		const campevent_id = rpd.personEvent[i].campevent_id;
		rpd.personEvent.splice(i, 1); // remove from array.
		rpd.updateAvailableSpace(campevent_id, 1);
	}

	// cancel this registration in the internal database.
	rpd.cancelRegistration = function cancelRegistration(rn, wl)
	{
		// search for reg's for this efWL
		// and regnum and cancel them.
		let unpd = rpd.filterReg(rn, wl)
			.filter(rpd.notCanc);

		if (unpd.length) {
			let campevent_id = unpd[0].campevent_id;

			// adjust available space if this is registration
			// and not waitlist.
			let rlen = unpd.filter(rpd.notWLCanc).length
			if (rlen) {
				rpd.updateAvailableSpace(campevent_id, rlen);

				// if this was an earlybird registration then
				// update the earlybird_counts if we have them.
				if (unpd[0].eb_id > 0 && Array.isArray(rpd.eb) &&
					rpd.eb.length)
				{
					let eb1 = rpd.eb.find(e => e.eb_id == unpd[0].eb_id);
					if (eb1) {
						if (/winter teen/i.test(eb1.event_type)) {
							rlen = 1; // special case for winter teen counts.
						}
						eb1.count += rlen;
					}
				}
			}

			// mark this registration as cancelled
			unpd.forEach(pe => pe.reg_status = 'cancelled');
		}
	}

	// return first/main registration.
	rpd.findReg1 = function findReg1(pear) {
		let r1 = pear.filter(rpd.filter1);
		if (!r1.length) {
			return false;
		}
		if (1 == r1.length) {
			return r1[0]
		}
		// this is a waitlist or cancellation situation.
		// if there is a non-waitlist non-cancelled registration
		// then return that one as reg1.
		let r = r1.find(rpd.notWLCanc);
		if (r) {
			return r;
		}

		// if there is a non-cancelled waitlist
		// then that's what we want.
		return r1.find(rpd.notCanc) || r1[0];
	}

	// predicate to filter personevent for reg1.
	rpd.filter1 = function(pe) {
		return /^1/.test(pe?.note_from_camp);
	}

	// return PE1's for current person
	rpd.getPE1s = function() {
		return rpd.personEvent
			.filter(rpd.cuf)
			.filter(rpd.notCanc)
			.filter(rpd.filter1);
	}

	// return similar PE if this person is already registered
	// or waitlisted on a similar summer event.
	rpd.getSimilarPE = function(camper_id, ce) {
		return ce.awl && /summer/i.test(ce.season) &&
			rpd.getPE1s()
				.find(pe =>
					{ 	let pece = rpd.findCE(pe.campevent_id);
						return pe.camper_id == camper_id &&
							/completed/i.test(pe.reg_status) &&
							/summer/i.test(pece.season) &&
							pece.awl
					});
	}

	// calculate the registration fees for this regnum
	// given the current state and we are adding/deleting delta people
	// from the registration.
	// return [newdeposit, newtotal]
	rpd.totalRegistrationFees = function(regnum, campevent_id, delta) {
		if (!rpd.ce || rpd.ce.campevent_id != campevent_id) {
			rpd.ce = rpd.findCE(campevent_id);
			if (!rpd.ce) {
				console.log(`calcRegistrationFees(): campevent_id ${campevent_id} not found`);
				return [0, 0];
			}
			cbER.setup(null, rpd.ce);
		}

		let nd = 0, nt = 0;
		let l = rpd.personEvent
			.filter(pe => pe.regnum == regnum && pe.campevent_id == campevent_id)
			.filter(rpd.notCanc)
			.length + delta;

		if (l <= 0) {
			return [0, 0];
		}

		for(let i=0; i<l; i++) {
			let f1 = cbER.fees(i);
			nd += f1[0]; //deposit amount for this person
			nt += f1[1]; //registration amount
		}

		const adre = new RegExp(/ADJUSTMENT: \$([\d\-]+)/);

		// adjust for any adjustments.
		rpd.payments
			.filter(p => p.regnum == regnum && 
				0 == p.mc_gross &&
				adre.test(p.remarks) &&
				/office payment/i.test(p.ipn)
			)
			.forEach(function(p) {
				if (p.remarks.match(adre)) {
					nt -= Number(RegExp.$1);
				}
			})
		
		if (nd > nt) {
			nd = nt;
		}
		return [nd, nt];
	}

	// display space available for this event on the page.
	rpd.setSpaceAvailable = function setSpaceAvailable(s) {
		let sa = rpd.available_space(rpd.ce);
		let saMsg = sa;
		if (s) {
			saMsg = (sa - s) +
				' = (' + sa + ' - ' + s + ')';
		}
		let ebrow = earlybirdRow(rpd.ce);
		if (ebrow) {
			saMsg += ` (${ebrow.group_name})`;
		}

		_CB.setHTML('ei_spavail', saMsg);
	}

	// Set up event info for the current event: rpd.ce.
	rpd.fillEventInfo = function fillEventInfo() {
		let m1 = /summer/i.test(rpd.ce.season) ?
			'Grades:' : 'Minimum Age:';
		let wlLine = '';
		if ((rpd.ce.awl && rpd.ce.available_space < 1) ||
			rpd.ce.wait_list > 0)
		{
			wlLine = show_a1_2Table('Wait List:', rpd.ce.wait_list);
		}
		rpd.qs('#cbEventInfo')
		.insertAdjacentHTML('afterbegin',
			show_a1_2Table('<i class="fas fa-calendar-alt"></i> Date:', rpd.dr()) +
			show_a1_2Table('<i class="fas fa-user-circle"></i> ' + m1, rpd.up1(rpd.ce.age)) +
			(rpd.ce.gender ? show_a1_2Table('Gender:', rpd.up1(rpd.ce.gender)) : '') +
			show_a1_2Table('Space Available:',
				'<span id="ei_spavail"></span>') +
			wlLine
		);
	}

	// load up information to view this registration.
	rpd.loadRegnum = function loadRegnum(regnum, wlid) {
		initRPDevent();
		if (rpd.ope) {
			popAlert('Registration in progress.');
			gotoPayEvent();
			return false;
		}
		// registrations of interest.
		var pear = rpd.filterReg(regnum, wlid);
		if (!pear.length) {
			popAlert('Registration not found. ' +
				wlid + ' ' + regnum);
			resetViewToDefault();
			return false;
		}
		var pe1 = rpd.findReg1(pear);
		if (!pe1) {
			popAlert('no master person.');
			resetViewToDefault();
			return false;
		}

		// effective login for the registration.
		if (rpd.userIsAdmin && rpd.efWL != pe1.weblogin_id) {
			var tw = rpd.efWL;
			rpd.efWL = pe1.weblogin_id;
			var w = rpd.weblogin.find(rpd.cuf);
			if (w) {
				rpd.efEmail = w.email;
			} else {
				rpd.efWL = tw;
			}
		}

		rpd.ce = rpd.findCE(pe1.campevent_id);
		if (rpd.ce) {
			if (_CB.wt && _CB.wt.wtMatch(rpd.ce)) {
				// initialize winter teen variables
				_CB.wt.initWT(regnum);
			}
			cbER.setup(null, rpd.ce);
		}

		rpd.pendingCampers = [... new Set(pear.map(pe => pe.camper_id))];
		return pear;
	}

	// office pay work
	rpd.opw = {
		mc_gross: function() { return rpd.qin('mc_gross')},
		setInvoice: function() {
			rpd.opw.invoice = rpd.ce.name + ' - ' + rpd.ppSafe(rpd.dr());
		},
		setup: function setup(totalBalance, regnum, dstID) {
			this.totalBalance = totalBalance;
			this.regnum = regnum;
			var dst = _CB.ge(dstID);
			let opfel = rpd.qs('#officepayform');
			// add office pay form if it isn't there already.
			if (!opfel) {
				let src = _CB.ge('officepayform');
				dst.appendChild(src.cloneNode(true));
				opfel = rpd.qs('#officepayform');
			} else {
				// office pay form is there, make sure not hidden.
				// there is a button on the form that hides it
				// so the div could be hidden.
				rpd.unhideEl(opfel);
			}

			// scroll into view.
			rpd.smoothScrollCenter(opfel);

			if (rpd.validEmail(rpd.efEmail)) {
				// fill in confirmation email.
				rpd.qin('emailConf').value = rpd.efEmail;
			}

			// unhide trading post if allowed
			// for this event
			if (cbER.tradingPostMoney) {
				rpd.qs('#trading-post-opm').classList.remove('d-none');
			}

			xxSetupValidation(this.val);
			var btnRP = rpd.qbv('Record Payment');

			btnRP.onclick = function() { // Record Payment
				// disable button so no double clicks.
				btnRP.disabled = true;

				let mc_gross = rpd.opw.mc_gross();
				let regAmount = parseFloat(mc_gross.value) || 0;
				let pda = rpd.pdRegistrationArray(regAmount, rpd.opw.regnum);
				let amt = regAmount;
				if (pda.length > 1 || pda[0].t == 3) {
					// include trading post money in 'amt'
					amt = 0;
					pda.forEach(pd => amt = amt + Number(pd.a));
				}
				var aaStr = (rpd.opw.adjAmtVal() != 0) ?
					'ADJUSTMENT: $' + rpd.opw.adjAmtVal() + ' ' : '';
				var remEl = rpd.qs('[name=remarks]');
				var remStr = remEl.value.trim();
				if (remStr && remEl.placeholder == remStr) {
					remStr = '';
				}
				var payment = {
					mc_gross: amt,
					cash: rpd.qs('input[name=cbCash]:checked') ? 1 : 0,
					checkno: rpd.qin('checkno').value.trim() || 0,
					remarks: aaStr + remStr,
					payment_status: 'Completed',
					email: rpd.efEmail,
					regnum: rpd.opw.regnum,
					ipn: 'office payment: ' + rpd.email,
					invoice: rpd.opw.invoice,
					adjustment: rpd.opw.adjAmtVal()
				};

				function updatePayment() {
					updateDB({ payment: JSON.stringify(payment),
						email: rpd.qin('emailConf').value.trim() },
						rpd.afterPaymentRecorded);
				}

				recordExpectedPayment(pda, updatePayment);
			}
		},
		adjAmt: function() {
			return rpd.qin('adjAmt');
		},
		adjAmtVal: function aav() {
			var aa = rpd.opw.adjAmt();
			if (!aa) {
				return 0;
			}
			return parseFloat(aa.value) || 0;
		},
		val: function val() {
			// validate office payment fields.
			var mc_gross = rpd.opw.mc_gross();
			var btnRP = rpd.qbv('Record Payment');

			var payment = parseFloat(mc_gross.value) || 0;
			var adjAmtVal = rpd.opw.adjAmtVal();

			// trading post amount
			let tp = rpd.qin('tp-money')
			let tpAmount = parseFloat(tp.value) || 0;
			
			// need checkno or cash but can't be checkno and cash.
			let anyAmount = payment+tpAmount+adjAmtVal;
			var cn = rpd.qin('checkno');
			var cbCash = rpd.qs('input[name=cbCash]:checked');
			var bInv = (!cn.value.trim() && !cbCash && anyAmount > 0) ||
				(cn.value.trim() && cbCash);
			setInvalidField(bInv, cn);

			// amount validation.
			// june 13, 2023 - payment may now exceed balance due per
			//   request from Caleb.
			// june 30, 2023 - allow negative payments (again)
			var bAInv = (anyAmount == 0) ||
				((cn.value.trim() || cbCash) && anyAmount == 0);
			setInvalidField(bAInv, mc_gross);

			// adjustment+payment amount can't be more than total
			setInvalidField(adjAmtVal > 0 &&
				adjAmtVal+payment > rpd.opw.totalBalance,
				rpd.opw.adjAmt());

			// confirmation email valid?
			var emv = rpd.qin('emailConf').value;
			var bEInv = emv && !rpd.validEmail(emv);
			setInvalidField(bEInv, rpd.qin('emailConf'));
			btnRP.disabled = bInv || bAInv || bEInv;
		}
	};

	// set new value for late trading post.
	// (note_from_camp) for this personevent.
	rpd.setNewLateTPValue = function setNewLateTPValue(pe1, val, cb) {
		updateDB( { setLateTP: JSON.stringify(
			{
				regnum: pe1.regnum,
				campevent_id: pe1.campevent_id,
				newVal: val
			}
		)}, function(d) {
			if (rpd.notOKFail(d)) {
				return;
			}
			pe1.note_from_camp = '1' + val;
			if (cb) {
				cb();
			}
		});
	}

	// response back from server for payment,
	// either by office worker or the paypal approve message.
	rpd.afterPaymentRecorded = function afterPaymentRecorded(d) {
		// update local info to match what the server has.
		waitMessage(false);
		try {
			let sr = JSON.parse(d);
			if (!Array.isArray(sr.personEvent) ||
				!sr.personEvent.length) {
				popAlert('afterPaymentRecorded srv error.<BR>' +
					'Your registration does not exist or has been cancelled.<BR>' +
					'Contact the Camp office.<BR><BR>' + d);
				return;
			}
			let wlid = sr.personEvent[0].weblogin_id;
			let regnum = sr.personEvent[0].regnum;

			// update personEvent local records.
			rpd.personEvent = rpd.personEvent.filter(pe =>
				pe.weblogin_id != wlid || pe.regnum != regnum);
			rpd.personEvent = rpd.personEvent.concat(sr.personEvent);

			// add the latest payment.
			if (Array.isArray(sr.payments) && sr.payments.length) {
				rpd.payments.push(sr.payments[sr.payments.length-1]);
			}

			// update payment details records.
			if (Array.isArray(sr.paymentDetails) && sr.paymentDetails.length) {
				rpd.paymentDetails = rpd.paymentDetails.filter(pd =>
					pd.r != regnum || pd.w != wlid);
				rpd.paymentDetails = rpd.paymentDetails.concat(sr.paymentDetails);
			}

			// did this latest payment contain trading post money?
			let pe1 = rpd.findReg1(rpd.filterReg(regnum, wlid));
			let latestPNUM = rpd.payments[rpd.payments.length-1].pnum;
			if (sr.paymentDetails.some(pd => PD_TP_TYPE == pd.t &&
				latestPNUM == pd.p))
			{
				// if this was a late trading post payment then mark the user as not
				// being able to make more late TP payments.
				if (/latetp/i.test(pe1?.note_from_camp)) {
					rpd.setNewLateTPValue(pe1, '', viewThankYou);
					return;
				}
			}

			function viewThankYou() {
				// view this registration.
				doViewRegistration(regnum, wlid);
				if (!rpd.userIsAdmin) {
					popAlert('Thank you for your payment.', 'Thank You!');
				}
			}
			viewThankYou();

		} catch(e) {
			popAlert('Server says:<br>' + d);
		}
	};

	rpd.updateAvailableSpace = function ucs(campevent_id, delta) {
		var cevt = rpd.findCE(campevent_id);
		if (cevt) {
			cevt.available_space = cevt.available_space + delta;
		}
	}
	rpd.getCookieValue =  function getCookieValue(a) {
	    let b = document.cookie.match('(^|;)\\s*' + a + '\\s*=\\s*([^;]+)');
	    return b ? b.pop() : '';
	}
	rpd.noHousingPreferencesString = 'None. I have no housing preferences.';
	// return true if str is a housing string representing
	// no housing preferences.
	rpd.isNoHousing = function isNoHousing(str) {
		return !str ||
		/^none$/i.test(str) ||
		rpd.noHousingPreferencesString == str;
	}

	window.onhashchange = regShowPage;

	// shortcut for calling querySelectorAll
	// on all the CSS Selectors in ar.
	// ar - Array of strings - CSS Selectors
	// fn - function that takes each element of the querySelectorAll.
	Array.prototype.forEachQAll = function(fn) {
		this.forEach(
			function(q) {
				Array.prototype.forEach.call(
					rpd.rd.querySelectorAll(q), fn);
			}
		);
	}

	// set up the waitlistArray's for each of the
	// campevents that have managed waitlists.
	rpd.setupWaitlistArrays = function setupWaitlistArrays() {
		rpd.events.forEach(function(ce) {
			ce.waitlistArray = rpd.personEvent.filter(pe => pe.wl && pe.campevent_id == ce.campevent_id &&
				/completed/i.test(pe.reg_status))
				.sort(function(a,b) {
					let ad = _CB.zdt(a.wl_date);
					let bd = _CB.zdt(b.wl_date);
					return ad.getTime() - bd.getTime();
				})
				.map(function(pe) {
					return { camper_id: pe.camper_id, wl_date: pe.wl_date }
				});
		});
	};

	// return waitlist position string (xx / yy) for this waitlist pe
	rpd.waitlistPositionString = function waitlistPositionString(pe) {
		if (!rpd.notCanc(pe)) {
			return '';
		}
		let wlp = rpd.waitlistPosition(pe);
		return `(${wlp[0]}/${wlp[1]})`;
	};

	// return waitlist position info for this waitlist pe.
	rpd.waitlistPosition = function waitlistPosition(pe) {
		if (!pe.wl) {
			//console.log(`waitlistPosition: not on waitlist ${JSON.stringify(pe)}`);
			return [0,0];
		}
		let ce = rpd.findCE(pe.campevent_id);
		if (!ce || !Array.isArray(ce.waitlistArray)) {
			console.log(`waitlistPosition error: ${pe.campevent_id} ${ce} ${ce.waitlistArray}`)
			return [0,0];
		}
		let i = ce.waitlistArray.findIndex(w => w.camper_id == pe.camper_id);
		if (-1 == i) {
			i = '(unknown)';
		} else {
			i++; // start at 1 rather than 0
		}
		return [i,ce.waitlistArray.length];
	}

	// current (logged in) user is registration admin (Registrar or Global Admin)
	rpd.regAdmin = function regAdmin() {

		if (rpd.userIsAdmin && Array.isArray(rpd.sr) &&
			!('roles' in rpd.sr))
		{
			// security roles for this person.
			const SR_GLOBAL_ADMIN = 1;
			const SR_REG_ADMIN = 2;			// registrar
			const SR_ACCOUNTING_ADMIN = 3;
			const SR_SCR_QUEST_ADMIN = 14;	// screen questions
			
			// everyone gets read only.
			// see if current user is also reg admin
			// and or accounting admin.
			rpd.sr.roles = {
				regAdmin: rpd.sr.some(sr =>
					SR_GLOBAL_ADMIN == sr.srid ||
					SR_REG_ADMIN == sr.srid),
				accountingAdmin: rpd.sr.some(sr =>
					SR_GLOBAL_ADMIN == sr.srid ||
					SR_ACCOUNTING_ADMIN == sr.srid),
				sqAdmin: rpd.sr.some(sr =>
					SR_GLOBAL_ADMIN == sr.srid ||
					SR_REG_ADMIN == sr.srid ||
					SR_SCR_QUEST_ADMIN == sr.srid)
			}
		}
		return rpd.userIsAdmin && rpd.sr.roles.regAdmin;
	}

	// can current user enable late trading post money?
	rpd.lateTPAdmin = function lateTPAdmin() {
		if (!rpd.userIsAdmin) {
			return false;
		}
		rpd.regAdmin();
		return rpd.sr.roles.accountingAdmin;
	}

	document.onkeydown = function(e) {

		if (!rpd.userIsAdmin) {
			// keyboard shortcuts only for admins
			return;
		}
		let c = 0;
		let theText = '';
		let wlid = '';
		let shiftKey = e.shiftKey;
		function validateRegistration() {
			// make sure theText is a valid registration
			let m = theText.match(/(\d+)/);
			if (!m) {
				theText = '';
				return;
			} 
			theText = m[1];
			// now look up to see if this is a valid registration number.
			let pe = rpd.personEvent.find(pe1 => pe1.regnum == theText);
			if (pe) {
				wlid = pe.weblogin_id;
			} else {
				theText = ''; // invalid - not found
			}
		}
		function pasteClipboard() {
			c++;
			let rni = rpd.qin('rninput');
			let btn = rpd.qbv('Find Reg');
			if (rni && btn) {
				validateRegistration();
				if (!theText) {
					rni.focus();
					rni.select();
					rpd.smoothScrollCenter(rni);
				} else {
					rni.value = theText;
					btn.click();
				}
				return;
			}
			if (c < 40) {
				window.setTimeout(pasteClipboard, 50);
			}
		}

		// keyboard shortcut for Alt-r / Shift-Alt-R
		// view registration for selected or clipboard regnum.
		if (e.altKey) {
			if ('r' == e.key || 'R' == e.key) {
				// do we have selected text?
				theText = window.getSelection().toString().trim();
				if ('' == theText) {
					// nothing selected, try the clipboard.
					navigator.clipboard.readText()
					.then(text => {
						theText = text;
						part2();
					})
				} else {
					part2();
				}

				function part2() {
					if (shiftKey) {
						// Alt-Shift-R - we want the registration in a different tab.
						validateRegistration();
						if (!theText) {
							popAlert('Invalid regnum');
							return;
						}
						window.open(`${location.origin}${location.pathname}#viewreg/${theText}/${wlid}`, '_blank');
						return;
					}
					// if we're not on 'Participants' page, go there
					if (!/#prts/i.test(location.hash)) {
						rpd.goto('prts');
					}
					// when available, paste anything into the
					// rninput input.
					pasteClipboard();
				}
			}
		}

	}

	initRPDevent();
}


function loadTemplate(id)
{
	const uusflgs = ['Unvalidated', 'Active', 'Admin', 'Blocked'];
	function updateUserStatus() {
		// allow admin user to update the 'active' flag
		// for this user.
		let uus = rpd.qs('#wlid .uus');
		if (!uus.classList.contains('hidden')) {
			// already visible.  hide this
			rpd.hideEl(uus);
			return;
		}
		rpd.unhideEl(uus);
		let sel = rpd.qs('#wlid select');
		let w = rpd.findWLID(rpd.efWL);
		sel.selectedIndex = w.active;

		rpd.qs('#wlid [value="SaveState"]').onclick = function() {
			let newVal = sel.selectedIndex;
			// save updated value.
			rpd.updateDB({changeActive: newVal},
				function(d) {
					if (rpd.notOKFail(d))
						return;
					w.active = newVal;
					regShowPage();
				})
		}
		rpd.qs('#wlid [value="X"]').onclick = function() {
			// save updated value.
			rpd.hideEl(uus);
		}
	}

	rpd.rd.innerHTML = '';
	let reTemplate = _CB.ge(id);
	if (!reTemplate) {
		console.log(`template for ${id} not found`);
		return;
	}
	rpd.rd.appendChild(reTemplate.cloneNode(true));

	// if there is a regnav div then we load it with regnav
	if (rpd.qs('#regnav')) {
		_CB.setHTML('regnav', rpd.regNav());
		if (rpd.email) {
			let wlid = rpd.qs('#regnav #wlid'); // float right.
			if (rpd.userIsAdmin) {
				wlid.classList.add('admin');
				if (impersonating()) {
					let st = uusflgs[rpd.findWLID(rpd.efWL).active];
					wlid.insertAdjacentHTML('beforeend',
						`<span class="ef ${st}" title="${st}">
						${rpd.efEmail} ${rpd.efWL}</span>
						<span class="uus hidden">Update Status:<BR><select></select><BR>
						<input type="button" value="SaveState" />
						<input type="button" value="X" /></span>
						`);
					if (rpd.regAdmin()) {
						rpd.qs('#wlid .ef').onclick = updateUserStatus;
					}
					let sel = rpd.qs('#wlid select');
					const vls = [0,1,2,3];
					loadSelectFromArray(uusflgs, sel, vls);
				}
			}
		}
	}
}

// load SELECT element sel with options
// found in Array ar.
// we go through this so that IE10/11
// work properly with sel.value = newValue.
// valar - (optional) values array.
function loadSelectFromArray(ar, sel, valar)
{
	ar.forEach(
		function(st, idx) {
			var ns = document.createElement('option');
			ns.value = valar ? valar[idx] : st;
			ns.innerHTML = st;
			sel.appendChild(ns);
		}
	);
}

// pop up an alert message for the user
function popAlert(str, strtitle, cb)
{
	// add alert modal into the DOM if it isn't already there.
	let amd = _CB.ge('amodal');
	if (!amd) {
		_CB.ge('regtemplates').insertAdjacentHTML('beforebegin',
		`<div class="modal fade" tabindex="-1"
			id="amodal"
			role="dialog" aria-hidden="true">
		<div class="modal-dialog modal-dialog-centered modal-lg">
			<div class="modal-content">
			<div class="modal-header d-none">
				<h5 class="modal-title">Modal title</h5>
				<button type="button" class="close" data-dismiss="modal" aria-label="Close">
				<span aria-hidden="true">&times;</span>
				</button>
			</div>
			<div class="modal-body"></div>
			<div class="modal-footer justify-content-end">
				<button type="button" class="btn btn-secondary" data-dismiss="modal">OK</button>
			</div>
			</div>
		</div>
		</div>
		`);
		amd = _CB.ge('amodal');
	}

	let mh = amd.querySelector('.modal-header');
	amd.querySelector('.modal-content .modal-body').innerHTML = str;
	if (strtitle) {
		mh.classList.remove('d-none');
		mh.querySelector('.modal-title').innerHTML = strtitle;
	} else {
		mh.classList.add('d-none');
	}

	// set up call back for dismissal of the alert.
	amd.querySelectorAll('button[data-dismiss]')
	.forEach(function(b) {
		if (cb) {
			b.onclick = cb;
		} else {
			b.onclick = false;
		}
	})

	$('#amodal').modal();
}

// pop up an confirmation message for the user.
// on 'Yes', we execute the function fn.
function popConfirm(str, fn)
{
	// add modal into the DOM if it isn't already there.
	let bmd = _CB.ge('bmodal');
	if (!bmd) {
		_CB.ge('regtemplates').insertAdjacentHTML('beforebegin',
		`<div class="modal fade bd-example-modal-sm" tabindex="-1"
			id="bmodal"
			role="dialog" aria-labelledby="yes_no" aria-hidden="true">
		<div class="modal-dialog modal-dialog-centered modal-sm">
		  <div class="modal-content">
		  	<div class="modal-body"></div>
			<div class="modal-footer justify-content-end">
			  <button type="button" class="btn btn-primary modal-yes-button">Yes</button>
			  <button type="button" class="btn btn-secondary" data-dismiss="modal">No</button>
			</div>
		  </div>
		</div>
	  </div>
		`);
		bmd = _CB.ge('bmodal');
	}

	bmd.querySelector('.modal-content .modal-body').innerHTML = str;
	bmd.querySelector('.modal-footer .modal-yes-button').onclick = function() {
		$('#bmodal').modal('hide');
		fn();
	}
	$('#bmodal').modal();

}

// initialize form values with data from dObj.
function loadFormValues(dObj)
{
	let f = rpd.qs('form[name=eaform]');
	for (let i in dObj) {
		if (!dObj.hasOwnProperty(i) ||
			!dObj[i] || !f[i]) {
			continue;
		}
		f[i].value = dObj[i];
		f[i].lastSavedValue = dObj[i];
	}
}

// collect form values into the object dObj.
// use rpd.rd.querySelectorAll to find the form elements.
function collectFormValues(dObj)
{
	['input[type=text],input[type=email],input[type=tel],' +
	'input[type=date],input[type=hidden],' +
	'input[type=radio]:checked,select'].forEachQAll(
		function(el) {
			dObj[el.name] = el.value;
			if (typeof dObj[el.name] == "string") {
				dObj[el.name] = dObj[el.name].trim();
			}
		});
}

// add events to listen for changes for form validation
function xxSetupValidation(validateFn)
{
	['input,select,textarea'].forEachQAll(function(el) {
		if (el.type == "radio") {
			el.addEventListener('change', validateFn);
		} else {
			el.addEventListener('input', validateFn);
			el.addEventListener('paste', validateFn);
			el.addEventListener('change', validateFn);
		}
	});
	validateFn();
}

// set/clear all fields in args[1..] to invalidField
// arguments[0] = 0-clear (means valid), 1-set invalidField
function setInvalidField()
{
	var args = Array.prototype.slice.call(arguments);
	var setClear = args[0];
	args = args.slice(1);
	args.forEach(function(v) {
		if (setClear)
			v.classList.add('invalidField');
		else
			v.classList.remove('invalidField');
	});
}

// show a lovely wait message while the user waits...
function waitMessage(bShow)
{
	if (!rpd.qs || !rpd.rd) {
		return; // not far enough along in initialization.
	}
	let wm = rpd.qs('#waitmessage');
	if (!wm) {
		if (!bShow) {
			// nothing to hide so don't worry about it.
			return;
		}
		wm = document.querySelector('#regtemplates #waitmessage');
		rpd.rd.insertBefore(wm.cloneNode(true), rpd.rd.firstChild);
		wm = rpd.qs('#waitmessage');
	}

	$('#waitmessage').modal(bShow ? 'show' : 'hide');
}

// send data 'd' to server and call callback with results.
function updateDB(d, cb, ecb, bNoWait)
{
	if (typeof d == "object" &&
		rpd.userIsAdmin && rpd.efEmail != rpd.email &&
		rpd.efWL && !("efWL" in d)) {
		d.efWL = rpd.efWL; // effective weblogin_id
	}
	if (typeof d == "object" && 'string' == typeof rpd.ebc &&
		rpd.ebc.length > 2) {
		// add early bird code
		d.ebc = rpd.ebc;
	}
	if (location.pathname.match(/\-test$/i)) {
		d.dbtest = "1";
	}
	if (!bNoWait)
		waitMessage(true);

	$.ajax({
	  type: "POST",
	  url: '/cr/register/regjson.aspx',
	  data: d,
	  success: function(d) {
		  if (!bNoWait) {
		  	waitMessage(false);
		  }
		  cb(d);
	  },
	  error: function() {
		  if (!bNoWait) {
		  	waitMessage(false);
		  }
		  if (ecb) { ecb() }
		  if (!ecb) { popAlert('Error') }
	  },
	  dataType: 'text',
	  timeout: 80000 // milliseconds
	});
}

// ***** Autocomplete Functions
/* the autocomplete function takes two arguments,
	the text field element and an array of possible autocompleted values */
function autocomplete(inp, arr) {
	let currentFocus;
	/* execute a function when someone writes in the text field: */
	inp.addEventListener("input", function(e) {
		let val = this.value;
		/*close any already open lists of autocompleted values*/
		closeAllLists();
		if (!val) { return false;}
		currentFocus = -1;
		/*create a DIV element that will contain the items (values):*/
		let a = document.createElement("DIV");
		a.setAttribute("id", this.name + "-autocomplete-list");
		a.setAttribute("class", "autocomplete-items");
		/*append the DIV element as a child of the autocomplete container:*/
		this.parentNode.appendChild(a);
		/*for each item in the autocomplete array...*/
		let valRE = new RegExp("\\b" + val, 'ig');
		arr.forEach(function(ar) {
			/*check if the item has any words that start
			  with the same letters as the text field value */
			if (valRE.test(ar)) {
				/*create a DIV element for each matching element */
				let b = document.createElement("DIV");
				/*make the matching letters bold:*/
				b.innerHTML = ar.replaceAll(valRE, v => `<strong>${v}</strong>`);
				b.dataset.val = ar; // value of the autocomplete
				/*execute a function when someone clicks on the item value (DIV element):*/
				b.addEventListener("click", function(e) {
					/*insert the value for the autocomplete text field:*/
					inp.value = b.dataset.val;
					/*close the list of autocompleted values,
					(or any other open lists of autocompleted values:*/
					closeAllLists();
				});
				a.appendChild(b);
			}
		});
	});
	/*execute a function presses a key on the keyboard:*/
	inp.addEventListener("keydown", function(e) {
		let x = document.getElementById(this.name + "autocomplete-list");
		if (x) x = x.getElementsByTagName("div");
		// x is an HTMLCollection of the DIV's that are currently
		// visible for this list.
		if (e.keyCode == 40) {
			/*If the arrow DOWN key is pressed,
			increase the currentFocus variable:*/
			currentFocus++;
			/*and and make the current item more visible:*/
			addActive(x);
		} else if (e.keyCode == 38) { //up
			/*If the arrow UP key is pressed,
			decrease the currentFocus variable:*/
			currentFocus--;
			/*and and make the current item more visible:*/
			addActive(x);
		} else if (e.keyCode == 13) {
			/*If the ENTER key is pressed, prevent the form from being submitted,*/
			e.preventDefault();
			if (currentFocus > -1) {
				/*and simulate a click on the "active" item:*/
				if (x) x[currentFocus].click();
			}
		}
	});
	function addActive(x) {
		/*a function to classify an item as "active":*/
		if (!x) return false;
		/*start by removing the "active" class on all items:*/
		removeActive(x);
		if (currentFocus >= x.length) currentFocus = 0;
		if (currentFocus < 0) currentFocus = (x.length - 1);
		/*add class "autocomplete-active":*/
		x[currentFocus].classList.add("autocomplete-active");
	}
	function removeActive(x) {
		/*a function to remove the "active" class from all autocomplete items:*/
		for (let i = 0; i < x.length; i++) {
			x[i].classList.remove("autocomplete-active");
		}
	}
	function closeAllLists(elmnt) {
		/*close all autocomplete lists in the document,
		except the one passed as an argument:*/
		let x = document.getElementsByClassName("autocomplete-items");
		for (let i = 0; i < x.length; i++) {
			if (elmnt != x[i] && elmnt != inp) {
				x[i].parentNode.removeChild(x[i]);
			}
		}
	}
	/*execute a function when someone clicks in the document:*/
	document.addEventListener("click", function (e) {
		closeAllLists(e.target);
	});
}
// ***** End of Autocomplete Functions

// ** EVENT RULES & fees
var cbER = {
	allowed: null,	// check if camper is allowed to go
	fees: null,		// what are fees for this person.
	camper: null,	// the current camper
	ev: null,		// the camp event (retreat/camp)
	pe: null,		// personevent for this camper/event
	housingWanted: true,	// housing preferences wanted.
	awl: false,		// automated wait list (summer)
	housingMessage: '', // message on housing.
	payScreenFn: false,
	regEventFn: false, // hook for reg event.
	viewRegistrationFn: false, // hook
	maxAllowed: 1,	// maximum number of people allowed for this event.
	minNeeded: 1,	// min # of people needed to register.
	tradingPostMoney: 0, // accept trading post money online
	alreadyAttending: function(camper) {
		// is this camper already attending this event?
		if (!camper) {
			return '';
		}

		this.pe = rpd.personEvent.find(function(pe) {
			return pe.campevent_id == cbER.ev.campevent_id &&
				pe.camper_id == cbER.camper.camper_id &&
				rpd.notCanc(pe)
		});
		if (this.pe) {
			let wlStr = this.pe.wl ? 'waitlist' : 'attending';
			return `Already ${wlStr}. ${this.pe.reg_status}`;
		}

		// already added but action not taken yet?
		if (-1 != rpd.pendingCampers.indexOf(
			cbER.camper.camper_id)) {
			return 'Already attending.  pending.'
		}
		return '';
	},
	genAllowed: function() {
		// generic function for allowed.
		// after end date?
		if (_CB.dateDiffMinutes(rpd.now, this.ev.end_date) < 0) {
			return 'Event has ended.';
		}
		if (cbER.ev.total_space <= 0) {
			return 'No online registrations';
		}
		if (!cbER.ev.online_OK && !rpd.userIsAdmin &&
			!earlybirdSlots(cbER.ev)) {
			return 'Not accepting registrations';
		}
		if (cbER.ev.isCanc) {
			return 'Cancelled';
		}

		// is this person already registered?
		// already attending message gets priority.
		var aa = cbER.alreadyAttending(this.camper);
		if (aa != '') {
			return aa;
		}

		// space available? account for people who
		// aren't yet in server-recorded tally.
		let aspace = rpd.available_space(cbER.ev);
		let oaspace = aspace; // original available space
		if (!rpd.ope && rpd.ce &&
			rpd.ce.campevent_id == cbER.ev.campevent_id &&
			Array.isArray(rpd.pendingCampers)) {
			aspace = aspace - rpd.pendingCampers.length;
		}

		// normal users can't register after noon of the start day.
		if (!rpd.userIsAdmin) {
			let ddh = _CB.dateDiffHours(new Date(), this.ev.start_date)

			if (ddh < -16)
			{
				return 'Too late to register.';
			}
		}

		function checkSpace() {
			let wlEnabled = cbER.awl && cbER.ev.online_OK;
			if (aspace < 1) {
				return wlEnabled ? 'waitlist' : 'No more space.';
			}
	
			// to start multi-person retreat, we
			// need at least minNeeded spots.
			if (aspace == oaspace &&
				aspace < cbER.minNeeded) {
				return wlEnabled ? 'waitlist' : 'Not enough space.';
			}
			return '';
		}

		if (!this.camper) {
			return checkSpace();
		}
		// below here depends on specific camper.

		// gender requirements?
		if (this.ev.gender) {
			if (this.ev.gender.match(/gal/i) &&
				this.camper.gender.match(/boy/i)) {
					return 'Only females.';
			}
			if (this.ev.gender.match(/guy/i) &&
				this.camper.gender.match(/girl/i)) {
					return 'Only males.';
			}
		}

		// age limitation?
		if (this.ev.age) {
			if (!this.camper.age) {
				return 'Need age.';
			}
			if (this.ev.age.match(/adult/i) &&
				!this.camper.age.match(/adult|college/i)) {
					return 'No children.';
			}
			if (this.ev.age.match(/grade 12/i) &&
				!this.camper.age.match(/adult|college|12/i)) {
					return 'Only Grade 12 and older.';
			}
		}
		if (rpd.userIsAdmin && !rpd.regAdmin()) {
			return 'RO Admin';
		}
		return checkSpace();
	},
	rrFees: function(idx) { // relational retreat fees:

		if (0 == idx) {
			// for first two people.
			return [this.ev.fees[2], this.ev.fees[0]];
		}
		if (1 == idx) {
			return [0, 0]; // second person 'free'
		}
		return [this.ev.fees[3], this.ev.fees[1]];
	},
	setup: function setupER(camper, ev) {

		this.camper = camper;
		this.ev = ev;
		this.pe = null;
		this.allowed = this.genAllowed;
		this.maxAllowed = 1;
		this.minNeeded = 1;
		this.housingWanted = true;
		this.extraHousingQuestions = false;
		this.awl = ev.awl;
		this.tradingPostMoney = 0;
		this.tradingPostMoreMoney = 0;
		this.housingMessage = '';
		this.noInstallmentPlan = false;
		this.payScreenFn = false;
		this.userPayMore = false;
		this.userEditRegFn = false;
		this.regEventFn = false;
		this.viewRegistrationFn = false;
		this.fees = function() {
			// single person retreat.
			return this.rrFees(0);
		};

		if (ev.name.match(/father|mother/i)) {
			this.maxAllowed = 25;
			this.minNeeded = 2;
			this.fees = this.rrFees;
			this.allowed = function() {
				var genA = this.genAllowed();
				if (!this.camper || genA != '') {
					return genA;
				}

				// gender requirements.
				var gmb = 'girl';  // gender must be.
				if (rpd.pendingCampers.length == 0) {
					if (ev.name.match(/father/i)) {
						gmb = 'boy';
					}
				} else {
					// pending campers > 0 so we care about sons/daughters.
					if (ev.name.match(/son/i)) {
						gmb = 'boy';
					}
				}
				if (gmb != this.camper.gender) {
					return 'Wrong gender.';
				}
				var thisCamperAdult = this.camper.age && this.camper.age.match(/adult|college/i);
				// the first person must be an adult.
				if (rpd.pendingCampers.length == 0 &&
					!thisCamperAdult) {
					return 'First person adult.';
				}

				// age requirements for children.
				// age x for father/son  mother/daughter
				if (!thisCamperAdult &&
					ev.age.match(/age (\d+)/i)) {
					var ageLimit = RegExp.$1;

					// is there a valid birthdate for the child?
					var bd = rpd.zdt(this.camper.birth_date);
					if (bd.getUTCFullYear() < 1890) {
						return 'Need Birth Date.';
					}
					var ageAtStart = dateDiffDays(bd, this.ev.start_date);
					if (ageAtStart < (ageLimit*365)-7) {
						return 'Not old enough.';
					}
				}

				if (!thisCamperAdult &&
					ev.age.match(/grade (\d+)/i)) {
					var gradeLimit = RegExp.$1;
					// besides pre-k/k and adult/college
					// all other 'age' values are numbers.
					var camperGrade = parseInt(this.camper.age);
					if (!camperGrade || camperGrade < gradeLimit) {
						return 'Not old enough.';
					}
				}
				return '';
			}
		}
		if (/immersion/i.test(ev.name)) {
			this.extraHousingQuestions = this.immersionHousingFns;
		}
		if (ev.name.match(/couple/i)) {
			this.minNeeded = 2;
			this.maxAllowed = 2;
			this.fees = this.rrFees;

			// fall couples - need RV Park Info as part of housing questions.
			if (/fall/i.test(this.ev.season)) {
				this.extraHousingQuestions = this.rvParkHousingFns;
			}
			this.allowed = function() { // allowed for couples retreats.
				var genA = this.genAllowed();
				if (!this.camper || genA != '' || rpd.pendingCampers.length == 0) {
					return genA;
				}
				// make sure male and female.
				var c1 = rpd.findCamper(rpd.pendingCampers[0]);
				return c1.gender ==
					this.camper.gender ? 'Need Spouse.' : '';
			}
		}
		if (/college.career/i.test(ev.name)) {
			// special-case fee for college career.
			this.fees = function ccFees(idx) {
				let aF = this.rrFees(0); // 'Career' fee in database.
				let c = cbER.camper;
				if (!c) {
					// pay button calculation on actual
					// camper.
					if (rpd.pendingCampers.length &&
						rpd.pendingCampers.length > idx) {
						c = rpd.findCamper(rpd.pendingCampers[idx]);
					}
				}

				if (!c || !/college/i.test(c.age))
					return aF;
				return [aF[0], 75]; // for college student
			}
		}
		if (/summer/i.test(ev.season) && ! /abili/i.test(ev.name)) {
			// summer camps.
			// explorer camp, we ask for buddies, but otherwise
			// we don't ask for housing.
			this.extraHousingQuestions = cbER.summerHousingFns;
			this.tradingPostMoney = 1;
			this.tradingPostMoreMoney = 1;

			// cutoff time to add trading post money normally is
			// 3pm EDT on start day. (1900 UTC time)
			this.tradingPostCutoffTime = rpd.zdt(ev.start_date).getTime() + 19*3600*1000;

			// TESTING TESTING TESTING
			if (/localhost/i.test(location.hostname)) {
				// arbitrary cutoff time
				//this.tradingPostCutoffTime = rpd.zdt(ev.start_date).getTime() + 
				//	(3*24*3600 + 18*3600 + 46*60)*1000;
			}
			// TESTING TESTING TESTING

			// if it is now after the cutoff time then users
			// can't contribute more to trading post.
			if (rpd.adjustedTimeNow() > this.tradingPostCutoffTime) {
				this.tradingPostMoreMoney = 0;
			}
			this.allowed = function() { // allowed for summer camp
				let genA = this.genAllowed();
				if ((genA != '' && !/waitlist/i.test(genA)) ||
						!this.camper) {
					return genA;
				}

				if (!this.camper.age) {
					return 'Please record age.';
				}
				if (rpd.isAdult(this.camper)) {
					return 'Only children.';
				}
				if (!this.camper.age.match(/^(\d{1,2})$/)) {
					return 'Not in school.';
				}
				if (!rpd.sumAgeMatch(this.camper, this.ev)) {
					return 'Wrong Grade.';
				}
				if (!this.camper.prt) {
					return '<a href="#edit/' +
						this.camper.camper_id +
						'">No parent/guardian.</a>';
				}
				// make sure the parent is valid adult.
				let prnt = rpd.findCamper(this.camper.prt);
				if (!prnt) {
					return 'Invalid parent.<BR>(update parent)';
				}
				if (!prnt.age || !/adult|college/i.test(prnt.age)) {
					return 'Invalid parent.<BR>Parent must be adult.';
				}

				// invalid if the event starts after this
				// camper's 18th birthday.
				if (!this.camper.birth_date) {
					return 'No birth date.'
				}
				let b18; // date of 18th birthday
				try {
					b18 = new Date(this.camper.birth_date);
					b18.setFullYear(b18.getFullYear()+18);
				} catch(e) {
					return 'Invalid birth date.'
				}
				if (b18.getTime() <= (new Date(ev.start_date)).getTime()) {
					// This camper's 18th birthday is before the
					// start date of camp this week.
					return 'Too old for this week.';
				}

				// is this person already signed up for another week of summer camp?
				if (rpd.personEvent.some(pe =>
					pe.camper_id == cbER.camper.camper_id &&
					rpd.notCanc(pe) &&
					!pe.wl && /^sum/i.test(pe.campevent_id))) {
					// if signed up for another week we can
					// join the waitlist but otherwise registering
					// for this second week isn't allowed.
					if ('waitlist' != genA) {
						genA = 'Only one week of summer camp allowed.';
					}
				}
				return genA;
			}
		} // end of summer camp setup
		if (_CB.wt && _CB.wt.wtMatch(ev)) {
			_CB.wt.setupER();
		}
	},
	rvParkHousingFns: {
		getFormValue: function gfv(f, newHousing) {
			// get extra housing value from form.
			let nv = newHousing;
			if (/yes/i.test(f.rvyesno.value)) {
				let lengthStr = f.trailerlength.value;
				if ('' != lengthStr) {
					lengthStr = `\nLength: ${f.trailerlength.value} ft`;
				}
				if (rpd.isNoHousing(newHousing)) {
					newHousing = '';
				}
				nv = newHousing + `\nRV Park: Yes\nType: ${f.parktype.value}${lengthStr}`
			}
			return nv;
		},
		loadForm: function lf(f) {
			f.rvyesno.value = 'no';
			if (rpd.pendingHousingInfo.match(/([\s\S]*)(\nRV Park: Yes[\s\S]*)/)) {
				let rvpark = RegExp.$2;
				f.rvyesno.value = 'yes';
				if (!f.housingNone.checked) {
					f.housing.value = RegExp.$1;
					if (!/\S/.test(RegExp.$1)) {
						f.housingNone.checked = true;
						f.housing.value = '';
					}
				}

				if (rvpark.match(/Type: (.*)\n/)) {
					f.parktype.value = RegExp.$1;
				}
				if (rvpark.match(/Length: (\d+)/)) {
					f.trailerlength.value = RegExp.$1;
				}
			}
		},
		showForm: function sf() {
			rpd.unhideEl(rpd.qs('#housingInfoForm .rv-housing-info'));
		},
		formInvalid: function fv(f, bHousingInvalid) {
			let rvParkYes = f.rvyesno.value == 'yes';
			f.parktype.disabled = !rvParkYes;
			f.parktype.required = rvParkYes;
			let wq = rpd.qs('.rv-housing-info .what-question');
			const qnn = 'question-not-needed';
			if (rvParkYes) {
				let lq = rpd.qs('.rv-housing-info .length-question');
				if (/trailer|rv/i.test(f.parktype.value)) {
					lq.classList.remove(qnn);
					f.trailerlength.required = true;
					f.trailerlength.disabled = false;
				} else {
					lq.classList.add(qnn);
					f.trailerlength.required = false;
					f.trailerlength.value = '';
					f.trailerlength.disabled = true;
				}
				wq.classList.remove(qnn);
			} else {
				wq.classList.add(qnn);
				f.parktype.required = false;
				f.parktype.selectedIndex = 0;
				f.trailerlength.required = false;
				f.trailerlength.value = '';
			}
			return rpd.qs('.rv-housing-info *:invalid') || bHousingInvalid;
		}
	},
	immersionHousingFns: { // Immersion Week "housing" questions.
		getFormValue: function gfv(f, newHousing) {
			// get answers to immersion week questions from form.
			// store in JSON as an array.
			return JSON.stringify([
				f.ihq1.value,
				f.ihq2.value
			]);
		},
		getQuestionArray: function(s) {
			let q1 = ['', ''];
			let q = [];
			try {
				q = JSON.parse(s);
			} catch(e) {
				console.log(`getQuestionArray error - ${e.message}`);
			}
			if (Array.isArray(q) && q.length == 2) {
				q1 = q;
			}
			return q1;
		},
		loadForm: function lf(f) {
			let q = this.getQuestionArray(rpd.pendingHousingInfo);

			f.ihq1.value = q[0];
			f.ihq2.value = q[1];
		},
		showForm: function sf() {
			rpd.unhideEl(rpd.qs('#housingInfoForm .immersion-housing'));
			rpd.hideEl(rpd.qs('#housingInfoForm .cb-normal-housing'));
		},
		formInvalid: function fv(f) {
			f.ihq1.required = true;
			f.ihq2.required = true;
			return rpd.qs('.immersion-housing *:invalid');
		},
		housingText: function ht(pe1) {
			let q = this.getQuestionArray(pe1.note_to_camp);
			return `<strong>QUESTIONS</strong><BR>Q1:<BR>${q[0]}<BR><BR>Q2:<BR>${q[1]}`;
		},
		housingTextSummary: function hts(ntc) {
			return '';
		}
	},
	summerHousingFns: { // summer camp "housing" questions.(inc buddy)
		getFormValue: function gfv(f, newHousing) {
			// get answers to summer camp screening questions + buddy from form.
			// store in JSON as an array.
			return JSON.stringify([
				f.sq_q1.value,
				f.sq_q2.value,
				f.buddy1.value,
				f.buddy2.value
			]);
		},
		saveDB: function saveDB(pe1, newHousing, cb) {
			// if there are any yes answers to the screening questions
			// then make sure that is noted in the database.
			let q = this.getQuestionArray(newHousing);

			function cb1() {
				if (cb) {
					cb();
				}
			}

			if (4 != q.length || ! /yes/i.test(q[0]+q[1])) {
				cb1();
				return;
			}
			// update db for screener questions.
			updateDB(
				{ addScreenerRow: JSON.stringify(
					{
						regnum: pe1.regnum,
						q1: q[0],
						q2: q[1]
					})},
				cb1);
		},
		getQuestionArray: function(s) {
			let q1 = ['', '', '', ''];
			let q = [];
			try {
				q = JSON.parse(s);
			} catch(e) {
				console.log(`getQuestionArray error - ${e.message}`);
			}
			if (Array.isArray(q) && q.length == 4) {
				q1 = q;
			}
			return q1;
		},
		loadForm: function lf(f) {
			let q = this.getQuestionArray(rpd.pendingHousingInfo);

			f.sq_q1.value = q[0];
			f.sq_q2.value = q[1];
			f.buddy1.value = q[2];
			f.buddy2.value = q[3];
		},
		showForm: function sf() {
			rpd.hideEl(rpd.qs('#housingInfoForm .cb-housing-buddies'));
			rpd.unhideEl(rpd.qs('#housingInfoForm .cb-summer-questions'));
			rpd.hideEl(rpd.qs('#housingInfoForm .cb-normal-housing'));
			rpd.hideEl(rpd.qs('#housingInfoForm .immersion-housing'));
			if (/explorer/i.test(cbER.ev.name)) {
				rpd.unhideEl(rpd.qs('#housingInfoForm .cb-housing-buddies'));
			} else {
				// don't say "Housing" for the header
				let hh = rpd.qs('h1.housing-header');
				if (hh) {
					hh.innerHTML = 'Health Questions';
				}
			}
			// fill in camper name.
			let firstname = '';
			if (1 == rpd.pendingCampers.length) {
				let c1 = rpd.findCamper(rpd.pendingCampers[0]);
				firstname = c1 ? `<strong>${c1.firstname}</strong>` : '';
			}
			rpd.qsaa('.cb-summer-questions span.camper-firstname-fill')
			.forEach(el => el.innerHTML = firstname);
		},
		formInvalid: function fv(f) {
			// highlight yes/no button div that has no answer.
			rpd.qsaa('.cb-summer-questions div.button-div')
			.forEach(function(d) {
				let b = '#fff4e5';
				if (d.querySelector('input[type="radio"]:checked')) {
					b = 'transparent';
				}
				d.style.backgroundColor = b;
			});

			// invalid unless there are two answered questions.
			let c = rpd.qsaa('.cb-summer-questions input[type="radio"]:checked');
			return 2 != c.length;
		},
		housingText: function ht(pe1) {
			let ntc = pe1.note_to_camp;
			let q = this.getQuestionArray(ntc);
			if (!ntc || '' == q[0]) {
				// maybe there's another entry for this
				// regnum that has answers to the screening/buddy questions.
				let p = rpd.personEvent.find(pe => pe.regnum == pe1.regnum && pe.note_to_camp);
				if (p) {
					ntc = p.note_to_camp;
					q = this.getQuestionArray(ntc);
				}
			}
			let buds = '';
			if ('' != q[2] || '' != q[3]) {
				// buddies
				buds = `<BR>Buddies:<BR>${q[2]} ${q[3]}`;
			}
			return `Questions:<BR>Q1: ${q[0]}&nbsp;&nbsp;Q2: ${q[1]}${buds}`;
		},
		housingTextSummary: function hts(ntc) {
			let q = this.getQuestionArray(ntc);
			let rv = '';
			if (rpd.userIsAdmin) {
				if (/yes/i.test(q[0])) {
					rv += 'Q1YES ';
				}
				if (/yes/i.test(q[1])) {
					rv += 'Q2YES';
				}
			}
			return rv;
		}
	}

}

// ** EVENT RULES & fees (end)
/*global _CB:true,rpd:true,
loadTemplate:true,resetViewToDefault:true,
incompletePackage:true,
getFullPackage:true,
personName:true,
setInvalidField:true,
xxSetupValidation:true,
doViewRegistration:true,
loadSelectFromArray:true,
loginAs:true,
impersonating:true,
recordExpectedPayment:true,
unpaidPaymentDetails:true,
cancelUnpaidPayment:true,
popAlert:true,
cbER:true,
updateDB:true,
popConfirm:true,
evDateRange:true,download:true */
"use strict";

/* reports */
function displayReportsPage()
{
	function mb(v) { // make a button
		return `<input type="button" value="${v}" class="m-1" style="padding: 0 4px" />`;
	}
	if (!rpd.userIsAdmin) {
		resetViewToDefault();
		return;
	}
	setupregmainAdmin();
	rpd.qs('.thelist').innerHTML = [
		mb('CampDocs'),
		mb('Deposit Activity'),
		'<input type="date" name="b_act_date" style="padding: 0 4px" title="Begin Date" /> - ',
		'<input type="date" name="e_act_date" style="padding: 0 4px" title="End Date" /><BR>',
		...['CheckIn', 'CheckIn-Summer', 'QScreen-Summer', 'Housing', 'Not Fully Paid',
		'Camper Addresses', 'Summer Churches',
		'WT Summary'].map(mb),
		'<div id="theoutput"></div>'
	].join('');
	rpd.sqs('#regnav + h1', 'Reports');
	let dInput1 = rpd.qin('b_act_date');
	let d = new Date();
	
	dInput1.valueAsDate = d;
	let dInput2 = rpd.qin('e_act_date');
	d.setMonth(d.getMonth() + 1);
	dInput2.valueAsDate = d;

	// a is array of arrays for the cells of the table.
	// new version for XLS (HTML TABLE method)
	function spread(a, hRow, sName)
	{
		if (!sName) {
			sName = 'noname';
		}
		a.unshift(hRow.split(','));
		let outs = a.map(function(ar) {
			return '<TR>' + ar.map(r => `<td>${r}</td>`).join('') +
				'</TR>'
		}).join('')

		rpd.qs('#theoutput').innerHTML =
			'<input type="button" value="Download" />' +
			` (${a.length-1} Rows)<BR>` +
			`<table class="dltbl mt-2">${outs}</table>`;
		rpd.bclk(['Download', function() {
			download(rpd.xlsHEADER + outs + rpd.xlsFOOTER,
				sName + '-' +
				JSON.stringify(new Date()).substring(1,11) +
				'.xls', 'text/plain');
		}]);
	}

	// updated Dec 2021 per instructions from Jim. added explorer camp
	function campdocs()
	{
		function cProgram(ce) { // figure out 'Program'
			if (!ce) {
				return '?';
			}
			if (ce.age.match(/^[34]/)) {
				if (/explorer/i.test(ce.name)) {
					// distinguishing explorer 1 vs 2
					// hardcoded to start date.
					return 'Explorer ' +
						(/06-27/i.test(ce.start_date) ? '1' : '2');
				}
				return "Junior";
			}
			if (ce.age == '7-9') {
				return "Junior High";
			}
			if (ce.age == '6-8') {
				return 'Middle School';
			}
			return 'Senior High';
		}

		// what is parent/account email for this camper?
		function gemail(c) {
			// first choice is parent email.
			if (c.prt) {
				// lookup parent's email.
				let p = rpd.findCamper(c.prt);
				if (p && /@/.test(p.email)) {
					return p.email;
				}
			}
			// next choice is account email.
			let w = rpd.findWLID(c.weblogin_id);
			if (w && /@/.test(w.email)) {
				return w.email;
			}
			return 'info@campbarakel.org';
		}

		let yearL1 = rpd.sw1.getUTCFullYear();
		spread(rpd.personEvent.filter(pe =>
			/^sum/i.test(pe.campevent_id) &&
			rpd.notWLCanc(pe)
		).map(function(pe) {
			let c = rpd.findCamper(pe.camper_id);
			let ce = rpd.findCE(pe.campevent_id);

			return [
				c.firstname,
				c.middlename,
				c.lastname,
				c.birth_date.substring(0,10),
				/girl/i.test(c.gender) ? 'Female' : 'Male',
				gemail(c),
				'',
				yearL1, // Group L1 - year
				'Week ' + (ce ? rpd.wwk(ce.start_date) : '?'),
				cProgram(ce), // Group L3

			]
		}), '&lt;Profile&gt; First Name,&lt;Profile&gt; Middle Name,' +
			'&lt;Profile&gt; Last Name,&lt;Profile&gt; Date of Birth,' +
			'&lt;Profile&gt; Sex,' +
			'&lt;User&gt; Emails 1,&lt;User&gt; Emails 2,' +
			'&lt;Group&gt; L1,&lt;Group&gt; L2,&lt;Group&gt; L3',
		'campdocs-barakel');
	}

	function housing(cid)
	{
		// date the event begins.
		let bd = false;
		let ce = rpd.findCE(cid);
		if (ce) {
			bd = rpd.zdt(ce.start_date);
		}
		// get people associated with this event.
		let bIncludeGender = !ce.gender;
		var c = rpd.personEvent
			.filter(rpd.filterCID(cid))
			.filter(rpd.notWLCanc)
			.map(function(c) {
				var cp = rpd.findCamper(c.camper_id);
				var name='unknown', chrch='',hNote='',grade='',age='',city='';
				if (cp){
					name = `${cp.lastname}, ${cp.firstname}`;
					chrch = cp.churchname ? cp.churchname : '';
					hNote = c.note_to_camp &&
						!/^none. i hav/i.test(c.note_to_camp) ?
						c.note_to_camp : '';
					grade = cp.age || '';
					if (bd && cp.birth_date && !/^000/.test(cp.birth_date)) {
						age = (_CB.dateDiffDays(cp.birth_date, bd)/365).toFixed(1);
					}

					if (cp.address) {
						var adr = rpd.findAddress(cp.address, c.weblogin_id);
						city = adr && adr.city ? adr.city : '';
					}
				}

				if (bIncludeGender) {
					return [c.weblogin_id,c.regnum,name,cp.gender,hNote,chrch,grade,age,city];
				} else {
					return [c.weblogin_id,c.regnum,name,hNote,chrch,grade,age,city];					
				}

			});
		if (!c.length)
			return;

		let genderStr = bIncludeGender ? ',Gender' : '';
		spread(c, `wl,regnum,Name${genderStr},Housing,Church,Grade,Age,City`, `housing-${cid}`);
	}

	// find cid-data from this element or its parent.
	function cidSelected(ev, fn)
	{
		let cid = ev.target.closest('span[cid-data]');
		if (cid) {
			cid = cid.getAttribute('cid-data');
			fn(cid);
		}
	}

	// get registration / first payment date
	// for personevent c.
	function getRegDate(c) {
		// find the first payment.
		let p1 = rpd.payments
			.find(rpd.onereg(c.regnum, c.weblogin_id));

		return p1 ? rpd.shrtDate(p1.timestamp, true) : '';
	}

	// user clicked an event that they want to choose.
	function checkIn(cid)
	{
		// checkin info on registrations that are associated with this event.
		let c = rpd.personEvent
			.filter(rpd.filterCID(cid))
			.filter(rpd.notCanc)
			.filter(rpd.filter1)
			.map(function(c) {
				let cp = rpd.findCamper(c.camper_id);
				let name = cp ? `${cp.lastname}, ${cp.firstname}` : 'unknown';
				let pear = rpd.filterReg(c.regnum, c.weblogin_id)
				let rps = rpd.rpstats(pear);

				return [c.weblogin_id,getRegDate(c),c.regnum,name,
					pear.length,c.wl,rps.balance,rps.paid,rps.total];
			});
		if (!c.length)
			return;

		spread(c, 'wl,regdate,regnum,name,count,wait,balance,paid,total', `checkIn-${cid}`);
	}

	// user clicked 'CheckIn' or 'Housing' button.
	function chooseEvent(fn)
	{
		// choose event from those that have registered campers
		let evList = rpd.events
				.filter(c => rpd.eventCount(c.campevent_id) > 0)
				.map(function(c) {
					return `<span cid-data="${c.campevent_id}">
					${rpd.ceNameDate(c)} - (${rpd.eventCount(c.campevent_id)})</span>`;
				});
		if (evList.length == 0) {
			_CB.setHTML('theoutput', 'No events in the near future.');
			return;
		}
		_CB.setHTML('theoutput', 'Choose event:<BR>' +
			evList.join('<BR>'));
		_CB.qsafn('span[cid-data]', function(el) {
			el.onclick = function(ev) {
				cidSelected(ev, fn);
			};
		});
	}

	// Get 2 Date objects from the input dates
	// on the page.
	function get2Dates() {
		let dpd = dInput1.valueAsDate;
		let dped = dInput2.valueAsDate;
		dped.setUTCDate(dped.getUTCDate() + 1);
		return [dpd, dped];
	}

	// deposit activity as requested by Marilyn.
	function activityReport()
	{
		if (incompletePackage()) {
			getFullPackage(activityReport);
			return;
		}
		let [dpd, dped] = get2Dates();
		spread(rpd.payments.filter(function(p) {
			let lud = rpd.zdt(p.timestamp);
			return p.mc_gross != 0 &&
				lud > dpd && lud < dped;
		})
		.map(function(p) {
			// lookup camper.
			let wlobj = rpd.findWLID(p.weblogin_id);
			let camperName = 'unknown';
			if (wlobj) {
				camperName += ` (${wlobj.email})`;
			}
			if (p.regnum > 0) {
				let pe = rpd.filterReg(p.regnum, p.weblogin_id);
				if (pe.length) {
					camperName = personName(pe[0].camper_id, true);
				}				
			} else {
				// donation - name in payment details.
				let ci = rpd.paymentDetails.find(pd => pd.c &&
					2 == pd.t && p.regnum == pd.r && pd.ci)?.ci;
				if (ci) {
					camperName = 'Donor: ' + personName(ci, true);
				} else {
					camperName += ' donation';
				}
			}
			
			return [
				rpd.shrtDT(p.timestamp),
				p.regnum,
				wlobj?.cc || '',
				p.mc_gross,
				paypalTXNID(p) || 'office',
				camperName
			];
		}),'regdate,rn,cc,paid,txn,person','activity-report');
	}

	function delinquent()
	{
		let df = filterD1D2();

		// produce report of registrations that are not
		// fully paid.
		var c = rpd.personEvent
			.filter(rpd.filter1)
			.filter(rpd.notWLCanc)
			.filter(df)
			.map(function(c) {
				var ce = rpd.findCE(c.campevent_id);
				var cp = rpd.findCamper(c.camper_id);
				var name = cp ? `${cp.lastname}, ${cp.firstname}` : 'unknown';
				var pear = rpd.filterReg(c.regnum, c.weblogin_id)
				var rps = rpd.rpstats(pear);
				let ip = 'N';
				if (pear.length) {
					// would be yes if this is paypal payment.
					ip = 'Y';
					let pmts = rpd.payments.filter(
						rpd.onereg(c.regnum, c.weblogin_id))
						.filter(p => /paypal/i.test(p.remarks))
					if (!pmts.length) {
						// no paypal payments means
						// there could be no installment
						// plan.
						ip = 'N';
					}
				}

				return [c.weblogin_id,c.regnum,name,pear.length,
					rps.balance,rps.paid,rps.total,ip,
					rpd.ceNameDate(ce, true),
					rpd.findWLID(c.weblogin_id).email];
			})
			.filter(c => c[4] > 0)

		const drS = filterDRStr();
		if (!c.length) {
			_CB.setHTML('theoutput', 'No registrations with balance due! ' + drS);
			return;
		}

		c.sort(function(a,b) {
			return a[0] - b[0]
		})

		spread(c,
			'wl,regnum,name,count,balance,paid,total,pp,evt,email',
			'delinq');
		_CB.ge('theoutput').insertAdjacentHTML('afterbegin',
			`Balance Due: ${drS}<BR>`)
	}

	function summerChurches()
	{
		// registrations for summer.
		let spe = rpd.personEvent.filter(v => /^sum/.test(v.campevent_id));
		// people in summer campevents.
		let c = rpd.campers.filter(c =>
			spe.some(v => v.camper_id == c.camper_id))
			.map(function(c) {
				let cp = rpd.findCamper(c.camper_id);
				let ad = rpd.findAddress(c.address, c.weblogin_id);
				let city = ad ? ad.city || '' : '';
				let state = ad ? ad.state || '' : '';
				return [
					cp.weblogin_id,
					cp.camper_id,
					cp.lastname,
					cp.firstname,
					`"${city}"`,
					state,
					`"${cp.churchname}"`
				]
			});
		if (!c.length) {
			_CB.setHTML('theoutput', 'no summer campers?');
			return;
		}
		spread(c, 'wlid,cid,lastname,firstname,city,state,churchname', 'SummerChurches');
		_CB.ge('theoutput').insertAdjacentHTML('afterbegin',
			'<BR>Summer Camp Churches<BR>');
	}

	// Display the Camper Addresses report.
	// This lists campers going to events between the start
	// and end dates.
	function camperAddresses()
	{
		let df = filterD1D2();
		const drs = filterDRStr();
		let c = rpd.personEvent
			.filter(df)
			.map(function(c) {
				const endt = rpd.ceNameDate(c.campevent_id, true);
				let cp = rpd.findCamper(c.camper_id);
				if (!cp) {
					return [endt,
					'',
					'',
					'',
					`unknown c: ${c.camper_id} wl: ${c.weblogin_id}`]
				}
				let wl = rpd.findWLID(c.weblogin_id);
				let ad = rpd.findAddress(cp.address, cp.weblogin_id);

				return [endt,
					/\@/.test(wl.email) ? wl.email : '',
					/\@/.test(cp.email) ? cp.email : '',
					getRegDate(c),
					cp.gender,
					cp.lastname,
					cp.firstname,
					ad ? ad.street : '',
					ad ? ad.city : '',
					ad ? ad.state : '',
					ad ? ad.zipcode : ''
					];
			});
		if (!c.length) {
			_CB.setHTML('theoutput', 'No matches. ' + drs);
			return;
		}

		spread(c, 'program,em1,em2,regdate,gender,last,' +
			'first,street,city,state,zip');
		_CB.ge('theoutput').insertAdjacentHTML('afterbegin',
			`<BR>Camper Addresses: ${drs}<BR>`)
	}

	// return string for the date range.
	function filterDRStr()
	{
		var [dpd, dped] = get2Dates();
		dped.setUTCDate(dped.getUTCDate() - 1);
		return evDateRange(dpd, dped);
	}

	// filter based on the dates in the input
	function filterD1D2()
	{
		let [dpd, dped] = get2Dates();
		dpd.setUTCDate(dpd.getUTCDate() - 1);

		// return a predicate for filtering on the
		// dates assuming the parameter is a personEvent.
		return function(c) {
			var ce = rpd.findCE(c.campevent_id);
			if (!ce) {
				return false; // no campevent_id.
			}
			var std = rpd.zdt(ce.start_date);
			if (std < dpd || std > dped) {
				// not in date range.
				return false;
			}
			return true;
		}
	}

	// show summer campers that have one or two
	// yes answers to the screening questions.
	function qscreenSummer()
	{
		let c = rpd.personEvent
			.filter(rpd.notCanc)
			.filter(pe => /^sum/i.test(pe.campevent_id))
			.filter(function(pe) {
				let q = cbER.summerHousingFns.getQuestionArray(pe.note_to_camp);
				return 4 == q.length &&
					/yes/i.test(q[0]+q[1]);
			})
			.map(function(pe) {
				let cp = rpd.findCamper(pe.camper_id);
				let q = cbER.summerHousingFns.getQuestionArray(pe.note_to_camp);
				return [
					rpd.ceNameDate(pe.campevent_id),
					cp?.gender,
					cp?.lastname,
					cp?.firstname,
					`${q[0]} ${q[1]}`,
					pe.regnum
				];
			});
		if (!c.length) {
			_CB.setHTML('theoutput', 'No matches for Yes answers. ');
			return;
		}
		spread(c, 'program,gender,last,first,Qs,rn');
		_CB.ge('theoutput').insertAdjacentHTML('afterbegin',
			`Summer Question Screen:<BR>`)
	}

	// program, gender, last, first - driven by date.
	function checkInSummer()
	{
		let df = filterD1D2();
		const drs = filterDRStr();
		let c = rpd.personEvent
			.filter(rpd.notWLCanc)
			.filter(df)
			.map(function(c) {
				let cp = rpd.findCamper(c.camper_id);
				return [rpd.ceNameDate(c.campevent_id, true),
					cp?.gender,
					cp?.lastname,
					cp?.firstname
					];
			});
		if (!c.length) {
			_CB.setHTML('theoutput', 'No matches. ' + drs);
			return;
		}

		spread(c, 'program,gender,last,first');
		_CB.ge('theoutput').insertAdjacentHTML('afterbegin',
			`Summer Check-In: ${drs}<BR>`)

	}

	// choose the winter teen event (or all WT)
	// for the winter teen summary report
	function chooseWTEvent() {
		// choose from winter teen events that have
		// registered campers or All-WT
		let evList = rpd.events
			.filter(_CB.wt.wtMatch)
			.filter(c => rpd.eventCount(c.campevent_id) > 0)
			.map(function(c) {
				return `&nbsp;<span cid-data="${c.campevent_id}">
				${rpd.ceNameDate(c)} - (${rpd.eventCount(c.campevent_id)})</span>`;
			});
		if (evList.length == 0) {
			_CB.setHTML('theoutput', 'No WT events in the near future.');
			return;
		}
		evList.push('&nbsp;<span cid-data="All-WT-Events"> ALL WT Events</span>');
		_CB.setHTML('theoutput', '<strong><BR>Choose Winter Teen event:</strong><BR>' +
			evList.join('<BR>'));
		_CB.qsafn('span[cid-data]', function(el) {
			el.onclick = function(ev) {
				cidSelected(ev, wtSummary);
			};
		});
	}

	// Summary report of winter teen groups.
	function wtSummary(cid) {
		let ev = rpd.findCE(cid);
		let c = rpd.personEvent
			.filter(rpd.filter1)
			.filter(rpd.notCanc);
		let summaryheader = '';
		if (_CB.wt.wtMatch(ev)) {
			// single winter teen event
			c = c.filter(rpd.filterCID(cid));
			summaryheader = `${ev.name} ${rpd.dr(ev)}`;
		} else {
			if (!/all-wt-events/i.test(cid)) {
				_CB.setHTML('theoutput', `<p>Not Winter Teen event. - ${cid}</p>`);
				return;
			}

			// all winter teen events sorted by event date
			let evlist = rpd.events
				.filter(_CB.wt.wtMatch)
				.filter(c => rpd.eventCount(c.campevent_id) > 0)
				.map(c => c.campevent_id);
			let sortedoutput = [];
			evlist.forEach(function(cid) {
				sortedoutput = sortedoutput.concat(
					c.filter(rpd.filterCID(cid))
				);
			});
			c = sortedoutput;
			summaryheader = 'All Winter Teen Events';
		}
		c = c.map(_CB.wt.wtSummary)
		spread(c, _CB.wt.wtSummaryFields, `wt-${cid}`);
		_CB.ge('theoutput').insertAdjacentHTML('afterbegin',
			`<BR>Winter Teen Summary: ${summaryheader} <BR>`)
	}

	[['CampDocs', campdocs],
	['Deposit Activity', activityReport],
	['CheckIn', function() { chooseEvent(checkIn) } ],
	['CheckIn-Summer', checkInSummer ],
	['QScreen-Summer', qscreenSummer ],
	['Housing', function() { chooseEvent(housing) }],
	['Not Fully Paid', delinquent],
	['Camper Addresses', camperAddresses],
	['Summer Churches', summerChurches],
	['WT Summary', chooseWTEvent]
	]
	.forEach(rpd.bclk);
} // displayReportsPage()

// show form to choose Effective User
// or choose an existing account.
function chooseEffectiveUser()
{
	// search accounts for people, display in cuEUList.
	function searchAccounts()
	{
		var eul = _CB.ge('cuEUList');
		rpd.clearHTML(eul);

		var val = rpd.qs('#namesearch').value.trim();
		var valt = new RegExp(val, 'i');

		// which search function?
		var sf;
		if (rpd.qs('#rpp:checked') ) { // search name.
			sf = function(u) { return valt.test(u.firstname + ' ' + u.lastname); }
		}
		if (rpd.qs('#rid:checked')) {
			sf = function(u) { return val == u.weblogin_id; }
		}
		if (rpd.qs('#rcc:checked')) { // search cardcode
			sf = function(u) {
				// weblogin cardcode.
				var wl = rpd.findWLID(u.weblogin_id);
				return wl && valt.test(wl.cc);
			}
		}
		if (rpd.qs('#wemail:checked')) { // search email
			sf = function(u) {
				// weblogin email.
				if (u.email && valt.test(u.email))
					return true;
				var wl = rpd.findWLID(u.weblogin_id);
				return wl && valt.test(wl.email);
			}
		}

		eul.innerHTML = eul.showPeople(sf);
	} // searchAccounts

	if (!rpd.email || !rpd.userIsAdmin) {
		resetViewToDefault();
		return;
	}

	if (incompletePackage()) {
		getFullPackage(chooseEffectiveUser);
		return;
	}

	loadTemplate('ceu');

	// disable 'Self' if user is not impersonating anyone.
	if (!impersonating()) {
		rpd.qbv('Self').disabled = true;
	}

	// return HTML for people that pass the filter function ff.
	var showPeople = function(ff) {
		// look up address.
		var adrLookup = function adrLookup(a, id) {
			if (!a || !id) {
				return a || '';
			}
			var ad = rpd.findAddress(a, id);
			return ad ? ad.street + ' ' + ad.city : a;
		}

		// filter on whether this camper has any
		// registrations, if the 'regonly' checkbox is checked.
		var regFilter = function regFilter() {
			if (rpd.qs('#regonly:checked')) {
				return (function(c) {
					// does this camper have any regs?
					return rpd.personEvent.some(function(pe) {
						return pe.camper_id == c.camper_id;
					})
				})
			}
			return (function() { return true });
		}

		var registrations = function registrations(camper_id) {
			return rpd.personEvent
				.filter(
					function(pe) { return pe.camper_id == camper_id })
				.map(
					function(pe) {
						let cStat = rpd.notCanc(pe) ? '' : ' <strong>CANCELLED</strong> ';
						return '<span class="reg" data-reg="' +
							pe.regnum + '">' +
							pe.regnum + cStat + ' ' + rpd.ceNameDate(pe.campevent_id) +
						 	'</span>'}
				).join('');
		}

		let emailSearch = rpd.qs('#wemail:checked') ? true : false;

		function personEmail(c) {
			if (!emailSearch)
				return '';
			let w = rpd.findWLID(c.weblogin_id);
			return (c.email ? c.email + ' ' : '') +
				w.email ? w.email + ' ' : '';
		}

		function oneCamper(c) {
			return '<div class="n" data-wl="' +
				c.weblogin_id + '">' + c.weblogin_id + ': ' +
				personName(c.camper_id) + ' -- ' +
				personEmail(c) +
				adrLookup(c.address, c.weblogin_id) +
				registrations(c.camper_id) +
				'</div>';
		}

		let camperList = rpd.campers.filter(ff).filter(regFilter());
		if (camperList.length > 0) {
			return camperList
				.map(oneCamper).join('');
		}

		// special case of searching for email.  We can search weblogin_id's.
		if (emailSearch) {
			let val = rpd.qs('#namesearch').value.trim();
			let valt = new RegExp(val, 'i');

			let wlist = rpd.weblogin
				.filter(wl => valt.test(wl.email));
			if (wlist.length > 0) {
				return wlist
					.map(wl => `<div class="n" data-wl="${wl.weblogin_id}">
${wl.weblogin_id} ${wl.email}</div>`)
					.join('');
			}

		}
		return '<div>No match found</div>';
	} // showPeople

	var eul = _CB.ge('cuEUList');
	eul.showPeople = showPeople;
	[ ['Self', chooseSelf], ['Choose', chooseExistingGo ],
		['New', function() { location.hash = '#newact' } ],
		['List Accounts', listAccounts], ['Search', searchAccounts ]
	].forEach(rpd.bclk);

	rpd.qs('#namesearch').addEventListener('keyup',
		function (e) {
			if (e.keyCode == 13) {
				searchAccounts();
				e.stopPropagation();
			}
	});
	eul.addEventListener('click',
		function(e) {
			var cl = e.target.classList;

			if (cl.contains('reg')) {
				// go to this registration.
				doViewRegistration(e.target.getAttribute('data-reg'),
					e.target.parentNode.getAttribute('data-wl'));
				return;
			}
			if (cl.contains('n')) {
				rpd.qs('#rid').checked = 'checked';
				rpd.qs('#namesearch').value =
					e.target.getAttribute('data-wl');
				chooseExistingGo();
			}
		});
	rpd.qs('#regonly').addEventListener('change',
		function() {
			if (rpd.qs('#rpp:checked') &&
				rpd.qs('#namesearch').value != '') {
					// redo the page with the
					// new value for regonly.
					searchAccounts();
			}
		}
	)
}


// choose the weblogin_id from #namesearch
function chooseExistingGo()
{
	var val = rpd.qs('#namesearch').value.trim();
	if (! /^\d{1,8}$/.test(val)) {
		rpd.popAlert('invalid weblogin_id');
		return;
	}
	// pseudo login as this weblogin_id.
	loginAs(val);
}


// let admin choose their own account.  no longer impersonating.
function chooseSelf()
{
	loginAs(rpd.weblogin_id);
}

// display new accounts
function listAccounts()
{
	let eul = _CB.ge('cuEUList');
	rpd.qs('#namesearch').value = '';
	rpd.clearHTML(eul);

	// sort by weblogin_id (descending)
	rpd.weblogin.sort(function(a,b) {
		return b.weblogin_id - a.weblogin_id;
	});

	var count = 0;
	eul.innerHTML = rpd.weblogin.filter(function() {
		return ++count < 40;
	}).map(function(w) {
		return '<div class="n" data-wl="' + w.weblogin_id +
			'">' + w.weblogin_id + '--' + w.email + ' -- ' +
			rpd.campers.filter(function(c) {
				return c.weblogin_id == w.weblogin_id;
			}).length +
			eul.showPeople(function(c){
				return c.weblogin_id == w.weblogin_id }) +
			'</div>'
	}).join('');
}

function sendMassEmail(peList,
	notificationProcessName, allDoneCB)
{
	if (!rpd.regAdmin() || !peList.length) {
		resetViewToDefault();
		return;
	}

	function confirmed() {
		updateDB( { sendMassEmail: JSON.stringify({
			npn: notificationProcessName,
			peList,
		})}, function(d) {
			if (rpd.notOKFail(d)) {
				return;
			}
			if (allDoneCB) {
				allDoneCB();
			}
		});
	}

	popConfirm(`Are you sure you want to send 
		these ${peList.length} "${notificationProcessName}"
		emails?`,
		confirmed);
}

// edit earlybird count rows
function earlybirdEdit() {
	if (!rpd.userIsAdmin) {
		resetViewToDefault();
		return;
	}
	setupregmainAdmin();
	const ebfields = [ 'eb_id', 'year', 'event_type', 'group_name', 'start_count', 'count', 'url']
	rpd.qs('.thelist').innerHTML =
	`<h1>Earlybird Rows</h1><HR>
	<p>For Winter Teen, counts count registrations,<BR>
	For all other events, counts count people.</p>
	<div style="margin-bottom: 6rem" id="ctbldiv"></div>`;

	function renderctbl() {
		let d = rpd.qs('#ctbldiv');
		if (d) {
			d.innerHTML = `<button class="addrow">Add Row+</button><BR><BR>
			<table id="cTblID" class="ebedittable">` +
			'<TR>' + ebfields.map(f => `<th style="text-align:center">${f}</th>`).join('') + '<th></th><th></th></TR>' +
			rpd.eb.map(e => `<tr data-ebid="${e.eb_id}">` +
				ebfields.map(f => `<td data-fieldname="${f}"><p>${e[f]}</p></td>`).join('') +
				`<td class="ebbuttons"><p><button class="editbutton">Edit</button> <button>Delete</button></td>
				<td><p>` +
				rpd.personEvent.filter(pe => pe.eb_id == e.eb_id)
					.filter(rpd.filter1)
					.filter(rpd.notCanc)
					.map(function(pe) {
						let pear = rpd.filterReg(pe.regnum, pe.weblogin_id)
							.filter(rpd.notCanc);
						let countTag = pear.length > 1 ? ` - ${pear.length}` : '';
						let c1 = rpd.findCamper(pe.camper_id);
						if (c1 && /winter teen/i.test(e.event_type) && c1.churchname) {
							countTag = ` - ${c1.churchname}${countTag}`;
						}
						return `<a title="${personName(c1, true)}${countTag}" href="/register#viewreg/${pe.regnum}">${pe.regnum}</a>`
					})
					.join(' ') +
				`</p></tr>`)
			.join('') +
			`</table>`
		}

		// set up edit and delete buttons for the rows
		rpd.qsaa('#cTblID .ebbuttons button').forEach(function(el) {
			if (/edit/i.test(el.innerHTML)) {
				el.onclick = ebeditbuttonclick;
			} else {
				// if there are registrations used from this earlybird row
				// then we can't delete the row.
				let tr = el.closest('tr[data-ebid]');
				if (tr) {
					let r1 = rpd.eb.find(e => e.eb_id == tr.dataset.ebid);
					if (r1 && r1.count != r1.start_count) {
						el.disabled = true;
						return;
					}
				}
				el.onclick = ebdelbuttonclick;
			}
		});
		// add row button
		let bAddRow = rpd.qs('.thelist button.addrow');
		bAddRow.onclick = function addrow() {
			bAddRow.disabled = true;

			// add a row at the top of the table.
			rpd.qs('#cTblID tr').insertAdjacentHTML('afterend', `<TR data-ebid="-1" class="newrow">` +
				ebfields.map(f => `<td data-fieldname="${f}"></td>`).join('') +
				`<td class="ebbuttons"><p><button class="editbutton">Edit</button></p></td>
				<td></td>
				</TR>`);
			let ebtn = rpd.qs('.newrow .editbutton');
			ebtn.onclick = ebeditbuttonclick;
			ebtn.click();
		}
	}

	renderctbl();
	window.setTimeout(function() {
		rpd.smoothScrollCenter(rpd.qs('#cTblID'));
	}, 50);



	const rlset = "ABCDEFGHJKLMNPQRSTUVWXYZ23456789";

	// user clicked the edit/cancel button for a row.
	function ebeditbuttonclick(e) {

		function removeSaveButton() {
			let bSaveBtn = rpd.qs('.editebrow .savebutton');
			if (bSaveBtn) {
				bSaveBtn.remove();
			}
		}

		function createRandomString() {
			let rv = '';
			const array = new Uint8Array(8);
			self.crypto.getRandomValues(array);
			for (let i=0; i<8; i++) {
				rv += rlset[Math.floor(array[i] * rlset.length / 256)];
			}
			return rv;
		}

		let tr = e.target.closest('tr');
		if (!tr) {
			console.log(`no tr`);
			return;
		}
		let eb_id = tr.dataset.ebid;
		let er; // the rpd.eb row of interest.
		if (-1 == eb_id) {
			// this is a new entry in the table.
			er = { eb_id: -1,
				event_type: null,
				group_name: null,
				year: rpd.currentYearNow,
				start_count: 1,
				count: 1,
				url: createRandomString()
			}
		} else {
			er = rpd.eb.find(e1 => e1.eb_id == eb_id);
			if (!er) {
				console.log(`no er for ${eb_id}?`);
				return;
			}
		}

		function cancelOpenEdit() {
			let tr = rpd.qs('tr.editebrow');
			if (!tr) {
				return;
			}
			// already editing this row, we are done.
			let ebtn = tr.querySelector('button.editbutton');
			if (ebtn) {
				ebtn.innerHTML = 'Edit';
			}
			removeSaveButton(); // if there is a save button remove it.
			tr.classList.remove('editebrow');
			let cancel_ebid = tr.dataset.ebid;
			if (-1 == cancel_ebid) {
				// this was an add row so we just remove the row entirely
				tr.remove();
				rpd.qs('.thelist button.addrow').disabled = false;
			} else {
				let erc = rpd.eb.find(e1 => e1.eb_id == cancel_ebid);
				if (erc) {
					// put the fields back to display-only, displaying the data for this row.
					tr.querySelectorAll('td[data-fieldname]').forEach(function(el) {
						el.innerHTML = `<p>${erc[el.dataset.fieldname]}</p>`;
						el.classList.remove('changed');
					});
				}
			}
		}

		if (tr.classList.contains('editebrow')) {
			// cancel the open edit on this row.
			cancelOpenEdit();
		} else {
			// start editing the earlybird row.
			// make all the other rows display only.
			cancelOpenEdit();
			tr.classList.add('editebrow');
			e.target.innerHTML = 'Cancel';

			// set up the appropriate cells/fields as editable.
			rpd.qsaa('.editebrow td[data-fieldname').forEach(function(el, i) {
				let fn = el.dataset.fieldname;
				if ('event_type' == fn) {
					// options for the event type come from all the event types in use
					// by the campevents.
					el.innerHTML = '<p><select>' +
						[... new Set(rpd.events.map(e => e.event_type))].map(function(et){
							let s = er.event_type == et ? 'selected' : '';
							return `<option ${s}>${et}</option>`
						} )
						.join('') +
						'</select></p>'
				}
				if ('group_name' == fn) {
					el.innerHTML = `<p><input type="text" value="${er.group_name}"></p>`;
				}
				if (/year|start_count/i.test(fn)) {
					let min=1, max=400;
					if ('year' == fn) {
						min = rpd.currentYearNow;
						max = min+2;
					}
					el.innerHTML = `<p><input type="number"
						min="${min}" max="${max}" step="1"
						style="width:4.5rem" value="${er[fn]}"></p>`;
				}

			});

			// set up events for catching the changes
			rpd.qsaa('.editebrow :is(input,select)').forEach(function(el) {
				if ('INPUT' == el.tagName) {
					el.oninput = ebinputchange;
				} else {
					el.onchange = ebinputchange;
				}
			});

			// user has changed a value on the earlybird row
			function ebinputchange(e) {
				let td = e.target.closest('td');
				let fn = td.dataset.fieldname;
				// is the new value now different from the database?
				if (e.target.value == er[fn]) {
					td.classList.remove('changed');
				} else {
					td.classList.add('changed');
				}

				// if there are any changed fields, we want a Save button.
				// no changed fields, no Save button.
				let bSaveBtn = rpd.qs('.editebrow .savebutton');
				let bAnyChanged = rpd.qs('.editebrow td.changed');
				if (bSaveBtn && !bAnyChanged) {
					// delete the save button, nothing has changed.
					removeSaveButton();
				}
				if (!bSaveBtn && bAnyChanged) {
					// add the save button
					rpd.qs('.editebrow td.ebbuttons p').insertAdjacentHTML('beforeend',
						'<button style="margin-left:0.25rem" class="savebutton">Save</button>');
					rpd.qs('.editebrow button.savebutton').onclick = function() {
						// send update to server and update our database, then redraw the row.
						let ebsaveparms = Object.assign({}, er);
						rpd.qsaa('.editebrow td[data-fieldname]').forEach(function(tdel) {
							let insel = tdel.querySelector('input,select');
							if (insel) {
								ebsaveparms[tdel.dataset.fieldname] = insel.value;
							}
						});
						updateDB( {ebrowSave: JSON.stringify(ebsaveparms) },
						function(d) {
							let r = false;
							try {
								r = JSON.parse(d);
							} catch (e) {
								popAlert(d, 'Error');
								return;
							}
							if (r.length) {
								// update database with new values.
								Object.assign(er, r[0]);
							}
							if (-1 == ebsaveparms.eb_id) {
								// need to save the new row in rpd.eb
								rpd.eb.push(er);
								renderctbl();
								return;
							}
							// we are done editing this row. click the cancel button
							// to get the UI back to the right state.
							rpd.qs('#cTblID button.editbutton').click();
						}
						);
					}
				}
			}
		}

	}

	function ebdelbuttonclick(e) {
		let tr = e.target.closest('tr');
		if (!tr) {
			console.log(`no tr`);
			return;
		}
		let eb_id = tr.dataset.ebid;
		let erIndex = rpd.eb.findIndex(e1 => e1.eb_id == eb_id);
		if (-1 == erIndex) {
			console.log(`eb_id ${eb_id} not found`);
			return;
		}
		let er = rpd.eb[erIndex]; // the rpd.eb row of interest.

		popConfirm(`Are you sure you want to delete this row ${eb_id}? `,
			delbuttonconfirmed);
		
		function delbuttonconfirmed() {
			// send delete request to server and update our database, then redraw the row.
			let ebsaveparms = Object.assign({}, er);
			ebsaveparms.event_type = 'delete';
			ebsaveparms.group_name = 'delete';
			updateDB( {ebrowSave: JSON.stringify(ebsaveparms) },
			function(d) {
				if (rpd.notOKFail(d)) {
					return;
				}
				// remove this ebrow from the local data
				// since it's been removed from the server.
				rpd.eb.splice(erIndex, 1);
				renderctbl();
			}
);
		}
	}
}

// bulk confirmation emails
function adminConfirmationEmails() {
	if (!rpd.userIsAdmin) {
		resetViewToDefault();
		return;
	}
	setupregmainAdmin();
	let cl = ['<h1>Confirmation Emails</h1><hr>',
	'<select id="ceEventList"><option></option></select>',
	`<p>Either select an event from the list above or
	enter a list of comma-separated regnums.
	Click 'Go'.
	We will send confirmation emails.</p>`,
	'<textarea id="confemail-list" style="width:100%"></textarea><BR>',
	rpd.btn('Go') + '<BR><hr><div id="progress-text"></div>'];
	rpd.qs('.thelist').innerHTML = cl.join('');

	// populate the event list with events.
	let evtsel = rpd.qs('#ceEventList');
	let evm = rpd.events.map(function(e) {
		return [rpd.ceNameDate(e), rpd.eventCount(e.campevent_id),
			e.campevent_id, e.waitlistArray.length];
	}).filter(function(e1) {
		// show events with any registrations
		// or waitlist entries.
		return e1[1] > 0 || e1[3] > 0;
	});
	loadSelectFromArray(
		evm.map(e1 => `${e1[0]} - ${e1[1]}/${e1[3]}`),
		evtsel,
		evm.map(e1 => e1[2]));
	evtsel.addEventListener('change', populateFromEvent);

	function populateFromEvent() {
		let cid = evtsel.value;
		rpd.qs('#confemail-list').value = 
			rpd.personEvent.filter(pe => pe.reg_status != 'cancelled' &&
			pe.campevent_id == cid)
			.map(pe => pe.regnum)
			.join(',');
	}

	let gb = rpd.qs('.thelist input[value="Go"]');
	gb.onclick = gobtn;
	rpd.smoothScrollCenter(gb);

	function pt(str) {
		rpd.qs('.thelist #progress-text').insertAdjacentHTML('beforeend', str +
		'<span class="end-marker"></span>');
		rpd.smoothScrollCenter(rpd.qs('.thelist span.end-marker:last-of-type'))
	}

	function gobtn() {
		rpd.qs('.thelist #progress-text').innerHTML = '';
		pt('validate list<BR>');

		let regnumList = rpd.qs('#confemail-list').value.trim().split(',')
			.map(s => s.trim())
			.filter(s => s.length > 0);
		pt(`got ${regnumList.length} items<BR>`);
		if (regnumList.length < 1) {
			return;
		}

		let invalidRL = regnumList.filter(function(r) {
			// is this in the list of personevent entries?
			return !rpd.personEvent.some(pe => pe.regnum == r);
		})

		if (invalidRL.length) {
			pt(`invalid regnums: ${invalidRL.join(',')}`);
			return;
		}

		function send1() {
			// send conf email to the first regnum on the list.
			if (regnumList.length < 1) {
				pt('done<BR>');
				return;
			}

			let rn = regnumList.shift();
			let pe = rpd.personEvent.filter(pe => pe.regnum == rn);
			if (pe.length < 1) {
				pt(`rn: ${rn} not found?`);
				return;
			}
			if (pe.length > 1) {
				pt(`rn: ${rn} is duplicate?`);
				return;
			}

			pe = pe[0];

			// find email
			let w = rpd.weblogin.find(w => w.weblogin_id == pe.weblogin_id);
			if (!w) {
				pt(`no weblogin found for rn: ${rn} - weblogin_id: ${pe.weblogin_id}`);
				return;
			}

			// that's good enough.  send the email.
			pt(`send email: rn: ${rn} wl: ${w.weblogin_id} email: ${w.email}<BR>`);

			updateDB( { sendAcknowledgementEmail: JSON.stringify({
				regnum: rn,
				wlid: w.weblogin_id,
				email: w.email
			})}, function(d) {
				if ('OK' != d) {
					pt('ERROR: sendmail failure:<BR>' + d);
					return;
				}
				send1();
			}, false, true);
		}

		// ok, now work on the emails.
		send1();
	}
}

function partialRefundClick(e) {
	let pnum = e.dataset.pnum;
	let regnum = e.dataset.regnum;
	let wlid = e.dataset.wlid;

	rpd.goto(`#partialrefund/${regnum}/${wlid}/${pnum}`);
}

// set up for admin to give partial paypal refunds
// for a specific paypal payment.
function partialRefund() {
	function add(a,b) { return a + b }
	function viewreg() { doViewRegistration(regnum, wlid) }

	let o = setupPaymentAdjustment();
	if (!o) {
		return;
	}
	let regnum = o.regnum;
	let wlid = o.wlid;
	let fp = o.fp;
	let pnum = o.pnum;

	// get payment category info for this txnid
	let payment = rpd.payments.find(p => p.regnum == regnum && p.pnum == pnum);
	if (!payment) {
		rpd.popAlert('payment not found pnum=' + pnum);
		return;
	}
	let txnid = paypalTXNID(payment);
	let sb = /api.sandbox.paypal/i.test(payment.ipn);
	let ptxnid = rpd.payments.filter(p => p.regnum == regnum &&
		p.weblogin_id == wlid && txnid == paypalTXNID(p))
		.map(p => p.pnum);
	let pdtxnid = rpd.paymentDetails.filter(pd => pd.r == regnum &&
			pd.w == wlid && ptxnid.includes(pd.p));

	let txnppt = [0, 0, 0, 0, 0, 0, 0, 0, 0];
	pdtxnid.forEach(function(pd) {
		if (pd.t < 1 || pd.t > txnppt.length-1) {
			console.log('partialRefund error pd.t=' + pd.t);
			return;
		}
		txnppt[pd.t] += pd.a;
	})
	// modify UI for partial refund page.
	rpd.qbv('Keep Deposit').remove();
	rpd.sqs('.thelist h1', 'Partial Refund');
	rpd.sqs('.thelist .my-instructions', `Use this page to refund part of a single Paypal payment.<BR>
		Refund: a positive number means refund money. Negative numbers are not allowed.`);
	let txnidstr = txnid;
	if (sb) {
		txnidstr = `<span title="sandbox" style="background-color: #ffd">${txnid}</span>`;
	}
	rpd.sqs('#this-txnid-span', txnidstr);
	rpd.unhideID('this-payment-div');
	rpd.qsaa('#box1 input[type="checkbox"]')
		.forEach(el => rpd.hideEl(el));
	rpd.hideID('remarks-div');
	rpd.bclk(['Go', goBtn]);

	fillInNumbers();

	function getRefundAmount(inID) {
		return Number(rpd.qs(`#${inID}`).value);	
	}

	// fill in the right panel of numbers giving the old and new
	// payments for this registration.
	function fillInNumbers() {
		function s1(id, val, dnew) {
			let newStr = '';
			if (dnew) {
				let nv = Number(val) + Number(dnew);
				newStr = ` => $${rpd.dollarsOrCents(nv)}`;
			}
			rpd.sqs(`#${id}`, `$${rpd.dollarsOrCents(val)}${newStr}`);
		}

		let refReg = getRefundAmount('reg-input');
		let refTP = getRefundAmount('tp-input');
		let refTPF = getRefundAmount('tp-fee-input');

		s1('fee-reg', fp.rps.total);
		s1('fee-dep', fp.deposit);
		s1('fee-total', fp.rps.paid, -refReg);
		s1('fee-balance', fp.rps.balance, refReg);

		s1('pay-reg', fp.ppt[1], -refReg);
		s1('pay-feekept', -fp.ppt[6]);
		s1('fee-adjust', -fp.ppt[6]);
		s1('pay-tp', fp.ppt[3], -refTP);
		s1('pay-tp-kept', -fp.ppt[7])
		s1('pay-tpf', fp.ppt[5], -refTPF);
		s1('pay-tpf-kept', -fp.ppt[8]);
		s1('pay-total', fp.ppt.reduce(add, 0),
			-refTPF-refTP-refReg);
		
		s1('this-payment-reg', txnppt[1], -refReg);
		s1('this-payment-tp', txnppt[3], -refTP);
		s1('this-payment-tpf', txnppt[5], -refTPF);
		s1('this-payment-total', txnppt.reduce(add, 0),
			-refTPF-refTP-refReg);
	}

	// tell the server to do record this adjustment,
	// create payment_details records, then payment record.
	function goBtn() {
		// create payment details, then
		let ips = [0, 0, 0, 0, 0, 0, 0, 0, 0];
		ips[1] = getRefundAmount('reg-input');
		ips[3] = getRefundAmount('tp-input');
		ips[5] = getRefundAmount('tp-fee-input');

		let pda = [];
		ips.forEach(function(n, i) {
			if (n != 0) {
				pda.push( {
					a: -n,
					t: i,
					r: regnum
				});
			}
		});

		if (!pda.length) {
			rpd.popAlert('Nothing to refund?', 'Missing Input');
			return;
		}

		let refundTotal = rpd.dollarsOrCents(
			pda.map(pd => -pd.a).reduce(add, 0));

		if (refundTotal < 0) {
			rpd.popAlert('Negative refunds are not allowed', 'Error');
			return;
		}
		let paymentTotal = rpd.dollarsOrCents(
			rpd.payments
				.filter(p => regnum == p.regnum)
				.map(p => p.mc_gross).reduce(add, 0));
		if (Number(refundTotal) > Number(paymentTotal)) {
			rpd.popAlert(`Refunding (${refundTotal}) more than paid (${paymentTotal}). `, 'error');
			return;
		}

		recordExpectedPayment(pda, refundPayment);

		function refundPayment() {

			function errorPath(s) {
				rpd.popAlert(s, 'Error');
				cancelUnpaidPayment(viewreg);
			}

			// at this point we're done setting up paymentDetails
			// so we can ask the server to refund the Paypal payment.
			rpd.updateDB({ 
				refundCapturedPayment: JSON.stringify({id: txnid, sb, refundTotal: String(refundTotal)}) },
			function(d) {
				if ('{' != d[0]) {
					errorPath('server error:<BR>' + d);
					return;
				}
				// add the new payment and payment details to the database
				try {
					let r = JSON.parse(d);
					if (!Array.isArray(r.payments) || !r.payments.length ||
						!Array.isArray(r.paymentDetails) || !r.paymentDetails.length) {
						rpd.popAlert('rcp no payments/payment details.<BR>' + d);
						return;
					}
					rpd.payments.push(r.payments[0]);

					// clean out any incomplete payment details
					rpd.paymentDetails = rpd.paymentDetails.filter(pd => pd.c);
					rpd.paymentDetails = rpd.paymentDetails.concat(r.paymentDetails);

					viewreg();

				} catch(e) {
					errorPath('rcp error:<BR>' + d);
					return;
				}
			});
		}
	}

	// if user changes any numbers, redo the calculations.
	rpd.qsaa('#box1 input').forEach(
		function(el) {
			el.addEventListener('change', fillInNumbers)
			el.addEventListener('keyup', fillInNumbers);
		}
	);
}

function setupPaymentAdjustment() {
	if (!rpd.userIsAdmin) {
		resetViewToDefault();
		return false;
	}
	setupregmainAdmin();
	let page = location.hash;
	let regnum, wlid, pnum;
	if (page.match(/\D\/(\d+)\/(\d+)$/)) {
		regnum = +RegExp.$1;
		wlid = +RegExp.$2;
	} else {
		if (page.match(/\D\/(\d+)\/(\d+)\/(\d+)$/)) {
			regnum = +RegExp.$1;
			wlid = +RegExp.$2;
			pnum = +RegExp.$3;		
		} else {
			rpd.popAlert('Bad parameters', 'Error');
			return false;
		}
	}

	// the partialRefund() function modifies this somewhat.
	let cl = ['<h1>Payment Adjustment</h1><hr>',
	`<p class="my-instructions" style="max-width:38rem">Adjustment: a positive number means keep the money.<BR>
	Checked means keep/unkeep,
	unchecked means move money between categories (TP/Registration).<BR>
	<span class="payment-tp">
	To move $10 from registration to Trading Post, for example,
	you leave the checkboxes unchecked, enter $10 in Registration and -$10 in Trading Post.
	</span>
	The "Keep Deposit" button is a shortcut to fill in everything to keep
	the registration deposit money for this registration. This is normally what you
	do when the person cancelled too late.<BR>
	Click "Go" to execute the transaction.</p>`,
	`<div class="row">
		<div class="col-lg-10">
		<style>
		#box1 input[type="number"] { width: 4rem; margin: 0.25rem 0 0.25rem 0.25rem; border: 1px solid #ccc; }
		#box1 input[type="checkbox"] { width: 1rem; height: 1rem; margin-left: 0.3rem; }
		#box1 td { text-align: right; padding: 0 }
		</style>
		<table style="width:100%;border: 1px solid #ddd;margin-bottom:1rem"><tr><td style="width:50%">
			<div id="box1">
			<table><tr><td>
			Registration:</td><td>
				<input id="reg-input" type="number" step="0.01" value="0">
				<input id="reg-check" type="checkbox" > </td></tr>
			<tr><td id="tp-input-label">Trading Post:</td><td>
				<input id="tp-input" type="number" step="0.01" value="0">
				<input id="tp-check" type="checkbox">
			</td></tr>
			<tr><td id="tp-fee-input-label">TP Fees:</td><td>
				<input id="tp-fee-input" type="number" step="0.01" value="0">
				<input id="tp-fee-check" type="checkbox" >
			</td></tr>
			</table>
			<div id="remarks-div">
			<BR>
			Remarks (150 chars max):<BR>
			<textarea id="adj-remarks" style="width:80%;height:3rem"></textarea>
			</div>
			</div>
			</td>
			<td style="border-left:1px solid #ddd;padding-left:1rem;
				background-color: #fcf9f8""><div id="box2">
			<strong><u>${regnum} Registration Fees:</u></strong><BR>
			Registration Fees: <span id="fee-reg"></span><BR>
			Deposit Required: <span id="fee-dep"></span><BR>
			Kept Fees: <span id="fee-adjust"></span><BR>
			Registration Payment: <span id="fee-total"></span><BR>
			Registration Balance: <span id="fee-balance"></span><BR><BR>

			<strong><u>Total Payment for Registration ${regnum}:</u></strong><BR>
			Registration: <span id="pay-reg"></span><BR>
			Kept Fees: <span id="pay-feekept"></span><BR>
			<div class="payment-tp">
				Trading Post: <span id="pay-tp"></span><BR>
				Trading Post Kept: <span id="pay-tp-kept"></span><BR>
				Trading Post Fees: <span id="pay-tpf"></span><BR>
				Trading Post Fees Kept: <span id="pay-tpf-kept"></span>
			</div>
			TOTAL: <span id="pay-total"></span><BR>

			<div id="this-payment-div" class="hidden">
			<BR>
			<strong><u>This PayPal TXNID - <span id="this-txnid-span"></span>:</u></strong><BR>
			Registration: <span id="this-payment-reg"></span><BR>
			<div class="payment-tp">
				Trading Post: <span id="this-payment-tp"></span><BR>
				Trading Post Fees: <span id="this-payment-tpf"></span>
			</div>
			TOTAL: <span id="this-payment-total"></span><BR>
			</div>			
			</div></td></tr></table>
			<div class="text-center">
				${rpd.btn('Keep Deposit')} &nbsp;
				${rpd.btn('Go')} &nbsp;
				${rpd.btn('Cancel')}
			</div>
			<hr>
			<div id="eventName"></div>
			<div id="camper1Name"></div>
		</div>
		</div>
		<BR><hr><div id="progress-text"></div>`,
	];
	let thelist = rpd.qs('.thelist');
	thelist.innerHTML = cl.join('');
	window.setTimeout(function() {
		rpd.smoothScrollCenter(thelist)
	}, 200);
	rpd.bclk(['Cancel', function() { doViewRegistration(regnum, wlid); }])

	let pear = rpd.loadRegnum(regnum, wlid);
	if (!pear || !pear.length) {
		popAlert('Invalid registration:' + regnum, 'ERROR');
		return false;
	}
	let pe1 = rpd.findReg1(pear);

	// Fees and payments.
	let fp = getFeesPayments(pear);

	if (!cbER.tradingPostMoney) {
		// if there is no trading post money supported
		// for Paypal for this event then we can hide
		// the trading post and trading post fees inputs
		// and checkboxes.
		['tp-input-label','tp-fee-input-label',
		'tp-input','tp-check','tp-fee-input','tp-fee-check']
		.forEach(s => rpd.hideEl(rpd.qs(`#${s}`)));

		// also hide the trading post information on the right side
		// of the page since it's all zeros.
		rpd.qsaa('.thelist  .payment-tp').forEach(el => rpd.hideEl(el));
	}

	rpd.sqs('#eventName', rpd.ceNameDate(rpd.ce));
	rpd.sqs('#camper1Name', personName(pe1.camper_id));

	return {regnum, wlid, pnum, pear, pe1, fp};
}

function paymentAdjustment() {
	function add(a,b) { return a + b }

	let o = setupPaymentAdjustment();
	if (!o) {
		return;
	}
	let regnum = o.regnum;
	let fp = o.fp;

	rpd.bclk(['Keep Deposit', function() {
		// set up amounts and checkbox to keep deposit
		// and trading post fees.
		rpd.qs('#reg-input').value = fp.deposit;
		rpd.qs('#reg-check').checked = true;
		rpd.qs('#tp-input').value = '0';
		rpd.qs('#tp-check').checked = false;
		rpd.qs('#tp-fee-input').value = fp.ppt[5];
		rpd.qs('#tp-fee-check').checked = true;
		rpd.qs('#adj-remarks').value = 'Keep cancellation deposit';
		fillInNumbers();
	}]);
	rpd.bclk(['Go', goBtn]);

	// for the non-Trading Post case, we check the checkbox
	// by default since there are no other categories
	if (!cbER.tradingPostMoney) {
		rpd.qs('#reg-check').checked = true;
	}

	fillInNumbers();

	function getKeptAdjusted(inID, checkID) {
		let kept = Number(rpd.qs(`#${inID}`).value);
		let adj = kept;
		if (rpd.qs(`#${checkID}`).checked) {
			adj = 0;
		} else {
			kept = 0;
		}		
		return [kept, adj];	
	}

	// fill in the right panel of numbers giving the old and new
	// payments for this registration.
	function fillInNumbers() {
		function s1(id, val, dnew) {
			let newStr = '';
			if (dnew) {
				let nv = Number(val) + Number(dnew);
				newStr = ` => $${rpd.dollarsOrCents(nv)}`;
			}
			rpd.sqs(`#${id}`, `$${rpd.dollarsOrCents(val)}${newStr}`);
		}

		let keptReg, adjReg;
		[keptReg, adjReg] = getKeptAdjusted('reg-input', 'reg-check');

		let keptTP, adjTP;
		[keptTP, adjTP] = getKeptAdjusted('tp-input', 'tp-check');

		let keptTPF, adjTPF;
		[keptTPF, adjTPF] = getKeptAdjusted('tp-fee-input', 'tp-fee-check');
		
		s1('fee-reg', fp.rps.total);
		s1('fee-dep', fp.deposit);
		s1('fee-total', fp.rps.paid, -adjReg);
		s1('fee-balance', fp.rps.balance, keptReg+adjReg);

		s1('pay-reg', fp.ppt[1], -adjReg);
		s1('pay-feekept', -fp.ppt[6], keptReg);
		s1('fee-adjust', -fp.ppt[6], keptReg);
		s1('pay-tp', fp.ppt[3], -adjTP);
		s1('pay-tp-kept', -fp.ppt[7], keptTP)
		s1('pay-tpf', fp.ppt[5], -adjTPF);
		s1('pay-tpf-kept', -fp.ppt[8], keptTPF);
		s1('pay-total', fp.ppt.reduce(add, 0), -adjTPF-adjTP-adjReg
			-keptReg-keptTP-keptTPF);
	}

	// tell the server to do record this adjustment,
	// create payment_details records, then payment record.
	function goBtn() {
		// create payment details, then
		let ips = [0, 0, 0, 0, 0, 0, 0, 0, 0];
		[ips[6], ips[1]] = getKeptAdjusted('reg-input', 'reg-check');
		[ips[7], ips[3]] = getKeptAdjusted('tp-input', 'tp-check');
		[ips[8], ips[5]] = getKeptAdjusted('tp-fee-input', 'tp-fee-check');

		let pda = [];
		ips.forEach(function(n, i) {
			if (n != 0) {
				pda.push( {
					a: -n,
					t: i,
					r: regnum
				});
			}
		});

		if (!pda.length) {
			popAlert('Nothing to record?', 'Missing Input');
			return;
		}

		recordExpectedPayment(pda, recordPayment);

		function recordPayment() {
			let mc_gross = -ips.reduce(add, 0)
			let payment = {
				mc_gross: mc_gross,
				cash: 0,
				checkno: 6,
				remarks: 'ADJUSTMENT: ' +
					rpd.qs('#adj-remarks').value.trim(),
				payment_status: 'Completed',
				email: rpd.efEmail,
				regnum: regnum,
				ipn: '',
				invoice: '',
				adjustment: 0
			};

			updateDB({ payment: JSON.stringify(payment),
				email: rpd.efEmail },
				rpd.afterPaymentRecorded);			
		}

	}

	// if user changes any numbers, redo the calculations.
	rpd.qsaa('#box1 input').forEach(
		function(el) {
			el.addEventListener('change', fillInNumbers)
			el.addEventListener('keyup', fillInNumbers);
		}
	);
}

// get fees and payments for this regnum
// from the database.
// pear is personevent list for the registration.
function getFeesPayments(pear) {
	let pe1 = rpd.findReg1(pear);
	let regnum = pe1.regnum;
	let wlid = pe1.weblogin_id
	let fp = {};
	fp.rps = rpd.rpstats(pear);
	fp.deposit = 0;

	// set up cbER if it isn't already setup for this event.
	if (cbER.ev.campevent_id != pe1.campevent_id) {
		cbER.setup(null, rpd.findCE(pe1.campevent_id));
	}
	pear.forEach(function(pe, i) {
		if (rpd.notCanc(pe)) {
			let fees = cbER.fees(i);
			fp.deposit += fees[0];
		}
	});

	// payment details
	fp.pda = rpd.paymentDetails.filter(pd =>
		pd.w == wlid &&
		pd.r == regnum && pd.c);
	
	// payments
	fp.payments = rpd.payments.filter(rpd.onereg(regnum, wlid));

	// total payments per payment type.
	// get this from payment details.
	fp.ppt = [0, 0, 0, 0, 0, 0, 0, 0, 0];
	fp.pda
		.forEach(function(pd) {
			if (pd.t > fp.ppt.length-1 || pd.t < 1) {
				console.log(`unknown payment type: ${pd.t} ` +
					JSON.stringify(pd));
				return;
			}
			fp.ppt[pd.t] += pd.a;
		});
	
	// this is a workaround to account for money that was paid
	// before we had payment_detail records. We'll look through each
	// payment and if there is no payment_detail record for that
	// payment we will account for the registration payment in ppt[1].
	fp.payments.filter(p => p.mc_gross > 0 &&
					!fp.pda.find(pd => pd.p == p.pnum))
		.forEach(function(p) {
			fp.ppt[1] += p.mc_gross;
	});

	fp.bAnyKeptFees = (fp.ppt[PD_RKEPT_TYPE] ||
		fp.ppt[PD_TPKEPT_TYPE] || fp.ppt[PD_TPFKEPT_TYPE]) && true;

	return fp;
}

/* allow bookkeeper to edit fields. */
function bkEditEvents()
{
	if (!rpd.userIsAdmin) {
		resetViewToDefault();
		return;
	}
	setupregmainAdmin();
	let oddEven = true;
	let curDate = 0;
	let cl = ['<h1>Accounting <div style="display:inline-block;font-size:1vw">' +
		rpd.btn('Save') + rpd.btn('Cancel') +
		'</div></h1><p>Check the event(s) you want to close then click "Save".</p>' +
		'<div class="ctcDiv" style="max-width:36rem">'
	];
	cl = cl.concat(rpd.events
		.filter(ce => _CB.dateDiffDays(ce.start_date, rpd.now) > 0 &&
			!ce.b1ce && ce.total_space > 0)
		.map(function(ce) {
			var dtstr = '<span class="dstr">' + rpd.dr(ce) + ':</span>';
			if (ce.start_date == curDate) {
				dtstr = '<span class="dskp"></span>';
			} else {
				oddEven = !oddEven;
			}
			curDate = ce.start_date;
			return '<div class="revt' +
			 (oddEven ? ' oecls' : '') +
			 `"><label for="c-${ce.campevent_id}">
${dtstr}${ce.name} --- Close Event: </label>
<input type="checkbox" id="c-${ce.campevent_id}"></div>`;
	}));
	cl.push('</div>');
	rpd.qs('.thelist').innerHTML = cl.join('');
	rpd.bclk(['Save', beeSave]);
	rpd.bclk(['Cancel', resetViewToDefault]);
	xxSetupValidation(beeValidate);

	// if anything needs to be saved, enable the 'Save'
	// button.
	function beeValidate() {
		let ls = rpd.nar(rpd.qsa('.thelist input[type="checkbox"]'));
		ls.forEach(function(c) {
				if (c.checked) {
					c.parentNode.classList.add('act');
				} else {
					c.parentNode.classList.remove('act')
				}
			});
		rpd.qbv('Save').disabled = !rpd.qs('.thelist input[type="checkbox"]:checked');
		if (ls.length == 0) {
			rpd.qs('.thelist').innerHTML =
			'<h1>Accounting</h1><p>There are no more events to close.</p>';
		}
	}
	function beeSave() {
		// get the list of events to close accounting for.
		let evts = rpd.nar(rpd.qsa('.thelist input[type="checkbox"]:checked'))
			.map(e => e.id.substring(2));

		rpd.updateDB({ closeEvent: JSON.stringify(evts) },
			function(d) {
				if (!rpd.notOKFail(d)) {
					// success
					evts.forEach(function(id) {
						// mark this event as closed.
						let c = rpd.findCE(id);
						if (c) {
							c.b1ce = true;
						}
					})
				}
				bkEditEvents();
			});
	}
}

// setup regmain template for admin use.
function setupregmainAdmin() {
	loadTemplate('regadmin-blank');
}

// allow registrar to set whether events are available for
// registration and total space.
function registrarEditEvents()
{
	if (!rpd.userIsAdmin) {
		resetViewToDefault();
		return;
	}

	setupregmainAdmin();

	var curSeason = '';
	var curDate = false;
	var oddEven = true;
	function reeSeason(ce) { // season header if needed.
		if (ce.season != curSeason) {
			curSeason = ce.season;
			return `<div class="revt-season cbhfont" data-season="${curSeason}">` +
			'<p class="m-0 p-1 d-inline-block">' +
			curSeason + '</p></div>';
		}
		return '';
	}

	// get the encoded value for family camp total space from the checkboxes.
	function getFCTS(ce) {

		// get value of family camp checkbox with suffix suf.
		function gcb(suf) {
			return rpd.qs('#' + ce.campevent_id + suf).checked ? 1 : 0;
		}
		return gcb('-rv') * 4 +
			gcb('-cl') * 2 +
			gcb('-ar');
	}

	// one line (one camp event) on the Registrar Edit screen
	function eventREdisplay(ce) {

		// produce a labeled checkbox.
		function cbwl(strLabel, suf, bChecked, title) {
			title = title ? ` title="${title}"` : '';
			let id = ce.campevent_id + suf;
			return `<label class="m-0" ${title} for="${id}">${strLabel}:</label>
				<input type="checkbox" ${title} id="${id}" ${bChecked ? ' checked' : ''}>`;
		}

		// produce number input field.
		function ree_num(label, name, value, title) {
			title = title ? ' title="' + title + '"' : '';
			return label + ': ' +
			'<input type="number" name="' + name +
			'" value="' + value + '" min="0" max="500"' + title + ' />';
		}

		function reeCurrent(ce) { 	// display count of people registered for this event.
			let campevent_id = ce.campevent_id;
			let c = rpd.eventCount(campevent_id);
			if (!c) {
				return '';
			}
			return `<a href="#prts/${campevent_id}" title="Active Registrations">Reg: ${c}</a>`;
		}

		if (/family/i.test(ce.name)) {
			// family camp is a special case.  We want to allow for
			// RV park and Lodge openings separately, as well as showing
			// whether we're accepting registrations.

			// for family camp we use ce.total_space as an encoded value
			let ts = ce.total_space;

			// RV Park - Full/Space Available		-- bit 2
			// Lodge/Cabin - Full/Space Available	-- bit 1
			// Accepting registrations - yes/no		-- bit 0
			return `<div style="margin-left:200px">
				${cbwl('RV Park Full', '-rv', ts & 4)}<BR>
				${cbwl('Cabins/Lodges Full', '-cl', ts & 2)}<BR>
				${cbwl('Accepting Registrations', '-ar', ts & 1)}
				<input type="hidden" name="${ce.campevent_id}-ts" value="${ts}">
				</div>`;
		}

		return ree_num('Total', ce.campevent_id+'-ts', ce.total_space) +
			ree_num('Wait', ce.campevent_id+'-w', ce.wait_list, 'Wait List') +
			ree_num('OH', ce.campevent_id+'-oh', ce.oho, 'Office Hold') +
			cbwl('OK', '-okcb', ce.online_OK, 'Online OK') +
			cbwl('EB', '-okebcb', ce.eb_OK, 'Earlybird Registration OK') +
			cbwl('AWL', '-awl', ce.awl, 'Automated Wait List') +
			reeCurrent(ce);
	}

	// setup header
	rpd.sqs('#regnav + h1',
	'Registrar <div style="display:inline-block;font-size: 1vw">' +
		rpd.btn('Save') + rpd.btn('Cancel') + ' ' + rpd.btn('View Fees')
		+ '</div>');

	let cl = ['<div class="ctcDiv" style="max-width:90%">'];
	cl = cl.concat(rpd.events.map(function(ce) {
		let dtstr = '<span class="dstr">' + rpd.dr(ce) + '</span>';
		if (ce.start_date == curDate) {
			dtstr = '<span class="dskp"></span>';
		} else {
			oddEven = !oddEven;
		}
		curDate = ce.start_date;
		return reeSeason(ce) +
			'<div class="revt' + (oddEven ? ' oecls' : '') + '">' +
			dtstr + ce.name + ' -- ' +
			eventREdisplay(ce) +
			'</div>';
	}));
	cl.push('</div>'); // end ctcDiv
	rpd.qs('.thelist').innerHTML = cl.join('');

	function getcb(ce, suf) { // get checkbox for this campevent.
		return rpd.qs('#' + ce.campevent_id + suf);
	}
	function getis(ce, suf) { // get input with suffix 'suf'
		return rpd.qin(ce.campevent_id + suf);
	}

	// return changes that we can send to the server.
	function reeGatherChanges() {
		return rpd.events.filter(function(ce) {
			if (/family/i.test(ce.name)) {
				return getFCTS(ce) != ce.total_space;
			}
			return getis(ce, '-w').value != ce.wait_list ||
				getis(ce, '-ts').value != ce.total_space ||
				getis(ce, '-oh').value != ce.oho ||
				(getcb(ce, '-okcb').checked && true) != (ce.online_OK && true) ||
				(getcb(ce, '-okebcb').checked && true) != (ce.eb_OK && true) ||
				(getcb(ce, '-awl').checked && true) != (ce.awl && true);
		})
		.map(function(ce) {
			function v(suf) { return parseInt(getis(ce, suf).value) || 0 };
			if (/family/i.test(ce.name)) {
				// new desired value for family camp.
				return {
					campevent_id: ce.campevent_id,
					wait_list: 0,
					total_space: getFCTS(ce),
					oho: 0,
					online_OK: 0,
					awl: 0
				};
			}
			return {
				campevent_id: ce.campevent_id,
				wait_list: v('-w'),
				total_space: v('-ts'),
				oho: v('-oh'),
				online_OK: getcb(ce, '-okcb').checked ? 1 : 0,
				eb_OK: getcb(ce, '-okebcb').checked ? 1 : 0,
				awl: getcb(ce, '-awl').checked ? 1 : 0
			};
		});
	}

	// validate the registrar edit events page.
	function reeValidate() {
		// determine invalid fields
		rpd.events.forEach(function(ce) {

			if (! /family/i.test(ce.name)) {
				let wl = getis(ce, '-w');
				let ts = getis(ce, '-ts');
				let oh = getis(ce, '-oh');
				let wlv = parseInt(wl.value) || 0;
				let tsv = parseInt(ts.value) || 0;
				let ohv = parseInt(oh.value) || 0;
				setInvalidField(ts.value.trim == '' || wlv>tsv, ts);
				setInvalidField(wlv<0, wl);
				setInvalidField(ohv<0 || ohv>tsv, oh);
	
				// can't be OK to register if there is no space.
				let cb = getcb(ce, '-okcb');
				let ebcb = getcb(ce, '-okebcb');
				cb.disabled = tsv <= 0;
				if (cb.disabled) {
					cb.checked = false;
				}

				// not allowed to turn off automated wait lists
				// if there are waitlisted people for this event.
				let awl = getcb(ce, '-awl');
				if (awl.checked && wlv > 0) {
					awl.readOnly = true;
					awl.disabled = true;
				} else {
					awl.readOnly = false;
					awl.disabled = false;
				}
				// if we're using automated wait lists
				// then the wait list field is read only.
				
				wl.readOnly = awl.checked;
				wl.disabled = awl.checked;
	
				// set up class for this revt based on ok/eb checkboxes.
				if (cb.checked || ebcb.checked) {
					cb.parentNode.classList.add('act');
				} else {
					cb.parentNode.classList.remove('act');
				}
			}

		});

		// disable save button based on no changes or any invalid.
		rpd.qbv('Save').disabled = rpd.qs('invalidField') ||
			reeGatherChanges().length == 0;
	}
	function viewFees() {
		// view the fees for each event.
		setupregmainAdmin();
		rpd.sqs('#regnav + h1',
		'View Fees <div style="display:inline-block;font-size: 1vw">' +
			rpd.btn('Cancel') + '</div>');
		rpd.bclk(['Cancel', registrarEditEvents]);

		let seasonList = [];
		rpd.events.forEach(function(ce) {
			if (!seasonList.includes(ce.season)) {
				seasonList.push(ce.season);
			}
		});

		const legendRow = `<tr><td colspan="2"></td>
		${['reg', 'reg+', 'dep', 'dep+', 'wait']
			.map(h => `<td style="font-size:90%;text-align:right">${h}</td>`).join('')}
			</tr>`;

		let cl = [
			'<div class="ctcDiv" style="max-width:90%">'];

		// one table per season.
		cl = cl.concat(seasonList.map(function(season) {
			return `<h3>${season.toUpperCase()}</h3>

				<table class="mb-4" style="border:1px solid #ccc">` +
				legendRow +
				rpd.events.filter(e => season == e.season).map(function(ce) {
					let dtstr = rpd.dr(ce);
					if (ce.start_date == curDate) {
						dtstr = '';
					} else {
						oddEven = !oddEven;
					}
					curDate = ce.start_date;

					return `<tr class="${oddEven ? 'oecls' : ''} revt ${ce.fees[0] > 0 ? ' act' : ''}">
					<td>${dtstr}</td>
					<td>${ce.name}</td>
					${eventFeeDisplay(ce)}
					</tr>`
				}).join('') +
				'</table>';
		}));

		cl.push('</div>'); // end ctcDiv
		rpd.qs('.thelist').innerHTML = cl.join('');
	
		function eventFeeDisplay(ce) {
			return ce.fees.map(f => `<td align="right">${f}</td>`).join('');
		}
	}
	function reeSave() {
		// find differences and send to server to save.
		let chg = reeGatherChanges();

		rpd.updateDB({ reeSave: JSON.stringify(chg) },
			function(d) {
				if (d != "OK") {
					rpd.popAlert(d);
				} else {
					// all is well, make the changes in our local data.
					chg.forEach(function(c) {
						let cid = c.campevent_id;
						let ce_old = rpd.findCE(cid);
						if (!ce_old) {
							rpd.popAlert('? ' + cid);
							return;
						}
						Object.assign(ce_old, c);
						// figure out available_space.
						// total-oho-registrations.
						ce_old.available_space = ce_old.total_space -
							ce_old.oho -
							rpd.personEvent.filter(rpd.filterCID(cid)).length;
					});
				}
				registrarEditEvents(); // refresh the page.
			}
		);
	}

	// insert and set up season shortcut buttons
	let sEl = rpd.qsaa('.revt-season[data-season]')
	rpd.qs('#regnav + h1').insertAdjacentHTML('afterend',
	'<div><div style="font-size: 10pt">Goto: ' +
	sEl.map(function(e) {
		return `<input style="font-size:10pt"
			class="ml-1 btn btn-sm season-shortcut"
			type="button" value="${e.dataset.season}">`;
	}).join('') +
	'</div></div>'
	);
	rpd.qsa('.season-shortcut').forEach(function(e) {
		e.onclick = function() {
			// find the season heading and scroll to it.
			rpd.smoothScrollCenter(
				rpd.qs(`.revt-season[data-season="${e.value}"]`));
		}
	})

	if (rpd.regAdmin()) {
		rpd.bclk(['Save', reeSave]); // save button triggers reeSave.
		xxSetupValidation(reeValidate);
	} else {
		// this is a read-only admin.
		// make everything read-only and don't allow saving.
		rpd.hideEl(rpd.qbv('Save'));

		rpd.qsaa('.thelist input:not([type="button"])').forEach(function(el) {
			el.disabled = true;
		});
	}

	rpd.bclk(['Cancel', resetViewToDefault]); // start over.
	rpd.bclk(['View Fees', viewFees]);
}

// cancel registration or waitlist entry.
function cancelRW(regnum, wlid, cid, cb) {

	function progressText(str) {
		rpd.qs('.thelist').insertAdjacentHTML('beforeend', str);
	}
	// show progress.
	if (!rpd.qs('#regadmin-blank')) {
		setupregmainAdmin();
		rpd.sqs('h1', 'Progress:');
		rpd.smoothScrollCenter(rpd.qs('.thelist'));
	}

	let pear = rpd.filterReg(regnum, wlid);
	let fp = getFeesPayments(pear);
	let rps = fp.rps;
	let r1list = pear.filter(rpd.filter1)
		.filter(rpd.notCanc);

	// is there money outstanding that needs to be refunded
	// or kept.
	let moneyOutstanding = rpd.dollarsOrCents(
			fp.ppt.reduce(rpd.add, 0));
	
	// if there have been any partial refunds or
	// kept money, then this must be handled manually
	// to refund everything to zero before continuing.
	if (1 == r1list.length && moneyOutstanding) {
		// any partial refunds?
		// get the refunds and see if they match their payment's amount.
		let bAnyPartialRefunds = fp.payments
			.filter(p => p.mc_gross < 0)
			.some(function(r) {
				// is there a payment that doesn't match the amount?
				let tid = paypalTXNID(r)
				return fp.payments.find(p2 =>
					p2.mc_gross != -r.mc_gross &&
					tid == paypalTXNID(p2));
			});

		if (bAnyPartialRefunds || fp.bAnyKeptFees) {
			popAlert(
				`Partial Refunds/Kept Money.<BR>
				Money outstanding ${moneyOutstanding}<BR>
				Partial Refunds: ${bAnyPartialRefunds}<BR>
				Kept Money: ${fp.bAnyKeptFees}<BR><BR>
				Refund all money manually`,
				'action required');
			doViewRegistration(regnum, wlid);
			return;
		}
	}

	if (1 == r1list.length && 0!=rps.paid) {

		// this is the last registration/waitlist entry
		// for this regnum. refund any paypal payments
		// before cancelling the PE entry.

		// first get a list of all the refunded txid's
		let rtxid = rpd.payments.filter(p => regnum == p.regnum &&
			p.mc_gross < 0 && /paypal/i.test(p.remarks))
			.map(paypalTXNID)
			.filter(t => !/^\(/.test(t));

		// now get the unrefunded payments.
		let up = rpd.payments.filter(p =>
			regnum == p.regnum && p.mc_gross > 0 &&
			/paypal/i.test(p.remarks) &&
			!rtxid.includes(paypalTXNID(p)));
		if (up.length) {
			// refund the first one on the list and then try again.
			let id = paypalTXNID(up[0]);
			let sb = /api.sandbox.paypal/i.test(up[0].ipn);
			progressText(`<p>Cancel payment ${id}...</p>`);
			refundCapturedPayment(id, sb, function() {
				cancelRW(regnum, wlid, cid, cb);
			},
			function er(s) {
				// error path
				progressText('<BR><hr>' + s);
			}
			)
			return;
		}
	}
	progressText(`<p>Cancel registration ${regnum}...</p>`);
	updateDB( { cancelRegistration: JSON.stringify( {
					regnum: regnum,
					campevent_id: cid
				} ) },
		function(d) {
			if (d != "OK") {
				popAlert(d);
				return;
			}
			if (r1list.length > 1) {
				// get the people on the registration/waitlist
				// that were just cancelled.
				let clist = rpd.filterReg(regnum, wlid)
					.filter(pe => cid == pe.campevent_id);

				// just remove this registration/waitlist but not
				// payments and not other similar pe entries.
				rpd.personEvent = rpd.personEvent.filter(pe =>
					pe.regnum != regnum ||
					pe.weblogin_id != wlid ||
					pe.campevent_id != cid);
				
				// if this was a registration that just got cancelled,
				// adjust the available space
				if (!clist[0].wl) {
					rpd.updateAvailableSpace(cid, clist.length);
				}

			} else {
				// cancel everything associated with 
				// this registration.
				rpd.cancelRegistration(regnum, wlid);
			}
			cb();
	});
}

// registrar wants to reverse office payment
function reverseOfficePayment(e, bSure) {
	if (!rpd.regAdmin()) {
		return;
	}

	if (!bSure) {
		popConfirm('Are you sure?', function() {
			reverseOfficePayment(e, true);
		});
		return;
	}
	let rn = e.dataset.rn;
	let pnum = e.dataset.pnum;

	// create desired payment details from the old
	// payment details records to be reversed.
	let pda = rpd.paymentDetails.filter(p =>
		p.r == rn && p.p == pnum && p.c == 1)
		.map(function(pd) {
			let np = Object.assign({}, pd);
			np.c = 0;
			np.a = -1 * pd.a;
			return np;
		});
	
	// find the payment to be reversed
	let oldPayment = rpd.payments.filter(rpd.onereg(rn, rpd.efWL))
		.find(p => p.pnum == pnum && /office/i.test(p.ipn));
	if (!oldPayment) {
		popAlert('Could not find payment to be reversed');
		return;
	}

	// payment details work is done.
	let payment = {
		mc_gross: -oldPayment.mc_gross,
		cash: 1,
		checkno: 0,
		remarks: `reverse office payment ${pnum}`,
		payment_status: 'Completed',
		email: rpd.efEmail,
		regnum: rn,
		ipn: `office payment: ` + rpd.email,
		invoice: 'reverse',
		adjustment: 0
	};

	function updatePayment() {
		updateDB({ payment: JSON.stringify(payment),
			email: '' },
			rpd.afterPaymentRecorded);
	}

	if (pda.length < 1) {
		updatePayment();
	} else {
		recordExpectedPayment(pda, updatePayment);
	}
}

// user has clicked a refund button.
// we ask if sure before continuing
function refundCapturedIfSure(e) {
	popConfirm('Refund complete PayPal payment.<BR>Are you sure?', function() {
		let id = e.dataset.txn;
		let sb = e.dataset.sb;
		refundCapturedPayment(id, sb, function(rn, wl) {
			doViewRegistration(rn, wl);
		});
	})
}

function refundCapturedPayment(id, sb, cb, ecb) {

	if (rpd.testdb() && !sb) {
		popAlert("Can't refund real payment on test machine",
			"Not Allowed");
		return;
	}

	function errorPath(s) {
		rpd.popAlert(s);
		if (ecb) {
			ecb(s);
		}
	}
	// if this refund needs to have multiple associated payments_details
	// entries, then make sure they are already set up, otherwise
	// set them up.
	// for that, we need to find the payment that we are refunding
	// and find its payment_details records.
	let aPay = rpd.payments.find(p => p.mc_gross > 0 &&
		rpd.efWL == p.weblogin_id && id == paypalTXNID(p));
	if (!aPay) {
		errorPath('No associated payment');
		return;
	}
	// payment details for the original payment.
	let aPD = rpd.paymentDetails.filter(pd =>
		aPay.regnum == pd.r && aPay.weblogin_id == pd.w &&
		aPay.pnum == pd.p);
	if (aPD.length > 1) {
		// OK.  We need to make sure there are paymentDetails
		// set up before we do the refund.
		let incompletePD = unpaidPaymentDetails(aPay.regnum);
		if (!incompletePD.length) {
			// create new records for the desired payment details.
			let pda = aPD.map(function(pd) {
				let t = Object.assign({}, pd);
				t.a = -1 * pd.a; // expecting a refund, so negative
				return t;
			})
			recordExpectedPayment(pda, function() {
				refundCapturedPayment(id, sb, cb, ecb);
			})
			return;
		}
	}

	// at this point we're done setting up paymentDetails
	// so we can ask the server to refund the Paypal payment.
	rpd.updateDB({ refundCapturedPayment: JSON.stringify({id, sb}) },
	function(d) {
		if ('{' != d[0]) {
			errorPath('server error:<BR>' + d);
			return;
		}
		// add the new payment and payment details to the database
		try {
			let r = JSON.parse(d);
			if (!Array.isArray(r.payments) || !r.payments.length ||
				!Array.isArray(r.paymentDetails) || !r.paymentDetails.length) {
				rpd.popAlert('rcp no payments/payment details.<BR>' + d);
				return;
			}
			rpd.payments.push(r.payments[0]);

			// clean out any incomplete payment details
			rpd.paymentDetails = rpd.paymentDetails.filter(pd => pd.c);
			rpd.paymentDetails = rpd.paymentDetails.concat(r.paymentDetails);
			if (cb) {
				cb(r.payments[0].regnum, r.payments[0].weblogin_id);
			}
		} catch(e) {
			errorPath('rcp error:<BR>' + d);
			return;
		}
	});	
}

// ask server to get us Palpal transaction details.
// id - transaction id.
// sb - true for paypal sandbox
// cb - callback function to call with the JSON results.
function getPPTXNDetails(id, sb, cb) {
	rpd.updateDB({ gettxdetails: JSON.stringify({id, sb}) },
	function(d) {
		if (cb) {
			cb(d);
		}
	});
}

// paypal transaction id clicked.  Get details
// from Paypal (via our server)
// this is called when user clicks a Paypal transaction id
// on the viewRegistration page.
function ppTXNClick(e) {
	getPPTXNDetails(e.dataset.txn, e.dataset.sb, function(d) {
		let m = '';
		try {
			let o = JSON.parse(d);
			m = JSON.stringify(o, null, 2);
		} catch(e) {
			m = 'JSON parse error\n' + d;
		}

		// find this payment so we can also show the recorded p.ipn info.
		let tx = e.dataset.txn;
		let p = rpd.payments.find(p => p.ipn && p.ipn.includes(tx));
		let s = p.ipn;
		if (s[0] == '{') {
			try {
				let j = JSON.parse(s);
				s = JSON.stringify(j, null, 2);
			} catch(e) {
				// leave s alone, not parseable.
			}
		}
		let cc = rpd.qs('#change-campers');
		_CB.setEl(cc,
		`<BR><button onclick="rpd.sqs('#change-campers', '')">Close Paypal Details</button><BR>
		<div><pre style="white-space:pre-wrap">sql ipn:\n${s}\nPaypal SERVER:\n${m}</pre></div>`);
		rpd.smoothScrollCenter(cc);
	})
}

// given payments p, return Paypal transaction ID.
function paypalTXNID(p) {
	if (!/^paypal$/i.test(p.remarks) || !p.ipn) {
		return '';
	}

	// For old-style IPN we just parse out txn_id
	if (p.ipn[0] != '{') {
		let m = p.ipn.match(/txn_id = (?<txn>\w{17})/i);
		return m ? m.groups.txn : '';
	}

	// new Paypal info is JSON.
	let c = false;
	try {
		c = JSON.parse(p.ipn);
	} catch(e) {
		return '(invalid ipn JSON)';
	}

	// if this was a capture we need captures[0].id
	if (c.purchase_units) {
		if (!Array.isArray(c.purchase_units)) {
			return '(c.puchase_units not Array)';
		}
		let rv;
		try {
			rv = c.purchase_units[0].payments.captures[0].id;
		} catch(e) {
			rv = '(invalid purchase_units)';
		}
		return rv;
	}

	// if this was a webhook we need the resource
	if (c.resource) {
		return c.resource.id;
	}

	// maybe this is a refund. in that case the capture id
	// is a parameter in the "up" link
	// from the refund captured payment results.
	if (p.mc_gross < 0) {
		if (c.id && Array.isArray(c.links)) {
			let up = c.links.find(e => /up/i.test(e.rel));
			if (up) {
				let h = up.href;
				if ('string' == typeof h &&
					h.match(/payments\/captures\/(\w{10,30})/))
				{
					return RegExp.$1;
				}
			}
		}
	}
	return '(unknown JSON)';
}
/*global addReadyFunction:true,_CB:true,
rpd:true,xxSetupValidation:true,setInvalidField:true,
cbER:true, loadTemplate:true,regEvent:true,personName:true,
gotoPayEvent:true,recordUnpaidReg:true,setEventNameAndCampers:true
depositOnlyDaysOK:true,initRPDevent:true,changeCamperCmd:true
 */
"use strict";

addReadyFunction(wtBegin);
/* winter teen special functionality */
function wtBegin()
{
    // cv - current value from the input field.
    // iv - what is already on the server.
    // as - assigned campers.
    var ci = [{lbl: 'FS', cv:0, iv:0, as:0 },
        {lbl:'MS', cv:0, iv:0, as:0 },
        {lbl: 'FL', cv:0, iv:0, as:0 },
        {lbl:'ML', cv:0, iv:0, as:0 }
    ];
    var cntAlreadyOnThisReg = 0;
    var regnum = 0;
    var reg1 = null; // first person on the registration.
    function mf(ci) {
        return ci.lbl[0] == 'F' ? 'Female' : 'Male'
    }
    function eLbl(ci) {
        return  mf(ci) + ' ' +
            (ci.lbl[1] == 'L' ? 'Leaders' : 'Students');
    }
    function wtMatch(ev) {
        if (!ev || !ev.season || !ev.name) {
            console.log('wtMatch: bad ev');
            return false;
        }
        return /winter/i.test(ev.season) &&
            /teen/i.test(ev.name);
    }
    function calcCount() {
        return ci.reduce((a,c) => a+c.cv, 0);
    }
    function paidSoFar() {
        // add up payments for this registration.
        return rpd.payments
            .filter(rpd.onereg(regnum, rpd.efWL))
            .reduce((a,c) => a+c.mc_gross, 0);
    }
    function getReg1() { // first/sponsor personevent.
        let pear = rpd.filterReg(regnum, rpd.efWL);
        return pear.length && rpd.findReg1(pear);
    }
    function namedCampersList() {
        return rpd.pendingCampers.filter(p => p > 0);
    }
    function newHousingInfo() {
        return JSON.stringify(ci.map(c => c.cv));
    }
    // return true if camper is adult
    function isAdult(c) {
        return /adult|college/i.test(c.age);
    }
    // return true if female camper c
    function isFemale(c) {
        return /girl/i.test(c.gender);
    }
    // for person c, return the index into
    // the ci Array.  c is a camper object.
    function ciIdx(c) {
        return (isAdult(c) ? 2 : 0) +
            (isFemale(c) ?  0 : 1)
    }

    // get winter teen stats for personevent pe (reg1)
    function getStats(pe) {
        let a = { c: [0,0,0,0], t: 0 };
        try {
            a.c = JSON.parse(pe.note_to_camp);
            if (a.c.length != ci.length) {
                console.log('bad json: ' + pe.note_to_camp);
                a.c = [0,0,0,0];
            }

            a.t = a.c.reduce((a,c) => a+c, 0);
        } catch(e) {
        }
        return a;
    }
    // get the church for personevent pe.
    function getChurch(pe) {
        let cp = pe.camper_id > 0 && rpd.findCamper(pe.camper_id);
        if (cp && cp.churchname)
            return cp.churchname;
        return '';
    }

    _CB.wt = {
        wtMatch: wtMatch,
        initWT: function initWT(rn) {
            // initialize WT variables.
            // if rn is not null use rn as
            // the basis for the initialization.
            ci.forEach(c => c.as = c.cv = c.iv = 0);

            // #campers already registered on this registration.
            cntAlreadyOnThisReg = 0;
            regnum = rn || 0;
            if (!rn)
                return;
            reg1 = getReg1();
            if (!reg1 || typeof reg1.note_to_camp != 'string') {
                reg1 = null;
                return;
            }
            try {
                let ht = JSON.parse(reg1.note_to_camp);
                if (ht.length != 4)
                    return;
                ht.forEach(function(h, i) {
                    ci[i].cv = h;
                    ci[i].iv = h;
                } );
                cntAlreadyOnThisReg = calcCount();
            } catch(e) {
                console.log('JSON.parse error: ' + reg1.note_to_camp);
            }
            // count assigned campers into ci[].as.
            rpd.filterReg(regnum, rpd.efWL)
                .filter(c => c.camper_id > 0)
                .forEach(function(c) {
                    let i = rpd.findCamper(c.camper_id);
                    if (i) {
                        ci[ciIdx(i)].as++;
                    }
                })
        },
        regEvent: function regEventWT() {
            if (!wtMatch(rpd.ce))
                return;

            // we want user to select the sponsor.
            _CB.ge('instrID').insertAdjacentHTML(
                'beforeend',
                `<p><span class="font-weight-bold">Please select the main contact person
                for your teen group.</span>
                If the main contact is not listed, please add that person to your
                contact list and then select that person to register your group.</p>`
            )
            rpd.qs('#cbEventInfo > div:nth-child(2) .t1').innerHTML =
                'Adult (Sponsor)';

            if (rpd.pendingCampers.length > 0) {
                rpd.doHousing();
            }

            // if this account isn't already a church account
            // then we will need to quit or get out.
            // Need ut for the effective WLID.
            if (rpd.findWLID(rpd.efWL).ut == 1)
                return;

            _CB.setHTML('reRightPanel',
                `<div id="notChurchAccount"><P>This is not a church account.</p>
                <p>Only church accounts can register for Winter Teen
                Retreats.  If you represent a church group and want to use this
                account to register your teens please convert this account
                to a church account.</p>
                <p>We need to keep track of church accounts
                separately in our records.</p>
                <input type="button" value="Convert" /></div>
                `
                );

            // need to send 'updateUT' if asked.
            function updateUT() {
                rpd.updateDB( { updateUT: 1 }, function(r) {
                    if (r != 'OK') {
                        rpd.popAlert(r);
                        return;
                    }
                    rpd.findWLID(rpd.efWL).ut = 1;
                    regEvent();
                })
            }
            rpd.bclk(['Convert', updateUT]);

        },
        regHousing: function regHousing() {
            // edit 'housing'.  For WT that means
            // editing counts of people in different categories.
            // for an existing registration we come here from
            // the 'Edit' button on the viewRegistration page.
            // in this case loadRegnum()...initWT() has been
            // called to set up variables.
            if (!wtMatch(rpd.ce)) {
                return false;
            }

            loadTemplate('regevent');
            let nb = rpd.qs('#nextbutton');
            rpd.sqs('#eventname', rpd.ce.name);
            rpd.fillEventInfo(); // setup #cbEventInfo.

            if (regnum > 0) {
                // cancel button for existing event takes
                // us back to viewRegistration.
                let cb = rpd.qs('#cancelbutton');
                if (cb) {
                    cb.title = 'Cancel Edits';
                    cb.onclick = function() {
                        rpd.doViewRegistration(regnum, rpd.efWL);
                    }
                }

            } else {
                // for a new registration, we want to count
                // the sponsor as an assigned person so that
                // our counts min and current will be correct
                // for that category.
                let c = ci[ciIdx(rpd.findCamper(rpd.pendingCampers[0]))];
                c.cv = c.as = 1;
            }

            // something changed on the counts.
            // show error messages as appropriate.
            function valChange() {

                let bProb = [];
                let totalPeople = 0;
                // first read all the current values.
                ci.forEach(function(c) {
                    c.cv = parseInt(c.inp.value, 10);
                    if (isNaN(c.cv)) {
                        c.cv = 0;
                    }
                });

                // next decide on validity for each.
                ci.forEach(function(c, i) {
                    let bBad = ! /^\d+$/.test(c.inp.value);

                    if (bBad) {
                        bProb.push(`Invalid number for ${eLbl(c)}.`)
                    }
                    totalPeople += c.cv;

                    if (c.as > 0 && c.cv < c.as) {
                        bBad = true;
                        bProb.push(`Include ${c.as} assigned ${eLbl(c)} in counts.`);
                    }

                    // validate that there are enough leaders.
                    if (i<2 && c.cv > 0 && c.cv > ci[i+2].cv*10) {
                        bProb.push('Not enough ' + mf(c) + ' leaders.');
                        bBad = true;
                    }
                    setInvalidField(bBad, c.inp);
                })

                // must register at least one student.
                if (!ci[0].cv && !ci[1].cv) {
                    bProb.push('Register at least one student.')
                }

                if (totalPeople-cntAlreadyOnThisReg > rpd.available_space(rpd.ce)) {
                    bProb.push('Not enough space.')
                }

                if (cntAlreadyOnThisReg) {
                    if (totalPeople == cntAlreadyOnThisReg) {
                        // is there a change in the individual numbers
                        // even though the total count is the same?
                        // old note_to_camp vs new note_to_camp.
                        if (newHousingInfo() == reg1.note_to_camp) {
                            // are there any non-disabled inputs?
                            if (rpd.qs('.wt1 input[type="number"]:not(:disabled)')) {
                                bProb.push('Adjust counts as needed.');
                            } else {
                                bProb.push('You may not adjust these counts.');
                            }
                        }
                    }

                    // Bruce doesn't want users to be able to decrease
                    // number of attendees.
                    if (totalPeople < cntAlreadyOnThisReg && !rpd.userIsAdmin) {
                        bProb.push('You may not decrease the total number of attendees.');
                    }
                }

                nb.style.display = 'inline';
                nb.disabled = bProb.length && true;
                rpd.setSpaceAvailable(totalPeople-cntAlreadyOnThisReg);
                rpd.sqs('#feedback', bProb.join('<BR>'));
            } // valChange()

            rpd.qs('#instrID').innerHTML = `<p>Winter Teen Registration:</p>
<p>Enter the total number of people coming
in each of these categories.
</p><p>
Register at least 1 leader for each 10 students.
Leaders must be at least 18 years old
and not in high school.</p>`;
            let maxAllowed = cntAlreadyOnThisReg+rpd.ce.available_space;
            rpd.qs('#reRightPanel').innerHTML = '<div class="wt1">' +
                ci.map(function(a, i) {
                    return `<div>${eLbl(a)}<BR>
                    <input type="number" min="${a.as}" max="${maxAllowed}"
                        value="${a.cv}" name="${i}" />
                    </div>`;
                }).join('') +
                '</div><div id="feedback"></div>';

            // save the <INPUT> elements.
            _CB.qsafn('#reRightPanel input', function(el, i) {
                ci[i].inp = el;
            });


            function payForDelta() {

                function pay() {
                    rpd.gotoPaypal({
                        regnum: regnum,
                        payNow: am,
                        payTotal: am,
                        campers: rpd.filterReg(regnum, rpd.efWL)
                            .filter(p => p.camper_id > 0 && p.note_to_camp)
                            .map(p => p.camper_id),
                        campevent_id: rpd.ce.campevent_id,
                        housing: ''
                    });
                }

                // Is more money due for the
                // additional deposit fees?
                let dd = cbER.fees()[0] * calcCount();
                let psf = paidSoFar();
                if (psf >= dd) {
                    // no additional deposit due. view the registration.
                    rpd.doViewRegistration(regnum, rpd.efWL);
                    return;
                }
                setEventNameAndCampers('paypalpay');
                let pb = rpd.qin('payt');
                let am = dd - psf;
                pb.value = `Pay Additional Deposit $${am}`;
                rpd.hideID('paymentNormalInstructions');
                pb.onclick = pay;

                if (rpd.impersonating()) {
                    // office payment made with normal registration
                    // pay more.
                    _CB.setHTML('instrID', `<p>Admin: Pay the remaining
                    balance of $${am} using "Pay More"
                    on the View Registration screen.</p>
                    `);
                    pb.value = 'Continue';
                    pb.onclick = function() {
                        rpd.doViewRegistration(regnum, rpd.efWL);
                    }
                    rpd.hideEl(rpd.qs('.paybuttons [value="Cancel"]'));
                }
            } // end payForDelta()

            // save changes to the counts for this
            // registration.  This includes:
            // pending housing field of the sponsor row
            // as well as updates to the total number
            // of unnamed campers.
            // we're moving towards the ci[x].cv numbers.
            // what already saved is in ci[x].iv.
            function saveChanges() {

                function changeOpts(ad, campers, okFn) {
                    let m = ad ? campers.length : -1 * campers.length;
                    if (campers[0] == reg1.camper_id) {
                        // this is just a change housing note.
                        // a change in the mix of people.
                        // not adding or deleting campers, so we shouldn't
                        // adjust the fees.
                        m = 0;
                    }
                    let fees = rpd.totalRegistrationFees(regnum, rpd.ce.campevent_id, m);
                    changeCamperCmd( {
                        campers: campers,
                        regnum: regnum,
                        ad: ad,
                        newHousingNote: JSON.stringify(hi),
                        newDepositAmount: fees[0],
                        newTotalFees: fees[1],
                        campevent_id: rpd.ce.campevent_id,
                    }, okFn);
                }
                function updatePEHousingInfo(ar) {
                    reg1.note_to_camp = JSON.stringify(ar);
                }
                let ncid;
                let cnt = calcCount(); // desired total from form inputs.
                let hi = ci.map(c => c.cv);
                console.log(`saveChanges: cnt ${cnt} ${JSON.stringify(hi)} ` +
                    `cntAlreadyOnThisReg ${cntAlreadyOnThisReg}`);

                if (cnt == cntAlreadyOnThisReg) {
                    // special case of no change in count but a change
                    // in the mix of people.  update newHousingNote.
                    if (newHousingInfo() != reg1.note_to_camp) {
                        // not finished yet.
                        console.log('new mix of people: ' + newHousingInfo() +
                            ' ' + reg1.note_to_camp);
                        ncid = reg1.camper_id;
                        changeOpts(true, [ncid], function() {
                            updatePEHousingInfo(hi);
                            rpd.doViewRegistration(regnum, rpd.efWL);
                        });
                        return;
                    }
                    // nothing more to save.
                    console.log('done saving.');
                    payForDelta();
                    return;
                }

                // lowest unnamed camper id on this registration.
                // 0 - no unnamed campers.
                let lowestUnnamed = Math.min(0,
                    ...rpd.pendingCampers.filter(c => c < 0));
                console.log('lowestUnnamed: ' + lowestUnnamed);

                let campers = [];
                if (cnt > cntAlreadyOnThisReg) {      
                    // we need to add more unnamed people to the
                    // records for this registration.              
                    // form an array of camper id's for the new
                    // placeholders in personevent.
                    while (campers.length + cntAlreadyOnThisReg < cnt) {
                        // new camperid is one less than existing low.
                        lowestUnnamed--;
                        campers.push(lowestUnnamed);
                    }
                    
                    console.log('add new unnamed campers: ' + campers.join(','));
                    // add the campers on the server.
                    changeOpts(true, campers,
                        function() {
                            // add entries to personevent internally
                            // and adjust space remaining.
                            updatePEHousingInfo(hi);
                            campers.forEach(function(c) {
                                rpd.addOnePersonEvent(regnum, rpd.efWL,
                                    c, cbER.fees()[1]);
                            });
                            if (rpd.userIsAdmin) {
                                rpd.doViewRegistration(regnum, rpd.efWL);
                            } else {
                                // show 'pay at least...' pop up.
                                let min = _CB.wt.depositDueNow(regnum);
                                if (min > 0) {
                                    rpd.popAlert(`Pay at least ${min} now.`,
                                        'Payment Due',
                                        function() {
                                            // call attention to the payment
                                            // UI now on the screen.
                                            rpd.smoothScrollCenter(rpd.qs('#change-campers'));
                                            let upm = rpd.qs('#change-campers #upm');
                                            if (upm) {
                                                upm.style.backgroundColor = '#ff8';
                                                window.setTimeout(function() {
                                                    upm.style.backgroundColor = '';
                                                }, 600);
                                            }
                                        });   
                                }    
                                initRPDevent();                         
                            }
                        });
                    return;
                }

                // we have too many people on the registration
                // so we need to remove unnamed people.
                while (lowestUnnamed < 0 &&
                    cntAlreadyOnThisReg - campers.length > cnt) {
                    campers.push(lowestUnnamed);
                    lowestUnnamed++;
                }

                if (cntAlreadyOnThisReg - campers.length > cnt) {
                    rpd.popAlert('error trying to remove campers');
                    return;
                }

                console.log('remove unnamed campers ' + campers.join(','))
                // delete unnamed campers.
                changeOpts(false, campers,
                    function() {
                        // remove entries from personevent internally
                        // and adjust space remaining.
                        updatePEHousingInfo(hi);
                        campers.forEach(function(c) {
                            rpd.removeOnePersonEvent(regnum, rpd.efWL, c);
                        });
                        reg1.balance_remaining -= campers.length * cbER.fees()[1];
                        rpd.doViewRegistration(regnum, rpd.efWL);
                    });
            } // end saveChanges()

            // setup screen to pay whatever needs to be paid for deposit.
            function wtPay() {

                if (cntAlreadyOnThisReg > 0) {
                    // we are editing an existing registration.
                    // set up to save changes, then set up
                    // for payment.
                    rpd.popConfirm('Save Changes?', saveChanges);
                    return;
                }

                // brand new registration.
                // put together the housingInfo string to save
                // the counts for students/leaders, male/female
                rpd.pendingHousingInfo = newHousingInfo();

                // set up the additional phony pending campers
                // (beyond the named sponsor).
                // first we need to subtract the sponsor from the count
                let namedCampers = namedCampersList().length;

                let cnt = calcCount() - namedCampers;
                // put in dummy campers for the unnamed students and sponsors.
                for (let j=0; j<cnt; j++) {
                    rpd.pendingCampers.push(-1-j);
                }
                recordUnpaidReg(gotoPayEvent);
                //gotoPayEvent();
            }
            if (nb) { // setup 'next' button
                nb.onclick = wtPay;
                if (cntAlreadyOnThisReg > 0)
                    nb.value = 'Save';
            }

            xxSetupValidation(valChange);
            return true;
        },
        setupER: function setupER() {
            // this is only called if the event is
            // winter teen.
            //cbER.fees = function wtFees() {
            //    return [30, 95];
            //}
            cbER.allowed = function wtAllowed() {
                let t = cbER;
                var genA = t.genAllowed();
				if (!t.camper || genA != '') {
					return genA;
				}
				// the first person must be an adult.
				if (rpd.pendingCampers.length == 0 && !isAdult(t.camper)) {
					return 'Sponsor must be adult.';
				}
                return '';
            }
            cbER.regEventFn = _CB.wt.regEvent;
            cbER.viewRegistrationFn = _CB.wt.viewRegistration;
            cbER.payScreenFn = function psf() {
                // only allow paying deposit.
                // deposit in this case will not create
                // recurring payment.
                rpd.hideEl(rpd.qin('payt'));
                rpd.unhideEl(rpd.qin('payd'));

                _CB.setHTML('depOrTotal', '');
                _CB.ge('instrID').insertAdjacentHTML(
                    'beforeend',
                    '<p style="margin:0.5rem 0">For Winter Teen pay only the deposit now.</p>'
                );

                rpd.sqs("#pay-deposit-text",
                    `<p>Pay the deposit fee.</p>`);
            }
            cbER.noInstallmentPlan = true;
            cbER.userPayMore = true;
            cbER.userEditRegFn = function editReg(el) {
                // edit registration counts.
                // called from viewRegistration.
                regnum = el.target.regnum;
                rpd.loadRegnum(regnum, el.target.wlid);
                _CB.wt.regHousing();
            }
            if (rpd.pendingCampers.length > 1)
                cbER.maxAllowed = 199;
        },
        setCamperInfo: function setCamperInfo() {
            // take care of specific things for WT
            // camper names on viewRegistration.
            if (!wtMatch(rpd.ce))
                return;

            // put information about the registration
            // in cTblID.
            let c = _CB.ge('cTblID');
            if (!c)
                return;
            // hide all camper names except the sponsor.
            _CB.qsafn('#cTblID div.collapsed-children',
            function(c, i) {
                if (i>0) {
                    c.classList.add('dn');
                }
            })
            if (false) {
                // show assigned counts.
                let agnCnt = rpd.pendingCampers.filter(c => c>0).length;
                c.insertAdjacentHTML('afterend',
                    `<div id ="wtsci" class="ctblc">
                    <P>Assigned/Total: ${agnCnt}/${calcCount()}</p>
                    <div class="ci ml-2">` +
                    ci.map(a => `${eLbl(a)}: ${a.as}/${a.cv}`).join('<br>') +
                    '</div></div>');
            } else {
                c.insertAdjacentHTML('afterend',
                    `<div id ="wtsci" class="ctblc">
                    <P>Total: ${calcCount()}</p>
                    <div class="ci ml-2">` +
                    ci.map(a => `&nbsp;&nbsp;&nbsp;${eLbl(a)}: ${a.cv}`).join('<br>') +
                    '</div></div>');
            }

        },
        depositDueNow: function depositDueNow(regnum) {
            // deposit amount due now taking into
            // account the fees already paid.
            let pear = rpd.filterReg(regnum, rpd.efWL);
            let rps = rpd.rpstats(pear);
            let min = rps.balance > 0 ? rps.balance : 0;
            if (depositOnlyDaysOK()) {
                min = cbER.fees()[0] * pear.length - rps.paid;
            }
            return min;
        },
        // viewRegistration called by main reg.js viewRegistration().
        viewRegistration: function vr() {
            if (!wtMatch(rpd.ce))
                return;
            let hs = rpd.qs('.hs');
            if (hs) {
                // remove JSON housing note.
                hs.parentNode.removeChild(hs);
                hs = null;
            }

            // deposit required.
            let d = cntAlreadyOnThisReg;
            let df = cbER.fees()[0];
            let r11 = rpd.qs('#reg1 > p');
            r11.innerHTML = `Deposit Required: ${d} x $${df} = $${d*df}<BR>` +
                r11.innerHTML;

            // allowed person for this winter teen event?
            function isAllowed(c, aLab) {
                if (isAdult(c)) {
                    aLab.push('Adult');
                    return true;
                }

                if (! /^\d+$/.test(c.age)) {
                    aLab.push('Unknown Grade');
                    return false; // no grade
                }

                let a = +c.age;
                aLab.push(`Student (${a})`); // student label.
                // grade 6 and up ok for combined.
                // high school 9-12
                // jr high 6-9
                if (a < 6)
                    return false;

                if (/^jr\./i.test(rpd.ce.name))
                    return a < 10; // jr. high
                if (/^sr\./i.test(rpd.ce.name)) // sr. high
                    return a > 8;

                // combined
                return true;
            }

            function listEligibleCampers() {
                // allow adding campers.
                // list all eligible contacts.
                rpd.qs('#payMore')
                .insertAdjacentHTML('afterend',
                `<div id="assignC" class="d-inline-block mt-3"><p class="mt-0 mb-1 cbhfont">
                Click person to
                <span class="going">assign</span> if eligible:</p>` +
                rpd.campers.filter(rpd.cuf)
                .map(function(c) {
                    let cl = ''
                    let bGoing = -1 != rpd.pendingCampers.indexOf(c.camper_id);
                    let gen = isFemale(c) ? 'Female' : 'Male';
                    let aLab = [];
                    let ald = isAllowed(c, aLab);
                    let curPtr = 'pointer';
                    let hc = 'shadow-hover';
                    let gd = ''; // going decoration
                    let theTitle = 'Click to Assign';
                    let i = ciIdx(c);
                    let cii = ci[i];
                    if (bGoing) {
                        cl = 'going';
                        gd = '<div class="dn-s going-decoration"></div>';
                        // can't unassign this person if main sponsor.
                        if (reg1.camper_id == c.camper_id) {
                            theTitle = "Sponsor cannot be unassigned."
                            curPtr = hc = '';
                        } else {
                            theTitle = 'Click to Unassign'
                        }
                    } else {
                        // if they aren't going, we see if they
                        // are allowed to go and there is a slot
                        // for them to be assigned.
                        let slot = true;
                        if (ald) {
                            if (cii.as >= cii.iv) {
                                // all of these slots assigned already.
                                theTitle = `All ${eLbl(cii)} assigned.`;
                                slot = false;
                            }
                        }
                        if (!ald || !slot) {
                            // not allowed to be assigned or no slot.
                            curPtr = hc = '';
                            cl = 'not-allowed';
                            if (!ald) {
                                theTitle = 'Wrong age'
                            }
                        }
                    }
                    return `<div class="position-relative"><div data-age="${ald}"
                    data-gen="${gen}" title="${theTitle}" data-cid="${c.camper_id}"
                    class="${hc} bdr1 trans02 px-2 ml-2 py-3 my-3 ${curPtr} ${cl}">
                    ${personName(c.camper_id)} --${aLab[0]}-- ${gen}</div>${gd}</div>`;
                                }).join('') +
                                `</div><p style="max-width:25em">To add more people,
                    or to correct the specifics
                    of a person, go to your <a href="#list">'Contacts'</a>.
                    <!-- To change the count of people going to the retreat, click the 'Edit'
                    button above. -->
                    </p>`
                    );  
                    // last unassigned camper
                    let wtrn = regnum; // save regnum for clicks below.
                    let lastUAC = Math.min(0,
                        ...rpd.pendingCampers.filter(c => c< 0));

                    // if all spots have been assigned then only deassignments
                    // are allowed.
                    if (lastUAC == 0) {
                        _CB.qsafn('#assignC div:not(.going)',
                            g => g.classList.remove('pointer'));
                    }

                    // take care of the clicking for assignment/deassignment.
                    _CB.qsafn('#assignC div.pointer[data-age]', function(el) {
                        el.onclick = function(ev) {
                            let t = ev.target;
                            let goingNow = t.classList.contains('going');
                            let cid = +t.getAttribute('data-cid')
                            let oldcid = goingNow ? cid : lastUAC;
                            let newcid = goingNow ? lastUAC-1 : cid;

                            // we should be able to find the registration
                            // that we're about to change.
                            let pe = rpd.filterReg(wtrn, rpd.efWL)
                                .find(r => r.camper_id == oldcid);
                            if (!pe) {
                                rpd.popError('no registration?');
                                return;
                            }

                            // if there is already a pending-action outstanding
                            // then we need to wait for it.
                            if (rpd.qs('#assignC .pending-action')) {
                                console.log('wait for pending-action to complete.')
                                return;
                            }

                            t.classList.add('pending-action');
                            rpd.updateDB( { assignWT: JSON.stringify({
                                newcid, regnum: wtrn, oldcid })},
                            function(d)
                            {
                                // results back from server.
                                t.classList.remove('pending-action');
                                if (rpd.notOKFail(d)) {
                                    return;
                                }

                                // action successful, update
                                // variables to reflect change
                                // and re-render screen.
                                pe.camper_id = newcid;
                                rpd.doViewRegistration(wtrn, rpd.efWL);
                            }, false, true); // no waitMessage
                        }
                    })              
                }



        },
        seRegnum: function seRegnum(p2) {
            // shPrts page summary - sponsor name and
            // breakdown.
            let r1 = rpd.findReg1(p2);

            function hn() {
                // decode JSON string as summary
                // for the #prts page.
                // (also include church name)
                let s = getStats(r1);
                let church = getChurch(r1);
                if (church) {
                    church = `<span class="pn">[${church}]</span> `;
                }
                return church + ci.map((a,i) =>
                    `${a.lbl}: ${s.c[i]}`).join(' ') +
                    ` --- TOTAL: ${s.t}`;
            }

            return '<div><span class="pn">' +
                personName(r1.camper_id) +
                '</span> - ' + hn() +
                '</div>'
        },
        wtSummary: function(pe) {
            // for bruce's summary report 'Rpts -> WT Summary'
            // map pe (reg1) to array for excel.
            let s = getStats(pe);
            let c = rpd.findCamper(pe.camper_id);
            let e = '';
            let contactphone = '';
            if (c) {
                e = c.email;
                contactphone = c.cell_phone || '';
            }

            let eventname = '', eventstartdate = '';
            let ce = rpd.findCE(pe.campevent_id);
            let webloginemail = rpd.findWLID(pe.weblogin_id)?.email;
            let dep = '', balancedue = '';
            if (ce) {
                eventname = ce.name;
                eventstartdate = rpd.dr(ce);
                // calculate deposit and balance due
                if (webloginemail) {
                    let pear = rpd.filterReg(pe.regnum, pe.weblogin_id);
                    let rps = rpd.rpstats(pear);
                    balancedue = rps.balance;
                    dep = rps.paid;
                }
            }



            return [
                eventname, eventstartdate,
                pe.regnum,
                webloginemail,
                getChurch(pe),
                s.c[1],s.c[3],s.c[0],s.c[2],
                s.t,
                personName(pe.camper_id), e,
                contactphone,
                dep, balancedue
            ];
        },
        wtSummaryFields: 'Event,Date,RN,WL-Email,Church,Boys,Boy Sponsors,Girls,' +
            'Girl Sponsors,Total,Contact,Email,Phone,Dep,Balance'
    }
}
/* global google:true, rpd:true
 */
// uspsvalidate.js
"use strict";

var uspsvalidate = {

    geocoder: false, // google geocoder service
    actoken: false,
    streetIEL: false, // input HTMLElement for street address
    street2IEL: false,
    cityIEL: false,
    stateIEL: false,
    zipIEL: false,
    rdivEL: false, // El DIV for output results.
    validAddresFn: false,
    attempts: 0,
    MAX_ATTEMPTS: 15,
    uspsAuth: false,

    init: function(p) {
        let uv = uspsvalidate;
        const  qs = s => document.querySelector(s);
        uv.streetIEL = qs(p.street);
        uv.street2IEL = qs(p.street2);
        uv.cityIEL = qs(p.city);
        uv.stateIEL = qs(p.state);
        uv.zipIEL = qs(p.zip);
        uv.rdivEL = qs(p.rdiv);
        uv.validAddresFn = p.validAddressFn;

        uv.actoken = false;
    },

    setIV: function setIV(i, v) {
        let el = uspsvalidate[i];
        if (el.value == v) {
            return;
        }
        el.value = v;
        let evt = new Event('change');
        el.dispatchEvent(evt);
    },

    tooManyAttempts: function() {
        return uspsvalidate.attempts > uspsvalidate.MAX_ATTEMPTS
    },

    // try to use current position of (browser) device and then lookup
    // the address of that current.
    // This works best for devices with GPS.
    currentAddress: function currentAddress() {
        let uv = uspsvalidate;
        let r = uv.rdivEL;
        r.innerHTML = 'working...'

        let options = {
            enableHighAccuracy: true,
            timeout: 5000,
            maximumAge: 0,
        }
        // use geolocate to lookup current position
        navigator.geolocation.getCurrentPosition((position) => {
            r.innerHTML = 'Got position. Looking up address.';
            uv.positionResults = position;
            const latlng = {
                lat: position.coords.latitude,
                lng: position.coords.longitude,
              }
            uv.geocoder.geocode( 
                { location: latlng
                },
            function(results, status) {
                if (status == 'OK') {
                    function findComp(s) {
                        let m = results[0].address_components.find(c => c.types.includes(s));
                        return m ? m.short_name : '';
                    }
                    uv.geocodeResults = results;

                    // things look good
                    uv.setIV('streetIEL', findComp('street_number') + ' ' + findComp('route'));
                    uv.setIV('cityIEL', findComp('locality'));
                    uv.setIV('stateIEL', findComp('administrative_area_level_1'));
                    uv.setIV('zipIEL', findComp('postal_code'));
                    r.innerHTML = results[0].formatted_address +
                        `<BR>Location accuracy: ${Math.round(position.coords.accuracy * 3.28)} feet` +
                        '<BR>Please adjust the address as needed.';
                } else {
                    r.innerHTML = 'Google Geocode was not successful: ' + status;
                }
              });
          },
          (err) => {
            console.warn(`ERROR(${err.code}): ${err.message}`);
            r.innerHTML = `getCurrentPosition error: ${err.message}`;
          }, options);
    },

    doValidate: function doValidate() {
    let uv = uspsvalidate;

    function qsaa(s) {
        return Array.from(document.querySelectorAll(s));
    }

    let r = uv.rdivEL;
    if (!r) {
        alert('not initialized. no rdivEL');
        return;
    }

    // update input element. set its value.
    function setIV(i, v) {
        uv.setIV(i, v);
    }

    function lookupCityState2(z) {
        if (! /^\d{5}$/.test(z)) {
            r.innerHTML = 'invalid ZIP code.';
            return;
        }
        updateDB( { usps: JSON.stringify({
            cmd: 'lookupcitystate',
            zip: z,
        })}, function(d) {
            try {
				let q = JSON.parse(d);
                if (q.error) {
                    r.innerHTML = `ZIP ERROR<BR>code ${q.error.code}<BR>${q.error.message}`
                    return;
                }
                if (q.city && q.state) {
                    setIV('cityIEL', q.city);
                    setIV('stateIEL', q.state);
                    r.innerHTML += 'Success';
                    return;
                }
			} catch(e) {
				r.innerHTML = `results - ${d}`;
			}
        });

    }

    uv.attempts++;
    if (uv.tooManyAttempts()) {
        r.innerHTML = '<p>Sorry too many validate attempts.</p>';
        return;
    }

    let z = uv.zipIEL.value;
    let st = uv.stateIEL.value;
    let city = uv.cityIEL.value;

    if (st == 'ON') {
        r.innerHTML = 'Can&rsquo;t validate addresses in Canada.';
        return;
    }
    if (z && (!st || !city)) {
        r.innerHTML = `Lookup city/State from zip ${z} ...`;
        lookupCityState2(z);
        return;
    }

    let street = uv.streetIEL.value;
    if (!street) {
        r.innerHTML = 'No street address';
        return;
    }

    let street2 = uv.street2IEL.value;

    // if there is a street address but no zip
    // we can try to look up zip code
    if (!z && st && city) {
        updateDB( { usps: JSON.stringify({
            cmd: 'lookupzip',
            street: street,
            city: city,
            state: st
        })}, function(d) {
            r.innerHTML = `lookupzip got result:<BR>${d}`;
            try {
                let q = JSON.parse(d);
                if (q.error) {
                    r.innerHTML = `Validate error:<BR>code ${q.error.code}<BR>${q.error.message}`;
                    console.log(`usps lookupzip error ${r.innerHTML}`);
                    googleGeocode();
                    return;
                }
    
                if (q.address.ZIPCode) {
                    setIV('zipIEL', q.address.ZIPCode);
                    r.innerHTML = `Found ZIP Code: ${q.address.ZIPCode}`;
                    doValidate();
                }
            } catch(e) {
                console.log(r.innerHTML);
                return;
            }
        })
        return;
    }

    r.innerHTML = 'Validating...';


    function googleAutocompletePrediction(geometry) {
        if (!uv.actoken) {
            uv.actoken = new google.maps.places.AutocompleteSessionToken();
        }
        r.innerHTML += '.';

        let acservice = new google.maps.places.AutocompleteService();
        acservice.getQueryPredictions(
            {   input: street,
                locationBias: geometry.bounds,
                sessionToken: uv.actoken,
            },
            function (results, status) {
                if (status == 'OK') {
                    // put the list of predictions in DIV's
                    // and let users click on the one they want.
                    let chooseMsg = results.length ?
                    ' Choose one of the possibilities below if it is correct.' :
                    '';
                    r.innerHTML = '<p>This is not a unique address.' +
                    chooseMsg + '</p>' +
                    results
                    .map(r => `<div class="gresult pointer shadow-hover border sdwBrdr p-1 mb-2" style="max-width:95%">${r.description}</div>`)
                    .join('');

                    // setup click events results.
                    qsaa('div.gresult').forEach(function(e) {
                        e.addEventListener('click', function(e) {
                            // user wants this address. set things up
                            // to use it.
                            console.log(`click: ${e.target.innerHTML}`);
                            let f = e.target.innerHTML.split(', ');
                            if (f.length) {
                                // set street address, city, state.
                                setIV('streetIEL', f[0]);
                                setIV('cityIEL', f[f.length-3]);
                                setIV('stateIEL', f[f.length-2]);
                                setIV('zipIEL', '');
                                doValidate();
                            }
                        })
                    });
                    rpd.smoothScrollCenter(r);
                    r.style.backgroundColor='#ccc';
                    window.setTimeout(function() {
                        r.style.backgroundColor = '';
                    }, 500);
                } else {
                    r.innerHTML = 'results ' + status;
                }
            });
    }


    // first step is to find bounds for the prediction.
    function googleGeocode() {
        if (!uv.geocoder) {
            r.innerHTML = 'google service not available.';
            return;
        }
        r.innerHTML = 'Trying Google...';

        let address = `${city} ${st} ${z}`;
        let cr = {
            country: 'us'
        };
        if (z) {
            cr.postalCode = z;
        }
        uv.geocoder.geocode( 
            { address: address,
            region : 'us', // united states
            componentRestrictions : cr
            },
        function(results, status) {
            if (status == 'OK') {
                // now we can attempt the autocomplete prediction.
                googleAutocompletePrediction(results[0].geometry);
            } else {
                r.innerHTML = 'Google Geocode was not successful: ' + status;
            }
          });
    }

    if (! /^\d{5}$/.test(z)) {
        // bad zip code. send to google for prediction
        googleGeocode();
        return;
    }

    // use new (march 2025) USPS API to validate the address
    updateDB( { usps: JSON.stringify({
        cmd: 'validateaddress',
        zip: z,
        street: street,
        street2: street2,
        city: city,
        state: st
    })}, function(d) {
        r.innerHTML = `validateaddress got result:<BR>${d}`;
        try {
            let q = JSON.parse(d);
            if (q.error) {
                r.innerHTML = `Validate error:<BR>code ${q.error.code}<BR>${q.error.message}`;
                console.log(`usps validateaddress error ${r.innerHTML}`);
                googleGeocode();
                return;
            }

            // single match. fill in the correct address.
            if ('31' == q.matches[0].code) {
                setIV('cityIEL', q.address.city);
                setIV('stateIEL', q.address.state);
                setIV('zipIEL', q.address.ZIPCode);
                setIV('streetIEL', q.address.streetAddress);
                setIV('street2IEL', q.address.secondaryAddress);
                r.innerHTML = 'Address Validated.'
                if (uv.validAddresFn) {
                    uv.validAddresFn();
                }
            }

            if ('32' == q.corrections[0].code) {
                setIV('cityIEL', q.address.city);
                setIV('stateIEL', q.address.state);
                setIV('zipIEL', q.address.ZIPCode);
                setIV('streetIEL', q.address.streetAddress);
            }
            if (q.corrections[0].code) {
                r.innerHTML = q.corrections[0].text;
            }

        } catch(e) {
            console.log(r.innerHTML);
            return;
        }
    });

},
}

// called by google api callback
function uspsvalidate_initAV() {
    uspsvalidate.geocoder = new google.maps.Geocoder();
}

// 19startup.js 

// assume jQuery is loaded.  Everything necessary
// for startup with new theme.


(function() {

    function loadCSS(f, bReturnOnly) {
        let s1 = document.createElement("link");
        s1.rel = "stylesheet";
        s1.type = "text/css";
        s1.href = f;
        if (!bReturnOnly) {
            document.getElementsByTagName("head")[0].appendChild(s1);
        }
        return s1;
    }
    // load fonts
    loadCSS("https://use.typekit.net/nez3jru.css");
    let s1 = loadCSS('https://use.fontawesome.com/releases/v5.12.1/css/all.css', true);
    s1.setAttribute('integrity', 'sha384-v8BU367qNbs/aIZIxuivaU55N5GPF89WBerHoGA4QTcbUjYiLQtKdrfXnqAcXyTv');
    s1.setAttribute('crossorigin', 'anonymous');
    document.getElementsByTagName("head")[0].appendChild(s1);

    // resize the logo on scroll
    $(window).scroll(function() {
        let scroll = $(window).scrollTop();

        if (scroll >= 60) {
            $(".navbar").addClass("scrolled");
        } else {
            $(".navbar").removeClass("scrolled");
        }
    });

    // detect webp and set scrolling
    // does this browser support webp?
	let awp = false; // after webp detection.
	try {
		let iwp = new Image();
		iwp.onload = function() { afterWebp(iwp.height > 0) };
		iwp.onerror = function() { afterWebp(false) };
		iwp.src='data:image/webp;base64,UklGRjoAAABXRUJQVlA4IC4AAACyAgCdASoCAAIALmk0mk0iIiIiIgBoSygABc6WWgAA/veff/0PP8bA//LwYAAA';
	} catch (e) {
		afterWebp(false);
    }
    function afterWebp(wp) {
		if (awp) {
			return;
		}
        awp = true;
        // we let everybody else know with this
        // class on body.  either 'webp' or 'no-webp'.
        document.body.classList.add(wp ? 'webp' : 'no-webp');
    }
    
    // set copyright year in footer.
    let cy = document.getElementById('copyright-year');
    if (cy) {
        cy.innerHTML = (new Date()).getUTCFullYear();
    }
})();



</script>
</html>
