PageSourceSearch

https://wildbills.com/elementor-22360/

html wildbills.com collected 2026-10-05 19:19:26 UTC 318,876 bytes, 6,339 lines download raw bytes

1<!doctype html>
2<html lang="en-US" prefix="og: https://ogp.me/ns#">
3<head>
4	<meta charset="UTF-8">
5	<meta name="viewport" content="width=device-width, initial-scale=1">
6	<link rel="profile" href="https://gmpg.org/xfn/11">
7		
8<!-- Search Engine Optimization by Rank Math PRO - https://rankmath.com/ -->
9<title>Event Quote Form / WildBills.com Portland, OR</title>
10<meta name="description" content="Event Quote Form from WildBills.com; Portland&#039;s top choice for event and casino party rentals since 1982. Serving the community with exceptional service and quality events. Join our family in providing unforgettable experiences in Clackamas and surrounding areas."/>
11<meta name="robots" content="follow, index, max-snippet:-1, max-video-preview:-1, max-image-preview:large"/>
12<link rel="canonical" href="https://wildbills.com/elementor-22360/" />
13<meta property="og:locale" content="en_US" />
14<meta property="og:type" content="article" />
15<meta property="og:title" content="Event Quote Form / WildBills.com Portland, OR" />
16<meta property="og:description" content="Event Quote Form from WildBills.com; Portland&#039;s top choice for event and casino party rentals since 1982. Serving the community with exceptional service and quality events. Join our family in providing unforgettable experiences in Clackamas and surrounding areas." />
17<meta property="og:url" content="https://wildbills.com/elementor-22360/" />
18<meta property="og:site_name" content="WildBills.com" />
19<meta property="article:publisher" content="https://www.facebook.com/WildBillsNW" />
20<meta property="article:author" content="https://www.facebook.com/jesse.zegar" />
21<meta property="og:updated_time" content="2026-09-03T14:26:26-07:00" />
22<meta property="fb:admins" content="100056050615550" />
23<meta name="twitter:card" content="summary_large_image" />
24<meta name="twitter:title" content="Event Quote Form / WildBills.com Portland, OR" />
25<meta name="twitter:description" content="Event Quote Form from WildBills.com; Portland&#039;s top choice for event and casino party rentals since 1982. Serving the community with exceptional service and quality events. Join our family in providing unforgettable experiences in Clackamas and surrounding areas." />
26<meta name="twitter:label1" content="Time to read" />
27<meta name="twitter:data1" content="Less than a minute" />
28<script type="application/ld+json" class="rank-math-schema-pro">{"@context":"https://schema.org","@graph":[{"@type":"BreadcrumbList","@id":"https://wildbills.com/elementor-22360/#breadcrumb","itemListElement":[{"@type":"ListItem","position":"1","item":{"@id":"https://wildbills.com","name":"Home"}},{"@type":"ListItem","position":"2","item":{"@id":"https://wildbills.com/elementor-22360/","name":"Event quote form"}}]}]}</script>
28
29<!-- /Rank Math WordPress SEO plugin -->
30
31<link rel='dns-prefetch' href='//cdnjs.cloudflare.com' />
32<link rel="alternate" type="application/rss+xml" title="WildBills.com Portland, OR &raquo; Feed" href="https://wildbills.com/feed/" />
33<link rel="alternate" type="application/rss+xml" title="WildBills.com Portland, OR &raquo; Comments Feed" href="https://wildbills.com/comments/feed/" />
34<link rel="alternate" title="oEmbed (JSON)" type="application/json+oembed" href="https://wildbills.com/wp-json/oembed/1.0/embed?url=https%3A%2F%2Fwildbills.com%2Felementor-22360%2F" />
35<link rel="alternate" title="oEmbed (XML)" type="text/xml+oembed" href="https://wildbills.com/wp-json/oembed/1.0/embed?url=https%3A%2F%2Fwildbills.com%2Felementor-22360%2F&#038;format=xml" />
36<style id="wp-img-auto-sizes-contain-inline-css">
37img:is([sizes=auto i],[sizes^="auto," i]){contain-intrinsic-size:3000px 1500px}
38/*# sourceURL=wp-img-auto-sizes-contain-inline-css */
39</style>
40<style id="classic-theme-styles-inline-css">
41/*! This file is auto-generated */
42.wp-block-button__link{color:#fff;background-color:#32373c;border-radius:9999px;box-shadow:none;text-decoration:none;padding:calc(.667em + 2px) calc(1.333em + 2px);font-size:1.125em}.wp-block-file__button{background:#32373c;color:#fff;text-decoration:none}
43/*# sourceURL=/wp-includes/css/classic-themes.min.css */
44</style>
45<style id="rank-math-related-posts-style-inline-css">
46.wp-block-rank-math-related-posts{--rm-related-gap: 1rem;--rm-related-border-radius: 6px;--rm-related-card-padding: 16px;--rm-related-hover-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);--rm-related-transition: 0.2s ease}.wp-block-rank-math-related-posts.rank-math-related-posts{display:block}.wp-block-rank-math-related-posts.rank-math-related-posts .rank-math-related-wrap{display:grid;gap:var(--rm-related-gap)}.wp-block-rank-math-related-posts.rank-math-related-posts.is-style-grid-vertical .rank-math-related-wrap,.wp-block-rank-math-related-posts.rank-math-related-posts.rank-math-related-grid-vertical .rank-math-related-wrap{grid-template-columns:repeat(auto-fill, minmax(220px, 1fr))}.wp-block-rank-math-related-posts.rank-math-related-posts.is-style-grid-horizontal .rank-math-related-wrap,.wp-block-rank-math-related-posts.rank-math-related-posts.rank-math-related-grid-horizontal .rank-math-related-wrap{grid-template-columns:repeat(auto-fill, minmax(400px, 1fr))}.wp-block-rank-math-related-posts.rank-math-related-posts.is-style-grid-horizontal .rank-math-related-item,.wp-block-rank-math-related-posts.rank-math-related-posts.rank-math-related-grid-horizontal .rank-math-related-item{display:flex;gap:16px;align-items:flex-start}.wp-block-rank-math-related-posts.rank-math-related-posts.is-style-grid-horizontal .rank-math-related-thumb,.wp-block-rank-math-related-posts.rank-math-related-posts.rank-math-related-grid-horizontal .rank-math-related-thumb{flex:0 0 140px;overflow:hidden}.wp-block-rank-math-related-posts.rank-math-related-posts.is-style-grid-horizontal .rank-math-related-thumb img,.wp-block-rank-math-related-posts.rank-math-related-posts.rank-math-related-grid-horizontal .rank-math-related-thumb img{width:140px;height:140px;-o-object-fit:cover;object-fit:cover}.wp-block-rank-math-related-posts.rank-math-related-posts.is-style-grid-horizontal .rank-math-related-content,.wp-block-rank-math-related-posts.rank-math-related-posts.rank-math-related-grid-horizontal .rank-math-related-content{flex:1;min-width:0;display:flex;flex-direction:column}.wp-block-rank-math-related-posts.rank-math-related-posts.is-style-grid-horizontal .rank-math-related-title,.wp-block-rank-math-related-posts.rank-math-related-posts.rank-math-related-grid-horizontal .rank-math-related-title{margin-top:0}@media (max-width: 640px){.wp-block-rank-math-related-posts.rank-math-related-posts.is-style-grid-horizontal .rank-math-related-wrap,.wp-block-rank-math-related-posts.rank-math-related-posts.rank-math-related-grid-horizontal .rank-math-related-wrap{grid-template-columns:1fr}.wp-block-rank-math-related-posts.rank-math-related-posts.is-style-grid-horizontal .rank-math-related-thumb,.wp-block-rank-math-related-posts.rank-math-related-posts.rank-math-related-grid-horizontal .rank-math-related-thumb{flex:0 0 100px}.wp-block-rank-math-related-posts.rank-math-related-posts.is-style-grid-horizontal .rank-math-related-thumb img,.wp-block-rank-math-related-posts.rank-math-related-posts.rank-math-related-grid-horizontal .rank-math-related-thumb img{width:100px;height:100px}}.wp-block-rank-math-related-posts.rank-math-related-posts.is-style-list-vertical .rank-math-related-wrap,.wp-block-rank-math-related-posts.rank-math-related-posts.rank-math-related-list-vertical .rank-math-related-wrap{grid-template-columns:1fr}.wp-block-rank-math-related-posts.rank-math-related-posts.is-style-list-horizontal .rank-math-related-wrap,.wp-block-rank-math-related-posts.rank-math-related-posts.rank-math-related-list-horizontal .rank-math-related-wrap{grid-template-columns:1fr}.wp-block-rank-math-related-posts.rank-math-related-posts.is-style-list-horizontal .rank-math-related-item,.wp-block-rank-math-related-posts.rank-math-related-posts.rank-math-related-list-horizontal .rank-math-related-item{display:flex;gap:20px;align-items:flex-start}.wp-block-rank-math-related-posts.rank-math-related-posts.is-style-list-horizontal .rank-math-related-thumb,.wp-block-rank-math-related-posts.rank-math-related-posts.rank-math-related-list-horizontal .rank-math-related-thumb{flex:0 0 180px;overflow:hidden}.wp-block-rank-math-related-posts.rank-math-related-posts.is-style-list-horizontal .rank-math-related-thumb img,.wp-block-rank-math-related-posts.rank-math-related-posts.rank-math-related-list-horizontal .rank-math-related-thumb img{width:180px;height:180px;-o-object-fit:cover;object-fit:cover}.wp-block-rank-math-related-posts.rank-math-related-posts.is-style-list-horizontal .rank-math-related-content,.wp-block-rank-math-related-posts.rank-math-related-posts.rank-math-related-list-horizontal .rank-math-related-content{flex:1;min-width:0;display:flex;flex-direction:column}.wp-block-rank-math-related-posts.rank-math-related-posts.is-style-list-horizontal .rank-math-related-title,.wp-block-rank-math-related-posts.rank-math-related-posts.rank-math-related-list-horizontal .rank-math-related-title{margin-top:0}@media (max-width: 640px){.wp-block-rank-math-related-posts.rank-math-related-posts.is-style-list-horizontal .rank-math-related-item,.wp-block-rank-math-related-posts.rank-math-related-posts.rank-math-related-list-horizontal .rank-math-related-item{gap:16px}.wp-block-rank-math-related-posts.rank-math-related-posts.is-style-list-horizontal .rank-math-related-thumb,.wp-block-rank-math-related-posts.rank-math-related-posts.rank-math-related-list-horizontal .rank-math-related-thumb{flex:0 0 120px}.wp-block-rank-math-related-posts.rank-math-related-posts.is-style-list-horizontal .rank-math-related-thumb img,.wp-block-rank-math-related-posts.rank-math-related-posts.rank-math-related-list-horizontal .rank-math-related-thumb img{width:120px;height:120px}}@media (max-width: 480px){.wp-block-rank-math-related-posts.rank-math-related-posts.is-style-list-horizontal .rank-math-related-item,.wp-block-rank-math-related-posts.rank-math-related-posts.rank-math-related-list-horizontal .rank-math-related-item{flex-direction:column}.wp-block-rank-math-related-posts.rank-math-related-posts.is-style-list-horizontal .rank-math-related-thumb,.wp-block-rank-math-related-posts.rank-math-related-posts.rank-math-related-list-horizontal .rank-math-related-thumb{flex:0 0 auto;width:100%}.wp-block-rank-math-related-posts.rank-math-related-posts.is-style-list-horizontal .rank-math-related-thumb img,.wp-block-rank-math-related-posts.rank-math-related-posts.rank-math-related-list-horizontal .rank-math-related-thumb img{width:100%;height:auto;max-height:200px}}.wp-block-rank-math-related-posts.rank-math-related-posts .rank-math-related-item{border-radius:var(--rm-related-border-radius);padding:var(--rm-related-card-padding);background:inherit;transition:transform var(--rm-related-transition),box-shadow var(--rm-related-transition)}.wp-block-rank-math-related-posts.rank-math-related-posts .rank-math-related-item:hover{transform:translateY(-2px);box-shadow:var(--rm-related-hover-shadow)}.wp-block-rank-math-related-posts.rank-math-related-posts .rank-math-related-title{margin:0.5rem 0;font-size:inherit;line-height:inherit}.wp-block-rank-math-related-posts.rank-math-related-posts .rank-math-related-title a{color:inherit;text-decoration:none;transition:color 0.2s ease}.wp-block-rank-math-related-posts.rank-math-related-posts .rank-math-related-title a:hover{color:#2563eb;text-decoration:underline}.wp-block-rank-math-related-posts.rank-math-related-posts .rank-math-related-title:not(:has(a)){cursor:default}.wp-block-rank-math-related-posts.rank-math-related-posts .rank-math-related-thumb{position:relative;overflow:hidden;border-radius:4px;display:block}.wp-block-rank-math-related-posts.rank-math-related-posts .rank-math-related-thumb img{display:block;width:100%;height:auto;border-radius:4px;transition:transform 0.3s ease}.wp-block-rank-math-related-posts.rank-math-related-posts .rank-math-related-thumb:hover img{transform:scale(1.05)}.wp-block-rank-math-related-posts.rank-math-related-posts .rank-math-related-thumb:not(a){cursor:default}.wp-block-rank-math-related-posts.rank-math-related-posts .rank-math-related-thumb:not(a):hover img{transform:none}.wp-block-rank-math-related-posts.rank-math-related-posts .rank-math-related-date{margin-top:0.25rem;font-size:0.85em;opacity:0.7}.wp-block-rank-math-related-posts.rank-math-related-posts .rank-math-related-terms{margin-top:0.5rem}.wp-block-rank-math-related-posts.rank-math-related-posts .rank-math-related-chip{display:inline-block;background:#f3f4f6;border:1px solid #e5e7eb;border-radius:999px;padding:0.15rem 0.5rem;margin-right:0.35rem;font-size:0.8em}.wp-block-rank-math-related-posts.rank-math-related-posts .rank-math-related-excerpt{margin-top:0.5rem;color:inherit;opacity:0.8;font-size:0.9em;line-height:1.6;
46display:-webkit-box;-webkit-line-clamp:3;line-clamp:3;-webkit-box-orient:vertical;overflow:hidden}.wp-block-rank-math-related-posts.rank-math-related-posts .rank-math-related-more{margin-top:1rem}.wp-block-rank-math-related-posts.rank-math-related-posts .rank-math-related-button{display:inline-block;background:#111827;color:#fff;border-radius:6px;padding:0.625rem 1.25rem;text-decoration:none;font-weight:500;transition:background 0.2s ease, transform 0.2s ease}.wp-block-rank-math-related-posts.rank-math-related-posts .rank-math-related-button:hover{background:#1f2937;transform:translateY(-1px)}.wp-block-rank-math-related-posts.has-border-color .rank-math-related-item{border-color:inherit}.wp-block-rank-math-related-posts.has-border-width .rank-math-related-item{border-width:inherit}.wp-block-rank-math-related-posts.has-border-style .rank-math-related-item{border-style:inherit}.wp-block-rank-math-related-posts.has-border-radius .rank-math-related-item{border-radius:inherit}.wp-block-rank-math-related-posts:not(.has-border-color):not(.has-border-width):not(.has-border-style) .rank-math-related-item{border:1px solid #e5e7eb}
47
48/*# sourceURL=https://wildbills.com/wp-content/plugins/seo-by-rank-math-pro/includes/modules/link-genius/blocks/related/assets/css/styles.css */
49</style>
50<style id="global-styles-inline-css">
51:root{--wp--preset--aspect-ratio--square: 1;--wp--preset--aspect-ratio--4-3: 4/3;--wp--preset--aspect-ratio--3-4: 3/4;--wp--preset--aspect-ratio--3-2: 3/2;--wp--preset--aspect-ratio--2-3: 2/3;--wp--preset--aspect-ratio--16-9: 16/9;--wp--preset--aspect-ratio--9-16: 9/16;--wp--preset--color--black: #000000;--wp--preset--color--cyan-bluish-gray: #abb8c3;--wp--preset--color--white: #ffffff;--wp--preset--color--pale-pink: #f78da7;--wp--preset--color--vivid-red: #cf2e2e;--wp--preset--color--luminous-vivid-orange: #ff6900;--wp--preset--color--luminous-vivid-amber: #fcb900;--wp--preset--color--light-green-cyan: #7bdcb5;--wp--preset--color--vivid-green-cyan: #00d084;--wp--preset--color--pale-cyan-blue: #8ed1fc;--wp--preset--color--vivid-cyan-blue: #0693e3;--wp--preset--color--vivid-purple: #9b51e0;--wp--preset--gradient--vivid-cyan-blue-to-vivid-purple: linear-gradient(135deg,rgb(6,147,227) 0%,rgb(155,81,224) 100%);--wp--preset--gradient--light-green-cyan-to-vivid-green-cyan: linear-gradient(135deg,rgb(122,220,180) 0%,rgb(0,208,130) 100%);--wp--preset--gradient--luminous-vivid-amber-to-luminous-vivid-orange: linear-gradient(135deg,rgb(252,185,0) 0%,rgb(255,105,0) 100%);--wp--preset--gradient--luminous-vivid-orange-to-vivid-red: linear-gradient(135deg,rgb(255,105,0) 0%,rgb(207,46,46) 100%);--wp--preset--gradient--very-light-gray-to-cyan-bluish-gray: linear-gradient(135deg,rgb(238,238,238) 0%,rgb(169,184,195) 100%);
51--wp--preset--gradient--cool-to-warm-spectrum: linear-gradient(135deg,rgb(74,234,220) 0%,rgb(151,120,209) 20%,rgb(207,42,186) 40%,rgb(238,44,130) 60%,rgb(251,105,98) 80%,rgb(254,248,76) 100%);--wp--preset--gradient--blush-light-purple: linear-gradient(135deg,rgb(255,206,236) 0%,rgb(152,150,240) 100%);--wp--preset--gradient--blush-bordeaux: linear-gradient(135deg,rgb(254,205,165) 0%,rgb(254,45,45) 50%,rgb(107,0,62) 100%);--wp--preset--gradient--luminous-dusk: linear-gradient(135deg,rgb(255,203,112) 0%,rgb(199,81,192) 50%,rgb(65,88,208) 100%);--wp--preset--gradient--pale-ocean: linear-gradient(135deg,rgb(255,245,203) 0%,rgb(182,227,212) 50%,rgb(51,167,181) 100%);--wp--preset--gradient--electric-grass: linear-gradient(135deg,rgb(202,248,128) 0%,rgb(113,206,126) 100%);--wp--preset--gradient--midnight: linear-gradient(135deg,rgb(2,3,129) 0%,rgb(40,116,252) 100%);--wp--preset--font-size--small: 13px;--wp--preset--font-size--medium: 20px;--wp--preset--font-size--large: 36px;--wp--preset--font-size--x-large: 42px;--wp--preset--spacing--20: 0.44rem;--wp--preset--spacing--30: 0.67rem;--wp--preset--spacing--40: 1rem;--wp--preset--spacing--50: 1.5rem;--wp--preset--spacing--60: 2.25rem;--wp--preset--spacing--70: 3.38rem;--wp--preset--spacing--80: 5.06rem;--wp--preset--shadow--natural: 6px 6px 9px rgba(0, 0, 0, 0.2);--wp--preset--shadow--deep: 12px 12px 50px rgba(0, 0, 0, 0.4);--wp--preset--shadow--sharp: 6px 6px 0px rgba(0, 0, 0, 0.2);--wp--preset--shadow--outlined: 6px 6px 0px -3px rgb(255, 255, 255), 6px 6px rgb(0, 0, 0);--wp--preset--shadow--crisp: 6px 6px 0px rgb(0, 0, 0);}.wp-block-button{--wp--preset--dimension--25: 25%;--wp--preset--dimension--50: 50%;--wp--preset--dimension--75: 75%;--wp--preset--dimension--100: 100%;}:where(body) { margin: 0; }:where(.is-layout-flex){gap: 0.5em;}:where(.is-layout-grid){gap: 0.5em;}body .is-layout-flex{display: flex;}.is-layout-flex{flex-wrap: wrap;align-items: center;}.is-layout-flex > :is(*, div){margin: 0;}body .is-layout-grid{display: grid;}.is-layout-grid > :is(*, div){margin: 0;}body{padding-top: 0px;padding-right: 0px;padding-bottom: 0px;padding-left: 0px;}:root :where(.wp-element-button, .wp-block-button__link){background-color: #32373c;border-width: 0;color: #fff;font-family: inherit;font-size: inherit;font-style: inherit;font-weight: inherit;letter-spacing: inherit;line-height: inherit;padding-top: calc(0.667em + 2px);padding-right: calc(1.333em + 2px);padding-bottom: calc(0.667em + 2px);padding-left: calc(1.333em + 2px);text-decoration: none;text-transform: inherit;}.has-black-color{color: var(--wp--preset--color--black) !important;}.has-cyan-bluish-gray-color{color: var(--wp--preset--color--cyan-bluish-gray) !important;}.has-white-color{color: var(--wp--preset--color--white) !important;}.has-pale-pink-color{color: var(--wp--preset--color--pale-pink) !important;}.has-vivid-red-color{color: var(--wp--preset--color--vivid-red) !important;}.has-luminous-vivid-orange-color{color: var(--wp--preset--color--luminous-vivid-orange) !important;}.has-luminous-vivid-amber-color{color: var(--wp--preset--color--luminous-vivid-amber) !important;}.has-light-green-cyan-color{color: var(--wp--preset--color--light-green-cyan) !important;}.has-vivid-green-cyan-color{color: var(--wp--preset--color--vivid-green-cyan) !important;}.has-pale-cyan-blue-color{color: var(--wp--preset--color--pale-cyan-blue) !important;}.has-vivid-cyan-blue-color{color: var(--wp--preset--color--vivid-cyan-blue) !important;}.has-vivid-purple-color{color: var(--wp--preset--color--vivid-purple) !important;}.has-black-background-color{background-color: var(--wp--preset--color--black) !important;}.has-cyan-bluish-gray-background-color{background-color: var(--wp--preset--color--cyan-bluish-gray) !important;}.has-white-background-color{background-color: var(--wp--preset--color--white) !important;}.has-pale-pink-background-color{background-color: var(--wp--preset--color--pale-pink) !important;}.has-vivid-red-background-color{background-color: var(--wp--preset--color--vivid-red) !important;}.has-luminous-vivid-orange-background-color{background-color: var(--wp--preset--color--luminous-vivid-orange) !important;}.has-luminous-vivid-amber-background-color{background-color: var(--wp--preset--color--luminous-vivid-amber) !important;}.has-light-green-cyan-background-color{background-color: var(--wp--preset--color--light-green-cyan) !important;}.has-vivid-green-cyan-background-color{background-color: var(--wp--preset--color--vivid-green-cyan) !important;}.has-pale-cyan-blue-background-color{background-color: var(--wp--preset--color--pale-cyan-blue) !important;}.has-vivid-cyan-blue-background-color{background-color: var(--wp--preset--color--vivid-cyan-blue) !important;}.has-vivid-purple-background-color{background-color: var(--wp--preset--color--vivid-purple) !important;}.has-black-border-color{border-color: var(--wp--preset--color--black) !important;}.has-cyan-bluish-gray-border-color{border-color: var(--wp--preset--color--cyan-bluish-gray) !important;}.has-white-border-color{border-color: var(--wp--preset--color--white) !important;}.has-pale-pink-border-color{border-color: var(--wp--preset--color--pale-pink) !important;}.has-vivid-red-border-color{border-color: var(--wp--preset--color--vivid-red) !important;}.has-luminous-vivid-orange-border-color{border-color: var(--wp--preset--color--luminous-vivid-orange) !important;}.has-luminous-vivid-amber-border-color{border-color: var(--wp--preset--color--luminous-vivid-amber) !important;}.has-light-green-cyan-border-color{border-color: var(--wp--preset--color--light-green-cyan) !important;}.has-vivid-green-cyan-border-color{border-color: var(--wp--preset--color--vivid-green-cyan) !important;}.has-pale-cyan-blue-border-color{border-color: var(--wp--preset--color--pale-cyan-blue) !important;}.has-vivid-cyan-blue-border-color{border-color: var(--wp--preset--color--vivid-cyan-blue) !important;}.has-vivid-purple-border-color{border-color: var(--wp--preset--color--vivid-purple) !important;}.has-vivid-cyan-blue-to-vivid-purple-gradient-background{background: var(--wp--preset--gradient--vivid-cyan-blue-to-vivid-purple) !important;}.has-light-green-cyan-to-vivid-green-cyan-gradient-background{background: var(--wp--preset--gradient--light-green-cyan-to-vivid-green-cyan) !important;}.has-luminous-vivid-amber-to-luminous-vivid-orange-gradient-background{background: var(--wp--preset--gradient--luminous-vivid-amber-to-luminous-vivid-orange) !important;}.has-luminous-vivid-orange-to-vivid-red-gradient-background{background: var(--wp--preset--gradient--luminous-vivid-orange-to-vivid-red) !important;}
51.has-very-light-gray-to-cyan-bluish-gray-gradient-background{background: var(--wp--preset--gradient--very-light-gray-to-cyan-bluish-gray) !important;}.has-cool-to-warm-spectrum-gradient-background{background: var(--wp--preset--gradient--cool-to-warm-spectrum) !important;}.has-blush-light-purple-gradient-background{background: var(--wp--preset--gradient--blush-light-purple) !important;}.has-blush-bordeaux-gradient-background{background: var(--wp--preset--gradient--blush-bordeaux) !important;}.has-luminous-dusk-gradient-background{background: var(--wp--preset--gradient--luminous-dusk) !important;}.has-pale-ocean-gradient-background{background: var(--wp--preset--gradient--pale-ocean) !important;}.has-electric-grass-gradient-background{background: var(--wp--preset--gradient--electric-grass) !important;}.has-midnight-gradient-background{background: var(--wp--preset--gradient--midnight) !important;}.has-small-font-size{font-size: var(--wp--preset--font-size--small) !important;}.has-medium-font-size{font-size: var(--wp--preset--font-size--medium) !important;}.has-large-font-size{font-size: var(--wp--preset--font-size--large) !important;}.has-x-large-font-size{font-size: var(--wp--preset--font-size--x-large) !important;}
52:root :where(.wp-block-icon svg){width: 24px;}
53:where(.wp-block-gallery.is-layout-flex){gap: var( --wp--style--gallery-gap-default, var( --gallery-block--gutter-size, var( --wp--style--block-gap, 0.5em ) ) );}:where(.wp-block-gallery.is-layout-grid){gap: var( --wp--style--gallery-gap-default, var( --gallery-block--gutter-size, var( --wp--style--block-gap, 0.5em ) ) );}
54:where(.wp-block-latest-posts.is-layout-flex){gap: 1.25em;}:where(.wp-block-latest-posts.is-layout-grid){gap: 1.25em;}
55:where(.wp-block-post-template.is-layout-flex){gap: 1.25em;}:where(.wp-block-post-template.is-layout-grid){gap: 1.25em;}
56:where(.wp-block-term-template.is-layout-flex){gap: 1.25em;}:where(.wp-block-term-template.is-layout-grid){gap: 1.25em;}
57:where(.wp-block-columns.is-layout-flex){gap: 2em;}:where(.wp-block-columns.is-layout-grid){gap: 2em;}
58:root :where(.wp-block-pullquote){font-size: 1.5em;line-height: 1.6;}
59/*# sourceURL=global-styles-inline-css */
60</style>
61<link rel='stylesheet' id='io_styles-css' href='https://wildbills.com/wp-content/plugins/inflatableoffice/io_styles_v6.css?ver=7.1.2' media='all' />
62<link rel='stylesheet' id='font-awesome-css' href='https://wildbills.com/wp-content/plugins/elementor/assets/lib/font-awesome/css/font-awesome.min.css?ver=4.7.0' media='all' />
63<link rel='stylesheet' id='datepicker_css-css' href='https://wildbills.com/wp-content/plugins/inflatableoffice/jquery.datepicker.css?ver=7.1.2' media='all' />
64<link rel='stylesheet' id='timePicker_css-css' href='https://wildbills.com/wp-content/plugins/inflatableoffice/jquery.timepicker.css?ver=7.1.2' media='all' />
65<link rel='stylesheet' id='fancyBox_css-css' href='https://wildbills.com/wp-content/plugins/inflatableoffice/jquery.fancybox.css?ver=7.1.2' media='all' />
66<link rel='stylesheet' id='slick-carousel-css-css' href='https://cdnjs.cloudflare.com/ajax/libs/slick-carousel/1.8.1/slick.min.css?ver=7.1.2' media='all' />
67<link rel='stylesheet' id='slick-carousel-theme-css-css' href='https://cdnjs.cloudflare.com/ajax/libs/slick-carousel/1.8.1/slick-theme.min.css?ver=7.1.2' media='all' />
68<link rel='stylesheet' id='dashicons-css' href='https://wildbills.com/wp-includes/css/dashicons.min.css?ver=7.1.2' media='all' />
69<link rel='stylesheet' id='megamenu-css' href='https://wildbills.com/wp-content/uploads/maxmegamenu/style.css?ver=2cbef1' media='all' />
70<link rel='stylesheet' id='grw-public-main-css-css' href='https://wildbills.com/wp-content/plugins/widget-google-reviews/assets/7.1.5/css/public-main.css' media='all' />
71<link rel='stylesheet' id='elementor-hello-theme-style-css' href='https://wildbills.com/wp-content/themes/io-kenos/style.css?ver=7.1.2' media='all' />
72<link rel='stylesheet' id='e-animation-shrink-css' href='https://wildbills.com/wp-content/plugins/elementor/assets/lib/animations/styles/e-animation-shrink.min.css?ver=4.3.3' media='all' />
73<link rel='stylesheet' id='elementor-frontend-css' href='https://wildbills.com/wp-content/plugins/elementor/assets/css/frontend.min.css?ver=4.3.3' media='all' />
74<link rel='stylesheet' id='widget-image-css' href='https://wildbills.com/wp-content/plugins/elementor/assets/css/widget-image.min.css?ver=4.3.3' media='all' />
75<link rel='stylesheet' id='widget-search-form-css' href='https://wildbills.com/wp-content/plugins/elementor-pro/assets/css/widget-search-form.min.css?ver=4.3.1' media='all' />
76<link rel='stylesheet' id='elementor-icons-shared-0-css' href='https://wildbills.com/wp-content/plugins/elementor/assets/lib/font-awesome/css/fontawesome.min.css?ver=5.15.3' media='all' />
77<link rel='stylesheet' id='elementor-icons-fa-solid-css' href='https://wildbills.com/wp-content/plugins/elementor/assets/lib/font-awesome/css/solid.min.css?ver=5.15.3' media='all' />
78<link rel='stylesheet' id='widget-icon-list-css' href='https://wildbills.com/wp-content/plugins/elementor/assets/css/widget-icon-list.min.css?ver=4.3.3' media='all' />
79<link rel='stylesheet' id='widget-nav-menu-css' href='https://wildbills.com/wp-content/plugins/elementor-pro/assets/css/widget-nav-menu.min.css?ver=4.3.1' media='all' />
80<link rel='stylesheet' id='widget-heading-css' href='https://wildbills.com/wp-content/plugins/elementor/assets/css/widget-heading.min.css?ver=4.3.3' media='all' />
81<link rel='stylesheet' id='widget-social-icons-css' href='https://wildbills.com/wp-content/plugins/elementor/assets/css/widget-social-icons.min.css?ver=4.3.3' media='all' />
82<link rel='stylesheet' id='e-apple-webkit-css' href='https://wildbills.com/wp-content/plugins/elementor/assets/css/conditionals/apple-webkit.min.css?ver=4.3.3' media='all' />
83<link rel='stylesheet' id='elementor-icons-css' href='https://wildbills.com/wp-content/plugins/elementor/assets/lib/eicons/css/elementor-icons.min.css?ver=5.54.0' media='all' />
84<link rel='stylesheet' id='elementor-post-812-css' href='https://wildbills.com/wp-content/uploads/elementor/css/post-812.css?ver=1791195601' media='all' />
85<link rel='stylesheet' id='widget-form-css' href='https://wildbills.com/wp-content/plugins/elementor-pro/assets/css/widget-form.min.css?ver=4.3.1' media='all' />
86<link rel='stylesheet' id='elementor-post-22360-css' href='https://wildbills.com/wp-content/uploads/elementor/css/post-22360.css?ver=1791201216' media='all' />
87<link rel='stylesheet' id='elementor-post-6691-css' href='https://wildbills.com/wp-content/uploads/elementor/css/post-6691.css?ver=1791195602' media='all' />
88<link rel='stylesheet' id='elementor-post-6692-css' href='https://wildbills.com/wp-content/uploads/elementor/css/post-6692.css?ver=1791195602' media='all' />
89<link rel='stylesheet' id='searchio-live-search-css' href='https://wildbills.com/wp-content/plugins/inflatableoffice/search_widget/assets/styles/style.css?ver=1.6.1' media='all' />
90<link rel='stylesheet' id='elementor-gf-local-poppins-css' href='https://wildbills.com/wp-content/uploads/elementor/google-fonts/css/poppins.css?ver=1742249396' media='all' />
91<link rel='stylesheet' id='elementor-gf-local-roboto-css' href='https://wildbills.com/wp-content/uploads/elementor/google-fonts/css/roboto.css?ver=1742240937' media='all' />
92<link rel='stylesheet' id='elementor-gf-local-permanentmarker-css' href='https://wildbills.com/wp-content/uploads/elementor/google-fonts/css/permanentmarker.css?ver=1742240937' media='all' />
93<link rel='stylesheet' id='elementor-icons-fa-brands-css' href='https://wildbills.com/wp-content/plugins/elementor/assets/lib/font-awesome/css/brands.min.css?ver=5.15.3' media='all' />
94<script id="jquery-core-js" src="https://wildbills.com/wp-includes/js/jquery/jquery.min.js?ver=3.7.1"></script>
vendor: 1 bytes, line 94
94
95<script id="jquery-migrate-js" src="https://wildbills.com/wp-includes/js/jquery/jquery-migrate.min.js?ver=3.4.1"></script>
vendor: 1 bytes, line 95
95
96<script id="simpleCart-js" src="https://wildbills.com/wp-content/plugins/inflatableoffice/simpleCart_v9.js?ver=7.1.2"></script>
vendor: 1 bytes, line 96
96
97<script id="timePicker-js" src="https://wildbills.com/wp-content/plugins/inflatableoffice/jquery.timepicker.1_8_1.js?ver=7.1.2"></script>
vendor: 1 bytes, line 97
97
98<script id="fancyBox-js" src="https://wildbills.com/wp-content/plugins/inflatableoffice/jquery.fancybox.js?ver=7.1.2"></script>
vendor: 1 bytes, line 98
98
99<script id="flickity-js" src="https://wildbills.com/wp-content/plugins/inflatableoffice/flickity.js?ver=7.1.2"></script>
vendor: 1 bytes, line 99
99
100<script id="widget-TentCalcJS-js" src="https://wildbills.com/wp-content/plugins/inflatableoffice/widget-TentCalculator.js?ver=7.1.2"></script>
vendor: 1 bytes, line 100
100
101<script id="grw-public-main-js-js" defer="defer" src="https://wildbills.com/wp-content/plugins/widget-google-reviews/assets/7.1.5/js/public-main.js"></script>
vendor: 1 bytes, line 101
101
102<script id="io-scripts-js-extra">
103var io_scripts_vars = {"io_username":"kczegar","io_locationid":"42326","io_phonenumber":"(503) 723-8300","io_emailaddress":"[email protected]","io_businesshours":"","io_facebooklink":"https://www.facebook.com/","io_twitterlink":"https://twitter.com/","io_instagramlink":"https://www.instagram.com/","io_youtubelink":"","io_fpnumber":"","io_companyname":"WildBills.com Portland, OR"};
104//# sourceURL=io-scripts-js-extra
105</script>
vendor: 1 bytes, line 105
105
106<script id="io-scripts-js" src="https://wildbills.com/wp-content/themes/io-kenos/js/io-scripts.js?ver=7.1.2"></script>
106
107<link rel="https://api.w.org/" href="https://wildbills.com/wp-json/" /><link rel="alternate" title="JSON" type="application/json" href="https://wildbills.com/wp-json/wp/v2/pages/22360" /><link rel="EditURI" type="application/rsd+xml" title="RSD" href="https://wildbills.com/xmlrpc.php?rsd" />
108
109<link rel='shortlink' href='https://wildbills.com/?p=22360' />
110<!-- HFCM by 99 Robots - Snippet # 1: Head Imports -->
111<link rel="stylesheet" href="https://resources.swd-hosting.com/io/assets/wildbills/styles.css">
112<!-- /end HFCM by 99 Robots -->
113<!-- HFCM by 99 Robots - Snippet # 3: FB OG -->
114<meta property="og:image" content="https://wildbills.com/wp-content/uploads/2024/06/WB-FB-Icon.jpg">
115<meta property="og:description" content="Event & Casino Party Rentals from Wild Bill's, Portland's Event and Casino Party Rentals!">
116<meta property="og:url" content="https://wildbills.com">
117<meta property="og:title" content="Portland's Event and Casino Party Rentals Specialists">
118<meta property="og:image:alt" content="Portland's Event and Casino Party Rentals Pros">
119<meta property="og:type" content="website">
120<!-- /end HFCM by 99 Robots -->
121<!-- Google Tag Manager -->
122<script>
vendor: 327 bytes, lines 122-126
122(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start':
123new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0],
124j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src=
125'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f);
126})(window,document,'script','dataLayer','
126GTM-NBZ43ZRD
vendor: 3 bytes, line 126
126');
126</script>
126
127<!-- End Google Tag Manager -->
128
129<!-- Global site tag (gtag.js) - Google Analytics -->
vendor: 64 bytes, lines 129-130
129
130<script async src="https://www.googletagmanager.com/gtag/js?id=
130UA-84296469-1
vendor: 12 bytes, line 130
130"></script>
131<script>
132  
vendor: 134 bytes, lines 132-136
132window.dataLayer = window.dataLayer || [];
133  function gtag(){dataLayer.push(arguments);}
134  gtag('js', new Date());
135
136  gtag('config', '
136UA-84296469-1
vendor: 6 bytes, lines 136-137
136');
137  
137gtag('config', 'AW-921594019'); 
138</script>
138
139<!-- Facebook Pixel Code -->
140<script>
vendor: 417 bytes, lines 140-149
140
141  !function(f,b,e,v,n,t,s)
142  {if(f.fbq)return;n=f.fbq=function(){n.callMethod?
143  n.callMethod.apply(n,arguments):n.queue.push(arguments)};
144  if(!f._fbq)f._fbq=n;n.push=n;n.loaded=!0;n.version='2.0';
145  n.queue=[];t=b.createElement(e);t.async=!0;
146  t.src=v;s=b.getElementsByTagName(e)[0];
147  s.parentNode.insertBefore(t,s)}(window, document,'script',
148  'https://connect.facebook.net/en_US/fbevents.js');
149  fbq('init', '
149305674077125750
vendor: 32 bytes, lines 149-150
149');
150  fbq('track', 'PageView');
151</script>
151
152<noscript><img height="1" width="1" style="display:none"
153  src="https://www.facebook.com/tr?id=305674077125750&ev=PageView&noscript=1"
154/></noscript>
155<!-- End Facebook Pixel Code --><meta name="generator" content="Elementor 4.3.3; features: additional_custom_breakpoints; settings: css_print_method-external, google_font-enabled, font_display-auto">
156			<style>
157				.e-con.e-parent:nth-of-type(n+4):not(.e-lazyloaded):not(.e-no-lazyload),
158				.e-con.e-parent:nth-of-type(n+4):not(.e-lazyloaded):not(.e-no-lazyload) * {
159					background-image: none !important;
160				}
161				@media screen and (max-height: 1024px) {
162					.e-con.e-parent:nth-of-type(n+3):not(.e-lazyloaded):not(.e-no-lazyload),
163					.e-con.e-parent:nth-of-type(n+3):not(.e-lazyloaded):not(.e-no-lazyload) * {
164						background-image: none !important;
165					}
166				}
167				@media screen and (max-height: 640px) {
168					.e-con.e-parent:nth-of-type(n+2):not(.e-lazyloaded):not(.e-no-lazyload),
169					.e-con.e-parent:nth-of-type(n+2):not(.e-lazyloaded):not(.e-no-lazyload) * {
170						background-image: none !important;
171					}
172				}
173			</style>
174			<link rel="icon" href="https://wildbills.com/wp-content/uploads/2024/06/favicon.png" sizes="32x32" />
175<link rel="icon" href="https://wildbills.com/wp-content/uploads/2024/06/favicon.png" sizes="192x192" />
176<link rel="apple-touch-icon" href="https://wildbills.com/wp-content/uploads/2024/06/favicon.png" />
177<meta name="msapplication-TileImage" content="https://wildbills.com/wp-content/uploads/2024/06/favicon.png" />
178<style id="wp-custom-css">
179.grecaptcha-badge { visibility: hidden; }
180
181.search-submit{display:none;}
182
183.cartInfo{
184	display:none !important;
185}
186.io-footer-link a {
187color: var(--e-global-color-accent, orange);
188}
189
190.catDescriptionIO.catDescriptionIO_small.elementor-widget-text-editor {
191    padding: 10px;
192    font-size: small;
193    text-align: left;
194}
195
196.io_brand {
197    margin-bottom: 20px;
198}
199</style>
200</head>
201<body class="wp-singular page-template-default page page-id-22360 wp-custom-logo wp-theme-io-kenos mega-menu-max-mega-menu-4 mega-menu-max-mega-menu-5 mega-menu-max-mega-menu-6 mega-menu-max-mega-menu-7 mega-menu-max-mega-menu-8 mega-menu-max-mega-menu-9 elementor-default elementor-kit-812 elementor-page elementor-page-22360">
202
203		<header data-elementor-type="header" data-elementor-id="6691" class="elementor elementor-6691 elementor-location-header" data-elementor-post-type="elementor_library">
204					<section class="elementor-section elementor-top-section elementor-element elementor-element-6f40f87 elementor-section-content-middle elementor-section-boxed elementor-section-height-default elementor-section-height-default" data-id="6f40f87" data-element_type="section" data-e-type="section" id="header-container">
205						<div class="elementor-container elementor-column-gap-default">
206					<div class="elementor-column elementor-col-25 elementor-top-column elementor-element elementor-element-810915d logo-part" data-id="810915d" data-element_type="column" data-e-type="column">
207			<div class="elementor-widget-wrap elementor-element-populated">
208						<div class="elementor-element elementor-element-3240690 elementor-widget elementor-widget-image" data-id="3240690" data-element_type="widget" data-e-type="widget" data-widget_type="image.default">
209				<div class="elementor-widget-container">
210																<a href="https://wildbills.com/">
211							<img fetchpriority="high" width="768" height="206" src="https://wildbills.com/wp-content/uploads/2024/02/WBlogo1-768x206.png" class="elementor-animation-shrink attachment-medium_large size-medium_large wp-image-111004" alt="Wild Bill&apos;s logo" srcset="https://wildbills.com/wp-content/uploads/2024/02/WBlogo1-768x206.png 768w, https://wildbills.com/wp-content/uploads/2024/02/WBlogo1-300x80.png 300w, https://wildbills.com/wp-content/uploads/2024/02/WBlogo1-1024x274.png 1024w, https://wildbills.com/wp-content/uploads/2024/02/WBlogo1-1536x411.png 1536w, https://wildbills.com/wp-content/uploads/2024/02/WBlogo1-2048x548.png 2048w" sizes="(max-width: 768px) 100vw, 768px" />								</a>
212															</div>
213				</div>
214					</div>
215		</div>
216				<div class="elementor-column elementor-col-50 elementor-top-column elementor-element elementor-element-2093612 middle-part" data-id="2093612" data-element_type="column" data-e-type="column">
217			<div class="elementor-widget-wrap elementor-element-populated">
218						<div class="elementor-element elementor-element-2bab22f search-part elementor-widget-mobile__width-initial elementor-search-form--skin-classic elementor-search-form--button-type-icon elementor-search-form--icon-search elementor-widget elementor-widget-search-form" data-id="2bab22f" data-element_type="widget" data-e-type="widget" id="search-container" data-settings="{&quot;skin&quot;:&quot;classic&quot;}" data-widget_type="search-form.default">
219				<div class="elementor-widget-container">
220							<search role="search">
221			<form class="elementor-search-form" action="https://wildbills.com" method="get">
222												<div class="elementor-search-form__container">
223					<label class="elementor-screen-only" for="elementor-search-form-2bab22f">Search</label>
224
225					
226					<input id="elementor-search-form-2bab22f" placeholder="Search..." class="elementor-search-form__input" type="search" name="s" value="">
227					
228											<button class="elementor-search-form__submit" type="submit" aria-label="Search">
229															<i aria-hidden="true" class="fas fa-search"></i>													</button>
230					
231									</div>
232			</form>
233		</search>
234						</div>
235				</div>
236					</div>
237		</div>
238				<div class="elementor-column elementor-col-25 elementor-top-column elementor-element elementor-element-22912db right-part elementor-hidden-mobile" data-id="22912db" data-element_type="column" data-e-type="column">
239			<div class="elementor-widget-wrap elementor-element-populated">
240						<div class="elementor-element elementor-element-1a356aa elementor-list-item-link-inline elementor-align-center elementor-icon-list--layout-traditional elementor-widget elementor-widget-icon-list" data-id="1a356aa" data-element_type="widget" data-e-type="widget" data-widget_type="icon-list.default">
241				<div class="elementor-widget-container">
242							<ul class="elementor-icon-list-items">
243							<li class="elementor-icon-list-item">
244											<a href="tel:5032240134">
245
246											<span class="elementor-icon-list-text">(503) 224-0134</span>
247											</a>
248									</li>
249						</ul>
250						</div>
251				</div>
252				<div class="elementor-element elementor-element-0c4d5b6 elementor-align-center elementor-widget elementor-widget-button" data-id="0c4d5b6" data-element_type="widget" data-e-type="widget" data-widget_type="button.default">
253				<div class="elementor-widget-container">
254									<div class="elementor-button-wrapper">
255					<a class="elementor-button elementor-button-link elementor-size-sm elementor-animation-shrink" href="https://wildbills.com/elementor-22360/">
256						<span class="elementor-button-content-wrapper">
257									<span class="elementor-button-text">Get a Quote</span>
258					</span>
259					</a>
260				</div>
261								</div>
262				</div>
263					</div>
264		</div>
265					</div>
266		</section>
267				<section class="elementor-section elementor-top-section elementor-element elementor-element-197dfcd elementor-section-boxed elementor-section-height-default elementor-section-height-default" data-id="197dfcd" data-element_type="section" data-e-type="section" id="navbar-container">
268						<div class="elementor-container elementor-column-gap-default">
269					<div class="elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-da7e91f" data-id="da7e91f" data-element_type="column" data-e-type="column">
270			<div class="elementor-widget-wrap elementor-element-populated">
271						<div class="elementor-element elementor-element-c460301 elementor-nav-menu__align-center elementor-nav-menu--dropdown-tablet elementor-nav-menu__text-align-aside elementor-nav-menu--toggle elementor-nav-menu--burger elementor-widget elementor-widget-nav-menu" data-id="c460301" data-element_type="widget" data-e-type="widget" data-settings="{&quot;layout&quot;:&quot;horizontal&quot;,&quot;submenu_icon&quot;:{&quot;value&quot;:&quot;&lt;i class=\&quot;fas fa-caret-down\&quot; aria-hidden=\&quot;true\&quot;&gt;&lt;\/i&gt;&quot;,&quot;library&quot;:&quot;fa-solid&quot;},&quot;toggle&quot;:&quot;burger&quot;}" data-widget_type="nav-menu.default">
272				<div class="elementor-widget-container">
273								<nav aria-label="Menu" class="elementor-nav-menu--main elementor-nav-menu__container elementor-nav-menu--layout-horizontal e--pointer-text e--animation-none">
274				<ul id="menu-1-c460301" class="elementor-nav-menu"><li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-home menu-item-6806"><a href="https://wildbills.com/" class="elementor-item">Home</a></li>
275<li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-has-children menu-item-6808"><a href="#" class="elementor-item elementor-item-anchor">Event Types<span class="sub-arrow"><i class="fas fa-caret-down" aria-hidden="true"></i></span></a>
276<ul class="sub-menu elementor-nav-menu--dropdown">
277	<li class="menu-item menu-item-type-post_type menu-item-object-page menu-item-21416"><a href="https://wildbills.com/casino-party/" class="elementor-sub-item">Casino Party</a></li>
278	<li class="menu-item menu-item-type-post_type menu-item-object-page menu-item-114984"><a href="https://wildbills.com/fundraisers/" class="elementor-sub-item">Fundraisers</a></li>
279	<li class="menu-item menu-item-type-post_type menu-item-object-page menu-item-14845"><a href="https://wildbills.com/company-picnic/" class="elementor-sub-item">Company Picnic</a></li>
280	<li class="menu-item menu-item-type-post_type menu-item-object-page menu-item-15354"><a href="https://wildbills.com/wedding-rentals/" class="elementor-sub-item">Wedding Rentals</a></li>
281	<li class="menu-item menu-item-type-post_type menu-item-object-page menu-item-15360"><a href="https://wildbills.com/holiday/" class="elementor-sub-item">Holiday Party</a></li>
282	<li class="menu-item menu-item-type-post_type menu-item-object-page menu-item-15368"><a href="https://wildbills.com/carnival/" class="elementor-sub-item">Carnival</a></li>
283	<li class="menu-item menu-item-type-post_type menu-item-object-page menu-item-15373"><a href="https://wildbills.com/school-field-day/" class="elementor-sub-item">School field day</a></li>
284</ul>
285</li>
286<li class="menu-item menu-item-type-post_type menu-item-object-page menu-item-16755"><a href="https://wildbills.com/rentals/" class="elementor-item">Rentals</a></li>
287<li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-6809"><a href="https://wildbills.com/about-us/" class="elementor-item">About Us</a></li>
288<li class="menu-item menu-item-type-post_type menu-item-object-page menu-item-28277"><a href="https://wildbills.com/party-posts/" class="elementor-item">Party Posts</a></li>
289<li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-57212"><a href="https://www.paycomonline.net/v4/ats/web.php/jobs?clientkey=A5C24F63E4FAE72AA87AEDA5BDB9D2C8&#038;fromClientSide=true" class="elementor-item">Now Hiring</a></li>
290</ul>			</nav>
291					<div class="elementor-menu-toggle" role="button" tabindex="0" aria-label="Menu Toggle" aria-expanded="false">
292			<i aria-hidden="true" role="presentation" class="elementor-menu-toggle__icon--open eicon-menu-bar"></i><i aria-hidden="true" role="presentation" class="elementor-menu-toggle__icon--close eicon-close"></i>		</div>
293					<nav class="elementor-nav-menu--dropdown elementor-nav-menu__container" aria-hidden="true">
294				<ul id="menu-2-c460301" class="elementor-nav-menu"><li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-home menu-item-6806"><a href="https://wildbills.com/" class="elementor-item" tabindex="-1">Home</a></li>
295<li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-has-children menu-item-6808"><a href="#" class="elementor-item elementor-item-anchor" tabindex="-1">Event Types<span class="sub-arrow"><i class="fas fa-caret-down" aria-hidden="true"></i></span></a>
296<ul class="sub-menu elementor-nav-menu--dropdown">
297	<li class="menu-item menu-item-type-post_type menu-item-object-page menu-item-21416"><a href="https://wildbills.com/casino-party/" class="elementor-sub-item" tabindex="-1">Casino Party</a></li>
298	<li class="menu-item menu-item-type-post_type menu-item-object-page menu-item-114984"><a href="https://wildbills.com/fundraisers/" class="elementor-sub-item" tabindex="-1">Fundraisers</a></li>
299	<li class="menu-item menu-item-type-post_type menu-item-object-page menu-item-14845"><a href="https://wildbills.com/company-picnic/" class="elementor-sub-item" tabindex="-1">Company Picnic</a></li>
300	<li class="menu-item menu-item-type-post_type menu-item-object-page menu-item-15354"><a href="https://wildbills.com/wedding-rentals/" class="elementor-sub-item" tabindex="-1">Wedding Rentals</a></li>
301	<li class="menu-item menu-item-type-post_type menu-item-object-page menu-item-15360"><a href="https://wildbills.com/holiday/" class="elementor-sub-item" tabindex="-1">Holiday Party</a></li>
302	<li class="menu-item menu-item-type-post_type menu-item-object-page menu-item-15368"><a href="https://wildbills.com/carnival/" class="elementor-sub-item" tabindex="-1">Carnival</a></li>
303	<li class="menu-item menu-item-type-post_type menu-item-object-page menu-item-15373"><a href="https://wildbills.com/school-field-day/" class="elementor-sub-item" tabindex="-1">School field day</a></li>
304</ul>
305</li>
306<li class="menu-item menu-item-type-post_type menu-item-object-page menu-item-16755"><a href="https://wildbills.com/rentals/" class="elementor-item" tabindex="-1">Rentals</a></li>
307<li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-6809"><a href="https://wildbills.com/about-us/" class="elementor-item" tabindex="-1">About Us</a></li>
308<li class="menu-item menu-item-type-post_type menu-item-object-page menu-item-28277"><a href="https://wildbills.com/party-posts/" class="elementor-item" tabindex="-1">Party Posts</a></li>
309<li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-57212"><a href="https://www.paycomonline.net/v4/ats/web.php/jobs?clientkey=A5C24F63E4FAE72AA87AEDA5BDB9D2C8&#038;fromClientSide=true" class="elementor-item" tabindex="-1">Now Hiring</a></li>
310</ul>			</nav>
311						</div>
312				</div>
313					</div>
314		</div>
315					</div>
316		</section>
317				</header>
318		
319    <main id="main" class="site-main" role="main">
320
321        <header class="page-header io_phshow">
322            <div class ="elementor-widget-heading">
323                <p id="breadcrumbs" class="io-entry-title elementor-heading-title"><a href="https://wildbills.com">Home</a><span class="separator"> &raquo; </span><span class="last">Event quote form</span></p>            </div>
324        </header>
325
326        <div class="page-content">
327            		<div data-elementor-type="wp-page" data-elementor-id="22360" class="elementor elementor-22360" data-elementor-post-type="page">
328						<section class="elementor-section elementor-top-section elementor-element elementor-element-25af3cc1 elementor-section-boxed elementor-section-height-default elementor-section-height-default" data-id="25af3cc1" data-element_type="section" data-e-type="section">
329						<div class="elementor-container elementor-column-gap-default">
330					<div class="elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-b8050f3" data-id="b8050f3" data-element_type="column" data-e-type="column">
331			<div class="elementor-widget-wrap elementor-element-populated">
332						<div class="elementor-element elementor-element-d4a1766 elementor-widget elementor-widget-heading" data-id="d4a1766" data-element_type="widget" data-e-type="widget" data-widget_type="heading.default">
333				<div class="elementor-widget-container">
334					<span class="elementor-heading-title elementor-size-default">Start My Quote</span>				</div>
335				</div>
336				<div class="elementor-element elementor-element-75f9488 elementor-widget elementor-widget-text-editor" data-id="75f9488" data-element_type="widget" data-e-type="widget" data-widget_type="text-editor.default">
337				<div class="elementor-widget-container">
338									<p>Please fill out the information requested, select one or more items that you&#8217;re interested in, use the &#8220;Anything else we should know&#8221; section to add any more detail, then submit your request. We&#8217;ll get back to you as soon as we can. The more information you provide, the more clear and accurate we can be with your quote.</p>								</div>
339				</div>
340				<div class="elementor-element elementor-element-6920e44a elementor-button-align-center elementor-widget elementor-widget-form" data-id="6920e44a" data-element_type="widget" data-e-type="widget" data-settings="{&quot;step_next_label&quot;:&quot;Next&quot;,&quot;step_previous_label&quot;:&quot;Previous&quot;,&quot;button_width&quot;:&quot;100&quot;,&quot;step_type&quot;:&quot;number_text&quot;,&quot;step_icon_shape&quot;:&quot;circle&quot;}" data-widget_type="form.default">
341				<div class="elementor-widget-container">
342							<form class="elementor-form" method="post" id="WBquoteform" name="WB form" aria-label="WB form">
343			<input type="hidden" name="post_id" value="22360"/>
344			<input type="hidden" name="form_id" value="6920e44a"/>
345			<input type="hidden" name="referer_title" value="Event Quote Form / WildBills.com Portland, OR" />
346
347							<input type="hidden" name="queried_id" value="22360"/>
348			
349			<div class="elementor-form-fields-wrapper elementor-labels-above">
350								<div class="elementor-field-type-text elementor-field-group elementor-column elementor-field-group-firstandlastname elementor-col-25 elementor-field-required elementor-mark-required">
351													<input size="1" type="text" name="form_fields[firstandlastname]" id="form-field-firstandlastname" class="elementor-field elementor-size-sm  elementor-field-textual" placeholder="First and last name" required="required">
352											</div>
353								<div class="elementor-field-type-text elementor-field-group elementor-column elementor-field-group-eventorganization elementor-col-25">
354													<input size="1" type="text" name="form_fields[eventorganization]" id="form-field-eventorganization" class="elementor-field elementor-size-sm  elementor-field-textual" placeholder="Organization name">
355											</div>
356								<div class="elementor-field-type-email elementor-field-group elementor-column elementor-field-group-email elementor-col-25 elementor-field-required elementor-mark-required">
357													<input size="1" type="email" name="form_fields[email]" id="form-field-email" class="elementor-field elementor-size-sm  elementor-field-textual" placeholder="Email" required="required">
358											</div>
359								<div class="elementor-field-type-tel elementor-field-group elementor-column elementor-field-group-cellphone elementor-col-25 elementor-field-required elementor-mark-required">
360							<input size="1" type="tel" name="form_fields[cellphone]" id="form-field-cellphone" class="elementor-field elementor-size-sm  elementor-field-textual" placeholder="Phone" required="required" pattern="[0-9()#&amp;+*-=.]+" title="Only numbers and phone characters (#, -, *, etc) are accepted.">
361
362						</div>
363								<div class="elementor-field-type-text elementor-field-group elementor-column elementor-field-group-eventstreet elementor-col-25 elementor-field-required elementor-mark-required">
364													<input size="1" type="text" name="form_fields[eventstreet]" id="form-field-eventstreet" class="elementor-field elementor-size-sm  elementor-field-textual" placeholder="Event address" required="required">
365											</div>
366								<div class="elementor-field-type-text elementor-field-group elementor-column elementor-field-group-eventcity elementor-col-25">
367													<input size="1" type="text" name="form_fields[eventcity]" id="form-field-eventcity" class="elementor-field elementor-size-sm  elementor-field-textual" placeholder="Event city">
368											</div>
369								<div class="elementor-field-type-text elementor-field-group elementor-column elementor-field-group-eventstate elementor-col-25">
370													<input size="1" type="text" name="form_fields[eventstate]" id="form-field-eventstate" class="elementor-field elementor-size-sm  elementor-field-textual" placeholder="Event state">
371											</div>
372								<div class="elementor-field-type-text elementor-field-group elementor-column elementor-field-group-eventzip elementor-col-25">
373													<input size="1" type="text" name="form_fields[eventzip]" id="form-field-eventzip" class="elementor-field elementor-size-sm  elementor-field-textual" placeholder="Event zip">
374											</div>
375								<div class="elementor-field-type-date elementor-field-group elementor-column elementor-field-group-startdate elementor-col-25 elementor-field-required elementor-mark-required">
376												<label for="form-field-startdate" class="elementor-field-label">
377								Start date							</label>
378						
379		<input type="date" name="form_fields[startdate]" id="form-field-startdate" class="elementor-field elementor-size-sm  elementor-field-textual elementor-date-field" placeholder="09/03/2026" required="required" pattern="[0-9]{4}-[0-9]{2}-[0-9]{2}">
380						</div>
381								<div class="elementor-field-type-date elementor-field-group elementor-column elementor-field-group-enddate elementor-col-25 elementor-field-required elementor-mark-required">
382												<label for="form-field-enddate" class="elementor-field-label">
383								End date							</label>
384						
385		<input type="date" name="form_fields[enddate]" id="form-field-enddate" class="elementor-field elementor-size-sm  elementor-field-textual elementor-date-field" placeholder="09/03/2026" required="required" pattern="[0-9]{4}-[0-9]{2}-[0-9]{2}">
386						</div>
387								<div class="elementor-field-type-time elementor-field-group elementor-column elementor-field-group-starttime elementor-col-25">
388												<label for="form-field-starttime" class="elementor-field-label">
389								Start time							</label>
390								<input type="time" name="form_fields[starttime]" id="form-field-starttime" class="elementor-field elementor-size-sm  elementor-field-textual elementor-time-field" placeholder="5:58 PM">
391						</div>
392								<div class="elementor-field-type-time elementor-field-group elementor-column elementor-field-group-endtime elementor-col-25">
393												<label for="form-field-endtime" class="elementor-field-label">
394								End time							</label>
395								<input type="time" name="form_fields[endtime]" id="form-field-endtime" class="elementor-field elementor-size-sm  elementor-field-textual elementor-time-field" placeholder="5:58 PM">
396						</div>
397								<div class="elementor-field-type-select elementor-field-group elementor-column elementor-field-group-referral elementor-col-50">
398												<label for="form-field-referral" class="elementor-field-label">
399								Which of these best describes your event type?							</label>
400								<div class="elementor-field elementor-select-wrapper remove-before ">
401			<div class="select-caret-down-wrapper">
402				<i aria-hidden="true" class="eicon-caret-down"></i>			</div>
403			<select name="form_fields[referral]" id="form-field-referral" class="elementor-field-textual elementor-size-sm">
404									<option value="Fundraiser">Fundraiser</option>
405									<option value="Company or family picnic">Company or family picnic</option>
406									<option value="Corporate banquet/conference or other semi-formal event">Corporate banquet/conference or other semi-formal event</option>
407									<option value="Indoor company party">Indoor company party</option>
408									<option value="Kids birthday or similar">Kids birthday or similar</option>
409									<option value="School, church, or community indoor event">School, church, or community indoor event</option>
410									<option value="School, church, or community outdoor event">School, church, or community outdoor event</option>
411									<option value="Wedding or other formal event">Wedding or other formal event</option>
412							</select>
413		</div>
414						</div>
415								<div class="elementor-field-type-select elementor-field-group elementor-column elementor-field-group-surface elementor-col-50">
416												<label for="form-field-surface" class="elementor-field-label">
417								Surface type?							</label>
418								<div class="elementor-field elementor-select-wrapper remove-before ">
419			<div class="select-caret-down-wrapper">
420				<i aria-hidden="true" class="eicon-caret-down"></i>			</div>
421			<select name="form_fields[surface]" id="form-field-surface" class="elementor-field-textual elementor-size-sm">
422									<option value="Artificial turf - no stakes">Artificial turf - no stakes</option>
423									<option value="Grass - allow stakes">Grass - allow stakes</option>
424									<option value="Grass - no stakes">Grass - no stakes</option>
425									<option value="Indoor - carpet">Indoor - carpet</option>
426									<option value="Indoor - concrete">
426Indoor - concrete</option>
427									<option value="Indoor - stone/tile">Indoor - stone/tile</option>
428									<option value="Indoor - wood">Indoor - wood</option>
429									<option value="Mixed - include details in notes">Mixed - include details in notes</option>
430									<option value="Outdoor - concrete">Outdoor - concrete</option>
431									<option value="Outdoor - gravel">Outdoor - gravel</option>
432									<option value="Outdoor - wood">Outdoor - wood</option>
433									<option value="Unknown at this time">Unknown at this time</option>
434							</select>
435		</div>
436						</div>
437								<div class="elementor-field-type-text elementor-field-group elementor-column elementor-field-group-customfield_215148 elementor-col-25 elementor-field-required elementor-mark-required">
438													<input size="1" type="text" name="form_fields[customfield_215148]" id="form-field-customfield_215148" class="elementor-field elementor-size-sm  elementor-field-textual" placeholder="Approximate guest count" required="required">
439											</div>
440								<div class="elementor-field-type-text elementor-field-group elementor-column elementor-field-group-customfield_215162 elementor-col-25">
441													<input size="1" type="text" name="form_fields[customfield_215162]" id="form-field-customfield_215162" class="elementor-field elementor-size-sm  elementor-field-textual" placeholder="Approximate budget, if known">
442											</div>
443								<div class="elementor-field-type-hidden elementor-field-group elementor-column elementor-field-group-deliverytype elementor-col-100">
444													<input size="1" type="hidden" name="form_fields[deliverytype]" id="form-field-deliverytype" class="elementor-field elementor-size-sm  elementor-field-textual" value="TBD">
445											</div>
446								<div class="elementor-field-type-checkbox elementor-field-group elementor-column elementor-field-group-eventnotes elementor-col-100">
447												<label for="form-field-eventnotes" class="elementor-field-label">
448								I am interested in							</label>
449						<div class="elementor-field-subgroup  elementor-subgroup-inline"><span class="elementor-field-option"><input type="checkbox" value="casino" id="form-field-eventnotes-0" name="form_fields[eventnotes][]"> <label for="form-field-eventnotes-0">Casino</label></span><span class="elementor-field-option"><input type="checkbox" value="fair_rides" id="form-field-eventnotes-1" name="form_fields[eventnotes][]"> <label for="form-field-eventnotes-1">Fair rides</label></span><span class="elementor-field-option"><input type="checkbox" value="photo_booth" id="form-field-eventnotes-2" name="form_fields[eventnotes][]"> <label for="form-field-eventnotes-2">Photo booth</label></span><span class="elementor-field-option"><input type="checkbox" value="dj" id="form-field-eventnotes-3" name="form_fields[eventnotes][]"> <label for="form-field-eventnotes-3">DJ</label></span><span class="elementor-field-option"><input type="checkbox" value="game_show" id="form-field-eventnotes-4" name="form_fields[eventnotes][]"> <label for="form-field-eventnotes-4">Game show</label></span><span class="elementor-field-option"><input type="checkbox" value="murder_mystery" id="form-field-eventnotes-5" name="form_fields[eventnotes][]"> <label for="form-field-eventnotes-5">Murder mystery</label></span><span class="elementor-field-option"><input type="checkbox" value="Dance floor" id="form-field-eventnotes-6" name="form_fields[eventnotes][]"> <label for="form-field-eventnotes-6">Dance floor</label></span><span class="elementor-field-option"><input type="checkbox" value="carnival" id="form-field-eventnotes-7" name="form_fields[eventnotes][]"> <label for="form-field-eventnotes-7">Carnival</label></span><span class="elementor-field-option"><input type="checkbox" value="bounce_house" id="form-field-eventnotes-8" name="form_fields[eventnotes][]"> <label for="form-field-eventnotes-8">Bounce house</label></span><span class="elementor-field-option"><input type="checkbox" value="drive_in_movie" id="form-field-eventnotes-9" name="form_fields[eventnotes][]"> <label for="form-field-eventnotes-9">Drive in movie</label></span></div>
449				</div>
450								<div class="elementor-field-type-textarea elementor-field-group elementor-column elementor-field-group-customfield_215162 elementor-col-100">
451												<label for="form-field-customfield_215162" class="elementor-field-label">
452								Anything else we should know?							</label>
453						<textarea class="elementor-field-textual elementor-field  elementor-size-sm" name="form_fields[customfield_215162]" id="form-field-customfield_215162" rows="4"></textarea>				</div>
454								<div class="elementor-field-type-recaptcha_v3 elementor-field-group elementor-column elementor-field-group-field_11de52c elementor-col-100 recaptcha_v3-bottomleft">
455					<div class="elementor-field" id="form-field-field_11de52c"><div class="elementor-g-recaptcha" data-sitekey="6LcSNw8eAAAAAN1cy4N20ZlzWX4YetiG7zmLXN_f" data-type="v3" data-action="Form" data-badge="bottomleft" data-size="invisible"></div></div>				</div>
456								<div class="elementor-field-type-hidden elementor-field-group elementor-column elementor-field-group-field_f220f5e elementor-col-100">
457													<input size="1" type="hidden" name="form_fields[field_f220f5e]" id="form-field-field_f220f5e" class="elementor-field elementor-size-sm  elementor-field-textual">
458											</div>
459								<div class="elementor-field-type-hidden elementor-field-group elementor-column elementor-field-group-field_79e9e0b elementor-col-100">
460													<input size="1" type="hidden" name="form_fields[field_79e9e0b]" id="form-field-field_79e9e0b" class="elementor-field elementor-size-sm  elementor-field-textual">
461											</div>
462								<div class="elementor-field-type-hidden elementor-field-group elementor-column elementor-field-group-field_adabe13 elementor-col-100">
463													<input size="1" type="hidden" name="form_fields[field_adabe13]" id="form-field-field_adabe13" class="elementor-field elementor-size-sm  elementor-field-textual">
464											</div>
465								<div class="elementor-field-group elementor-column elementor-field-type-submit elementor-col-100 e-form__buttons">
466					<button class="elementor-button elementor-size-md elementor-animation-shrink" type="submit">
467						<span class="elementor-button-content-wrapper">
468																						<span class="elementor-button-text">Submit</span>
469													</span>
470					</button>
471				</div>
472			</div>
473		</form>
474						</div>
475				</div>
476					</div>
477		</div>
478					</div>
479		</section>
480				</div>
481		        </div>
482
483    </main>
484
485		<footer data-elementor-type="footer" data-elementor-id="6692" class="elementor elementor-6692 elementor-location-footer" data-elementor-post-type="elementor_library">
486					<section class="elementor-section elementor-top-section elementor-element elementor-element-7025575 elementor-section-boxed elementor-section-height-default elementor-section-height-default" data-id="7025575" data-element_type="section" data-e-type="section" id="footer-container" data-settings="{&quot;background_background&quot;:&quot;classic&quot;}">
487						<div class="elementor-container elementor-column-gap-default">
488					<div class="elementor-column elementor-col-50 elementor-top-column elementor-element elementor-element-a35b7cd left-part" data-id="a35b7cd" data-element_type="column" data-e-type="column">
489			<div class="elementor-widget-wrap elementor-element-populated">
490						<div class="elementor-element elementor-element-996c066 elementor-widget elementor-widget-image" data-id="996c066" data-element_type="widget" data-e-type="widget" data-widget_type="image.default">
491				<div class="elementor-widget-container">
492																<a href="https://wildbills.com/">
493							<img width="400" height="107" src="https://wildbills.com/wp-content/uploads/2024/02/logo-footer.png" class="elementor-animation-shrink attachment-full size-full wp-image-6706" alt="WildBill&apos;s Logo" srcset="https://wildbills.com/wp-content/uploads/2024/02/logo-footer.png 400w, https://wildbills.com/wp-content/uploads/2024/02/logo-footer-300x80.png 300w" sizes="(max-width: 400px) 100vw, 400px" />								</a>
494															</div>
495				</div>
496				<div class="elementor-element elementor-element-25fc118 elementor-widget elementor-widget-text-editor" data-id="25fc118" data-element_type="widget" data-e-type="widget" data-widget_type="text-editor.default">
497				<div class="elementor-widget-container">
498									<p>Address: 4288 SE International Way, Suite C.<br />Milwaukie, OR 97222</p><p>Phone: <a href="tel:5032240134">(503) 224-0134</a></p><p>Email: <a href="mailto:[email protected]">[email protected]</a></p>								</div>
499				</div>
500					</div>
501		</div>
502				<div class="elementor-column elementor-col-50 elementor-top-column elementor-element elementor-element-655192b right-part" data-id="655192b" data-element_type="column" data-e-type="column">
503			<div class="elementor-widget-wrap elementor-element-populated">
504						<div class="elementor-element elementor-element-4dd6ade elementor-widget elementor-widget-heading" data-id="4dd6ade" data-element_type="widget" data-e-type="widget" data-widget_type="heading.default">
505				<div class="elementor-widget-container">
506					<h2 class="elementor-heading-title elementor-size-default">The life of your party!</h2>				</div>
507				</div>
508				<div class="elementor-element elementor-element-36f0031 elementor-widget elementor-widget-text-editor" data-id="36f0031" data-element_type="widget" data-e-type="widget" data-widget_type="text-editor.default">
509				<div class="elementor-widget-container">
510									<p>Wild Bill’s is a leading<br />Interactive Entertainment<br />and Rental company in<br />Portland, OR.</p>								</div>
511				</div>
512				<div class="elementor-element elementor-element-6b02f3d elementor-nav-menu__align-center elementor-nav-menu--dropdown-none elementor-widget elementor-widget-nav-menu" data-id="6b02f3d" data-element_type="widget" data-e-type="widget" data-settings="{&quot;layout&quot;:&quot;horizontal&quot;,&quot;submenu_icon&quot;:{&quot;value&quot;:&quot;&lt;i class=\&quot;fas fa-caret-down\&quot; aria-hidden=\&quot;true\&quot;&gt;&lt;\/i&gt;&quot;,&quot;library&quot;:&quot;fa-solid&quot;}}" data-widget_type="nav-menu.default">
513				<div class="elementor-widget-container">
514								<nav aria-label="Menu" class="elementor-nav-menu--main elementor-nav-menu__container elementor-nav-menu--layout-horizontal e--pointer-text e--animation-none">
515				<ul id="menu-1-6b02f3d" class="elementor-nav-menu"><li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-6750"><a href="https://wildbills.com/rentals/" class="elementor-item">All Rentals</a></li>
516<li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-6751"><a href="https://wildbills.com/frequently-asked-questions/" class="elementor-item">FAQs</a></li>
517<li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-6752"><a href="https://wildbills.com/about-us/" class="elementor-item">About</a></li>
518<li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-6753"><a href="https://wildbills.com/privacy/" class="elementor-item">Privacy</a></li>
519<li class="menu-item menu-item-type-custom menu-item-object-custom current-menu-item menu-item-6754"><a href="https://wildbills.com/elementor-22360/" aria-current="page" class="elementor-item elementor-item-active">Contact</a></li>
520</ul>			</nav>
521						<nav class="elementor-nav-menu--dropdown elementor-nav-menu__container" aria-hidden="true">
522				<ul id="menu-2-6b02f3d" class="elementor-nav-menu"><li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-6750"><a href="https://wildbills.com/rentals/" class="elementor-item" tabindex="-1">All Rentals</a></li>
523<li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-6751"><a href="https://wildbills.com/frequently-asked-questions/" class="elementor-item" tabindex="-1">FAQs</a></li>
524<li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-6752"><a href="https://wildbills.com/about-us/" class="elementor-item" tabindex="-1">About</a></li>
525<li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-6753"><a href="https://wildbills.com/privacy/" class="elementor-item" tabindex="-1">Privacy</a></li>
526<li class="menu-item menu-item-type-custom menu-item-object-custom current-menu-item menu-item-6754"><a href="https://wildbills.com/elementor-22360/" aria-current="page" class="elementor-item elementor-item-active" tabindex="-1">Contact</a></li>
527</ul>			</nav>
528						</div>
529				</div>
530				<div class="elementor-element elementor-element-959e59f elementor-shape-rounded elementor-grid-0 e-grid-align-center elementor-widget elementor-widget-social-icons" data-id="959e59f" data-element_type="widget" data-e-type="widget" data-widget_type="social-icons.default">
531				<div class="elementor-widget-container">
532							<div class="elementor-social-icons-wrapper elementor-grid" role="list">
533							<span class="elementor-grid-item" role="listitem">
534					<a class="elementor-icon elementor-social-icon elementor-social-icon-facebook elementor-animation-shrink elementor-repeater-item-c48df3d" href="https://www.facebook.com/WildBillsNW/" target="_blank">
535						<span class="elementor-screen-only">Facebook</span>
536						<i aria-hidden="true" class="fab fa-facebook"></i>					</a>
537				</span>
538							<span class="elementor-grid-item" role="listitem">
539					<a class="elementor-icon elementor-social-icon elementor-social-icon-instagram elementor-animation-shrink elementor-repeater-item-177df41" href="https://www.instagram.com/wildbillsgambling/" target="_blank">
540						<span class="elementor-screen-only">Instagram</span>
541						<i aria-hidden="true" class="fab fa-instagram"></i>					</a>
542				</span>
543					</div>
544						</div>
545				</div>
546					</div>
547		</div>
548					</div>
549		</section>
550				<section class="elementor-section elementor-top-section elementor-element elementor-element-4b0afe6 elementor-section-boxed elementor-section-height-default elementor-section-height-default" data-id="4b0afe6" data-element_type="section" data-e-type="section" id="copyright-container" data-settings="{&quot;background_background&quot;:&quot;classic&quot;}">
551						<div class="elementor-container elementor-column-gap-default">
552					<div class="elementor-column elementor-col-50 elementor-top-column elementor-element elementor-element-0e37124 left-part" data-id="0e37124" data-element_type="column" data-e-type="column">
553			<div class="elementor-widget-wrap elementor-element-populated">
554						<div class="elementor-element elementor-element-1ac057a elementor-widget elementor-widget-text-editor" data-id="1ac057a" data-element_type="widget" data-e-type="widget" data-widget_type="text-editor.default">
555				<div class="elementor-widget-container">
556									<p>Copyright © 2024 Wild Bills LLC. All Rights Reserved</p>								</div>
557				</div>
558					</div>
559		</div>
560				<div class="elementor-column elementor-col-50 elementor-top-column elementor-element elementor-element-330a9ee right-part" data-id="330a9ee" data-element_type="column" data-e-type="column">
561			<div class="elementor-widget-wrap elementor-element-populated">
562						<div class="elementor-element elementor-element-15c1d97 elementor-widget elementor-widget-text-editor" data-id="15c1d97" data-element_type="widget" data-e-type="widget" data-widget_type="text-editor.default">
563				<div class="elementor-widget-container">
564									<p>Web Design by <a href="https://spiderwebdev.com/" target="_blank" rel="noopener">Spider Web Development</a></p>								</div>
565				</div>
566					</div>
567		</div>
568					</div>
569		</section>
570				</footer>
571		
572<script type="speculationrules">
573{"prefetch":[{"source":"document","where":{"and":[{"href_matches":"/*"},{"not":{"href_matches":["/wp-*.php","/wp-admin/*","/wp-content/uploads/*","/wp-content/*","/wp-content/plugins/*","/wp-content/themes/io-kenos/*","/*\\?(.+)"]}},{"not":{"selector_matches":"a[rel~=\"nofollow\"]"}},{"not":{"selector_matches":".no-prefetch, .no-prefetch a"}}]},"eagerness":"conservative"}]}
574</script>
574
575<!-- HFCM by 99 Robots - Snippet # 2: Footer Scripts -->
576<script src="https://resources.swd-hosting.com/io/assets/wildbills/main.js"></script>
576
577<!-- /end HFCM by 99 Robots -->
578<img src="https://rental.software/include/iotracking.php" style="display:none;" importance="low" alt="dynamic io trk code" />
579     <style>
580     .io_product_price_4h,.io_product_price_8h,.io_product_price_24h,.io_product_price_additionalday{display:none}
581        .rentNameIO_price, .io_product_price_box, .item-total, .cartSubtotalBox
582        {
583            display: none !important;
584        }
585        .item-availability{display: none !important;}
586    /* ALWAYS hide toggle buttons and list view on inventory/all-items pages (no category ID) */
587    body.io-no-category-id .io_view_toggle_container,
588    body.io-no-category-id .io_list_view_content
589    {
590        display: none !important;
591    }
592    
593    /* Force grid/tile layout on pages without category IDs */
594    body.io-no-category-id .io_catdiv2.list-view {
595        display: grid !important;
596        grid-template-columns: repeat(auto-fit, minmax(250px, 350px)) !important;
597        grid-gap: 10px !important;
598        margin: 50px !important;
599        max-width: none !important;
600        justify-content: space-evenly !important;
601    }
602    body.io-no-category-id .io_catdiv2.list-view .io_item2_list {
603        display: block !important;
604        flex-direction: column !important;
605        margin-bottom: 0 !important;
606        padding: 0 !important;
607        align-items: initial !important;
608        text-align: center !important;
609    }
610    body.io-no-category-id .io_catdiv2.list-view .cat_div {
611        flex: initial !important;
612        margin-right: 0 !important;
613        position: relative !important;
614    }
615    body.io-no-category-id .io_catdiv2.list-view .cat_img {
616        width: 100% !important;
617        height: auto !important;
618        object-fit: cover !important;
619    }
620    body.io-no-category-id .io_catdiv2.list-view .io_item2_list_inner {
621        flex: initial !important;
622        margin-top: initial !important;
623        display: block !important;
624        flex-direction: initial !important;
625        justify-content: initial !important;
626        min-height: auto !important;
627        height: auto !important;
628    }
629    
630    .io_all_item_cat{
631        display:none;
632        float:none;
633        width:100%;
634        margin-top:20px;
635    }
636    </style>
637
638<!-- Magic List -->
639    
639<script>
640    var io_wp_local_path = "";
641    var io_checkavail = "off";
642    var io_hidetimes = "off";
643    var io_user_country = "US";
644    var io_user_currency = "USD";
645    var io_default_start_time = "4:00 pm";
646    var io_default_end_time = "8:00 pm";
647    var io_default_duration = 4.00;
648    var io_force_blank_timepickers = "";
649    var io_hide_end_time = "";
650    var io_cart_date_format = "m/d/yy";
651    var io_cart_message = "";
652    var io_cart_time_format = "g:i a";
653    var io_multidayquote = "on";
654    var io_cartdayselect = "multi_day";
655    var io_cartAllowSameDay = "off";
656    var io_overnightPickupTime = "10:00 am";
657    var io_incartupsell = "off";
658    var io_distancecharge = "off";
659    var io_deliverymethod = "off";
660    var io_brand = "IO";
661    var io_restrict_times = "off";
662    var io_restrict_time_start = "8:00 am";
663    var io_restrict_time_end = "9:00 pm";
664    var io_default_state = "OR";
665    var io_hide_zero = "0";
666    var io_weekEndPrice = "off";
667    var io_weekDayText = "Weekday price.";
668    var io_weekEndText = "Weekend price.";
669    var io_weekendDefine = "friday-sunday";
670    var io_accessory_price = "off";
671    var io_accessory_select = "off";
672    var io_upsell_price = "off";
673    var io_cart_party_planner_email = "off";
674    var io_cart_party_planner_destination = "https://wildbills.com/plan-a-party/";
675    var io_hideQuantityAvail = "off";
676    var io_company_timeslots = [];
677    var io_info_required = "off";
678    var io_always_display_live_price = "off";
679    var io_default_delivery_method = "";
680    var io_hide_live_prices = 1;
681    var io_info_required_data = [];
682    var io_prices = {"0":"isset","override_groups":[]};
683    var io_delivery_prices = {"default":[],"override":[]};
684    var io_custom_prices = {"default":[],"override":[]};
685    var io_delivery_methods = {"Delivery Full Staff":{"restricted":"[]","id":"91464"},"Will Call":{"restricted":"[]","id":"91466"},"Delivery Without Staff":{"restricted":"[]","id":"91468"},"Grad Party":{"restricted":"[]","id":"91470"},"Delivery Partial Staff":{"restricted":"[]","id":"91472"},"Entertainer":{"restricted":[],"id":"91474"},"TBD":{"restricted":"[]","id":"91476"}};
686    var io_customer_geolocation = "";
687    var io_customer_ip = "181.215.65.149";
688    var io_delivery_methods_restrict = null;
689    var io_pagename = "Wild Bill's Casino Parties";
690    var io_categoryVariantImages = "";
691    //var io_seocitylinktext = "Professional delivery to <span class=\"io_city_list\">%%landing_pages%%</span> and surrounding areas. Please submit a quote or contact us to be sure we service your area.";
692    jQuery( document ).ready(function() {
693
694        //force all quote form links to use cart data
695        //removing back to cart shortcode as this needs to only be done if cart is not empty IO-22561
696        /*
697        let headerBookButton = jQuery("a[href$='io_quoteform/']");
698        headerBookButton.addClass("ioCart_link");
699        headerBookButton.attr("href", "javascript:;");
700        */
701
702
703        let last_cat_name = "";
704        let ioTrigger = false;
705        jQuery(".io_all_item_cat").each(function() {
706            current_cat_name = jQuery(this).html();
707            if(last_cat_name !== current_cat_name) {
708                jQuery(this).show();
709                ioTrigger = true;
710            }
711            last_cat_name = current_cat_name;
712        });
713
714        // Setup gen page blocks
715		let io_divs = document.querySelectorAll(".io_item2_list, .io_item2_listcat, .io_item2_listrent, .io_all_item_cat");
716		let io_divscat = document.querySelectorAll(".io_item2_listcat");
717		let io_divsrent = document.querySelectorAll(".io_item2_listrent");
718		let io_divcat = document.querySelector(".io_catdiv2");
719		let io_pcc = document.querySelector(".page-content");
720		let io_html;
721
722		if (io_divs.length > 0) {
723	      for (let i of io_divs) {
724	        if(i.parentNode.className.indexOf("io_mm_") === -1){
725	          io_divcat.appendChild(i);
726	        }
727		  }
728		  if(io_divcat!==null) io_divcat.style.display = "grid";
729		}
730
731		if (ioTrigger) {
732            let pageBlock = document.querySelector(".io_catdiv2");
733            pageBlock.classList.add("elementor-widget-heading");
734            let scanRes = pageBlock.querySelectorAll(".io_item2_listrent");
735            pageBlock.style.display = "block";
736            pageBlock.style.margin = "auto";
737            pageBlock.style.textAlign = "center";
738            pageBlock.style.marginLeft = "5px";
739            pageBlock.style.marginRight = "5px";
740            for (let i of scanRes) {
741                i.style.display = "inline-block";
742                i.style.marginLeft = "5px";
743                i.style.marginRight = "5px";
744            }
745        }
746
747		/* fix font color on older sites */
748		if(jQuery("#cartData").css("background-color")=="rgb(35, 36, 37)"){
749		    jQuery("#cartData").css("color","white");
750		}
751    });
752  </script>
752<!-- Start Shortcoder content --><style> .ui-datepicker-trigger{display:none} </style>
753
754<div id="cartPopover">
755  <div id="ioCartLoadingOverlay" aria-hidden="true">
756      <div class="io-spinner" role="status" aria-live="polite" aria-label="Loading"></div>
757  </div>
758  <div id="triangle"></div>
759  <div id="cartCalendarTimePickerContainer">
760    <div id="cartCalendar"></div>
761    <div id="cartTimePicker">
762      <div id="div-overnight">
763        Days <select style="color:black;" name="whatday" id="whatday" onchange="endDisplay();">
764        <option value="Same Day" selected="selected">Single Day</option>
765        <option value="Overnight">Overnight</option>
766        <option value="Multi-Day">Multi-Day</option>
767      </select>
768      </div>
769      <br>
770      <div id="ioCartTimeSelectContainer">
771        <div>
772          <span class="calTimeLabel calTimeLabelStart">Start</span>
773          <i class="fas fa-calendar-check"></i>
774          <input type="text" name="dateStart" class="ioCartDateInput" readonly="readonly" />
775          <i class="fas fa-clock"></i>
776          <input type="text" name="timeStart" class="timepicker" style="width:75px;" />
777        </div>
778        <div>
779          <span class="calTimeLabel calTimeLabelEnd">End</span>
780          <i class="fas fa-calendar-check"></i>
781          <input type="text" name="dateEnd" class="ioCartDateInput" readonly="readonly" />
782          <i class="fas fa-clock"></i>
783          <input type="text" name="timeEnd" class="timepicker" style="width:75px;" />
784        </div>
785      </div>
786      <br>
787      <div id="ioDeliveryMethodContainer" style="display:none; text-align: center;"></div>
788      <br>
789      <div id="ioAdditonalInformationContainer" style="display:none; text-align: center;">
790        <div class="io_info_modal_data_container" id="io_info_modal_address">
791          <label for="address" id="io_iml_address_label" style="width:105px"> Street Address </label>
792          <input class="io_modal_input_address" style="margin-left:5px" id="io_im_address"  name="address" type="text"></input>
793          <br>
794        </div>
795        <div class="io_info_modal_data_container" id="io_info_modal_city">
796          <label for="city" id="io_iml_city_label" style="width:105px"> City </label>
797          <input class="io_modal_input_city" style="margin-left:5px" id="io_im_city" name="city" type="text"></input>
798          <br>
799        </div>
800        <div class="io_info_modal_data_container" id="io_info_modal_zip">
801          <label for="zip" id="io_iml_zip_label" style="width:105px"> Zip Code </label>
802          <input class="io_modal_input_zip" id="io_im_zip" style="margin-left:5px" name="zip" type="text"></input>
803        </div>
804      </div>
805      <br>
806      <div class="elementor-widget-button" style="padding:10px;display:inline-block;">
807        <a onclick="calApply()" href="javascript:;"
808           class="elementor-button-link elementor-button elementor-size-sm elementor-animation-grow"
809           style="text-decoration: none;">Apply</a></div>
810      <div class="elementor-widget-button" style="padding:10px;display:inline-block;">
811        <a onclick="calCancel()" href="javascript:;"
812           class="elementor-button-link elementor-button elementor-size-sm elementor-animation-grow simpleCart_cancel"
813           style="text-decoration: none;">Cancel</a>
814      </div>
815    </div>
816    <div id="cartDateRange" class="ioDateRange" onclick="calSetDateRange(1)" style="display:none;">
817    </div>
818    <div class="changeDateLinkWrapper elementor-widget-button">
819      <div id="changeDateLink" onclick="calSetDateRange(1)" class="elementor-button elementor-animation-grow">Change Date</div>
820    </div>
821  </div>
822  <div id="cartPartyBuilderEmailContainer" style="display:none;text-align:center">
823    <p>Provide an email address here to recieve our free party planner!</p>
824    <input type="text" id="cartPartyBuilderEmailInput">
825    <div class="elementor-widget-button" style="display:inline-block;">
826      <a onclick="io_party_planner_email_submit()" href="javascript:;" class="elementor-button-link elementor-button elementor-size-sm" style="padding: 6px 15px;text-decoration: none;">Go</a>
827    </div>
828    <div id="cartPartyBuilderEmailWarning" style="display:none">Pleave provide a valid email address.</div>
829    <br><br>
830  </div>
831  <div id="cartCustomMessage" style="display:none;text-align:center"></div>
832  <div id="cartWarning" class="clearfix"></div>
833  <div id="deliveryMethodWarning" class="clearfix">Some items are not available for the selected delivery method.</div>
834  <span class="io_locationRedirectLink">You may not be on the correct site. Click here to change location.</span>
835  <div id="cartData" class="clearfix">
836    <div class="simpleCart_items"></div>
837  </div>
838  <div class="cartSubtotalBox">
839    Subtotal (estimate):<div id="cartSubtotal"></div>
840  </div>
841  <div class="checkDeliveryCartContainer">
842    <div id="checkDeliveryMessage" class="cartDeliverytotalBox"><a class="cartLink" href="javascript:;" onClick="showAddressEntry(true)">Check Delivery</a></div>
843    <div id="deliverSubtotalContainer" class="cartDeliverytotalBox">
844      Delivery Fee (<span><a class="cartLink" href="javascript:;" onClick="showAddressEntry(true)">Change Address</a></span>):<div id="deliverySubtotal"></div>
845    </div>
846  </div>
847  <div id="cartCheckoutButton" class="clearfix">
848    <div class="elementor-widget-button">
849      <a href="javascript:cartHide();
849" class="simpleCart_continue elementor-button elementor-size-sm elementor-animation-grow io_button">Continue Shopping</a>
850      <a href="javascript:;" class="simpleCart_checkout elementor-button elementor-size-sm elementor-animation-grow io_button">Checkout</a>
851    </div>
852    <div id="cart-carousel-container" style="display:none">
853      <label> Some items you may be interested in: </label>
854      <br>
855      <div class="cart-carousel"></div>
856    </div>
857    <div class="ioLink"><a href="https://www.inflatableoffice.com" target="_blank">powered by io</a></div>
858  </div>
859</div>
860
861<!-- Start JS -->
862<script>
863  /* configurable globals */
864  var start_default = "11:00 am";
865  if(io_default_start_time != "") start_default = io_default_start_time;
866  var end_default = "3:00 pm";
867  if(io_default_end_time != "") end_default = io_default_end_time;
868
869  if(io_user_currency){
870    var currency = io_user_currency;
871  } else{
872    var currency = "USD";
873  }
874
875  if(io_user_country){
876    var country = io_user_country;
877  } else{
878    var country = "US";
879  }
880
881
882  var timeFormat = "g:i a";
883  if(io_cart_time_format != "") timeFormat = io_cart_time_format;
884  var dateFormat = "m/d/yy";
885  if(io_cart_date_format != "") dateFormat = io_cart_date_format;
886
887  var restrictTimes = false;
888  if(io_restrict_times === "on") restrictTimes = true;
889  var restrictTimeStart = start_default;
890  if(io_restrict_time_start != "") restrictTimeStart = io_restrict_time_start;
891  var restrictTimeEnd = end_default;
892  if(io_restrict_time_end != "") restrictTimeEnd = io_restrict_time_end;
893
894
895  var multi_day = true;
896  if(io_multidayquote === "off" || io_cartdayselect == "Single Day") multi_day = false;
897  var in_cart_upsell = false;
898  if(io_incartupsell === "on") in_cart_upsell = true;
899  var io_distance_charge = false;
900  if(io_distancecharge === "on") io_distance_charge = true;
901
902  /* other globals */
903  var pallet_color1 = ""; /* set in onready */
904  /* track the date start/end of calendar clicking */
905  var click_count = 0;
906
907  /* for configuring upsell carosel in cart */
908  var cart_carousel_set = false;
909
910  /* for checking when we remove an item from the cart */
911  var last_remove = 0;
912  var last_upsell_call = 0;
913
914  /* for buffering cart qty changes checkAvail calls for qty change only */
915  var last_checkAvail_call = 0;
916
917  /* for cart loading animation */
918  var io_cart_loading_active = false;
919  var io_cart_loading_count = 0;
920  var io_cart_loading_fallback_timer = null;
921
922  /*var start_default = "11:00";
923    var end_default = "15:00";
924    var currency = "EUR";
925    var timeFormat = "G:i";
926    var dateFormat = "d/m/yy";*/
927
928
929  /* For weekday weekend pricing */
930  var use_weekday_weekend = false;
931  if(io_weekEndPrice == "on") use_weekday_weekend = true;
932
933  /* Accessory and Upsell Prices */
934  var show_accessory_price = false;
935  if(io_accessory_price == "on") show_accessory_price = true;
936  var show_upsell_price = false;
937  if(io_upsell_price == "on") show_upsell_price = true;
938
939  /* For customer geolocation shortcode */
940  var storage_key = 'io_customer_location';
941
942  /*<editor-fold defaultstate="collapsed" desc="On Ready">*/
943  jQuery(document).ready(function () {
944    pallet_color1 = "var( --e-global-color-accent,green )";
945    if(pallet_color1=="rgba(0, 0, 0, 0)" || pallet_color1=="rgb(255, 255, 255)") pallet_color1="rgb(25, 147, 35)";
946
947    /*<editor-fold defaultstate="collapsed" desc="SimpleCart Init">*/
948    simpleCart({
949      currency: currency,
950      cartColumns: [{
951        view: "image",
952        attr: "image",
953        label: "Image"
954      },
955        {
956          attr: "name",
957          label: "Name"
958        },
959        {
960          attr: "encoded",
961          label: false
962        },
963        {
964          attr: "rentalid",
965          label: false
966        },
967        {
968          attr: "availability",
969          label: false
970        },
971        {
972          view: "decrement",
973          label: false,
974          text: "<i class='fas far fa-minus-square' style='color:" + pallet_color1 + "'></i>"
975        },
976        {
977          view: "calculate_area",
978          label: false
979        },
980        {
981          view:"input",
982          attr:"quantity"
983
984        },
985        {
986          attr: "qtyincrement",
987          label: false
988        },
989        {
990          attr: "inputtype",
991          label: false
992        },
993        {
994          attr: "qtytype",
995          label: false
996        },
997        {
998          attr: "vendorid",
999          label: false
1000        },
1001        {
1002          view: "increment",
1003          label: false,
1004          text: "<i class='fas far fa-plus-square' style='color:" + pallet_
1004color1 + "'></i>"
1005        },
1006        {
1007          attr: "price",
1008          label: "Price",
1009          view: 'currency'
1010        },
1011        {
1012          view: "remove",
1013          label: false,
1014          text: "<i class='fas fa-trash' style='color:" + pallet_color1 + "'></i>"
1015        },
1016        {
1017          attr: "total",
1018          label: "SubTotal",
1019          view: 'currency'
1020        },
1021        {
1022          attr: "timeslots",
1023          label: false
1024        },
1025        {
1026          attr: "timeslots-orig",
1027          label: false
1028        },
1029        {
1030          attr: "href",
1031          label: false
1032        },
1033        {
1034          attr: "linkqty",
1035          label: false
1036        },
1037        {
1038          attr: "acc_dd_parent_limit",
1039          label: false
1040        }
1041      ],
1042      checkout: {
1043        type: "SendForm",
1044        method: "GET",
1045        url: io_wp_local_path+"/io_quoteform/",
1046        extra_data: {
1047          /* name: decodeURIComponent("Wild Bill's Casino Parties".replace(/[+]/gi, " ")), */
1048          clear_rentals: "1",
1049          selected_only: "1",
1050          wp_checkout: "1",
1051          startdate: "",
1052          enddate: "",
1053          starttime: "",
1054          endtime: "",
1055          io_custguid: ""
1056        }
1057      }
1058    });
1059
1060    simpleCart.bind('update', cart_onUpdate);
1061    simpleCart.bind('beforeSave', cart_hideTimepickerWrapper);
1062    simpleCart.bind('beforeRemove', cart_beforeRemove);
1063    simpleCart.bind('afterRemove', cart_afterRemove);
1064    simpleCart.bind('afterQtyChange', cart_afterQtyChange);
1065    simpleCart.bind('beforeCheckout', cart_beforeCheckout);
1066    simpleCart.bind('afterAdd', cart_afterAdd);
1067    simpleCart.bind('beforeAdd', cart_beforeAdd);
1068    simpleCart.bind('load', cart_afterLoad)
1069    /*</editor-fold>*/
1070
1071    /* showAvail(""); */
1072    let io_star_pic = document.querySelector("#io_star_pic");
1073    if (io_star_pic != null) {
1074      let io_star_src = io_star_pic.src;
1075      if (io_star_src.indexOf("0star") > -1 || io_star_src.indexOf("1star") > -1 || io_star_src.indexOf("2star") > -1 ||
1076              io_star_src.indexOf("3star") > -1) {
1077        io_star_pic.style.display = "none";
1078      }
1079    }
1080
1081    /*<editor-fold desc="Build Thumb Images">*/
1082    /* build multiple thumb images */
1083
1084    /*</editor-fold>*/
1085
1086    /*<editor-fold desc="Set up Accessories">*/
1087    /* Add Add To Cart Buttons */
1088    let button_add = document.querySelector("#bookNowBtn");
1089    var main_id = 0;
1090    if(jQuery(".io_product_container .item_rentalid")){
1091      main_id = jQuery(".io_product_container .item_rentalid").first().text();
1092    }
1093    /* if main item is dd but not pkg (linen code) */
1094    if(jQuery(".io_acc_accessorydd").text()==1 && jQuery(".io_acc_ispackage").text()!=1){
1095      /* if order is defined, then reorder here. */
1096      var acc_cls = jQuery('.io_product_accessories')
1097      acc_cls.hide();
1098      let pkg = document.querySelector(".io_product_acc_pkg");
1099      if(pkg==undefined){
1100        pkg = document.createElement("div");
1101        pkg.classList.add("io_product_acc_pkg");
1102        pkg.style.textAlign = "center";
1103        acc_cls.after(pkg);
1104      }
1105      for (let [key, value] of acc_obj_relate) {
1106        elem = getAccElem(key,main_id);
1107        if(elem){
1108          btn = makeAccBtn(elem,main_id);
1109          pkg.append(btn);
1110        }
1111
1112      }
1113      let line = document.createElement("div");
1114      line.innerHTML = "<br>";
1115      pkg.append(line.cloneNode(true));
1116      for (let [key, value] of acc_obj_relate) {
1117        for (key2 in acc_obj_relate.get(key)) {
1118          if(Object.keys(value[key2]).length > 0){
1119            /* 3rd level */
1120            pkg.append(line.cloneNode(true));
1121            for (key3 in acc_obj_relate.get(key)[key2]) {
1122              elem = getAccElem(key3,key2);
1123              if(elem){
1124                btn = makeAccBtn(elem,key2);
1125                btn.style.display = "none";
1126                pkg.append(btn);
1127              }
1128            }
1129          }else{
1130            elem = getAccElem(key2,key);
1131            if(elem){
1132              btn = makeAccBtn(elem,key);
1133              btn.style.display = "none";
1134              pkg.append(btn);
1135            }
1136
1137          }
1138        }
1139      }
1140    }else {
1141      let access_array = document.querySelectorAll(".io_acc_li");
1142      let count = 0;
1143      for (let i of access_array) {
1144        let path = i.id.replace("io_acc_","");
1145        count++;
1146        let newButton = button_add.cloneNode(true);
1147        newButton.id = button_add.id + count;
1148        newButton.classList.remove("elementor-animation-grow");
1149        newButton.classList.add("elementor-animation-shrink");
1150
1151        let path_arr = path.split("_");
1152        let pid = parseInt(path_arr[0]);
1153        let this_id = parseInt(path_arr[1]);
1154        if(path_arr.length==1) pid=0;
1155
1156        if(jQuery("#io_acc_accessorydd_"+path).first().text()==1){
1157          /* display different to provide choices in dd */
1158          //main_id = pid;
1159        }else{
1160          /* hide accessories inside a pkg when under an accessory choice item until clicked */
1161          if(jQuery("#io_acc_accessorydd_"+main_id+"_"+pid).first().text()==1){
1162          }else{
1163            /* jpa - not finished/tested yet */
1164            /*jQuery("#io_acc_"+path).hide();*/
1165          }
1166          /* Fix broken images for accessories. */
1167          let img_box = document.querySelectorAll(".io_acc_li_img_thumb");
1168          let firstImg = true;
1169          let lastAcc = "";
1170          for (let i of img_box) {
1171            if(lastAcc=="") lastAcc = i.id;
1172            if(lastAcc!=i.id){
1173              lastAcc = i.id;
1174              firstImg = true;
1175            }
1176            let io_img_src = i.src;
1177            if(io_img_src!==null) io_img_src = io_img_src.toLowerCase();
1178            let io_img_datasrc = i.getAttribute("data-src");
1179            if(io_img_datasrc===null){
1180              io_img_datasrc = "";
1181            }else{
1182              io_img_datasrc = io_img_datasrc.toLowerCase();
1183            }
1184            if ((io_img_src.indexOf("io_noimage.png") >= 0 || io_img_datasrc.indexOf("io_noimage.png") >= 0) || (io_img_src.indexOf(".jpg") == -1 && io_img_src.indexOf(".jpe") == -1 && io_img_src.indexOf(".png") == -1 && io_img_src.indexOf(".gif") == -1 && io_img_src.indexOf(".tif") == -1 && io_img_src.indexOf(".webp") == -1)){
1185              i.style.display = "none";
1186            }else if(!firstImg && jQuery("#io_acc_accessorydd_"+main_id+"_"+pid).first().text()!=1){
1187              i.style.display = "none";
1188            }
1189            firstImg = false;
1190          }
1191          if(jQuery("#io_acc_accessorydd_"+main_id+"_"+pid).first().text()==1){
1192            /* Make the accessory category look more mike a label. */
1193            jQuery("#iothumb_"+main_id+"_"+pid).hide();
1194            jQuery("#io_acc_"+main_id+"_"+pid).css("border", "none");
1195            jQuery("#io_acc_"+main_id+"_"+pid).css("width", "100%");
1196            jQuery("#io_acc_"+main_id+"_"+pid).css("margin-bottom", "5vh");
1197            jQuery("#io_acc_"+main_id+"_"+pid).css("box-shadow", "none");
1198            jQuery("#io_acc_shortname_"+pid).css("font-weight", "bold");
1199            jQuery("#io_acc_shortname_"+pid).css("position", "absolute");
1200            /* Make this auto selected to fix an issue where we can not add to cart if this item is
1201                           a child of another hidden accessory on screen */
1202            jQuery("#io_acc_"+main_id+"_"+pid).prop("selected", true);
1203            accessory_cat_text = jQuery("#io_acc_shortname_"+pid).first().text();
1204            /* This is necessary to make sure there are not multiple colons. */
1205            if(!accessory_cat_text.includes(":")){
1206              jQuery("#io_acc_shortname_"+pid).text(accessory_cat_text+":");
1207            }
1208            /* Remove Href so we do not open images on click for dd accessories. */
1209            jQuery("[id^=io_acc_imgbig_"+pid+"_]").removeAttr("href");
1210
1211            /* Get the accessory limit for this set of acessories, then set up click events. */
1212            /* Unbind is used to prevent cascading calls. */
1213            accLmt = parseInt(jQuery("#io_acc_accessorylimit_"+main_id+"_"+pid).prop("textContent"));
1214            jQuery("[id^=io_acc_"+pid+"_]").unbind("click").click({pid: pid, accLmt: accLmt}, accDDClicked);
1215            jQuery("[id^=io_acc_"+pid+"_]").css("cursor", "pointer");
1216            /* Set up the slected property of all children accessories. Default to false. */
1217            jQuery("[id^=io_acc_"+pid+"_]").prop("selected", false);
1218            /* We need to add a hidden button so we can simulate a click on add_item for the cart. */
1219            let newButton = button_add.cloneNode(true);
1220            newButton.id = button_add.id + count;
1221            newButton.classList.remove("elementor-animation-grow");
1222            newButton.setAttribute("style", "display: none !important");
1223            i.appendChild(newButton);
1224          }else{
1225            let button_wrap = document.createElement("div");
1226            button_wrap.classList.add("elementor-widget-button");
1227            button_wrap.classList.add("io_access_button");
1228            button_wrap.appendChild(newButton);
1229            let req = false;
1230            if(jQuery("#io_acc_required_"+path).first().text()>0) req = true;
1231            if(!req){
1232              i.appendChild(button_wrap);
1233            }else{
1234              var textnode = document.createTextNode("Included");
1235              i.appendChild(textnode);
1236            }
1237          }
1238        }
1239      }
1240    }
1241    /*</editor-fold>*/
1242
1243    let upsell_array = document.querySelectorAll(".io_upsell_li");
1244    count = 0;
1245    for (let i of upsell_array) {
1246      count++;
1247      let newButton = button_add.cloneNode(true);
1248      newButton.id = button_add.id + count;
1249      newButton.classList.remove("elementor-animation-grow");
1250      newButton.classList.add("elementor-animation-shrink");
1251
1252      let button_wrap = document.createElement("div");
1253      button_wrap.classList.add("elementor-widget-button");
1254      button_wrap.classList.add("io_upsell_button");
1255      button_wrap.appendChild(newButton);
1256      i.appendChild(button_wrap);
1257    }
1258
1259    if(io_deliverymethod == "on" && jQuery(".calDeliveryMethodLabel").length==0){
1260      let delivery_method_container = jQuery("#ioDeliveryMethodContainer").first();
1261      delivery_method_container.append('<span class="calDeliveryMethodLabel">Select Delivery Method</span>');
1262      let delivery_method_html = '<select class="ioDeliveryMethods" onchange="deliveryMethodSelected()">';
1263      let delivery_methods = Object.keys(io_delivery_methods)
1264      for(const index in delivery_methods){
1265        if(!io_delivery_methods_restrict){
1266          delivery_method_html += '<option value="'+delivery_methods[index]+'">'+delivery_methods[index]+'</option>';
1267          if(index == 0 && !getCookie("io_delivery_method")) setCookie("io_delivery_method", delivery_methods[index], 14);
1268        }else if( !io_delivery_methods_restrict.includes( io_delivery_methods[ delivery_methods[index] ]["id"] ) ){
1269          delivery_method_html += '<option value="'+delivery_methods[index]+'">'+delivery_methods[index]+'</option>';
1270          if(index == 0 && !getCookie("io_delivery_method")) setCookie("io_delivery_method", delivery_methods[index], 14);
1271        }
1272      }
1273      delivery_method_container.append(delivery_method_html);
1274      delivery_method_container.show();
1275      if(getCookie("io_delivery_method")){
1276        jQuery(".ioDeliveryMethods").val(getCookie("io_delivery_method"));
1277      }
1278    }else{
1279      setCookie("io_delivery_method", "", 14);
1280    }
1281
1282    let allow_same_day = 1;
1283    if(io_cartAllowSameDay == "on"){
1284      allow_same_day = 0;
1285    }
1286
1287    /*<editor-fold desc="Cart Calandar and Time Settings Setup">*/
1288    //var fullmonth_array = jQuery.datepicker.regional["en"].monthNames;
1289    jQuery("#cartCalendar").datepicker({
1290      changeMonth: true,
1291      changeYear: true,
1292      //monthNamesShort : fullmonth_array,
1293      dateFormat: dateFormat,
1294      rangeSelect: true,
1295      numberOfMonths: 1,
1296      stepMonths: 1,
1297      prevText: "<< Previous Months",
1298      nextText: "Next Months >>",
1299      speed: "fast",
1300      showOn: "both",
1301      onChangeMonthYear: cal_onChangeMonthYear,
1302      onSelect: cal_onSelect,
1303      buttonText: "Calendar",
1304      minDate: allow_same_day,
1305      firstDay: 0
1306    });
1307    jQuery(".ui-datepicker-trigger").hide();
1308    if(restrictTimes){
1309      jQuery(".timepicker").timepicker({
1310        startTime: new Date(0, 0, 10, 0, 0, 0),
1311        endTime: new Date(0, 0, 0, 20, 0, 0, 0),
1312        minTime:restrictTimeStart,
1313        maxTime:restrictTimeEnd,
1314        /*show24Hours: $show24Hours,*/
1315        timeFormat: timeFormat,
1316        separator: ":",
1317        className: "elementor-widget-text-editor",
1318        step: 15,
1319        disableTouchKeyboard: true
1320      }).keypress(function(e){
1321        e.preventDefault();
1322      });
1323    } else{
1324      jQuery(".timepicker").timepicker({
1325        startTime: new Date(0, 0, 10, 0, 0, 0),
1326        endTime: new Date(0, 0, 0, 20, 0, 0, 0),
1327        /*show24Hours: $show24Hours,*/
1328        timeFormat: timeFormat,
1329        separator: ":",
1330        className: "elementor-widget-text-editor",
1331        step: 15,
1332        disableTouchKeyboard: true
1333      });
1334    }
1335
1336    /* if we have company wide timeslots, alter time select in cart. Do this only if we are set to single day only */
1337    if(io_company_timeslots.length != 0 && io_cartdayselect == "single_day"){
1338      let time_select_container = jQuery("#ioCartTimeSelectContainer").first();
1339      time_select_container.empty();
1340      let selected_date_html = '<span style="margin-right: 5px !important" class="calTimeLabel">Date</span><i class="fas fa-calendar-check"></i><input style="margin-left: 5px !important" type="text" name="dateStart" class="ioCartDateInput" readonly="readonly" /><input style="display: none !important" type="text" name="dateEnd" class="ioCartDateInput" readonly="readonly" />'
1341      time_select_container.append(selected_date_html);
1342      time_select_container.append("<br>")
1343      time_select_container.append('<span class="calTimeLabel">Select Timeslot</span>');
1344      let timeslot_html = '<select class="ioCartCompanyTimeslots">';
1345      for(i=0; i<io_company_timeslots.length; ++i){
1346        timeslot_html += io_company_timeslots[i];
1347      }
1348      timeslot_html += "</select>"
1349      time_select_container.append(timeslot_html);
1350
1351    }
1352
1353    // Timeslot element on Quote Form
1354    const timeslotSelectElement = jQuery(".controls select[name=timeslot]");
1355
1356    /* jQuery( ".datepicker" ).datepicker({dateFormat: "m/d/yy",minDate:0}); */
1357    /* jQuery( ".datepicker" ).val(getCookie("checkDate")); */
1358    start_date = getCookie("io_dateStart");
1359    end_date = getCookie("io_dateEnd");
1360    start_time = getCookie("io_timeStart");
1361    end_time = getCookie("io_timeEnd");
1362    jQuery("input[name=dateStart]").val(start_date);
1363    jQuery("input[name=dateEnd]").val(end_date);
1364    if(io_company_timeslots.length != 0 && io_cartdayselect == "single_day" && getCookie("io_company_timeslot_selected")){
1365      jQuery(".ioCartCompanyTimeslots").val(getCookie("company_timeslot_selected"));
1366      // Set it on the quote page too.
1367      timeslotSelectElement.val(getCookie("io_company_timeslot_selected"));
1368    } else{
1369      jQuery("input[name=timeStart]").val(start_time);
1370      jQuery("input[name=timeEnd]").val(end_time);
1371    }
1372
1373    timeslotSelectElement.on('change', function() {
1374      // IO-31167: Upon timeslot change on Quote Form,
1375      // update timeslot cookie value for persistence
1376      if(this.value) {
1377        setCookie('io_company_timeslot_selected', this.value, 14);
1378      }
1379    });
1380
1381    if (jQuery("input[name=dateEnd]").val() != "") {
1382      setCalBackground();
1383      jQuery("#cartSubtotal").html(simpleCart.toCurrency(simpleCart.total()));
1384      if(getCookie("io_dateApplied") === "true") calCancel();
1385      else {
1386        jQuery("input[name=dateStart]").val(getCookie("io_dateStart"));
1387        jQuery("input[name=dateEnd]").val(getCookie("io_dateEnd"));
1388        if(io_company_timeslots.length != 0 && io_cartdayselect == "single_day" && getCookie("io_company_timeslot_selected")){
1389          jQuery(".ioCartCompanyTimeslots").val(getCookie("io_company_timeslot_selected"));
1390        }
1391        else if(io_force_blank_timepickers == "on")
1392        {
1393          setCookie("io_timeStart", "", 14);
1394          setCookie("io_timeEnd", "", 14);
1395          jQuery('[name=timeStart]').val("");
1396          jQuery('[name=timeEnd]').val("");
1397        }
1398        else{
1399          jQuery("input[name=timeStart]").val(getCookie("io_timeStart"));
1400          jQuery("input[name=timeEnd]").val(getCookie("io_timeEnd"));
1401        }
1402
1403        jQuery(".changeDateLinkWrapper").hide();
1404      }
1405    }
1406    /*</editor-fold>*/
1407
1408    jQuery("#io-dialog").dialog({
1409      autoOpen: false,
1410      resizable: false,
1411      modal: true,
1412      dialogClass: "noTitleStuff",
1413      width: 350,
1414      open: function () {
1415        jQuery(".ui-widget-overlay").bind("click", function () {
1416          jQuery("#io-dialog").dialog("close");
1417        })
1418      }
1419    });
1420
1421    /* change jquery calendar next/prev buttons to fa arrows w/matching site color */
1422    jQuery("#cartCalendar .ui-datepicker-prev").addClass("fas fa-arrow-left").css("color", pallet_color1);
1423    jQuery("#cartCalendar .ui-datepicker-next").addClass("fas fa-arrow-right").css("color", pallet_color1);
1424
1425    /* hide sections if not set */
1426    if(jQuery(".io_product_circuits_right").first().text()=="0"){jQuery(".io_product_circuits_right,.io_product_circuits_left").hide();}
1427    if(jQuery(".io_city_list").html()==""){jQuery(".io_landingpages").hide();}
1428    /* using this instead as it will handle custom ones added */
1429    let io_field_valbox = document.querySelector(".io_product_infobox");
1430    if (io_field_valbox != null || io_field_valbox != undefined) {
1431      let io_field_valarr = io_field_valbox.querySelectorAll(".io_product_detail_box");
1432      for (let i of io_field_valarr) {
1433        let check = i.querySelector("p:nth-child(2)");
1434        if (check != null && check.innerText == "") i.style.display = "none";
1435      }
1436    }
1437
1438    /* Hide description if there is no description */
1439    desc_box = document.querySelector(".io_product_desc")
1440    if(desc_box != null && desc_box.innerText.length == 0 && desc_box.innerHTML.length == 0){
1441      desc_detail_box = desc_box.parentElement;
1442      desc_detail_box.style.display = "none";
1443    }
1444
1445    if(document.querySelector(".io_product_reviewbox")!=null){
1446      if (document.querySelector(".io_product_reviewbox").innerText == "") {
1447        if(document.querySelector(".io_star_rating")!=null) document.querySelector(".io_star_rating a").style.display = "none";
1448      }
1449    }
1450
1451    let rid = jQuery(".io_product_container .item_rentalid").first().text();
1452    let regex = new RegExp("^io_product_price_.*_" + rid + "$");
1453    for (const price_index in io_prices){
1454      if(regex.test(io_prices[price_index])){
1455        use_weekday_weekend = false;
1456      }
1457    }
1458
1459    /* hide end date input. */
1460    if(!multi_day){
1461      /* TODO: Need to wait and see if this is necessary. If so needs to be more involved than this. */
1462      /* jQuery("input[name=dateEnd]").style("visibility", "hidden"); */
1463    }
1464    /* Call page avail now so we can display live price if its enabled */
1465    setTimeout(function(){
1466      if(jQuery(".io_acc_accessorydd").text()==1 && jQuery(".io_acc_ispackage").text()!=1){
1467        jQuery("#bookNowBtn").removeClass("item_add").addClass("item_add_off").trigger("classChange");
1468        checkAvailPageOnly();
1469      }else{
1470        checkAvailPageOnly();
1471      }
1472    },50);
1473
1474    /* Adjust picbox for header heights */
1475    setTimeout(adjustPicBoxForHeader,500);
1476
1477    /* Show buttons for distance charge check if the setting is on. Hide or show map button if applicable*/
1478    if(io_distance_charge){
1479      jQuery(".delivery_charge_check_container").show();
1480      jQuery(".calc_price_with_map_container").hide();
1481      jQuery(".checkDeliveryCartContainer").show();
1482    } else {
1483      jQuery(".delivery_charge_check_container").hide();
1484      jQuery(".calc_price_with_map_container").hide();
1485      jQuery(".checkDeliveryCartContainer").hide();
1486    }
1487    if(io_brand=="EH"){
1488      jQuery(".delivery_charge_check_container").hide();
1489      jQuery(".eh_additional_description").show();
1490    }
1491    if(jQuery(".io_product_infobox .item_inputtype").text() === "Map"){
1492      jQuery(".delivery_charge_check_container").hide();
1493      jQuery(".checkDeliveryCartContainer").hide();
1494      jQuery(".calc_price_with_map_container").show();
1495    }
1496
1497    /* If we have delivery set in cookie, be sure to show the charge in the cart. */
1498    if(getCookie("io_deliveryFee") && simpleCart.items().length > 0) {
1499      setDeliverySubtotal(getCookie("io_deliveryFee"));
1500      jQuery("#deliverSubtotalContainer").show();
1501      jQuery("#checkDeliveryMessage").hide();
1502    } else{
1503      jQuery("#deliverSubtotalContainer").hide();
1504    }
1505
1506    /* moved back here for IO-22561 */
1507    if(simpleCart.items().length > 0){
1508      let headerBookButton = jQuery("a[href$='io_quoteform/']");
1509      headerBookButton.addClass("ioCart_link");
1510      headerBookButton.attr("href", "javascript:;");
1511    }
1512    jQuery(".cartInfo").unbind("click").one("click", function(event){
1513      event.stopPropagation();
1514      event.stopImmediatePropagation();
1515      cartShow();
1516    });
1517    jQuery(".ioCart,.ioCart_link").unbind("click").one("click", function(event){
1518      event.stopPropagation();
1519      event.stopImmediatePropagation();
1520      cartShow();
1521    });
1522
1523    /* hide if click outside cart */
1524    jQuery(document).mouseup(function(e){
1525      var container = jQuery("#cartPopover");
1526      var cartButton = jQuery(".cartInfo, .ioCart, .ioCart_link");
1527      var addButton = jQuery(".item_add");
1528      var timePicker = jQuery(".ui-timepicker-wrapper");
1529
1530      if(jQuery(".cartInfo, .ioCart, .ioCart_link").hasClass("open")){
1531        if(!container.is(e.target) && container.has(e.target).length === 0 && !cartButton.is(e.target) && cartButton.has(e.target).length === 0 && !addButton.is(e.target) &&  addButton.has(e.target).length === 0 && !timePicker.is(e.target) &&  timePicker.has(e.target).length === 0 && !jQuery(".address_entry").is(e.target) &&  jQuery(".address_entry").has(e.target).length === 0){
1532          cartHide();
1533        }
1534      }
1535    });
1536
1537    if(!getCookie("io_state") && io_default_state){
1538      setCookie("io_state", io_default_state, 14);
1539    }
1540    if(country != "US") {
1541      jQuery("#io_cd_state").replaceWith('<input id="io_cd_state" style="display: table-cell" name="state" type="text"></input>');
1542      jQuery("#io_cdl_zip_label").text("Postal code");
1543      if(country == "CA"){
1544        jQuery("#io_cdl_state_label").text("Province");
1545      } else if(country == "AU"){
1546        jQuery("#io_cdl_city_label").text("Suburb");
1547      }
1548    } else{
1549      jQuery("#io_cd_zip").attr("type", "number");
1550    }
1551    /* Set up on change events to stop end timepickers from allowing users to pick times before start time */
1552    setTimeout(restrictEndTimepickers, 500);
1553    if(io_hide_end_time == "on" && io_default_duration > 0){
1554      jQuery('[name="timeEnd"]').parent().hide();
1555      // Hide end time stuff on checkout page and in the text.
1556      jQuery(".io_event_body_time .control-group:nth-child(2)").hide();
1557      jQuery(".io_event_body_time_display_text").text(jQuery(".io_event_body_time_display_text").text().replace(/\s*→.*/, ""))
1558      jQuery('[name="timeStart"]').change(function(){
1559        const regex = /^(\d{1,2}):(\d{2})(?:\s*([AP]M))?$/i;
1560        const match = this.value.match(regex);
1561
1562        let hours = parseInt(match[1], 10);
1563        const minutes = parseInt(match[2], 10);
1564        const period = match[3] ? match[3].toUpperCase() : null;
1565
1566        if (period) {
1567          if (period === "PM" && hours !== 12) hours += 12;
1568          if (period === "AM" && hours === 12) hours = 0;
1569        }
1570
1571        const baseDate = new Date(1970, 0, 1, hours, minutes);
1572        const newTime = new Date(baseDate.getTime() + io_default_duration * 3600000);
1573
1574        if (period) {
1575          // 12-hour
1576          let newHours = newTime.getHours();
1577          const newMinutes = newTime.getMinutes();
1578          const newPeriod = newHours >= 12 ? "PM" : "AM";
1579          newHours = newHours % 12;
1580          if (newHours === 0) newHours = 12;
1581          let end_time = `${newHours}:${newMinutes.toString().padStart(2, "0")} ${newPeriod}`;
1582          jQuery('[name="timeEnd"]').val(end_time);
1583        } else {
1584          // 24 hour
1585          let end_time = `${newTime.getHours().toString().padStart(2, "0")}:${newTime.getMinutes().toString().padStart(2, "0")}`;
1586          jQuery('[name="timeEnd"]').val(end_time);
1587        }
1588      });
1589    }
1590
1591    /* If we have a custom message in cart, display it. */
1592    if(io_cart_message){
1593      show_cart_message();
1594    }
1595
1596    /* code for day select in cart */
1597    if(io_cartdayselect == "dropdown_options" && io_multidayquote === "on"){
1598      saved_whatday = getCookie("io_whatday");
1599      if(saved_whatday) jQuery("#whatday").val(saved_whatday);
1600      endDisplay();
1601      setCalBackground();
1602    } else{
1603      jQuery("#div-overnight").hide();
1604      jQuery("#whatday").val("");
1605    }
1606
1607    checkRestrictedDeliveries()
1608    /* If we are using the information gathering tool, we do not want to show this message. */
1609    if( live_pricing_is_on() && io_info_required == "off" ){
1610      if(!event_time_set() && io_always_display_live_price != "on"){
1611        jQuery("#item_live_price_time_set_message").show();
1612      }else{
1613        jQuery("#item_live_price_time_set_message").hide();
1614      }
1615    }
1616
1617
1618    /* Check if information gathering header exists. If it does, Remove set even button and add some classes on onclicks */
1619    if(jQuery("#ioInfoHeader").length){
1620      remove_set_event_buttton();
1621      add_classes_and_onClicks();
1622      header_increment_step();
1623    }
1624
1625    jQuery(".io_acc_li").each(function() {
1626      if(jQuery(this).find(".item_required").first().text() > 0 && jQuery(this).find(".item_accessorydd").first().text() == 1){
1627        jQuery(jQuery(jQuery(this).parent()).prev()).appendTo(".io_product_requiredDD_accessories");
1628        jQuery(jQuery(this).parent()).appendTo(".io_product_requiredDD_accessories");
1629        jQuery(".io_product_requiredDD_accessories").show();
1630      }
1631    });
1632
1633    if(jQuery(".io_product_accessories .io_acc_li").length == 0) jQuery(".io_product_accessories").hide();
1634
1635    /* Hide the cart add button for items with required accessories on category page */
1636    jQuery(".item_hasRequiredAcc").each(function() {
1637      if (this.innerText == '1') {
1638        let rental_id_element = jQuery(this).parent().find(".item_rentalid")[0];
1639        let addCartButton = jQuery(".io_item2_list_inner .add_cart_" + rental_id_element.innerText).find('.io_button');
1640        addCartButton.removeClass("item_add");
1641        addCartButton.html('<i class="fas fa-arrow-right"></i>');
1642
1643        let itemHref = jQuery(this).parent().find(".item_href").text();
1644        addCartButton.attr('href', itemHref);
1645      }
1646    });
1647
1648
1649    /* If they have same day selection allowed, need to update checkout page datepicker on delay to make sure it works */
1650    if(io_cartAllowSameDay == "on"){
1651      setTimeout(allow_same_day_select_on_checkout, 500);
1652    }
1653
1654    if(io_info_required_data && io_info_required == "on"){
1655      let io_required_data = io_info_required_data;
1656      jQuery("#ioAdditonalInformationContainer").show();
1657      for (const [data, value] of Object.entries(io_required_data)) {
1658        if(value == 1){
1659          jQuery("#io_info_modal_"+data).css("display", "inline-flex")
1660          jQuery("#io_im_"+data).val(getCookie(data));
1661        }
1662      }
1663      show_or_hide_required_info_message()
1664    }
1665    if(jQuery(".bootstrap-timepicker").length == 0) {
1666      if (!/Mobi|Android/i.test(navigator.userAgent)) {
1667        jQuery("#cartPopover").scroll(function () {
1668          jQuery("[name=timeStart]").timepicker("hide");
1669          jQuery("[name=timeEnd]").timepicker("hide");
1670        });
1671        jQuery(window).scroll(function () {
1672          jQuery("#cartPopover [name=timeStart]").timepicker("hide");
1673          jQuery("#cartPopover [name=timeEnd]").timepicker("hide");
1674        });
1675      }
1676    }
1677
1678    if(jQuery(".io_product_infobox .item_inputtype").text() == "Map"){
1679      simpleCart.items().forEach(function (item, index){
1680        if(item.get("rentalid") === jQuery(".io_product_infobox .item_rentalid").text()){
1681          if(item.get("quantity") > 1){
1682            let units;
1683            if(jQuery(".io_product_infobox .item_qtytype").text() == "Area"){
1684              units = "sq meters"
1685              if(country === "US") units = "sq feet"
1686            }else if(jQuery(".io_product_infobox .item_qtytype").text() == "Perimeter"){
1687              units = "meters"
1688              if(country === "US") units = "feet"
1689            }
1690            set_price_on_item_page(units, item.get("quantity"));
1691          }
1692        }
1693      });
1694    }
1695    /* IO-21808 */
1696    jQuery(".io_product_price_box").each(function() {
1697      let classes = jQuery(this).attr("class");
1698      jQuery(this).attr("class", classes.replace(":", "_"));
1699    });
1700
1701    /* Set time instructions (IO-21496) */
1702    set_cart_time_instructions();
1703
1704    if(io_accessory_select === "on"){
1705      if(jQuery(".io_product_acc_pkg").children().length > 0){
1706        let main_rental_id = jQuery(".item_rentalid").text();
1707        let sel_div = jQuery("<div class=\"io_product_acc_pkg\" style=\"display:flex; margin-top:10px;\"></div>");
1708        let sel = jQuery("<select class=\"io_product_acc_pkg\" onchange=\"accOnClick(this)\" />");
1709        sel.append("<option value=\"\" selected=\"selected\" style=\"display:none\" disabled>Select one..</option>")
1710        jQuery("[id^=io_acc_shortname_"+main_rental_id+"]").each(function(){
1711          sel.append("<option value="+this.id+">"+this.innerHTML+"</option>")
1712          if(this.id.split("_").length > 4){
1713            let split_id = this.id.split("_");
1714            let option_rental_id = split_id[split_id.length - 1];
1715            let sel2 = jQuery("<select id=\"io_product_acc_pkg_sel_"+option_rental_id+"\" style=\"display:none; margin-left:5px;\" onchange=\"accOnClick(this)\" />");
1716            sel2.append("<option value=\"\" selected=\"selected\" style=\"display:none\" disabled>Select one..</option>")
1717            jQuery("[id^=io_acc_shortname_"+option_rental_id+"_]").each(function(){
1718              sel2.append("<option value="+this.id+">"+this.innerHTML+"</option>")
1719            });
1720            sel_div.append(sel2);
1721          }
1722        });
1723        sel_div.prepend(sel);
1724        jQuery(".io_product_acc_pkg").replaceWith(sel_div);
1725      }
1726    }
1727    if(io_cart_party_planner_email === "on" && io_cart_party_planner_destination){
1728      jQuery("#cartPartyBuilderEmailContainer").show()
1729      if(getCookie("io_email")){
1730        jQuery("#cartPartyBuilderEmailInput").val(getCookie("io_email"));
1731      }
1732    }
1733
1734    if(io_brand == "PW"){
1735      jQuery(".io_product_price_box").attr("style", "display: none !important;");
1736      jQuery(".io_product_price_sqfoot").attr("style", "display: grid !important;");
1737    }
1738
1739    setTimeout(simpleCart.init, 100);
1740    if(io_hide_zero == 1){
1741      jQuery(".io_product_price_top_left").each(function (){
1742        if(Number(this.innerText.replace(/[^0-9.-]+/g,"")) == 0){
1743          jQuery(this).parent().attr('style','display:none !important');
1744        }
1745      });
1746      jQuery(".io_product_price_left").each(function (){
1747        if(Number(this.innerText.replace(/[^0-9.-]+/g,"")) == 0){
1748          jQuery(this).parent().attr('style','display:none !important');
1749        }
1750      });
1751    }
1752      if (io_categoryVariantImages == 'on'){
1753          jQuery(".io_category_thumbox").show();
1754          jQuery('.view-product-button').addClass('view-product-button2')
1755      }
1756    let giftcard_value = jQuery(".item_giftcardvalue");
1757    if(giftcard_value && giftcard_value.text()){
1758      jQuery(".delivery_charge_check_container").hide();
1759    }
1760
1761    if (io_customer_geolocation == 'on') initializeGeolocation();
1762  }); /*end of on-ready*/
1763  /*</editor-fold>*/
1764
1765  /*<editor-fold defaultstate="collapsed" desc="Helper Functions">*/
1766  function phraseUpdateCount(inputElement)
1767  {
1768  //read the text and strip out spaces
1769    const fullText = inputElement.value;
1770    const lettersOnly  = fullText.replace(/\s+/g, "");
1771    const count = lettersOnly.length;
1772
1773    const cookieKey = inputElement.classList[0];
1774
1775    document.querySelector(".item_quantity").textContent = count;
1776
1777    setCookie(cookieKey, fullText, 45);
1778  }
1779  function io_party_planner_email_submit(){
1780    let valid_regex = /^(([^<>()[\]\\.,;:\s@"]+(\.[^<>()[\]\\.,;:\s@"]+)*)|.(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/;
1781    let email = jQuery("#cartPartyBuilderEmailInput").val();
1782    if(email){
1783      if(email.match(valid_regex)){
1784        setCookie("io_email", email, 14);
1785        window.open(io_cart_party_planner_destination, '_blank').focus();
1786      }else{
1787        jQuery("#cartPartyBuilderEmailWarning").show();
1788      }
1789    }else{
1790      jQuery("#cartPartyBuilderEmailWarning").show();
1791    }
1792  }
1793
1794  function rid_in_batch(rid, batch_ids){
1795    let result = batch_ids.filter(function(batch){
1796      if(batch.includes(this)) return true;
1797    }, rid);
1798    return result
1799  }
1800
1801  function set_cart_time_instructions(){
1802    /* Making it clearer that customers need to set the time in order to see pricing and availability. */
1803    let instructions_container = jQuery("<p id=\"ioCartTimeInstructions\"></p>");
1804    let instructions = "";
1805
1806    if(multi_day){
1807      instructions += "Select the event date or date range using the calendar";
1808    }else{
1809      instructions += "Select the event date using the calendar";
1810    }
1811    instructions += ".";
1812    instructions_container.text(instructions);
1813    jQuery("#cartCalendar").append(instructions_container);
1814  }
1815
1816  function live_pricing_is_on(){
1817    /*
1818    Checks to see if live pricing is on. Assumes it is on unless one of the following conditions:
1819       The setting Hide Live Price is off.
1820       The setting Show Weekend/Weekday Pricing is off.
1821       Delivery method pricing is enabled by default.
1822       We are on an item page that uses delivery method pricing.
1823    */
1824    if(io_hide_live_prices != 1 || io_weekEndPrice != "on" ||
1825            io_delivery_prices["default"].length != 0 || jQuery(".io_product_infobox .item_rentalid").innerText in io_delivery_prices["override"] ||
1826            io_custom_prices["default"].length != 0 || jQuery(".io_product_infobox .item_rentalid").innerText in io_delivery_prices["override"]){
1827      return false;
1828    }
1829    return true;
1830  }
1831
1832  function allow_same_day_select_on_checkout(){
1833    jQuery(".jquery-datepicker").datepicker("option", "minDate", 0);
1834  }
1835
1836  function show_or_hide_required_info_message(){
1837    if(io_info_required == "on"){
1838      if(!all_info_provided()){
1839        jQuery("#io_all_prices").hide();
1840        jQuery("#item_additonal_info_open_message").show();
1841      }else{
1842        jQuery("#io_all_prices").show();
1843        jQuery("#item_additonal_info_open_message").hide();
1844      }
1845    }
1846  }
1847
1848  function all_info_provided(){
1849    /* This is used for when the "Hide all pricing on page until information is provided" setting is on price settings. */
1850    let all_data_provided = true;
1851    let io_required_data = io_info_required_data;
1852    for (const [data, value] of Object.entries(io_required_data)) {
1853      if(value == 1){
1854        if(!getCookie(data)){
1855          all_data_provided = false
1856        }
1857      }
1858    }
1859
1860    if(live_pricing_is_on() && !event_time_set()) {
1861      all_data_provided = false;
1862    }
1863
1864    return all_data_provided;
1865  }
1866
1867  function event_time_set(){
1868    if(getCookie("io_timeStart") &&
1869            getCookie("io_timeEnd") &&
1870            getCookie("io_dateStart") &&
1871            getCookie("io_dateEnd")){
1872      return true;
1873    } else{
1874      return false
1875    }
1876  }
1877
1878  function show_cart_message(){
1879    message_container = jQuery("#cartCustomMessage");
1880    message_container.html(io_cart_message);
1881    message_container.show();
1882  }
1883
1884  function deliveryMethodSelected(){
1885    setCookie("io_delivery_method", jQuery(".ioDeliveryMethods option:selected").text(), 14);
1886    checkRestrictedDeliveries();
1887  }
1888
1889  function adjustPicBoxForHeader(){
1890    /* For some reason its hard to get css with querySelector so we use jQuery to get the picbox. */
1891    pic_box = jQuery(".io_product_picbox");
1892    io_header = document.querySelector(".io_header");
1893    if(pic_box != null && pic_box.css("position") == "sticky"){
1894      if(io_header != null){
1895        header_height = io_header.offsetHeight;
1896        pic_box.css("top", (10+header_height).toString()+"px");
1897      }
1898      else{
1899        possible_headers = document.querySelectorAll("header,section")
1900        possible_headers.forEach((ele) =>{
1901          if(ele.style.top == "0px" && (ele.style.position == "fixed" || ele.style.position == "sticky")){
1902            header = ele;
1903            header_height = header.offsetHeight;
1904            pic_box.css("top", (10+header_height).toString()+"px");
1905
1906          }
1907        });
1908      }
1909    }
1910  }
1911  function cart_times_all_set(){
1912    if(jQuery("#ioCartTimeSelectContainer [name=dateStart]").val() == ""){
1913      return false;
1914    }
1915    if(io_hidetimes === "off" || io_hidetimes === ""){
1916      if(jQuery("#ioCartTimeSelectContainer [name=timeStart]").val() == ""){
1917        return false;
1918      }
1919      if(jQuery("#ioCartTimeSelectContainer [name=timeEnd]").val() == ""){
1920        return false;
1921      }
1922    }
1923
1924    return true;
1925  }
1926  function checkRestrictedDeliveries(){
1927    let items = simpleCart.items()
1928    let restrictions_found = false;
1929    for(i in items){
1930      let rid = items[i].get("rentalid");
1931      if(typeof jQuery(".ioDeliveryMethods").val() != "undefined"){
1932        if(io_delivery_methods[jQuery(".ioDeliveryMethods").val()]["restricted"].includes(rid)){
1933          jQuery("#deliveryMethodWarning").show();
1934          restrictions_found = true;
1935        }
1936      }
1937    }
1938    if(!restrictions_found){
1939      jQuery("#deliveryMethodWarning").hide();
1940    }
1941  }
1942
1943  function display_cart_warning(item){
1944    let cart_warning_container = jQuery("#cartWarning");
1945
1946    // Check if an event date if not we should tell them to set it.
1947    event_times = getAvailTimes();
1948    if(!event_times[0] || !event_times[1]){
1949      cart_warning_container.text("Please set the date and time for your event above.");
1950      cart_warning_container.show();
1951      return false;
1952    }
1953
1954    let item_name = item.get("name");
1955    let item_timeslots = item.get("timeslots");
1956    let timeslot_name = getTimeslotName(item_timeslots);
1957
1958    let stop_loop = false;
1959    if(item_timeslots){
1960      if(jQuery(item_timeslots).nodeName == "SELECT"){
1961        /* NOTE: It should not be possible for timeslots to be empty.
1962                   But in the event they somehow are, we should have this here. */
1963        /* timeslots */
1964        var timeslot_sel_range = jQuery(".item-timeslots [name=\""+timeslot_name+"\"] option:selected").val();
1965        if(typeof timeslot_sel_range != "undefined"){
1966          var [start_time, end_time] = break_timeslot_sel_range(timeslot_sel_range);
1967        }
1968      }else{
1969        /*  timepickers */
1970        let [start_timepicker, end_timepicker] = get_cart_timepickers(timeslot_name);
1971        var start_time = start_timepicker.value;
1972        var end_time = end_timepicker.value;
1973      }
1974      if(!start_time || !end_time){
1975        cart_warning_container.text("Please select a time range for the following item: " + item_name);
1976        cart_warning_container.show()
1977        stop_loop = true;
1978      }
1979    } else{
1980      cart_warning_container.text("Some items are not available on this date.");
1981      cart_warning_container.show()
1982    }
1983    return stop_loop
1984  }
1985
1986  const io_personal_cookie_keys = ["io_email", "io_phone", "io_address", "io_city", "io_state", "io_zip"];
1987
1988  function ioHasMarketingConsent(){
1989    if(typeof cmplz_has_consent !== 'function'){
1990      return true;
1991    }
1992    return cmplz_has_consent('marketing');
1993  }
1994
1995  function ioUnwrapStoredValue(raw) {
1996      // Fully peel any {v,e} wrapper layers that may have accumulated when an
1997      // older plugin version re-saved an already-wrapped value (IO-36799). Cart
1998      // values (dates, times, addresses) are never JSON objects, so any layer
1999      // that parses to a {v,...} object is a wrapper to unwrap. Returns
2000      // { value, expired, malformed } describing the innermost stored string.
2001      var value = (raw == null) ? "" : String(raw);
2002      for (var depth = 0; depth < 25; depth++) {
2003        var trimmed = value.trim();
2004        if (trimmed.charAt(0) !== '{') break;          // plain value -> done
2005        var obj;
2006        try {
2007          obj = JSON.parse(trimmed);
2008        } catch (e) {
2009          break;                                       // not parseable -> stop, keep value
2010        }
2011        if (!obj || typeof obj !== 'object' || !('v' in obj)) break;  // not our wrapper
2012        if (obj.e && Date.now() > obj.e) {
2013          return { value: "", expired: true, malformed: false };
2014        }
2015        value = (obj.v != null) ? String(obj.v) : "";
2016      }
2017      // Only flag as malformed if what remains still looks like our own broken
2018      // {"v":...} wrapper (e.g. truncated) -- never an ordinary value that just
2019      // happens to start with "{", which must be preserved untouched.
2020      var malformed = /^\s*\{\s*"v"\s*:/.test(value);
2021      return { value: value, expired: false, malformed: malformed };
2022  }
2023
2024  function setCookie(cname, cvalue, exdays) {
2025      if(io_personal_cookie_keys.indexOf(cname) !== -1 && !ioHasMarketingConsent()){
2026        return;
2027      }
2028      // Store values in localStorage with an io_ prefix for uniqueness and emulate expiration
2029      try {
2030        // Unwrap first so an already-wrapped value can never be re-wrapped and
2031        // compound into nested {v,e} layers (IO-36799).
2032        var clean = ioUnwrapStoredValue(cvalue).value;
2033        var expiresAt = (typeof exdays === 'number' && exdays > 0)
2034          ? Date.now() + (exdays * 24 * 60 * 60 * 1000)
2035          : null;
2036        var payload = JSON.stringify({ v: clean, e: expiresAt });
2037        window.localStorage.setItem(cname, payload);
2038      } catch (e) {
2039        // Swallow errors to keep behavior similar to cookie writes silently failing
2040        console.log(e);
2041      }
2042  }
2043
2044  function getCookie(cname) {
2045    // Read values from localStorage honoring expiration; return empty string if missing/expired
2046    try {
2047      var raw = window.localStorage.getItem(cname);
2048      if (!raw) return "";
2049      var result = ioUnwrapStoredValue(raw);
2050      if (result.expired || result.malformed) {
2051        // Drop expired or corrupted entries so they self-heal instead of being
2052        // rendered as raw JSON in the date/time fields (IO-36799).
2053        try { window.localStorage.removeItem(cname); } catch (e) {}
2054        return "";
2055      }
2056      return result.value;
2057    } catch (e) {
2058      return "";
2059    }
2060  }
2061  async function fetchAndSetCookie(name) {
2062    var requestInit = { credentials: "include" };
2063    fetch("https://rental.software/include/get_cookie.php?name=" + name, requestInit).then(function (response) {
2064      return response.json();
2065    }).then(function (response) {
2066      return handleResponse(name, response);
2067    });
2068  }
2069
2070  function handleResponse(name, response) {
2071    var currentCookieValue = getCookie(name);
2072    if (!!response.value && currentCookieValue !== response.value) {
2073      setCookie(name, response.value, 14);
2074    }
2075    return response.value;
2076  }
2077
2078  function clearIoPersonalDataForNoConsent(){
2079    io_personal_cookie_keys.forEach(function(key){
2080      try {
2081        window.localStorage.removeItem(key);
2082      } catch (e) {
2083        console.log(e);
2084      }
2085    });
2086
2087    var trackingUrl = (window.location.href.indexOf("localhost") > -1)
2088      ? "http://localhost/io/bugs/include/iotracking.php"
2089      : "https://rental.software/include/iotracking.php";
2090    var clearImg = new Image();
2091    clearImg.src = trackingUrl + "?action=remove&nocache=" + Math.random();
2092  }
2093
2094  document.addEventListener("cmplz_status_change", function (e) {
2095    if (e.detail.category === 'marketing' && e.detail.value === 'deny') {
2096      clearIoPersonalDataForNoConsent();
2097    }
2098  });
2099
2100  function break_timeslot_sel_range(timeslot_sel_range){
2101    /* Takes a time range given by selected timeslot and gets the start and end time removing meridiem.*/
2102    timeslot_sel_arr = timeslot_sel_range.split(" - ");
2103    var start_time = timeslot_sel_arr[0].replace("am"," am").replace("pm"," pm").replace("  "," ");
2104    var end_time = timeslot_sel_arr[1].replace("am"," am").replace("pm"," pm").replace("  "," ");
2105
2106    return Array(start_time, end_time);
2107  }
2108  function getAvailTimes(){
2109    /*
2110    Commonly used helper function. Accomplishes two things:
2111      Returns an array containing start_date, start_time, and event duration.
2112      Sets cookies for start and end date, and start and end time.
2113
2114    Uses the inputs available in the cart if they are filled out, so dateStart, dateEnd, timeStart, and timeEnd.
2115    If timeslots are being used in cart it chooses the selected timeslot and breaks it on - and gets the start ane end time from that.
2116    */
2117    let start_date = jQuery("input[name=dateStart]").val();
2118    let end_date = jQuery("input[name=dateEnd]").val();
2119    if(io_company_timeslots.length != 0 && io_cartdayselect == "single_day"){
2120      let cart_company_timeslot_selected = jQuery(".ioCartCompanyTimeslots option:selected").first().val();
2121      if(cart_company_timeslot_selected){
2122        setCookie("io_company_timeslot_selected", cart_company_timeslot_selected, 14);
2123        cart_company_timeslot_selected = cart_company_timeslot_selected.split("-");
2124        var start_time = cart_company_timeslot_selected[0].trim();
2125        var end_time = cart_company_timeslot_selected[1].trim();
2126      }
2127    } else {
2128      var start_time = jQuery("input[name=timeStart]").val();
2129      var end_time = jQuery("input[name=timeEnd]").val();
2130    }
2131
2132    if (start_date.length == 0) {
2133      start_date = getCookie("io_dateStart");
2134      end_date = getCookie("io_dateEnd");
2135      start_time = getCookie("io_timeStart");
2136      end_time = getCookie("io_timeEnd");
2137    }
2138
2139    const has_selected_company_timeslot = io_company_timeslots.length != 0
2140      && io_cartdayselect == "single_day"
2141      && jQuery(".ioCartCompanyTimeslots option:selected").first().val();
2142
2143    if(io_hidetimes === "on"
2144      && io_force_blank_timepickers != "on"
2145      && !has_selected_company_timeslot) {
2146      start_time = start_default;
2147      end_time = end_default;
2148      jQuery("input[name=timeStart]").val(start_time);
2149      jQuery("input[name=timeEnd]").val(end_time);
2150    }
2151
2152    if(io_force_blank_timepickers != "on")
2153    {
2154      if(start_time.length == 0)
2155      {
2156        start_time = start_default;
2157      }
2158      if(end_time.length == 0)
2159      {
2160        end_time = end_default;
2161      }
2162    }
2163
2164
2165    /* no past dates */
2166    if(start_date.length != 0 && convertDateStringtoDateObject(start_date, start_time) < new Date()){
2167      start_date="";
2168      end_date="";
2169    }
2170    /* setCookie("checkDate", start_date, 14); */
2171    setCookie("io_dateStart", start_date, 14);
2172    setCookie("io_dateEnd", end_date, 14);
2173    setCookie("io_timeStart", start_time, 14);
2174    setCookie("io_timeEnd", end_time, 14);
2175    /* If we are using the information gathering tool, we do not want to show this message.*/
2176    if( live_pricing_is_on() && io_info_required == "off" ){
2177      if(!event_time_set() && io_always_display_live_price != "on"){
2178        jQuery("#item_live_price_time_set_message").show();
2179      }else{
2180        jQuery("#item_live_price_time_set_message").hide();
2181      }
2182    }
2183
2184    var newDate1 = convertDateStringtoDateObject(start_date, start_time);
2185    var newDate2 = convertDateStringtoDateObject(end_date, end_time);
2186    let time_duration = ((newDate2 - newDate1) / 3600) / 1000;
2187    return [start_date,start_time,time_duration];
2188  }
2189
2190  function  getAllRentalIDsFromCart(){
2191    let rental_ids = "";
2192    jQuery("[id^='cartItem_']").each(function(){
2193      children = this.children
2194      for(let i = 0; i < children.length; ++i){
2195        if(children[i].className == "item-rentalid") {
2196          rental_ids += children[i].innerText + "|";
2197          break;
2198        }
2199      }
2200    });
2201    return rental_ids
2202  }
2203  /*</editor-fold>*/
2204
2205  /*<editor-fold defaultstate="collapsed" desc="Info Header Functions">*/
2206  function init_date_timepicker_for_info_header(){
2207    jQuery(".ioInfoDatepicker").datepicker({
2208      changeMonth: true,
2209      changeYear: true,
2210      dateFormat: dateFormat,
2211      rangeSelect: true,
2212      numberOfMonths: 1,
2213      stepMonths: 1,
2214      speed: "fast",
2215      showOn: "both",
2216      onChangeMonthYear: cal_onChangeMonthYear,
2217      buttonText: "Calendar",
2218      minDate: 1,
2219      firstDay: 0
2220    });
2221    jQuery("#ioHeaderDateStart").datepicker("option", { onSelect: function() {
2222        set_info_header_end_date();
2223        saveInfoHeader();
2224        // Add more functions if needed
2225      }
2226    });
2227
2228    if(restrictTimes){
2229      jQuery(".ioInfoTimepicker").timepicker({
2230        startTime: new Date(0, 0, 10, 0, 0, 0),
2231        endTime: new Date(0, 0, 0, 20, 0, 0, 0),
2232        minTime:restrictTimeStart,
2233        maxTime:restrictTimeEnd,
2234        /*show24Hours: $show24Hours,*/
2235        timeFormat: timeFormat,
2236        separator: ":",
2237        className: "elementor-widget-text-editor",
2238        step: 15,
2239        disableTouchKeyboard: true
2240      });
2241    } else{
2242      jQuery(".ioInfoTimepicker").timepicker({
2243        startTime: new Date(0, 0, 10, 0, 0, 0),
2244        endTime: new Date(0, 0, 0, 20, 0, 0, 0),
2245        /*show24Hours: $show24Hours,*/
2246        timeFormat: timeFormat,
2247        separator: ":",
2248        className: "elementor-widget-text-editor",
2249        step: 15,
2250        disableTouchKeyboard: true
2251      });
2252    }
2253    setTimeout(setUpTimeRestrictions_infoHeaderTimepickers, 500);
2254  }
2255
2256  function saveInfoHeader(){
2257    let info_header_start_date = jQuery("[id$=ioHeaderDateStart]");
2258    let info_header_end_date = jQuery("[id$=ioHeaderDateEnd]");
2259    let info_header_start_time = jQuery("[id$=ioHeaderTimeStart]");
2260    let info_header_end_time = jQuery("[id$=ioHeaderTimeEnd]");
2261    let info_header_address = jQuery("[id$=ioHeaderAddress]");
2262    let info_header_city = jQuery("[id$=ioHeaderCity]");
2263    let info_header_state = jQuery("[id$=ioHeaderState]");
2264    let info_header_zip = jQuery("[id$=ioHeaderZipCode]");
2265    let info_header_phone = jQuery("[id$=ioHeaderPhone]");
2266    let info_header_email = jQuery("[id$=ioHeaderEmail]");
2267
2268    if(info_header_start_time.val()) setCookie("io_timeStart", info_header_start_time.val(), 14);
2269    if(info_header_end_time.val()) setCookie("io_timeEnd", info_header_end_time.val(), 14);
2270    if(info_header_start_date.val()) setCookie("io_dateStart", info_header_start_date.val(), 14);
2271    if(info_header_end_date.val()) setCookie("io_dateEnd", info_header_end_date.val(), 14);
2272    if(info_header_address.val()) setCookie("io_address", info_header_address.val(), 14);
2273    if(info_header_city.val()) setCookie("io_city", info_header_city.val(), 14);
2274    if(info_header_state.val()) setCookie("io_state", info_header_state.val(), 14);
2275    if(info_header_zip.val()) setCookie("io_zip", info_header_zip.val(), 14);
2276    if(info_header_phone.val()) setCookie("io_phone", info_header_phone.val(), 14);
2277    if(info_header_email.val()) setCookie("io_email", info_header_email.val(), 14);
2278
2279    /* Set information in the cart. */
2280    calCancel();
2281
2282    header_increment_step();
2283
2284    /* Stop form from doing anything else for elementor */
2285    // jpa - still allow, turn off actions in form if wanted. to turn off io lead submission use the plugin settings
2286    //event.preventDefault();
2287    //event.stopPropagation();
2288    return true;
2289  }
2290
2291  function set_info_header_values(){
2292    let info_header_start_date = jQuery("[id$=ioHeaderDateStart]");
2293    let info_header_end_date = jQuery("[id$=ioHeaderDateEnd]");
2294    let info_header_start_time = jQuery("[id$=ioHeaderTimeStart]");
2295    let info_header_end_time = jQuery("[id$=ioHeaderTimeEnd]");
2296    let info_header_street = jQuery("[id$=ioHeaderAddress]");
2297    let info_header_city = jQuery("[id$=ioHeaderCity]");
2298    let info_header_state = jQuery("[id$=ioHeaderState]");
2299    let info_header_zip = jQuery("[id$=ioHeaderZipCode]");
2300    let info_header_phone = jQuery("[id$=ioHeaderPhone]");
2301    let info_header_email = jQuery("[id$=ioHeaderEmail]");
2302
2303    if(getCookie("io_timeStart")) info_header_start_time.val(getCookie("io_timeStart"));
2304    if(getCookie("io_timeEnd")) info_header_end_time.val(getCookie("io_timeEnd"));
2305    if(getCookie("io_dateStart")) info_header_start_date.val(getCookie("io_dateStart"));
2306    if(getCookie("io_dateEnd")) info_header_end_date.val(getCookie("io_dateEnd"));
2307    if(getCookie("io_address")) info_header_street.val(getCookie("io_address"));
2308    if(getCookie("io_city")) info_header_city.val(getCookie("io_city"));
2309    if(getCookie("io_state")) info_header_state.val(getCookie("io_state"));
2310    if(getCookie("io_zip")) info_header_zip.val(getCookie("io_zip"));
2311    if(getCookie("io_phone")) info_header_phone.val(getCookie("io_phone"));
2312    if(getCookie("io_email")) info_header_email.val(getCookie("io_email"));
2313  }
2314
2315  function add_classes_and_onClicks(){
2316
2317    /* First set up for dates */
2318    let info_header_start_date = jQuery("#ioHeaderDateStart");
2319    let info_header_end_date = jQuery("#ioHeaderDateEnd");
2320    info_header_start_date.addClass("ioInfoDatepicker");
2321    info_header_end_date.addClass("ioInfoDatepicker");
2322
2323    /* Now Timepickers */
2324    let info_header_start_time = jQuery("#ioHeaderTimeStart");
2325    let info_header_end_time = jQuery("#ioHeaderTimeEnd");
2326    info_header_start_time.addClass("ioInfoTimepicker");
2327    info_header_end_time.addClass("ioInfoTimepicker");
2328
2329    /* Add the onClick to the button */
2330    let button = jQuery("#ioInfoHeaderSubmit");
2331    button.click(saveInfoHeader);
2332    button.css("cursor", "pointer");
2333
2334    /* Init datepicker and timepickers */
2335    init_date_timepicker_for_info_header();
2336
2337    /* Lastly set the values if they are set already */
2338    set_info_header_values();
2339  }
2340
2341  function remove_set_event_buttton(){
2342    let set_event_button = jQuery(".pageDateRangeWrapper");
2343    if(set_event_button.length > 0) set_event_button.hide();
2344  }
2345
2346  function set_info_header_end_date(){
2347    if(!jQuery("#ioHeaderDateEnd").val()){
2348      jQuery("#ioHeaderDateEnd").val(jQuery("#ioHeaderDateStart").val())
2349    }
2350    jQuery("#ioHeaderDateEnd").datepicker("option", { minDate: new Date(jQuery("#ioHeaderDateStart").val()) });
2351  }
2352
2353  function header_increment_step(){
2354    let active = jQuery(".io-step-active");
2355
2356    switch(active.attr("id")){
2357      case "io-step-1":
2358        if (/Mobi|Android/i.test(navigator.userAgent)) {
2359          jQuery("#io-step-2,#io-step-3,#io-step-4").hide();
2360        }
2361        if(check_header_step_one(active)){
2362          active.removeClass("io-step-active");
2363          active.addClass("io-step-done")
2364          jQuery("#io-step-2").addClass("io-step-active")
2365          header_increment_step();
2366        }
2367        break;
2368      case "io-step-2":
2369        if (/Mobi|Android/i.test(navigator.userAgent)) {
2370          jQuery("#io-step-2,#io-step-3,#io-step-4").show();
2371        }
2372        if(simpleCart.items().length > 0){
2373          active.removeClass("io-step-active");
2374          active.addClass("io-step-done")
2375          jQuery("#io-step-3").addClass("io-step-active")
2376          header_increment_step();
2377        }
2378        break;
2379      case "io-step-3":
2380        if (/Mobi|Android/i.test(navigator.userAgent)) {
2381          jQuery("#io-step-2,#io-step-3,#io-step-4").show();
2382        }
2383        if(document.location.href.indexOf("io_quoteconfirm") >= 0){
2384          active.removeClass("io-step-active");
2385          active.addClass("io-step-done")
2386          jQuery("#io-step-4").addClass("io-step-active")
2387          header_increment_step();
2388        }
2389        break;
2390      case "io-step-4":
2391        if (/Mobi|Android/i.test(navigator.userAgent)) {
2392          jQuery("#io-step-2,#io-step-3,#io-step-4").show();
2393        }
2394        break;
2395    }
2396  }
2397
2398  function check_header_step_one(active) {
2399    var allInputs = active.find('input');
2400
2401    for (var i = 0; i < allInputs.length; i++) {
2402      if (jQuery(allInputs[i]).val() === "") {
2403        return false; // Return false if any input is empty
2404      }
2405    }
2406    return true; // Return true if all inputs have a value
2407  }
2408
2409  /*</editor-fold>*/
2410
2411  /*<editor-fold defaultstate="collapsed" desc="Accessory Click Functions">*/
2412  function accDDClicked(event){
2413    this_element = jQuery(this)
2414    if(!this_element.prop("selected")){
2415      pid = event.data.pid
2416      accLmt = event.data.accLmt
2417      all_elements = jQuery("[id^=io_acc_"+pid+"_]")
2418      let count = 0;
2419      /* Tried using .filter and .length to get the count of selected items but could not make it work. */
2420      for(i = 0; i < all_elements.length; ++i){
2421        if(all_elements[i].selected){
2422          ++count;
2423        }
2424      }
2425      if(accLmt == 0){
2426        this_element.css("border", "5px solid #bbb");
2427        this_element.prop("selected", true);
2428      } else if(count >= accLmt){
2429        let selected_value = jQuery("[id^=io_acc_"+pid+"_]").filter(function() {
2430          return this["selected"];
2431        });
2432        /* be sure to unselect other slected values if our acc limit has been reached. */
2433        selected_value.prop("selected", false);
2434        selected_value.css("border", "1px solid #bbb");
2435      }
2436      this_element.css("border", "5px solid #bbb");
2437      this_element.prop("selected", true);
2438    } else{
2439      this_element.prop("selected", false);
2440      this_element.css("border", "1px solid #bbb");
2441    }
2442  }
2443
2444  /* when accessory choice is clicked */
2445  function accOnClick(acc_select=null){
2446    /* set name/img back to original main in case they are just clicking on a 1st level size option */
2447    jQuery("#bookNowBtn").removeClass("item_add").addClass("item_add_off").trigger("classChange");
2448    jQuery(".io_product_title.item_name").html(main_name_orig);
2449    jQuery(".io_product_container .item_image").first().attr("src",main_img_src);
2450    jQuery(".io_product_container .item_image").first().attr("data-src",main_img_src);
2451    jQuery(".io_product_container .item_encoded").first().html(main_encoded);
2452    jQuery(".io_product_container .io_image_big").first().attr("src",main_img_src);
2453    jQuery(".io_product_container .io_image_big").first().attr("data-src",main_img_src);
2454    let main_id = jQuery(".io_product_container .item_rentalid").first().text();
2455    let main_id_arr = main_id.split(":")
2456    jQuery(".io_product_container .item_rentalid").html(main_id_arr[0]);
2457    let clk_id;
2458    if(jQuery(acc_select).find(":selected").val()){
2459      clk_id = jQuery(acc_select).find(":selected").val().replace("io_acc_shortname_","");
2460    }else{
2461      clk_id = this.id.replace("io_acc_shortname_","");
2462    }
2463    clk_id = clk_id.replace("iothumb_","");
2464    let click_id_arr = clk_id.split("_");
2465    /* let pid = main_id; */
2466    /* if(main_id.split("_").length>1) pid = parseInt(click_id_arr[0]); */
2467    let acc_obj_relate_is_map = acc_obj_relate instanceof Map;
2468    let acc_obj_relate_entries = acc_obj_relate_is_map ? acc_obj_relate.entries() : Object.entries(acc_obj_relate);
2469    for (let [key, value] of acc_obj_relate_entries) {
2470      let id = key;
2471      let children = acc_obj_relate_is_map ? acc_obj_relate.get(key) : value;
2472      if(Object.keys(children).length>0){
2473        for (key2 in children) {
2474          if(Object.keys(children[key2]).length > 0){
2475            /* 3rd level */
2476            for (key3 in children[key2]) {
2477              displayPackageChoices(clk_id,key2,key3,children[key2]);
2478            }
2479          }else{
2480            displayPackageChoices(clk_id,key,key2,children);
2481          }
2482        }
2483      }else{
2484        displayPackageChoices(clk_id,0,id,acc_obj_relate);
2485      }
2486    }
2487  }
2488
2489  /* show/hide accessory levels as needed */
2490  /* clk_id: one they clicked on, pid: parentid, id: iterator, arr: relationship array */
2491  function displayPackageChoices(clk_id,pid,id,arr){
2492    let main_id = jQuery(".io_product_container .item_rentalid").first().text();
2493    let main_arr = main_id.split("_");
2494    if(main_arr.length>1) main_id = parseInt(main_arr[0]);
2495    let click_id_arr = clk_id.split("_");
2496    elem = getAccElem(id,pid);
2497    if(click_id_arr[0]==pid || click_id_arr[1]==pid || pid==0){
2498      elem.style.display="inline-block";
2499    }else{
2500      elem.style.display="none";
2501    }
2502    if(click_id_arr[1]==id && (click_id_arr[0]==pid || (pid==0 && click_id_arr[0]==main_id) ) || (click_id_arr.length==1 && click_id_arr[0]==id)){
2503      jQuery("#bookNowBtn").removeClass("item_add_off").addClass("item_add").trigger("classChange");
2504      updateMainItem(id,pid);
2505    }
2506  }
2507
2508  /* update it with accessory data for choices */
2509  var main_img_src = jQuery("#single_image").first().attr("href");
2510  var main_name_orig = jQuery(".io_product_title.item_name").html();
2511  var main_encoded = jQuery(".io_product_container .item_encoded").html();
2512  var main_desc = jQuery(".io_product_detailbox .io_product_desc").html();
2513  function updateMainItem(id,pid){
2514    /* update add to cart btn, name, img, desc */
2515    let name = "";
2516    let name_enc = "";
2517    let main_id = jQuery(".io_product_container .item_rentalid").first().text();
2518    let main_arr = main_id.split(":");
2519    if(main_arr.length>1) main_id = main_arr[0];
2520    if(pid!=0){
2521      name += jQuery("#io_acc_itemname_"+pid).html()+":";
2522      name_enc += jQuery("#io_acc_itemname_"+pid).html()+":";
2523      name += jQuery("#io_acc_shortname_"+id).html();
2524      name_enc += jQuery("#io_acc_itemname_"+id).html();
2525    }else{
2526      pid = main_id;
2527      name += jQuery("#io_acc_itemname_"+id).html();
2528      name_enc += jQuery("#io_acc_itemname_"+id).html();
2529    }
2530    jQuery(".io_product_container .item_encoded").html(encodeURIComponent(name_enc.replace(/[\u2032\u2019]+/ig,"'")));
2531    jQuery(".io_product_container .item_rentalid").html(main_id+":"+pid+"_"+id);
2532    jQuery(".io_product_title.item_name").html(name);
2533    // Make sure the description actually displays text.
2534    let acc_desc = jQuery("#io_acc_desc_"+pid+"_"+id).first();
2535    if(acc_desc.length>0 && acc_desc.text()){
2536      jQuery(".io_product_container .io_product_desc").first().html(jQuery("#io_acc_desc_"+pid+"_"+id).first()[0].innerHTML);
2537    }
2538
2539    /* swap accessory image with main image pic for drop-down type items (linens) */
2540    let img = jQuery("#io_acc_imgbig_"+pid+"_"+id).first().attr("href");
2541    if(img==null) img = jQuery("#iothumb_"+pid+"_"+id).first().attr("src")
2542    if(img==null){
2543    }else{
2544      if(img.length==0 && pid==main_id){
2545        /* for 1 level dd items that have no img, use the main img */
2546        img = main_img_src;
2547      }
2548      jQuery(".io_product_container .io_image_big").first().attr("src",img);
2549      jQuery(".io_product_container .io_image_big").first().attr("data-src",
2549img);
2550      jQuery(".io_product_container .item_image").first().attr("src",jQuery("#iothumb_"+pid+"_"+id).first().attr("src"));
2551      jQuery(".io_product_container .item_image").first().attr("data-src",jQuery("#iothumb_"+pid+"_"+id).first().attr("src"));
2552
2553      jQuery("#single_image").first().attr("href",img).show();
2554    }
2555    checkAvailFilter();
2556  }
2557
2558  /* get either img or text for accessory choices */
2559  function getAccElem(id,pid){
2560    let path =pid+"_"+id;
2561    if(pid==0){
2562      path=id;
2563    }
2564    let elem = null;
2565    try{
2566      elem = document.querySelector("#ioAccButtonWrapper_"+path);
2567    }catch(e){}
2568    if(elem == null){
2569      try{
2570        elem = document.querySelector("#iothumb_"+path);
2571      }catch(e){}
2572    }
2573    if(elem==null){
2574      try{
2575        elem = document.querySelector("#io_product_acc_pkg_sel_"+pid);
2576      }catch(e){}
2577      if(elem!=null) return elem;
2578    }else{ return elem; }
2579    if(elem == null){
2580      try{
2581        elem = document.querySelector("#io_acc_shortname_"+path);
2582      }catch(e){}
2583    }else if(elem.src=="" | elem.getAttribute("data-src")==""){
2584      try{
2585        elem = document.querySelector("#io_acc_shortname_"+path);
2586      }catch(e){}
2587    }else if(elem.src.substr(-1)=="/"){
2588      try{
2589        elem = document.querySelector("#io_acc_shortname_"+path);
2590      }catch(e){}
2591    }
2592    if(elem==null){
2593      try{
2594        elem = document.querySelector("#io_acc_shortname_"+id);
2595      }catch(e){}
2596    }
2597    return elem;
2598  }
2599
2600  /* create the accessory choice btn (img/text) */
2601  function makeAccBtn(button_add,pid){
2602    let newButton;
2603    if(button_add.nodeName=="IMG"){
2604      newButton = button_add;
2605      let id =  newButton.id.replace("iothumb_"+pid,"");
2606      var wrapper = document.createElement("div");
2607      wrapper.setAttribute("id", "ioAccButtonWrapper_"+pid+id);
2608      wrapper.style.display = "inline-block";
2609      wrapper.appendChild(newButton);
2610      let acc_name = document.createElement("span");
2611      acc_name.style.overflow = "hidden";
2612      acc_name.style.textOverflow = "ellipsis";
2613      acc_name.style.maxWidth = "80px";
2614      acc_name.style.display = "block";
2615      acc_name.style.whiteSpace = "nowrap";
2616      acc_name.textContent = jQuery("#io_acc_shortname"+id).text();
2617      acc_name.classList.add("accTextName");
2618      acc_name.setAttribute("id", "io_acc_shortname_"+pid+id);
2619      wrapper.appendChild(document.createElement("br"));
2620      wrapper.appendChild(acc_name);
2621
2622    }else{
2623      newButton = button_add.cloneNode(true);
2624      let id = newButton.id.replace("io_acc_shortname_","");
2625      newButton.id = "io_acc_shortname_" + pid + "_" + id;
2626    }
2627    newButton.classList.add("elementor-animation-grow");
2628    newButton.classList.remove("item_image");
2629    newButton.style="cursor:pointer;border: solid 1px grey";
2630    newButton.classList.add("io_access_button");
2631    newButton.style.display = "inline-block";
2632    newButton.style.verticalAlign = "top";
2633    newButton.onclick=accOnClick;
2634    if(newButton.nodeName=="IMG"){
2635      newButton.style.minWidth = "80px";
2636      newButton.style.width = "80px";
2637      newButton.style.margin = "2px";
2638      newButton.style.height = "80px";
2639    }else{
2640      newButton.style.margin = "0px 2px 0px 2px";
2641    }
2642    if(button_add.nodeName=="IMG"){
2643      return wrapper
2644    }
2645
2646    return newButton;
2647  }
2648  /* when clicking the thumb swatches under main image (2nd image for an item) */
2649  function updateMainPic(img) {
2650    let container = img.parentElement;
2651    while (container && !container.querySelector(".io_image_big")) {
2652      container = container.parentElement;
2653    }
2654
2655    const main_img = container ? container.querySelector(".io_image_big") : null;
2656    if (!main_img) return;
2657
2658    const dataBigSrc = img.getAttribute("data-big-src");
2659    if (dataBigSrc) {
2660      main_img.src = dataBigSrc;
2661      return;
2662    }
2663
2664    let thumb_id = img.id;
2665    let big_id = thumb_id.replace("thumb", "big");
2666    const img_big = document.getElementById(big_id);
2667
2668    if (img_big && img_big.href) {
2669      main_img.src = img_big.href;
2670    }
2671  }
2672  /*</editor-fold>*/
2673
2674  /*<editor-fold defaultstate="collapsed" desc="Calendar Functions">*/
2675  function calApply() {
2676    /* reset timeslots if filtering is on */
2677    filterTimeslotsByDay_itemTimeslots();
2678    simpleCart.update();
2679
2680    /* Prevent zero-duration selection: disallow identical start and end date/time */
2681    try
2682    {
2683      var ds = jQuery("input[name=dateStart]").val();
2684      var de = jQuery("input[name=dateEnd]").val();
2685      var ts = jQuery("input[name=timeStart]").val();
2686      var te = jQuery("input[name=timeEnd]").val();
2687      if(ts && te && ds && de)
2688      {
2689        var s24 = convert12HourTo24Hour(ts);
2690        var e24 = convert12HourTo24Hour(te);
2691        var sObj = buildDateObj(ds.split("/"), s24);
2692        var eObj = buildDateObj(de.split("/"), e24);
2693        if(sObj && eObj && typeof sObj.getTime === 'function' && typeof eObj.getTime === 'function')
2694        {
2695          if(eObj.getTime() === sObj.getTime())
2696          {
2697            alert("Please choose an end time that's after the start time.");
2698            jQuery("input[name=timeEnd]").val("");
2699            return false;
2700          }
2701        }
2702      }
2703    }catch(e){}
2704
2705    if(cart_times_all_set()){
2706      ioCartLoaderActivate();
2707      setCookie("io_dateApplied", "true", 1)
2708      checkAvailAll();
2709      // If no availability calls were made, hide loader shortly after
2710      setTimeout(function()
2711      {
2712        if(io_cart_loading_active && io_cart_loading_count === 0)
2713        {
2714          io_cart_loading_active = false;
2715          ioCartShowOverlay(false);
2716        }
2717      }, 300);
2718      calCancel();
2719    }
2720
2721
2722    let io_required_data = io_info_required_data;
2723    for (const [data, value] of Object.entries(io_required_data)) {
2724      if(value == 1){
2725        setCookie(data, jQuery("#io_im_"+data).val(), 14);
2726      }
2727    }
2728
2729    /* Check if information gathering header exists. If it does, update the times on there. */
2730    if(jQuery("#ioInfoHeader").length){
2731      jQuery("#ioHeaderTimeStart").val(jQuery("[name=timeStart]").val());
2732      jQuery("#ioHeaderTimeEnd").val(jQuery("[name=timeEnd]").val());
2733      jQuery("#ioHeaderDateStart").val(jQuery("[name=dateStart]").val());
2734      jQuery("#ioHeaderDateEnd").val(jQuery("[name=dateEnd]").val());
2735      header_increment_step();
2736    }
2737
2738    show_or_hide_required_info_message()
2739    /* if(!cartStayOpen) cartHide(); */
2740  }
2741
2742  function calCancel() {
2743    click_count = 0;
2744    start_date = getCookie("io_dateStart");
2745    end_date = getCookie("io_dateEnd");
2746    start_time = getCookie("io_timeStart");
2747    end_time = getCookie("io_timeEnd");
2748    jQuery("input[name=dateStart]").val(start_date);
2749    jQuery("input[name=dateEnd]").val(end_date);
2750    if(io_company_timeslots.length != 0 && io_cartdayselect == "single_day" && getCookie("io_company_timeslot_selected")){
2751      jQuery(".ioCartCompanyTimeslots").val(getCookie("io_company_timeslot_selected"));
2752    } else{
2753      jQuery("input[name=timeStart]").val(start_time);
2754      jQuery("input[name=timeEnd]").val(end_time);
2755    }
2756    setCalBackground();
2757
2758    jQuery(".ioDateRange").html(smartFormatDateRange())
2759    jQuery("#cartCalendar, #cartTimePicker").hide();
2760    jQuery(".ioDateRange").show();
2761    jQuery(".changeDateLinkWrapper").show();
2762  }
2763
2764  /* var cartStayOpen = false; */
2765  function calSetDateRange(stayOpen) {
2766    /*
2767        if(stayOpen==1){
2768            cartStayOpen = true;
2769        }else{
2770            cartStayOpen = false;
2771        }
2772        */
2773    jQuery(".changeDateLinkWrapper").hide();
2774    jQuery("#cartCalendar, #cartTimePicker").show();
2775    jQuery("#cartDateRange").hide();
2776  }
2777
2778  function smartFormatDateRange() {
2779    let start_date = jQuery("input[name=dateStart]").val();
2780    let end_date = jQuery("input[name=dateEnd]").val();
2781    if(io_company_timeslots.length != 0 && io_cartdayselect == "single_day"){
2782      let cart_company_timeslot_selected = jQuery(".ioCartCompanyTimeslots option:selected").first().val();
2783      if(cart_company_timeslot_selected){
2784        setCookie("io_company_timeslot_selected", cart_company_timeslot_selected, 14);
2785        cart_company_timeslot_selected = cart_company_timeslot_selected.split("-");
2786        var start_time = cart_company_timeslot_selected[0].trim();
2787        var end_time = cart_company_timeslot_selected[1].trim();
2788      }
2789    } else {
2790      var start_time = jQuery("input[name=timeStart]").val();
2791      var end_time = jQuery("input[name=timeEnd]").val();
2792    }
2793
2794    let text = "";
2795    text = start_date;
2796    if(io_hidetimes!="on") text += " " + start_time;
2797
2798    if (start_date == end_date) {
2799      if(io_hidetimes!="on"){
2800        text += "  <i class='fas fa-arrow-right' style='padding:5px;'></i> ";
2801        text += end_time;
2802      }
2803    } else {
2804      text += "  <i class='fas fa-arrow-right' style='padding:5px;'></i> ";
2805      text += end_date;
2806      if(io_hidetimes!="on") text += " " + end_time;
2807    }
2808    /* text += "  <i class='fas fa-pencil-alt' style='margin-left:9px;color:"+pallet_color1+";'></i> "; */
2809
2810    return text;
2811  }
2812
2813
2814  function resetCalButtons() {
2815    jQuery("#cartCalendar .ui-datepicker-prev").addClass("fas fa-arrow-left").css("color", pallet_color1);
2816    jQuery("#cartCalendar .ui-datepicker-next").addClass("fas fa-arrow-right").
2816css("color", pallet_color1);
2817  }
2818
2819  function cal_onChangeMonthYear(year, month, obj) {
2820    setTimeout(resetCalButtons, 10);
2821    setTimeout(setCalBackground, 10);
2822  }
2823
2824  function cal_onSelect(dateText, obj) {
2825    setTimeout(resetCalButtons, 10);
2826    let whatday_choice = "";
2827    if(io_cartdayselect === "dropdown_options" && io_multidayquote === "on"){
2828      let choice_obj = jQuery("#whatday");
2829      if(choice_obj){
2830        whatday_choice = choice_obj.val();
2831      }
2832    }
2833
2834    click_count++;
2835    end_timepicker = jQuery("input[name=timeEnd]");
2836    let timeStart = jQuery("input[name=timeStart]").val();
2837    if(io_force_blank_timepickers != "on")
2838    {
2839      if (timeStart == "") {
2840        jQuery("input[name=timeStart]").val(start_default);
2841        jQuery("input[name=timeEnd]").val(end_default);
2842      }
2843    }
2844
2845    if (click_count == 1 || !multi_day || whatday_choice==="Same Day" || whatday_choice==="Overnight") {
2846      jQuery("input[name=dateStart]").val(dateText);
2847      jQuery("input[name=dateEnd]").val(dateText)
2848      end_timepicker.timepicker("option",{"minTime": jQuery("input[name=timeStart]").val()});
2849      if(EndTimeLessThanStartTime(
2850              jQuery("input[name=timeStart]").val(),
2851              end_timepicker.val(),
2852              jQuery("[name='dateStart']").val(),
2853              jQuery("[name='dateEnd']").val() ) ) {
2854        end_timepicker.val("");
2855      }
2856      if(io_cartAllowSameDay == "on"){
2857        restrictStartTimepickerOnSameDaySelect(dateText, jQuery("input[name=timeStart]"), end_timepicker);
2858      }
2859    } else if (click_count == 2) {
2860      jQuery("input[name=dateEnd]").val(dateText);
2861      let start_date_str = jQuery("input[name=dateStart]").val();
2862      let start_date_obj = convertDateStringtoDateObject(start_date_str);
2863      let end_date_obj = convertDateStringtoDateObject(dateText);
2864      if(end_date_obj < start_date_obj){
2865        jQuery("input[name=dateStart]").val(dateText);
2866        if(io_cartAllowSameDay == "on"){
2867          restrictStartTimepickerOnSameDaySelect(dateText, jQuery("input[name=timeStart]"), end_timepicker);
2868        }
2869      } else{
2870        end_timepicker.timepicker("option",{"minTime": io_restrict_time_start});
2871      }
2872      click_count = 0;
2873    } else {
2874      click_count = 0;
2875    }
2876    //custom code for suncoast_event
2877    if(io_cartdayselect === "dropdown_options" && io_multidayquote === "on"){
2878      endDisplay();
2879      //daysSelect();
2880    }
2881    filterTimeslotsByDay_companyTimeslots();
2882
2883    setTimeout(setCalBackground, 10);
2884  }
2885
2886  function endDisplay(){
2887    //todo: need to figure out if these work and set triggers
2888    // trigger enddisplay after date is selected or possibly when dateEnd changes?
2889    let choice = jQuery("#whatday").val();
2890
2891    setCookie("io_whatday", choice, 14);
2892    let dateStart = jQuery("[name=dateStart]");
2893    let timeStart = jQuery("[name=timeStart]");
2894    let dateEnd = jQuery("[name=dateEnd]");
2895    let timeEnd = jQuery("[name=timeEnd]");
2896    if(choice==='Overnight'){
2897      let startdate = dateStart.val();
2898      let starttime = io_overnightPickupTime;
2899      let endcalc_date_obj = new Date(buildDateobjectstring(startdate,dateFormat,starttime));
2900      let duration_hrs = 24;
2901      let end_date_obj = new Date(endcalc_date_obj.getTime()+duration_hrs*60*60*1000);
2902      if(!isNaN(end_date_obj)){
2903        dateEnd.val(getFormatteddate(end_date_obj));
2904        timeEnd.val(getFormattedtime(end_date_obj));
2905        timeEnd.attr('readonly','readonly');
2906      }
2907    }else if(choice==='Multi-Day'){
2908      let startdate = dateStart.val();
2909      let starttime = timeStart.val() || start_default;
2910      let start_date_obj = new Date(buildDateobjectstring(startdate, dateFormat, starttime));
2911      if(!isNaN(start_date_obj)){
2912        //dateEnd.val(getFormatteddate(start_date_obj));
2913        let cal = jQuery("#cartCalendar");
2914        let origOnSelect = cal.datepicker("option", "onSelect");
2915        cal.datepicker("option", "onSelect", null);
2916        cal.datepicker("setDate", start_date_obj);
2917        cal.datepicker("option", "onSelect", origOnSelect);
2918      }
2919      timeEnd.removeAttr('readonly');
2920      if(io_force_blank_timepickers == "on" && !timeEnd.val()){
2921        timeEnd.val("");
2922      } else if(!timeEnd.val()){
2923        timeEnd.val(end_default);
2924      }
2925    }else{
2926      let startdate = dateStart.val();
2927      let starttime = timeStart.val() || start_default;
2928      let start_date_obj = new Date(buildDateobjectstring(startdate, dateFormat, starttime));
2929      if(!isNaN(start_date_obj)){
2930        dateEnd.val(getFormatteddate(start_date_obj));
2931        let cal = jQuery("#cartCalendar");
2932        let origOnSelect = cal.datepicker("option", "onSelect");
2933        cal.datepicker("option", "onSelect", null);
2934        cal.datepicker("setDate", start_date_obj);
2935        cal.datepicker("option", "onSelect", origOnSelect);
2936      }
2937      timeEnd.removeAttr('readonly');
2938      if(io_force_blank_timepickers == "on"  && !timeEnd.val()){
2939        timeEnd.val("");
2940      } else if(!timeEnd.val()){
2941        timeEnd.val(end_default);
2942      }
2943      click_count = 0;
2944    }
2945    setTimeout(setCalBackground, 10);
2946  }
2947  function setCalBackground() {
2948    let dateStart_string = jQuery("input[name=dateStart]").val();
2949    let dateEnd_string = jQuery("input[name=dateEnd]").val();
2950
2951    if (dateFormat == "d/m/yy") {
2952      let dateStartArray = dateStart_string.split("/");
2953      let dateEndArray = dateEnd_string.split("/");
2954      var dateStart = new Date(dateStartArray[2], Number(dateStartArray[1])-1, dateStartArray[0]);
2955      var dateEnd = new Date(dateEndArray[2], Number(dateEndArray[1])-1, dateEndArray[0]);
2956    } else {
2957      var dateStart = new Date(dateStart_string);
2958      var dateEnd = new Date(dateEnd_string);
2959    }
2960
2961
2962    let sday = dateStart.getDate();
2963    let smonth = dateStart.getMonth();
2964    let syear = dateStart.getFullYear();
2965
2966    let eday = dateEnd.getDate();
2967    let emonth = dateEnd.getMonth();
2968    let eyear = dateEnd.getFullYear();
2969
2970    /* clear any (in case of cancel) */
2971    jQuery(".ui-datepicker-calendar [data-handler=selectDay]").css("background-color","initial");
2972
2973    /* set the selected ones */
2974    jQuery("#cartCalendar [data-month=" + smonth + "][data-year=" + syear + "], #cartCalendar [data-month=" +
2975            emonth + "][data-year=" + eyear + "]").each(function (i) {
2976      let cday = jQuery(this).find("a").first().text();
2977      let cmonth = jQuery(this).attr("data-month");
2978      let cyear = jQuery(this).attr("data-year");
2979      /* let dateCurrent = new Date(Date.UTC(cyear,cmonth,cday,12)); */
2980      let dateCurrent = new Date(cyear, cmonth, cday);
2981      if (click_count == 1 && dateEnd_string.length == 0) dateEnd = dateStart;
2982      if (dateCurrent.getTime() == dateStart.getTime() && dateCurrent.getTime() == dateEnd.getTime()) {
2983        jQuery(this).css("border-radius", "6px 6px 6px 6px");
2984      } else if (dateCurrent.getTime() == dateStart.getTime()) {
2985        jQuery(this).css("border-radius", "6px 0 0 6px");
2986      } else if (dateCurrent.getTime() == dateEnd.getTime()) {
2987        jQuery(this).css("border-radius", "0 6px 6px 0");
2988      }
2989
2990      if (dateCurrent >= dateStart && dateCurrent <= dateEnd) {
2991        jQuery(this).css("background-color", pallet_color1);
2992      }
2993
2994
2995    });
2996  }
2997  /*</editor-fold>*/
2998
2999  /*<editor-fold defaultstate="collapsed" desc="Timeslot/Timepicker Functions">*/
3000  /* called from simplecart */
3001  function timeslotChange(){
3002    checkAvailCartTimeslots();
3003  }
3004  function filterTimeslotsByDay_companyTimeslots(){
3005    var weekday = new Array();
3006    weekday[0] = "Sunday";
3007    weekday[1] = "Monday";
3008    weekday[2] = "Tuesday";
3009    weekday[3] = "Wednesday";
3010    weekday[4] = "Thursday";
3011    weekday[5] = "Friday";
3012    weekday[6] = "Saturday";
3013
3014    let times = getAvailTimes();
3015    let start_date = times[0];
3016    var newDate1 = convertDateStringtoDateObject(start_date);
3017    let day = weekday[new Date(newDate1).getDay()];
3018
3019    let selected_option_label = jQuery(".ioCartCompanyTimeslots option:selected").first().text().toLowerCase();
3020    if(optionHasDay(weekday, selected_option_label)){
3021      if(selected_option_label.indexOf(day.toLowerCase()) === -1){
3022        jQuery(".ioCartCompanyTimeslots").val("");
3023      }
3024    }
3025    if(io_company_timeslots.length != 0 && io_cartdayselect == "single_day"){
3026      jQuery(".ioCartCompanyTimeslots > option").each(function() {
3027        if(optionHasDay(weekday, this.text.toLowerCase())){
3028          for(i=0; i<weekday.length; ++i){
3029            if(day.toLowerCase() == weekday[i].toLowerCase() && this.text.toLowerCase().indexOf(day.toLowerCase()) !== -1){
3030              jQuery(this).show();
3031              day_missing = false;
3032            } else if(day.toLowerCase() != weekday[i].toLowerCase() && this.text.toLowerCase().indexOf(day.toLowerCase()) === -1){
3033              jQuery(this).hide();
3034            }
3035          }
3036        }
3037      });
3038    }
3039  }
3040
3041  function filterTimeslotsByDay_itemTimeslots(){
3042    var weekday = new Array();
3043    weekday[0] = "Sunday";
3044    weekday[1] = "Monday";
3045    weekday[2] = "Tuesday";
3046    weekday[3] = "Wednesday";
3047    weekday[4] = "Thursday";
3048    weekday[5] = "Friday";
3049    weekday[6] = "Saturday";
3050
3051    let times = getAvailTimes();
3052    let start_date = times[0];
3053    var newDate1 = convertDateStringtoDateObject(start_date);
3054    let day = weekday[new Date(newDate1).getDay()];
3055
3056    simpleCart.each(function (item, x) {
3057      var timeslots_html = item.get('timeslots');
3058      if(typeof timeslots_html != "undefined" && jQuery.parseHTML(timeslots_html)[0].nodeName == "SELECT"){
3059        if(timeslots_html.length > 0){
3060          var timeslot_name = getTimeslotName(timeslots_html);
3061          if(typeof item.get("timeslots-orig") == "undefined"){
3062            var timeslots_obj = jQuery.parseHTML(timeslots_html);
3063          } else{
3064            var timeslots_obj = jQuery.parseHTML(item.get('timeslots-orig'));
3065          }
3066          jQuery(timeslots_obj).find("option").each(function(){
3067            if(optionHasDay(weekday, this.text.toLowerCase())){
3068              for(i=0; i<weekday.length; ++i){
3069                if(day.toLowerCase() == weekday[i].toLowerCase() && this.text.toLowerCase().indexOf(day.toLowerCase()) !== -1){
3070                  /* jQuery(this).show(); */
3071                } else if(day.toLowerCase() != weekday[i].toLowerCase() && this.text.toLowerCase().indexOf(day.toLowerCase()) === -1){
3072                  jQuery(this).remove();
3073                }
3074              }
3075            }
3076          });
3077          if(typeof item.get("timeslots-orig") == "undefined") item.set("timeslots-orig",item.get("timeslots"));
3078          item.set("timeslots",'<select class="simpleCart_timeslots" name="'+timeslot_name+'">'+jQuery(timeslots_obj).html()+'</select>');
3079        }
3080      }
3081    });
3082  }
3083
3084  function optionHasDay(weekdays, option_label){
3085    for(i=0; i<weekdays.length; ++i){
3086      if(option_label.indexOf(weekdays[i].toLowerCase()) !== -1){
3087        return true;
3088      }
3089    }
3090    return false;
3091  }
3092
3093  function getTimeslotName(timeslots_html){
3094    if(typeof timeslots_html=="undefined") return "";
3095    var timeslot_name_s = timeslots_html.indexOf('name="');
3096    timeslot_name_s += 6;
3097    var timeslot_name_e = timeslots_html.indexOf('"',timeslot_name_s);
3098    var timeslot_name = timeslots_html.substr(timeslot_name_s,timeslot_name_e-timeslot_name_s);
3099    return timeslot_name;
3100  }
3101  function setTimeslotSelected(item, timeslot_name){
3102    jQuery(".item-timeslots [name=\""+timeslot_name+"\"] option").not(":selected").removeAttr("selected");
3103    jQuery(".item-timeslots [name=\""+timeslot_name+"\"] option:selected").attr("selected","selected");
3104    if(jQuery(".item-timeslots [name=\""+timeslot_name+"\"]").length>0){
3105      item.set("timeslots",jQuery(".item-timeslots [name=\""+timeslot_name+"\"]")[0].outerHTML);
3106    }
3107
3108    /* set on quote page */
3109    jQuery(".controls [name=\""+timeslot_name+"\"] option").not(":selected").removeAttr("selected");
3110    jQuery(".controls [name=\""+timeslot_name+"\"] option[value='"+jQuery(".item-timeslots [name=\""+timeslot_name+"\"] option:selected").val()+"']").attr("selected","selected");
3111  }
3112
3113  function setTimePicker(item, timepicker_name){
3114    let [start_timepicker, end_timepicker] = get_cart_timepickers(timepicker_name);
3115    let start_time = start_timepicker.value;
3116    let end_time = end_timepicker.value;
3117
3118    if(!start_time){
3119      start_timepicker.style.borderColor = "red";
3120    } else{
3121      start_timepicker.style.borderColor = "";
3122    }
3123    if(!end_time){
3124      end_timepicker.style.borderColor = "red";
3125    } else{
3126      end_timepicker.style.borderColor = "";
3127    }
3128
3129    let start_timepicker_html = start_timepicker.outerHTML;
3130    let end_timepicker_html = end_timepicker.outerHTML;
3131    if(document.querySelectorAll(".item-timeslots [name=\""+timepicker_name+"\"]").length>0){
3132      start_timepicker_html = addOrReplaceValueInTimepicker(start_timepicker_html, start_time);
3133      end_timepicker_html = addOrReplaceValueInTimepicker(end_timepicker_html, end_time);
3134      item.set("timeslots", '<div name="'+timepicker_name+'"> Start: '+start_timepicker_html+' End: '+end_timepicker_html+'</div>');
3135    }
3136    /* set on quote page */
3137    /* For linen type items with timepickers */
3138    let rental_id = item.get("rentalid");
3139    let split_on_colon = rental_id.split(":");
3140    if(split_on_colon.length > 1){
3141      fix_time_name_for_linen_rid(timepicker_name, split_on_colon, start_time, end_time, rental_id)
3142    }else{
3143      let quote_page_start_timepicker = document.querySelectorAll(".controls [name=\""+timepicker_name.replace("io_timepicker_", "starttime_")+"\"]")[0];
3144      let quote_page_end_timepicker = document.querySelectorAll(".controls [name=\""+timepicker_name.replace("io_timepicker_", "endtime_")+"\"]")[0];
3145      if(quote_page_start_timepicker != null && quote_page_end_timepicker != null){
3146        quote_page_start_timepicker.value = start_time;
3147        quote_page_end_timepicker.value = end_time;
3148      }
3149    }
3150  }
3151
3152  function fix_time_name_for_linen_rid(time_name, split_rid, start_time, end_time, rental_id){
3153    for(let x = 0; x < split_rid.length; x++){
3154      temp_timepicker_name = time_name.replace(rental_id, split_rid[x]);
3155      let quote_page_start_timepicker = document.querySelectorAll(".controls [name=\""+temp_timepicker_name.replace("io_timepicker_", "starttime_")+"\"]")[0];
3156      let quote_page_end_timepicker = document.querySelectorAll(".controls [name=\""+temp_timepicker_name.replace("io_timepicker_", "endtime_")+"\"]")[0];
3157      if(quote_page_start_timepicker != null && quote_page_end_timepicker != null){
3158        quote_page_start_timepicker.value = start_time;
3159        quote_page_end_timepicker.value = end_time;
3160      }
3161    }
3162  }
3163
3164  function addOrReplaceValueInTimepicker(timepicker_html, time_value){
3165    if(timepicker_html.includes("value=")){
3166      timepicker_html = [timepicker_html.slice(0, timepicker_html.indexOf("value=")), 'value="'+time_value+'"', timepicker_html.slice(timepicker_html.length-1)].join("");
3167    }else{
3168      /* No value defined. Add it at the end of the outer html. */
3169      let position = timepicker_html.lastIndexOf(">");
3170      timepicker_html = [timepicker_html.slice(0, position), ' value="'+time_value+'"', timepicker_html.slice(position)].join("");
3171    }
3172    return timepicker_html
3173  }
3174
3175  function restrictEndTimepickers(){
3176    setUpTimeRestrictions_cartTimepickers()
3177    setUpTimeRestrictions_timeBasedItems()
3178  }
3179
3180  function setUpTimeRestrictions_timeBasedItems(){
3181    jQuery("input[name^=start_timeslot_]").change(function()
3182    {
3183      end_timepicker = jQuery("input[name='"+this.name.replace("start", "end")+"']");
3184      end_timepicker = jQuery(end_timepicker[end_timepicker.length - 1]);
3185      end_timepicker.timepicker("option",{"minTime": jQuery(this).val()});
3186      if( EndTimeLessThanStartTime( jQuery(this).val(), end_timepicker.val(), "0/0/0", "0/0/0" ) ){
3187        end_timepicker.val("");
3188      }
3189    });
3190  }
3191
3192  function setUpTimeRestrictions_cartTimepickers(){
3193    jQuery("input[name=timeStart]").change(function()
3194    {
3195      end_timepicker = jQuery("[name='"+this.name.replace("Start", "End")+"']");
3196      if(jQuery("[name='dateStart']").val() === jQuery("input[name='dateEnd']").val()){
3197        end_timepicker.timepicker("option",{"minTime": jQuery(this).val()});
3198        if(EndTimeLessThanStartTime(
3199                jQuery(this).val(),
3200                end_timepicker.val(),
3201                jQuery("[name='dateStart']").val(),
3202                jQuery("[name='dateEnd']").val() ) ) {
3203          end_timepicker.val("");
3204        }
3205      }
3206    });
3207  }
3208
3209  function setUpTimeRestrictions_infoHeaderTimepickers(){
3210    jQuery("#ioHeaderTimeStart").change(function()
3211    {
3212      end_timepicker = jQuery("#ioHeaderTimeEnd");
3213      if(jQuery("#ioHeaderDateStart").val() === jQuery("#ioHeaderDateEnd").val()){
3214        end_timepicker.timepicker("option",{"minTime": jQuery(this).val()});
3215        if(EndTimeLessThanStartTime(
3216                jQuery(this).val(),
3217                end_timepicker.val(),
3218                jQuery("#ioHeaderDateStart").val(),
3219                jQuery("#ioHeaderDateEnd").val() ) ) {
3220          end_timepicker.val("");
3221        }
3222      }
3223    });
3224  }
3225
3226  /*
3227        helper function to see if the value from a start timepicker is less than the string value of an end timepicker.
3228
3229        param start_time: string representation of the start time picker. 12hr or 24hr.
3230        param end_time: string representation of the end time picker. 12hr or 24hr.
3231        param start_date: string representation of the start date, seperated by "/". Can be wither d/m/y or m/d/y. Pass "0/0/0" if dates do not matter.
3232        param end_date: string representation of the end date, seperated by "/". Can be wither d/m/y or m/d/y. Pass "0/0/0" if dates do not matter.
3233
3234  */
3235  function EndTimeLessThanStartTime(start_time, end_time, start_date, end_date){
3236    if(!start_time || !end_time) return false;
3237    start_time = convert12HourTo24Hour(start_time);
3238    end_time = convert12HourTo24Hour(end_time);
3239    var split_start_date = start_date.split("/");
3240    var split_end_date = end_date.split("/");
3241    var startDate = buildDateObj(split_start_date, start_time);
3242    var endDate = buildDateObj(split_end_date, end_time);
3243    if(endDate < startDate){
3244      return true;
3245    } else {
3246      return false;
3247    }
3248  }
3249  function get_cart_timepickers(timepicker_name){
3250    let start_timepicker = document.getElementsByName(timepicker_name.replace("io_timepicker_", "start_timeslot_"));
3251    let end_timepicker = document.getElementsByName(timepicker_name.replace("io_timepicker_", "end_timeslot_"));
3252    start_timepicker = start_timepicker[start_timepicker.length-1];
3253    end_timepicker = end_timepicker[end_timepicker.length-1];
3254    return Array(start_timepicker, end_timepicker);
3255  }
3256  function restrictStartTimepickerOnSameDaySelect(start_date_str, start_timepicker, end_timepicker){
3257    let selected_date_obj = convertDateStringtoDateObject(start_date_str);
3258    let current_date_obj = new Date();
3259    if(current_date_obj.getDate()  == selected_date_obj.getDate() &&
3260            current_date_obj.getMonth() == selected_date_obj.getMonth() &&
3261            current_date_obj.getYear()  == selected_date_obj.getYear()){
3262      let next_hour_time_stamp = current_date_obj.setMinutes(60);
3263      let next_hour_str = getFormattedtime(new Date(next_hour_time_stamp))
3264      start_timepicker.timepicker("option",{"minTime": next_hour_str});
3265
3266      /* If the time in the input box is less than the time we just restricted too, then clear time inputs */
3267      restricted_time_obj = convertDateStringtoDateObject(start_date_str, next_hour_str);
3268      currently_selected_time_obj = convertDateStringtoDateObject(start_date_str, start_timepicker.val());
3269      if(currently_selected_time_obj < restricted_time_obj){
3270        start_timepicker.val(next_hour_str);
3271        end_timepicker.val("");
3272        end_timepicker.timepicker("option",{"minTime": next_hour_str});
3273      }
3274    }else{
3275      start_timepicker.timepicker("option",{"minTime": restrictTimeStart});
3276    }
3277  }
3278  /*</editor-fold>*/
3279
3280  /*<editor-fold defaultstate="collapsed" desc="Simple Cart Bound Functions">*/
3281  function cart_onUpdate() {
3282    /* need slight delay so simplecart updates before this runs */
3283    setTimeout(cart_onUpdate2, 500);
3284    try{
3285      for(var i=0;i<document.getElementsByClassName("ioCart").length;i++){
3286        document.getElementsByClassName("ioCart")[i].setAttribute("cnt", simpleCart.items().length);
3287      }
3288    }catch(e){}
3289  }
3290
3291  function cart_onUpdate2() {
3292    jQuery("#cartSubtotal").html(simpleCart.toCurrency(simpleCart.total()));
3293    if(io_checkavail=="off") return;
3294    jQuery("#cartWarning").hide();
3295    let hasUnavail = false;
3296    gift_cards_only = false;
3297    simpleCart.each(function (item, x) {
3298      let item_id = item.get("id");
3299      var giftCardValue = item.get("giftcardvalue");
3300      if (giftCardValue && giftCardValue.trim()) {
3301        gift_cards_only = true;
3302      }
3303      let avail = 0;
3304      let stop_loop = false;
3305      if (item.get("availability") != null) avail = item.get("availability").replace(" available", "");
3306      let quantity = Number(item.get("quantity"));
3307      if(item.get("inputtype") == "Map"){
3308        quantity = 1
3309      }
3310      if(typeof item.get("availability") != 'undefined'){
3311        if (quantity > Number(avail) || avail == "not") {
3312          /* item.set("availability","<span style=color:red>"+item.get("availability")+"</span>"); */
3313          setTimeout(function () {
3314            jQuery("#cartItem_" + item_id + " .item-availability").css("color", "red")
3315          }, 10);
3316          //jQuery("#cartWarning").show();
3317          stop_loop = display_cart_warning(item);
3318          hasUnavail = true;
3319        } else {
3320          jQuery("#cartItem_" + item_id + " .item-availability").css("color", "inherit");
3321        }
3322      }else{
3323        event_times = getAvailTimes();
3324        if(!event_times[0] || !event_times[1]){
3325          jQuery("#cartWarning").text("Please set the date and time for your event above.");
3326          jQuery("#cartWarning").show()
3327        }
3328      }
3329
3330      var timeslots_html = item.get("timeslots");
3331      if(typeof timeslots_html != "undefined"){
3332        if(timeslots_html.length > 0){
3333          var timeslot_name = getTimeslotName(timeslots_html);
3334          if(timeslots_html.indexOf("<select") >= 0){
3335            setTimeslotSelected(item, timeslot_name);
3336          }else{
3337            setTimePicker(item, timeslot_name);
3338          }
3339        }
3340      }
3341      if(stop_loop){
3342        return false;
3343      }
3344    });
3345
3346    if(gift_cards_only){
3347      jQuery("#cartCalendarTimePickerContainer").hide();
3348    }else{
3349      jQuery("#cartCalendarTimePickerContainer").show();
3350    }
3351
3352    if(hasUnavail && io_checkavail!="off"){
3353      jQuery(".simpleCart_checkout").removeClass("simpleCart_checkout").addClass("simpleCart_checkout_off").trigger("classChange").click(cartShow);
3354    }else if(io_checkavail!="off"){
3355      jQuery(".simpleCart_checkout_off").removeClass("simpleCart_
3355checkout_off").addClass("simpleCart_checkout").trigger("classChange");
3356    }
3357
3358    add_cart_buttons = document.querySelectorAll("[class*=add_cart_]");
3359    if(add_cart_buttons){
3360      for(let i = 0; i < add_cart_buttons.length; ++i){
3361        add_cart_buttons[i].innerHTML = add_cart_buttons[i].innerHTML.replace("fa-cart-arrow-down", "fa-shopping-cart");
3362        add_cart_buttons[i].innerHTML = add_cart_buttons[i].innerHTML.replace("Added to Cart", "Add to Cart");
3363        add_cart_buttons[i].style.filter = "brightness(100%)";
3364        simpleCart.each(function (item, x) {
3365          if( add_cart_buttons[i].className.includes( item.get("rentalid") ) ){
3366            add_cart_buttons[i].innerHTML = add_cart_buttons[i].innerHTML.replace("fa-shopping-cart", "fa-cart-arrow-down");
3367            add_cart_buttons[i].innerHTML = add_cart_buttons[i].innerHTML.replace("Add to Cart", "Added to Cart");
3368            add_cart_buttons[i].style.filter = "brightness(90%)";
3369          }
3370        });
3371      }
3372    }
3373
3374    /* init time-based items */
3375    if(document.location.href.indexOf("io_quoteform") == -1){
3376      let today = new Date();
3377      let io_dd = today.getDate();
3378      let io_mm = today.getMonth() + 1;
3379      let io_yyyy = today.getFullYear();
3380      if(restrictTimes){
3381        jQuery(".item-timeslots .timepicker").each( function() {
3382          if(this.name.includes("end")){
3383            start_timepicker = jQuery("input[name='"+this.name.replace("end", "start")+"']");
3384            start_timepicker = jQuery(start_timepicker[start_timepicker.length - 1]);
3385
3386            if (io_force_blank_timepickers == "on")
3387            {
3388              start_timepicker.val("");
3389              jQuery(this).timepicker({
3390                startTime: "",
3391                endTime:   "",
3392                minTime:   restrictTimeStart,
3393                maxTime:   restrictTimeEnd,
3394                timeFormat: timeFormat,
3395                separator:  ":",
3396                className:  "elementor-widget-text-editor",
3397                step: 15,
3398                disableTouchKeyboard: true
3399              });
3400            }
3401            else
3402            {
3403              // Existing logic if "force blank" is not active
3404              if (start_timepicker.val() != "") {
3405                jQuery(this).timepicker({
3406                  startTime: new Date(io_mm+"/"+io_dd+"/"+io_yyyy + " " + start_default),
3407                  endTime:   new Date(io_mm+"/"+io_dd+"/"+io_yyyy + " " + end_default),
3408                  minTime:   start_timepicker.val(),
3409                  maxTime:   restrictTimeEnd,
3410                  timeFormat: timeFormat,
3411                  separator:  ":",
3412                  className:  "elementor-widget-text-editor",
3413                  step: 15,
3414                  disableTouchKeyboard: true
3415                });
3416              } else {
3417                jQuery(this).timepicker({
3418                  startTime: new Date(io_mm+"/"+io_dd+"/"+io_yyyy + " " + start_default),
3419                  endTime:   new Date(io_mm+"/"+io_dd+"/"+io_yyyy + " " + end_default),
3420                  minTime:   restrictTimeStart,
3421                  maxTime:   restrictTimeEnd,
3422                  timeFormat: timeFormat,
3423                  separator:  ":",
3424                  className:  "elementor-widget-text-editor",
3425                  step: 15,
3426                  disableTouchKeyboard: true
3427                });
3428              }
3429            }
3430
3431          }
3432          else {
3433            if (io_force_blank_timepickers == "on")
3434            {
3435              start_timepicker.val("");
3436              jQuery(this).timepicker({
3437                startTime: "",
3438                endTime:   "",
3439                minTime:   restrictTimeStart,
3440                maxTime:   restrictTimeEnd,
3441                timeFormat: timeFormat,
3442                separator:  ":",
3443                className:  "elementor-widget-text-editor",
3444                step: 15,
3445                disableTouchKeyboard: true
3446              });
3447            }
3448            else
3449            {
3450              jQuery(this).timepicker({
3451                startTime: new Date(io_mm+"/"+io_dd+"/"+io_yyyy + " " + start_default),
3452                endTime: new Date(io_mm+"/"+io_dd+"/"+io_yyyy + " " + end_default),
3453                minTime:restrictTimeStart,
3454                maxTime:restrictTimeEnd,
3455                timeFormat: timeFormat,
3456                separator: ":",
3457                className: "elementor-widget-text-editor",
3458                step: 15,
3459                disableTouchKeyboard: true
3460              });
3461            }
3462          }
3463        });
3464      } else{
3465        jQuery(".item-timeslots .timepicker").each( function() {
3466          if(this.name.includes("end") != -1){
3467            start_timepicker = jQuery("input[name='"+this.name.replace("end", "start")+"']");
3468            start_timepicker = jQuery(start_timepicker[start_timepicker.length - 1]);
3469            if (io_force_blank_timepickers == "on")
3470            {
3471              start_timepicker.val("");
3472              jQuery(this).timepicker({
3473                startTime: "",
3474                endTime:   "",
3475                minTime:   restrictTimeStart,
3476                maxTime:   restrictTimeEnd,
3477                timeFormat: timeFormat,
3478                separator:  ":",
3479                className:  "elementor-widget-text-editor",
3480                step: 15,
3481                disableTouchKeyboard: true
3482              });
3483            }
3484            else
3485            {
3486              if (start_timepicker.val() != "") {
3487                jQuery(this).timepicker({
3488                  startTime: new Date(io_mm + "/" + io_dd + "/" + io_yyyy + " " + start_default),
3489                  endTime: new Date(io_mm + "/" + io_dd + "/" + io_yyyy + " " + end_default),
3490                  minTime: start_timepicker.val(),
3491                  timeFormat: timeFormat,
3492                  separator: ":",
3493                  className: "elementor-widget-text-editor",
3494                  step: 15,
3495                  disableTouchKeyboard: true
3496                });
3497              } else {
3498                jQuery(this).timepicker({
3499                  startTime: new Date(io_mm + "/" + io_dd + "/" + io_yyyy + " " + start_default),
3500                  endTime: new Date(io_mm + "/" + io_dd + "/" + io_yyyy + " " + end_default),
3501                  timeFormat: timeFormat,
3502                  separator: ":",
3503                  className: "elementor-widget-text-editor",
3504                  step: 15,
3505                  disableTouchKeyboard: true
3506                });
3507              }
3508            }
3509          }
3510          else
3511          {
3512            if (io_force_blank_timepickers == "on")
3513            {
3514              start_timepicker.val("");
3515              jQuery(this).timepicker({
3516                startTime: "",
3517                endTime:   "",
3518                minTime:   restrictTimeStart,
3519                maxTime:   restrictTimeEnd,
3520                timeFormat: timeFormat,
3521                separator:  ":",
3522                className:  "elementor-widget-text-editor",
3523                step: 15,
3524                disableTouchKeyboard: true
3525              });
3526            }
3527            else
3528            {
3529              jQuery(this).timepicker({
3530                startTime: new Date(io_mm + "/" + io_dd + "/" + io_yyyy + " " + start_default),
3531                endTime: new Date(io_mm + "/" + io_dd + "/" + io_yyyy + " " + end_default),
3532                timeFormat: timeFormat,
3533                separator: ":",
3534                className: "elementor-widget-text-editor",
3535                step: 15,
3536                disableTouchKeyboard: true
3537              });
3538            }
3539          }
3540        });
3541      }
3542      setUpTimeRestrictions_timeBasedItems();
3543      if(!event_time_set()){
3544        jQuery(".itemRow .item-total").hide();
3545      }else{
3546        jQuery(".itemRow .item-total").show();
3547      }
3548    }
3549  }
3550  function cart_beforeCheckout(data) {
3551    data.startdate = jQuery("input[name=dateStart]").val();
3552    data.enddate = jQuery("input[name=dateEnd]").val();
3553    if(getCookie("guid")){
3554      data.guid = getCookie("guid");
3555    }else{
3556      data.io_custguid = fetchAndSetCookie("guid");
3557    }
3558    if(io_company_timeslots.length != 0 && io_cartdayselect == "single_day"){
3559      let cart_company_timeslot_selected = jQuery(".ioCartCompanyTimeslots option:selected").first().val();
3560      if(cart_company_timeslot_selected){
3561        setCookie("io_company_timeslot_selected", cart_company_timeslot_selected, 14);
3562        cart_company_timeslot_selected = cart_company_timeslot_selected.split("-");
3563        data.starttime = cart_company_timeslot_selected[0];
3564        data.endtime = cart_company_timeslot_selected[1];
3565      }
3566    } else {
3567      data.starttime = jQuery("input[name=timeStart]").val();
3568      data.endtime = jQuery("input[name=timeEnd]").val();
3569    }
3570  }
3571  function cart_beforeAdd(item) {
3572    var main_id = jQuery(".io_product_container .item_rentalid").first().text();
3573    var item_id = item.get("rentalid");
3574
3575    timeslots = item.get("timeslots");
3576    if(timeslots){
3577      if(timeslots.indexOf("<select") !== -1){
3578        timeslot_name_id_start_pos = timeslots.lastIndexOf('name="timeslot_') + 'name="timeslot_'.length;
3579        timeslot_name_id_end_pos = timeslots.indexOf('"', timeslot_name_id_start_pos);
3580        new_timeslots = [timeslots.slice(0, timeslot_name_id_start_pos), item_id, timeslots.slice(timeslot_name_id_end_pos,timeslots.length)]
3581        new_timeslots = new_timeslots.join("")
3582        item.set("timeslots", new_timeslots);
3583      }else if(timeslots.indexOf("<div name=\"io_timepicker_") !== -1){
3584        timeslot_name_id_start_pos = timeslots.lastIndexOf('name="io_timepicker_') + 'name="io_timepicker_'.length;
3585        timeslot_name_id_end_pos = timeslots.indexOf('"', timeslot_name_id_start_pos);
3586        new_timeslots = [timeslots.slice(0, timeslot_name_id_start_pos), item_id, timeslots.slice(timeslot_name_id_end_pos,timeslots.length)]
3587        new_timeslots = new_timeslots.join("")
3588
3589        timeslot_name_id_start_pos = new_timeslots.lastIndexOf('name="start_timeslot_') + 'name="start_timeslot_'.length;
3590        timeslot_name_id_end_pos = new_timeslots.indexOf('"', timeslot_name_id_start_pos);
3591        new_timeslots = [new_timeslots.slice(0, timeslot_name_id_start_pos), item_id, new_timeslots.slice(timeslot_name_id_end_pos,new_timeslots.length)]
3592        new_timeslots = new_timeslots.join("")
3593
3594        timeslot_name_id_start_pos = new_timeslots.lastIndexOf('name="end_timeslot_') + 'name="end_timeslot_'.length;
3595        timeslot_name_id_end_pos = new_timeslots.indexOf('"', timeslot_name_id_start_pos);
3596        new_timeslots = [new_timeslots.slice(0, timeslot_name_id_start_pos), item_id, new_timeslots.slice(timeslot_name_id_end_pos,new_timeslots.length)]
3597        new_timeslots = new_timeslots.join("")
3598
3599        item.set("timeslots", new_timeslots);
3600      }
3601
3602    }
3603    /* Here we are checking if we are on an item page and if we are adding the main item.
3604           If this is not true, we do not want to continue. Bail here. */
3605    if((!main_id || !item_id)){
3606      return true;
3607    }else if (item_id != main_id){
3608      /* we are adding an accessory, We want to forcibly add the main item first. */
3609      /* IO-26864 */
3610      jQuery("#bookNowBtn").click();
3611    }
3612    let required_dropdown_values = jQuery(".io_acc_li").filter(function() {
3613      let required_ele = jQuery(this).find(".item_required");
3614      let required = 0;
3615      if(required_ele[0]){
3616        required = required_ele[0].outerText;
3617      }
3618      let dropdown_ele = jQuery(this).find(".item_accessorydd");
3619      let dropdown = 0;
3620      if(dropdown_ele[0]){
3621        dropdown = dropdown_ele[0].outerText;
3622      }
3623      return (required > 0 && dropdown == 1)
3624    });
3625    var required_selected = true;
3626    required_dropdown_values.each(function() {
3627      required_value_id = jQuery(this).find(".item_rentalid")[0].outerText;
3628      required_value_id = required_value_id.split("_");
3629      required_value_id = required_value_id[required_value_id.length-1];
3630
3631      let selected = jQuery("[id^='io_acc_"+required_value_id+"']").filter(function() {
3632        return this["selected"];
3633      });
3634
3635      //IO-22431 - This wasnt catching if [0] was undefined
3636      if(jQuery(this).find(".io_acc_li_name")[0] != undefined){
3637        required_value_name = jQuery(this).find(".io_acc_li_name")[0].outerText ? jQuery(this).find(".io_acc_li_name")[0].outerText : "";
3638      }
3639      if(selected.length < jQuery(this).find(".item_required")[0].outerText){
3640        if(item_id == main_id){
3641          alert(required_value_name+" is a required field.");
3642        }
3643        required_selected = false;
3644      }
3645
3646      if(!required_selected){
3647        return false;
3648      }
3649      return true;
3650    });
3651    if(!required_selected){
3652      return false;
3653    }
3654
3655    /* IO-14857 */
3656    if(jQuery(".io_product_measurement_price").length > 0){
3657      let units;
3658      if(jQuery(".io_product_infobox .item_qtytype").text() == "Area"){
3659        units = "sq meters"
3660        if(country === "US") units = "sq feet"
3661      }else if(jQuery(".io_product_infobox .item_qtytype").text() == "Perimeter"){
3662        units = "meters"
3663        if(country === "US") units = "feet"
3664      }
3665      item.set("units", units);
3666      item.set("quantity", jQuery(".io_measure_price_raw_measurement").text());
3667    }
3668  }
3669  function cart_afterAdd(item) {
3670    /*loading animation*/
3671    ioCartLoaderActivate();
3672    setTimeout(function(){ if(io_cart_loading_active && io_cart_loading_count === 0){ io_cart_loading_active=false; ioCartShowOverlay(false);} }, 300);
3673
3674    /* Add required Accessories */
3675    let required_accs = jQuery("[id^=io_acc_required_]").filter(function() {
3676      return parseInt(this["outerText"]) > 0 && this.parentElement.style['display'] != 'none';
3677    });
3678    required_accs.each(function(index) {
3679      simpleCart.parse_html_and_add(this, true);
3680    });
3681
3682
3683    let selected_values = jQuery("[id^=io_acc_]").filter(function() {
3684      return this["selected"];
3685    });
3686
3687    selected_values.each(function() {
3688      let info = {};
3689      let rid = jQuery(this).find(".item_rentalid")[0].outerText;
3690      let split_rid = rid.split("_");
3691      if(split_rid.length == 3){
3692        let parent_rid = split_rid[1];
3693        let main_item_rid = split_rid[0];
3694        info["acc_dd_parent_limit"] = jQuery("#io_acc_accessorylimit_"+main_item_rid+"_"+parent_rid)[0].outerText;
3695      }else{
3696        info["acc_dd_parent_limit"] = "0";
3697      }
3698      info["name"]         = jQuery(this).find(".io_acc_li_name")[0].outerText
3699      info["qtyincrement"] = jQuery(this).find(".item_qtyincrement")[0].outerText
3700      info["quantity"]     = jQuery(this).find(".item_required")[0].outerText > 0 ? jQuery(this).find(".item_required")[0].outerText : 1;
3701      info["rentalid"]     = jQuery(this).find(".item_rentalid")[0].outerText
3702      info["linkqty"]      = jQuery(this).find(".item_linkqty")[0].outerText
3703      info["pagename"]     = io_pagename;
3704      if(jQuery(this).find(".io_acc_li_img_thumb")[0]){
3705        info["image"] = jQuery(this).find(".io_acc_li_img_thumb")[0].src
3706      }
3707      let already_added = simpleCart.items().filter((item) => item.get("rentalid").startsWith(split_rid[0]+"_"+split_rid[1]));
3708      if(jQuery(this).find(".item_accessorydd")[0].outerText != 1 &&
3709         (info["acc_dd_parent_limit"] == "0" || already_added.length < info["acc_dd_parent_limit"]) ){
3710        simpleCart.add(info, true);
3711      }
3712    });
3713
3714    checkAvailCartOnly(true);
3715
3716    let last_upsell_call_time = Date.now() - last_upsell_call;
3717    if(in_cart_upsell && last_upsell_call_time > 2000){
3718      let rental_ids = "";
3719
3720      /* Get the last element in the cart. This is the last item added. */
3721      last_added = jQuery("[id^='cartItem_']").last();
3722      if(last_added.length){
3723        last_added_children = last_added.children();
3724        for(let i = 0; i < last_added_children.length; ++i){
3725          if(last_added_children[i].className == "item-rentalid") {
3726            rental_ids += last_added_children[i].innerText + "|";
3727          }
3728        }
3729      }
3730
3731      if(rental_ids.length>0 && jQuery("#cartPopover").attr("class") == "cartIn"){
3732        var times = getAvailTimes();
3733        last_upsell_call = Date.now();
3734        getUpsellsCall(times[0],times[1],times[2],rental_ids,updateCartUpsell);
3735      }
3736      else{
3737        jQuery("#cart-carousel-container").hide();
3738      }
3739    }
3740
3741    if(io_company_timeslots.length != 0 && io_cartdayselect == "single_day"){
3742      filterTimeslotsByDay_itemTimeslots();
3743      simpleCart.update();
3744    }
3745
3746    if (jQuery(".cartInfo.open,.ioCart.open, .ioCart_link.open").length == 0) {
3747      setTimeout(function () {
3748        cartShow();
3749      }, 100);
3750    }
3751
3752    if(simpleCart.items().length==0){
3753      jQuery(".simpleCart_checkout").hide()
3754    }else{
3755      jQuery(".simpleCart_checkout").show();
3756    }
3757
3758    if(simpleCart.items().length > 0){
3759      let headerBookButton = jQuery("a[href$='io_quoteform/']");
3760      headerBookButton.addClass("ioCart_link");
3761      headerBookButton.attr("href", "javascript:;");
3762    }
3763
3764    checkRestrictedDeliveries()
3765
3766    if(jQuery("#ioInfoHeader").length){
3767      header_increment_step();
3768    }
3769  }
3770  function cart_afterQtyChange(){
3771    let last_checkAvail_call_time = Date.now() - last_checkAvail_call;
3772    if(last_checkAvail_call_time > 2000){
3773      /*loading animation*/
3774      ioCartLoaderActivate();
3775      setTimeout(function(){ if(io_cart_loading_active && io_cart_loading_count === 0){ io_cart_loading_active=false; ioCartShowOverlay(false);} }, 300);
3776      last_checkAvail_call = Date.now();
3777      checkAvailCart();
3778      checkAvailCartTimeslots();
3779    }
3780  }
3781  function cart_hideTimepickerWrapper(){
3782    jQuery(".ui-timepicker-wrapper").hide();
3783  }
3784  function cart_beforeRemove() {
3785    last_remove = Date.now();
3786  }
3787  function cart_afterRemove(removed_item){
3788    checkAvailCart();
3789    last_upsell_call_time = Date.now() - last_upsell_call;
3790    if(in_cart_upsell && last_upsell_call_time > 2000){
3791      rental_ids = getAllRentalIDsFromCart();
3792      if(rental_ids.length>0 && jQuery("#cartPopover").attr("class") == "cartIn"){
3793        var times = getAvailTimes();
3794        last_upsell_call = Date.now();
3795        getUpsellsCall(times[0],times[1],times[2],rental_ids,updateCartUpsell);
3796      }
3797      else{
3798        jQuery("#cart-carousel-container").hide();
3799      }
3800    }
3801
3802    /* IO-24060 */
3803    simpleCart.items().forEach(function (item, index) {
3804      let expression = '^' + removed_item.get('rentalid') + '(?:[_:]\\d+)*';
3805      if(item.get("rentalid").match(expression)){
3806        item.remove();
3807      }
3808    });
3809
3810
3811    checkAvailCartTimeslots();
3812    checkRestrictedDeliveries();
3813    if(simpleCart.items().length==0){
3814      jQuery(".simpleCart_checkout").hide()
3815    }else{
3816      jQuery(".simpleCart_checkout").show();
3817    }
3818
3819    if(jQuery("#ioInfoHeader").length && simpleCart.items().length == 0){
3820      jQuery("#io-step-3").removeClass("io-step-active");
3821      jQuery("#io-step-2").addClass("io-step-active");
3822      jQuery("#io-step-2").removeClass("io-step-done")
3823    }
3824  }
3825  function cart_afterLoad(){
3826    var items_removed = false;
3827    simpleCart.items().forEach(function(item){
3828      if(item.get("pagename") != io_pagename){
3829        item.remove()
3830        items_removed = true;
3831      }
3832    })
3833    if(items_removed){
3834      alert("Some items in the cart are from a different location and have been removed.");
3835    }
3836  }
3837  /*</editor-fold>*/
3838
3839  /*<editor-fold defaultstate="collapsed" desc="Date/Time Object/String Conversion Functions">*/
3840  function getFormatteddate(date_obj){
3841    if(dateFormat.substring(0,1)=='d'){
3842      let month = date_obj.getMonth() + 1;
3843      formatteddate = date_obj.getDate()+'/'+month+'/'+date_obj.getFullYear();
3844    }else{
3845      let month = date_obj.getMonth() + 1;
3846      formatteddate = month+'/'+date_obj.getDate()+'/'+date_obj.getFullYear();
3847    }
3848    return formatteddate;
3849  }
3850
3851  function getFormattedtime(date_obj){
3852    var hour24 = false;
3853    var ampm = 'am';
3854    var starttime = jQuery('[name=timeStart]').val();
3855    if(starttime.length>0 && starttime.indexOf('m')==-1) hour24 = true;
3856    if(hour24){ //24 hour return
3857      return date_obj.getHours()+':'+pad(date_obj.getMinutes(),2);
3858    }else{ //12 hour return
3859      var hour = date_obj.getHours();
3860      if(hour==12) ampm='pm';
3861      if(hour==0) hour=12;
3862      if(hour>12){
3863        hour-=12;
3864        ampm='pm';
3865      }
3866      return hour+':'+pad(date_obj.getMinutes(),2)+' '+ampm;
3867    }
3868  }
3869
3870  function buildDateobjectstring(date,dateformat,time){
3871    var ampm = 'am';
3872    var hour24 = false;
3873    if(typeof date == "undefined") return;
3874    if(typeof dateformat == "undefined") return;
3875    var start_arr = date.split('/');
3876    if(dateformat.substring(0,1)=='d'){
3877      date = start_arr[2]+'/'+pad(start_arr[1],2)+'/'+pad(start_arr[0],2);
3878    }else{
3879      date = start_arr[2]+'/'+pad(start_arr[0],2)+'/'+pad(start_arr[1],2);
3880    }
3881    if(time.length>0 && time.indexOf('m')==-1) hour24 = true;
3882    if(hour24){
3883      try{
3884        var time_arr = time.split(':');
3885        var hour = parseInt(time_arr[0]);
3886        var min = pad(time_arr[1], 2);
3887        time = hour + ':' + min + ':00';
3888      }catch(err){
3889        time = "";
3890      }
3891    }else {
3892      try {
3893        time = time.replace('am', "").replace(' ', "");
3894        if (time.indexOf('pm') != -1) ampm = 'pm';
3895        time = time.replace('pm', "").replace(' ', "");
3896        var time_arr = time.split(':');
3897        var hour = parseInt(time_arr[0]);
3898        var min = pad(time_arr[1], 2);
3899        if (ampm == 'pm') {
3900          if (hour < 12) hour += 12;
3901        } else if (ampm == 'am' && hour == 12) {
3902          hour -= 12;
3903        }
3904        hour = pad(hour, 2);
3905        time = hour + ':' + min + ':00';
3906      } catch (err) {
3907        time = "";
3908      }
3909    }
3910    return date+' '+time;
3911  }
3912
3913  function pad(num, size) {
3914    var s = num+"";
3915    while (s.length < size) s = "0" + s;
3916    return s;
3917  }
3918  function convertDateStringtoDateObject(date_str, time_str=null){
3919    if(date_str){
3920      split_date_str = date_str.split("/");
3921      /* Parse start and end time. */
3922      if(time_str){
3923        /* Check and see if we are in 12 hour format, if so convert it to 24 hour format. */
3924        split_time_str = convert12HourTo24Hour(time_str);
3925      }else{
3926        /* If we do not have a time, then default to zeros */
3927        split_time_str = [0, 0];
3928      }
3929      /* Create date object based off our set date format. */
3930      date_obj = buildDateObj(split_date_str, split_time_str);
3931      return date_obj;
3932    }else{
3933      return new Date();
3934    }
3935  }
3936
3937  function buildDateObj(split_date_str, split_time_str){
3938    if (dateFormat == "d/m/yy"){
3939      return new Date(split_date_str[2], (+split_date_str[1] - 1).toString(), split_date_str[0],
3940              split_time_str[0], split_time_str[1]);
3941    }else{
3942      return new Date(split_date_str[2], (+split_date_str[0] - 1).toString(), split_date_str[1],
3943              split_time_str[0], split_time_str[1]);
3944    }
3945  }
3946
3947  function convert12HourTo24Hour(time_str){
3948    /* This function returns an array containing hours and minutes of provided string in 24 hour format. */
3949    /* This is primarily used for creating JS Date objects */
3950    split_time = time_str.split(":");
3951
3952    /* We are in 12 hour format if there is an "m" attached to minutes portion. */
3953    if(split_time[1].toLowerCase().search("m") != -1) {
3954      let separated_minutes = split_time[1].split(" ");
3955      if(separated_minutes.length==1){
3956        split_time[1] = split_time[1].replace("am"," am");
3957        split_time[1] = split_time[1].replace("pm"," pm");
3958        separated_minutes = split_time[1].split(" ");
3959      }
3960      let minutes = separated_minutes[0];
3961      let modifier = separated_minutes[1];
3962      split_time[1] = minutes;
3963
3964      /* First assume that if the hours are 12, then its midnight. */
3965      if(split_time[0] == "12"){
3966        split_time[0] = "00";
3967      }
3968      /* Second if there is a "p" in the modifier, then add twelve to the hours. */
3969      if(typeof modifier != "undefined"){
3970        if(modifier.toLowerCase().search("p") != -1){
3971          split_time[0] = (parseInt(split_time[0], 10) + 12);
3972        }
3973      }
3974    }
3975    return split_time;
3976  }
3977  /*</editor-fold>*/
3978
3979  /*<editor-fold defaultstate="collapsed" desc="Cart Show and Hide">*/
3980  function cartShow() {
3981    jQuery("#cartPopover").show();
3982    jQuery("#cartPopover").removeClass("cartOut");
3983    jQuery("#cartPopover").addClass("cartIn");
3984    jQuery(".cartInfo,.ioCart,.ioCart_link").addClass("open");
3985    if (/Mobi|Android/i.test(navigator.userAgent)) {
3986      document.body.style.overflow = "hidden";
3987    }
3988    /* jQuery(this).one("click", cartHide); */
3989    jQuery(".cartInfo").unbind("click").one("click", function(event){
3990      event.stopPropagation();
3991      event.stopImmediatePropagation();
3992      cartHide();
3993    });
3994    jQuery(".ioCart, .ioCart_link").unbind("click").one("click", function(event){
3995      event.stopPropagation();
3996      event.stopImmediatePropagation();
3997      cartHide();
3998    });
3999    jQuery(".cartIcon").removeClass("fa-shopping-cart").addClass("fa-close");
4000    if(simpleCart.items().length==0){
4001      jQuery(".simpleCart_checkout").hide()
4002    }else{
4003      jQuery(".simpleCart_checkout").show();
4004    }
4005
4006    checkAvailCartOnly();
4007
4008    last_upsell_call_time = Date.now() - last_upsell_call;
4009    if(in_cart_upsell && last_upsell_call_time > 2000){
4010      rental_ids = getAllRentalIDsFromCart();
4011      if(rental_ids.length>0 && jQuery("#cartPopover").attr("class") == "cartIn"){
4012        var times = getAvailTimes();
4013        last_upsell_call = Date.now();
4014        getUpsellsCall(times[0],times[1],times[2],rental_ids,updateCartUpsell);
4015      }
4016      else{
4017        jQuery("#cart-carousel-container").hide();
4018      }
4019    }
4020  }
4021
4022  function cartHide() {
4023    jQuery("#cartPopover").removeClass("cartIn");
4024    jQuery("#cartPopover").addClass("cartOut");
4025    if (/Mobi|Android/i.test(navigator.userAgent)) {
4026      document.body.style.overflow = "auto";
4027    }
4028    /* jQuery("#cartPopover").hide(); */
4029    jQuery(".cartInfo,.ioCart, .ioCart_link").removeClass("open");
4030    /* jQuery(this).one("click", cartShow); */
4031    jQuery(".cartInfo").unbind("click").one("click", function(event){
4032      event.stopPropagation();
4033      event.stopImmediatePropagation();
4034      cartShow();
4035    });
4036    jQuery(".ioCart, .ioCart_link").unbind("click").one("click", function(event){
4037      event.stopPropagation();
4038      event.stopImmediatePropagation();
4039      cartShow();
4040    });
4041    jQuery(".cartIcon").removeClass("fa-close").addClass("fa-shopping-cart");
4042  }
4043  /*
4044    function set_date_cookie(){
4045        if(this.id.indexOf("start_") !== -1){
4046            setCookie("dateStart", this.value, 14);
4047        } else if(this.id.indexOf("end_") !== -1){
4048            setCookie("dateEnd", this.value, 14);
4049        }
4050    }
4051    */
4052  jQuery(document).ready(function () {setTimeout(simpleCart.init, 3);});
4053  /*</editor-fold>*/
4054
4055  /*<editor-fold defaultstate="collapsed" desc="Check Avail All Call">*/
4056  function checkAvailAll(){
4057    checkAvailCart();
4058    checkAvailCartTimeslots();
4059    checkAvailFilter();
4060  }
4061  /*</editor-fold>*/
4062
4063  /*<editor-fold defaultstate="collapsed" desc="Check Avail - Page">*/
4064  /* for items on page not in cart */
4065  function checkAvailFilter() {
4066    let rental_names = "";
4067    let rental_ids = "";
4068    let batch_ids = [];
4069    let cart_rental_names = "";
4070    let cart_rental_ids = "";
4071    let item_id = "";
4072    let main_id = "";
4073    jQuery(".item_encoded").each(function(){
4074      rental_names += this.innerText + "|";
4075    });
4076    jQuery(".io_product_infobox .item_rentalid").each(function(){
4077      rental_ids += this.innerText + "|";
4078      item_id = this.innerText;
4079      main_id = this.innerText;
4080    });
4081    let batch_count = 0;
4082    let batch_index = 0;
4083    // If we have rental id string set, then we don't want to include availability checking for fpw items in header
4084    // IO-31498
4085    if(!rental_ids) {
4086      jQuery(".io_item2_list_inner .item_rentalid, .io_item2_listrent .item_rentalid").each(function () {
4087        /*
4088        if(rental_ids.indexOf(this.innerText+"|") == -1){
4089          rental_ids += this.innerText + "|";
4090        }
4091        */
4092        if (batch_count < 9) {
4093          if (!batch_ids.length) batch_ids.push("")
4094          if (!rid_in_batch(this.innerText + "|", batch_ids).length) {
4095            batch_ids[batch_index] += this.innerText + "|";
4096            batch_count++;
4097          }
4098        } else {
4099          if (!rid_in_batch(this.innerText + "|", batch_ids).length) {
4100            batch_ids[batch_index] += this.innerText + "|";
4101            batch_index++;
4102            batch_count = 0;
4103            batch_ids.push("");
4104          }
4105        }
4106      });
4107    }
4108    simpleCart.each(function (item, x) {
4109      var cart_name = item.get("encoded");
4110      if(cart_name==null){
4111        cart_name = encodeURIComponent(item.get("name"));
4112        cart_name = encodeURIComponent(decodeURIComponent(cart_name).replace(/[\u2032\u2019]+/ig,"'"));
4113      }
4114      let quantity = item.get("quantity");
4115      if(item.get("inputtype") == "Map"){
4116        quantity = 1
4117      }
4118      cart_rental_names += cart_name + "-" + quantity + "|";
4119      var cart_id = item.get("rentalid");
4120      cart_rental_ids += cart_id + "-" + quantity + "|";
4121    });
4122    /* #14494 IO-13779 */
4123    let delivery_methods_arr = [];
4124    var delivery_prices = [];
4125    if(io_delivery_prices){
4126      if(Object.keys(io_delivery_prices["override"]).includes(item_id)){
4127        delivery_prices = io_delivery_prices["override"][item_id]
4128      }else{
4129        if(!item_is_in_overrride_group(main_id)){
4130          delivery_prices = io_delivery_prices["default"]
4131        }
4132      }
4133      for(item in io_delivery_methods){
4134        if(delivery_prices.includes(io_delivery_methods[item]["id"])){
4135          delivery_methods_arr.push(item);
4136        }
4137      }
4138    }
4139
4140    let custom_prices_arr = [];
4141    if(io_custom_prices){
4142      if(Object.keys(io_custom_prices["override"]).includes(item_id.replace(":", '_'))){
4143        custom_prices_arr = io_custom_prices["override"][item_id.replace(":", '_')]
4144      }else{
4145        if(!item_is_in_overrride_group(main_id)){
4146          custom_prices_arr = io_custom_prices["default"]
4147        }
4148      }
4149    }
4150
4151    /* IO-13548 */
4152    if(io_accessory_price == "on"){
4153      let times = getAvailTimes();
4154      let acc_rental_id_str = getAccIDforPrice();
4155      let return_id = 0;
4156      if(acc_rental_id_str != ""){
4157        checkAvailCall(times[0],times[1],times[2],rental_names,acc_rental_id_str,displayAccessoryPrices,0,[],[],return_id,0,null,1,"",1);
4158      }
4159    }
4160
4161    let times = getAvailTimes();
4162    if(rental_names.length>0){
4163      if(use_weekday_weekend && rental_ids && !item_is_in_overrride_group(main_id)){
4164        let return_id = 0;
4165        let week_weekend = "";
4166        if(rental_ids != ""){
4167          return_id = 1;
4168          week_weekend = get_week_weekend_times(times, main_id);
4169          checkAvailCall(week_weekend["weekday"][0],week_weekend["weekday"][1],week_weekend["weekday"][2],rental_names,rental_ids,updatePageAvail_weekday,0,cart_rental_ids,cart_rental_names,return_id,1);
4170          checkAvailCall(week_weekend["weekend"][0],week_weekend["weekend"][1],week_weekend["weekend"][2],rental_names,rental_ids,updatePageAvail_weekend,0,cart_rental_ids,cart_rental_names,return_id,1);
4171        }
4172      }
4173      let return_id = 0;
4174      if(rental_ids != "" || batch_ids.length){
4175        return_id = 1;
4176      }
4177      if(delivery_methods_arr && rental_ids){
4178        delivery_methods_arr.forEach(function(delivery_method){
4179          checkAvailCall(times[0],times[1],times[2],rental_names,rental_ids,updatePageAvail_delivery_method,0,cart_rental_ids,cart_rental_names,return_id,1,delivery_method);
4180        });
4181      }
4182      if(custom_prices_arr && rental_ids){
4183        custom_prices_arr.forEach(function(custom_price){
4184          let start_date = times[0];
4185          let start_time = times[1];
4186          if(!start_date){
4187            start_date = getFormatteddate(new Date());
4188          }
4189          if(!start_time){
4190            start_time = io_default_start_time;
4191          }
4192          checkAvailCall(start_date,start_time,custom_price['duration'],rental_names,rental_ids,updatePageAvail_custom_price,0,cart_rental_ids,cart_rental_names,return_id,1,"",1,custom_price['name']);
4193        });
4194      }
4195
4196      if(batch_ids.length){
4197        batch_ids.forEach(function(rids){
4198          return checkAvailCall(times[0],times[1],times[2],"",rids,updatePageAvail,0,cart_rental_ids,cart_rental_names,return_id,1,null,1,"",1);
4199        });
4200      }else{
4201        return checkAvailCall(times[0],times[1],times[2],rental_names,rental_ids,updatePageAvail,0,cart_rental_ids,cart_rental_names,return_id,1,null,1);
4202      }
4203    }
4204  }
4205
4206  function item_is_in_overrride_group(item_id){
4207    for(const group_id in io_prices['override_groups']){
4208      for(const search_id in io_prices['override_groups'][group_id]){
4209        if(search_id == item_id){
4210          return true;
4211        }
4212      }
4213    }
4214    return false
4215  }
4216
4217  function get_week_weekend_times(times, rid){
4218    /* Create a copy instead of reference.*/
4219    let temp_times = JSON.parse(JSON.stringify(times));
4220    let start_date = temp_times[0];
4221    if(!start_date){
4222      start_date = getFormatteddate(new Date());
4223      temp_times[0] = start_date;
4224    }
4225    temp_times[1] = io_default_start_time
4226    var newDate1 = convertDateStringtoDateObject(start_date, io_default_start_time);
4227    var newDate2 = convertDateStringtoDateObject(start_date, io_default_end_time);
4228    let time_duration = ((newDate2 - newDate1) / 3600) / 1000;
4229    temp_times[2] = time_duration;
4230    let day = new Date(newDate1).getDay(); //IO-28150 - Other countries put the date dd/mm/yy so using the formatted newDate1 instead of start_date accounts for this
4231    let weekday_weekend = {};
4232    weekday_weekend["rid"] = rid;
4233    if(io_weekendDefine == "friday-sunday"){
4234      if(day == 5 || day == 6 || day == 0){
4235        weekday_weekend["weekend"] = JSON.parse(JSON.stringify(temp_times));
4236        temp_times[0] = getNextMonday(temp_times[0]);
4237        weekday_weekend["weekday"] = JSON.parse(JSON.stringify(temp_times));
4238      }else if(day == 1 || day == 2 || day == 3 || day == 4){
4239        weekday_weekend["weekday"] = JSON.parse(JSON.stringify(temp_times));
4240        temp_times[0] = getNextSaturday(temp_times[0]);
4241        weekday_weekend["weekend"] = JSON.parse(JSON.stringify(temp_times));
4242      }
4243    }else if(io_weekendDefine == "saturday-sunday") {
4244      if (day == 6 || day == 0) {
4245        weekday_weekend["weekend"] = JSON.parse(JSON.stringify(temp_times));
4246        temp_times[0] = getNextMonday(temp_times[0]);
4247        weekday_weekend["weekday"] = JSON.parse(JSON.stringify(temp_times));
4248      } else if (day == 1 || day == 2 || day == 3 || day == 4 || day == 5) {
4249        weekday_weekend["weekday"] = JSON.parse(JSON.stringify(temp_times));
4250        temp_times[0] = getNextSaturday(temp_times[0]);
4251        weekday_weekend["weekend"] = JSON.parse(JSON.stringify(temp_times));
4252      }
4253    }else if (io_weekendDefine == "friday-monday"){
4254      if(day == 5 || day == 6 || day == 0 || day == 1){
4255        weekday_weekend["weekend"] = JSON.parse(JSON.stringify(temp_times));
4256        temp_times[0] = getNextTuesday(temp_times[0]);
4257        weekday_weekend["weekday"] = JSON.parse(JSON.stringify(temp_times));
4258      }else if(day == 2 || day == 3 || day == 4){
4259        weekday_weekend["weekday"] = JSON.parse(JSON.stringify(temp_times));
4260        temp_times[0] = getNextSaturday(temp_times[0]);
4261        weekday_weekend["weekend"] = JSON.parse(JSON.stringify(temp_times));
4262      }
4263    }
4264    return weekday_weekend;
4265  }
4266
4267  /*
4268        helper function found here:
4269        https://bobbyhadz.com/blog/javascript-get-date-of-next-monday#:~:text=To%20get%20the%20next%20Monday%2C%20we%3A&text=If%20the%20remainder%20is%20equal,month%20for%20the%20next%20Monday.
4270    */
4271  function getNextMonday(date_str) {
4272    const date_obj = parseDate(date_str, dateFormat);
4273
4274    const nextMonday = new Date(
4275            date_obj.setDate(
4276                    date_obj.getDate() + ((7 - date_obj.getDay() + 1) % 7 || 7),
4277            ),
4278    );
4279
4280    return getFormatteddate(nextMonday);
4281  }
4282
4283    function getNextTuesday(date_str) {
4284      const date_obj = parseDate(date_str, dateFormat);
4285
4286      const nextMonday = new Date(
4287              date_obj.setDate(
4288                      date_obj.getDate() + ((7 - date_obj.getDay() + 2) % 7 || 7),
4289              ),
4290      );
4291
4292      return getFormatteddate(nextMonday);
4293    }
4294
4295  function parseDate(date_str, format) {
4296      var parts = date_str.split(/[/.-]/);
4297      var day, month, year;
4298
4299      if (format === "m/d/yy") {
4300          month = parseInt(parts[0]) - 1;
4301          day = parseInt(parts[1]);
4302          year = parseInt(parts[2]) + (parts[2].length === 2 ? 2000 : 0);
4303      } else if (format === "d/m/yy") {
4304          day = parseInt(parts[0]);
4305          month = parseInt(parts[1]) - 1;
4306          year = parseInt(parts[2]) + (parts[2].length === 2 ? 2000 : 0);
4307      } else if (format === "yy/m/d") {
4308          year = parseInt(parts[0]) + (parts[0].length === 2 ? 2000 : 0);
4309          month = parseInt(parts[1]) - 1;
4310          day = parseInt(parts[2]);
4311      } else {
4312          throw new Error("Unsupported date format");
4313      }
4314
4315      return new Date(year, month, day);
4316  }
4317
4318  /* modified from function above */
4319  function getNextSaturday(date_str) {
4320    const date_obj = parseDate(date_str, dateFormat);
4321
4322    const next_friday = new Date(
4323            date_obj.setDate(
4324                    date_obj.getDate() + ((7 - date_obj.getDay() + 6) % 7 || 7),
4325            ),
4326    );
4327
4328    return getFormatteddate(next_friday);
4329  }
4330
4331  function updatePageAvail(data){
4332    let use_id = data["return_id"]
4333    delete data["return_id"];
4334    if(use_id == 1){
4335      updatePageAvail_itemIDs(data)
4336    }else{
4337      updatePageAvail_itemNames(data);
4338    }
4339  }
4340  function updatePageAvail_weekday(data){
4341    jQuery.each(data, function (rental_id, qty){
4342      if (rental_id == "price") {
4343        var prices = qty;
4344        jQuery.each(prices, function (price_id, amt) {
4345          let cust_price = document.querySelector(".io_product_cust_price_weekday");
4346          if(cust_price==undefined){
4347            var first_price = document.querySelector(".io_product_price_box");
4348            if(first_price != null){
4349              cust_price = first_price.cloneNode(true);
4350              /* clear all classes */
4351              cust_price.className = "";
4352              cust_price.classList.add("io_product_price_box");
4353              cust_price.classList.add("io_product_cust_price_weekday");
4354              cust_price.style.display = "none";
4355              first_price.before(cust_price);
4356            }
4357          }
4358
4359          main_item_id = jQuery(".io_product_infobox .item_rentalid").first().text();
4360          if(main_item_id == price_id && cust_price!=undefined){
4361            if(typeof amt == "string") amt = Number(amt.replace(",",""));
4362            cust_price.querySelector("p:nth-child(1)").innerHTML=simpleCart.toCurrency(amt);
4363            let times = getAvailTimes();
4364            cust_price.querySelector("p:nth-child(2)").innerHTML = io_weekDayText;
4365            if(amt>0){
4366              cust_price.style.display = "grid";
4367            }else{
4368              cust_price.style.display = "none";
4369            }
4370          }
4371        });
4372      }
4373    });
4374  }
4375  function updatePageAvail_delivery_method(data){
4376    var delivery_method = data["delivery_method"]
4377    jQuery.each(data, function (rental_id, qty){
4378      if (rental_id == "price") {
4379        var prices = qty;
4380        jQuery.each(prices, function (price_id, amt) {
4381          let cust_price = document.querySelector(".io_product_cust_price_delivery_method"+io_delivery_methods[delivery_method]["id"]);
4382          let rid = jQuery(".io_product_container .item_rentalid").first().text();
4383          if(cust_price==undefined && !io_delivery_methods[delivery_method]["restricted"].includes(rid)){
4384            var first_price = document.querySelector(".io_product_price_box");
4385            if(first_price != null){
4386              cust_price = first_price.cloneNode(true);
4387              /* clear all classes */
4388              cust_price.className = "";
4389              cust_price.classList.add("io_product_price_box");
4390              cust_price.classList.add("io_product_cust_price_delivery_method"+io_delivery_methods[delivery_method]["id"]);
4391              cust_price.style.display = "none";
4392              first_price.before(cust_price);
4393            }
4394          }
4395
4396          main_item_id = jQuery(".io_product_infobox .item_rentalid").first().text();
4397          if(main_item_id == price_id && cust_price!=undefined){
4398            if(typeof amt == "string") amt = Number(amt.replace(",",""));
4399            cust_price.querySelector("p:nth-child(1)").innerHTML=simpleCart.toCurrency(amt);
4400            let times = getAvailTimes();
4401            cust_price.querySelector("p:nth-child(2)").innerHTML = make_live_price_editable_time(times, delivery_method);
4402            if(amt>0 && event_time_set()){
4403              cust_price.style.display = "grid";
4404            }else{
4405              cust_price.style.display = "none";
4406            }
4407          }
4408        });
4409      }
4410    });
4411  }
4412  function updatePageAvail_custom_price(data, custom_price_name){
4413    let custom_price_class_name = custom_price_name.replace(/[\s:./()!]/g, '_');
4414    jQuery.each(data, function (rental_id, qty){
4415      if (rental_id == "price") {
4416        var prices = qty;
4417        jQuery.each(prices, function (price_id, amt) {
4418          let cust_price = document.querySelector(".io_product_cust_price_"+custom_price_class_name);
4419          let rid = jQuery(".io_product_container .item_rentalid").first().text();
4420          if(cust_price==undefined){
4421            var first_price = document.querySelector(".io_product_price_box");
4422            if(first_price != null){
4423              cust_price = first_price.cloneNode(true);
4424              /* clear all classes */
4425              cust_price.className = "";
4426              cust_price.classList.add("io_product_price_box");
4427              cust_price.classList.add("io_product_cust_price_"+custom_price_class_name);
4428              cust_price.style.display = "none";
4429              first_price.before(cust_price);
4430            }
4431          }
4432
4433          main_item_id = jQuery(".io_product_infobox .item_rentalid").first().text();
4434          if(main_item_id == price_id && cust_price!=undefined){
4435            if(typeof amt == "string") amt = Number(amt.replace(",",""));
4436            cust_price.querySelector("p:nth-child(1)").innerHTML=simpleCart.toCurrency(amt);
4437            cust_price.querySelector("p:nth-child(2)").innerHTML = "for " + custom_price_name;
4438            if(amt>0){
4439              cust_price.style.display = "grid";
4440            }else{
4441              cust_price.style.display = "none";
4442            }
4443          }
4444        });
4445      }
4446    });
4447  }
4448  function updatePageAvail_weekend(data){
4449    jQuery.each(data, function (rental_id, qty){
4450      if (rental_id == "price") {
4451        var prices = qty;
4452        jQuery.each(prices, function (price_id, amt) {
4453          let cust_price = document.querySelector(".io_product_cust_price_weekend");
4454          if(cust_price==undefined){
4455            var first_price = document.querySelector(".io_product_price_box");
4456            if(first_price != null){
4457              cust_price = first_price.cloneNode(true);
4458              /* clear all classes */
4459              cust_price.className = "";
4460              cust_price.classList.add("io_product_price_box");
4461              cust_price.classList.add("io_product_cust_price_weekend");
4462              cust_price.style.display = "none";
4463              first_price.before(cust_price);
4464            }
4465          }
4466
4467          main_item_id = jQuery(".io_product_infobox .item_rentalid").first().text();
4468          if(main_item_id == price_id && cust_price!=undefined){
4469            if(typeof amt == "string") amt = Number(amt.replace(",",""));
4470            cust_price.querySelector("p:nth-child(1)").innerHTML=simpleCart.toCurrency(amt);
4471            let times = getAvailTimes();
4472            cust_price.querySelector("p:nth-child(2)").innerHTML = io_weekEndText;
4473            if(amt>0){
4474              cust_price.style.display = "grid";
4475            }else{
4476              cust_price.style.display = "none";
4477            }
4478          }
4479        });
4480      }
4481    });
4482  }
4483  function updatePageAvail_itemIDs(data){
4484    jQuery.each(data, function (rental_id, qty){
4485      if (rental_id == "price"  && jQuery(".io_product_infobox .item_inputtype").text() != "Map") {
4486        var prices = qty;
4487        jQuery.each(prices, function (price_id, amt) {
4488          let cust_price = document.querySelector(".io_product_cust_price");
4489          if(cust_price==undefined){
4490            var first_price = document.querySelector(".io_product_price_box");
4491            if(first_price != null){
4492              cust_price = first_price.cloneNode(true);
4493              /* clear all classes */
4494              cust_price.className = "";
4495              cust_price.classList.add("io_product_price_box");
4496              cust_price.classList.add("io_product_cust_price");
4497              cust_price.style.display = "none";
4498              first_price.before(cust_price);
4499            }
4500          }
4501          main_item_id = jQuery(".io_product_infobox .item_rentalid").first().text();
4502          if(main_item_id == price_id && cust_price!=undefined){
4503            if(typeof amt == "string") amt = Number(amt.replace(",",""));
4504            cust_price.querySelector("p:nth-child(1)").innerHTML=simpleCart.toCurrency(amt);
4505            let times = getAvailTimes();
4506            cust_price.querySelector("p:nth-child(2)").innerHTML = make_live_price_editable_time(times);
4507            if(amt>0 && (event_time_set() || io_always_display_live_price == "on")){
4508              cust_price.style.display = "grid";
4509            }else{
4510              cust_price.style.display = "none";
4511            }
4512          }
4513        });
4514      }
4515
4516      if(qty<=0 && rental_id != "delivery_method"){
4517        /* cat,all-item,widget */
4518        if(io_checkavail=="warn"){
4519          jQuery(".add_cart_"+rental_id.replace(":", "\\\:")+" .item_add").removeClass("item_add").addClass("item_add_off").trigger("classChange");
4520          jQuery(".unavailable_message_"+rental_id.replace(":", "\\\:")).show();
4521        }
4522        if(io_checkavail=="hide") jQuery(".add_cart_"+rental_id).parent().parent().parent().hide();
4523
4524        /* product page */
4525        if(jQuery(".io_product_container").length && io_checkavail!="off" && jQuery(".io_product_container .item_rentalid").first().text() === rental_id){
4526          jQuery(".add_cart_"+rental_id.replace(":", "\\\:")+" .item_add").first().removeClass("item_add").addClass("item_add_off").trigger("classChange");
4527          jQuery(".io_product_container .unavailable_message").show();
4528        }
4529      }else if(qty>0){
4530        if(io_checkavail=="warn"){
4531          jQuery(".add_cart_"+rental_id.replace(":", "\\\:")+" .item_add_off").removeClass("item_add_off").addClass("item_add").trigger("classChange");
4532          jQuery(".unavailable_message_"+rental_id.replace(":", "\\\:")).hide();
4533        }
4534        if(io_checkavail=="hide") jQuery(".add_cart_"+rental_id).parent().parent().parent().show();
4535
4536        /* product page */
4537        if(jQuery(".io_product_container").length && io_checkavail!="off" && jQuery(".io_product_container .item_rentalid").first().text() === rental_id){
4538          jQuery(".add_cart_"+rental_id.replace(":", "\\\:")+" .item_add_off").removeClass("item_add_off").addClass("item_add").trigger("classChange");
4539          jQuery(".io_product_container .unavailable_message").hide();
4540        }
4541      }
4542    });
4543  }
4544  function updatePageAvail_itemNames(data){
4545    jQuery.each(data, function (rental_name, qty) {
4546      rental_name = rental_name.replace(/[\u2032\u2019]+/ig,"'");
4547      var main_name_temp = "";
4548      if(typeof main_name_orig != "undefined"){
4549        main_name_temp = main_name_orig.replace(/[\u2032\u2019]+/ig,"'");
4550      }
4551      rental_name_esc = rental_name.replace(/'/g, "\\\\'");
4552      if (rental_name == "price") {
4553        var prices = qty;
4554        jQuery.each(prices, function (price_name, amt) {
4555          /* var prices = document.querySelector(".io_product_price_box:not(.io_product_cust_price)"); */
4556          /* if(prices != null) prices.remove(); */
4557          let cust_price = document.querySelector(".io_product_cust_price");
4558          if(cust_price==undefined){
4559            var first_price = document.querySelector(".io_product_price_box");
4560            if(first_price != null){
4561              cust_price = first_price.cloneNode(true);
4562              /* clear all classes */
4563              cust_price.className = "";
4564              cust_price.classList.add("io_product_price_box");
4565              cust_price.classList.add("io_product_cust_price");
4566              cust_price.style.display = "none";
4567              first_price.before(cust_price);
4568            }
4569          }
4570          try{
4571            var main_name = decodeURIComponent(jQuery(".io_product_container .item_encoded").first().html().replace(/[+]/gi, "%20"));
4572          }catch(e){main_name=""}
4573          var i = main_name.lastIndexOf(":");
4574          let acc_name = "";
4575          let rental_name = "";
4576          var i = main_name.lastIndexOf(":");
4577          if(i>0){
4578            rental_name = main_name.substring(0, i);
4579            acc_name = main_name.substring(i+1);
4580          }
4581          if (acc_name.toUpperCase() == price_name.toUpperCase() && cust_price!=undefined){
4582            var rental_id = document.querySelector(".item_rentalid").innerText;
4583            if(rental_id != null){
4584              rid_arr = rental_id.split(":");
4585              /* ignore the main id for this */
4586              rental_id = rid_arr[rid_arr.length-1];
4587              if(jQuery("#io_acc_overrideprice_"+rental_id).first().text()>0){
4588                amt = prices[acc_name];
4589              }else{
4590                let item_price = Number(prices[rental_name].replace(",",""));
4591                amt = Number(amt.replace(",","")) + item_price;
4592                amt = simpleCart.toCurrency(amt, {symbol:""})
4593              }
4594            }
4595            cust_price.querySelector("p:nth-child(1)").innerText="$"+amt;
4596            if(typeof amt == "string") amt = Number(amt.replace(",",""));
4597            let times = getAvailTimes();
4598            cust_price.querySelector("p:nth-child(2)").innerHTML = make_live_price_editable_time(times);
4599            if(amt>0 && (event_time_set() || io_always_display_live_price == "on")){
4600              cust_price.style.display = "grid";
4601            }else{
4602              cust_price.style.display = "none";
4603            }
4604
4605          }else if(!rental_name && !acc_name && cust_price!=undefined){
4606            amt = prices[main_name];
4607            cust_price.querySelector("p:nth-child(1)").innerText="$"+amt;
4608            if(typeof amt == "string") amt = Number(amt.replace(",",""));
4609            let times = getAvailTimes();
4610            cust_price.querySelector("p:nth-child(2)").innerHTML = make_live_price_editable_time(times);
4611            if(amt>0 && (event_time_set() || io_always_display_live_price == "on")){
4612              cust_price.style.display = "grid";
4613            }else{
4614              cust_price.style.display = "none";
4615            }
4616          }
4617
4618        });
4619      }
4620
4621      if(qty<=0){
4622        /* cat,all-item,widget */
4623        if(io_checkavail=="warn"){
4624          jQuery("div[name='maindiv_"+rental_name_esc+"'] .item_add").removeClass("item_add").addClass("item_add_off").trigger("classChange");
4625          jQuery("div[name='maindiv_"+rental_name_esc+"'] .unavailable_message").show();
4626        }
4627        if(io_checkavail=="hide") jQuery("div[name='maindiv_"+rental_name_esc+"']").hide();
4628
4629        /* product page */
4630        if(jQuery(".io_product_container").length && io_checkavail!="off"){
4631          if(main_name_temp==rental_name){
4632            jQuery(".io_product_container .item_add").first().removeClass("item_add").addClass("item_add_off").trigger("classChange");
4633            jQuery(".io_product_container .unavailable_message").show();
4634          }
4635        }
4636      }else if(qty>0){
4637        /* console.log("good"); */
4638        if(io_checkavail=="warn"){
4639          jQuery("div[name='maindiv_"+rental_name_esc+"'] .item_add_off").removeClass("item_add_off").addClass("item_add").trigger("classChange");
4640          jQuery("div[name='maindiv_"+rental_name_esc+"'] .unavailable_message").hide();
4641        }
4642        if(io_checkavail=="hide") jQuery("div[name='maindiv_"+rental_name_esc+"']").show();
4643
4644        /* product page */
4645        if(jQuery(".io_product_container").length && io_checkavail!="off"){
4646          if(main_name_temp==rental_name){
4647            jQuery(".io_product_container .item_add_off").removeClass("item_add_off").addClass("item_add").trigger("classChange");
4648            jQuery(".io_product_container .unavailable_message").hide();
4649          }
4650        }
4651      }
4652    });
4653  }
4654  function displayAccessoryPrices(data) {
4655      if (data.price) {
4656          let acc_prices = data.price;
4657          for (const [key, value] of Object.entries(acc_prices)) {
4658              let new_key = key;
4659              if ((key.match(/_/g) || []).length > 1) {
4660                  let split_key = key.split("_");
4661                  let second_to_last = split_key[split_key.length - 2];
4662                  let last = split_key[split_key.length - 1];
4663                  new_key = second_to_last + "_" + last;
4664              }
4665              if (io_hide_zero == 1 && value > 0) {
4666                  let id_string = "#io_acc_desc_" + new_key;
4667                  let formatted_price = simpleCart.toCurrency(value);
4668                  if (jQuery("#io_acc_" + new_key + " .io_acc_price").length > 0) {
4669                      jQuery("#io_acc_" + new_key + " .io_acc_price").html(formatted_price);
4670                  } else {
4671                      let price_display = '<span class="io_acc_price"> ' + formatted_price + ' </span>';
4672                      jQuery(id_string).after(price_display);
4673                  }
4674              } else if (io_hide_zero == 0) {
4675                  let id_string = "#io_acc_desc_" + new_key;
4676                  let formatted_price = simpleCart.toCurrency(value);
4677                  if (jQuery("#io_acc_" + new_key + " .io_acc_price").length > 0) {
4678                      jQuery("#io_acc_" + new_key + " .io_acc_price").html(formatted_price);
4679                  } else {
4680                      let price_display = '<span class="io_acc_price"> ' + formatted_price + ' </span>';
4681                      jQuery(id_string).after(price_display);
4682                  }
4683              }
4684          }
4685      }
4686  }
4687  function make_live_price_editable_time(times, delivery_method=null) {
4688    if(!delivery_method) delivery_method = getCookie("io_delivery_method");
4689    let ele_text = "";
4690    if(times[0]) ele_text = "on " + times[0] + " ";
4691    if(times[2] === 0) times[2] = 1;
4692    if(io_hidetimes!="on" && !isNaN(times[2])) ele_text += "for "+times[2]+" hours ";
4693    if(delivery_method) ele_text += "for " + delivery_method + ". ";
4694    ele_text += '<span style="cursor:pointer; color:blue; text-decoration:underline;" onclick=checkAvailDateClick()>edit</span>';
4695    return ele_text;
4696  }
4697  function checkAvailDateClick(){
4698    cartShow();
4699    /* expand the date picker */
4700    setTimeout(calSetDateRange,100);
4701  }
4702  function checkAvailPageOnly(){
4703    checkAvailFilter();
4704    if(addressCookiesSet() && io_distance_charge){
4705      runDeliveryCall(true);
4706    }
4707  }
4708  function getAccIDforPrice(){
4709    let accessory_arr = jQuery(".io_acc_li").toArray();
4710    let acc_rental_id_str = "";
4711    for(let current_accessory = 0; current_accessory < accessory_arr.length; current_accessory++){
4712      let required_tag = jQuery(accessory_arr[current_accessory]).find(".item_required");
4713      if(required_tag.length > 0){
4714        if(required_tag[0].innerText == 0){
4715          acc_rental_id_str += jQuery(accessory_arr[current_accessory]).find(".item_rentalid")[0].innerText +"|";
4716        }
4717      }
4718    }
4719    return acc_rental_id_str;
4720  }
4721  function getUpsellIDforPrice(){
4722    let upsell_arr = jQuery(".page-carousel-rid").toArray();
4723    let upsell_rental_id_str = "";
4724    for(let current_upsell = 0; current_upsell < upsell_arr.length; current_upsell++){
4725      upsell_rental_id_str +=upsell_arr[current_upsell].innerText+"|";
4726    }
4727    return upsell_rental_id_str;
4728  }
4729  function displayUpsellPrices(data){
4730    if(data.price){
4731      let upsell_prices = data.price;
4732      for (const [key, value] of Object.entries(upsell_prices)) {
4733        if(io_hide_zero == 1 && value > 0){
4734          let id_string = "#rid"+ key;
4735          let formatted_price = simpleCart.toCurrency(value);
4736          let price_display ='<span class="page-carousel-price"> '+formatted_price+' </span>';
4737          jQuery(id_string).after(price_display);
4738        }else if(io_hide_zero == 0){
4739          let id_string = "#rid"+ key;
4740          let formatted_price = simpleCart.toCurrency(value);
4741          let price_display ='<span class="page-carousel-price"> '+formatted_price+' </span>';
4742          jQuery(id_string).after(price_display);
4743        }
4744      }
4745      pageFlickityRefresh();
4746    }
4747  }
4748  /*</editor-fold>*/
4749
4750  /*<editor-fold defaultstate="collapsed" desc="Check Avail - Cart">*/
4751  function checkAvailCartOnly(skip_timer=false){
4752    checkAvailCart();
4753    checkAvailCartTimeslots();
4754  }
4755
4756  function checkAvailCartTimeslots(){
4757    let rental_names = "";
4758    let rental_ids = "";
4759    let cart_rental_names = "";
4760    let cart_rental_ids = "";
4761    let times = getAvailTimes();
4762    let start_date = times[0];
4763    let event_duration = times[2];
4764    let end_date = start_date;
4765    var event_start_time = getCookie("io_timeStart");
4766    simpleCart.each(function (item, x) {
4767      var timeslots_html = item.get('timeslots');
4768      if(typeof timeslots_html == "undefined") return;
4769      if(timeslots_html.length == 0) return;
4770      var cart_name = item.get("encoded");
4771      if(cart_name==null) {
4772        cart_name = encodeURIComponent(item.get("name"));
4773        cart_name = encodeURIComponent(decodeURIComponent(cart_name).replace(/[\u2032\u2019]+/ig,"'"));
4774      }
4775      rental_id = item.get("rentalid");
4776
4777      var timeslot_name = getTimeslotName(timeslots_html);
4778      var timeslot_sel_range = jQuery(".item-timeslots [name=\""+timeslot_name+"\"] option:selected").val();
4779      if(typeof timeslot_sel_range != "undefined"){
4780        /* timeslots */
4781        setTimeslotSelected(item, timeslot_name);
4782      }else{
4783        /*  timepickers */
4784        setTimePicker(item, timeslot_name);
4785        let start_timepicker = document.getElementsByName(timeslot_name.replace("io_timepicker_", "start_timeslot_"));
4786        let end_timepicker = document.getElementsByName(timeslot_name.replace("io_timepicker_", "end_timeslot_"));
4787        timeslot_sel_range = start_timepicker[start_timepicker.length-1].value;
4788        timeslot_sel_range += " - " + end_timepicker[end_timepicker.length-1].value;
4789      }
4790
4791      var timeslot_sel_arr = "";
4792      if(typeof timeslot_sel_range != "undefined"){
4793        var [start_time, end_time] = break_timeslot_sel_range(timeslot_sel_range);
4794        if(start_time && end_time){
4795          let newDate1 = convertDateStringtoDateObject(start_date, start_time);
4796          let newDate2 = convertDateStringtoDateObject(end_date, end_time);
4797          let time_duration = ((newDate2 - newDate1) / 3600) / 1000;
4798          let quantity = item.get("quantity");
4799          if(item.get("inputtype") == "Map"){
4800            quantity = 1
4801          }
4802          rental_names += cart_name + "-" + quantity+"|";
4803          rental_ids += rental_id+"-"+quantity+"-"+start_time+"-"+time_duration+"|";
4804          cart_rental_names = rental_names;
4805          cart_rental_ids = rental_ids;
4806        }
4807      }
4808    });
4809    if(rental_ids || rental_names){
4810      checkAvailCall(start_date,event_start_time,event_duration,rental_names,rental_ids,updateCartAvail,1,cart_rental_ids,cart_rental_names,1);
4811    }
4812    return true;
4813  }
4814
4815  function checkAvailCart(){
4816    let rental_names = "";
4817    let rental_ids = "";
4818    let cart_rental_names = "";
4819    let cart_rental_ids = "";
4820    simpleCart.each(function (item, x) {
4821      if(typeof item.get('timeslots') != "undefined"){
4822        if(item.get('timeslots').length > 0){
4823          return;
4824        }
4825      }
4826      var cart_name = item.get("encoded");
4827      if(cart_name==null){
4828        cart_name = encodeURIComponent(item.get("name"));
4829        cart_name = encodeURIComponent(decodeURIComponent(cart_name).replace(/[\u2032\u2019]+/ig,"'"));
4830      }
4831      let quantity = item.get("quantity");
4832      if(item.get("inputtype") == "Map"){
4833        quantity = 1
4834      }
4835      rental_names += cart_name + "-" + quantity + "|";
4836      cart_rental_names += cart_name + "-" + quantity + "|";
4837      var cart_id = item.get("rentalid");
4838      rental_ids += cart_id + "-" + quantity + "|";
4839      cart_rental_ids += cart_id + "-" + quantity + "|";
4840    });
4841    var times = getAvailTimes();
4842    let return_id = 0;
4843    if(rental_ids != ""){
4844      return_id = 1;
4845    }
4846    if(rental_ids != "" || rental_names != ""){
4847      return checkAvailCall(times[0],times[1],times[2],rental_names,rental_ids,updateCartAvail,1,cart_rental_ids,cart_rental_names,return_id);
4848    }
4849    return true;
4850  }
4851  function updateCartAvail(data){
4852    let use_id = data["return_id"]
4853    delete data["return_id"];
4854    if(use_id == 1){
4855      updateCartAvail_itemIDs(data)
4856    }else{
4857      updateCartAvail_itemNames(data);
4858    }
4859    console.log("cart update");
4860    if(addressCookiesSet() && io_distance_charge){
4861      runDeliveryCall(true);
4862    }
4863    /* simpleCart.trigger("update"); */
4864    simpleCart.update();
4865    /* jQuery("#avail").html(output); */
4866  }
4867
4868  function updateCartAvail_itemIDs(data){
4869    jQuery.each(data, function (rental_id, qty){
4870      simpleCart.each(function (item, x) {
4871        if(rental_id == item.get("rentalid")){
4872          if(io_hideQuantityAvail == "off"){
4873            if(qty>=9999 || item.get("inputtype") == "Map" || (item.get("giftcardvalue") && item.get("giftcardvalue").trim())){
4874              item.set("availability", "available");
4875            }else{
4876              item.set("availability", qty + " available");
4877            }
4878          }else if(io_hideQuantityAvail == "on"){
4879            if(qty<=0 || qty < item.get("quantity")){
4880              item.set("availability", "not available");
4881            }else{
4882              item.set("availability", "available");
4883            }
4884          }
4885          var vendorid = item.get("vendorid");
4886          if(vendorid && vendorid.trim()){
4887            item.set("availability", "availability must be verified");
4888          }
4889        }
4890        if (rental_id == "price") {
4891          var prices = qty;
4892          jQuery.each(prices, function (price_name, amt) {
4893            if(price_name == item.get("rentalid")){
4894              if (typeof amt == "string" || amt instanceof String){
4895                if(amt != "TBD"){
4896                  if(typeof amt == "string") amt = Number(amt.replace(",",""));
4897                }
4898              }
4899              item.set("price", amt);
4900            }
4901          });
4902        }
4903      });
4904    });
4905  }
4906
4907  function updateCartAvail_itemNames(data){
4908    jQuery.each(data, function (rental_name, qty) {
4909      rental_name = rental_name.replace(/[\u2032\u2019]+/ig,"'");
4910      simpleCart.each(function (item, x) {
4911        try{
4912          var cart_name = decodeURIComponent(item.get("encoded").replace(/[+]/gi, "%20"));
4913        }catch(e){cart_name=null}
4914        if(cart_name==null) cart_name = item.get("name")
4915        cart_name = cart_name.replace(/[\u2032\u2019]+/ig,"'");
4916        var i = cart_name.lastIndexOf(":");
4917        if(i>0 && cart_name.toUpperCase() != rental_name.toUpperCase() && rental_name!="price"){cart_name = cart_name.substring(i+1)}
4918        if (cart_name.toUpperCase() == rental_name.toUpperCase()) {
4919          if(qty>9999){
4920            item.set("availability", "available");
4921          }else{
4922            item.set("availability", qty + " available");
4923          }
4924        }
4925        if (rental_name == "price") {
4926          var prices = qty;
4927          jQuery.each(prices, function (price_name, amt) {
4928            price_name = price_name.replace(/[\u2032\u2019]+/ig,"'");
4929            let acc_name = "";
4930            let rental_name = "";
4931            var i = cart_name.lastIndexOf(":");
4932            if(i>0){
4933              rental_name = cart_name.substring(0, i);
4934              acc_name = cart_name.substring(i+1);
4935            }
4936            if (acc_name === price_name) {
4937              var rental_id = item.get("rentalid");
4938              if(rental_id != null){
4939                rid_arr = rental_id.split(":");
4940                /* ignore the main id for this */
4941                rental_id = rid_arr[rid_arr.length-1];
4942                if(jQuery("#io_acc_overrideprice_"+rental_id).first().text()>0){
4943                  amt = prices[acc_name];
4944                }else{
4945                  let item_price = Number(prices[rental_name].replace(",",""));
4946                  amt = Number(amt.replace(",","")) + item_price;
4947                  item.set("price", amt);
4948                  return;
4949                }
4950              }
4951              if(amt==null){
4952                amt = "0";
4953              }
4954              /* returned price is per unit */
4955              if(typeof amt == "string") amt = Number(amt.replace(",",""));
4956              item.set("price", amt);
4957            }else if(!rental_name && !acc_name){
4958              amt = Number(prices[cart_name].replace(",",""));
4959              item.set("price", amt);
4960            }
4961          });
4962        }
4963      });
4964    });
4965  }
4966  /*</editor-fold>*/
4967
4968  /*<editor-fold defaultstate="collapsed" desc="Upsell Carousels">*/
4969  function updateCartUpsell(data){
4970    let cart_carousel = jQuery(".cart-carousel");
4971    viewport = jQuery(".cart-carousel .flickity-viewport");
4972    if(viewport.length > 0){
4973      cart_carousel.flickity("destroy");
4974    }
4975    cart_carousel.empty();
4976    data.forEach(function(upsell){
4977      cell = createCartCarouselCell(upsell["image"], upsell["name"], upsell["page"]);
4978      cart_carousel.append(cell);
4979    });
4980    makeCarousel(cart_carousel);
4981    jQuery("#cart-carousel-container").show();
4982    setTimeout(cartFlickityRefresh, 500);
4983  }
4984
4985  function cartFlickityRefresh(){
4986    jQuery(".cart-carousel").flickity("resize");
4987  }
4988
4989  //IO-14031
4990  function isMobile()
4991  {
4992  // Modern detection
4993    if (navigator.userAgentData && navigator.userAgentData.mobile !== undefined) {
4994      return navigator.userAgentData.mobile;
4995    }
4996
4997  // Fallback for older browsers
4998    return /Mobi|Android|iPhone|iPad|iPod/i.test(navigator.userAgent) ||
4999           ('ontouchstart' in window && navigator.maxTouchPoints > 0);
5000  }
5001
5002  function makeCarousel(cart_carousel)
5003  {
5004    cart_carousel.flickity({
5005      wrapAround: true,
5006      draggable: isMobile(),
5007      cellAlign: 'left',
5008      //autoPlay: 3000,
5009      groupCells: true,
5010      resize: true
5011    });
5012    cart_carousel_set = true;
5013  }
5014
5015  function createCartCarouselCell(image, name, page){
5016    cell = '<div class="io_cart_carousel_cell"> <a href='+page+' class="cart-carousel-link"> <img class="cart-carousel-image" src='+image+'> <p class="cart-carousel-name"> '+name+' </p> </a> </div>';
5017    return cell;
5018  }
5019  /*</editor-fold>*/
5020
5021  /*<editor-fold defaultstate="collapsed" desc="Ajax Calls">*/
5022  function checkAvailCall(start_date,start_time,time_duration,rental_names,rental_ids,returnFunc,singleCart,cart_rental_ids,cart_rental_names,return_id,temp=0,delivery_method=null,price_only=0,custom_price_name="", skip_hidden_lead = 0) {
5023        /*
5024        IO-21459 If we have no duration set (event not set in cart), and we are doing the call for the page live
5025        price, and we have the setting on where we want to display this price even if the event date is not set:
5026
5027        We set the time_duration to 1 hour. This defaults the start date to January 1, 1970 with duration of
5028        1 hour in the lead meaning it will be available and we have the one hour price.
5029        */
5030    if((isNaN(time_duration) || time_duration===0) && price_only==1 && io_always_display_live_price == "on"){
5031      time_duration = 1;
5032      if(!start_date){
5033        start_date = getFormatteddate(new Date());
5034      }
5035      if(!start_time){
5036        start_time = getFormattedtime(new Date());
5037      }
5038    }else if((isNaN(time_duration) || time_duration===0) && price_only==0 && io_hidetimes === "on"){
5039      /* IO-22689 if they have times hidden, and happen to have the same default start and end time, we still want to do the call. */
5040      time_duration = 1;
5041    }else if(isNaN(time_duration) || time_duration===0){
5042      return;
5043    }
5044    url = "https://rental.software/quotes/check_availability_v2.php?callback=?";
5045    if(window.location.href.indexOf("localhost") > -1){
5046      //url = "http://localhost/bugs/quotes/check_availability_v2.php?callback=?";
5047      url = "http://localhost/io/bugs/quotes/check_availability_v2.php?callback=?";
5048      //url = "http://localhost/jbug/trunk/quotes/check_availability_v2.php?callback=?";
5049    }
5050    if(!delivery_method) delivery_method = getCookie("io_delivery_method");
5051    let address_data = {
5052      "address": getCookie("io_address"),
5053      "state": getCookie("io_state"),
5054      "city": getCookie("io_city"),
5055      "zip": getCookie("io_zip")
5056    };
5057    if(!ioHasMarketingConsent()){
5058      address_data = {"address":"", "state":"", "city":"", "zip":""};
5059    }
5060    url +=
5061            "&name=" + encodeURIComponent("Wild Bill's Casino Parties") +
5062            "&startdate=" + start_date +
5063            "&starttime=" + start_time +
5064            "&duration=" + time_duration +
5065            "&street=" + encodeURIComponent(address_data["address"]) +
5066            "&city=" + encodeURIComponent(address_data["city"]) +
5067            "&state=" + encodeURIComponent(address_data["state"]) +
5068            "&zip=" + encodeURIComponent(address_data["zip"]) +
5069            "&single_cart=" + singleCart +
5070            "&usecushion=1" +
5071            "&include_price=1" +
5072            "&showlocations=0" +
5073            "&rental_names=" + rental_names +
5074            "&rental_ids=" + rental_ids +
5075            "&cart_rental_names=" + cart_rental_names +
5076            "&cart_rental_ids=" + cart_rental_ids +
5077            "&return_id=" + return_id +
5078            "&delivery_method=" + delivery_method +
5079            "&temp=" + temp +
5080            "&skip_hidden_lead="+ skip_hidden_lead;
5081      if (custom_price_name)
5082      {
5083          ioCartLoaderIncrement();
5084          jQuery.getJSON(url, function (data)
5085          {
5086              try
5087              {
5088                  returnFunc(data, custom_price_name);
5089              }
5090              finally
5091              {
5092                  ioCartLoaderDecrement();
5093              }
5094          });
5095      }
5096      else
5097      {
5098          ioCartLoaderIncrement();
5099          jQuery.getJSON(url, function (data)
5100          {
5101              try
5102              {
5103                  returnFunc(data);
5104              }
5105              finally
5106              {
5107                  ioCartLoaderDecrement();
5108              }
5109          });
5110      }
5111  }
5112
5113  function getUpsellsCall(start_date,start_time,time_duration,rental_ids,returnFunc) {
5114    if(rental_ids.replace(/[|]/g,"").length==0){return;}
5115    url = "https://rental.software/quotes/in_cart_upsell.php?callback=?";
5116    if(window.location.href.indexOf("localhost") > -1){
5117      //url = "http://localhost/bugs/quotes/in_cart_upsell.php?callback=?"
5118      url = "http://localhost/io/bugs/quotes/in_cart_upsell.php?callback=?"
5119    }
5120    url +=
5121            "&name=" + encodeURIComponent("Wild Bill's Casino Parties") +
5122            "&startdate=" + start_date +
5123            "&starttime=" + start_time +
5124            "&duration=" + time_duration +
5125            "&usecushion=1" +
5126            "&include_price=1" +
5127            "&showlocations=0" +
5128            "&rental_ids=" + rental_ids;
5129    //IO-25557
5130    if(window.location.href.indexOf("dev.rental.software") > -1)//if it is a dev site, we need to send
5131    {
5132      let pattern = /(https:\/\/dev\.rental\.software\/[^\/]+\/)/;
5133      let matches = window.location.href.match(pattern);
5134      matches && matches.length > 0 ? url += "&site=" + matches[0]:0;
5135    }
5136    else
5137    {
5138      url += "&site=" + window.location.host;
5139    }
5140    jQuery.getJSON(url, returnFunc);
5141  }
5142  /*</editor-fold>*/
5143
5144  /*<editor-fold defaultstate="collapsed" desc="Customer Geolocation Functions">*/
5145  function setLocationInLocalStorage(city)
5146  {
5147      try
5148      {
5149          const location_data =
5150          {
5151              city: city,
5152              timestamp: Date.now()
5153          };
5154          localStorage.setItem(storage_key, JSON.stringify(location_data));
5155          return true;
5156      }
5157      catch (e)
5158      {
5159          console.warn('Failed to save location to localStorage:', e);
5160          return false;
5161      }
5162  }
5163
5164  function getLocationFromLocalStorage()
5165  {
5166      try
5167      {
5168          const location_data = localStorage.getItem(storage_key);
5169          if (location_data)
5170          {
5171              return JSON.parse(location_data);
5172          }
5173
5174      }
5175      catch (e)
5176      {
5177          console.warn('Failed to retrieve location from localStorage:', e);
5178      }
5179      return null;
5180  }
5181
5182  function displayLocation(city)
5183  {
5184      const location_element = jQuery('.io_geo_city');
5185      const container_element = jQuery('#io_customer_geolocation');
5186
5187      if (location_element.length && container_element.length)
5188      {
5189          location_element.text(`${city}`);
5190          container_element.show();
5191          return true;
5192      }
5193      return false;
5194  }
5195
5196  function getCityFromIO(returnFunc)
5197  {
5198    var url = "https://rental.software/include/geolocation_handler.php?callback=?";
5199    if(window.location.href.indexOf("localhost") > -1)
5200    {
5201      url = "http://localhost//features//include/geolocation_handler.php?callback=?";
5202    }
5203    url +=
5204        "&name=" + encodeURIComponent("Wild Bill's Casino Parties") +
5205        "&ip=" + encodeURIComponent(io_customer_ip);
5206
5207    jQuery.getJSON(url, returnFunc);
5208  }
5209
5210  function initializeGeolocation()
5211  {
5212      try
5213      {
5214      // Check local storage first
5215          const cached_location = getLocationFromLocalStorage();
5216          if (cached_location && cached_location.city)
5217          {
5218              if (displayLocation(cached_location.city))
5219              {
5220                  return;
5221              }
5222          }
5223
5224          // If no cached location, call the handler to get location
5225          getCityFromIO(function(location_data)
5226          {
5227              if (location_data && location_data.city && !location_data.error)
5228              {
5229                  // Display and store the location
5230                  if (displayLocation(location_data.city))
5231                  {
5232                      setLocationInLocalStorage(location_data.city);
5233                  }
5234              }
5235              else
5236              {
5237                  console.warn('Failed to get location:', location_data ? location_data.error : 'Unknown error');
5238              }
5239          });
5240      } 
5241      catch (error)
5242      {
5243          console.error('Geolocation initialization failed:', error);
5244      }
5245  }
5246  /*</editor-fold>*/
5247
5248  /*<editor-fold defaultstate="collapsed" desc="Loading Animation Helpers">*/
5249
5250  /**
5251  * Toggles the visibility of the cart loading overlay.
5252  *
5253  * @param {boolean} show - A boolean value to determine whether to show or hide the overlay.
5254  *                         If true, the overlay becomes visible; if false, it is hidden.
5255  * @return {void} This function does not return a value.
5256  */
5257  function ioCartShowOverlay(show)
5258  {
5259      try
5260      {
5261          var overlay = document.getElementById('ioCartLoadingOverlay');
5262          if (!overlay) return;
5263          if (show)
5264          {
5265              overlay.style.display = 'flex';
5266              overlay.setAttribute('aria-hidden', 'false');
5267          }
5268          else
5269          {
5270              overlay.style.display = 'none';
5271              overlay.setAttribute('aria-hidden', 'true');
5272          }
5273      }
5274      catch (e)
5275      {}
5276  }
5277
5278  /**
5279   * Activates the cart loader by setting the loading state to active, initializing the loading count,
5280   * and displaying the overlay. Includes a fallback to deactivate the loader if no response is received
5281   * within a specified timeout period.
5282   *
5283   * @return {void} This method does not return a value.
5284   */
5285  function ioCartLoaderActivate()
5286  {
5287      io_cart_loading_active = true;
5288      io_cart_loading_count = 0;
5289      ioCartShowOverlay(true);
5290
5291      //fallback in case the availability call doesn't come back
5292      if (io_cart_loading_fallback_timer) clearTimeout(io_cart_loading_fallback_timer);
5293      io_cart_loading_fallback_timer = setTimeout(function () {
5294          if (io_cart_loading_active) {
5295              io_cart_loading_active = false;
5296              io_cart_loading_count = 0;
5297              ioCartShowOverlay(false);
5298          }
5299      }, 15000);
5300  }
5301
5302  /**
5303   * Increments the count of active cart loading operations and ensures the cart overlay is displayed.
5304   *
5305   * This method increases the `io_cart_loading_count` if the `io_cart_loading_active` flag is set to true.
5306   * It also calls the `ioCartShowOverlay` function with a true value to show the overlay.
5307   *
5308   * @return {void} This function does not return any value.
5309   */
5310  function ioCartLoaderIncrement()
5311  {
5312      if (io_cart_loading_active)
5313      {
5314          io_cart_loading_count++;
5315          ioCartShowOverlay(true);
5316      }
5317  }
5318
5319  /**
5320   * Decrements the `io_cart_loading_count` if `io_cart_loading_active` is true.
5321   * If the count reaches zero, it deactivates the loader, removes the overlay,
5322   * and clears the fallback timer
5323   */
5324  function ioCartLoaderDecrement()
5325  {
5326      if (io_cart_loading_active)
5327      {
5328          io_cart_loading_count = Math.max(0, io_cart_loading_count - 1);
5329
5330          if (io_cart_loading_count === 0)
5331          {
5332              io_cart_loading_active = false;
5333              ioCartShowOverlay(false);
5334
5335              if (io_cart_loading_fallback_timer)
5336              {
5337                  clearTimeout(io_cart_loading_fallback_timer);
5338                  io_cart_loading_fallback_timer = null;
5339              }
5340          }
5341      }
5342  }
5343
5344  /*</editor-fold>*/
5345
5346</script>
5346
5347<!-- Start Shortcoder content --><div class="address_entry elementor-widget-text-editor">
5348  <table>
5349    <tr>
5350      <td> <label for="address" id="io_cdl_address_label" style="display: table-cell"> Street Address </label> </td>
5351      <td> <input id="io_cd_address" style="display: table-cell" name="address" type="text"></input> </td>
5352    </tr>
5353    <tr>
5354      <td> <label for="city" id="io_cdl_city_label" style="display: table-cell"> City </label> </td>
5355      <td> <input id="io_cd_city" style="display: table-cell" name="city" type="text"></input> </td>
5356    </tr>
5357    <tr id="us-state-select">
5358      <td> <label for="state" id="io_cdl_state_label" style="display: table-cell"> State </label> </td>
5359      <td> <select name="state" id="io_cd_state" style="display: table-cell" class="input-mini">
5360        <option value=""></option>
5361        <option value="AK">AK</option>
5362        <option value="AL">AL</option>
5363        <option value="AR">AR</option>
5364        <option value="AZ">AZ</option>
5365        <option value="CA">CA</option>
5366        <option value="CO">CO</option>
5367        <option value="CT">CT</option>
5368        <option value="DC">DC</option>
5369        <option value="DE">DE</option>
5370        <option value="FL">FL</option>
5371        <option value="GA">GA</option>
5372        <option value="HI">HI</option>
5373        <option value="IA">IA</option>
5374        <option value="ID">ID</option>
5375        <option value="IL">IL</option>
5376        <option value="IN">IN</option>
5377        <option value="KS">KS</option>
5378        <option value="KY">KY</option>
5379        <option value="LA">LA</option>
5380        <option value="MA">MA</option>
5381        <option value="MD">MD</option>
5382        <option value="ME">ME</option>
5383        <option value="MI">MI</option>
5384        <option value="MN">MN</option>
5385        <option value="MO">MO</option>
5386        <option value="MS">MS</option>
5387        <option value="MT">MT</option>
5388        <option value="NC">NC</option>
5389        <option value="ND">ND</option>
5390        <option value="NE">NE</option>
5391        <option value="NH">NH</option>
5392        <option value="NJ">NJ</option>
5393        <option value="NM">NM</option>
5394        <option value="NV">NV</option>
5395        <option value="NY">NY</option>
5396        <option value="OH">OH</option>
5397        <option value="OK">OK</option>
5398        <option value="OR">OR</option>
5399        <option value="PA">PA</option>
5400        <option value="RI">RI</option>
5401        <option value="SC">SC</option>
5402        <option value="SD">SD</option>
5403        <option value="TN">TN</option>
5404        <option value="TX">TX</option>
5405        <option value="UT">UT</option>
5406        <option value="VA">VA</option>
5407        <option value="VT">VT</option>
5408        <option value="WA">WA</option>
5409        <option value="WI">WI</option>
5410        <option value="WV">WV</option>
5411        <option value="WY">WY</option>
5412      </select>
5413      </td>
5414    </tr>
5415    <tr>
5416      <td> <label for="zip" id="io_cdl_zip_label" style="display: table-cell"> Zip Code </label> </td>
5417      <td> <input id="io_cd_zip" style="display: table-cell" name="zip" type="text"></input> </td>
5418    </tr>
5419  </table>
5420  <a class="elementor-button elementor-size-sm io_button"
5421     id="address_entry_submit"
5422     href="javascript:;"> Save Address
5423  </a>
5424  <div id="delivery_charge_info_box">
5425    <hr>
5426    <h3 id="info_box_header"> </h3>
5427    <p id="info_box_information"> </p>
5428    <a href="javascript:;" onClick="closeAddressEntry()" class="delivery_info_continue elementor-button elementor-size-sm io_button">Continue Shopping</a>
5429  </div>
5430</div>
5431<script>
5432  /* for checking delivery */
5433  function runDeliveryCall(cart_only = false){
5434    let address_fields = jQuery("[id^='io_cd_']");
5435    let address_data = {
5436      "address": getCookie("io_address"),
5437      "state": getCookie("io_state"),
5438      "city": getCookie("io_city"),
5439      "zip": getCookie("io_zip")
5440    };
5441
5442    let times = getAvailTimes();
5443
5444    let start_date = times[0];
5445    let end_date = start_date;
5446    let start_time = times[1];
5447    let duration = times[2];
5448
5449    let rental_ids = "";
5450    simpleCart.each(function (item, x) {
5451      if(typeof item.get('timeslots') != "undefined"){
5452        if(item.get('timeslots').length > 0){
5453        var timeslots_html = item.get('timeslots');
5454        var rental_id = item.get('rentalid');
5455        if(typeof timeslots_html == "undefined") return;
5456        if(timeslots_html.length == 0) return;
5457
5458        var timeslot_name = getTimeslotName(timeslots_html);
5459        var timeslot_sel_range = jQuery(".item-timeslots [name=\""+timeslot_name+"\"] option:selected").val();
5460        if(typeof timeslot_sel_range != "undefined"){
5461          /* timeslots */
5462          setTimeslotSelected(item, timeslot_name);
5463        }else{
5464          /*  timepickers */
5465          setTimePicker(item, timeslot_name);//todo?
5466          let start_timepicker = document.getElementsByName(timeslot_name.replace("io_timepicker_", "start_timeslot_"));
5467          let end_timepicker = document.getElementsByName(timeslot_name.replace("io_timepicker_", "end_timeslot_"));
5468          timeslot_sel_range = start_timepicker[start_timepicker.length-1].value;
5469          timeslot_sel_range += " - " + end_timepicker[end_timepicker.length-1].value;
5470        }
5471
5472        var timeslot_sel_arr = "";
5473        if(typeof timeslot_sel_range != "undefined"){
5474          timeslot_sel_arr = timeslot_sel_range.split(" - ");
5475          var timeslot_start_time = timeslot_sel_arr[0].replace("am"," am").replace("pm"," pm").replace("  "," ");
5476          var timeslot_end_time = timeslot_sel_arr[1].replace("am"," am").replace("pm"," pm").replace("  "," ");
5477          if(timeslot_start_time && timeslot_end_time){
5478            let newDate1 = convertDateStringtoDateObject(start_date, timeslot_start_time);
5479            let newDate2 = convertDateStringtoDateObject(end_date, timeslot_end_time);
5480            let timeslot_duration = ((newDate2 - newDate1) / 3600) / 1000;
5481            rental_ids += rental_id+"-"+item.get("quantity")+"-"+timeslot_start_time+"-"+timeslot_duration+"|";
5482          }
5483        }
5484      }
5485    }
5486  else{
5487    var cart_id = item.get("rentalid");
5488    rental_ids += cart_id + "-" + item.get("quantity") + "|";
5489  }
5490  });
5491
5492  address_fields.each(function() {
5493    let field = this.id.split("_")[2];
5494    value = this.value;
5495    if(!value && !address_data[field]){
5496      jQuery(this).addClass("invalid_address_field")
5497    }
5498    else if(value){
5499      jQuery(this).removeClass("invalid_address_field")
5500      address_data[field] = this.value;
5501    }
5502  });
5503  if(jQuery(".invalid_address_field").length > 0){
5504    return;
5505  }
5506    let delivery_method = ""
5507    if(io_default_delivery_method)
5508    {
5509      delivery_method = io_default_delivery_method;
5510    }
5511    else if(getCookie("io_delivery_method"))
5512    {
5513      delivery_method = getCookie("io_delivery_method");
5514    }
5515
5516
5517  setCookie("io_address", address_data["address"], 14);
5518  setCookie("io_city", address_data["city"], 14);
5519  setCookie("io_state", address_data["state"], 14);
5520  setCookie("io_zip", address_data["zip"], 14);
5521
5522  cart_total = simpleCart.total();
5523  if(cart_total === "TBD") cart_total = 0;
5524  url = "https://rental.software/quotes/get_delivery_info.php?callback=?";
5525  if(window.location.href.indexOf("localhost") > -1){
5526    //url = "http://localhost/bugs/quotes/get_delivery_info.php?callback=?";
5527    url = "http://localhost/io/bugs/quotes/get_delivery_info.php?callback=?";
5528  }
5529  url +=
5530          "&name=" + encodeURIComponent("Wild Bill's Casino Parties") +
5531          "&rental_ids=" + rental_ids +
5532          "&street=" + encodeURIComponent(address_data["address"]) +
5533          "&city=" + encodeURIComponent(address_data["city"]) +
5534          "&state=" + encodeURIComponent(address_data["state"]) +
5535          "&zip=" + encodeURIComponent(address_data["zip"]) +
5536          "&startdate=" + start_date +
5537          "&starttime=" + start_time +
5538          "&duration=" + duration +
5539          "&delivery_method=" + encodeURIComponent(delivery_method) +
5540          "&total=" + cart_total +
5541          "&cart_only=" + cart_only;
5542  jQuery.getJSON(url, function(data){
5543    if(data["delivery_restrict"] === 1){
5544      data["charge"] = 0;
5545    }
5546    handleDeliveryInfo(data, cart_only);
5547  });
5548  }
5549
5550  function handleDeliveryInfo(data, cart_only = false){
5551    jQuery("#deliverSubtotalContainer").show();
5552    jQuery("#checkDeliveryMessage").hide();
5553    let info_box = jQuery("#delivery_charge_info_box");
5554    if(data["delivery_restrict"] == 1){
5555      jQuery("#info_box_header").text("Sorry...");
5556      jQuery("#info_box_information").text(data["error"])
5557      setDeliverySubtotal(data["charge"], true)
5558    }
5559    else{
5560      setDeliverySubtotal(data["charge"])
5561      jQuery("#info_box_header").text("Success!");
5562      if(data["charge"] > 0){
5563        jQuery("#info_box_information").html("We are able to deliver to your location with a " + simpleCart.toCurrency(data["charge"]) +" fee!");
5564      }
5565      else{
5566        jQuery("#info_box_information").html("We are able to deliver to your location with no charge!");
5567      }
5568    }
5569    if(simpleCart.items().length == 0 && cart_only){
5570      jQuery("#info_box_header").text("Items Required.");
5571      jQuery("#info_box_information").html("There needs to be items in your cart to check for delivery fees. But we will save the address information so you don't have to enter it again!")
5572    }
5573    info_box.show();
5574    jQuery.fancybox.update(jQuery(".address_entry"));
5575  }
5576  function showAddressEntry(cart_only=false){
5577    cartHide();
5578    jQuery(".invalid_address_field").removeClass("invalid_address_field")
5579    jQuery("#delivery_charge_info_box").hide();
5580    jQuery("#io_cd_address").val(getCookie("io_address"));
5581    jQuery("#io_cd_state").val(getCookie("io_state"));
5582    jQuery("#io_cd_city").val(getCookie("io_city"));
5583    jQuery("#io_cd_zip").val(getCookie("io_zip"));
5584    if(!cart_only){
5585      jQuery("#address_entry_submit").on("click", null, function(){ runDeliveryCall(); });
5586    } else{
5587      jQuery("#address_entry_submit").on("click", null, function(){ runDeliveryCall(cart_only); });
5588    }
5589    jQuery.fancybox.open(jQuery(".address_entry"));
5590  }
5591
5592  function closeAddressEntry(){
5593    jQuery.fancybox.close();
5594  }
5595
5596  function setDeliverySubtotal(amount, unavailable=false){
5597    if(unavailable){
5598      jQuery("#deliverySubtotal").html("Unavailable");
5599    } else{
5600      jQuery("#deliverySubtotal").html(simpleCart.toCurrency(amount));
5601    }
5602  }
5603
5604  function addressCookiesSet(){
5605    if(getCookie("address") && getCookie("state") && getCookie("city") && getCookie("zip")){
5606      return true;
5607    } else{
5608      return false
5609    }
5610  }
5611</script>
5611<!-- End Shortcoder content -->
5612<!-- Start Shortcoder content -->
5612<script>
5613  let map;
5614  let geocoder;
5615  let item_id_map;
5616  let drawingManager;
5617  let drawingListener;
5618
5619  let polygons = new Array();
5620
5621  let polyline_markers = new Array();
5622  let polylines = new Array();
5623  let previous_marker;
5624  current_polyline = undefined;
5625  let previous_map_height = "";
5626
5627  function initMap() {
5628    map = new google.maps.Map(document.getElementById("map_container"), {
5629      center: { lat: -34.397, lng: 150.644 },
5630      zoom: 8,
5631      mapTypeId: "hybrid",
5632      disableDefaultUI: true,
5633      tilt: 0
5634    });
5635    drawingManager = new google.maps.drawing.DrawingManager({
5636      drawingControl: true,
5637      drawingControlOptions: {
5638        position: google.maps.ControlPosition.TOP_CENTER,
5639        drawingModes: [
5640          google.maps.drawing.OverlayType.POLYGON,
5641        ],
5642      }
5643    });
5644
5645    geocoder = new google.maps.Geocoder();
5646  }
5647
5648  function io_geocode(){
5649    let prefix = "#io_mc_"
5650    let request = ""
5651    let address_value = "";
5652    if(jQuery(prefix+"address").length) {
5653      address_value = jQuery(prefix+"address").val();
5654      if(address_value) setCookie("address", jQuery("#io_mc_address").val(), 14);
5655    }
5656    let city_value = "";
5657    if(jQuery(prefix+"city").length){
5658      city_value = jQuery(prefix+"city").val();
5659      if(city_value) setCookie("city", jQuery("#io_mc_city").val(), 14);
5660    }
5661    let state_value = "";
5662    if(jQuery(prefix+"state").length){
5663      state_value = jQuery(prefix+"state").val();
5664      if(state_value) setCookie("state", jQuery("#io_mc_state").val(), 14);
5665    }
5666    let zip_value = "";
5667    if(jQuery(prefix+"zip").length){
5668      zip_value = jQuery(prefix+"zip").val();
5669      if(zip_value) setCookie("zip", jQuery("#io_mc_zip").val(), 14);
5670    }
5671
5672    request = address_value + " " + city_value + " " + state_value + " " + zip_value;
5673    if(request){
5674      geocoder.geocode({address:request}).then((result) => {
5675        const { results } = result;
5676        map.setCenter(results[0].geometry.location);
5677        map.setZoom(24);
5678        return results;
5679      });
5680
5681    }
5682
5683    if(!addressProvided()) {
5684      jQuery("#io_map_address_entry").attr("open", "open");
5685    }else{
5686      jQuery("#io_map_address_entry").removeAttr("open");
5687    }
5688  }
5689
5690  function openMap(element){
5691    cartHide()
5692    io_map_clear()
5693    let unit = "meters"
5694    if(country === "US") unit = "feet"
5695    polygons = new Array();
5696    polyline_marker_sets = new Array();
5697    polylines = new Array();
5698    previous_marker = undefined;
5699    current_polyline = undefined;
5700
5701    jQuery("#io_mc_address").val(getCookie("address"));
5702    jQuery("#io_mc_state").val(getCookie("state"));
5703    jQuery("#io_mc_city").val(getCookie("city"));
5704    jQuery("#io_mc_zip").val(getCookie("zip"));
5705    io_geocode();
5706
5707    google.maps.event.removeListener(drawingListener);
5708
5709    if(element.id == "calcPriceOpenMap"){
5710      item_id_map = jQuery(".io_product_infobox .item_rentalid").text();
5711      if(jQuery(".io_product_infobox .item_qtytype").text() == "Area"){
5712        setMapTools_Area(unit, true)
5713      }else if(jQuery(".io_product_infobox .item_qtytype").text() == "Perimeter"){
5714        setMapTools_Perimeter(unit, true)
5715      }
5716    }
5717    else{
5718      item_id_map = jQuery(element).parent().parent().find(".item-rentalid").text();
5719      if(jQuery(element).parent().parent().find(".item-qtytype").text() == "Area"){
5720        setMapTools_Area(unit)
5721      }else if(jQuery(element).parent().parent().find(".item-qtytype").text() == "Perimeter"){
5722        setMapTools_Perimeter(unit)
5723      }
5724    }
5725  }
5726
5727  function addressProvided(){
5728    if(jQuery("#io_mc_address").val() && jQuery("#io_mc_state").val() &&
5729            jQuery("#io_mc_city").val() && jQuery("#io_mc_zip").val() ){
5730      return true;
5731    }
5732    return false;
5733  }
5734
5735  function setMapTools_Area(unit, item_page=false){
5736    jQuery.fancybox.open(jQuery(".map_fancybox"));
5737    drawingManager.setOptions({
5738      drawingControlOptions: {
5739        drawingModes: [google.maps.drawing.OverlayType.POLYGON]
5740      },
5741      drawingMode: google.maps.drawing.OverlayType.POLYGON,
5742      polygonOptions: {
5743        fillColor: "#0191fc",
5744        strokeColor: "#0113fc"
5745      },
5746    });
5747    let units = "meters"
5748    if(country === "US") units = "feet"
5749
5750    jQuery("#io_measurement_input_label").text("Approximate area in "+units+": ");
5751    jQuery("#io_map_manual_input").off("click");
5752    jQuery("#io_map_manual_input").on("click", function(){manual_calc_price("Area", item_page)});
5753    jQuery("#io_perimeter_options_container").hide();
5754    jQuery("#io_map_new_line_container").hide();
5755    jQuery("#io_map_instructions").html("Use the map below to take measurements by clicking on each corner of the area you want to measure. <span id=\"io_map_additional_instructions\">You can draw multiple polygons to include multiple separate surfaces in the total area. Press Clear to remove all polygons and start again. Alternatively if you know the approximate area in "+units+" you can enter the measurement manually below. When finished press Done and the price of the item will be updated </span><i id=\"io_show_more_instructions\" onClick=\"show_more_instruct_click(this)\">(more)</i>")
5756
5757    drawingListener = google.maps.event.addListener(drawingManager, "polygoncomplete", function(polygon) {
5758      polygons.push(polygon);
5759      let convert_feet = 1;
5760      if(country === "US") convert_feet = 10.764;
5761      let approx_area = 0;
5762      polygons.forEach(function(polygon) {
5763        approx_area += google.maps.geometry.spherical.computeArea(polygon.getPath()) * convert_feet;
5764      });
5765      calcprice_approx_area(Math.round(approx_area));
5766    });
5767    drawingManager.setMap(map);
5768  }
5769
5770  function setMapTools_Perimeter(unit, item_page=false){
5771    jQuery.fancybox.open(jQuery(".map_fancybox"));
5772    drawingManager.setOptions({
5773      drawingControlOptions: {
5774        drawingModes: [google.maps.drawing.OverlayType.MARKER]
5775      },
5776      drawingMode: google.maps.drawing.OverlayType.MARKER
5777    });
5778    let height = jQuery("#perimeter_height").val();
5779    let units = "";
5780    if(height){
5781      units = "sq meters"
5782      if(country === "US") units = "sq feet"
5783      jQuery("#io_measurement_input_label").text("Approximate surface area in "+units+": ");
5784      jQuery("#io_map_instructions").html("Use the map below to take measurements by clicking on each corner of the area you want to measure. <span id=\"io_map_additional_instructions\">You can add additional lines by clicking Add New Line button to include more structures into the total. Press Clear to remove all lines and start again. Alternatively if you know the approximate surface area in "+units+" you can enter the measurement manually below. When finished press Done and the price of the item will be updated </span><i id=\"io_show_more_instructions\" onClick=\"show_more_instruct_click(this)\">(more)</i>")
5785
5786    }else{
5787      units = "meters"
5788      if(country === "US") units = "feet"
5789      jQuery("#io_measurement_input_label").text("Approximate perimeter in "+units+": ");
5790      jQuery("#io_map_instructions").html("Use the map below to take measurements by clicking on each corner of the area you want to measure. <span id=\"io_map_additional_instructions\">You can add additional lines by clicking Add New Line button to include more structures into the total. Press Clear to remove all lines and start again. Alternatively if you know the approximate perimeter in "+units+" you can enter the measurement manually below. When finished press Done and the price of the item will be updated </span><i id=\"io_show_more_instructions\" onClick=\"show_more_instruct_click(this)\">(more)</i>")
5791
5792    }
5793
5794    jQuery("#io_map_manual_input").off("click");
5795    jQuery("#io_map_manual_input").bind("click", function(){manual_calc_price("Perimeter", item_page)});
5796    jQuery("#perimeter_height").bind("change", function(){change_perimeter_instructions()});
5797    jQuery("#io_perimeter_options_container").show();
5798    jQuery("#io_map_clear_container").show();
5799    jQuery("#io_map_new_line_container").show();
5800
5801    current_polyline = new google.maps.Polyline({
5802      map: map,
5803      path: [],
5804      strokeColor: "#0113fc",
5805      strokeOpacity: 1.0,
5806      strokeWeight: 2
5807    })
5808    drawingListener = google.maps.event.addListener(drawingManager, "markercomplete", function(marker) {
5809      polyline_markers.push(marker)
5810      marker.setVisible(false);
5811      current_polyline.getPath().push(marker.getPosition())
5812      if(previous_marker){
5813        let convert_feet = 1;
5814        if(country === "US") convert_feet = 3.281;
5815        let approx_perimeter = 0;
5816        polylines.forEach(function(polyline) {
5817          if(convert_feet > 1) convert_feet = 10.764
5818          approx_perimeter += google.maps.geometry.spherical.computeArea(polyline.getPath()) * convert_feet;
5819        });
5820        approx_perimeter += google.maps.geometry.spherical.computeLength(current_polyline.getPath()) * convert_feet;
5821        calcprice_approx_perimeter(Math.round(approx_perimeter));
5822      }
5823      previous_marker = marker;
5824    });
5825
5826    jQuery("#perimeter_height_contianer").show();
5827
5828    drawingManager.setMap(map);
5829  }
5830
5831  function change_perimeter_instructions(){
5832    let height = jQuery("#perimeter_height").val();
5833    if(height){
5834      units = "sq meters"
5835      if(country === "US") units = "sq feet"
5836      jQuery("#io_measurement_input_label").text("Approximate surface area in "+units+": ");
5837      jQuery("#io_map_instructions").html("Use the map below to take measurements by clicking on each corner of the area you want to measure. <span id=\"io_map_additional_instructions\">You can add additional lines by clicking Add New Line button to include more structures into the total. Press Clear to remove all lines and start again. Alternatively if you know the approximate surface area in "+units+" you can enter the measurement manually below. When finished press Done and the price of the item will be updated </span><i id=\"io_show_more_instructions\" onClick=\"show_more_instruct_click(this)\">(more)</i>")
5838    }else {
5839      units = "meters"
5840      if(country === "US") units = "feet"
5841      jQuery("#io_measurement_input_label").text("Approximate perimeter in "+units+": ");
5842      jQuery("#io_map_instructions").html("Use the map below to take measurements by clicking on each corner of the area you want to measure. <span id=\"io_map_additional_instructions\">You can add additional lines by clicking Add New Line button to include more structures into the total. Press Clear to remove all lines and start again. Alternatively if you know the approximate perimeter in "+units+" you can enter the measurement manually below. When finished press Done and the price of the item will be updated </span><i id=\"io_show_more_instructions\" onClick=\"show_more_instruct_click(this)\">(more)</i>")
5843    }
5844  }
5845
5846  function manual_calc_price(method, item_page){
5847    let approx_measurement = parseInt(jQuery("#io_measurement_input").val());
5848    let units = "";
5849    if(approx_measurement){
5850      if(method == "Area"){
5851        units = "sq meters"
5852        if(country === "US") units = "sq feet"
5853      }else if(method == "Perimeter"){
5854        let height = jQuery("#perimeter_height").val();
5855        if(height){
5856          units = "sq meters"
5857          if(country === "US") units = "sq feet"
5858        }else{
5859          units = "meters"
5860          if(country === "US") units = "feet"
5861        }
5862      }
5863      simpleCart.items().forEach(function (item, index){
5864        if(item.get("rentalid") === item_id_map){
5865          item.set("units", units);
5866          item.set("quantity", approx_measurement);
5867        }
5868      });
5869
5870      simpleCart.update();
5871
5872      if(item_page || jQuery(".io_product_infobox .item_rentalid").text() == item_id_map) set_price_on_item_page(units, approx_measurement);
5873      if(!item_page) cartShow();
5874    }
5875    jQuery.fancybox.close();
5876  }
5877
5878  function calcprice_approx_area(approx_area){
5879    jQuery("#io_measurement_input").val(approx_area);
5880  }
5881
5882  function calcprice_approx_perimeter(approx_perimeter){
5883    let height = jQuery("#perimeter_height").val();
5884    if(height && height > 0) approx_perimeter *= parseInt(height);
5885
5886    jQuery("#io_measurement_input").val(approx_perimeter);
5887  }
5888
5889  function set_price_on_item_page(units, measurement){
5890    let measurement_price = document.querySelector(".io_product_measurement_price");
5891    if(measurement_price==undefined){
5892      var first_price = document.querySelector(".io_product_price_box");
5893      if(first_price != null){
5894        measurement_price = first_price.cloneNode(true);
5895        /* clear all classes */
5896        measurement_price.className = "";
5897        measurement_price.classList.add("io_product_price_box");
5898        measurement_price.classList.add("io_product_measurement_price");
5899        measurement_price.style.display = "grid";
5900        /* Make a hidden data span for when adding to cart */
5901        raw_measurement = document.createElement("span");
5902        raw_measurement.classList.add("io_measure_price_raw_measurement");
5903        raw_measurement.style.display = "none";
5904        raw_measurement.textContent = measurement;
5905        measurement_price.appendChild(raw_measurement);
5906        first_price.before(measurement_price);
5907      }
5908    }
5909    var price_1h = Number(jQuery(".io_product_price_1h_"+jQuery(".io_product_infobox .item_rentalid").text()).text().replace(/[^0-9.-]+/g,""));
5910    measurement_price.querySelector("p:nth-child(1)").innerHTML = simpleCart.toCurrency(price_1h*measurement);
5911    measurement_price.querySelector("p:nth-child(2)").innerHTML = "For approximately "+measurement+" "+units;
5912  }
5913
5914  function io_map_clear() {
5915    if(drawingManager.getDrawingMode() == "polygon"){
5916      drawingManager.setDrawingMode("polygon");
5917    }
5918
5919    if(polygons) polygons.forEach(function(polygon) {
5920      polygon.setMap(null);
5921    });
5922    if(current_polyline) current_polyline.setMap(null);
5923    if(polylines) polylines.forEach(function(polyline) {
5924      polyline.setMap(null);
5925    });
5926    if(polyline_markers) polyline_markers.forEach(function(marker) {
5927      marker.setMap(null);
5928    });
5929
5930    current_polyline = new google.maps.Polyline({
5931      map: map,
5932      path: [],
5933      strokeColor: "#0113fc",
5934      strokeOpacity: 1.0,
5935      strokeWeight: 2
5936    });
5937    polygons = new Array();
5938    polylines = new Array();
5939    polyline_markers = new Array();
5940    previous_marker = undefined;
5941  }
5942
5943  function io_map_new_line() {
5944    polylines.push(new google.maps.Polyline({
5945              map: map,
5946              path: current_polyline.getPath(),
5947              strokeColor: "#0113fc",
5948              strokeOpacity: 1.0,
5949              strokeWeight: 2
5950            })
5951    );
5952    previous_marker = undefined;
5953    current_polyline.setMap(null);
5954    current_polyline = new google.maps.Polyline({
5955      map: map,
5956      path: [],
5957      strokeColor: "#0113fc",
5958      strokeOpacity: 1.0,
5959      strokeWeight: 2
5960    });
5961  }
5962
5963  function show_more_instruct_click(show_more_button) {
5964    if(show_more_button.textContent == "(more)") {
5965      show_more_button.textContent = "(hide)";
5966      jQuery("#io_map_additional_instructions").show();
5967    }else if(show_more_button.textContent == "(hide)") {
5968      show_more_button.textContent = "(more)";
5969      jQuery("#io_map_additional_instructions").hide();
5970    }
5971  }
5972
5973  function perimeter_height_changed(){
5974    let current_map_height = jQuery("#perimeter_height").val();
5975    if(current_map_height && current_map_height > 0){
5976      if(jQuery("#io_measurement_input").val() && !previous_map_height){
5977        let measurement = jQuery("#io_measurement_input").val();
5978        jQuery("#io_measurement_input").val(measurement * current_map_height);
5979      }else if(jQuery("#io_measurement_input").val() && previous_map_height){
5980        let measurement = jQuery("#io_measurement_input").val();
5981        if(previous_map_height > 0){
5982          measurement = measurement / previous_map_height;
5983        }
5984        jQuery("#io_measurement_input").val(measurement * current_map_height);
5985      }
5986    }else if (!current_map_height || current_map_height == 0){
5987      if(jQuery("#io_measurement_input").val() && previous_map_height){
5988        let measurement = jQuery("#io_measurement_input").val();
5989        if(previous_map_height > 0){
5990          measurement = measurement / previous_map_height;
5991        }
5992        jQuery("#io_measurement_input").val(measurement);
5993      }
5994    }
5995    previous_map_height = current_map_height;
5996  }
5997
5998  window.initMap = initMap;
5999</script>
5999
6000<div class="map_fancybox">
6001  <div class="elementor-widget-text-editor">
6002    <div>
6003      <details id="io_map_address_entry">
6004        <summary style = "cursor:pointer">Enter Address Information (edit)</summary>
6005        <table style="margin-left: 10px">
6006          <tr>
6007            <td> <label for="address" id="io_mcl_address_label" style="display: table-cell"> Street Address </label> </td>
6008            <td> <input id="io_mc_address" style="display: table-cell" name="address" type="text"></input> </td>
6009          </tr>
6010          <tr>
6011            <td> <label for="city" id="io_mcl_city_label" style="display: table-cell"> City </label> </td>
6012            <td> <input id="io_mc_city" style="display: table-cell" name="city" type="text"></input> </td>
6013          </tr>
6014          <tr id="io_mc_us-state-select">
6015            <td> <label for="state" id="io_mcl_state_label" style="display: table-cell"> State </label> </td>
6016            <td> <select name="state" id="io_mc_state" style="display: table-cell" class="input-mini">
6017              <option value=""></option>
6018              <option value="AK">AK</option>
6019              <option value="AL">AL</option>
6020              <option value="AR">AR</option>
6021              <option value="AZ">AZ</option>
6022              <option value="CA">CA</option>
6023              <option value="CO">CO</option>
6024              <option value="CT">CT</option>
6025              <option value="DC">DC</option>
6026              <option value="DE">DE</option>
6027              <option value="FL">FL</option>
6028              <option value="GA">GA</option>
6029              <option value="HI">HI</option>
6030              <option value="IA">IA</option>
6031              <option value="ID">ID</option>
6032              <option value="IL">IL</option>
6033              <option value="IN">IN</option>
6034              <option value="KS">KS</option>
6035              <option value="KY">KY</option>
6036              <option value="LA">LA</option>
6037              <option value="MA">MA</option>
6038              <option value="MD">MD</option>
6039              <option value="ME">ME</option>
6040              <option value="MI">MI</option>
6041              <option value="MN">MN</option>
6042              <option value="MO">MO</option>
6043              <option value="MS">MS</option>
6044              <option value="MT">MT</option>
6045              <option value="NC">NC</option>
6046              <option value="ND">ND</option>
6047              <option value="NE">NE</option>
6048              <option value="NH">NH</option>
6049              <option value="NJ">NJ</option>
6050              <option value="NM">NM</option>
6051              <option value="NV">NV</option>
6052              <option value="NY">NY</option>
6053              <option value="OH">OH</option>
6054              <option value="OK">OK</option>
6055              <option value="OR">OR</option>
6056              <option value="PA">PA</option>
6057              <option value="RI">RI</option>
6058              <option value="SC">SC</option>
6059              <option value="SD">SD</option>
6060              <option value="TN">TN</option>
6061              <option value="TX">TX</option>
6062              <option value="UT">UT</option>
6063              <option value="VA">VA</option>
6064              <option value="VT">VT</option>
6065              <option value="WA">WA</option>
6066              <option value="WI">WI</option>
6067              <option value="WV">WV</option>
6068              <option value="WY">WY</option>
6069            </select>
6070            </td>
6071          </tr>
6072          <tr>
6073            <td> <label for="zip" id="io_mcl_zip_label" style="display: table-cell"> Zip Code </label> </td>
6074            <td> <input id="io_mc_zip" style="display: table-cell" name="zip" type="text"></input> </td>
6075          </tr>
6076        </table>
6077        <a class="elementor-button elementor-size-sm io_button"
6078           id="map_geocode_submit"
6079           onClick="io_geocode()"
6080           href="javascript:;"> Locate
6081        </a>
6082      </details>
6083      <div id="perimeter_height_contianer">
6084        <p>If you are taking measurements for a structure such as a building or fence, please provide the height of the structure here. If height does not apply to the wash, for instance for a gutter wash, leave this field empty. <strong> Please note if you enter a value here after taking measurements, you will need to take measurements again. </strong></p>
6085        <label> Height of structure: </label>
6086        <input type="number" id="perimeter_height" onChange="perimeter_height_changed()"/>
6087      </div>
6088      <div>
6089        <p id="io_map_instructions"></p>
6090      </div>
6091      <div id="io_measurement_input_container">
6092        <label id="io_measurement_input_label"> </label>
6093        <input type="number" id="io_measurement_input"/>
6094        <a class="elementor-button elementor-size-sm io_button"
6095           id="io_map_manual_input"
6096           href="javascript:;"> Done
6097        </a>
6098      </div>
6099      <div style="display: inline-flex">
6100        <div id="io_map_clear_container">
6101          <a class="elementor-button elementor-size-sm io_button"
6102             id="io_map_clear_btn"
6103             onClick="io_map_clear()"
6104             href="javascript:;"> Clear
6105          </a>
6106        </div>
6107        <div id="io_map_new_line_container" style="margin-left:5px">
6108          <a class="elementor-button elementor-size-sm io_button"
6109             id="io_map_new_line_btn"
6110             onClick="io_map_new_line()"
6111             href="javascript:;"> Add New Line
6112          </a>
6113        </div>
6114      </div>
6115    </div>
6116  </div>
6117  <br>
6118  <div id="map_container">
6119    
6119<script src="https://maps.googleapis.com/maps/api/js?key=AIzaSyDEuvvqefKaUABPvydm00SV8Fr8tQeGVcw&libraries=drawing&callback=initMap" defer></script>
6119
6120  </div>
6121</div><!-- End Shortcoder content -->
6122<!-- End Shortcoder content -->
6123        
6123<script>
6124        jQuery(".io_testimonials, #io_testimonials").each(function(){
6125           io_get_reviews(this);
6126        })
6127        setTimeout(function(){
6128            jQuery(".io_testimonials .w3-ul li p").each(function(){
6129                const container = jQuery(this).parent()
6130                const element = jQuery(this);
6131
6132                if (element[0].scrollHeight > container[0].clientHeight) {
6133
6134                    jQuery(this).parent().parent().append(create_read_more());
6135                }
6136            });
6137        }, 500);
6138
6139        function create_read_more(){
6140            let html = "<p class=\"io_review_readmore\" onClick=\"review_readmore_clicked(this)\">read more</p>"
6141            return html;
6142        }
6143
6144        function review_readmore_clicked(element){
6145            let review_li = jQuery(element).parent().find("li:eq(3)");
6146            new_height = jQuery(review_li).find("p").height() + 16;
6147            jQuery(review_li).height(new_height);
6148            jQuery(element).hide();
6149        }
6150
6151        function io_get_reviews(element){
6152        let io_un = "kczegar";
6153	  let io_loc = "42326";
6154	  let io_url1 = 'https://rental.software/testimonials_iframe.php?user=';
6155	  if (location.hostname === "localhost"){
6156	      io_url1 = 'http://localhost/io/bugs/testimonials_iframe.php?user=';
6157          //io_url1 = 'http://localhost/jbug/trunk/testimonials_iframe.php?user=';
6158        }
6159	  let io_url2 = '&location_id=';
6160	  let io_url3 = '&width=100%&number_of_reviews=10&show_average_rating=1&show_stars=1&show_date=&show_reviewer_name=1&orderby=time&iframe=0';
6161	  let io_url_c = io_url1 + io_un + io_url2 + io_loc + io_url3;
6162	  fetch(io_url_c, {
6163		method: 'get'
6164	}).then(
6165	  function(response){
6166		 return response.json();
6167		}
6168	).then(function(data) {
6169
6170
6171
6172	//let element = document.getElementById("io_testimonials");
6173	//DOM-built on purpose: literal markup in this inline script lands in the raw page
6174	//source and SEO crawlers read it as page content (IO-37932).
6175	element.textContent = "";
6176	let review_cnt=0;
6177	let rating_sum = 0;
6178	data.forEach((user) => {
6179				const { name, review, rating, time } = user;
6180				rating_sum += Number(rating);
6181				review_cnt++;
6182				let review_div = document.createElement("div");
6183				let review_list = document.createElement("ul");
6184				review_list.className = "w3-ul";
6185				let name_li = document.createElement("li");
6186				name_li.textContent = name;
6187				let rating_li = document.createElement("li");
6188				rating_li.textContent = rating + " ";
6189				let date_li = document.createElement("li");
6190				date_li.textContent = time;
6191				let review_li = document.createElement("li");
6192				let review_p = document.createElement("p");
6193				review_p.textContent = review;
6194				review_li.appendChild(review_p);
6195				let img_star = Math.round(parseFloat(rating));
6196				let star_img = document.createElement("img");
6197				star_img.className = "review_img";
6198				star_img.src = "https://rental.software/images/" + img_star + "star.png";
6199				rating_li.appendChild(star_img);
6200				review_list.appendChild(name_li);
6201				review_list.appendChild(rating_li);
6202				review_list.appendChild(date_li);
6203				review_list.appendChild(review_li);
6204				review_div.appendChild(review_list);
6205				element.appendChild(review_div);
6206	});
6207	let avg = (parseFloat(rating_sum)/parseFloat(review_cnt)).toFixed(1);
6208	let avg_img = Math.round(avg);
6209	let head = document.createElement("div");
6210	let head_h2 = document.createElement("h2");
6211	head_h2.textContent = "Avg Rating: " + avg;
6212	let head_img = document.createElement("img");
6213	head_img.className = "review_avg_img";
6214	head_img.src = "https://rental.software/images/" + avg_img + "star.png";
6215	head.appendChild(head_h2);
6216	head.appendChild(head_img);
6217	element.prepend(head);
6218	}).catch(function(err) {
6219		console.log(err);
6220	});
6221}
6222
6223	  </script>
6223				<style type="text/css">
6224					.searchio-live-search-results {
6225						opacity: 0;
6226						transition: opacity .25s ease-in-out;
6227						-moz-transition: opacity .25s ease-in-out;
6228						-webkit-transition: opacity .25s ease-in-out;
6229						height: 0;
6230						overflow: hidden;
6231						z-index: 9999995; /* Exceed searchIO Modal Search Form overlay. */
6232						position: absolute;
6233						display: none;
6234					}
6235
6236					.searchio-live-search-results-showing {
6237						display: block;
6238						opacity: 1;
6239						height: auto;
6240						overflow: auto;
6241					}
6242
6243					.searchio-live-search-no-results {
6244						padding: 3em 2em 0;
6245						text-align: center;
6246					}
6247
6248					.searchio-live-search-no-min-chars:after {
6249						content: "Continue typing";
6250						display: block;
6251						text-align: center;
6252						padding: 2em 2em 0;
6253					}
6254				</style>
6255						
6255<script>
6256			var _searchIO_LIVE_AJAX_SEARCH_BLOCKS = true;
6257			var _searchIO_LIVE_AJAX_SEARCH_ENGINE = 'default';
6258			var _searchIO_LIVE_AJAX_SEARCH_CONFIG = 'default';
6259			</script>
6259
6260						
6260<script>
6261				( () => {
6262					const lazyloadRunObserver = () => {
6263						const lazyloadBackgrounds = document.querySelectorAll( `.e-con.e-parent:not(.e-lazyloaded)` );
6264						const lazyloadBackgroundObserver = new IntersectionObserver( ( entries ) => {
6265							entries.forEach( ( entry ) => {
6266								if ( entry.isIntersecting ) {
6267									let lazyloadBackground = entry.target;
6268									if( lazyloadBackground ) {
6269										lazyloadBackground.classList.add( 'e-lazyloaded' );
6270									}
6271									lazyloadBackgroundObserver.unobserve( entry.target );
6272								}
6273							});
6274						}, { rootMargin: '200px 0px 200px 0px' } );
6275						lazyloadBackgrounds.forEach( ( lazyloadBackground ) => {
6276							lazyloadBackgroundObserver.observe( lazyloadBackground );
6277						} );
6278					};
6279					const events = [
6280						'DOMContentLoaded',
6281						'elementor/lazyload/observe',
6282					];
6283					events.forEach( ( event ) => {
6284						document.addEventListener( event, lazyloadRunObserver );
6285					} );
6286				} )();
6287			</script>
6287
6288			<link rel='stylesheet' id='flatpickr-css' href='https://wildbills.com/wp-content/plugins/elementor/assets/lib/flatpickr/flatpickr.min.css?ver=4.6.13' media='all' />
6289<script id="jquery-ui-core-js-before">
6290jQuery.uiBackCompat = true;
6291//# sourceURL=jquery-ui-core-js-before
6292</script>
vendor: 1 bytes, line 6292
6292
6293<script id="jquery-ui-core-js" src="https://wildbills.com/wp-includes/js/jquery/ui/core.min.js?ver=1.14.2"></script>
vendor: 1 bytes, line 6293
6293
6294<script id="jquery-ui-mouse-js" src="https://wildbills.com/wp-includes/js/jquery/ui/mouse.min.js?ver=1.14.2"></script>
vendor: 1 bytes, line 6294
6294
6295<script id="jquery-ui-resizable-js" src="https://wildbills.com/wp-includes/js/jquery/ui/resizable.min.js?ver=1.14.2"></script>
vendor: 1 bytes, line 6295
6295
6296<script id="jquery-ui-draggable-js" src="https://wildbills.com/wp-includes/js/jquery/ui/draggable.min.js?ver=1.14.2"></script>
vendor: 1 bytes, line 6296
6296
6297<script id="jquery-ui-controlgroup-js" src="https://wildbills.com/wp-includes/js/jquery/ui/controlgroup.min.js?ver=1.14.2"></script>
vendor: 1 bytes, line 6297
6297
6298<script id="jquery-ui-checkboxradio-js" src="https://wildbills.com/wp-includes/js/jquery/ui/checkboxradio.min.js?ver=1.14.2"></script>
vendor: 1 bytes, line 6298
6298
6299<script id="jquery-ui-button-js" src="https://wildbills.com/wp-includes/js/jquery/ui/button.min.js?ver=1.14.2"></script>
vendor: 1 bytes, line 6299
6299
6300<script id="jquery-ui-dialog-js" src="https://wildbills.com/wp-includes/js/jquery/ui/dialog.min.js?ver=1.14.2"></script>
vendor: 1 bytes, line 6300
6300
6301<script id="jquery-ui-datepicker-js" src="https://wildbills.com/wp-includes/js/jquery/ui/datepicker.min.js?ver=1.14.2"></script>
vendor: 1 bytes, line 6301
6301
6302<script id="jquery-ui-datepicker-js-after">
6303jQuery(function(jQuery){jQuery.datepicker.setDefaults({"closeText":"Close","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"],"nextText":"Next","prevText":"Previous","dayNames":["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],"dayNamesShort":["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],"dayNamesMin":["S","M","T","W","T","F","S"],"dateFormat":"MM d, yy","firstDay":1,"isRTL":false});});
6304//# sourceURL=jquery-ui-datepicker-js-after
6305</script>
vendor: 1 bytes, line 6305
6305
6306<script id="slick-carousel-js-js" src="https://cdnjs.cloudflare.com/ajax/libs/slick-carousel/1.8.1/slick.min.js?ver=1.8.1"></script>
vendor: 1 bytes, line 6306
6306
6307<script id="elementor-webpack-runtime-js" src="https://wildbills.com/wp-content/plugins/elementor/assets/js/webpack.runtime.min.js?ver=4.3.3"></script>
vendor: 1 bytes, line 6307
6307
6308<script id="elementor-frontend-modules-js" src="https://wildbills.com/wp-content/plugins/elementor/assets/js/frontend-modules.min.js?ver=4.3.3"></script>
vendor: 1 bytes, line 6308
6308
6309<script id="elementor-frontend-js-before">
6310var elementorFrontendConfig = {"environmentMode":{"edit":false,"wpPreview":false,"isScriptDebug":false},"i18n":{"shareOnFacebook":"Share on Facebook","shareOnX":"Share on X","pinIt":"Pin it","download":"Download","downloadImage":"Download image","fullscreen":"Fullscreen","zoom":"Zoom","share":"Share","playVideo":"Play Video","previous":"Previous","next":"Next","close":"Close","a11yCarouselPrevSlideMessage":"Previous slide","a11yCarouselNextSlideMessage":"Next slide","a11yCarouselFirstSlideMessage":"This is the first slide","a11yCarouselLastSlideMessage":"This is the last slide","a11yCarouselPaginationBulletMessage":"Go to slide"},"is_rtl":false,"breakpoints":{"xs":0,"sm":480,"md":768,"lg":1025,"xl":1440,"xxl":1600},"responsive":{"breakpoints":{"mobile":{"label":"Mobile Portrait","value":767,"default_value":767,"direction":"max","is_enabled":true},"mobile_extra":{"label":"Mobile Landscape","value":880,"default_value":880,"direction":"max","is_enabled":false},"tablet":{"label":"Tablet Portrait","value":1024,"default_value":1024,"direction":"max","is_enabled":true},"tablet_extra":{"label":"Tablet Landscape","value":1200,"default_value":1200,"direction":"max","is_enabled":false},"laptop":{"label":"Laptop","value":1366,"default_value":1366,"direction":"max","is_enabled":false},"widescreen":{"label":"Widescreen","value":2400,"default_value":2400,"direction":"min","is_enabled":false}},"hasCustomBreakpoints":false},"version":"4.3.3","is_static":false,"experimentalFeatures":{"additional_custom_breakpoints":true,"theme_builder_v2":true,"landing-pages":true,"import-export-customization":true,"e_pro_atomic_form":true,"e_pro_collection_loop":true},"urls":{"assets":"https:\/\/wildbills.com\/wp-content\/plugins\/elementor\/assets\/","ajaxurl":"https:\/\/wildbills.com\/wp-admin\/admin-ajax.php","uploadUrl":"https:\/\/wildbills.com\/wp-content\/uploads"},"nonces":{"floatingButtonsClickTracking":"debbd809c9","atomicFormsSendForm":"1ce95cf019"},"swiperClass":"swiper","settings":{"page":[],"editorPreferences":[]},"kit":{"body_background_background":"classic","active_breakpoints":["viewport_mobile","viewport_tablet"],"lightbox_enable_counter":"yes","lightbox_enable_fullscreen":"yes","lightbox_enable_zoom":"yes","lightbox_enable_share":"yes","lightbox_title_src":"title","lightbox_description_src":"description"},"post":{"id":22360,"title":"Event%20Quote%20Form%20%2F%20WildBills.com%20Portland%2C%20OR","excerpt":"","featuredImage":false}};
6311//# sourceURL=elementor-frontend-js-before
6312</script>
vendor: 1 bytes, line 6312
6312
6313<script id="elementor-frontend-js" src="https://wildbills.com/wp-content/plugins/elementor/assets/js/frontend.min.js?ver=4.3.3"></script>
vendor: 1 bytes, line 6313
6313
6314<script id="smartmenus-js" src="https://wildbills.com/wp-content/plugins/elementor-pro/assets/lib/smartmenus/jquery.smartmenus.min.js?ver=1.2.1"></script>
vendor: 1 bytes, line 6314
6314
6315<script id="swp-live-search-client-js-extra">
6316var searchio_live_search_params = [];
6317searchio_live_search_params = {"ajaxurl":"https:\/\/wildbills.com\/wp-admin\/admin-ajax.php","origin_id":22360,"config":{"default":{"engine":"default","input":{"delay":300,"min_chars":3},"results":{"position":"bottom","width":"auto","offset":{"x":0,"y":5}},"spinner":{"lines":12,"length":8,"width":3,"radius":8,"scale":1,"corners":1,"color":"#424242","fadeColor":"transparent","speed":1,"rotate":0,"animation":"searchio-spinner-line-fade-quick","direction":1,"zIndex":2000000000,"className":"spinner","top":"50%","left":"50%","shadow":"0 0 1px transparent","position":"absolute"}}},"msg_no_config_found":"No valid searchIO Live Search configuration found!","aria_instructions":"When autocomplete results are available use up and down arrows to review and enter to go to the desired page. Touch device users, explore by touch or with swipe gestures.","io_search_results_same_width":"1","io_search_results_width":"400","io_search_results_align":"right"};;
6318//# sourceURL=swp-live-search-client-js-extra
6319</script>
vendor: 1 bytes, line 6319
6319
6320<script id="swp-live-search-client-js" src="https://wildbills.com/wp-content/plugins/inflatableoffice/search_widget/assets/javascript/dist/script.js?ver=1.6.1"></script>
vendor: 1 bytes, line 6320
6320
6321<script id="hoverIntent-js" src="https://wildbills.com/wp-includes/js/hoverIntent.min.js?ver=1.10.2"></script>
vendor: 1 bytes, line 6321
6321
6322<script id="megamenu-js" src="https://wildbills.com/wp-content/plugins/megamenu/js/maxmegamenu.min.js?ver=3.10.8"></script>
vendor: 1 bytes, line 6322
6322
6323<script id="flatpickr-js" src="https://wildbills.com/wp-content/plugins/elementor/assets/lib/flatpickr/flatpickr.min.js?ver=4.6.13"></script>
vendor: 131 bytes, lines 6323-6324
6323
6324<script id="elementor-recaptcha_v3-api-js" src="https://www.google.com/recaptcha/api.js?render=explicit&#038;ver=4.3.1"></script>
6325<script id="wp-hooks-js" src="https://wildbills.com/wp-includes/js/dist/hooks.min.js?ver=f0f188028580e8dc1255"></script>
vendor: 1 bytes, line 6325
6325
6326<script id="wp-i18n-js" src="https://wildbills.com/wp-includes/js/dist/i18n.min.js?ver=1dfe7db3940c23ea9216"></script>
vendor: 1 bytes, line 6326
6326
6327<script id="wp-i18n-js-after">
6328wp.i18n.setLocaleData( { 'text direction\u0004ltr': [ 'ltr' ] } );
6329//# sourceURL=wp-i18n-js-after
6330</script>
vendor: 1 bytes, line 6330
6330
6331<script id="elementor-pro-frontend-js-before">
6332var ElementorProFrontendConfig = {"ajaxurl":"https:\/\/wildbills.com\/wp-admin\/admin-ajax.php","nonce":"15363680c7","urls":{"assets":"https:\/\/wildbills.com\/wp-content\/plugins\/elementor-pro\/assets\/","rest":"https:\/\/wildbills.com\/wp-json\/"},"settings":{"lazy_load_background_images":true},"popup":{"hasPopUps":true},"shareButtonsNetworks":{"facebook":{"title":"Facebook","has_counter":true},"twitter":{"title":"Twitter"},"linkedin":{"title":"LinkedIn","has_counter":true},"pinterest":{"title":"Pinterest","has_counter":true},"reddit":{"title":"Reddit","has_counter":true},"vk":{"title":"VK","has_counter":true},"odnoklassniki":{"title":"OK","has_counter":true},"tumblr":{"title":"Tumblr"},"digg":{"title":"Digg"},"skype":{"title":"Skype"},"stumbleupon":{"title":"StumbleUpon","has_counter":true},"mix":{"title":"Mix"},"telegram":{"title":"Telegram"},"pocket":{"title":"Pocket","has_counter":true},"xing":{"title":"XING","has_counter":true},"whatsapp":{"title":"WhatsApp"},"email":{"title":"Email"},"print":{"title":"Print"},"x-twitter":{"title":"X"},"threads":{"title":"Threads"}},"facebook_sdk":{"lang":"en_US","app_id":""},"lottie":{"defaultAnimationUrl":"https:\/\/wildbills.com\/wp-content\/plugins\/elementor-pro\/modules\/lottie\/assets\/animations\/default.json"}};
6333//# sourceURL=elementor-pro-frontend-js-before
6334</script>
vendor: 1 bytes, line 6334
6334
6335<script id="elementor-pro-frontend-js" src="https://wildbills.com/wp-content/plugins/elementor-pro/assets/js/frontend.min.js?ver=4.3.1"></script>
vendor: 1 bytes, line 6335
6335
6336<script id="pro-elements-handlers-js" src="https://wildbills.com/wp-content/plugins/elementor-pro/assets/js/elements-handlers.min.js?ver=4.3.1"></script>
6336
6337
6338</body>
6339</html>

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