PageSourceSearch

https://www.aspartyrental.com/rentals/carnival-ride-rentals/trackless-train-w-roofed-carts/

html aspartyrental.com collected 2026-09-29 03:26:10 UTC 361,600 bytes, 6,320 lines download raw bytes

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

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.