PageSourceSearch

https://topeventrental.com/

html topeventrental.com collected 2026-10-06 16:19:42 UTC 379,884 bytes, 5,615 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="https://gmpg.org/xfn/11"> 
1<script>Object.defineProperty(window,"angiePlugin",{value:{"schemaVersion":1,"available":true,"version":"1.1.18"},writable:false,configurable:false});</script>
1 
1<script id="google_gtagjs-js-consent-mode-data-layer">window.dataLayer = window.dataLayer || [];function gtag(){dataLayer.push(arguments);}
2gtag('consent', 'default', {"ad_personalization":"denied","ad_storage":"denied","ad_user_data":"denied","analytics_storage":"denied","functionality_storage":"denied","security_storage":"denied","personalization_storage":"denied","region":["AT","BE","BG","CH","CY","CZ","DE","DK","EE","ES","FI","FR","GB","GR","HR","HU","IE","IS","IT","LI","LT","LU","LV","MT","NL","NO","PL","PT","RO","SE","SI","SK"],"wait_for_update":500});
3window._googlesitekitConsentCategoryMap = {"statistics":["analytics_storage"],"marketing":["ad_storage","ad_user_data","ad_personalization"],"functional":["functionality_storage","security_storage"],"preferences":["personalization_storage"]};
4window._googlesitekitConsents = {"ad_personalization":"denied","ad_storage":"denied","ad_user_data":"denied","analytics_storage":"denied","functionality_storage":"denied","security_storage":"denied","personalization_storage":"denied","region":["AT","BE","BG","CH","CY","CZ","DE","DK","EE","ES","FI","FR","GB","GR","HR","HU","IE","IS","IT","LI","LT","LU","LV","MT","NL","NO","PL","PT","RO","SE","SI","SK"],"wait_for_update":500};</script>
4 <link media="all" href="https://topeventrental.com/wp-content/cache/autoptimize/css/autoptimize_80af58bb7bb8260cc97f1ad53810fc1b.css" rel="stylesheet"><title>Top Event Rentals Phoenix AZ - Party Rental and Event Rental</title><meta name="description" content="Party and Event rentals of the highest quality. We have a large selection of clean equipment."/><meta name="robots" content="follow, index, max-snippet:-1, max-video-preview:-1, max-image-preview:large"/><link rel="canonical" href="https://topeventrental.com/" /><meta property="og:locale" content="en_US" /><meta property="og:type" content="website" /><meta property="og:title" content="Top Event Rentals Phoenix AZ - Party Rental and Event Rental" /><meta property="og:description" content="Party and Event rentals of the highest quality. We have a large selection of clean equipment." /><meta property="og:url" content="https://topeventrental.com/" /><meta property="og:site_name" content="Top Event Rentals Phoenix AZ" /><meta property="og:updated_time" content="2026-10-04T00:53:34+00:00" /><meta name="twitter:card" content="summary_large_image" /><meta name="twitter:title" content="Top Event Rentals Phoenix AZ - Party Rental and Event Rental" /><meta name="twitter:description" content="Party and Event rentals of the highest quality. We have a large selection of clean equipment." /><meta name="twitter:label1" content="Written by" /><meta name="twitter:data1" content="io" /><meta name="twitter:label2" content="Time to read" /><meta name="twitter:data2" content="3 minutes" /> 
4<script type="application/ld+json" class="rank-math-schema">{"@context":"https://schema.org","@graph":[{"@type":"Organization","@id":"https://topeventrental.com/#organization","name":"Top Event Rentals Phoenix AZ","url":"https://topeventrental.com","email":"[email protected]","logo":{"@type":"ImageObject","@id":"https://topeventrental.com/#logo","url":"https://topeventrental.com/wp-content/uploads/2020/02/TER-Main-Logo-1-150x150.png","contentUrl":"https://topeventrental.com/wp-content/uploads/2020/02/TER-Main-Logo-1-150x150.png","caption":"Top Event Rentals Phoenix AZ","inLanguage":"en-US"},"legalName":"io"},{"@type":"WebSite","@id":"https://topeventrental.com/#website","url":"https://topeventrental.com","name":"Top Event Rentals Phoenix AZ","publisher":{"@id":"https://topeventrental.com/#organization"},"inLanguage":"en-US","potentialAction":{"@type":"SearchAction","target":"https://topeventrental.com/?s={search_term_string}","query-input":"required name=search_term_string"}},{"@type":"ImageObject","@id":"https://topeventrental.com/wp-content/uploads/2025/06/Scottsdale-Culinary-Festival.jpg","url":"https://topeventrental.com/wp-content/uploads/2025/06/Scottsdale-Culinary-Festival.jpg","width":"200","height":"200","inLanguage":"en-US"},{"@type":"WebPage","@id":"https://topeventrental.com/#webpage","url":"https://topeventrental.com/","name":"Top Event Rentals Phoenix AZ - Party Rental and Event Rental","datePublished":"2020-01-28T15:14:48+00:00","dateModified":"2026-10-04T00:53:34+00:00","about":{"@id":"https://topeventrental.com/#organization"},"isPartOf":{"@id":"https://topeventrental.com/#website"},"primaryImageOfPage":{"@id":"https://topeventrental.com/wp-content/uploads/2025/06/Scottsdale-Culinary-Festival.jpg"},"inLanguage":"en-US"},{"@type":"Service","name":"Top Event Rentals Phoenix AZ - Party Rental and Event Rental","description":"Party and Event rentals of the highest quality. We have a large selection of clean equipment.","serviceType":"Bounce House Rental","offers":{"@type":"Offer","availability":"InStock"},"image":{"@id":"https://topeventrental.com/wp-content/uploads/2025/06/Scottsdale-Culinary-Festival.jpg"},"@id":"https://topeventrental.com/#schema-20673","mainEntityOfPage":{"@id":"https://topeventrental.com/#webpage"}}]}</script>
4 <link rel='dns-prefetch' href='//cdnjs.cloudflare.com' /><link rel='dns-prefetch' href='//www.googletagmanager.com' /><link rel="alternate" type="application/rss+xml" title="Top Event Rentals Phoenix AZ &raquo; Feed" href="https://topeventrental.com/feed/" /><link rel="alternate" type="application/rss+xml" title="Top Event Rentals Phoenix AZ &raquo; Comments Feed" href="https://topeventrental.com/comments/feed/" /><link rel="alternate" title="oEmbed (JSON)" type="application/json+oembed" href="https://topeventrental.com/wp-json/oembed/1.0/embed?url=https%3A%2F%2Ftopeventrental.com%2F" /><link rel="alternate" title="oEmbed (XML)" type="text/xml+oembed" href="https://topeventrental.com/wp-json/oembed/1.0/embed?url=https%3A%2F%2Ftopeventrental.com%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}
5/*# sourceURL=wp-img-auto-sizes-contain-inline-css */</style><style id="classic-theme-styles-inline-css">/*! This file is auto-generated */
6.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}
7/*# 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%);
7--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;}
7.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;}
8:root :where(.wp-block-icon svg){width: 24px;}
9: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 ) ) );}
10:where(.wp-block-latest-posts.is-layout-flex){gap: 1.25em;}:where(.wp-block-latest-posts.is-layout-grid){gap: 1.25em;}
11:where(.wp-block-post-template.is-layout-flex){gap: 1.25em;}:where(.wp-block-post-template.is-layout-grid){gap: 1.25em;}
12:where(.wp-block-term-template.is-layout-flex){gap: 1.25em;}:where(.wp-block-term-template.is-layout-grid){gap: 1.25em;}
13:where(.wp-block-columns.is-layout-flex){gap: 2em;}:where(.wp-block-columns.is-layout-grid){gap: 2em;}
14:root :where(.wp-block-pullquote){font-size: 1.5em;line-height: 1.6;}
15/*# 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' /> 
15<script id="jquery-core-js" src="https://topeventrental.com/wp-includes/js/jquery/jquery.min.js?ver=3.7.1"></script>
15 
15<script id="io-scripts-js-extra">var io_scripts_vars = {"io_username":"TopEventRentals","io_locationid":"0","io_phonenumber":"(602) 566-1560","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":"Top Event Rentals Phoenix AZ"};
16//# sourceURL=io-scripts-js-extra</script>
vendor: 83 bytes, line 16
16    <script id="google_gtagjs-js" src="https://www.googletagmanager.com/gtag/js?id=
16GT-M6JG3G6X
vendor: 18 bytes, line 16
16" async></script> 
16<script id="google_gtagjs-js-after">window.dataLayer = window.dataLayer || [];function gtag(){dataLayer.push(arguments);}
17gtag("set","linker",{"domains":["topeventrental.com"]});
18gtag("js", new Date());
19gtag("set", "developer_id.dZTNiMT", true);
20gtag("config", "GT-M6JG3G6X");
21gtag("config", "AW-17323078635");
22 window._googlesitekit = window._googlesitekit || {}; window._googlesitekit.throttledEvents = []; window._googlesitekit.gtagEvent = (name, data) => { var key = JSON.stringify( { name, data } ); if ( !! window._googlesitekit.throttledEvents[ key ] ) { return; } window._googlesitekit.throttledEvents[ key ] = true; setTimeout( () => { delete window._googlesitekit.throttledEvents[ key ]; }, 5 ); gtag( "event", name, { ...data, event_source: "site-kit" } ); }; 
23//# sourceURL=google_gtagjs-js-after</script>
23 <link rel="https://api.w.org/" href="https://topeventrental.com/wp-json/" /><link rel="alternate" title="JSON" type="application/json" href="https://topeventrental.com/wp-json/wp/v2/pages/109" /><link rel="EditURI" type="application/rsd+xml" title="RSD" href="https://topeventrental.com/xmlrpc.php?rsd" /><link rel='shortlink' href='https://topeventrental.com/' /><meta name="generator" content="Site Kit by Google 1.189.0" /> 
23<script>
vendor: 327 bytes, lines 23-27
23(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start':
24new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0],
25j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src=
26'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f);
27})(window,document,'script','dataLayer','
27GTM-NXW3QDCS
vendor: 3 bytes, line 27
27');
27</script>
27 <meta name="generator" content="Elementor 4.3.4; 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),
28				.e-con.e-parent:nth-of-type(n+4):not(.e-lazyloaded):not(.e-no-lazyload) * {
29					background-image: none !important;
30				}
31				@media screen and (max-height: 1024px) {
32					.e-con.e-parent:nth-of-type(n+3):not(.e-lazyloaded):not(.e-no-lazyload),
33					.e-con.e-parent:nth-of-type(n+3):not(.e-lazyloaded):not(.e-no-lazyload) * {
34						background-image: none !important;
35					}
36				}
37				@media screen and (max-height: 640px) {
38					.e-con.e-parent:nth-of-type(n+2):not(.e-lazyloaded):not(.e-no-lazyload),
39					.e-con.e-parent:nth-of-type(n+2):not(.e-lazyloaded):not(.e-no-lazyload) * {
40						background-image: none !important;
41					}
42				}</style><link rel="icon" href="https://topeventrental.com/wp-content/uploads/2020/02/TER-Icon-Logo-1NEW-1-150x150.png" sizes="32x32" /><link rel="icon" href="https://topeventrental.com/wp-content/uploads/2020/02/TER-Icon-Logo-1NEW-1-300x300.png" sizes="192x192" /><link rel="apple-touch-icon" href="https://topeventrental.com/wp-content/uploads/2020/02/TER-Icon-Logo-1NEW-1-300x300.png" /><meta name="msapplication-TileImage" content="https://topeventrental.com/wp-content/uploads/2020/02/TER-Icon-Logo-1NEW-1-300x300.png" /><style id="wp-custom-css">.grecaptcha-badge { visibility: hidden; }
43
44.search-submit{display:none;}
45
46.cartInfo{
47	display:none !important;
48}
49.io-footer-link a {
50color: var(--e-global-color-accent, orange);
51}
52
53.catDescriptionIO.catDescriptionIO_small.elementor-widget-text-editor {
54    padding: 10px;
55    font-size: small;
56    text-align: left;
57}
58
59.io_brand {
60    margin-bottom: 20px;
61}
62
63.mega-block-title{
64    display: none !important;
65}
66
67div.elementor-button, a.elementor-button, .io_item2_list div.view-product-button,.view-product-button {
68    background-color: var(--e-global-color-primary, green) !important;
69}
70
71.io_cat_description *, .io_landingpages{
72	background:transparent !important;
73	background-color:transparent !important;
74	color:black !important;
75	font-family: var( --e-global-typography-text-font-family ), Sans-serif !important;
76}
77
78#cartPopover {
79	font-family:var(--e-global-typography-primary-font-family) !important;
80}
81
82#cartPopover .elementor-widget-button .elementor-button{
83	border-radius:0;
84}
85
86#cartCustomMessage{
87	padding:10px !important;
88	background:red;
89	margin-bottom:10px;
90}
91
92#cartCustomMessage a{
93	color:white;
94}
95#cartWarning{text-shadow:none;font-weight:600;}
96
97#cartPopover{
98	background:#261e1e;
99	box-shadow: rgba(50, 50, 93, 0.25) 0px 13px 27px -5px, rgba(0, 0, 0, 0.3) 0px 8px 16px -8px;
100	border:none;
101	border-radius:0;
102}
103#cartPopover th{
104	color:white;
105}
106
107.accTextName{
108	white-space:unset !important;
109	max-width: 83px !important	;
110}
111
112div[ID^='ioAccButtonWrapper_']{
113	vertical-align:top;
114}
115
116.io_item2_list div.view-product-button:hover{
117	color:white !important;
118}</style></head><body class="home wp-singular page-template-default page page-id-109 wp-custom-logo wp-theme-io-kenos angie-default mega-menu-max-mega-menu-4 mega-menu-max-mega-menu-5 mega-menu-max-mega-menu-6 mega-menu-max-mega-menu-7 mega-menu-max-mega-menu-8 mega-menu-max-mega-menu-9 mega-menu-max-mega-menu-10 elementor-default elementor-kit-812 elementor-page elementor-page-109"><header data-elementor-type="header" data-elementor-id="4254" class="elementor elementor-4254 elementor-location-header" data-elementor-post-type="elementor_library"><section class="elementor-section elementor-top-section elementor-element elementor-element-9e87b57 elementor-section-boxed elementor-section-height-default elementor-section-height-default" data-id="9e87b57" data-element_type="section" data-e-type="section" data-settings="{&quot;background_background&quot;:&quot;classic&quot;}"><div class="elementor-container elementor-column-gap-default"><div class="elementor-column elementor-col-50 elementor-top-column elementor-element elementor-element-b118f21" data-id="b118f21" data-element_type="column" data-e-type="column"><div class="elementor-widget-wrap elementor-element-populated"><div class="elementor-element elementor-element-4c9622c elementor-widget elementor-widget-wp-widget-searchio_live_search" data-id="4c9622c" data-element_type="widget" data-e-type="widget" data-widget_type="wp-widget-searchio_live_search.default"><div class="elementor-widget-container"><form role="search" method="get" class="searchio-live-search-widget-search-form" action="https://topeventrental.com"> <label> <span class="screen-reader-text">Search for:</span> <input type="search" class="search-field" style="width: 220px" placeholder="Search for..." value="" name="s" data-swplive="true" data-swpengine="default" data-swpconfig="default" autocomplete="off"> </label> <input type="submit" class="search-submit"  value="Search"></form></div></div></div></div><div class="elementor-column elementor-col-50 elementor-top-column elementor-element elementor-element-57457f3" data-id="57457f3" 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-3475cc6 ioCart elementor-view-default elementor-widget elementor-widget-icon" data-id="3475cc6" 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-basket"></i></div></div></div></div></div></div></div></section><section class="elementor-section elementor-top-section elementor-element elementor-element-590b6de4 elementor-section-boxed elementor-section-height-default elementor-section-height-default" data-id="590b6de4" data-element_type="section" data-e-type="section" data-settings="{&quot;background_background&quot;:&quot;classic&quot;}"><div class="elementor-container elementor-column-gap-default"><div class="elementor-column elementor-col-50 elementor-top-column elementor-element elementor-element-5a4807a3" data-id="5a4807a3" data-element_type="column" data-e-type="column"><div class="elementor-widget-wrap elementor-element-populated"><div class="elementor-element elementor-element-5dc4feb6 elementor-widget elementor-widget-theme-site-logo elementor-widget-image" data-id="5dc4feb6" data-element_type="widget" data-e-type="widget" data-widget_type="theme-site-logo.default"><div class="elementor-widget-container"> <a href="https://topeventrental.com"> <img fetchpriority="high" width="2560" height="2411" src="https://topeventrental.com/wp-content/uploads/2020/02/TER-Main-Logo-1-scaled.png" class="attachment-full size-full wp-image-5575" alt="" srcset="https://topeventrental.com/wp-content/uploads/2020/02/TER-Main-Logo-1-scaled.png 2560w, https://topeventrental.com/wp-content/uploads/2020/02/TER-Main-Logo-1-300x283.png 300w, https://topeventrental.com/wp-content/uploads/2020/02/TER-Main-Logo-1-1024x964.png 1024w, https://topeventrental.com/wp-content/uploads/2020/02/TER-Main-Logo-1-768x723.png 768w, https://topeventrental.com/wp-content/uploads/2020/02/TER-Main-Logo-1-1536x1447.png 1536w, https://topeventrental.com/wp-content/uploads/2020/02/TER-Main-Logo-1-2048x1929.png 2048w" sizes="(max-width: 2560px) 100v
118w, 2560px" /> </a></div></div></div></div><div class="elementor-column elementor-col-50 elementor-top-column elementor-element elementor-element-226653fc" data-id="226653fc" data-element_type="column" data-e-type="column"><div class="elementor-widget-wrap elementor-element-populated"><div class="elementor-element elementor-element-08de256 elementor-widget__width-initial elementor-widget elementor-widget-maxmegamenu" data-id="08de256" data-element_type="widget" data-e-type="widget" data-widget_type="maxmegamenu.default"><div class="elementor-widget-container"><div id="mega-menu-wrap-max_mega_menu_8" 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'><button aria-controls="mega-menu-max_mega_menu_8" aria-expanded="false" aria-haspopup="true" class='mega-toggle-standard mega-toggle-label'><span class='mega-toggle-label-closed'></span><span class='mega-toggle-label-open'></span></button></div></div><div class="mega-toggle-blocks-right"></div></div><ul id="mega-menu-max_mega_menu_8" 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-home mega-current-menu-item mega-page_item mega-page-item-109 mega-current_page_item mega-menu-item-3808" id="mega-menu-item-3808"><a class="mega-menu-link" href="https://topeventrental.com/" aria-current="page">Home</a></li><li class="mega-menu-item mega-menu-item-type-custom mega-menu-item-object-custom mega-menu-megamenu mega-menu-item-has-children mega-align-bottom-left mega-menu-item-3814" id="mega-menu-item-3814"><a class="mega-menu-link" href="#" aria-expanded="false" aria-controls="mega-sub-menu-3814">Products<span class="mega-indicator" aria-hidden="true"></span></a><ul class="mega-sub-menu" id='mega-sub-menu-3814'><li class="mega-menu-item mega-menu-item-type-widget widget_elementor-library mega-menu-column-standard mega-menu-columns-6-of-6 mega-menu-item-elementor-library-2" style="--columns:6; --span:6" id="mega-menu-item-elementor-library-2"><h4 class="mega-block-title">menu</h4><div data-elementor-type="page" data-elementor-id="5911" class="elementor elementor-5911" data-elementor-post-type="elementor_library"><section class="elementor-section elementor-top-section elementor-element elementor-element-974aa8f elementor-section-full_width elementor-section-height-default elementor-section-height-default" data-id="974aa8f" data-element_type="section" data-e-type="section"><div class="elementor-container elementor-column-gap-default"><div class="elementor-column elementor-col-25 elementor-top-column elementor-element elementor-element-55e31b2" data-id="55e31b2" data-element_type="column" data-e-type="column" data-settings="{&quot;background_background&quot;:&quot;slideshow&quot;,&quot;background_slideshow_gallery&quot;:[{&quot;id&quot;:6055,&quot;url&quot;:&quot;https:\/\/topeventrental.com\/wp-content\/uploads\/2025\/06\/Scottsdale-Culinary-Festival.jpg&quot;},{&quot;id&quot;:6059,&quot;url&quot;:&quot;https:\/\/topeventrental.com\/wp-content\/uploads\/2025\/06\/Festival-of-the-Arts.jpg&quot;},{&quot;id&quot;:5760,&quot;url&quot;:&quot;https:\/\/topeventrental.com\/wp-content\/uploads\/2025\/06\/ASU-Homecoming-Aerial.png&quot;},{&quot;id&quot;:5733,&quot;url&quot;:&quot;https:\/\/topeventrental.com\/wp-content\/uploads\/2025\/06\/Mavericks-Obstacle-Course.jpg&quot;},{&quot;id&quot;:5764,&quot;url&quot;:&quot;https:\/\/topeventrental.com\/wp-content\/uploads\/2025\/06\/Baby-Shower.jpg&quot;}],&quot;background_slideshow_slide_duration&quot;:2000,&quot;background_slideshow_loop&quot;:&quot;yes&quot;,&quot;background_slideshow_slide_transition&quot;:&quot;fade&quot;,&quot;background_slideshow_transition_duration&quot;:500}"><div class="elementor-widget-wrap elementor-element-populated"><div class="elementor-element elementor-element-40ab092 elementor-widget elementor-widget-spacer" data-id="40ab092" data-element_type="widget" data-e-type="widget" data-widget_type="spacer.default"><div class="elementor-widget-container"><div class="elementor-spacer"><div class="elementor-spacer-inner"></div></div></div></div></div></div><div class="elementor-column elementor-col-25 elementor-top-column elementor-element elementor-element-3288904" data-id="3288904" data-element_type="column" data-e-type="column"><div class="elementor-widget-wrap elementor-element-populated"><div class="elementor-element elementor-element-9a72de1 elementor-icon-list--layout-traditional elementor-list-item-link-full_width elementor-widget elementor-widget-icon-list" data-id="9a72de1" 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"><li class="elementor-icon-list-item"> <a href="https://topeventrental.com/rentals/tables/"> <span class="elementor-icon-list-text">Tables</span> </a></li><li class="elementor-icon-list-item"> <a href="https://topeventrental.com/rentals/chairs/"> <span class="elementor-icon-list-text">Chairs</span> </a></li><li class="elementor-icon-list-item"> <a href="https://topeventrental.com/rentals/linens/"> <span class="elementor-icon-list-text">Linens</span> </a></li><li class="elementor-icon-list-item"> <a href="https://topeventrental.com/rentals/tents-and-accessories/"> <span class="elementor-icon-list-text">Tents and Accessories</span> </a></li><li class="elementor-icon-list-item"> <a href="https://topeventrental.com/inflatables/"> <span class="elementor-icon-list-text">Inflatables</span> </a></li></ul></div></div></div></div><div class="elementor-column elementor-col-25 elementor-top-column elementor-element elementor-element-6af5ccb" data-id="6af5ccb" data-element_type="column" data-e-type="column"><div class="elementor-widget-wrap elementor-element-populated"><div class="elementor-element elementor-element-ed2a941 elementor-icon-list--layout-traditional elementor-list-item-link-full_width elementor-widget elementor-widget-icon-list" data-id="ed2a941" 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"><li class="elementor-icon-list-item"> <a href="https://topeventrental.com/rentals/marquee-letters/"> <span class="elementor-icon-list-text">Marquee Letters</span> </a></li><li class="elementor-icon-list-item"> <a href="https://topeventrental.com/rentals/dance-floors-and-stages/"> <span class="elementor-icon-list-text">Dance Floor and Stages</span> </a></li><li class="elementor-icon-list-item"> <a href="https://topeventrental.com/rentals/games/"> <span class="elementor-icon-list-text">Games</span> </a></li><li class="elementor-icon-list-item"> <a href="https://topeventrental.com/rentals/food/"> <span class="elementor-icon-list-text">Concessions</span> </a></li></ul></div></div></div></div><div class="elementor-column elementor-col-25 elementor-top-column elementor-element elementor-element-66a0183" data-id="66a0183" data-element_type="column" data-e-type="column"><div class="elementor-widget-wrap elementor-element-populated"><div class="elementor-element elementor-element-fae961b elementor-icon-list--layout-traditional elementor-list-item-link-full_width elementor-widget elementor-widget-icon-list" data-id="fae961b" 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"><li class="elementor-icon-list-item"> <a href="https://topeventrental.com/rentals/air-conditioning-heating-and-power/"> <span class="elementor-icon-list-text">AC, Heating, Power</span> </a></li><li class="elementor-icon-list-item"> <a href="https://topeventrental.com/rentals/ice-chest-and-sanitary/"> <span class="elementor-icon-list-text">Ice Chest and Sanitary</span> </a></li><li class="elementor-icon-list-item"> <a href="https://topeventrental.com/rentals/audio/"> <span class="elementor-icon-list-text">Podiums &amp; Sound</span> </a></li><li class="elementor-icon-list-item"> <a href="https://topeventrental.com/rentals/crowd-control/"> <span class="elementor-icon-list-text">Crowd Control</span> </a></li><li class="elementor-icon-list-item"> <a href="https://topeventrental.com/rentals/misc/"> <span class="elementor-icon-list-text">Misc</span> </a></li></ul></div></div></div></div></div></section></div></li></ul></li><li class="mega-menu-item mega-menu-item-type-post_type mega-menu-item-object-page mega-menu-item-18682" id="mega-menu-item-18682"><a class="mega-menu-link" href="https://topeventrental.com/resources/">Resources</a></li><li class="mega-menu-item mega-menu-item-type-post_type mega-menu-item-object-page mega-menu-item-3810" id="mega-menu-item-3810"><a class="mega-menu-link" href="https://topeventrental.com/about-us/">About Us</a></li><li class="mega-menu-item mega-menu-item-type-post_type mega-menu-item-object-page mega-menu-item-3811" id="mega-menu-item-3811"><a class="mega-menu-link" href="https://topeventrental.com/contact-us/">Contact Us</a></li></ul></div></div></div></div></div></div></section></header><main id="main" class="site-main" role="main"><header class="page-header io_phshow"><div class ="elementor-widget-heading"></div></header><div class="page-content"><div data-elementor-type="wp-page" data-elementor-id="109" class="elementor elementor-109" data-elementor-post-type="page"><section class="elementor-section elementor-top-section elementor-element elementor-element-b9d5e3f elementor-section-full_width elementor-section-height-default elementor-section-height-default" data-id="b9d5e3f" data-element_type="section" data-e-type="section"><div class="elementor-container elementor-column-gap-no"><div class="elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-23f11a1" data-id="23f11a1" data-element_type="column" data-e-type="column"><div class="elementor-widget-wrap elementor-element-populated"><div class="elementor-element elementor-element-eb25cb4 elementor--h-position-left elementor--v-position-middle elementor-arrows-position-inside elementor-pagination-position-inside elementor-widget elementor-widget-slides" data-id="eb25cb4" data-element_type="widget" data-e-type="widget" data-settings="{&quot;navigation&quot;:&quot;both&quot;,&quot;autoplay&quot;:&quot;yes&quot;,&quot;pause_on_hover&quot;:&quot;yes&quot;,&quot;pause_on_interaction&quot;:&quot;yes&quot;,&quot;autoplay_speed&quot;:5000,&quot;infinite&quot;:&quot;yes&quot;,&quot;transition&quot;:&quot;slide&quot;,&quot;transition_speed&quot;:500}" data-widget_type="slides.default"><div class="elementor-widget-container"><div class="elementor-swiper"><div class="elementor-slides-wrapper elementor-main-swiper swiper" role="region" aria-roledescription="carousel" aria-label="Slides" dir="ltr" data-animation="fadeInDown"><div class="swiper-wrapper elementor-slides"><div class="elementor-repeater-item-7ae94eb swiper-slide" role="group" aria-roledescription="slide"><div class="swiper-slide-bg" role="img" aria-label="Tent rentals near me Table and chairs for rent event rentals near me"></div><a class="swiper-slide-inner" href="https://topeventrental.com/rentals/tents-and-accessories/"><div class="swiper-slide-contents"><div class="elementor-slide-heading">Arizona Event Rentals</div><div class="elementor-slide-description">Arizona's most trusted event rental and party rental source! From tables, chairs, tents, bounce houses, and stages to exciting attractions like water slides, marquee letters, stanchions, etc. Anything from government events and music festivals to weddings and birthday parties. Providing party rentals for Arizona's most notable events!</div><div  class="elementor-button elementor-slide-button elementor-size-sm">Learn More</div></div></a></div><div class="elementor-repeater-item-13876d7 swiper-slide" role="group" aria-roledescription="slide"><div class="swiper-slide-bg" role="img" aria-label="Chair Rentals Mesa, Arizona Chairs for rent Phoenix, Arizona Event rentals Glendale, Arizona"></div><a class="swiper-slide-inner" href="https://topeventrental.com/rentals/chairs/"><div class="swiper-slide-contents"><div class="elementor-slide-heading">Phoenix Event Rentals</div><div class="elementor-slide-description">Have an event in style with crowd-ready seating, staging, and table options. From small backyard ceremonies to full school events and music festival rentals, we provide the essentials that help every milestone shine.</div><div  class="elementor-button elementor-slide-button elementor-size-sm">Learn More</div></div></a></div><div class="elementor-repeater-item-086aedc swiper-slide" role="group" aria-roledescription="slide"><div class="swiper-slide-bg" role="img" aria-label="Water slide rentals phoenix, Arizona Water slide rentals Glendale, Arizona Bounce house rentals near me"></div><a class="swiper-slide-inner" href="https://topeventrental.com/inflatables/"><div class="swiper-slide-contents"><div class="elementor-slide-heading">Inflatable Fun for All Ages</div><div class="elementor-slide-description">Bring the energy with our vibrant inflatable rentals! Whether it’s a birthday party, school event, or city fair, our safe, clean, and colorful bounce houses and water slide rentals keep the fun going all day long.</div><div  class="elementor-button elementor-slide-button elementor-size-sm">Learn More</div></div></a></div><div class="elementor-repeater-item-11a7732 swiper-slide" role="group" aria-roledescription="slide"><div class="swiper-slide-bg" role="img" aria-label="White Resin Chair Wedding Rentals Phoenix"></div><a class="swiper-slide-inner" href="https://topeventrental.com/rentals/tables/"><div class="swiper-slide-contents"><div class="elementor-slide-heading">Elegant Tables & Seating</div><div class="elementor-slide-description">Create the perfect setting with our curated collection of tables, chairs, and linen rentals. From rustic romance to modern glam, we help you build a wedding rental reception that reflects your unique style.</div><div  class="elementor-button elementor-slide-button elementor-size-sm">Learn More</div></div></a></div></div><div class="elementor-swiper-button elementor-swiper-button-prev" role="button" tabindex="0" aria-label="Previous slide"> <i aria-hidden="true" class="eicon-chevron-left"></i></div><div class="elementor-swiper-button elementor-swiper-button-next" role="button" tabindex="0" aria-label="Next slide"> <i aria-hidden="true" class="eicon-chevron-right"></i></div><div class="swiper-pagination"></div></div></div></div></div></div></div></div></section><section class="elementor-section elementor-top-section elementor-element elementor-element-256ac1a7 elementor-section-boxed elementor-section-height-default elementor-section-height-default" data-id="256ac1a7" 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-152a95e2 io_widget_home" data-id="152a95e2" data-element_type="column" data-e-type="column"><div class="elementor-widget-wrap elementor-element-populated"><div class="elementor-element elementor-element-6e420e9d elementor-widget elementor-widget-heading" data-id="6e420e9d" data-element_type="widget" data-e-type="widget" data-widget_type="heading.default"><div class="elementor-widget-container"><h1 class="elementor-heading-title elementor-size-default">Arizona’s most trusted event rental partner</h1></div></div><div class="elementor-element elementor-element-2f3021e9 elementor-widget elementor-widget-wp-widget-widget_featured" data-id="2f3021e9" data-element_type="widget" data-e-type="widget" data-widget_type="wp-widget-widget_featured.default"><div class="elementor-widget-container"><div class="
118widget-text wp_widget_plugin_box panel-grid panel-has-style" style="margin-top:0px;">
118<script>jQuery(document).ready(function(){
119                  jQuery('.io_mm_item .io_item2_list').css('box-shadow', 'none')
120                  jQuery('.io_mm_item .io_item2_list').addClass('nohover')
121
122                  jQuery('.io_mm_item .io_item2_listcat').css('box-shadow', 'none')
123                  jQuery('.io_mm_item .io_item2_listcat').addClass('nohover')
124              })</script>
124<div class="io_mm_outer io_widget_26937 io_featured_scroll" style=""><style>.io_widget_26937 .io_item2_list_inner .rentNameIO_button {display:none !important;} .io_widget_26937 .io_item2_list_inner .rentNameIO_price {display:none !important;} .io_widget_26937 .io_item2_list .view-product-button {display:none !important;} .io_widget_26937 .io_item2_listcat .view-product-button {display:none !important;} .io_widget_26937 .io_item2_listcat .catDescriptionIO {display:none;}</style><div class="io_mm_item_scrolling elementor-widget-heading simpleCart_ioShelfItem" name="maindiv_Dance_Floors_and_Stages" style="text-align:center"> <a class="item_href" href="https://topeventrental.com/rentals/dance-floors-and-stages/"><div class="cat_div"><div class="btn btn-primary view-product-button" style="display:none;">View Products</div> <img decoding="async" class="cat_img item_image" src="https://topeventrental.com/wp-content/uploads/2026/01/1620x203220Stage_1769626155_big.jpg" alt="Dance Floors and Stages"
125 title="Dance Floors and Stages" style=""></div> </a><div class="io_item2_list_inner io_mm_title"> <a href="https://topeventrental.com/rentals/dance-floors-and-stages/"><p class="elementor-heading-title rentNameIO item_name">Dance Floors and Stages</p></a></div></div><div class="io_mm_item_scrolling elementor-widget-heading simpleCart_ioShelfItem" name="maindiv_Tents_and_Accessories" style="text-align:center"> <a class="item_href" href="https://topeventrental.com/rentals/tents-and-accessories/"><div class="cat_div"><div class="btn btn-primary view-product-button" style="display:none;">View Products</div> <img decoding="async" class="cat_img item_image" src="https://topeventrental.com/wp-content/uploads/2025/06/4020x208020Frame20Tent_1750722724_big.jpg" alt="Tents and Accessories"
126 title="Tents and Accessories" style=""></div> </a><div class="io_item2_list_inner io_mm_title"> <a href="https://topeventrental.com/rentals/tents-and-accessories/"><p class="elementor-heading-title rentNameIO item_name">Tents and Accessories</p></a></div></div><div class="io_mm_item_scrolling elementor-widget-heading simpleCart_ioShelfItem" name="maindiv_Tables" style="text-align:center"> <a class="item_href" href="https://topeventrental.com/rentals/tables/"><div class="cat_div"><div class="btn btn-primary view-product-button" style="display:none;">View Products</div> <img decoding="async" class="cat_img item_image" src="https://topeventrental.com/wp-content/uploads/2026/01/820Rectangle20Table_1769625944_big.png" alt="Tables"
127 title="Tables" style=""></div> </a><div class="io_item2_list_inner io_mm_title"> <a href="https://topeventrental.com/rentals/tables/"><p class="elementor-heading-title rentNameIO item_name">Tables</p></a></div></div><div class="io_mm_item_scrolling elementor-widget-heading simpleCart_ioShelfItem" name="maindiv_Chairs" style="text-align:center"> <a class="item_href" href="https://topeventrental.com/rentals/chairs/"><div class="cat_div"><div class="btn btn-primary view-product-button" style="display:none;">View Products</div> <img decoding="async" class="cat_img item_image" src="https://topeventrental.com/wp-content/uploads/2026/01/Black20Resin20Chair_1769625967_big.png" alt="Chairs"
128 title="Chairs" style=""></div> </a><div class="io_item2_list_inner io_mm_title"> <a href="https://topeventrental.com/rentals/chairs/"><p class="elementor-heading-title rentNameIO item_name">Chairs</p></a></div></div><div class="io_mm_item_scrolling elementor-widget-heading simpleCart_ioShelfItem" name="maindiv_Marquee_Letters" style="text-align:center"> <a class="item_href" href="https://topeventrental.com/rentals/marquee-letters/"><div class="cat_div"><div class="btn btn-primary view-product-button" style="display:none;">View Products</div> <img decoding="async" class="cat_img item_image" src="https://topeventrental.com/wp-content/uploads/2025/06/Marquee20Letter20A_1750879185_big.jpg" alt="Marquee Letters"
129 title="Marquee Letters" style=""></div> </a><div class="io_item2_list_inner io_mm_title"> <a href="https://topeventrental.com/rentals/marquee-letters/"><p class="elementor-heading-title rentNameIO item_name">Marquee Letters</p></a></div></div><div class="io_mm_item_scrolling elementor-widget-heading simpleCart_ioShelfItem" name="maindiv_Bounce_Houses" style="text-align:center"> <a class="item_href" href="https://topeventrental.com/rentals/bounce-houses/"><div class="cat_div"><div class="btn btn-primary view-product-button" style="display:none;">View Products</div> <img decoding="async" class="cat_img item_image" src="https://topeventrental.com/wp-content/uploads/2025/06/Boy20Bounce20House_1750630840_big.png" alt="Bounce Houses"
130 title="Bounce Houses" style=""></div> </a><div class="io_item2_list_inner io_mm_title"> <a href="https://topeventrental.com/rentals/bounce-houses/"><p class="elementor-heading-title rentNameIO item_name">Bounce Houses</p></a></div></div><div class="io_mm_item_scrolling elementor-widget-heading simpleCart_ioShelfItem" name="maindiv_Air_Conditioning_Heating_and_Power" style="text-align:center"> <a class="item_href" href="https://topeventrental.com/rentals/air-conditioning-heating-and-power/"><div class="cat_div"><div class="btn btn-primary view-product-button" style="display:none;">View Products</div> <img decoding="async" class="cat_img item_image" src="https://topeventrental.com/wp-content/uploads/2026/01/Patio20Heater_1769626039_big.png" alt="Air Conditioning, Heating, and Power"
131 title="Air Conditioning, Heating, and Power" style=""></div> </a><div class="io_item2_list_inner io_mm_title"> <a href="https://topeventrental.com/rentals/air-conditioning-heating-and-power/"><p class="elementor-heading-title rentNameIO item_name">Air Conditioning, Heating, and Power</p></a></div></div><div class="io_mm_item_scrolling elementor-widget-heading simpleCart_ioShelfItem" name="maindiv_Crowd_Control" style="text-align:center"> <a class="item_href" href="https://topeventrental.com/rentals/crowd-control/"><div class="cat_div"><div class="btn btn-primary view-product-button" style="display:none;">View Products</div> <img decoding="async" class="cat_img item_image" src="https://topeventrental.com/wp-content/uploads/2026/01/620White20Picket20Fence_1769626070_big.jpg" alt="Crowd Control"
132 title="Crowd Control" style=""></div> </a><div class="io_item2_list_inner io_mm_title"> <a href="https://topeventrental.com/rentals/crowd-control/"><p class="elementor-heading-title rentNameIO item_name">Crowd Control</p></a></div></div><div class="io_mm_item_scrolling elementor-widget-heading simpleCart_ioShelfItem" name="maindiv_Linens" style="text-align:center"> <a class="item_href" href="https://topeventrental.com/rentals/linens/"><div class="cat_div"><div class="btn btn-primary view-product-button" style="display:none;">View Products</div> <img decoding="async" class="cat_img item_image" src="https://topeventrental.com/wp-content/uploads/2025/06/Black20Poly_1750729027_big.jpg" alt="Linens"
133 title="Linens" style=""></div> </a><div class="io_item2_list_inner io_mm_title"> <a href="https://topeventrental.com/rentals/linens/"><p class="elementor-heading-title rentNameIO item_name">Linens</p></a></div></div><div class="io_mm_item_scrolling elementor-widget-heading simpleCart_ioShelfItem" name="maindiv_Ice_Chest_and_Sanitary" style="text-align:center"> <a class="item_href" href="https://topeventrental.com/rentals/ice-chest-and-sanitary/"><div class="cat_div"><div class="btn btn-primary view-product-button" style="display:none;">View Products</div> <img decoding="async" class="cat_img item_image" src="https://topeventrental.com/wp-content/uploads/2025/06/3FT20Igloo20Ice20Chest_1750879045_big.png" alt="Ice Chest and Sanitary"
134 title="Ice Chest and Sanitary" style=""></div> </a><div class="io_item2_list_inner io_mm_title"> <a href="https://topeventrental.com/rentals/ice-chest-and-sanitary/"><p class="elementor-heading-title rentNameIO item_name">Ice Chest and Sanitary</p></a></div></div><div class="io_mm_item_scrolling elementor-widget-heading simpleCart_ioShelfItem" name="maindiv_Slide_and_Bounce_House_Combos" style="text-align:center"> <a class="item_href" href="https://topeventrental.com/rentals/slide-and-bou
134nce-house-combos/"><div class="cat_div"><div class="btn btn-primary view-product-button" style="display:none;">View Products</div> <img decoding="async" class="cat_img item_image" src="https://topeventrental.com/wp-content/uploads/2025/06/720in20120Combo_1750632324_big.jpg" alt="Slide and Bounce House Combos"
135 title="Slide and Bounce House Combos" style=""></div> </a><div class="io_item2_list_inner io_mm_title"> <a href="https://topeventrental.com/rentals/slide-and-bounce-house-combos/"><p class="elementor-heading-title rentNameIO item_name">Slide and Bounce House Combos</p></a></div></div><div class="io_mm_item_scrolling elementor-widget-heading simpleCart_ioShelfItem" name="maindiv_Water_Slides" style="text-align:center"> <a class="item_href" href="https://topeventrental.com/rentals/water-slides/"><div class="cat_div"><div class="btn btn-primary view-product-button" style="display:none;">View Products</div> <img decoding="async" class="cat_img item_image" src="https://topeventrental.com/wp-content/uploads/2025/08/2220Purple20Crush20Water20Slide_1756581404_big.png" alt="Water Slides"
136 title="Water Slides" style=""></div> </a><div class="io_item2_list_inner io_mm_title"> <a href="https://topeventrental.com/rentals/water-slides/"><p class="elementor-heading-title rentNameIO item_name">Water Slides</p></a></div></div><div class="io_mm_item_scrolling elementor-widget-heading simpleCart_ioShelfItem" name="maindiv_Dry_Slides" style="text-align:center"> <a class="item_href" href="https://topeventrental.com/rentals/dry-slides/"><div class="cat_div"><div class="btn btn-primary view-product-button" style="display:none;">View Products</div> <img decoding="async" class="cat_img item_image" src="https://topeventrental.com/wp-content/uploads/2025/06/14FT20H20Dolphin20Water20Slide_1750651454_big.png" alt="Dry Slides"
137 title="Dry Slides" style=""></div> </a><div class="io_item2_list_inner io_mm_title"> <a href="https://topeventrental.com/rentals/dry-slides/"><p class="elementor-heading-title rentNameIO item_name">Dry Slides</p></a></div></div><div class="io_mm_item_scrolling elementor-widget-heading simpleCart_ioShelfItem" name="maindiv_Interactive_Inflatables" style="text-align:center"> <a class="item_href" href="https://topeventrental.com/rentals/interactive-inflatables/"><div class="cat_div"><div class="btn btn-primary view-product-button" style="display:none;">View Products</div> <img decoding="async" class="cat_img item_image" src="https://topeventrental.com/wp-content/uploads/2025/06/Axe20Throwing_1750697431_big.png" alt="Interactive Inflatables"
138 title="Interactive Inflatables" style=""></div> </a><div class="io_item2_list_inner io_mm_title"> <a href="https://topeventrental.com/rentals/interactive-inflatables/"><p class="elementor-heading-title rentNameIO item_name">Interactive Inflatables</p></a></div></div><div class="io_mm_item_scrolling elementor-widget-heading simpleCart_ioShelfItem" name="maindiv_Obstacle_Courses" style="text-align:center"> <a class="item_href" href="https://topeventrental.com/rentals/obstacle-courses/"><div class="cat_div"><div class="btn btn-primary view-product-button" style="display:none;">View Products</div> <img decoding="async" class="cat_img item_image" src="https://topeventrental.com/wp-content/uploads/2025/06/Candy20Land20Obstacle20Course_1750656460_big.jpeg" alt="Obstacle Courses"
139 title="Obstacle Courses" style=""></div> </a><div class="io_item2_list_inner io_mm_title"> <a href="https://topeventrental.com/rentals/obstacle-courses/"><p class="elementor-heading-title rentNameIO item_name">Obstacle Courses</p></a></div></div><div class="io_mm_item_scrolling elementor-widget-heading simpleCart_ioShelfItem" name="maindiv_Holiday_Inflatables" style="text-align:center"> <a class="item_href" href="https://topeventrental.com/rentals/holiday-inflatables/"><div class="cat_div"><div class="btn btn-primary view-product-button" style="display:none;">View Products</div> <img decoding="async" class="cat_img item_image" src="https://topeventrental.com/wp-content/uploads/2025/06/16FT20H20Patriot20Water20Slide_1750652055_big.png" alt="Holiday Inflatables"
140 title="Holiday Inflatables" style=""></div> </a><div class="io_item2_list_inner io_mm_title"> <a href="https://topeventrental.com/rentals/holiday-inflatables/"><p class="elementor-heading-title rentNameIO item_name">Holiday Inflatables</p></a></div></div></div></div>
140<script>jQuery(document).ready(function(){
141                        jQuery('.io_featured_scroll').flickity({
142                          wrapAround: true,
143                          draggable: false,
144                          cellAlign: 'left',
145                          groupCells: true,
146                          lazyLoad: 1,
147                          resize: true
148                        });
149
150                        setTimeout(featuredFlickityRefresh, 500);
151
152                        jQuery('.io_featured_scroll').css('display', 'block')
153
154                        jQuery('.io_featured_scroll .item_image').css('object-fit', 'cover')
155
156                        jQuery('.io_featured_scroll .cat_img').css('object-fit', 'cover')
157
158                        jQuery('.io_mm_item_scrolling .io_item2_list').css('box-shadow', 'none')
159                        jQuery('.io_mm_item_scrolling .io_item2_list').addClass('nohover')
160
161                        jQuery('.io_mm_item_scrolling .io_item2_listcat').css('box-shadow', 'none')
162                        jQuery('.io_mm_item_scrolling .io_item2_listcat').addClass('nohover')
163                    })
164
165                    function featuredFlickityRefresh(){
166                        jQuery('.io_featured_scroll').flickity('resize');
167                    }</script>
167<style>.io_mm_item .io_item2_list, .io_mm_item .io_item2_listcat, .io_mm_item .io_item2_listrent { margin-bottom: 0px !important; }</style></div></div><div class="elementor-element elementor-element-8f714d5 elementor-align-center elementor-widget elementor-widget-button" data-id="8f714d5" 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" href="https://topeventrental.com/rentals/"> <span class="elementor-button-content-wrapper"> <span class="elementor-button-text">Browse Our Products</span> </span> </a></div></div></div></div></div></div></section><section class="elementor-section elementor-top-section elementor-element elementor-element-104dea51 elementor-section-boxed elementor-section-height-default elementor-section-height-default" data-id="104dea51" data-element_type="section" data-e-type="section" data-settings="{&quot;background_background&quot;:&quot;classic&quot;,&quot;shape_divider_top&quot;:&quot;curve&quot;,&quot;shape_divider_bottom&quot;:&quot;curve&quot;}"><div class="elementor-shape elementor-shape-top" aria-hidden="true" data-negative="false"> <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1000 100" preserveAspectRatio="none"> <path class="elementor-shape-fill" d="M1000,4.3V0H0v4.3C0.9,23.1,126.7,99.2,500,100S1000,22.7,1000,4.3z"/> </svg></div><div class="elementor-shape elementor-shape-bottom" aria-hidden="true" data-negative="false"> <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1000 100" preserveAspectRatio="none"> <path class="elementor-shape-fill" d="M1000,4.3V0H0v4.3C0.9,23.1,126.7,99.2,500,100S1000,22.7,1000,4.3z"/> </svg></div><div class="elementor-container elementor-column-gap-default"><div class="elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-4f4b9782" data-id="4f4b9782" data-element_type="column" data-e-type="column"><div class="elementor-widget-wrap elementor-element-populated"><div class="elementor-element elementor-element-f0cc94d elementor-widget elementor-widget-heading" data-id="f0cc94d" 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">What We Do Best</h2></div></div><div class="elementor-element elementor-element-b547254 elementor-widget elementor-widget-heading" data-id="b547254" 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">Serving the state of Arizona and beyond for all your event rental needs</h2></div></div><section class="elementor-section elementor-inner-section elementor-element elementor-element-2eb7e24c elementor-section-boxed elementor-section-height-default elementor-section-height-default" data-id="2eb7e24c" data-element_type="section" data-e-type="section"><div class="elementor-container elementor-column-gap-default"><div class="elementor-column elementor-col-33 elementor-inner-column elementor-element elementor-element-74d445d3 elementor-invisible" data-id="74d445d3" data-element_type="column" data-e-type="column" data-settings="{&quot;background_background&quot;:&quot;classic&quot;,&quot;animation&quot;:&quot;fadeInUp&quot;,&quot;animation_delay&quot;:500}"><div class="elementor-widget-wrap elementor-element-populated"><div class="elementor-element elementor-element-1e94a69c elementor-widget elementor-widget-image" data-id="1e94a69c" data-element_type="widget" data-e-type="widget" data-widget_type="image.default"><div class="elementor-widget-container"> <img decoding="async" width="900" height="600" src="https://topeventrental.com/wp-content/uploads/2025/06/Scottsdale-Culinary-Festival.jpg" class="attachment-large size-large wp-image-6055" alt="Tents for rent scottsdale Tents for rent near me Event rentals Scottsdale, Arizona" srcset="https://topeventrental.com/wp-content/uploads/2025/06/Scottsdale-Culinary-Festival.jpg 900w, https://topeventrental.com/wp-content/uploads/2025/06/Scottsdale-Culinary-Festival-300x200.jpg 300w, https://topeventrental.com/wp-content/uploads/2025/06/Scottsdale-Culinary-Festival-768x512.jpg 768w" sizes="(max-width: 900px) 100v
167w, 900px" /></div></div><div class="elementor-element elementor-element-75bc73a1 elementor-widget elementor-widget-heading" data-id="75bc73a1" 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">Festivals, Concerts &amp; Fairs</h3></div></div></div></div><div class="elementor-column elementor-col-33 elementor-inner-column elementor-element elementor-element-25c5cd43 elementor-invisible" data-id="25c5cd43" data-element_type="column" data-e-type="column" data-settings="{&quot;background_background&quot;:&quot;classic&quot;,&quot;animation&quot;:&quot;fadeInUp&quot;,&quot;animation_delay&quot;:250}"><div class="elementor-widget-wrap elementor-element-populated"><div class="elementor-element elementor-element-7f8b81e9 elementor-widget elementor-widget-image" data-id="7f8b81e9" data-element_type="widget" data-e-type="widget" data-widget_type="image.default"><div class="elementor-widget-container"> <img decoding="async" width="1024" height="918" src="https://topeventrental.com/wp-content/uploads/2025/06/Mesa-High-School-Graduation-1024x918.jpg" class="attachment-large size-large wp-image-5737" alt="Chair rentals mesa arizona event rentals mesa party rentals phoenix" srcset="https://topeventrental.com/wp-content/uploads/2025/06/Mesa-High-School-Graduation-1024x918.jpg 1024w, https://topeventrental.com/wp-content/uploads/2025/06/Mesa-High-School-Graduation-300x269.jpg 300w, https://topeventrental.com/wp-content/uploads/2025/06/Mesa-High-School-Graduation-768x689.jpg 768w, https://topeventrental.com/wp-content/uploads/2025/06/Mesa-High-School-Graduation.jpg 1290w" sizes="(max-width: 1024px) 100vw, 1024px" /></div></div><div class="elementor-element elementor-element-6ea34d5e elementor-widget elementor-widget-heading" data-id="6ea34d5e" 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">Corporate &amp; Government Events</h3></div></div></div></div><div class="elementor-column elementor-col-33 elementor-inner-column elementor-element elementor-element-131a088d elementor-invisible" data-id="131a088d" data-element_type="column" data-e-type="column" data-settings="{&quot;background_background&quot;:&quot;classic&quot;,&quot;animation&quot;:&quot;fadeInUp&quot;}"><div class="elementor-widget-wrap elementor-element-populated"><div class="elementor-element elementor-element-1b278a98 elementor-widget elementor-widget-image" data-id="1b278a98" data-element_type="widget" data-e-type="widget" data-widget_type="image.default"><div class="elementor-widget-container"> <img loading="lazy" decoding="async" width="640" height="512" src="https://topeventrental.com/wp-content/uploads/2026/08/Tent-Rentals-Glendale-Arizona.jpg" class="attachment-large size-large wp-image-22506" alt="Tent Rentals Glendale, Arizona" srcset="https://topeventrental.com/wp-content/uploads/2026/08/Tent-Rentals-Glendale-Arizona.jpg 640w, https://topeventrental.com/wp-content/uploads/2026/08/Tent-Rentals-Glendale-Arizona-300x240.jpg 300w" sizes="(max-width: 640px) 100vw, 640px" /></div></div><div class="elementor-element elementor-element-41fafc73 elementor-widget elementor-widget-heading" data-id="41fafc73" 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">Sporting Events, Weddings &amp; Private Parties</h3></div></div></div></div></div></section></div></div></div></section><section class="elementor-section elementor-top-section elementor-element elementor-element-d0f2a7c elementor-section-boxed elementor-section-height-default elementor-section-height-default" data-id="d0f2a7c" 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-48255ed" data-id="48255ed" data-element_type="column" data-e-type="column"><div class="elementor-widget-wrap elementor-element-populated"><div class="elementor-element elementor-element-e6bdbab elementor-widget elementor-widget-heading" data-id="e6bdbab" 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">
167Trusted By the Best</h2></div></div><div class="elementor-element elementor-element-2acea5d elementor-arrows-position-outside elementor-pagination-position-outside elementor-widget elementor-widget-image-carousel" data-id="2acea5d" data-element_type="widget" data-e-type="widget" data-settings="{&quot;slides_to_show&quot;:&quot;5&quot;,&quot;slides_to_scroll&quot;:&quot;5&quot;,&quot;image_spacing_custom&quot;:{&quot;unit&quot;:&quot;px&quot;,&quot;size&quot;:39,&quot;sizes&quot;:[]},&quot;autoplay_speed&quot;:50500,&quot;speed&quot;:600,&quot;navigation&quot;:&quot;both&quot;,&quot;autoplay&quot;:&quot;yes&quot;,&quot;pause_on_interaction&quot;:&quot;yes&quot;,&quot;infinite&quot;:&quot;yes&quot;,&quot;image_spacing_custom_tablet&quot;:{&quot;unit&quot;:&quot;px&quot;,&quot;size&quot;:&quot;&quot;,&quot;sizes&quot;:[]},&quot;image_spacing_custom_mobile&quot;:{&quot;unit&quot;:&quot;px&quot;,&quot;size&quot;:&quot;&quot;,&quot;sizes&quot;:[]}}" data-widget_type="image-carousel.default"><div class="elementor-widget-container"><div class="elementor-image-carousel-wrapper swiper" role="region" aria-roledescription="carousel" aria-label="Image Carousel" dir="ltr"><div class="elementor-image-carousel swiper-wrapper" aria-live="off"><div class="swiper-slide" role="group" aria-roledescription="slide" aria-label="1 of 35"><figure class="swiper-slide-inner"><img decoding="async" class="swiper-slide-image" src="https://topeventrental.com/wp-content/uploads/2026/01/Logo_NIKE.svg" alt="Nike Event Rentals Phoenix, Arizona" /></figure></div><div class="swiper-slide" role="group" aria-roledescription="slide" aria-label="2 of 35"><figure class="swiper-slide-inner"><img decoding="async" class="swiper-slide-image" src="https://topeventrental.com/wp-content/uploads/2026/01/Phoenix-Childrens-Hospital.png" alt="event rentals phoenix party rentals phoenix" /></figure></div><div class="swiper-slide" role="group" aria-roledescription="slide" aria-label="3 of 35"><figure class="swiper-slide-inner"><img decoding="async" class="swiper-slide-image" src="https://topeventrental.com/wp-content/uploads/2025/06/ASU-logo-scaled.png" alt="College event rentals University event rentals College bounce house rentals" /></figure></div><div class="swiper-slide" role="group" aria-roledescription="slide" aria-label="4 of 35"><figure class="swiper-slide-inner"><img decoding="async" class="swiper-slide-image" src="https://topeventrental.com/wp-content/uploads/2026/01/Logo_of_Glendale_Arizona.svg.png" alt="Parks and Recreations Bounce house rentals glendale arizona" /></figure></div><div class="swiper-slide" role="group" aria-roledescription="slide" aria-label="5 of 35"><figure class="swiper-slide-inner"><img decoding="async" class="swiper-slide-image" src="https://topeventrental.com/wp-content/uploads/2026/01/Chicanos_Por_La_Causa_Logo_2023.png" alt="table and chair rentals phoenix, arizona party rentals near me" /></figure></div><div class="swiper-slide" role="group" aria-roledescription="slide" aria-label="6 of 35"><figure class="swiper-slide-inner"><img decoding="async" class="swiper-slide-image" src="https://topeventrental.com/wp-content/uploads/2026/04/city-of-phoenix-logo.webp" alt="Phoenix Event Rentals Phoenix Water Slide Rentals Phoenix Tent Rentals" /></figure></div><div class="swiper-slide" role="group" aria-roledescription="slide" aria-label="7 of 35"><figure class="swiper-slide-inner"><img decoding="async" class="swiper-slide-image" src="https://topeventrental.com/wp-content/uploads/2026/01/GCU-Logo.jpeg" alt="Bounce house rentals for colleges in arizona" /></figure></div><div class="swiper-slide" role="group" aria-roledescription="slide" aria-label="8 of 35"><figure class="swiper-slide-inner"><img decoding="async" class="swiper-slide-image" src="https://topeventrental.com/wp-content/uploads/2026/04/GY-logo-Letterhead.webp" alt="Goodyear Event Rentals Goodyear Tent Rentals Goodyear Water Slide Rentals" /></figure></div><div class="swiper-slide" role="group" aria-roledescription="slide" aria-label="9 of 35"><figure class="swiper-slide-inner"><img decoding="async" class="swiper-slide-image" src="https://topeventrental.com/wp-content/uploads/2026/04/u-of-a-logo-1.png" alt="Tucson Event Rentals U of A Event Rentals Tucson Water Slide Rentals" /></figure></div><div class="swiper-slide" role="group" aria-roledescription="slide" aria-label="10 of 35"><figure class="swiper-slide-inner"><img decoding="async" class="swiper-slide-image" src="https://topeventrental.com/wp-content/uploads/2026/01/glendale-union-high-school-district-logo.png" alt="bounce house rentals for high schools phoenix, arizona" /></figure></div><div class="swiper-slide" role="group" aria-roledescription="slide" aria-label="11 of 35"><figure class="swiper-slide-inner"><img decoding="async" class="swiper-slide-image" src="https://topeventrental.com/wp-content/uploads/2026/01/city-of-scottsdale-logo.png" alt="city-of-scottsdale-logo" /></figure></div><div class="swiper-slide" role="group" aria-roledescription="slide" aria-label="12 of 35"><figure class="swiper-slide-inner"><img decoding="async" class="swiper-slide-image" src="https://topeventrental.com/wp-content/uploads/2026/02/Colorado_Rockies_full_logo.svg" alt="Event rentals scottsdale" /></figure></div><div class="swiper-slide" role="group" aria-roledescription="slide" aria-label="13 of 35"><figure class="swiper-slide-inner"><img decoding="async" class="swiper-slide-image" src="https://topeventrental.com/wp-content/uploads/2026/01/98.3.png" alt="Party rentals az event rentals az festival rentals phoenix" /></figure></div><div class="swiper-slide" role="group" aria-roledescription="slide" aria-label="14 of 35"><figure class="swiper-slide-inner"><img decoding="async" class="swiper-slide-image" src="https://topeventrental.com/wp-content/uploads/2026/01/Mesa_Public_Schools_logo.png" alt="Event rentals for arizona high schools" /></figure></div><div class="swiper-slide" role="group" aria-roledescription="slide" aria-label="15 of 35"><figure class="swiper-slide-inner"><img decoding="async" class="swiper-slide-image" src="https://topeventrental.com/wp-content/uploads/2026/01/Sprouts_Farmers_Market_Logo.png" alt="Corporate event rentals" /></figure></div><div class="swiper-slide" role="group" aria-roledescription="slide" aria-label="16 of 35"><figure class="swiper-slide-inner"><img decoding="async" class="swiper-slide-image" src="https://topeventrental.com/wp-content/uploads/2026/07/Buc-ees-Logo-1-scaled.jpg" alt="Arizona event rentals Arizona Party rentals" /></figure></div><div class="swiper-slide" role="group" aria-roledescription="slide" aria-label="17 of 35"><figure class="swiper-slide-inner"><img decoding="async" class="swiper-slide-image" src="https://topeventrental.com/wp-content/uploads/2026/01/City-of-Buckeye-Logo.png" alt="event rentals for festivals arizona" /></figure></div><div class="swiper-slide" role="group" aria-roledescription="slide" aria-label="18 of 35"><figure class="swiper-slide-inner"><img decoding="async" class="swiper-slide-image" src="https://topeventrental.com/wp-content/uploads/2026/01/DPHX-vert-logo-2.webp" alt="Church event rentals" /></figure></div><div class="swiper-slide" role="group" aria-roledescription="slide" aria-label="19 of 35"><figure class="swiper-slide-inner"><img decoding="async" class="swiper-slide-image" src="https://topeventrental.com/wp-content/uploads/2026/01/Peoria_Unified_School_District_Arizona.png" alt="graduation party rentals" /></figure></div><div class="swiper-slide" role="group" aria-roledescription="slide" aria-label="20 of 35"><figure class="swiper-slide-inner"><img decoding="async" class="swiper-slide-image" src="https://topeventrental.com/wp-content/uploads/2025/06/race145985-logo-0.bKng6u.png" alt="table and chair rentals tempe tent rentals phoenix marquee letter rentals" /></figure></div><div class="swiper-slide" role="group" aria-roledescription="slide" aria-label="21 of 35"><figure class="swiper-slide-inner"><img decoding="async" class="swiper-slide-image" src="https://topeventrental.com/wp-content/uploads/2026/01/City-of-Avondale-Logo-.png" alt="Festival event rentals phoenix, arizona" /></figure></div><div class="swiper-slide" role="group" aria-roledescription="slide" aria-label="22 of 35"><figure class="swiper-slide-inner"><img decoding="async" class="swiper-slide-image" src="https://topeventrental.com/wp-content/uploads/2025/06/404102-cover-29g4q03nb82g1744922713-1200.jpeg" alt="404102-cover-29g4q03nb82g1744922713-1200" /></figure></div><div class="swiper-slide" role="group" aria-roledescription="slide" aria-label="23 of 35"><figure class="swiper-slide-inner"><img decoding="async" class="swiper-slide-image" src="https://topeventrental.com/wp-content/uploads/2026/07/Reggae-Fest-Logo-3.webp" alt="Tent rentals tempe tempe festival rentals tempe event rentals" /></figure></div><div class="swiper-slide" role="group" aria-roledescription="slide" aria-label="24 of 35"><figure class="swiper-slide-inner"><img decoding="async" class="swiper-slide-image" src="https://topeventrental.com/wp-content/uploads/2026/01/West-Valley-Mavericks-Logo-03.webp" alt="West-Valley-Mavericks-Logo-03" /></figure></div><div class="swiper-slide" role="group" aria-roledescription="slide" aria-label="25 of 35"><figure class="swiper-slide-inner"><img decoding="async" class="swiper-slide-image" src="https://topeventrental.com/wp-content/uploads/2025/06/chrome_y7E8MZzTBm.png" alt="chrome_y7E8MZzTBm" /></figure></div><div class="swiper-slide" role="group" aria-roledescription="slide" aria-label="26 of 35"><figure class="swiper-slide-inner"><img decoding="async" class="swiper-slide-image" src="https://topeventrental.com/wp-content/uploads/2026/01/El-Mirage_57c7b75b-0332-435d-a2c7-7d8efc05a589.png" alt="El Mirage_57c7b75b-0332-435d-a2c7-7d8efc05a589" /></figure></div><div class="swiper-slide" role="group" aria-roledescription="slide" aria-label="27 of 35"><figure class="swiper-slide-inner"><img decoding="async" class="swiper-slide-image" src="https://topeventrental.com/wp-content/uploads/2026/01/pfa-logo.jpeg" alt="pfa-logo" /></figure></div><div class="swiper-slide" role="group" aria-roledescription="slide" aria-label="28 of 35"><figure class="swiper-slide-inner"><img decoding="async" class="swiper-slide-image" src="https://topeventrental.com/wp-content/uploads/2026/01/Wickenburg-Logo-1.png" alt="Wickenburg-Logo" /></figure></div><div class="swiper-slide" role="group" aria-roledescription="slide" aria-label="29 of 35"><figure class="swiper-slide-inner"><img decoding="async" class="swiper-slide-image" src="https://topeventrental.com/wp-content/uploads/2026/04/sundt-logo-1.png" alt="Tent Rentals Phoenix Construction Tent Rentals Phoenix Event Rentals Gilbert" /></figure></div><div class="swiper-slide" role="group" aria-roledescription="slide" aria-label="30 of 35"><figure class="swiper-slide-inner"><img decoding="async" class="swiper-slide-image" src="https://topeventrental.com/wp-content/uploads/2026/01/HeatedSole_SpaceJam_logo_75232329-ffaf-4994-82c9-4a65895fa736.webp" alt="party rentals phoenix, arizona" /></figure></div><div class="swiper-slide" role="group" aria-roledescription="slide" aria-label="31 of 35"><figure class="swiper-slide-inner"><img decoding="async" class="swiper-slide-image" src="https://topeventrental.com/wp-content/uploads/2026/02/Milwaukee_Brewers_logo.svg.png" alt="Stadium event rentals party rentals phoenix" /></figure></div><div class="swiper-slide" role="group" aria-roledescription="slide" aria-label="32 of 35"><figure class="swiper-slide-inner"><img decoding="async" class="swiper-slide-image" src="https://topeventrental.com/wp-content/uploads/2026/04/american-cancer-society-logo.png" alt="Tempe Event Rentals Tempe Water Slide Rentals Phoenix Tent Rentals" /></figure></div><div class="swiper-slide" role="group" aria-roledescription="slide" aria-label="33 of 35"><figure class="swiper-slide-inner"><img decoding="async" class="swiper-slide-image" src="https://topeventrental.com/wp-content/uploads/2026/07/Better_Business_Bureau.svg" alt="Phoenix Event rentals Phoenix party rentals" /></figure></div><div class="swiper-slide" role="group" aria-roledescription="slide" aria-label="34 of 35"><figure class="swiper-slide-inner"><img decoding="async" class="swiper-slide-image" src="https://topeventrental.com/wp-content/uploads/2026/07/CUW-Logo.png" alt="Table and Chair Rentals Tent rentals" /></figure></div><div class="swiper-slide" role="group" aria-roledescription="slide" aria-label="35 of 35"><figure class="swiper-slide-inner"><img decoding="async" class="swiper-slide-image" src="https://topeventrental.com/wp-content/uploads/2026/10/Proud-member-logo_Member-2026.png" alt="Proud member logo_Member 2026" /></figure></div></div><div class="elementor-swiper-button elementor-swiper-button-prev" role="button" tabindex="0"> <i aria-hidden="true" class="eicon-chevron-left"></i></div><div class="elementor-swiper-button elementor-swiper-button-next" role="button" tabindex="0"> <i aria-hidden="true" class="eicon-chevron-right"></i></div><div class="swiper-pagination"></div></div></div></div></div></div></div></section><section class="elementor-section elementor-top-section elementor-element elementor-element-172b3bd1 elementor-section-boxed elementor-section-height-default elementor-section-height-default" data-id="172b3bd1" data-element_type="section" data-e-type="section" data-settings="{&quot;background_background&quot;:&quot;classic&quot;,&quot;shape_divider_top&quot;:&quot;curve&quot;}"><div class="elementor-shape elementor-shape-top" aria-hidden="true" data-negative="false"> <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1000 100" preserveAspectRatio="none"> <path class="elementor-shape-fill" d="M1000,4.3V0H0v4.3C0.9,23.1,126.7,99.2,500,100S1000,22.7,1000,4.3z"/> </svg></div><div class="elementor-container elementor-column-gap-default"><div class="elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-4837ea30" data-id="4837ea30" data-element_type="column" data-e-type="column"><div class="elementor-widget-wrap elementor-element-populated"><div class="elementor-element elementor-element-148ad091 elementor-widget elementor-widget-heading" data-id="148ad091" 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">Event and Party Rentals Phoenix</h2></div></div><div class="elementor-element elementor-element-338ba80 elementor-skin-slideshow elementor-arrows-yes elementor-widget elementor-widget-media-carousel" data-id="338ba80" data-element_type="widget" data-e-type="widget" data-settings="{&quot;skin&quot;:&quot;slideshow&quot;,&quot;slideshow_slides_per_view_mobile&quot;:&quot;2&quot;,&quot;effect&quot;:&quot;slide&quot;,&quot;show_arrows&quot;:&quot;yes&quot;,&quot;speed&quot;:500,&quot;autoplay&quot;:&quot;yes&quot;,&quot;autoplay_speed&quot;:5000,&quot;loop&quot;:&quot;yes&quot;,&quot;pause_on_hover&quot;:&quot;yes&quot;,&quot;pause_on_interaction&quot;:&quot;yes&quot;,&quot;space_between&quot;:{&quot;unit&quot;:&quot;px&quot;,&quot;size&quot;:10,&quot;sizes&quot;:[]},&quot;space_between_tablet&quot;:{&quot;unit&quot;:&quot;px&quot;,&quot;size&quot;:10,&quot;sizes&quot;:[]},&quot;space_between_mobile&quot;:{&quot;unit&quot;:&quot;px&quot;,&quot;size&quot;:10,&quot;sizes&quot;:[]}}" data-widget_type="media-carousel.default"><div class="elementor-widget-container"><div class="elementor-swiper"><div class="elementor-main-swiper swiper" role="region" aria-roledescription="carousel" aria-label="Slides"><div class="swiper-wrapper"><div class="swiper-slide" role="group" aria-roledescription="slide"> <a href="https://topeventrental.com/rentals/chairs/">
167<div class="elementor-carousel-image" role="img" aria-label="Chair Rentals - Phoenix, Arizona Scottsdale" style="background-image: url(&#039;https://topeventrental.com/wp-content/uploads/2026/02/Chair-Rentals-Phoenix-Arizona-Scottsdale.jpg&#039;)"></div> </a></div><div class="swiper-slide" role="group" aria-roledescription="slide"> <a href="https://topeventrental.com/rentals/chairs/"><div class="elementor-carousel-image" role="img" aria-label="Biltmore Table and Chair Rentals Phoenix and Scottsdale" style="background-image: url(&#039;https://topeventrental.com/wp-content/uploads/2026/02/Biltmore-Table-and-Chair-Rentals-Phoenix-and-Scottsdale.jpg&#039;)"></div> </a></div><div class="swiper-slide" role="group" aria-roledescription="slide"> <a href="https://topeventrental.com/rentals/tents-and-accessories/"><div class="elementor-carousel-image" role="img" aria-label="Festival Tent rentals phoenix, arizona" style="background-image: url(&#039;https://topeventrental.com/wp-content/uploads/2026/02/Festival-Tent-rentals-phoenix-arizona.jpg&#039;)"></div> </a></div><div class="swiper-slide" role="group" aria-roledescription="slide"> <a href="https://topeventrental.com/rentals/chairs/black-resin-chair/"><div class="elementor-carousel-image" role="img" aria-label="Wedding Rentals Near Me, Wedding Rentals Phoenix, Wedding Rentals Glendale" style="background-image: url(&#039;https://topeventrental.com/wp-content/uploads/2026/01/Resin-Chair-Rental-Tempe.png&#039;)"></div> </a></div><div class="swiper-slide" role="group" aria-roledescription="slide"> <a href="https://reggaeriseup.com/arizona/" target="_blank" rel="noopener"><div class="elementor-carousel-image" role="img" aria-label="Tent Rental Tempe, Az Tent Rentals Phoenix, Az Event Rentals Phoenix" style="background-image: url(&#039;https://topeventrental.com/wp-content/uploads/2026/04/IMG_0383-scaled.jpeg&#039;)"></div> </a></div><div class="swiper-slide" role="group" aria-roledescription="slide"> <a href="https://topeventrental.com/rentals/crowd-control/"><div class="elementor-carousel-image" role="img" aria-label="Goodyear Holiday Beer Garden event rentals" style="background-image: url(&#039;https://topeventrental.com/wp-content/uploads/2026/02/Goodyear-Holiday-Beer-Garden-event-rentals.png&#039;)"></div> </a></div><div class="swiper-slide" role="group" aria-roledescription="slide"> <a href="https://topeventrental.com/rentals/dance-floors-and-stages/"><div class="elementor-carousel-image" role="img" aria-label="Dance floor rentals near me dance floor rentals phoenix, arizona dance floor rentals scottsdale" style="background-image: url(&#039;https://topeventrental.com/wp-content/uploads/2026/02/32-x-32-Dance-Floor-Rental-Phoenix.png&#039;)"></div> </a></div><div class="swiper-slide" role="group" aria-roledescription="slide"> <a href="https://topeventrental.com/rentals/interactive-inflatables/"><div class="elementor-carousel-image" role="img" aria-label="ASU Inflatables bounce house rentals tempe, arizona" style="background-image: url(&#039;https://topeventrental.com/wp-content/uploads/2026/02/ASU-Inflatables-bounce-house-rentals-tempe-arizona-scaled.jpg&#039;)"></div> </a></div><div class="swiper-slide" role="group" aria-roledescription="slide"><div class="elementor-carousel-image" role="img" aria-label="Tent Rentals Sacaton, Arizona" style="background-image: url(&#039;https://topeventrental.com/wp-content/uploads/2026/03/Tent-Rentals-Sacaton-Arizona-scaled.jpeg&#039;)"></div></div><div class="swiper-slide" role="group" aria-roledescription="slide"> <a href="https://topeventrental.com/inflatables/"><div class="elementor-carousel-image" role="img" aria-label="Goodyear Obstacle Course bounce house rentals arizona" style="background-image: url(&#039;https://topeventrental.com/wp-content/uploads/2026/02/Goodyear-Obstacle-Course-bounce-house-rentals-arizona-scaled.jpg&#039;)"></div> </a></div><div class="swiper-slide" role="group" aria-roledescription="slide"> <a href="https://topeventrental.com/rentals/tents-and-accessories/"><div class="elementor-carousel-image" role="img" aria-label="tent rentals phoenix tents for rent tempe party tents for rent near me" style="background-image: url(&#039;https://topeventrental.com/wp-content/uploads/2026/02/phoenix-festival-
167of-the-arts-tent-rentals-phoenix.webp&#039;)"></div> </a></div><div class="swiper-slide" role="group" aria-roledescription="slide"> <a href="https://topeventrental.com/rentals/tents-and-accessories/"><div class="elementor-carousel-image" role="img" aria-label="Festival Tent Rentals Phoenix" style="background-image: url(&#039;https://topeventrental.com/wp-content/uploads/2026/02/Festival-Tent-Rentals-Phoenix.webp&#039;)"></div> </a></div><div class="swiper-slide" role="group" aria-roledescription="slide"> <a href="https://topeventrental.com/rentals/chairs/"><div class="elementor-carousel-image" role="img" aria-label="party rentals arizona event rentals Arizona party rentals phoenix event rentals phoenix" style="background-image: url(&#039;https://topeventrental.com/wp-content/uploads/2026/02/Firefighter-Christmas-Party-rentals-arizona-.png&#039;)"></div> </a></div><div class="swiper-slide" role="group" aria-roledescription="slide"> <a href="https://topeventrental.com/about-us/"><div class="elementor-carousel-image" role="img" aria-label="Event rentals near me event rentals phoenix arizona event rentals goodyear" style="background-image: url(&#039;https://topeventrental.com/wp-content/uploads/2026/02/Goodyear-Lakeside-Music-Festival-event-rentals.png&#039;)"></div> </a></div><div class="swiper-slide" role="group" aria-roledescription="slide"> <a href="https://topeventrental.com/rentals/water-slides/"><div class="elementor-carousel-image" role="img" aria-label="water slide rentals phoenix water slide rentals peoria, Arizona Party rentals near me event rentals near me" style="background-image: url(&#039;https://topeventrental.com/wp-content/uploads/2026/02/Bellair-Golf-Park-Water-Slide-rentals-event-rentals-arizona.jpg&#039;)"></div> </a></div><div class="swiper-slide" role="group" aria-roledescription="slide"> <a href="https://topeventrental.com/rentals/chairs/"><div class="elementor-carousel-image" role="img" aria-label="Scottsdale Speech chair rentals phoenix, Arizona" style="background-image: url(&#039;https://topeventrental.com/wp-content/uploads/2026/02/Scottsdale-Speech-chair-rentals-phoenix-Arizona.png&#039;)"></div> </a></div><div class="swiper-slide" role="group" aria-roledescription="slide"> <a href="https://topeventrental.com/contact-us/"><div class="elementor-carousel-image" role="img" aria-label="ASU Homecoming Aerial event rentals tempe, Arizona" style="background-image: url(&#039;https://topeventrental.com/wp-content/uploads/2026/02/ASU-Homecoming-Aerial-event-rentals-tempe-Arizona.png&#039;)"></div> </a></div><div class="swiper-slide" role="group" aria-roledescription="slide"> <a href="https://topeventrental.com/rentals/slide-and-bounce-house-combos/"><div class="elementor-carousel-image" role="img" aria-label="Bounce house rentals phoenix Bounce House rentals near me Bounce House Rentals Goodyear" style="background-image: url(&#039;https://topeventrental.com/wp-content/uploads/2026/02/Goodyear-Bounce-House-Rentals-and-Event-Rentals-scaled.jpg&#039;)"></div> </a></div><div class="swiper-slide" role="group" aria-roledescription="slide"> <a href="https://topeventrental.com/rentals/tents-and-accessories/10-x-10-event-tent/"><div class="elementor-carousel-image" role="img" aria-label="Scottsdale Tent Rentals" style="background-image: url(&#039;https://topeventrental.com/wp-content/uploads/2026/02/Scottsdale-Tent-Rentals.jpg&#039;)"></div> </a></div><div class="swiper-slide" role="group" aria-roledescription="slide"> <a href="https://topeventrental.com/rentals/obstacle-courses/"><div class="elementor-carousel-image" role="img" aria-label="Mavericks Obstacle Course for rent" style="background-image: url(&#039;https://topeventrental.com/wp-content/uploads/2026/02/Mavericks-Obstacle-Course-for-rent.jpg&#039;)"></div> </a></div><div class="swiper-slide" role="group" aria-roledescription="slide"> <a href="https://www.goodyearaz.gov/government/departments/parks-recreation/special-events" target="_blank" rel="noopener"><div class="elementor-carousel-image" role="img" aria-label="Tables and chairs for rent table and chair rentals party rentals phoenix" style="background-image: url(&#039;https://topeventrental.com/wp-content/uploads/2026/01/2025-12-26.webp&#039;)"></div> </a></div><div class="swiper-slide" role="group" aria-roledescription="slide"> <a href="https://topeventrental.com/rentals/tents-and-accessories/">
167<div class="elementor-carousel-image" role="img" aria-label="Tent rental Phoenix, Arizona Tent Rentals tempe Event rentals near me" style="background-image: url(&#039;https://topeventrental.com/wp-content/uploads/2026/03/Tent-Rentals-Arizona-FOODIELAND-scaled.jpeg&#039;)"></div> </a></div><div class="swiper-slide" role="group" aria-roledescription="slide"> <a href="https://topeventrental.com/rentals/marquee-letters/"><div class="elementor-carousel-image" role="img" aria-label="Karime Marquee Letter rentals phoenix arizona" style="background-image: url(&#039;https://topeventrental.com/wp-content/uploads/2026/02/Karime-Marquee-Letter-rentals-phoenix-arizona.jpg&#039;)"></div> </a></div><div class="swiper-slide" role="group" aria-roledescription="slide"> <a href="https://topeventrental.com/rentals/tents-and-accessories/"><div class="elementor-carousel-image" role="img" aria-label="Goodyear Sign Tent Rentals" style="background-image: url(&#039;https://topeventrental.com/wp-content/uploads/2026/02/Goodyear-Sign-Tent-Rentals-scaled.jpg&#039;)"></div> </a></div><div class="swiper-slide" role="group" aria-roledescription="slide"> <a href="https://topeventrental.com/rentals/chairs/"><div class="elementor-carousel-image" role="img" aria-label="Political Rally Chair Rentals Scottsdale" style="background-image: url(&#039;https://topeventrental.com/wp-content/uploads/2026/02/Political-Rally-Chair-Rentals-Scottsdale.png&#039;)"></div> </a></div><div class="swiper-slide" role="group" aria-roledescription="slide"> <a href="https://topeventrental.com/"><div class="elementor-carousel-image" role="img" aria-label="Party rentals near me event rentals near me party rentals phoenix, arizona" style="background-image: url(&#039;https://topeventrental.com/wp-content/uploads/2026/02/Satyr-Entertainment-x-Top-Event-Rentals-Tent-rentals-near-me.webp&#039;)"></div> </a></div><div class="swiper-slide" role="group" aria-roledescription="slide"> <a href="https://www.gcu.edu/" target="_blank" rel="noopener"><div class="elementor-carousel-image" role="img" aria-label="Tents for rent phoenix, Arizona Tent rentals glendale party rentals near me" style="background-image: url(&#039;https://topeventrental.com/wp-content/uploads/2026/01/2025-12-30.webp&#039;)"></div> </a></div><div class="swiper-slide" role="group" aria-roledescription="slide"> <a href="https://topeventrental.com/rentals/tents-and-accessories/40-x-100-event-tent/"><div class="elementor-carousel-image" role="img" aria-label="Big wedding tent rentals arizona Arizona tents and events Pro EM Tent rentals" style="background-image: url(&#039;https://topeventrental.com/wp-content/uploads/2026/01/2025-09-25.webp&#039;)"></div> </a></div><div class="swiper-slide" role="group" aria-roledescription="slide"> <a href="https://secure.acsevents.org/site/STR?pg=entry&#038;fr_id=112402" target="_blank" rel="noopener"><div class="elementor-carousel-image" role="img" aria-label="Event rentals table and chair rentals phoenix party rentals phoenix, arizona" style="background-image: url(&#039;https://topeventrental.com/wp-content/uploads/2026/01/2025-06-25.webp&#039;)"></div> </a></div><div class="swiper-slide" role="group" aria-roledescription="slide"> <a href="https://www.desertdiamondarena.com/" target="_blank" rel="noopener"><div class="elementor-carousel-image" role="img" aria-label="Chair Rentals in Phoenix, Arizona Table Rentals in Phoenix, Arizona Event Rentals in Phoenix, Arizona" style="background-image: url(&#039;https://topeventrental.com/wp-content/uploads/2026/02/Black-Resin-Chair-Conference.png&#039;)"></div> </a></div><div class="swiper-slide" role="group" aria-roledescription="slide"><div class="elementor-carousel-image" role="img" aria-label="Tent Rentals phoenix Party rentals phoenix" style="background-image: url(&#039;https://topeventrental.com/wp-content/uploads/2026/07/Crybaby-watch-party-tent-rental-phoenix-arizona.jpg&#039;)"></div></div><div class="swiper-slide" role="group" aria-roledescription="slide"><div class="elementor-carousel-image" role="img" aria-label="Bounce House Rental Goodyear, Az Tent Rental Goodyear, Az Party Rentals Goodyear, Arizona" style="background-image: url(&#039;
167https://topeventrental.com/wp-content/uploads/2026/05/DJI_20260403192633_0628_D-scaled-e1781643694116.jpeg&#039;)"></div></div><div class="swiper-slide" role="group" aria-roledescription="slide"><div class="elementor-carousel-image" role="img" aria-label="Dance Floor Mesa, Arizona Dance Floor Phoenix, Arizona Event Rentals Phoenix" style="background-image: url(&#039;https://topeventrental.com/wp-content/uploads/2026/04/IMG_1854-scaled.jpeg&#039;)"></div></div><div class="swiper-slide" role="group" aria-roledescription="slide"><div class="elementor-carousel-image" role="img" aria-label="Marquee letter rental phoenix, arizona event rental phoenix, arizona party rental tempe, arizon" style="background-image: url(&#039;https://topeventrental.com/wp-content/uploads/2026/05/IMG_0123.jpeg&#039;)"></div></div><div class="swiper-slide" role="group" aria-roledescription="slide"><div class="elementor-carousel-image" role="img" aria-label="Dance floor rental phoenix, arizona event rental phoenix, arizona party rental tempe, arizona" style="background-image: url(&#039;https://topeventrental.com/wp-content/uploads/2026/05/IMG_3034-scaled.jpeg&#039;)"></div></div><div class="swiper-slide" role="group" aria-roledescription="slide"><div class="elementor-carousel-image" role="img" aria-label="Table and chair rentals phoenix party rentals phoenix party rentals goodyear" style="background-image: url(&#039;https://topeventrental.com/wp-content/uploads/2026/05/Table-and-chair-rentals-near-me-scaled.jpg&#039;)"></div></div><div class="swiper-slide" role="group" aria-roledescription="slide"><div class="elementor-carousel-image" role="img" aria-label="Phoenix tent rentals phoenix chair rentals phoenix party rentals" style="background-image: url(&#039;https://topeventrental.com/wp-content/uploads/2026/08/Phoenix-Event-Rentals.jpg&#039;)"></div></div><div class="swiper-slide" role="group" aria-roledescription="slide"><div class="elementor-carousel-image" role="img" aria-label="Goodyear event rentals" style="background-image: url(&#039;https://topeventrental.com/wp-content/uploads/2026/08/Goodyear-event-rentals.jpg&#039;)"></div></div></div><div class="elementor-swiper-button elementor-swiper-button-prev" role="button" tabindex="0" aria-label="Previous"> <i aria-hidden="true" class="eicon-chevron-left"></i></div><div class="elementor-swiper-button elementor-swiper-button-next" role="button" tabindex="0" aria-label="Next"> <i aria-hidden="true" class="eicon-chevron-right"></i></div></div></div><div class="elementor-swiper"><div class="elementor-main-swiper swiper elementor-thumbnails-swiper swiper" role="region region" aria-roledescription="carousel carousel" aria-label="Slides Slides"><div class="swiper-wrapper"><div class="swiper-slide" role="group" aria-roledescription="slide"><div class="elementor-carousel-image" role="img" aria-label="Chair Rentals - Phoenix, Arizona Scottsdale" style="background-image: url(&#039;https://topeventrental.com/wp-content/uploads/2026/02/Chair-Rentals-Phoenix-Arizona-Scottsdale.jpg&#039;)"></div> </a></div><div class="swiper-slide" role="group" aria-roledescription="slide"><div class="elementor-carousel-image" role="img" aria-label="Biltmore Table and Chair Rentals Phoenix and Scottsdale" style="background-image: url(&#039;https://topeventrental.com/wp-content/uploads/2026/02/Biltmore-Table-and-Chair-Rentals-Phoenix-and-Scottsdale.jpg&#039;)"></div> </a></div><div class="swiper-slide" role="group" aria-roledescription="slide"><div class="elementor-carousel-image" role="img" aria-label="Festival Tent rentals phoenix, arizona" style="background-image: url(&#039;https://topeventrental.com/wp-content/uploads/2026/02/Festival-Tent-rentals-phoenix-arizona.jpg&#039;)"></div> </a></div><div class="swiper-slide" role="group" aria-roledescription="slide"><div class="elementor-carousel-image" role="img" aria-label="Wedding Rentals Near Me, Wedding Rentals Phoenix, Wedding Rentals Glendale" style="background-image: url(&#039;https://topeventrental.com/wp-content/uploads/2026/01/Resin-Chair-Rental-Tempe.png&#039;)"></div> </a></div><div class="swiper-slide" role="group" aria-roledescription="slide">
167<div class="elementor-carousel-image" role="img" aria-label="Tent Rental Tempe, Az Tent Rentals Phoenix, Az Event Rentals Phoenix" style="background-image: url(&#039;https://topeventrental.com/wp-content/uploads/2026/04/IMG_0383-scaled.jpeg&#039;)"></div> </a></div><div class="swiper-slide" role="group" aria-roledescription="slide"><div class="elementor-carousel-image" role="img" aria-label="Goodyear Holiday Beer Garden event rentals" style="background-image: url(&#039;https://topeventrental.com/wp-content/uploads/2026/02/Goodyear-Holiday-Beer-Garden-event-rentals.png&#039;)"></div> </a></div><div class="swiper-slide" role="group" aria-roledescription="slide"><div class="elementor-carousel-image" role="img" aria-label="Dance floor rentals near me dance floor rentals phoenix, arizona dance floor rentals scottsdale" style="background-image: url(&#039;https://topeventrental.com/wp-content/uploads/2026/02/32-x-32-Dance-Floor-Rental-Phoenix.png&#039;)"></div> </a></div><div class="swiper-slide" role="group" aria-roledescription="slide"><div class="elementor-carousel-image" role="img" aria-label="ASU Inflatables bounce house rentals tempe, arizona" style="background-image: url(&#039;https://topeventrental.com/wp-content/uploads/2026/02/ASU-Inflatables-bounce-house-rentals-tempe-arizona-scaled.jpg&#039;)"></div> </a></div><div class="swiper-slide" role="group" aria-roledescription="slide"><div class="elementor-carousel-image" role="img" aria-label="Tent Rentals Sacaton, Arizona" style="background-image: url(&#039;https://topeventrental.com/wp-content/uploads/2026/03/Tent-Rentals-Sacaton-Arizona-scaled.jpeg&#039;)"></div></div><div class="swiper-slide" role="group" aria-roledescription="slide"><div class="elementor-carousel-image" role="img" aria-label="Goodyear Obstacle Course bounce house rentals arizona" style="background-image: url(&#039;https://topeventrental.com/wp-content/uploads/2026/02/Goodyear-Obstacle-Course-bounce-house-rentals-arizona-scaled.jpg&#039;)"></div> </a></div><div class="swiper-slide" role="group" aria-roledescription="slide"><div class="elementor-carousel-image" role="img" aria-label="tent rentals phoenix tents for rent tempe party tents for rent near me" style="background-image: url(&#039;https://topeventrental.com/wp-content/uploads/2026/02/phoenix-festival-of-the-arts-tent-rentals-phoenix.webp&#039;)"></div> </a></div><div class="swiper-slide" role="group" aria-roledescription="slide"><div class="elementor-carousel-image" role="img" aria-label="Festival Tent Rentals Phoenix" style="background-image: url(&#039;https://topeventrental.com/wp-content/uploads/2026/02/Festival-Tent-Rentals-Phoenix.webp&#039;)"></div> </a></div><div class="swiper-slide" role="group" aria-roledescription="slide"><div class="elementor-carousel-image" role="img" aria-label="party rentals arizona event rentals Arizona party rentals phoenix event rentals phoenix" style="background-image: url(&#039;https://topeventrental.com/wp-content/uploads/2026/02/Firefighter-Christmas-Party-rentals-arizona-.png&#039;)"></div> </a></div><div class="swiper-slide" role="group" aria-roledescription="slide"><div class="elementor-carousel-image" role="img" aria-label="Event rentals near me event rentals phoenix arizona event rentals goodyear" style="background-image: url(&#039;https://topeventrental.com/wp-content/uploads/2026/02/Goodyear-Lakeside-Music-Festival-event-rentals.png&#039;)"></div> </a></div><div class="swiper-slide" role="group" aria-roledescription="slide"><div class="elementor-carousel-image" role="img" aria-label="water slide rentals phoenix water slide rentals peoria, Arizona Party rentals near me event rentals near me" style="background-image: url(&#039;https://topeventrental.com/wp-content/uploads/2026/02/Bellair-Golf-Park-Water-Slide-rentals-event-rentals-arizona.jpg&#039;)"></div> </a></div><div class="swiper-slide" role="group" aria-roledescription="slide"><div class="elementor-carousel-image" role="img" aria-label="Scottsdale Speech chair rentals phoenix, Arizona" style="background-image: url(&#039;https://topeventrental.com/wp-content/uploads/2026/02/Scottsdale-Speech-chair-rentals-phoenix-Arizona.png&#039;)"></div> </a></div><div class="swiper-slide" role="group" aria-roledescription="slide">
167<div class="elementor-carousel-image" role="img" aria-label="ASU Homecoming Aerial event rentals tempe, Arizona" style="background-image: url(&#039;https://topeventrental.com/wp-content/uploads/2026/02/ASU-Homecoming-Aerial-event-rentals-tempe-Arizona.png&#039;)"></div> </a></div><div class="swiper-slide" role="group" aria-roledescription="slide"><div class="elementor-carousel-image" role="img" aria-label="Bounce house rentals phoenix Bounce House rentals near me Bounce House Rentals Goodyear" style="background-image: url(&#039;https://topeventrental.com/wp-content/uploads/2026/02/Goodyear-Bounce-House-Rentals-and-Event-Rentals-scaled.jpg&#039;)"></div> </a></div><div class="swiper-slide" role="group" aria-roledescription="slide"><div class="elementor-carousel-image" role="img" aria-label="Scottsdale Tent Rentals" style="background-image: url(&#039;https://topeventrental.com/wp-content/uploads/2026/02/Scottsdale-Tent-Rentals.jpg&#039;)"></div> </a></div><div class="swiper-slide" role="group" aria-roledescription="slide"><div class="elementor-carousel-image" role="img" aria-label="Mavericks Obstacle Course for rent" style="background-image: url(&#039;https://topeventrental.com/wp-content/uploads/2026/02/Mavericks-Obstacle-Course-for-rent.jpg&#039;)"></div> </a></div><div class="swiper-slide" role="group" aria-roledescription="slide"><div class="elementor-carousel-image" role="img" aria-label="Tables and chairs for rent table and chair rentals party rentals phoenix" style="background-image: url(&#039;https://topeventrental.com/wp-content/uploads/2026/01/2025-12-26.webp&#039;)"></div> </a></div><div class="swiper-slide" role="group" aria-roledescription="slide"><div class="elementor-carousel-image" role="img" aria-label="Tent rental Phoenix, Arizona Tent Rentals tempe Event rentals near me" style="background-image: url(&#039;https://topeventrental.com/wp-content/uploads/2026/03/Tent-Rentals-Arizona-FOODIELAND-scaled.jpeg&#039;)"></div> </a></div><div class="swiper-slide" role="group" aria-roledescription="slide"><div class="elementor-carousel-image" role="img" aria-label="Karime Marquee Letter rentals phoenix arizona" style="background-image: url(&#039;https://topeventrental.com/wp-content/uploads/2026/02/Karime-Marquee-Letter-rentals-phoenix-arizona.jpg&#039;)"></div> </a></div><div class="swiper-slide" role="group" aria-roledescription="slide"><div class="elementor-carousel-image" role="img" aria-label="Goodyear Sign Tent Rentals" style="background-image: url(&#039;https://topeventrental.com/wp-content/uploads/2026/02/Goodyear-Sign-Tent-Rentals-scaled.jpg&#039;)"></div> </a></div><div class="swiper-slide" role="group" aria-roledescription="slide"><div class="elementor-carousel-image" role="img" aria-label="Political Rally Chair Rentals Scottsdale" style="background-image: url(&#039;https://topeventrental.com/wp-content/uploads/2026/02/Political-Rally-Chair-Rentals-Scottsdale.png&#039;)"></div> </a></div><div class="swiper-slide" role="group" aria-roledescription="slide"><div class="elementor-carousel-image" role="img" aria-label="Party rentals near me event rentals near me party rentals phoenix, arizona" style="background-image: url(&#039;https://topeventrental.com/wp-content/uploads/2026/02/Satyr-Entertainment-x-Top-Event-Rentals-Tent-rentals-near-me.webp&#039;)"></div> </a></div><div class="swiper-slide" role="group" aria-roledescription="slide"><div class="elementor-carousel-image" role="img" aria-label="Tents for rent phoenix, Arizona Tent rentals glendale party rentals near me" style="background-image: url(&#039;https://topeventrental.com/wp-content/uploads/2026/01/2025-12-30.webp&#039;)"></div> </a></div><div class="swiper-slide" role="group" aria-roledescription="slide"><div class="elementor-carousel-image" role="img" aria-label="Big wedding tent rentals arizona Arizona tents and events Pro EM Tent rentals" style="background-image: url(&#039;https://topeventrental.com/wp-content/uploads/2026/01/2025-09-25.webp&#039;)"></div> </a></div><div class="swiper-slide" role="group" aria-roledescription="slide">
167<div class="elementor-carousel-image" role="img" aria-label="Event rentals table and chair rentals phoenix party rentals phoenix, arizona" style="background-image: url(&#039;https://topeventrental.com/wp-content/uploads/2026/01/2025-06-25.webp&#039;)"></div> </a></div><div class="swiper-slide" role="group" aria-roledescription="slide"><div class="elementor-carousel-image" role="img" aria-label="Chair Rentals in Phoenix, Arizona Table Rentals in Phoenix, Arizona Event Rentals in Phoenix, Arizona" style="background-image: url(&#039;https://topeventrental.com/wp-content/uploads/2026/02/Black-Resin-Chair-Conference.png&#039;)"></div> </a></div><div class="swiper-slide" role="group" aria-roledescription="slide"><div class="elementor-carousel-image" role="img" aria-label="Tent Rentals phoenix Party rentals phoenix" style="background-image: url(&#039;https://topeventrental.com/wp-content/uploads/2026/07/Crybaby-watch-party-tent-rental-phoenix-arizona.jpg&#039;)"></div></div><div class="swiper-slide" role="group" aria-roledescription="slide"><div class="elementor-carousel-image" role="img" aria-label="Bounce House Rental Goodyear, Az Tent Rental Goodyear, Az Party Rentals Goodyear, Arizona" style="background-image: url(&#039;https://topeventrental.com/wp-content/uploads/2026/05/DJI_20260403192633_0628_D-scaled-e1781643694116.jpeg&#039;)"></div></div><div class="swiper-slide" role="group" aria-roledescription="slide"><div class="elementor-carousel-image" role="img" aria-label="Dance Floor Mesa, Arizona Dance Floor Phoenix, Arizona Event Rentals Phoenix" style="background-image: url(&#039;https://topeventrental.com/wp-content/uploads/2026/04/IMG_1854-scaled.jpeg&#039;)"></div></div><div class="swiper-slide" role="group" aria-roledescription="slide"><div class="elementor-carousel-image" role="img" aria-label="Marquee letter rental phoenix, arizona event rental phoenix, arizona party rental tempe, arizon" style="background-image: url(&#039;https://topeventrental.com/wp-content/uploads/2026/05/IMG_0123.jpeg&#039;)"></div></div><div class="swiper-slide" role="group" aria-roledescription="slide"><div class="elementor-carousel-image" role="img" aria-label="Dance floor rental phoenix, arizona event rental phoenix, arizona party rental tempe, arizona" style="background-image: url(&#039;https://topeventrental.com/wp-content/uploads/2026/05/IMG_3034-scaled.jpeg&#039;)"></div></div><div class="swiper-slide" role="group" aria-roledescription="slide"><div class="elementor-carousel-image" role="img" aria-label="Table and chair rentals phoenix party rentals phoenix party rentals goodyear" style="background-image: url(&#039;https://topeventrental.com/wp-content/uploads/2026/05/Table-and-chair-rentals-near-me-scaled.jpg&#039;)"></div></div><div class="swiper-slide" role="group" aria-roledescription="slide"><div class="elementor-carousel-image" role="img" aria-label="Phoenix tent rentals phoenix chair rentals phoenix party rentals" style="background-image: url(&#039;https://topeventrental.com/wp-content/uploads/2026/08/Phoenix-Event-Rentals.jpg&#039;)"></div></div><div class="swiper-slide" role="group" aria-roledescription="slide"><div class="elementor-carousel-image" role="img" aria-label="Goodyear event rentals" style="background-image: url(&#039;https://topeventrental.com/wp-content/uploads/2026/08/Goodyear-event-rentals.jpg&#039;)"></div></div></div></div></div></div></div><div class="elementor-element elementor-element-34d6019f elementor-align-center elementor-widget elementor-widget-button" data-id="34d6019f" 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" href="https://topeventrental.com/contact-us/"> <span class="elementor-button-content-wrapper"> <span class="elementor-button-text">Contact Us Here</span> </span> </a></div></div></div></div></div></div></section><section class="elementor-section elementor-top-section elementor-element elementor-element-616647f5 elementor-section-boxed elementor-section-height-default elementor-section-height-default" data-id="616647f5" data-element_type="section" data-e-type="section" 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-23c3756" data-id="23c3756" data-element_type="column" data-e-type="column"><div class="elementor-widget-wrap elementor-element-populated"><div class="elementor-element elementor-element-510b6703 elementor-widget elementor-widget-heading" data-id="510b6703" 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-large">Ready to Bring Your Event Vision to Life?</h2></div></div><div class="elementor-element elementor-element-882e4df elementor-widget elementor-widget-text-editor" data-id="882e4df" data-element_type="widget" data-e-type="widget" data-widget_type="text-editor.default"><div class="elementor-widget-container"><p data-start="368" data-end="557">Booking with Top Event Rentals is quick, easy, and tailored to your needs. Whether you know exactly what you need or want a little help deciding, we’re here to make the process stress-free.</p></div></div><div class="elementor-element elementor-element-0367718 elementor-align-center elementor-widget elementor-widget-button" data-id="0367718" 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" href="#elementor-action%3Aaction%3Dpopup%3Aopen%26settings%3DeyJpZCI6IjYwODAiLCJ0b2dnbGUiOmZhbHNlfQ%3D%3D"> <span class="elementor-button-content-wrapper"> <span class="elementor-button-text">Book Online Now</span> </span> </a></div></div></div></div></div></div></section><section class="elementor-section elementor-top-section elementor-element elementor-element-b46192a elementor-section-boxed elementor-section-height-default elementor-section-height-default" data-id="b46192a" 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-7ea05c3" data-id="7ea05c3" data-element_type="column" data-e-type="column"><div class="elementor-widget-wrap elementor-element-populated"><div class="elementor-element elementor-element-05b945c elementor-widget elementor-widget-io_reviews_widget" data-id="05b945c" data-element_type="widget" data-e-type="widget" data-widget_type="io_reviews_widget.default"><div class="elementor-widget-container"><div class="io-reviews-header"><div style="display: flex; justify-content: space-around; align-items: flex-start; margin-top: 1.5em; padding-bottom: .75em;"><div style="display: flex; flex-direction: column; align-items: center; margin-left: 10ch; margin-top:.35rem "><div style="display: flex; align-items: center; justify-content: center;"> <img decoding="async" src="https://topeventrental.com/wp-content/plugins/inflatableoffice/assets/images/google_logo.png" alt="Google Logo" style="width: 8rem; height: 2rem; margin-right: 0.5em; margin-top:.2rem"></div><div style="display: flex; align-items: center; justify-content: center; margin-top: 0.45em;"> <span style="font-size: 1.25em;">5.0</span> <span style="margin-left: 0.5em;"><span class="dashicons dashicons-star-filled" style="color: gold;"></span><span class="dashicons dashicons-star-filled" style="color: gold;"></span><span class="dashicons dashicons-star-filled" style="color: gold;"></span><span class="dashicons dashicons-star-filled" style="color: gold;"></span><span class="dashicons dashicons-star-filled" style="color: gold;"></span></span> <span style="font-size: 1.0em; font-weight: normal; margin-left: 0.5em; color: #888;">88 reviews</span></div></div><div style="display: flex; flex-direction: column; align-items: center; margin-left: 10ch; margin-top: 1.5em;"> <a href="https://search.google.com/local/writereview?placeid=ChIJc1fuU0BrK4cRkulkFszM_HA" target="_blank" style="background-color: #4285F4; color: white; padding: 0.5em 1em; border-radius: 5px; text-decoration: none;" rel="noopener">Write a Review</a></div></div></div><div style="clear: both;"></div><div class="io-reviews-carousel"><div class="review"><div class="card io-review-card" style="padding: 1em; margin: 1em; min-height: 16rem; overflow: hidden;"><div class="card-header d-flex align-items-center" style="display: flex; align-items: center; padding: 0.5em 1em;"> <img decoding="async" src="https://lh3.googleusercontent.com/a-/ALV-UjV_2j1mCf1JW-w54CmPCU2qQ-MKA3Dc0x-AsuxEsBG9jtTGZXbk=s128-c0x00000000-cc-rp-mo" alt="User Photo" style="width: 50px; height: 50px; border-radius: 50%; margin-right: 2em;"><div style="flex-grow: 1;"><h5 class="card-title mb-1" style="font-size: 1.25em; margin: 0;">Adam Maravilla</h5><p class="mb-1" style="margin: 0; font-size: 0.9em; color: #666;">November 12, 2025</p></div></div><div class="card-body" style="display: flex; flex-direction: column; justify-content: space-between; height: calc(100% - 4rem);"><p class="mb-1" style="margin: 0; margin-bottom: 1em;"><span class="dashicons dashicons-star-filled" style="color: gold;"></span><span class="dashicons dashicons-star-filled" style="color: gold;"></span><span class="dashicons dashicons-star-filled" style="color: gold;"></span><span class="dashicons dashicons-star-filled" style="color: gold;"></span><span class="dashicons dashicons-star-filled" style="color: gold;"></span></p><p class="card-text" style="height: 8rem; overflow-y: auto; font-size: 1em;">Such an incredible renting company to work with. I get them for all my events and they always make sure to get set up as soon as possible, even when the event is later in the evening! Haven’t had a problem yet and the site manager always makes sure to handle any temporary roadblocks we face.</p><div class="review-branding" style="display: flex; align-items: center; margin-top: .25em;"> <img decoding="async" src="https://topeventrental.com/wp-content/plugins/inflatableoffice/assets/images/google_g_icon.png" alt="Google Logo" style="width: 20p
167x; height: 20px; margin-right: 0.5em;"> <span style="font-size: .75em; color: #555; margin-top: .55em;">Posted on Google</span></div></div></div></div><div class="review"><div class="card io-review-card" style="padding: 1em; margin: 1em; min-height: 16rem; overflow: hidden;"><div class="card-header d-flex align-items-center" style="display: flex; align-items: center; padding: 0.5em 1em;"> <img decoding="async" src="https://lh3.googleusercontent.com/a-/ALV-UjWmf9i8mcaUe-F4OIH9A4cdfY196vBFa2B7-CiWZKA1ATcZUhYTRA=s128-c0x00000000-cc-rp-mo" alt="User Photo" style="width: 50px; height: 50px; border-radius: 50%; margin-right: 2em;"><div style="flex-grow: 1;"><h5 class="card-title mb-1" style="font-size: 1.25em; margin: 0;">Freddy Herrera</h5><p class="mb-1" style="margin: 0; font-size: 0.9em; color: #666;">June 26, 2026</p></div></div><div class="card-body" style="display: flex; flex-direction: column; justify-content: space-between; height: calc(100% - 4rem);"><p class="mb-1" style="margin: 0; margin-bottom: 1em;"><span class="dashicons dashicons-star-filled" style="color: gold;"></span><span class="dashicons dashicons-star-filled" style="color: gold;"></span><span class="dashicons dashicons-star-filled" style="color: gold;"></span><span class="dashicons dashicons-star-filled" style="color: gold;"></span><span class="dashicons dashicons-star-filled" style="color: gold;"></span></p><p class="card-text" style="height: 8rem; overflow-y: auto; font-size: 1em;">We recently Rented a stage from Top Event Rentals for an event in Goodyear, and the entire experience was excellent. Allen was great to work with, communication was easy, the delivery was on time, and the stage arrived clean and exactly as expected. Everything went smoothly from start to finish, which made our event stress-free. We appreciate the professionalism and look forward to working with Allen and the Top Event Rentals team again. Highly recommend!</p><div class="review-branding" style="display: flex; align-items: center; margin-top: .25em;"> <img decoding="async" src="https://topeventrental.com/wp-content/plugins/inflatableoffice/assets/images/google_g_icon.png" alt="Google Logo" style="width: 20px; height: 20px; margin-right: 0.5em;"> <span style="font-size: .75em; color: #555; margin-top: .55em;">Posted on Google</span></div></div></div></div><div class="review"><div class="card io-review-card" style="padding: 1em; margin: 1em; min-height: 16rem; overflow: hidden;"><div class="card-header d-flex align-items-center" style="display: flex; align-items: center; padding: 0.5em 1em;"> <img decoding="async" src="https://lh3.googleusercontent.com/a/ACg8ocJGABubS3O4XLbsOsUJyPpm03s1SGGPRVzKM_QJDxEud2tnsA=s128-c0x00000000-cc-rp-mo" alt="User Photo" style="width: 50px; height: 50px; border-radius: 50%; margin-right: 2em;"><div style="flex-grow: 1;"><h5 class="card-title mb-1" style="font-size: 1.25em; margin: 0;">Jasmine Solis</h5><p class="mb-1" style="margin: 0; font-size: 0.9em; color: #666;">March 16, 2026</p></div></div><div class="card-body" style="display: flex; flex-direction: column; justify-content: space-between; height: calc(100% - 4rem);"><p class="mb-1" style="margin: 0; margin-bottom: 1em;"><span class="dashicons dashicons-star-filled" style="color: gold;"></span><span class="dashicons dashicons-star-filled" style="color: gold;"></span><span class="dashicons dashicons-star-filled" style="color: gold;"></span><span class="dashicons dashicons-star-filled" style="color: gold;"></span><span class="dashicons dashicons-star-filled" style="color: gold;"></span></p><p class="card-text" style="height: 8rem; overflow-y: auto; font-size: 1em;">Working with Top Event Rentals was such a great and stress-free experience! They were extremely helpful when planning and even offered their own valuable insight and suggestions on ways to improve my overall event. The team was professional and communicative and it is clear they take a lot of pride in what they do. If you&#039;re looking for a reliable company that delivers quality rentals and excellent service I would highly recommend them!</p><div class="review-branding" style="display: flex; align-items: center; margin-top: .25em;"> <img decoding="async" src="https://topeventrental.com/wp-content/plugins/inflatableoffice/assets/images/google_g_icon.png" alt="Google Logo" style="width: 20p
167x; height: 20px; margin-right: 0.5em;"> <span style="font-size: .75em; color: #555; margin-top: .55em;">Posted on Google</span></div></div></div></div><div class="review"><div class="card io-review-card" style="padding: 1em; margin: 1em; min-height: 16rem; overflow: hidden;"><div class="card-header d-flex align-items-center" style="display: flex; align-items: center; padding: 0.5em 1em;"> <img decoding="async" src="https://lh3.googleusercontent.com/a-/ALV-UjVd3iUTeUbmg46hOp2a_Fjaqv4nI3-8GYf8Q1s6jOYul0QF7T17Zg=s128-c0x00000000-cc-rp-mo-ba4" alt="User Photo" style="width: 50px; height: 50px; border-radius: 50%; margin-right: 2em;"><div style="flex-grow: 1;"><h5 class="card-title mb-1" style="font-size: 1.25em; margin: 0;">Morgan Bartlett</h5><p class="mb-1" style="margin: 0; font-size: 0.9em; color: #666;">April 20, 2026</p></div></div><div class="card-body" style="display: flex; flex-direction: column; justify-content: space-between; height: calc(100% - 4rem);"><p class="mb-1" style="margin: 0; margin-bottom: 1em;"><span class="dashicons dashicons-star-filled" style="color: gold;"></span><span class="dashicons dashicons-star-filled" style="color: gold;"></span><span class="dashicons dashicons-star-filled" style="color: gold;"></span><span class="dashicons dashicons-star-filled" style="color: gold;"></span><span class="dashicons dashicons-star-filled" style="color: gold;"></span></p><p class="card-text" style="height: 8rem; overflow-y: auto; font-size: 1em;">Our company recently used Top Event Rentals for tables, chairs and cloths for an open house event.  They were so easy to work with and straightforward in their communication and pricing.  I was able to research what I wanted first on their website, then secured the rentals.  I would absolutely recommend!  Very easy to work with</p><div class="review-branding" style="display: flex; align-items: center; margin-top: .25em;"> <img decoding="async" src="https://topeventrental.com/wp-content/plugins/inflatableoffice/assets/images/google_g_icon.png" alt="Google Logo" style="width: 20px; height: 20px; margin-right: 0.5em;"> <span style="font-size: .75em; color: #555; margin-top: .55em;">Posted on Google</span></div></div></div></div><div class="review"><div class="card io-review-card" style="padding: 1em; margin: 1em; min-height: 16rem; overflow: hidden;"><div class="card-header d-flex align-items-center" style="display: flex; align-items: center; padding: 0.5em 1em;"> <img decoding="async" src="https://lh3.googleusercontent.com/a/ACg8ocKZxE6mGp5pTmFZitnsOIolpa6GfS78tPHZfz7QzRHZ9gcqKg=s128-c0x00000000-cc-rp-mo" alt="User Photo" style="width: 50px; height: 50px; border-radius: 50%; margin-right: 2em;"><div style="flex-grow: 1;"><h5 class="card-title mb-1" style="font-size: 1.25em; margin: 0;">Onofre Delgado</h5><p class="mb-1" style="margin: 0; font-size: 0.9em; color: #666;">June 5, 2026</p></div></div><div class="card-body" style="display: flex; flex-direction: column; justify-content: space-between; height: calc(100% - 4rem);"><p class="mb-1" style="margin: 0; margin-bottom: 1em;"><span class="dashicons dashicons-star-filled" style="color: gold;"></span><span class="dashicons dashicons-star-filled" style="color: gold;"></span><span class="dashicons dashicons-star-filled" style="color: gold;"></span><span class="dashicons dashicons-star-filled" style="color: gold;"></span><span class="dashicons dashicons-star-filled" style="color: gold;"></span></p><p class="card-text" style="height: 8rem; overflow-y: auto; font-size: 1em;">Raul and Noe were amazing with the drop-off of our water slide. They were professional, friendly, and right on time. They made the setup process smooth, and made sure the slide was placed safely and exactly where we needed it. We truly appreciated their hard work and positive attitude. Thank you, Raul and Noe, for providing excellent service. Highly recommend!</p><div class="review-branding" style="display: flex; align-items: center; margin-top: .25em;"> <img decoding="async" src="https://topeventrental.com/wp-content/plugins/inflatableoffice/assets/images/google_g_icon.png" alt="Google Logo" style="width: 20p
167x; height: 20px; margin-right: 0.5em;"> <span style="font-size: .75em; color: #555; margin-top: .55em;">Posted on Google</span></div></div></div></div></div> 
167<script>jQuery(document).ready(function($)
168            {
169                console.log('Initializing carousel');
170                $('.io-reviews-carousel').slick(
171                {
172                    infinite: true,
173                    slidesToShow: 3,
174                    slidesToScroll: 1,
175                    autoplay: true,
176                    autoplaySpeed: 2000,
177                });
178            });</script>
178 
178<script>function adjustLayoutForOrientation()
179            {
180                var isPortrait = window.innerHeight > window.innerWidth;
181                var header = document.querySelector('.io-reviews-header');
182
183                if (isPortrait)
184                {
185                    header.style.flexDirection = 'column';
186                    header.style.alignItems = 'center';
187                }
188				else
189                {
190                    header.style.flexDirection = 'row';
191                    header.style.alignItems = 'flex-start';
192                }
193
194                adjustCarouselForOrientation();  // Call existing function to adjust carousel
195            }
196
197            function adjustCarouselForOrientation()
198            {
199                var isPortrait = window.innerHeight > window.innerWidth;
200                var carouselSettings = {
201                    infinite: true,
202                    autoplay: true,
203                    autoplaySpeed: 2000,
204                    slidesToScroll: 1,
205                    slidesToShow: isPortrait ? 1 : 3,
206                };
207
208                jQuery('.io-reviews-carousel').slick('unslick'); // Destroy previous instance
209                jQuery('.io-reviews-carousel').slick(carouselSettings); // Re-initialize with new settings
210            }
211
212            jQuery(document).ready(function()
213            {
214                adjustLayoutForOrientation();
215                jQuery(window).on('resize orientationchange', function()
216                {
217                    adjustLayoutForOrientation();
218                });
219            });</script>
219 </div></div></div></div></div></section></div></div></main><footer data-elementor-type="footer" data-elementor-id="4256" class="elementor elementor-4256 elementor-location-footer" data-elementor-post-type="elementor_library"><section class="elementor-section elementor-top-section elementor-element elementor-element-3824a239 elementor-section-boxed elementor-section-height-default elementor-section-height-default" data-id="3824a239" data-element_type="section" data-e-type="section" id="io_contactform" data-settings="{&quot;background_background&quot;:&quot;classic&quot;,&quot;shape_divider_top&quot;:&quot;curve&quot;}"><div class="elementor-background-overlay"></div><div class="elementor-shape elementor-shape-top" aria-hidden="true" data-negative="false"> <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1000 100" preserveAspectRatio="none"> <path class="elementor-shape-fill" d="M1000,4.3V0H0v4.3C0.9,23.1,126.7,99.2,500,100S1000,22.7,1000,4.3z"/> </svg></div><div class="elementor-container elementor-column-gap-default"><div class="elementor-column elementor-col-50 elementor-top-column elementor-element elementor-element-39040316" data-id="39040316" data-element_type="column" data-e-type="column"><div class="elementor-widget-wrap elementor-element-populated"><div class="elementor-element elementor-element-52043b3 elementor-widget elementor-widget-heading" data-id="52043b3" 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">Company Hours of Operation</h2></div></div><div class="elementor-element elementor-element-0df5016 elementor-widget elementor-widget-text-editor" data-id="0df5016" data-element_type="widget" data-e-type="widget" data-widget_type="text-editor.default"><div class="elementor-widget-container"><p data-renderer-start-pos="75">M-F: 9AM-5PM</p><p data-renderer-start-pos="75">Saturday: 9AM-1PM</p><p data-renderer-start-pos="106">Sunday: Closed</p></div></div><div class="elementor-element elementor-element-424d5493 elementor-widget elementor-widget-heading" data-id="424d5493" 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-xxl">Contact Us</h2></div></div><div class="elementor-element elementor-element-2e77964c elementor-icon-list--layout-traditional elementor-list-item-link-full_width elementor-widget elementor-widget-icon-list" data-id="2e77964c" 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"><li class="elementor-icon-list-item"> <a href="tel:(602)%20566-1560"> <span class="elementor-icon-list-text">(602) 566-1560</span> </a></li><li class="elementor-icon-list-item"> <a href="mailto:[email protected]"> <span class="elementor-icon-list-text">[email protected]</span> </a></li><li class="elementor-icon-list-item"> <span class="elementor-icon-list-text">5755 N 51st Ave STE #11 Glendale, AZ 85301</span></li></ul></div></div><div class="elementor-element elementor-element-eea76c5 e-grid-align-left elementor-shape-rounded elementor-grid-0 elementor-widget elementor-widget-social-icons" data-id="eea76c5" 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-35553f6" href="https://www.facebook.com/share/1TwEonfZMs/?mibextid=wwXIfr" 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-instagram elementor-repeater-item-a3365d7" href="https://www.instagram.com/topeventrentals?igsh=MTFnYmNwa2ZvNG1lbw==" 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-youtube elementor-repeater-item-ab7e814" href="http://www.youtube.com/@topeventrentalsaz" 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-linkedin elementor-repeater-item-e1b3715" href="https://www.google.com/url?sa=t&#038;source=web&#038;rct=j&#038;opi=89978449&#038;url=https://www.linkedin.com/company/top-event-rentals&#038;ved=2ahUKEwj505CIwYmUAxV4le4BHZ_bJ-cQ9zB6BAg2EAc&#038;usg=AOvVaw25hAClKutewZy4XJD84jQW" target="_blank"> <span class="elementor-screen-only">Linkedin</span> <i aria-hidden="true" class="fab fa-linkedin"></i> </a> </span> <span class="elementor-grid-item" role="listitem"> <a class="elementor-icon elementor-social-icon elementor-social-icon-tiktok elementor-repeater-item-95d73bb" href="https://www.tiktok.com/@topeventrentals?_t=ZP-8xAEKeiwgtr&#038;_r=1" target="_blank"> <span class="elementor-screen-only">Tiktok</span> <i aria-hidden="true" class="fab fa-tiktok"></i> </a> </span></div></div></div></div></div><div class="elementor-column elementor-col-50 elementor-top-column elementor-element elementor-element-5ba8a1eb" data-id="5ba8a1eb" data-element_type="column" data-e-type="column"><div class="elementor-widget-wrap elementor-element-populated"><div class="elementor-element elementor-element-5440d2e elementor-button-align-stretch elementor-widget elementor-widget-global elementor-global-4706 elementor-widget-form" data-id="5440d2e" data-element_type="widget" data-e-type="widget" data-settings="{&quot;step_next_label&quot;:&quot;Next&quot;,&quot;step_previous_label&quot;:&quot;Previous&quot;,&quot;button_width&quot;:&quot;100&quot;,&quot;step_type&quot;:&quot;number_text&quot;,&quot;step_icon_shape&quot;:&quot;circle&quot;}" data-widget_type="form.default"><div class="elementor-widget-container"><form class="elementor-form" method="post" id="io_contactusform" name="Request Call Back" aria-label="Request Call Back"> <input type="hidden" name="post_id" value="4256"/> <input type="hidden" name="form_id" value="5440d2e"/> <input type="hidden" name="referer_title" value="Top Event Rentals Phoenix AZ - Party Rental and Event Rental" /> <input type="hidden" name="queried_id" value="109"/><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-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="3" placeholder="&quot;I need help from a human sales rep.&quot;"></textarea></div><div class="elementor-field-type-recaptcha_v3 elementor-field-group elementor-column elementor-field-group-field_1a42aac elementor-col-100 recaptcha_v3-bottomright"><div class="elementor-field" id="form-field-field_1a42aac"><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-type-text"> <input size="1" type="text" name="form_fields[website_url]" id="form-field-website_url" class="elementor-field elementor-size-sm " style="display:none !important;"></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 elementor-animation-grow" type="submit" id="io_cub"> <span class="elementor-button-content-wrapper"> <span class="elementor-button-icon"> <i aria-hidden="true" class="far fa-paper-plane"></i> </span> <span class="elementor-button-text">Send</span> </span> </button></div></div></form></div></div><div class="elementor-element elementor-element-73102690 elementor-widget elementor-widget-text-editor" data-id="73102690" data-element_type="widget" data-e-type="widget" data-widget_type="text-editor.default"><div class="elementor-widget-container"><p>This site is protected by reCAPTCHA and the Google<br /><a href="https://policies.google.com/privacy">Privacy Policy</a> and<br /><a href="https://topeventrental.com/terms-of-service/">Terms of Service</a> apply.</p></div></div></div></div></div></section><section class="elementor-section elementor-top-section elementor-element elementor-element-71ceb709 elementor-section-boxed elementor-section-height-default elementor-section-height-default" data-id="71ceb709" data-element_type="section" data-e-type="section" 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-421e5842" data-id="421e5842" data-element_type="column" data-e-type="column"><div class="elementor-widget-wrap elementor-element-populated"><div class="elementor-element elementor-element-41e89b5 elementor-widget elementor-widget-global elementor-global-4780 elementor-widget-text-editor" data-id="41e89b5" data-element_type="widget" data-e-type="widget" data-widget_type="text-editor.default"><div class="elementor-widget-container"><p>Copyright © Top Event Rentals Glendale AZ All Rights Reserved | <a href="https://topeventrental.com/privacy/">Privacy Policy</a> | Rental Software Powered By <a href="https://eventoffice.io/" target="_blank" rel="noopener">EventOffice</a></p></div></div></div></div></div></section></footer> 
219<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>
219 <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_0h_3337147,.io_product_price_0h_3337149,.io_product_price_0h_3337153,.io_product_price_0h_3337155,.io_product_price_0h_2925103,.io_product_price_0h_3181471,.io_product_price_0h_2882737,.io_product_price_0h_2883153,.io_product_price_0h_2883155,.io_product_price_0h_2880767,.io_product_price_0h_2930193,.io_product_price_0h_2930191,.io_product_price_0h_3215923,.io_product_price_0h_2971845,.io_product_price_0h_2882725{display: grid !important}.io_product_price_24h_3337147,.rentNameIO_price_3337147,.io_product_price_24h_3337149,.rentNameIO_price_3337149,.io_product_price_24h_3337153,.rentNameIO_price_3337153,.io_product_price_24h_3337155,.rentNameIO_price_3337155,.io_product_price_24h_2925103,.rentNameIO_price_2925103,.io_product_price_24h_3181471,.rentNameIO_price_3181471,.io_product_price_24h_2882737,.rentNameIO_price_2882737,.io_product_price_24h_2883153,.rentNameIO_price_2883153,.io_product_price_24h_2883155,.rentNameIO_price_2883155,.io_product_price_24h_2880767,.rentNameIO_price_2880767,.io_product_price_24h_2930193,.rentNameIO_price_2930193,.io_product_price_24h_2930191,.rentNameIO_price_2930191,.io_product_price_24h_3215923,.rentNameIO_price_3215923,.io_product_price_24h_2971845,.rentNameIO_price_2971845,.io_product_price_24h_2882725,.rentNameIO_price_2882725{display: none !important}
220        .io_product_cust_price
221        {
222            display: none !important;
223        }
224        #item_live_price_time_set_message
225        {
226            display: none !important;
227        }
228        
229    /* ALWAYS hide toggle buttons and list view on inventory/all-items pages (no category ID) */
230    body.io-no-category-id .io_view_toggle_container,
231    body.io-no-category-id .io_list_view_content
232    {
233        display: none !important;
234    }
235    
236    /* Force grid/tile layout on pages without category IDs */
237    body.io-no-category-id .io_catdiv2.list-view {
238        display: grid !important;
239        grid-template-columns: repeat(auto-fit, minmax(250px, 350px)) !important;
240        grid-gap: 10px !important;
241        margin: 50px !important;
242        max-width: none !important;
243        justify-content: space-evenly !important;
244    }
245    body.io-no-category-id .io_catdiv2.list-view .io_item2_list {
246        display: block !important;
247        flex-direction: column !important;
248        margin-bottom: 0 !important;
249        padding: 0 !important;
250        align-items: initial !important;
251        text-align: center !important;
252    }
253    body.io-no-category-id .io_catdiv2.list-view .cat_div {
254        flex: initial !important;
255        margin-right: 0 !important;
256        position: relative !important;
257    }
258    body.io-no-category-id .io_catdiv2.list-view .cat_img {
259        width: 100% !important;
260        height: auto !important;
261        object-fit: cover !important;
262    }
263    body.io-no-category-id .io_catdiv2.list-view .io_item2_list_inner {
264        flex: initial !important;
265        margin-top: initial !important;
266        display: block !important;
267        flex-direction: initial !important;
268        justify-content: initial !important;
269        min-height: auto !important;
270        height: auto !important;
271    }
272    
273    .io_all_item_cat{
274        display:none;
275        float:none;
276        width:100%;
277        margin-top:20px;
278    }</style> 
278<script>var io_wp_local_path = "";
279    var io_checkavail = "warn";
280    var io_hidetimes = "off";
281    var io_user_country = "US";
282    var io_user_currency = "USD";
283    var io_default_start_time = "11:00 am";
284    var io_default_end_time = "3:00 pm";
285    var io_default_duration = 4.00;
286    var io_force_blank_timepickers = "off";
287    var io_hide_end_time = "off";
288    var io_cart_date_format = "m/d/yy";
289    var io_cart_message = "Non-residential orders please email <a href=\"mailto:[email protected]\">[email protected]</a> or call our office to reserve";
290    var io_cart_time_format = "g:i a";
291    var io_multidayquote = "on";
292    var io_cartdayselect = "dropdown_options";
293    var io_cartAllowSameDay = "off";
294    var io_overnightPickupTime = "10:00 am";
295    var io_incartupsell = "on";
296    var io_distancecharge = "off";
297    var io_deliverymethod = "off";
298    var io_brand = "IO";
299    var io_restrict_times = "on";
300    var io_restrict_time_start = "8:00 am";
301    var io_restrict_time_end = "9:00 pm";
302    var io_default_state = "AZ";
303    var io_hide_zero = "1";
304    var io_weekEndPrice = "off";
305    var io_weekDayText = "Weekday price.";
306    var io_weekEndText = "Weekend price.";
307    var io_weekendDefine = "friday-sunday";
308    var io_accessory_price = "off";
309    var io_accessory_select = "off";
310    var io_upsell_price = "off";
311    var io_cart_party_planner_email = "off";
312    var io_cart_party_planner_destination = "https://topeventrental.com/plan-a-party/";
313    var io_hideQuantityAvail = "off";
314    var io_company_timeslots = [];
315    var io_info_required = "off";
316    var io_always_display_live_price = "off";
317    var io_default_delivery_method = "Fully Staffed";
318    var io_hide_live_prices = 1;
319    var io_info_required_data = [];
320    var io_prices = {"0":"isset","override_groups":{"713018":{"3337147":1,"3337149":1,"3337153":1,"3337155":1,"2925103":1,"3181471":1,"2882737":1,"2883153":1,"2883155":1,"2880767":1,"2930193":1,"2930191":1,"3215923":1,"2971845":1,"2882725":1}},"1":"io_product_price_24h","2":"io_product_price_0h_3337147","3":"io_product_price_0h_3337149","4":"io_product_price_0h_3337153","5":"io_product_price_0h_3337155","6":"io_product_price_0h_2925103","7":"io_product_price_0h_3181471","8":"io_product_price_0h_2882737","9":"io_product_price_0h_2883153","10":"io_product_price_0h_2883155","11":"io_product_price_0h_2880767","12":"io_product_price_0h_2930193","13":"io_product_price_0h_2930191","14":"io_product_price_0h_3215923","15":"io_product_price_0h_2971845","16":"io_product_price_0h_2882725"};
321    var io_delivery_prices = {"default":[],"override":[]};
322    var io_custom_prices = {"default":[],"override":[]};
323    var io_delivery_methods = {"Personal Backyard Drop Off":{"restricted":"[]","id":"115711"},"Non Residential Drop-Off":{"restricted":"[]","id":"131727"},"Customer Pick-Up":{"restricted":"[]","id":"115709"}};
324    var io_customer_geolocation = "off";
325    var io_customer_ip = "209.250.2.116";
326    var io_delivery_methods_restrict = null;
327    var io_pagename = "Top Event Rentals_1";
328    var io_categoryVariantImages = "off";
329    //var io_seocitylinktext = "                                Professional delivery to <span class=\"io_city_list\">%%landing_pages%%</span> and surrounding areas. We do travel out of state for larger events! Please submit a quote or contact us to be sure we service your area.                                                        ";
330    jQuery( document ).ready(function() {
331
332        //force all quote form links to use cart data
333        //removing back to cart shortcode as this needs to only be done if cart is not empty IO-22561
334        /*
335        let headerBookButton = jQuery("a[href$='io_quoteform/']");
336        headerBookButton.addClass("ioCart_link");
337        headerBookButton.attr("href", "javascript:;");
338        */
339
340
341        let last_cat_name = "";
342        let ioTrigger = false;
343        jQuery(".io_all_item_cat").each(function() {
344            current_cat_name = jQuery(this).html();
345            if(last_cat_name !== current_cat_name) {
346                jQuery(this).show();
347                ioTrigger = true;
348            }
349            last_cat_name = current_cat_name;
350        });
351
352        // Setup gen page blocks
353		let io_divs = document.querySelectorAll(".io_item2_list, .io_item2_listcat, .io_item2_listrent, .io_all_item_cat");
354		let io_divscat = document.querySelectorAll(".io_item2_listcat");
355		let io_divsrent = document.querySelectorAll(".io_item2_listrent");
356		let io_divcat = document.querySelector(".io_catdiv2");
357		let io_pcc = document.querySelector(".page-content");
358		let io_html;
359
360		if (io_divs.length > 0) {
361	      for (let i of io_divs) {
362	        if(i.parentNode.className.indexOf("io_mm_") === -1){
363	          io_divcat.appendChild(i);
364	        }
365		  }
366		  if(io_divcat!==null) io_divcat.style.display = "grid";
367		}
368
369		if (ioTrigger) {
370            let pageBlock = document.querySelector(".io_catdiv2");
371            pageBlock.classList.add("elementor-widget-heading");
372            let scanRes = pageBlock.querySelectorAll(".io_item2_listrent");
373            pageBlock.style.display = "block";
374            pageBlock.style.margin = "auto";
375            pageBlock.style.textAlign = "center";
376            pageBlock.style.marginLeft = "5px";
377            pageBlock.style.marginRight = "5px";
378            for (let i of scanRes) {
379                i.style.display = "inline-block";
380                i.style.marginLeft = "5px";
381                i.style.marginRight = "5px";
382            }
383        }
384
385		/* fix font color on older sites */
386		if(jQuery("#cartData").css("background-color")=="rgb(35, 36, 37)"){
387		    jQuery("#cartData").css("color","white");
388		}
389    });</script>
389<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:;"
390 class="elementor-button-link elementor-button elementor-size-sm elementor-animation-grow"
391 style="text-decoration: none;">Apply</a></div><div class="elementor-widget-button" style="padding:10px;display:inline-block;"> <a onclick="calCancel()" href="javascript:;"
392 class="elementor-button-link elementor-button elementor-size-sm elementor-animation-grow simpleCart_cancel"
393 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();
393" 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>  
393<script>/* configurable globals */
394  var start_default = "11:00 am";
395  if(io_default_start_time != "") start_default = io_default_start_time;
396  var end_default = "3:00 pm";
397  if(io_default_end_time != "") end_default = io_default_end_time;
398
399  if(io_user_currency){
400    var currency = io_user_currency;
401  } else{
402    var currency = "USD";
403  }
404
405  if(io_user_country){
406    var country = io_user_country;
407  } else{
408    var country = "US";
409  }
410
411
412  var timeFormat = "g:i a";
413  if(io_cart_time_format != "") timeFormat = io_cart_time_format;
414  var dateFormat = "m/d/yy";
415  if(io_cart_date_format != "") dateFormat = io_cart_date_format;
416
417  var restrictTimes = false;
418  if(io_restrict_times === "on") restrictTimes = true;
419  var restrictTimeStart = start_default;
420  if(io_restrict_time_start != "") restrictTimeStart = io_restrict_time_start;
421  var restrictTimeEnd = end_default;
422  if(io_restrict_time_end != "") restrictTimeEnd = io_restrict_time_end;
423
424
425  var multi_day = true;
426  if(io_multidayquote === "off" || io_cartdayselect == "Single Day") multi_day = false;
427  var in_cart_upsell = false;
428  if(io_incartupsell === "on") in_cart_upsell = true;
429  var io_distance_charge = false;
430  if(io_distancecharge === "on") io_distance_charge = true;
431
432  /* other globals */
433  var pallet_color1 = ""; /* set in onready */
434  /* track the date start/end of calendar clicking */
435  var click_count = 0;
436
437  /* for configuring upsell carosel in cart */
438  var cart_carousel_set = false;
439
440  /* for checking when we remove an item from the cart */
441  var last_remove = 0;
442  var last_upsell_call = 0;
443
444  /* for buffering cart qty changes checkAvail calls for qty change only */
445  var last_checkAvail_call = 0;
446
447  /* for cart loading animation */
448  var io_cart_loading_active = false;
449  var io_cart_loading_count = 0;
450  var io_cart_loading_fallback_timer = null;
451
452  /*var start_default = "11:00";
453    var end_default = "15:00";
454    var currency = "EUR";
455    var timeFormat = "G:i";
456    var dateFormat = "d/m/yy";*/
457
458
459  /* For weekday weekend pricing */
460  var use_weekday_weekend = false;
461  if(io_weekEndPrice == "on") use_weekday_weekend = true;
462
463  /* Accessory and Upsell Prices */
464  var show_accessory_price = false;
465  if(io_accessory_price == "on") show_accessory_price = true;
466  var show_upsell_price = false;
467  if(io_upsell_price == "on") show_upsell_price = true;
468
469  /* For customer geolocation shortcode */
470  var storage_key = 'io_customer_location';
471
472  /*<editor-fold defaultstate="collapsed" desc="On Ready">*/
473  jQuery(document).ready(function () {
474    pallet_color1 = "var( --e-global-color-accent,green )";
475    if(pallet_color1=="rgba(0, 0, 0, 0)" || pallet_color1=="rgb(255, 255, 255)") pallet_color1="rgb(25, 147, 35)";
476
477    /*<editor-fold defaultstate="collapsed" desc="SimpleCart Init">*/
478    simpleCart({
479      currency: currency,
480      cartColumns: [{
481        view: "image",
482        attr: "image",
483        label: "Image"
484      },
485        {
486          attr: "name",
487          label: "Name"
488        },
489        {
490          attr: "encoded",
491          label: false
492        },
493        {
494          attr: "rentalid",
495          label: false
496        },
497        {
498          attr: "availability",
499          label: false
500        },
501        {
502          view: "decrement",
503          label: false,
504          text: "<i class='fas far fa-minus-square' style='color:" + pallet_color1 + "'></i>"
505        },
506        {
507          view: "calculate_area",
508          label: false
509        },
510        {
511          view:"input",
512          attr:"quantity"
513
514        },
515        {
516          attr: "qtyincrement",
517          label: false
518        },
519        {
520          attr: "inputtype",
521          label: false
522        },
523        {
524          attr: "qtytype",
525          label: false
526        },
527        {
528          attr: "vendorid",
529          label: false
530        },
531        {
532          view: "increment",
533          label: false,
534          text: "<i class='fas far fa-plus-square' style='color:" + pallet_color1 + "'></i>"
535        },
536        {
537          attr: "price",
538          label: "Price",
539          view: 'currency'
540        },
541        {
542          view: "remove",
543          label: false,
544          text: "<i class='fas fa-trash' style='color:" + pallet_color1 + "'></i>"
545        },
546        {
547          attr: "total",
548          label: "SubTotal",
549          view: 'currency'
550        },
551        {
552          attr: "timeslots",
553          label: false
554        },
555        {
556          attr: "timeslots-orig",
557          label: false
558        },
559        {
560          attr: "href",
561          label: false
562        },
563        {
564          attr: "linkqty",
565          label: false
566        },
567        {
568          attr: "acc_dd_parent_limit",
569          label: false
570        }
571      ],
572      checkout: {
573        type: "SendForm",
574        method: "GET",
575        url: io_wp_local_path+"/io_quoteform/",
576        extra_data: {
577          /* name: decodeURIComponent("Top Event Rentals_1".replace(/[+]/gi, " ")), */
578          clear_rentals: "1",
579          selected_only: "1",
580          wp_checkout: "1",
581          startdate: "",
582          enddate: "",
583          starttime: "",
584          endtime: "",
585          io_custguid: ""
586        }
587      }
588    });
589
590    simpleCart.bind('update', cart_onUpdate);
591    simpleCart.bind('beforeSave', cart_hideTimepickerWrapper);
592    simpleCart.bind('beforeRemove', cart_beforeRemove);
593    simpleCart.bind('afterRemove', cart_afterRemove);
594    simpleCart.bind('afterQtyChange', cart_afterQtyChange);
595    simpleCart.bind('beforeCheckout', cart_beforeCheckout);
596    simpleCart.bind('afterAdd', cart_afterAdd);
597    simpleCart.bind('beforeAdd', cart_beforeAdd);
598    simpleCart.bind('load', cart_afterLoad)
599    /*</editor-fold>*/
600
601    /* showAvail(""); */
602    let io_star_pic = document.querySelector("#io_star_pic");
603    if (io_star_pic != null) {
604      let io_star_src = io_star_pic.src;
605      if (io_star_src.indexOf("0star") > -1 || io_star_src.indexOf("1star") > -1 || io_star_src.indexOf("2star") > -1 ||
606              io_star_src.indexOf("3star") > -1) {
607        io_star_pic.style.display = "none";
608      }
609    }
610
611    /*<editor-fold desc="Build Thumb Images">*/
612    /* build multiple thumb images */
613
614    /*</editor-fold>*/
615
616    /*<editor-fold desc="Set up Accessories">*/
617    /* Add Add To Cart Buttons */
618    let button_add = document.querySelector("#bookNowBtn");
619    var main_id = 0;
620    if(jQuery(".io_product_container .item_rentalid")){
621      main_id = jQuery(".io_product_container .item_rentalid").first().text();
622    }
623    /* if main item is dd but not pkg (linen code) */
624    if(jQuery(".io_acc_accessorydd").text()==1 && jQuery(".io_acc_ispackage").text()!=1){
625      /* if order is defined, then reorder here. */
626      var acc_cls = jQuery('.io_product_accessories')
627      acc_cls.hide();
628      let pkg = document.querySelector(".io_product_acc_pkg");
629      if(pkg==undefined){
630        pkg = document.createElement("div");
631        pkg.classList.add("io_product_acc_pkg");
632        pkg.style.textAlign = "center";
633        acc_cls.after(pkg);
634      }
635      for (let [key, value] of acc_obj_relate) {
636        elem = getAccElem(key,main_id);
637        if(elem){
638          btn = makeAccBtn(elem,main_id);
639          pkg.append(btn);
640        }
641
642      }
643      let line = document.createElement("div");
644      line.innerHTML = "<br>";
645      pkg.append(line.cloneNode(true));
646      for (let [key, value] of acc_obj_relate) {
647        for (key2 in acc_obj_relate.get(key)) {
648          if(Object.keys(value[key2]).length > 0){
649            /* 3rd level */
650            pkg.append(line.cloneNode(true));
651            for (key3 in acc_obj_relate.get(key)[key2]) {
652              elem = getAccElem(key3,key2);
653              if(elem){
654                btn = makeAccBtn(elem,key2);
655                btn.style.display = "none";
656                pkg.append(btn);
657              }
658            }
659          }else{
660            elem = getAccElem(key2,key);
661            if(elem){
662              btn = makeAccBtn(elem,key);
663              btn.style.display = "none";
664              pkg.append(btn);
665            }
666
667          }
668        }
669      }
670    }else {
671      let access_array = document.querySelectorAll(".io_acc_li");
672      let count = 0;
673      for (let i of access_array) {
674        let path = i.id.replace("io_acc_","");
675        count++;
676        let newButton = button_add.cloneNode(true);
677        newButton.id = button_add.id + count;
678        newButton.classList.remove("elementor-animation-grow");
679        newButton.classList.add("elementor-animation-shrink");
680
681        let path_arr = path.split("_");
682        let pid = parseInt(path_arr[0]);
683        let this_id = parseInt(path_arr[1]);
684        if(path_arr.length==1) pid=0;
685
686        if(jQuery("#io_acc_accessorydd_"+path).first().text()==1){
687          /* display different to provide choices in dd */
688          //main_id = pid;
689        }else{
690          /* hide accessories inside a pkg when under an accessory choice item until clicked */
691          if(jQuery("#io_acc_accessorydd_"+main_id+"_"+pid).first().text()==1){
692          }else{
693            /* jpa - not finished/tested yet */
694            /*jQuery("#io_acc_"+path).hide();*/
695          }
696          /* Fix broken images for accessories. */
697          let img_box = document.querySelectorAll(".io_acc_li_img_thumb");
698          let firstImg = true;
699          let lastAcc = "";
700          for (let i of img_box) {
701            if(lastAcc=="") lastAcc = i.id;
702            if(lastAcc!=i.id){
703              lastAcc = i.id;
704              firstImg = true;
705            }
706            let io_img_src = i.src;
707            if(io_img_src!==null) io_img_src = io_img_src.toLowerCase();
708            let io_img_datasrc = i.getAttribute("data-src");
709            if(io_img_datasrc===null){
710              io_img_datasrc = "";
711            }else{
712              io_img_datasrc = io_img_datasrc.toLowerCase();
713            }
714            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)){
715              i.style.display = "none";
716            }else if(!firstImg && jQuery("#io_acc_accessorydd_"+main_id+"_"+pid).first().text()!=1){
717              i.style.display = "none";
718            }
719            firstImg = false;
720          }
721          if(jQuery("#io_acc_accessorydd_"+main_id+"_"+pid).first().text()==1){
722            /* Make the accessory category look more mike a label. */
723            jQuery("#iothumb_"+main_id+"_"+pid).hide();
724            jQuery("#io_acc_"+main_id+"_"+pid).css("border", "none");
725            jQuery("#io_acc_"+main_id+"_"+pid).css("width", "100%");
726            jQuery("#io_acc_"+main_id+"_"+pid).css("margin-bottom", "5vh");
727            jQuery("#io_acc_"+main_id+"_"+pid).css("box-shadow", "none");
728            jQuery("#io_acc_shortname_"+pid).css("font-weight", "bold");
729            jQuery("#io_acc_shortname_"+pid).css("position", "absolute");
730            /* Make this auto selected to fix an issue where we can not add to cart if this item is
731                           a child of another hidden accessory on screen */
732            jQuery("#io_acc_"+main_id+"_"+pid).prop("selected", true);
733            accessory_cat_text = jQuery("#io_acc_shortname_"+pid).first().text();
734            /* This is necessary to make sure there are not multiple colons. */
735            if(!accessory_cat_text.includes(":")){
736              jQuery("#io_acc_shortname_"+pid).text(accessory_cat_text+":");
737            }
738            /* Remove Href so we do not open images on click for dd accessories. */
739            jQuery("[id^=io_acc_imgbig_"+pid+"_]").removeAttr("href");
740
741            /* Get the accessory limit for this set of acessories, then set up click events. */
742            /* Unbind is used to prevent cascading calls. */
743            accLmt = parseInt(jQuery("#io_acc_accessorylimit_"+main_id+"_"+pid).prop("textContent"));
744            jQuery("[id^=io_acc_"+pid+"_]").unbind("click").click({pid: pid, accLmt: accLmt}, accDDClicked);
745            jQuery("[id^=io_acc_"+pid+"_]").css("cursor", "pointer");
746            /* Set up the slected property of all children accessories. Default to false. */
747            jQuery("[id^=io_acc_"+pid+"_]").prop("selected", false);
748            /* We need to add a hidden button so we can simulate a click on add_item for the cart. */
749            let newButton = button_add.cloneNode(true);
750            newButton.id = button_add.id + count;
751            newButton.classList.remove("elementor-animation-grow");
752            newButton.setAttribute("style", "display: none !important");
753            i.appendChild(newButton);
754          }else{
755            let button_wrap = document.createElement("div");
756            button_wrap.classList.add("elementor-widget-button");
757            button_wrap.classList.add("io_access_button");
758            button_wrap.appendChild(newButton);
759            let req = false;
760            if(jQuery("#io_acc_required_"+path).first().text()>0) req = true;
761            if(!req){
762              i.appendChild(button_wrap);
763            }else{
764              var textnode = document.createTextNode("Included");
765              i.appendChild(textnode);
766            }
767          }
768        }
769      }
770    }
771    /*</editor-fold>*/
772
773    let upsell_array = document.querySelectorAll(".io_upsell_li");
774    count = 0;
775    for (let i of upsell_array) {
776      count++;
777      let newButton = button_add.cloneNode(true);
778      newButton.id = button_add.id + count;
779      newButton.classList.remove("elementor-animation-grow");
780      newButton.classList.add("elementor-animation-shrink");
781
782      let button_wrap = document.createElement("div");
783      button_wrap.classList.add("elementor-widget-button");
784      button_wrap.classList.add("io_upsell_button");
785      button_wrap.appendChild(newButton);
786      i.appendChild(button_wrap);
787    }
788
789    if(io_deliverymethod == "on" && jQuery(".calDeliveryMethodLabel").length==0){
790      let delivery_method_container = jQuery("#ioDeliveryMethodContainer").first();
791      delivery_method_container.append('<span class="calDeliveryMethodLabel">Select Delivery Method</span>');
792      let delivery_method_html = '<select class="ioDeliveryMethods" onchange="deliveryMethodSelected()">';
793      let delivery_methods = Object.keys(io_delivery_methods)
794      for(const index in delivery_methods){
795        if(!io_delivery_methods_restrict){
796          delivery_method_html += '<option value="'+delivery_methods[index]+'">'+delivery_methods[index]+'</option>';
797          if(index == 0 && !getCookie("io_delivery_method")) setCookie("io_delivery_method", delivery_methods[index], 14);
798        }else if( !io_delivery_methods_restrict.includes( io_delivery_methods[ delivery_methods[index] ]["id"] ) ){
799          delivery_method_html += '<option value="'+delivery_methods[index]+'">'+delivery_methods[index]+'</option>';
800          if(index == 0 && !getCookie("io_delivery_method")) setCookie("io_delivery_method", delivery_methods[index], 14);
801        }
802      }
803      delivery_method_container.append(delivery_method_html);
804      delivery_method_container.show();
805      if(getCookie("io_delivery_method")){
806        jQuery(".ioDeliveryMethods").val(getCookie("io_delivery_method"));
807      }
808    }else{
809      setCookie("io_delivery_method", "", 14);
810    }
811
812    let allow_same_day = 1;
813    if(io_cartAllowSameDay == "on"){
814      allow_same_day = 0;
815    }
816
817    /*<editor-fold desc="Cart Calandar and Time Settings Setup">*/
818    //var fullmonth_array = jQuery.datepicker.regional["en"].monthNames;
819    jQuery("#cartCalendar").datepicker({
820      changeMonth: true,
821      changeYear: true,
822      //monthNamesShort : fullmonth_array,
823      dateFormat: dateFormat,
824      rangeSelect: true,
825      numberOfMonths: 1,
826      stepMonths: 1,
827      prevText: "<< Previous Months",
828      nextText: "Next Months >>",
829      speed: "fast",
830      showOn: "both",
831      onChangeMonthYear: cal_onChangeMonthYear,
832      onSelect: cal_onSelect,
833      buttonText: "Calendar",
834      minDate: allow_same_day,
835      firstDay: 0
836    });
837    jQuery(".ui-datepicker-trigger").hide();
838    if(restrictTimes){
839      jQuery(".timepicker").timepicker({
840        startTime: new Date(0, 0, 10, 0, 0, 0),
841        endTime: new Date(0, 0, 0, 20, 0, 0, 0),
842        minTime:restrictTimeStart,
843        maxTime:restrictTimeEnd,
844        /*show24Hours: $show24Hours,*/
845        timeFormat: timeFormat,
846        separator: ":",
847        className: "elementor-widget-text-editor",
848        step: 15,
849        disableTouchKeyboard: true
850      }).keypress(function(e){
851        e.preventDefault();
852      });
853    } else{
854      jQuery(".timepicker").timepicker({
855        startTime: new Date(0, 0, 10, 0, 0, 0),
856        endTime: new Date(0, 0, 0, 20, 0, 0, 0),
857        /*show24Hours: $show24Hours,*/
858        timeFormat: timeFormat,
859        separator: ":",
860        className: "elementor-widget-text-editor",
861        step: 15,
862        disableTouchKeyboard: true
863      });
864    }
865
866    /* if we have company wide timeslots, alter time select in cart. Do this only if we are set to single day only */
867    if(io_company_timeslots.length != 0 && io_cartdayselect == "single_day"){
868      let time_select_container = jQuery("#ioCartTimeSelectContainer").first();
869      time_select_container.empty();
870      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" />'
871      time_select_container.append(selected_date_html);
872      time_select_container.append("<br>")
873      time_select_container.append('<span class="calTimeLabel">Select Timeslot</span>');
874      let timeslot_html = '<select class="ioCartCompanyTimeslots">';
875      for(i=0; i<io_company_timeslots.length; ++i){
876        timeslot_html += io_company_timeslots[i];
877      }
878      timeslot_html += "</select>"
879      time_select_container.append(timeslot_html);
880
881    }
882
883    // Timeslot element on Quote Form
884    const timeslotSelectElement = jQuery(".controls select[name=timeslot]");
885
886    /* jQuery( ".datepicker" ).datepicker({dateFormat: "m/d/yy",minDate:0}); */
887    /* jQuery( ".datepicker" ).val(getCookie("checkDate")); */
888    start_date = getCookie("io_dateStart");
889    end_date = getCookie("io_dateEnd");
890    start_time = getCookie("io_timeStart");
891    end_time = getCookie("io_timeEnd");
892    jQuery("input[name=dateStart]").val(start_date);
893    jQuery("input[name=dateEnd]").val(end_date);
894    if(io_company_timeslots.length != 0 && io_cartdayselect == "single_day" && getCookie("io_company_timeslot_selected")){
895      jQuery(".ioCartCompanyTimeslots").val(getCookie("company_timeslot_selected"));
896      // Set it on the quote page too.
897      timeslotSelectElement.val(getCookie("io_company_timeslot_selected"));
898    } else{
899      jQuery("input[name=timeStart]").val(start_time);
900      jQuery("input[name=timeEnd]").val(end_time);
901    }
902
903    timeslotSelectElement.on('change', function() {
904      // IO-31167: Upon timeslot change on Quote Form,
905      // update timeslot cookie value for persistence
906      if(this.value) {
907        setCookie('io_company_timeslot_selected', this.value, 14);
908      }
909    });
910
911    if (jQuery("input[name=dateEnd]").val() != "") {
912      setCalBackground();
913      jQuery("#cartSubtotal").html(simpleCart.toCurrency(simpleCart.total()));
914      if(getCookie("io_dateApplied") === "true") calCancel();
915      else {
916        jQuery("input[name=dateStart]").val(getCookie("io_dateStart"));
917        jQuery("input[name=dateEnd]").val(getCookie("io_dateEnd"));
918        if(io_company_timeslots.length != 0 && io_cartdayselect == "single_day" && getCookie("io_company_timeslot_selected")){
919          jQuery(".ioCartCompanyTimeslots").val(getCookie("io_company_timeslot_selected"));
920        }
921        else if(io_force_blank_timepickers == "on")
922        {
923          setCookie("io_timeStart", "", 14);
924          setCookie("io_timeEnd", "", 14);
925          jQuery('[name=timeStart]').val("");
926          jQuery('[name=timeEnd]').val("");
927        }
928        else{
929          jQuery("input[name=timeStart]").val(getCookie("io_timeStart"));
930          jQuery("input[name=timeEnd]").val(getCookie("io_timeEnd"));
931        }
932
933        jQuery(".changeDateLinkWrapper").hide();
934      }
935    }
936    /*</editor-fold>*/
937
938    jQuery("#io-dialog").dialog({
939      autoOpen: false,
940      resizable: false,
941      modal: true,
942      dialogClass: "noTitleStuff",
943      width: 350,
944      open: function () {
945        jQuery(".ui-widget-overlay").bind("click", function () {
946          jQuery("#io-dialog").dialog("close");
947        })
948      }
949    });
950
951    /* change jquery calendar next/prev buttons to fa arrows w/matching site color */
952    jQuery("#cartCalendar .ui-datepicker-prev").addClass("fas fa-arrow-left").css("color", pallet_color1);
953    jQuery("#cartCalendar .ui-datepicker-next").addClass("fas fa-arrow-right").css("color", pallet_color1);
954
955    /* hide sections if not set */
956    if(jQuery(".io_product_circuits_right").first().text()=="0"){jQuery(".io_product_circuits_right,.io_product_circuits_left").hide();}
957    if(jQuery(".io_city_list").html()==""){jQuery(".io_landingpages").hide();}
958    /* using this instead as it will handle custom ones added */
959    let io_field_valbox = document.querySelector(".io_product_infobox");
960    if (io_field_valbox != null || io_field_valbox != undefined) {
961      let io_field_valarr = io_field_valbox.querySelectorAll(".io_product_detail_box");
962      for (let i of io_field_valarr) {
963        let check = i.querySelector("p:nth-child(2)");
964        if (check != null && check.innerText == "") i.style.display = "none";
965      }
966    }
967
968    /* Hide description if there is no description */
969    desc_box = document.querySelector(".io_product_desc")
970    if(desc_box != null && desc_box.innerText.length == 0 && desc_box.innerHTML.length == 0){
971      desc_detail_box = desc_box.parentElement;
972      desc_detail_box.style.display = "none";
973    }
974
975    if(document.querySelector(".io_product_reviewbox")!=null){
976      if (document.querySelector(".io_product_reviewbox").innerText == "") {
977        if(document.querySelector(".io_star_rating")!=null) document.querySelector(".io_star_rating a").style.display = "none";
978      }
979    }
980
981    let rid = jQuery(".io_product_container .item_rentalid").first().text();
982    let regex = new RegExp("^io_product_price_.*_" + rid + "$");
983    for (const price_index in io_prices){
984      if(regex.test(io_prices[price_index])){
985        use_weekday_weekend = false;
986      }
987    }
988
989    /* hide end date input. */
990    if(!multi_day){
991      /* TODO: Need to wait and see if this is necessary. If so needs to be more involved than this. */
992      /* jQuery("input[name=dateEnd]").style("visibility", "hidden"); */
993    }
994    /* Call page avail now so we can display live price if its enabled */
995    setTimeout(function(){
996      if(jQuery(".io_acc_accessorydd").text()==1 && jQuery(".io_acc_ispackage").text()!=1){
997        jQuery("#bookNowBtn").removeClass("item_add").addClass("item_add_off").trigger("classChange");
998        checkAvailPageOnly();
999      }else{
1000        checkAvailPageOnly();
1001      }
1002    },50);
1003
1004    /* Adjust picbox for header heights */
1005    setTimeout(adjustPicBoxForHeader,500);
1006
1007    /* Show buttons for distance charge check if the setting is on. Hide or show map button if applicable*/
1008    if(io_distance_charge){
1009      jQuery(".delivery_charge_check_container").show();
1010      jQuery(".calc_price_with_map_container").hide();
1011      jQuery(".checkDeliveryCartContainer").show();
1012    } else {
1013      jQuery(".delivery_charge_check_container").hide();
1014      jQuery(".calc_price_with_map_container").hide();
1015      jQuery(".checkDeliveryCartContainer").hide();
1016    }
1017    if(io_brand=="EH"){
1018      jQuery(".delivery_charge_check_container").hide();
1019      jQuery(".eh_additional_description").show();
1020    }
1021    if(jQuery(".io_product_infobox .item_inputtype").text() === "Map"){
1022      jQuery(".delivery_charge_check_container").hide();
1023      jQuery(".checkDeliveryCartContainer").hide();
1024      jQuery(".calc_price_with_map_container").show();
1025    }
1026
1027    /* If we have delivery set in cookie, be sure to show the charge in the cart. */
1028    if(getCookie("io_deliveryFee") && simpleCart.items().length > 0) {
1029      setDeliverySubtotal(getCookie("io_deliveryFee"));
1030      jQuery("#deliverSubtotalContainer").show();
1031      jQuery("#checkDeliveryMessage").hide();
1032    } else{
1033      jQuery("#deliverSubtotalContainer").hide();
1034    }
1035
1036    /* moved back here for IO-22561 */
1037    if(simpleCart.items().length > 0){
1038      let headerBookButton = jQuery("a[href$='io_quoteform/']");
1039      headerBookButton.addClass("ioCart_link");
1040      headerBookButton.attr("href", "javascript:;");
1041    }
1042    jQuery(".cartInfo").unbind("click").one("click", function(event){
1043      event.stopPropagation();
1044      event.stopImmediatePropagation();
1045      cartShow();
1046    });
1047    jQuery(".ioCart,.ioCart_link").unbind("click").one("click", function(event){
1048      event.stopPropagation();
1049      event.stopImmediatePropagation();
1050      cartShow();
1051    });
1052
1053    /* hide if click outside cart */
1054    jQuery(document).mouseup(function(e){
1055      var container = jQuery("#cartPopover");
1056      var cartButton = jQuery(".cartInfo, .ioCart, .ioCart_link");
1057      var addButton = jQuery(".item_add");
1058      var timePicker = jQuery(".ui-timepicker-wrapper");
1059
1060      if(jQuery(".cartInfo, .ioCart, .ioCart_link").hasClass("open")){
1061        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){
1062          cartHide();
1063        }
1064      }
1065    });
1066
1067    if(!getCookie("io_state") && io_default_state){
1068      setCookie("io_state", io_default_state, 14);
1069    }
1070    if(country != "US") {
1071      jQuery("#io_cd_state").replaceWith('<input id="io_cd_state" style="display: table-cell" name="state" type="text"></input>');
1072      jQuery("#io_cdl_zip_label").text("Postal code");
1073      if(country == "CA"){
1074        jQuery("#io_cdl_state_label").text("Province");
1075      } else if(country == "AU"){
1076        jQuery("#io_cdl_city_label").text("Suburb");
1077      }
1078    } else{
1079      jQuery("#io_cd_zip").attr("type", "number");
1080    }
1081    /* Set up on change events to stop end timepickers from allowing users to pick times before start time */
1082    setTimeout(restrictEndTimepickers, 500);
1083    if(io_hide_end_time == "on" && io_default_duration > 0){
1084      jQuery('[name="timeEnd"]').parent().hide();
1085      // Hide end time stuff on checkout page and in the text.
1086      jQuery(".io_event_body_time .control-group:nth-child(2)").hide();
1087      jQuery(".io_event_body_time_display_text").text(jQuery(".io_event_body_time_display_text").text().replace(/\s*→.*/, ""))
1088      jQuery('[name="timeStart"]').change(function(){
1089        const regex = /^(\d{1,2}):(\d{2})(?:\s*([AP]M))?$/i;
1090        const match = this.value.match(regex);
1091
1092        let hours = parseInt(match[1], 10);
1093        const minutes = parseInt(match[2], 10);
1094        const period = match[3] ? match[3].toUpperCase() : null;
1095
1096        if (period) {
1097          if (period === "PM" && hours !== 12) hours += 12;
1098          if (period === "AM" && hours === 12) hours = 0;
1099        }
1100
1101        const baseDate = new Date(1970, 0, 1, hours, minutes);
1102        const newTime = new Date(baseDate.getTime() + io_default_duration * 3600000);
1103
1104        if (period) {
1105          // 12-hour
1106          let newHours = newTime.getHours();
1107          const newMinutes = newTime.getMinutes();
1108          const newPeriod = newHours >= 12 ? "PM" : "AM";
1109          newHours = newHours % 12;
1110          if (newHours === 0) newHours = 12;
1111          let end_time = `${newHours}:${newMinutes.toString().padStart(2, "0")} ${newPeriod}`;
1112          jQuery('[name="timeEnd"]').val(end_time);
1113        } else {
1114          // 24 hour
1115          let end_time = `${newTime.getHours().toString().padStart(2, "0")}:${newTime.getMinutes().toString().padStart(2, "0")}`;
1116          jQuery('[name="timeEnd"]').val(end_time);
1117        }
1118      });
1119    }
1120
1121    /* If we have a custom message in cart, display it. */
1122    if(io_cart_message){
1123      show_cart_message();
1124    }
1125
1126    /* code for day select in cart */
1127    if(io_cartdayselect == "dropdown_options" && io_multidayquote === "on"){
1128      saved_whatday = getCookie("io_whatday");
1129      if(saved_whatday) jQuery("#whatday").val(saved_whatday);
1130      endDisplay();
1131      setCalBackground();
1132    } else{
1133      jQuery("#div-overnight").hide();
1134      jQuery("#whatday").val("");
1135    }
1136
1137    checkRestrictedDeliveries()
1138    /* If we are using the information gathering tool, we do not want to show this message. */
1139    if( live_pricing_is_on() && io_info_required == "off" ){
1140      if(!event_time_set() && io_always_display_live_price != "on"){
1141        jQuery("#item_live_price_time_set_message").show();
1142      }else{
1143        jQuery("#item_live_price_time_set_message").hide();
1144      }
1145    }
1146
1147
1148    /* Check if information gathering header exists. If it does, Remove set even button and add some classes on onclicks */
1149    if(jQuery("#ioInfoHeader").length){
1150      remove_set_event_buttton();
1151      add_classes_and_onClicks();
1152      header_increment_step();
1153    }
1154
1155    jQuery(".io_acc_li").each(function() {
1156      if(jQuery(this).find(".item_required").first().text() > 0 && jQuery(this).find(".item_accessorydd").first().text() == 1){
1157        jQuery(jQuery(jQuery(this).parent()).prev()).appendTo(".io_product_requiredDD_accessories");
1158        jQuery(jQuery(this).parent()).appendTo(".io_product_requiredDD_accessories");
1159        jQuery(".io_product_requiredDD_accessories").show();
1160      }
1161    });
1162
1163    if(jQuery(".io_product_accessories .io_acc_li").length == 0) jQuery(".io_product_accessories").hide();
1164
1165    /* Hide the cart add button for items with required accessories on category page */
1166    jQuery(".item_hasRequiredAcc").each(function() {
1167      if (this.innerText == '1') {
1168        let rental_id_element = jQuery(this).parent().find(".item_rentalid")[0];
1169        let addCartButton = jQuery(".io_item2_list_inner .add_cart_" + rental_id_element.innerText).find('.io_button');
1170        addCartButton.removeClass("item_add");
1171        addCartButton.html('<i class="fas fa-arrow-right"></i>');
1172
1173        let itemHref = jQuery(this).parent().find(".item_href").text();
1174        addCartButton.attr('href', itemHref);
1175      }
1176    });
1177
1178
1179    /* If they have same day selection allowed, need to update checkout page datepicker on delay to make sure it works */
1180    if(io_cartAllowSameDay == "on"){
1181      setTimeout(allow_same_day_select_on_checkout, 500);
1182    }
1183
1184    if(io_info_required_data && io_info_required == "on"){
1185      let io_required_data = io_info_required_data;
1186      jQuery("#ioAdditonalInformationContainer").show();
1187      for (const [data, value] of Object.entries(io_required_data)) {
1188        if(value == 1){
1189          jQuery("#io_info_modal_"+data).css("display", "inline-flex")
1190          jQuery("#io_im_"+data).val(getCookie(data));
1191        }
1192      }
1193      show_or_hide_required_info_message()
1194    }
1195    if(jQuery(".bootstrap-timepicker").length == 0) {
1196      if (!/Mobi|Android/i.test(navigator.userAgent)) {
1197        jQuery("#cartPopover").scroll(function () {
1198          jQuery("[name=timeStart]").timepicker("hide");
1199          jQuery("[name=timeEnd]").timepicker("hide");
1200        });
1201        jQuery(window).scroll(function () {
1202          jQuery("#cartPopover [name=timeStart]").timepicker("hide");
1203          jQuery("#cartPopover [name=timeEnd]").timepicker("hide");
1204        });
1205      }
1206    }
1207
1208    if(jQuery(".io_product_infobox .item_inputtype").text() == "Map"){
1209      simpleCart.items().forEach(function (item, index){
1210        if(item.get("rentalid") === jQuery(".io_product_infobox .item_rentalid").text()){
1211          if(item.get("quantity") > 1){
1212            let units;
1213            if(jQuery(".io_product_infobox .item_qtytype").text() == "Area"){
1214              units = "sq meters"
1215              if(country === "US") units = "sq feet"
1216            }else if(jQuery(".io_product_infobox .item_qtytype").text() == "Perimeter"){
1217              units = "meters"
1218              if(country === "US") units = "feet"
1219            }
1220            set_price_on_item_page(units, item.get("quantity"));
1221          }
1222        }
1223      });
1224    }
1225    /* IO-21808 */
1226    jQuery(".io_product_price_box").each(function() {
1227      let classes = jQuery(this).attr("class");
1228      jQuery(this).attr("class", classes.replace(":", "_"));
1229    });
1230
1231    /* Set time instructions (IO-21496) */
1232    set_cart_time_instructions();
1233
1234    if(io_accessory_select === "on"){
1235      if(jQuery(".io_product_acc_pkg").children().length > 0){
1236        let main_rental_id = jQuery(".item_rentalid").text();
1237        let sel_div = jQuery("<div class=\"io_product_acc_pkg\" style=\"display:flex; margin-top:10px;\"></div>");
1238        let sel = jQuery("<select class=\"io_product_acc_pkg\" onchange=\"accOnClick(this)\" />");
1239        sel.append("<option value=\"\" selected=\"selected\" style=\"display:none\" disabled>Select one..</option>")
1240        jQuery("[id^=io_acc_shortname_"+main_rental_id+"]").each(function(){
1241          sel.append("<option value="+this.id+">"+this.innerHTML+"</option>")
1242          if(this.id.split("_").length > 4){
1243            let split_id = this.id.split("_");
1244            let option_rental_id = split_id[split_id.length - 1];
1245            let sel2 = jQuery("<select id=\"io_product_acc_pkg_sel_"+option_rental_id+"\" style=\"display:none; margin-left:5px;\" onchange=\"accOnClick(this)\" />");
1246            sel2.append("<option value=\"\" selected=\"selected\" style=\"display:none\" disabled>Select one..</option>")
1247            jQuery("[id^=io_acc_shortname_"+option_rental_id+"_]").each(function(){
1248              sel2.append("<option value="+this.id+">"+this.innerHTML+"</option>")
1249            });
1250            sel_div.append(sel2);
1251          }
1252        });
1253        sel_div.prepend(sel);
1254        jQuery(".io_product_acc_pkg").replaceWith(sel_div);
1255      }
1256    }
1257    if(io_cart_party_planner_email === "on" && io_cart_party_planner_destination){
1258      jQuery("#cartPartyBuilderEmailContainer").show()
1259      if(getCookie("io_email")){
1260        jQuery("#cartPartyBuilderEmailInput").val(getCookie("io_email"));
1261      }
1262    }
1263
1264    if(io_brand == "PW"){
1265      jQuery(".io_product_price_box").attr("style", "display: none !important;");
1266      jQuery(".io_product_price_sqfoot").attr("style", "display: grid !important;");
1267    }
1268
1269    setTimeout(simpleCart.init, 100);
1270    if(io_hide_zero == 1){
1271      jQuery(".io_product_price_top_left").each(function (){
1272        if(Number(this.innerText.replace(/[^0-9.-]+/g,"")) == 0){
1273          jQuery(this).parent().attr('style','display:none !important');
1274        }
1275      });
1276      jQuery(".io_product_price_left").each(function (){
1277        if(Number(this.innerText.replace(/[^0-9.-]+/g,"")) == 0){
1278          jQuery(this).parent().attr('style','display:none !important');
1279        }
1280      });
1281    }
1282      if (io_categoryVariantImages == 'on'){
1283          jQuery(".io_category_thumbox").show();
1284          jQuery('.view-product-button').addClass('view-product-button2')
1285      }
1286    let giftcard_value = jQuery(".item_giftcardvalue");
1287    if(giftcard_value && giftcard_value.text()){
1288      jQuery(".delivery_charge_check_container").hide();
1289    }
1290
1291    if (io_customer_geolocation == 'on') initializeGeolocation();
1292  }); /*end of on-ready*/
1293  /*</editor-fold>*/
1294
1295  /*<editor-fold defaultstate="collapsed" desc="Helper Functions">*/
1296  function phraseUpdateCount(inputElement)
1297  {
1298  //read the text and strip out spaces
1299    const fullText = inputElement.value;
1300    const lettersOnly  = fullText.replace(/\s+/g, "");
1301    const count = lettersOnly.length;
1302
1303    const cookieKey = inputElement.classList[0];
1304
1305    document.querySelector(".item_quantity").textContent = count;
1306
1307    setCookie(cookieKey, fullText, 45);
1308  }
1309  function io_party_planner_email_submit(){
1310    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,}))$/;
1311    let email = jQuery("#cartPartyBuilderEmailInput").val();
1312    if(email){
1313      if(email.match(valid_regex)){
1314        setCookie("io_email", email, 14);
1315        window.open(io_cart_party_planner_destination, '_blank').focus();
1316      }else{
1317        jQuery("#cartPartyBuilderEmailWarning").show();
1318      }
1319    }else{
1320      jQuery("#cartPartyBuilderEmailWarning").show();
1321    }
1322  }
1323
1324  function rid_in_batch(rid, batch_ids){
1325    let result = batch_ids.filter(function(batch){
1326      if(batch.includes(this)) return true;
1327    }, rid);
1328    return result
1329  }
1330
1331  function set_cart_time_instructions(){
1332    /* Making it clearer that customers need to set the time in order to see pricing and availability. */
1333    let instructions_container = jQuery("<p id=\"ioCartTimeInstructions\"></p>");
1334    let instructions = "";
1335
1336    if(multi_day){
1337      instructions += "Select the event date or date range using the calendar";
1338    }else{
1339      instructions += "Select the event date using the calendar";
1340    }
1341    instructions += ".";
1342    instructions_container.text(instructions);
1343    jQuery("#cartCalendar").append(instructions_container);
1344  }
1345
1346  function live_pricing_is_on(){
1347    /*
1348    Checks to see if live pricing is on. Assumes it is on unless one of the following conditions:
1349       The setting Hide Live Price is off.
1350       The setting Show Weekend/Weekday Pricing is off.
1351       Delivery method pricing is enabled by default.
1352       We are on an item page that uses delivery method pricing.
1353    */
1354    if(io_hide_live_prices != 1 || io_weekEndPrice != "on" ||
1355            io_delivery_prices["default"].length != 0 || jQuery(".io_product_infobox .item_rentalid").innerText in io_delivery_prices["override"] ||
1356            io_custom_prices["default"].length != 0 || jQuery(".io_product_infobox .item_rentalid").innerText in io_delivery_prices["override"]){
1357      return false;
1358    }
1359    return true;
1360  }
1361
1362  function allow_same_day_select_on_checkout(){
1363    jQuery(".jquery-datepicker").datepicker("option", "minDate", 0);
1364  }
1365
1366  function show_or_hide_required_info_message(){
1367    if(io_info_required == "on"){
1368      if(!all_info_provided()){
1369        jQuery("#io_all_prices").hide();
1370        jQuery("#item_additonal_info_open_message").show();
1371      }else{
1372        jQuery("#io_all_prices").show();
1373        jQuery("#item_additonal_info_open_message").hide();
1374      }
1375    }
1376  }
1377
1378  function all_info_provided(){
1379    /* This is used for when the "Hide all pricing on page until information is provided" setting is on price settings. */
1380    let all_data_provided = true;
1381    let io_required_data = io_info_required_data;
1382    for (const [data, value] of Object.entries(io_required_data)) {
1383      if(value == 1){
1384        if(!getCookie(data)){
1385          all_data_provided = false
1386        }
1387      }
1388    }
1389
1390    if(live_pricing_is_on() && !event_time_set()) {
1391      all_data_provided = false;
1392    }
1393
1394    return all_data_provided;
1395  }
1396
1397  function event_time_set(){
1398    if(getCookie("io_timeStart") &&
1399            getCookie("io_timeEnd") &&
1400            getCookie("io_dateStart") &&
1401            getCookie("io_dateEnd")){
1402      return true;
1403    } else{
1404      return false
1405    }
1406  }
1407
1408  function show_cart_message(){
1409    message_container = jQuery("#cartCustomMessage");
1410    message_container.html(io_cart_message);
1411    message_container.show();
1412  }
1413
1414  function deliveryMethodSelected(){
1415    setCookie("io_delivery_method", jQuery(".ioDeliveryMethods option:selected").text(), 14);
1416    checkRestrictedDeliveries();
1417  }
1418
1419  function adjustPicBoxForHeader(){
1420    /* For some reason its hard to get css with querySelector so we use jQuery to get the picbox. */
1421    pic_box = jQuery(".io_product_picbox");
1422    io_header = document.querySelector(".io_header");
1423    if(pic_box != null && pic_box.css("position") == "sticky"){
1424      if(io_header != null){
1425        header_height = io_header.offsetHeight;
1426        pic_box.css("top", (10+header_height).toString()+"px");
1427      }
1428      else{
1429        possible_headers = document.querySelectorAll("header,section")
1430        possible_headers.forEach((ele) =>{
1431          if(ele.style.top == "0px" && (ele.style.position == "fixed" || ele.style.position == "sticky")){
1432            header = ele;
1433            header_height = header.offsetHeight;
1434            pic_box.css("top", (10+header_height).toString()+"px");
1435
1436          }
1437        });
1438      }
1439    }
1440  }
1441  function cart_times_all_set(){
1442    if(jQuery("#ioCartTimeSelectContainer [name=dateStart]").val() == ""){
1443      return false;
1444    }
1445    if(io_hidetimes === "off" || io_hidetimes === ""){
1446      if(jQuery("#ioCartTimeSelectContainer [name=timeStart]").val() == ""){
1447        return false;
1448      }
1449      if(jQuery("#ioCartTimeSelectContainer [name=timeEnd]").val() == ""){
1450        return false;
1451      }
1452    }
1453
1454    return true;
1455  }
1456  function checkRestrictedDeliveries(){
1457    let items = simpleCart.items()
1458    let restrictions_found = false;
1459    for(i in items){
1460      let rid = items[i].get("rentalid");
1461      if(typeof jQuery(".ioDeliveryMethods").val() != "undefined"){
1462        if(io_delivery_methods[jQuery(".ioDeliveryMethods").val()]["restricted"].includes(rid)){
1463          jQuery("#deliveryMethodWarning").show();
1464          restrictions_found = true;
1465        }
1466      }
1467    }
1468    if(!restrictions_found){
1469      jQuery("#deliveryMethodWarning").hide();
1470    }
1471  }
1472
1473  function display_cart_warning(item){
1474    let cart_warning_container = jQuery("#cartWarning");
1475
1476    // Check if an event date if not we should tell them to set it.
1477    event_times = getAvailTimes();
1478    if(!event_times[0] || !event_times[1]){
1479      cart_warning_container.text("Please set the date and time for your event above.");
1480      cart_warning_container.show();
1481      return false;
1482    }
1483
1484    let item_name = item.get("name");
1485    let item_timeslots = item.get("timeslots");
1486    let timeslot_name = getTimeslotName(item_timeslots);
1487
1488    let stop_loop = false;
1489    if(item_timeslots){
1490      if(jQuery(item_timeslots).nodeName == "SELECT"){
1491        /* NOTE: It should not be possible for timeslots to be empty.
1492                   But in the event they somehow are, we should have this here. */
1493        /* timeslots */
1494        var timeslot_sel_range = jQuery(".item-timeslots [name=\""+timeslot_name+"\"] option:selected").val();
1495        if(typeof timeslot_sel_range != "undefined"){
1496          var [start_time, end_time] = break_timeslot_sel_range(timeslot_sel_range);
1497        }
1498      }else{
1499        /*  timepickers */
1500        let [start_timepicker, end_timepicker] = get_cart_timepickers(timeslot_name);
1501        var start_time = start_timepicker.value;
1502        var end_time = end_timepicker.value;
1503      }
1504      if(!start_time || !end_time){
1505        cart_warning_container.text("Please select a time range for the following item: " + item_name);
1506        cart_warning_container.show()
1507        stop_loop = true;
1508      }
1509    } else{
1510      cart_warning_container.text("Some items are not available on this date.");
1511      cart_warning_container.show()
1512    }
1513    return stop_loop
1514  }
1515
1516  const io_personal_cookie_keys = ["io_email", "io_phone", "io_address", "io_city", "io_state", "io_zip"];
1517
1518  function ioHasMarketingConsent(){
1519    if(typeof cmplz_has_consent !== 'function'){
1520      return true;
1521    }
1522    return cmplz_has_consent('marketing');
1523  }
1524
1525  function ioUnwrapStoredValue(raw) {
1526      // Fully peel any {v,e} wrapper layers that may have accumulated when an
1527      // older plugin version re-saved an already-wrapped value (IO-36799). Cart
1528      // values (dates, times, addresses) are never JSON objects, so any layer
1529      // that parses to a {v,...} object is a wrapper to unwrap. Returns
1530      // { value, expired, malformed } describing the innermost stored string.
1531      var value = (raw == null) ? "" : String(raw);
1532      for (var depth = 0; depth < 25; depth++) {
1533        var trimmed = value.trim();
1534        if (trimmed.charAt(0) !== '{') break;          // plain value -> done
1535        var obj;
1536        try {
1537          obj = JSON.parse(trimmed);
1538        } catch (e) {
1539          break;                                       // not parseable -> stop, keep value
1540        }
1541        if (!obj || typeof obj !== 'object' || !('v' in obj)) break;  // not our wrapper
1542        if (obj.e && Date.now() > obj.e) {
1543          return { value: "", expired: true, malformed: false };
1544        }
1545        value = (obj.v != null) ? String(obj.v) : "";
1546      }
1547      // Only flag as malformed if what remains still looks like our own broken
1548      // {"v":...} wrapper (e.g. truncated) -- never an ordinary value that just
1549      // happens to start with "{", which must be preserved untouched.
1550      var malformed = /^\s*\{\s*"v"\s*:/.test(value);
1551      return { value: value, expired: false, malformed: malformed };
1552  }
1553
1554  function setCookie(cname, cvalue, exdays) {
1555      if(io_personal_cookie_keys.indexOf(cname) !== -1 && !ioHasMarketingConsent()){
1556        return;
1557      }
1558      // Store values in localStorage with an io_ prefix for uniqueness and emulate expiration
1559      try {
1560        // Unwrap first so an already-wrapped value can never be re-wrapped and
1561        // compound into nested {v,e} layers (IO-36799).
1562        var clean = ioUnwrapStoredValue(cvalue).value;
1563        var expiresAt = (typeof exdays === 'number' && exdays > 0)
1564          ? Date.now() + (exdays * 24 * 60 * 60 * 1000)
1565          : null;
1566        var payload = JSON.stringify({ v: clean, e: expiresAt });
1567        window.localStorage.setItem(cname, payload);
1568      } catch (e) {
1569        // Swallow errors to keep behavior similar to cookie writes silently failing
1570        console.log(e);
1571      }
1572  }
1573
1574  function getCookie(cname) {
1575    // Read values from localStorage honoring expiration; return empty string if missing/expired
1576    try {
1577      var raw = window.localStorage.getItem(cname);
1578      if (!raw) return "";
1579      var result = ioUnwrapStoredValue(raw);
1580      if (result.expired || result.malformed) {
1581        // Drop expired or corrupted entries so they self-heal instead of being
1582        // rendered as raw JSON in the date/time fields (IO-36799).
1583        try { window.localStorage.removeItem(cname); } catch (e) {}
1584        return "";
1585      }
1586      return result.value;
1587    } catch (e) {
1588      return "";
1589    }
1590  }
1591  async function fetchAndSetCookie(name) {
1592    var requestInit = { credentials: "include" };
1593    fetch("https://rental.software/include/get_cookie.php?name=" + name, requestInit).then(function (response) {
1594      return response.json();
1595    }).then(function (response) {
1596      return handleResponse(name, response);
1597    });
1598  }
1599
1600  function handleResponse(name, response) {
1601    var currentCookieValue = getCookie(name);
1602    if (!!response.value && currentCookieValue !== response.value) {
1603      setCookie(name, response.value, 14);
1604    }
1605    return response.value;
1606  }
1607
1608  function clearIoPersonalDataForNoConsent(){
1609    io_personal_cookie_keys.forEach(function(key){
1610      try {
1611        window.localStorage.removeItem(key);
1612      } catch (e) {
1613        console.log(e);
1614      }
1615    });
1616
1617    var trackingUrl = (window.location.href.indexOf("localhost") > -1)
1618      ? "http://localhost/io/bugs/include/iotracking.php"
1619      : "https://rental.software/include/iotracking.php";
1620    var clearImg = new Image();
1621    clearImg.src = trackingUrl + "?action=remove&nocache=" + Math.random();
1622  }
1623
1624  document.addEventListener("cmplz_status_change", function (e) {
1625    if (e.detail.category === 'marketing' && e.detail.value === 'deny') {
1626      clearIoPersonalDataForNoConsent();
1627    }
1628  });
1629
1630  function break_timeslot_sel_range(timeslot_sel_range){
1631    /* Takes a time range given by selected timeslot and gets the start and end time removing meridiem.*/
1632    timeslot_sel_arr = timeslot_sel_range.split(" - ");
1633    var start_time = timeslot_sel_arr[0].replace("am"," am").replace("pm"," pm").replace("  "," ");
1634    var end_time = timeslot_sel_arr[1].replace("am"," am").replace("pm"," pm").replace("  "," ");
1635
1636    return Array(start_time, end_time);
1637  }
1638  function getAvailTimes(){
1639    /*
1640    Commonly used helper function. Accomplishes two things:
1641      Returns an array containing start_date, start_time, and event duration.
1642      Sets cookies for start and end date, and start and end time.
1643
1644    Uses the inputs available in the cart if they are filled out, so dateStart, dateEnd, timeStart, and timeEnd.
1645    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.
1646    */
1647    let start_date = jQuery("input[name=dateStart]").val();
1648    let end_date = jQuery("input[name=dateEnd]").val();
1649    if(io_company_timeslots.length != 0 && io_cartdayselect == "single_day"){
1650      let cart_company_timeslot_selected = jQuery(".ioCartCompanyTimeslots option:selected").first().val();
1651      if(cart_company_timeslot_selected){
1652        setCookie("io_company_timeslot_selected", cart_company_timeslot_selected, 14);
1653        cart_company_timeslot_selected = cart_company_timeslot_selected.split("-");
1654        var start_time = cart_company_timeslot_selected[0].trim();
1655        var end_time = cart_company_timeslot_selected[1].trim();
1656      }
1657    } else {
1658      var start_time = jQuery("input[name=timeStart]").val();
1659      var end_time = jQuery("input[name=timeEnd]").val();
1660    }
1661
1662    if (start_date.length == 0) {
1663      start_date = getCookie("io_dateStart");
1664      end_date = getCookie("io_dateEnd");
1665      start_time = getCookie("io_timeStart");
1666      end_time = getCookie("io_timeEnd");
1667    }
1668
1669    const has_selected_company_timeslot = io_company_timeslots.length != 0
1670      && io_cartdayselect == "single_day"
1671      && jQuery(".ioCartCompanyTimeslots option:selected").first().val();
1672
1673    if(io_hidetimes === "on"
1674      && io_force_blank_timepickers != "on"
1675      && !has_selected_company_timeslot) {
1676      start_time = start_default;
1677      end_time = end_default;
1678      jQuery("input[name=timeStart]").val(start_time);
1679      jQuery("input[name=timeEnd]").val(end_time);
1680    }
1681
1682    if(io_force_blank_timepickers != "on")
1683    {
1684      if(start_time.length == 0)
1685      {
1686        start_time = start_default;
1687      }
1688      if(end_time.length == 0)
1689      {
1690        end_time = end_default;
1691      }
1692    }
1693
1694
1695    /* no past dates */
1696    if(start_date.length != 0 && convertDateStringtoDateObject(start_date, start_time) < new Date()){
1697      start_date="";
1698      end_date="";
1699    }
1700    /* setCookie("checkDate", start_date, 14); */
1701    setCookie("io_dateStart", start_date, 14);
1702    setCookie("io_dateEnd", end_date, 14);
1703    setCookie("io_timeStart", start_time, 14);
1704    setCookie("io_timeEnd", end_time, 14);
1705    /* If we are using the information gathering tool, we do not want to show this message.*/
1706    if( live_pricing_is_on() && io_info_required == "off" ){
1707      if(!event_time_set() && io_always_display_live_price != "on"){
1708        jQuery("#item_live_price_time_set_message").show();
1709      }else{
1710        jQuery("#item_live_price_time_set_message").hide();
1711      }
1712    }
1713
1714    var newDate1 = convertDateStringtoDateObject(start_date, start_time);
1715    var newDate2 = convertDateStringtoDateObject(end_date, end_time);
1716    let time_duration = ((newDate2 - newDate1) / 3600) / 1000;
1717    return [start_date,start_time,time_duration];
1718  }
1719
1720  function  getAllRentalIDsFromCart(){
1721    let rental_ids = "";
1722    jQuery("[id^='cartItem_']").each(function(){
1723      children = this.children
1724      for(let i = 0; i < children.length; ++i){
1725        if(children[i].className == "item-rentalid") {
1726          rental_ids += children[i].innerText + "|";
1727          break;
1728        }
1729      }
1730    });
1731    return rental_ids
1732  }
1733  /*</editor-fold>*/
1734
1735  /*<editor-fold defaultstate="collapsed" desc="Info Header Functions">*/
1736  function init_date_timepicker_for_info_header(){
1737    jQuery(".ioInfoDatepicker").datepicker({
1738      changeMonth: true,
1739      changeYear: true,
1740      dateFormat: dateFormat,
1741      rangeSelect: true,
1742      numberOfMonths: 1,
1743      stepMonths: 1,
1744      speed: "fast",
1745      showOn: "both",
1746      onChangeMonthYear: cal_onChangeMonthYear,
1747      buttonText: "Calendar",
1748      minDate: 1,
1749      firstDay: 0
1750    });
1751    jQuery("#ioHeaderDateStart").datepicker("option", { onSelect: function() {
1752        set_info_header_end_date();
1753        saveInfoHeader();
1754        // Add more functions if needed
1755      }
1756    });
1757
1758    if(restrictTimes){
1759      jQuery(".ioInfoTimepicker").timepicker({
1760        startTime: new Date(0, 0, 10, 0, 0, 0),
1761        endTime: new Date(0, 0, 0, 20, 0, 0, 0),
1762        minTime:restrictTimeStart,
1763        maxTime:restrictTimeEnd,
1764        /*show24Hours: $show24Hours,*/
1765        timeFormat: timeFormat,
1766        separator: ":",
1767        className: "elementor-widget-text-editor",
1768        step: 15,
1769        disableTouchKeyboard: true
1770      });
1771    } else{
1772      jQuery(".ioInfoTimepicker").timepicker({
1773        startTime: new Date(0, 0, 10, 0, 0, 0),
1774        endTime: new Date(0, 0, 0, 20, 0, 0, 0),
1775        /*show24Hours: $show24Hours,*/
1776        timeFormat: timeFormat,
1777        separator: ":",
1778        className: "elementor-widget-text-editor",
1779        step: 15,
1780        disableTouchKeyboard: true
1781      });
1782    }
1783    setTimeout(setUpTimeRestrictions_infoHeaderTimepickers, 500);
1784  }
1785
1786  function saveInfoHeader(){
1787    let info_header_start_date = jQuery("[id$=ioHeaderDateStart]");
1788    let info_header_end_date = jQuery("[id$=ioHeaderDateEnd]");
1789    let info_header_start_time = jQuery("[id$=ioHeaderTimeStart]");
1790    let info_header_end_time = jQuery("[id$=ioHeaderTimeEnd]");
1791    let info_header_address = jQuery("[id$=ioHeaderAddress]");
1792    let info_header_city = jQuery("[id$=ioHeaderCity]");
1793    let info_header_state = jQuery("[id$=ioHeaderState]");
1794    let info_header_zip = jQuery("[id$=ioHeaderZipCode]");
1795    let info_header_phone = jQuery("[id$=ioHeaderPhone]");
1796    let info_header_email = jQuery("[id$=ioHeaderEmail]");
1797
1798    if(info_header_start_time.val()) setCookie("io_timeStart", info_header_start_time.val(), 14);
1799    if(info_header_end_time.val()) setCookie("io_timeEnd", info_header_end_time.val(), 14);
1800    if(info_header_start_date.val()) setCookie("io_dateStart", info_header_start_date.val(), 14);
1801    if(info_header_end_date.val()) setCookie("io_dateEnd", info_header_end_date.val(), 14);
1802    if(info_header_address.val()) setCookie("io_address", info_header_address.val(), 14);
1803    if(info_header_city.val()) setCookie("io_city", info_header_city.val(), 14);
1804    if(info_header_state.val()) setCookie("io_state", info_header_state.val(), 14);
1805    if(info_header_zip.val()) setCookie("io_zip", info_header_zip.val(), 14);
1806    if(info_header_phone.val()) setCookie("io_phone", info_header_phone.val(), 14);
1807    if(info_header_email.val()) setCookie("io_email", info_header_email.val(), 14);
1808
1809    /* Set information in the cart. */
1810    calCancel();
1811
1812    header_increment_step();
1813
1814    /* Stop form from doing anything else for elementor */
1815    // jpa - still allow, turn off actions in form if wanted. to turn off io lead submission use the plugin settings
1816    //event.preventDefault();
1817    //event.stopPropagation();
1818    return true;
1819  }
1820
1821  function set_info_header_values(){
1822    let info_header_start_date = jQuery("[id$=ioHeaderDateStart]");
1823    let info_header_end_date = jQuery("[id$=ioHeaderDateEnd]");
1824    let info_header_start_time = jQuery("[id$=ioHeaderTimeStart]");
1825    let info_header_end_time = jQuery("[id$=ioHeaderTimeEnd]");
1826    let info_header_street = jQuery("[id$=ioHeaderAddress]");
1827    let info_header_city = jQuery("[id$=ioHeaderCity]");
1828    let info_header_state = jQuery("[id$=ioHeaderState]");
1829    let info_header_zip = jQuery("[id$=ioHeaderZipCode]");
1830    let info_header_phone = jQuery("[id$=ioHeaderPhone]");
1831    let info_header_email = jQuery("[id$=ioHeaderEmail]");
1832
1833    if(getCookie("io_timeStart")) info_header_start_time.val(getCookie("io_timeStart"));
1834    if(getCookie("io_timeEnd")) info_header_end_time.val(getCookie("io_timeEnd"));
1835    if(getCookie("io_dateStart")) info_header_start_date.val(getCookie("io_dateStart"));
1836    if(getCookie("io_dateEnd")) info_header_end_date.val(getCookie("io_dateEnd"));
1837    if(getCookie("io_address")) info_header_street.val(getCookie("io_address"));
1838    if(getCookie("io_city")) info_header_city.val(getCookie("io_city"));
1839    if(getCookie("io_state")) info_header_state.val(getCookie("io_state"));
1840    if(getCookie("io_zip")) info_header_zip.val(getCookie("io_zip"));
1841    if(getCookie("io_phone")) info_header_phone.val(getCookie("io_phone"));
1842    if(getCookie("io_email")) info_header_email.val(getCookie("io_email"));
1843  }
1844
1845  function add_classes_and_onClicks(){
1846
1847    /* First set up for dates */
1848    let info_header_start_date = jQuery("#ioHeaderDateStart");
1849    let info_header_end_date = jQuery("#ioHeaderDateEnd");
1850    info_header_start_date.addClass("ioInfoDatepicker");
1851    info_header_end_date.addClass("ioInfoDatepicker");
1852
1853    /* Now Timepickers */
1854    let info_header_start_time = jQuery("#ioHeaderTimeStart");
1855    let info_header_end_time = jQuery("#ioHeaderTimeEnd");
1856    info_header_start_time.addClass("ioInfoTimepicker");
1857    info_header_end_time.addClass("ioInfoTimepicker");
1858
1859    /* Add the onClick to the button */
1860    let button = jQuery("#ioInfoHeaderSubmit");
1861    button.click(saveInfoHeader);
1862    button.css("cursor", "pointer");
1863
1864    /* Init datepicker and timepickers */
1865    init_date_timepicker_for_info_header();
1866
1867    /* Lastly set the values if they are set already */
1868    set_info_header_values();
1869  }
1870
1871  function remove_set_event_buttton(){
1872    let set_event_button = jQuery(".pageDateRangeWrapper");
1873    if(set_event_button.length > 0) set_event_button.hide();
1874  }
1875
1876  function set_info_header_end_date(){
1877    if(!jQuery("#ioHeaderDateEnd").val()){
1878      jQuery("#ioHeaderDateEnd").val(jQuery("#ioHeaderDateStart").val())
1879    }
1880    jQuery("#ioHeaderDateEnd").datepicker("option", { minDate: new Date(jQuery("#ioHeaderDateStart").val()) });
1881  }
1882
1883  function header_increment_step(){
1884    let active = jQuery(".io-step-active");
1885
1886    switch(active.attr("id")){
1887      case "io-step-1":
1888        if (/Mobi|Android/i.test(navigator.userAgent)) {
1889          jQuery("#io-step-2,#io-step-3,#io-step-4").hide();
1890        }
1891        if(check_header_step_one(active)){
1892          active.removeClass("io-step-active");
1893          active.addClass("io-step-done")
1894          jQuery("#io-step-2").addClass("io-step-active")
1895          header_increment_step();
1896        }
1897        break;
1898      case "io-step-2":
1899        if (/Mobi|Android/i.test(navigator.userAgent)) {
1900          jQuery("#io-step-2,#io-step-3,#io-step-4").show();
1901        }
1902        if(simpleCart.items().length > 0){
1903          active.removeClass("io-step-active");
1904          active.addClass("io-step-done")
1905          jQuery("#io-step-3").addClass("io-step-active")
1906          header_increment_step();
1907        }
1908        break;
1909      case "io-step-3":
1910        if (/Mobi|Android/i.test(navigator.userAgent)) {
1911          jQuery("#io-step-2,#io-step-3,#io-step-4").show();
1912        }
1913        if(document.location.href.indexOf("io_quoteconfirm") >= 0){
1914          active.removeClass("io-step-active");
1915          active.addClass("io-step-done")
1916          jQuery("#io-step-4").addClass("io-step-active")
1917          header_increment_step();
1918        }
1919        break;
1920      case "io-step-4":
1921        if (/Mobi|Android/i.test(navigator.userAgent)) {
1922          jQuery("#io-step-2,#io-step-3,#io-step-4").show();
1923        }
1924        break;
1925    }
1926  }
1927
1928  function check_header_step_one(active) {
1929    var allInputs = active.find('input');
1930
1931    for (var i = 0; i < allInputs.length; i++) {
1932      if (jQuery(allInputs[i]).val() === "") {
1933        return false; // Return false if any input is empty
1934      }
1935    }
1936    return true; // Return true if all inputs have a value
1937  }
1938
1939  /*</editor-fold>*/
1940
1941  /*<editor-fold defaultstate="collapsed" desc="Accessory Click Functions">*/
1942  function accDDClicked(event){
1943    this_element = jQuery(this)
1944    if(!this_element.prop("selected")){
1945      pid = event.data.pid
1946      accLmt = event.data.accLmt
1947      all_elements = jQuery("[id^=io_acc_"+pid+"_]")
1948      let count = 0;
1949      /* Tried using .filter and .length to get the count of selected items but could not make it work. */
1950      for(i = 0; i < all_elements.length; ++i){
1951        if(all_elements[i].selected){
1952          ++count;
1953        }
1954      }
1955      if(accLmt == 0){
1956        this_element.css("border", "5px solid #bbb");
1957        this_element.prop("selected", true);
1958      } else if(count >= accLmt){
1959        let selected_value = jQuery("[id^=io_acc_"+pid+"_]").filter(function() {
1960          return this["selected"];
1961        });
1962        /* be sure to unselect other slected values if our acc limit has been reached. */
1963        selected_value.prop("selected", false);
1964        selected_value.css("border", "1px solid #bbb");
1965      }
1966      this_element.css("border", "5px solid #bbb");
1967      this_element.prop("selected", true);
1968    } else{
1969      this_element.prop("selected", false);
1970      this_element.css("border", "1px solid #bbb");
1971    }
1972  }
1973
1974  /* when accessory choice is clicked */
1975  function accOnClick(acc_select=null){
1976    /* set name/img back to original main in case they are just clicking on a 1st level size option */
1977    jQuery("#bookNowBtn").removeClass("item_add").addClass("item_add_off").trigger("classChange");
1978    jQuery(".io_product_title.item_name").html(main_name_orig);
1979    jQuery(".io_product_container .item_image").first().attr("src",main_img_src);
1980    jQuery(".io_product_container .item_image").first().attr("data-src",main_img_src);
1981    jQuery(".io_product_container .item_encoded").first().html(main_encoded);
1982    jQuery(".io_product_container .io_image_big").first().attr("src",main_img_src);
1983    jQuery(".io_product_container .io_image_big").first().attr("data-src",main_img_src);
1984    let main_id = jQuery(".io_product_container .item_rentalid").first().text();
1985    let main_id_arr = main_id.split(":")
1986    jQuery(".io_product_container .item_rentalid").html(main_id_arr[0]);
1987    let clk_id;
1988    if(jQuery(acc_select).find(":selected").val()){
1989      clk_id = jQuery(acc_select).find(":selected").val().replace("io_acc_shortname_","");
1990    }else{
1991      clk_id = this.id.replace("io_acc_shortname_","");
1992    }
1993    clk_id = clk_id.replace("iothumb_","");
1994    let click_id_arr = clk_id.split("_");
1995    /* let pid = main_id; */
1996    /* if(main_id.split("_").length>1) pid = parseInt(click_id_arr[0]); */
1997    let acc_obj_relate_is_map = acc_obj_relate instanceof Map;
1998    let acc_obj_relate_entries = acc_obj_relate_is_map ? acc_obj_relate.entries() : Object.entries(acc_obj_relate);
1999    for (let [key, value] of acc_obj_relate_entries) {
2000      let id = key;
2001      let children = acc_obj_relate_is_map ? acc_obj_relate.get(key) : value;
2002      if(Object.keys(children).length>0){
2003        for (key2 in children) {
2004          if(Object.keys(children[key2]).length > 0){
2005            /* 3rd level */
2006            for (key3 in children[key2]) {
2007              displayPackageChoices(clk_id,key2,key3,children[key2]);
2008            }
2009          }else{
2010            displayPackageChoices(clk_id,key,key2,children);
2011          }
2012        }
2013      }else{
2014        displayPackageChoices(clk_id,0,id,acc_obj_relate);
2015      }
2016    }
2017  }
2018
2019  /* show/hide accessory levels as needed */
2020  /* clk_id: one they clicked on, pid: parentid, id: iterator, arr: relationship array */
2021  function displayPackageChoices(clk_id,pid,id,arr){
2022    let main_id = jQuery(".io_product_container .item_rentalid").first().text();
2023    let main_arr = main_id.split("_");
2024    if(main_arr.length>1) main_id = parseInt(main_arr[0]);
2025    let click_id_arr = clk_id.split("_");
2026    elem = getAccElem(id,pid);
2027    if(click_id_arr[0]==pid || click_id_arr[1]==pid || pid==0){
2028      elem.style.display="inline-block";
2029    }else{
2030      elem.style.display="none";
2031    }
2032    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)){
2033      jQuery("#bookNowBtn").removeClass("item_add_off").addClass("item_add").trigger("classChange");
2034      updateMainItem(id,pid);
2035    }
2036  }
2037
2038  /* update it with accessory data for choices */
2039  var main_img_src = jQuery("#single_image").first().attr("href");
2040  var main_name_orig = jQuery(".io_product_title.item_name").html();
2041  var main_encoded = jQuery(".io_product_container .item_encoded").html();
2042  var main_desc = jQuery(".io_product_detailbox .io_product_desc").html();
2043  function updateMainItem(id,pid){
2044    /* update add to cart btn, name, img, desc */
2045    let name = "";
2046    let name_enc = "";
2047    let main_id = jQuery(".io_product_container .item_rentalid").first().text();
2048    let main_arr = main_id.split(":");
2049    if(main_arr.length>1) main_id = main_arr[0];
2050    if(pid!=0){
2051      name += jQuery("#io_acc_itemname_"+pid).html()+":";
2052      name_enc += jQuery("#io_acc_itemname_"+pid).html()+":";
2053      name += jQuery("#io_acc_shortname_"+id).html();
2054      name_enc += jQuery("#io_acc_itemname_"+id).html();
2055    }else{
2056      pid = main_id;
2057      name += jQuery("#io_acc_itemname_"+id).html();
2058      name_enc += jQuery("#io_acc_itemname_"+id).html();
2059    }
2060    jQuery(".io_product_container .item_encoded").html(encodeURIComponent(name_enc.replace(/[\u2032\u2019]+/ig,"'")));
2061    jQuery(".io_product_container .item_rentalid").html(main_id+":"+pid+"_"+id);
2062    jQuery(".io_product_title.item_name").html(name);
2063    // Make sure the description actually displays text.
2064    let acc_desc = jQuery("#io_acc_desc_"+pid+"_"+id).first();
2065    if(acc_desc.length>0 && acc_desc.text()){
2066      jQuery(".io_product_container .io_product_desc").first().html(jQuery("#io_acc_desc_"+pid+"_"+id).first()[0].innerHTML);
2067    }
2068
2069    /* swap accessory image with main image pic for drop-down type items (linens) */
2070    let img = jQuery("#io_acc_imgbig_"+pid+"_"+id).first().attr("href");
2071    if(img==null) img = jQuery("#iothumb_"+pid+"_"+id).first().attr("src")
2072    if(img==null){
2073    }else{
2074      if(img.length==0 && pid==main_id){
2075        /* for 1 level dd items that have no img, use the main img */
2076        img = main_img_src;
2077      }
2078      jQuery(".io_product_container .io_image_big").first().attr("src",img);
2079      jQuery(".io_product_container .io_image_big").first().attr("data-src",
2079img);
2080      jQuery(".io_product_container .item_image").first().attr("src",jQuery("#iothumb_"+pid+"_"+id).first().attr("src"));
2081      jQuery(".io_product_container .item_image").first().attr("data-src",jQuery("#iothumb_"+pid+"_"+id).first().attr("src"));
2082
2083      jQuery("#single_image").first().attr("href",img).show();
2084    }
2085    checkAvailFilter();
2086  }
2087
2088  /* get either img or text for accessory choices */
2089  function getAccElem(id,pid){
2090    let path =pid+"_"+id;
2091    if(pid==0){
2092      path=id;
2093    }
2094    let elem = null;
2095    try{
2096      elem = document.querySelector("#ioAccButtonWrapper_"+path);
2097    }catch(e){}
2098    if(elem == null){
2099      try{
2100        elem = document.querySelector("#iothumb_"+path);
2101      }catch(e){}
2102    }
2103    if(elem==null){
2104      try{
2105        elem = document.querySelector("#io_product_acc_pkg_sel_"+pid);
2106      }catch(e){}
2107      if(elem!=null) return elem;
2108    }else{ return elem; }
2109    if(elem == null){
2110      try{
2111        elem = document.querySelector("#io_acc_shortname_"+path);
2112      }catch(e){}
2113    }else if(elem.src=="" | elem.getAttribute("data-src")==""){
2114      try{
2115        elem = document.querySelector("#io_acc_shortname_"+path);
2116      }catch(e){}
2117    }else if(elem.src.substr(-1)=="/"){
2118      try{
2119        elem = document.querySelector("#io_acc_shortname_"+path);
2120      }catch(e){}
2121    }
2122    if(elem==null){
2123      try{
2124        elem = document.querySelector("#io_acc_shortname_"+id);
2125      }catch(e){}
2126    }
2127    return elem;
2128  }
2129
2130  /* create the accessory choice btn (img/text) */
2131  function makeAccBtn(button_add,pid){
2132    let newButton;
2133    if(button_add.nodeName=="IMG"){
2134      newButton = button_add;
2135      let id =  newButton.id.replace("iothumb_"+pid,"");
2136      var wrapper = document.createElement("div");
2137      wrapper.setAttribute("id", "ioAccButtonWrapper_"+pid+id);
2138      wrapper.style.display = "inline-block";
2139      wrapper.appendChild(newButton);
2140      let acc_name = document.createElement("span");
2141      acc_name.style.overflow = "hidden";
2142      acc_name.style.textOverflow = "ellipsis";
2143      acc_name.style.maxWidth = "80px";
2144      acc_name.style.display = "block";
2145      acc_name.style.whiteSpace = "nowrap";
2146      acc_name.textContent = jQuery("#io_acc_shortname"+id).text();
2147      acc_name.classList.add("accTextName");
2148      acc_name.setAttribute("id", "io_acc_shortname_"+pid+id);
2149      wrapper.appendChild(document.createElement("br"));
2150      wrapper.appendChild(acc_name);
2151
2152    }else{
2153      newButton = button_add.cloneNode(true);
2154      let id = newButton.id.replace("io_acc_shortname_","");
2155      newButton.id = "io_acc_shortname_" + pid + "_" + id;
2156    }
2157    newButton.classList.add("elementor-animation-grow");
2158    newButton.classList.remove("item_image");
2159    newButton.style="cursor:pointer;border: solid 1px grey";
2160    newButton.classList.add("io_access_button");
2161    newButton.style.display = "inline-block";
2162    newButton.style.verticalAlign = "top";
2163    newButton.onclick=accOnClick;
2164    if(newButton.nodeName=="IMG"){
2165      newButton.style.minWidth = "80px";
2166      newButton.style.width = "80px";
2167      newButton.style.margin = "2px";
2168      newButton.style.height = "80px";
2169    }else{
2170      newButton.style.margin = "0px 2px 0px 2px";
2171    }
2172    if(button_add.nodeName=="IMG"){
2173      return wrapper
2174    }
2175
2176    return newButton;
2177  }
2178  /* when clicking the thumb swatches under main image (2nd image for an item) */
2179  function updateMainPic(img) {
2180    let container = img.parentElement;
2181    while (container && !container.querySelector(".io_image_big")) {
2182      container = container.parentElement;
2183    }
2184
2185    const main_img = container ? container.querySelector(".io_image_big") : null;
2186    if (!main_img) return;
2187
2188    const dataBigSrc = img.getAttribute("data-big-src");
2189    if (dataBigSrc) {
2190      main_img.src = dataBigSrc;
2191      return;
2192    }
2193
2194    let thumb_id = img.id;
2195    let big_id = thumb_id.replace("thumb", "big");
2196    const img_big = document.getElementById(big_id);
2197
2198    if (img_big && img_big.href) {
2199      main_img.src = img_big.href;
2200    }
2201  }
2202  /*</editor-fold>*/
2203
2204  /*<editor-fold defaultstate="collapsed" desc="Calendar Functions">*/
2205  function calApply() {
2206    /* reset timeslots if filtering is on */
2207    filterTimeslotsByDay_itemTimeslots();
2208    simpleCart.update();
2209
2210    /* Prevent zero-duration selection: disallow identical start and end date/time */
2211    try
2212    {
2213      var ds = jQuery("input[name=dateStart]").val();
2214      var de = jQuery("input[name=dateEnd]").val();
2215      var ts = jQuery("input[name=timeStart]").val();
2216      var te = jQuery("input[name=timeEnd]").val();
2217      if(ts && te && ds && de)
2218      {
2219        var s24 = convert12HourTo24Hour(ts);
2220        var e24 = convert12HourTo24Hour(te);
2221        var sObj = buildDateObj(ds.split("/"), s24);
2222        var eObj = buildDateObj(de.split("/"), e24);
2223        if(sObj && eObj && typeof sObj.getTime === 'function' && typeof eObj.getTime === 'function')
2224        {
2225          if(eObj.getTime() === sObj.getTime())
2226          {
2227            alert("Please choose an end time that's after the start time.");
2228            jQuery("input[name=timeEnd]").val("");
2229            return false;
2230          }
2231        }
2232      }
2233    }catch(e){}
2234
2235    if(cart_times_all_set()){
2236      ioCartLoaderActivate();
2237      setCookie("io_dateApplied", "true", 1)
2238      checkAvailAll();
2239      // If no availability calls were made, hide loader shortly after
2240      setTimeout(function()
2241      {
2242        if(io_cart_loading_active && io_cart_loading_count === 0)
2243        {
2244          io_cart_loading_active = false;
2245          ioCartShowOverlay(false);
2246        }
2247      }, 300);
2248      calCancel();
2249    }
2250
2251
2252    let io_required_data = io_info_required_data;
2253    for (const [data, value] of Object.entries(io_required_data)) {
2254      if(value == 1){
2255        setCookie(data, jQuery("#io_im_"+data).val(), 14);
2256      }
2257    }
2258
2259    /* Check if information gathering header exists. If it does, update the times on there. */
2260    if(jQuery("#ioInfoHeader").length){
2261      jQuery("#ioHeaderTimeStart").val(jQuery("[name=timeStart]").val());
2262      jQuery("#ioHeaderTimeEnd").val(jQuery("[name=timeEnd]").val());
2263      jQuery("#ioHeaderDateStart").val(jQuery("[name=dateStart]").val());
2264      jQuery("#ioHeaderDateEnd").val(jQuery("[name=dateEnd]").val());
2265      header_increment_step();
2266    }
2267
2268    show_or_hide_required_info_message()
2269    /* if(!cartStayOpen) cartHide(); */
2270  }
2271
2272  function calCancel() {
2273    click_count = 0;
2274    start_date = getCookie("io_dateStart");
2275    end_date = getCookie("io_dateEnd");
2276    start_time = getCookie("io_timeStart");
2277    end_time = getCookie("io_timeEnd");
2278    jQuery("input[name=dateStart]").val(start_date);
2279    jQuery("input[name=dateEnd]").val(end_date);
2280    if(io_company_timeslots.length != 0 && io_cartdayselect == "single_day" && getCookie("io_company_timeslot_selected")){
2281      jQuery(".ioCartCompanyTimeslots").val(getCookie("io_company_timeslot_selected"));
2282    } else{
2283      jQuery("input[name=timeStart]").val(start_time);
2284      jQuery("input[name=timeEnd]").val(end_time);
2285    }
2286    setCalBackground();
2287
2288    jQuery(".ioDateRange").html(smartFormatDateRange())
2289    jQuery("#cartCalendar, #cartTimePicker").hide();
2290    jQuery(".ioDateRange").show();
2291    jQuery(".changeDateLinkWrapper").show();
2292  }
2293
2294  /* var cartStayOpen = false; */
2295  function calSetDateRange(stayOpen) {
2296    /*
2297        if(stayOpen==1){
2298            cartStayOpen = true;
2299        }else{
2300            cartStayOpen = false;
2301        }
2302        */
2303    jQuery(".changeDateLinkWrapper").hide();
2304    jQuery("#cartCalendar, #cartTimePicker").show();
2305    jQuery("#cartDateRange").hide();
2306  }
2307
2308  function smartFormatDateRange() {
2309    let start_date = jQuery("input[name=dateStart]").val();
2310    let end_date = jQuery("input[name=dateEnd]").val();
2311    if(io_company_timeslots.length != 0 && io_cartdayselect == "single_day"){
2312      let cart_company_timeslot_selected = jQuery(".ioCartCompanyTimeslots option:selected").first().val();
2313      if(cart_company_timeslot_selected){
2314        setCookie("io_company_timeslot_selected", cart_company_timeslot_selected, 14);
2315        cart_company_timeslot_selected = cart_company_timeslot_selected.split("-");
2316        var start_time = cart_company_timeslot_selected[0].trim();
2317        var end_time = cart_company_timeslot_selected[1].trim();
2318      }
2319    } else {
2320      var start_time = jQuery("input[name=timeStart]").val();
2321      var end_time = jQuery("input[name=timeEnd]").val();
2322    }
2323
2324    let text = "";
2325    text = start_date;
2326    if(io_hidetimes!="on") text += " " + start_time;
2327
2328    if (start_date == end_date) {
2329      if(io_hidetimes!="on"){
2330        text += "  <i class='fas fa-arrow-right' style='padding:5px;'></i> ";
2331        text += end_time;
2332      }
2333    } else {
2334      text += "  <i class='fas fa-arrow-right' style='padding:5px;'></i> ";
2335      text += end_date;
2336      if(io_hidetimes!="on") text += " " + end_time;
2337    }
2338    /* text += "  <i class='fas fa-pencil-alt' style='margin-left:9px;color:"+pallet_color1+";'></i> "; */
2339
2340    return text;
2341  }
2342
2343
2344  function resetCalButtons() {
2345    jQuery("#cartCalendar .ui-datepicker-prev").addClass("fas fa-arrow-left").css("color", pallet_color1);
2346    jQuery("#cartCalendar .ui-datepicker-next").addClass("fas fa-arrow-right").
2346css("color", pallet_color1);
2347  }
2348
2349  function cal_onChangeMonthYear(year, month, obj) {
2350    setTimeout(resetCalButtons, 10);
2351    setTimeout(setCalBackground, 10);
2352  }
2353
2354  function cal_onSelect(dateText, obj) {
2355    setTimeout(resetCalButtons, 10);
2356    let whatday_choice = "";
2357    if(io_cartdayselect === "dropdown_options" && io_multidayquote === "on"){
2358      let choice_obj = jQuery("#whatday");
2359      if(choice_obj){
2360        whatday_choice = choice_obj.val();
2361      }
2362    }
2363
2364    click_count++;
2365    end_timepicker = jQuery("input[name=timeEnd]");
2366    let timeStart = jQuery("input[name=timeStart]").val();
2367    if(io_force_blank_timepickers != "on")
2368    {
2369      if (timeStart == "") {
2370        jQuery("input[name=timeStart]").val(start_default);
2371        jQuery("input[name=timeEnd]").val(end_default);
2372      }
2373    }
2374
2375    if (click_count == 1 || !multi_day || whatday_choice==="Same Day" || whatday_choice==="Overnight") {
2376      jQuery("input[name=dateStart]").val(dateText);
2377      jQuery("input[name=dateEnd]").val(dateText)
2378      end_timepicker.timepicker("option",{"minTime": jQuery("input[name=timeStart]").val()});
2379      if(EndTimeLessThanStartTime(
2380              jQuery("input[name=timeStart]").val(),
2381              end_timepicker.val(),
2382              jQuery("[name='dateStart']").val(),
2383              jQuery("[name='dateEnd']").val() ) ) {
2384        end_timepicker.val("");
2385      }
2386      if(io_cartAllowSameDay == "on"){
2387        restrictStartTimepickerOnSameDaySelect(dateText, jQuery("input[name=timeStart]"), end_timepicker);
2388      }
2389    } else if (click_count == 2) {
2390      jQuery("input[name=dateEnd]").val(dateText);
2391      let start_date_str = jQuery("input[name=dateStart]").val();
2392      let start_date_obj = convertDateStringtoDateObject(start_date_str);
2393      let end_date_obj = convertDateStringtoDateObject(dateText);
2394      if(end_date_obj < start_date_obj){
2395        jQuery("input[name=dateStart]").val(dateText);
2396        if(io_cartAllowSameDay == "on"){
2397          restrictStartTimepickerOnSameDaySelect(dateText, jQuery("input[name=timeStart]"), end_timepicker);
2398        }
2399      } else{
2400        end_timepicker.timepicker("option",{"minTime": io_restrict_time_start});
2401      }
2402      click_count = 0;
2403    } else {
2404      click_count = 0;
2405    }
2406    //custom code for suncoast_event
2407    if(io_cartdayselect === "dropdown_options" && io_multidayquote === "on"){
2408      endDisplay();
2409      //daysSelect();
2410    }
2411    filterTimeslotsByDay_companyTimeslots();
2412
2413    setTimeout(setCalBackground, 10);
2414  }
2415
2416  function endDisplay(){
2417    //todo: need to figure out if these work and set triggers
2418    // trigger enddisplay after date is selected or possibly when dateEnd changes?
2419    let choice = jQuery("#whatday").val();
2420
2421    setCookie("io_whatday", choice, 14);
2422    let dateStart = jQuery("[name=dateStart]");
2423    let timeStart = jQuery("[name=timeStart]");
2424    let dateEnd = jQuery("[name=dateEnd]");
2425    let timeEnd = jQuery("[name=timeEnd]");
2426    if(choice==='Overnight'){
2427      let startdate = dateStart.val();
2428      let starttime = io_overnightPickupTime;
2429      let endcalc_date_obj = new Date(buildDateobjectstring(startdate,dateFormat,starttime));
2430      let duration_hrs = 24;
2431      let end_date_obj = new Date(endcalc_date_obj.getTime()+duration_hrs*60*60*1000);
2432      if(!isNaN(end_date_obj)){
2433        dateEnd.val(getFormatteddate(end_date_obj));
2434        timeEnd.val(getFormattedtime(end_date_obj));
2435        timeEnd.attr('readonly','readonly');
2436      }
2437    }else if(choice==='Multi-Day'){
2438      let startdate = dateStart.val();
2439      let starttime = timeStart.val() || start_default;
2440      let start_date_obj = new Date(buildDateobjectstring(startdate, dateFormat, starttime));
2441      if(!isNaN(start_date_obj)){
2442        //dateEnd.val(getFormatteddate(start_date_obj));
2443        let cal = jQuery("#cartCalendar");
2444        let origOnSelect = cal.datepicker("option", "onSelect");
2445        cal.datepicker("option", "onSelect", null);
2446        cal.datepicker("setDate", start_date_obj);
2447        cal.datepicker("option", "onSelect", origOnSelect);
2448      }
2449      timeEnd.removeAttr('readonly');
2450      if(io_force_blank_timepickers == "on" && !timeEnd.val()){
2451        timeEnd.val("");
2452      } else if(!timeEnd.val()){
2453        timeEnd.val(end_default);
2454      }
2455    }else{
2456      let startdate = dateStart.val();
2457      let starttime = timeStart.val() || start_default;
2458      let start_date_obj = new Date(buildDateobjectstring(startdate, dateFormat, starttime));
2459      if(!isNaN(start_date_obj)){
2460        dateEnd.val(getFormatteddate(start_date_obj));
2461        let cal = jQuery("#cartCalendar");
2462        let origOnSelect = cal.datepicker("option", "onSelect");
2463        cal.datepicker("option", "onSelect", null);
2464        cal.datepicker("setDate", start_date_obj);
2465        cal.datepicker("option", "onSelect", origOnSelect);
2466      }
2467      timeEnd.removeAttr('readonly');
2468      if(io_force_blank_timepickers == "on"  && !timeEnd.val()){
2469        timeEnd.val("");
2470      } else if(!timeEnd.val()){
2471        timeEnd.val(end_default);
2472      }
2473      click_count = 0;
2474    }
2475    setTimeout(setCalBackground, 10);
2476  }
2477  function setCalBackground() {
2478    let dateStart_string = jQuery("input[name=dateStart]").val();
2479    let dateEnd_string = jQuery("input[name=dateEnd]").val();
2480
2481    if (dateFormat == "d/m/yy") {
2482      let dateStartArray = dateStart_string.split("/");
2483      let dateEndArray = dateEnd_string.split("/");
2484      var dateStart = new Date(dateStartArray[2], Number(dateStartArray[1])-1, dateStartArray[0]);
2485      var dateEnd = new Date(dateEndArray[2], Number(dateEndArray[1])-1, dateEndArray[0]);
2486    } else {
2487      var dateStart = new Date(dateStart_string);
2488      var dateEnd = new Date(dateEnd_string);
2489    }
2490
2491
2492    let sday = dateStart.getDate();
2493    let smonth = dateStart.getMonth();
2494    let syear = dateStart.getFullYear();
2495
2496    let eday = dateEnd.getDate();
2497    let emonth = dateEnd.getMonth();
2498    let eyear = dateEnd.getFullYear();
2499
2500    /* clear any (in case of cancel) */
2501    jQuery(".ui-datepicker-calendar [data-handler=selectDay]").css("background-color","initial");
2502
2503    /* set the selected ones */
2504    jQuery("#cartCalendar [data-month=" + smonth + "][data-year=" + syear + "], #cartCalendar [data-month=" +
2505            emonth + "][data-year=" + eyear + "]").each(function (i) {
2506      let cday = jQuery(this).find("a").first().text();
2507      let cmonth = jQuery(this).attr("data-month");
2508      let cyear = jQuery(this).attr("data-year");
2509      /* let dateCurrent = new Date(Date.UTC(cyear,cmonth,cday,12)); */
2510      let dateCurrent = new Date(cyear, cmonth, cday);
2511      if (click_count == 1 && dateEnd_string.length == 0) dateEnd = dateStart;
2512      if (dateCurrent.getTime() == dateStart.getTime() && dateCurrent.getTime() == dateEnd.getTime()) {
2513        jQuery(this).css("border-radius", "6px 6px 6px 6px");
2514      } else if (dateCurrent.getTime() == dateStart.getTime()) {
2515        jQuery(this).css("border-radius", "6px 0 0 6px");
2516      } else if (dateCurrent.getTime() == dateEnd.getTime()) {
2517        jQuery(this).css("border-radius", "0 6px 6px 0");
2518      }
2519
2520      if (dateCurrent >= dateStart && dateCurrent <= dateEnd) {
2521        jQuery(this).css("background-color", pallet_color1);
2522      }
2523
2524
2525    });
2526  }
2527  /*</editor-fold>*/
2528
2529  /*<editor-fold defaultstate="collapsed" desc="Timeslot/Timepicker Functions">*/
2530  /* called from simplecart */
2531  function timeslotChange(){
2532    checkAvailCartTimeslots();
2533  }
2534  function filterTimeslotsByDay_companyTimeslots(){
2535    var weekday = new Array();
2536    weekday[0] = "Sunday";
2537    weekday[1] = "Monday";
2538    weekday[2] = "Tuesday";
2539    weekday[3] = "Wednesday";
2540    weekday[4] = "Thursday";
2541    weekday[5] = "Friday";
2542    weekday[6] = "Saturday";
2543
2544    let times = getAvailTimes();
2545    let start_date = times[0];
2546    var newDate1 = convertDateStringtoDateObject(start_date);
2547    let day = weekday[new Date(newDate1).getDay()];
2548
2549    let selected_option_label = jQuery(".ioCartCompanyTimeslots option:selected").first().text().toLowerCase();
2550    if(optionHasDay(weekday, selected_option_label)){
2551      if(selected_option_label.indexOf(day.toLowerCase()) === -1){
2552        jQuery(".ioCartCompanyTimeslots").val("");
2553      }
2554    }
2555    if(io_company_timeslots.length != 0 && io_cartdayselect == "single_day"){
2556      jQuery(".ioCartCompanyTimeslots > option").each(function() {
2557        if(optionHasDay(weekday, this.text.toLowerCase())){
2558          for(i=0; i<weekday.length; ++i){
2559            if(day.toLowerCase() == weekday[i].toLowerCase() && this.text.toLowerCase().indexOf(day.toLowerCase()) !== -1){
2560              jQuery(this).show();
2561              day_missing = false;
2562            } else if(day.toLowerCase() != weekday[i].toLowerCase() && this.text.toLowerCase().indexOf(day.toLowerCase()) === -1){
2563              jQuery(this).hide();
2564            }
2565          }
2566        }
2567      });
2568    }
2569  }
2570
2571  function filterTimeslotsByDay_itemTimeslots(){
2572    var weekday = new Array();
2573    weekday[0] = "Sunday";
2574    weekday[1] = "Monday";
2575    weekday[2] = "Tuesday";
2576    weekday[3] = "Wednesday";
2577    weekday[4] = "Thursday";
2578    weekday[5] = "Friday";
2579    weekday[6] = "Saturday";
2580
2581    let times = getAvailTimes();
2582    let start_date = times[0];
2583    var newDate1 = convertDateStringtoDateObject(start_date);
2584    let day = weekday[new Date(newDate1).getDay()];
2585
2586    simpleCart.each(function (item, x) {
2587      var timeslots_html = item.get('timeslots');
2588      if(typeof timeslots_html != "undefined" && jQuery.parseHTML(timeslots_html)[0].nodeName == "SELECT"){
2589        if(timeslots_html.length > 0){
2590          var timeslot_name = getTimeslotName(timeslots_html);
2591          if(typeof item.get("timeslots-orig") == "undefined"){
2592            var timeslots_obj = jQuery.parseHTML(timeslots_html);
2593          } else{
2594            var timeslots_obj = jQuery.parseHTML(item.get('timeslots-orig'));
2595          }
2596          jQuery(timeslots_obj).find("option").each(function(){
2597            if(optionHasDay(weekday, this.text.toLowerCase())){
2598              for(i=0; i<weekday.length; ++i){
2599                if(day.toLowerCase() == weekday[i].toLowerCase() && this.text.toLowerCase().indexOf(day.toLowerCase()) !== -1){
2600                  /* jQuery(this).show(); */
2601                } else if(day.toLowerCase() != weekday[i].toLowerCase() && this.text.toLowerCase().indexOf(day.toLowerCase()) === -1){
2602                  jQuery(this).remove();
2603                }
2604              }
2605            }
2606          });
2607          if(typeof item.get("timeslots-orig") == "undefined") item.set("timeslots-orig",item.get("timeslots"));
2608          item.set("timeslots",'<select class="simpleCart_timeslots" name="'+timeslot_name+'">'+jQuery(timeslots_obj).html()+'</select>');
2609        }
2610      }
2611    });
2612  }
2613
2614  function optionHasDay(weekdays, option_label){
2615    for(i=0; i<weekdays.length; ++i){
2616      if(option_label.indexOf(weekdays[i].toLowerCase()) !== -1){
2617        return true;
2618      }
2619    }
2620    return false;
2621  }
2622
2623  function getTimeslotName(timeslots_html){
2624    if(typeof timeslots_html=="undefined") return "";
2625    var timeslot_name_s = timeslots_html.indexOf('name="');
2626    timeslot_name_s += 6;
2627    var timeslot_name_e = timeslots_html.indexOf('"',timeslot_name_s);
2628    var timeslot_name = timeslots_html.substr(timeslot_name_s,timeslot_name_e-timeslot_name_s);
2629    return timeslot_name;
2630  }
2631  function setTimeslotSelected(item, timeslot_name){
2632    jQuery(".item-timeslots [name=\""+timeslot_name+"\"] option").not(":selected").removeAttr("selected");
2633    jQuery(".item-timeslots [name=\""+timeslot_name+"\"] option:selected").attr("selected","selected");
2634    if(jQuery(".item-timeslots [name=\""+timeslot_name+"\"]").length>0){
2635      item.set("timeslots",jQuery(".item-timeslots [name=\""+timeslot_name+"\"]")[0].outerHTML);
2636    }
2637
2638    /* set on quote page */
2639    jQuery(".controls [name=\""+timeslot_name+"\"] option").not(":selected").removeAttr("selected");
2640    jQuery(".controls [name=\""+timeslot_name+"\"] option[value='"+jQuery(".item-timeslots [name=\""+timeslot_name+"\"] option:selected").val()+"']").attr("selected","selected");
2641  }
2642
2643  function setTimePicker(item, timepicker_name){
2644    let [start_timepicker, end_timepicker] = get_cart_timepickers(timepicker_name);
2645    let start_time = start_timepicker.value;
2646    let end_time = end_timepicker.value;
2647
2648    if(!start_time){
2649      start_timepicker.style.borderColor = "red";
2650    } else{
2651      start_timepicker.style.borderColor = "";
2652    }
2653    if(!end_time){
2654      end_timepicker.style.borderColor = "red";
2655    } else{
2656      end_timepicker.style.borderColor = "";
2657    }
2658
2659    let start_timepicker_html = start_timepicker.outerHTML;
2660    let end_timepicker_html = end_timepicker.outerHTML;
2661    if(document.querySelectorAll(".item-timeslots [name=\""+timepicker_name+"\"]").length>0){
2662      start_timepicker_html = addOrReplaceValueInTimepicker(start_timepicker_html, start_time);
2663      end_timepicker_html = addOrReplaceValueInTimepicker(end_timepicker_html, end_time);
2664      item.set("timeslots", '<div name="'+timepicker_name+'"> Start: '+start_timepicker_html+' End: '+end_timepicker_html+'</div>');
2665    }
2666    /* set on quote page */
2667    /* For linen type items with timepickers */
2668    let rental_id = item.get("rentalid");
2669    let split_on_colon = rental_id.split(":");
2670    if(split_on_colon.length > 1){
2671      fix_time_name_for_linen_rid(timepicker_name, split_on_colon, start_time, end_time, rental_id)
2672    }else{
2673      let quote_page_start_timepicker = document.querySelectorAll(".controls [name=\""+timepicker_name.replace("io_timepicker_", "starttime_")+"\"]")[0];
2674      let quote_page_end_timepicker = document.querySelectorAll(".controls [name=\""+timepicker_name.replace("io_timepicker_", "endtime_")+"\"]")[0];
2675      if(quote_page_start_timepicker != null && quote_page_end_timepicker != null){
2676        quote_page_start_timepicker.value = start_time;
2677        quote_page_end_timepicker.value = end_time;
2678      }
2679    }
2680  }
2681
2682  function fix_time_name_for_linen_rid(time_name, split_rid, start_time, end_time, rental_id){
2683    for(let x = 0; x < split_rid.length; x++){
2684      temp_timepicker_name = time_name.replace(rental_id, split_rid[x]);
2685      let quote_page_start_timepicker = document.querySelectorAll(".controls [name=\""+temp_timepicker_name.replace("io_timepicker_", "starttime_")+"\"]")[0];
2686      let quote_page_end_timepicker = document.querySelectorAll(".controls [name=\""+temp_timepicker_name.replace("io_timepicker_", "endtime_")+"\"]")[0];
2687      if(quote_page_start_timepicker != null && quote_page_end_timepicker != null){
2688        quote_page_start_timepicker.value = start_time;
2689        quote_page_end_timepicker.value = end_time;
2690      }
2691    }
2692  }
2693
2694  function addOrReplaceValueInTimepicker(timepicker_html, time_value){
2695    if(timepicker_html.includes("value=")){
2696      timepicker_html = [timepicker_html.slice(0, timepicker_html.indexOf("value=")), 'value="'+time_value+'"', timepicker_html.slice(timepicker_html.length-1)].join("");
2697    }else{
2698      /* No value defined. Add it at the end of the outer html. */
2699      let position = timepicker_html.lastIndexOf(">");
2700      timepicker_html = [timepicker_html.slice(0, position), ' value="'+time_value+'"', timepicker_html.slice(position)].join("");
2701    }
2702    return timepicker_html
2703  }
2704
2705  function restrictEndTimepickers(){
2706    setUpTimeRestrictions_cartTimepickers()
2707    setUpTimeRestrictions_timeBasedItems()
2708  }
2709
2710  function setUpTimeRestrictions_timeBasedItems(){
2711    jQuery("input[name^=start_timeslot_]").change(function()
2712    {
2713      end_timepicker = jQuery("input[name='"+this.name.replace("start", "end")+"']");
2714      end_timepicker = jQuery(end_timepicker[end_timepicker.length - 1]);
2715      end_timepicker.timepicker("option",{"minTime": jQuery(this).val()});
2716      if( EndTimeLessThanStartTime( jQuery(this).val(), end_timepicker.val(), "0/0/0", "0/0/0" ) ){
2717        end_timepicker.val("");
2718      }
2719    });
2720  }
2721
2722  function setUpTimeRestrictions_cartTimepickers(){
2723    jQuery("input[name=timeStart]").change(function()
2724    {
2725      end_timepicker = jQuery("[name='"+this.name.replace("Start", "End")+"']");
2726      if(jQuery("[name='dateStart']").val() === jQuery("input[name='dateEnd']").val()){
2727        end_timepicker.timepicker("option",{"minTime": jQuery(this).val()});
2728        if(EndTimeLessThanStartTime(
2729                jQuery(this).val(),
2730                end_timepicker.val(),
2731                jQuery("[name='dateStart']").val(),
2732                jQuery("[name='dateEnd']").val() ) ) {
2733          end_timepicker.val("");
2734        }
2735      }
2736    });
2737  }
2738
2739  function setUpTimeRestrictions_infoHeaderTimepickers(){
2740    jQuery("#ioHeaderTimeStart").change(function()
2741    {
2742      end_timepicker = jQuery("#ioHeaderTimeEnd");
2743      if(jQuery("#ioHeaderDateStart").val() === jQuery("#ioHeaderDateEnd").val()){
2744        end_timepicker.timepicker("option",{"minTime": jQuery(this).val()});
2745        if(EndTimeLessThanStartTime(
2746                jQuery(this).val(),
2747                end_timepicker.val(),
2748                jQuery("#ioHeaderDateStart").val(),
2749                jQuery("#ioHeaderDateEnd").val() ) ) {
2750          end_timepicker.val("");
2751        }
2752      }
2753    });
2754  }
2755
2756  /*
2757        helper function to see if the value from a start timepicker is less than the string value of an end timepicker.
2758
2759        param start_time: string representation of the start time picker. 12hr or 24hr.
2760        param end_time: string representation of the end time picker. 12hr or 24hr.
2761        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.
2762        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.
2763
2764  */
2765  function EndTimeLessThanStartTime(start_time, end_time, start_date, end_date){
2766    if(!start_time || !end_time) return false;
2767    start_time = convert12HourTo24Hour(start_time);
2768    end_time = convert12HourTo24Hour(end_time);
2769    var split_start_date = start_date.split("/");
2770    var split_end_date = end_date.split("/");
2771    var startDate = buildDateObj(split_start_date, start_time);
2772    var endDate = buildDateObj(split_end_date, end_time);
2773    if(endDate < startDate){
2774      return true;
2775    } else {
2776      return false;
2777    }
2778  }
2779  function get_cart_timepickers(timepicker_name){
2780    let start_timepicker = document.getElementsByName(timepicker_name.replace("io_timepicker_", "start_timeslot_"));
2781    let end_timepicker = document.getElementsByName(timepicker_name.replace("io_timepicker_", "end_timeslot_"));
2782    start_timepicker = start_timepicker[start_timepicker.length-1];
2783    end_timepicker = end_timepicker[end_timepicker.length-1];
2784    return Array(start_timepicker, end_timepicker);
2785  }
2786  function restrictStartTimepickerOnSameDaySelect(start_date_str, start_timepicker, end_timepicker){
2787    let selected_date_obj = convertDateStringtoDateObject(start_date_str);
2788    let current_date_obj = new Date();
2789    if(current_date_obj.getDate()  == selected_date_obj.getDate() &&
2790            current_date_obj.getMonth() == selected_date_obj.getMonth() &&
2791            current_date_obj.getYear()  == selected_date_obj.getYear()){
2792      let next_hour_time_stamp = current_date_obj.setMinutes(60);
2793      let next_hour_str = getFormattedtime(new Date(next_hour_time_stamp))
2794      start_timepicker.timepicker("option",{"minTime": next_hour_str});
2795
2796      /* If the time in the input box is less than the time we just restricted too, then clear time inputs */
2797      restricted_time_obj = convertDateStringtoDateObject(start_date_str, next_hour_str);
2798      currently_selected_time_obj = convertDateStringtoDateObject(start_date_str, start_timepicker.val());
2799      if(currently_selected_time_obj < restricted_time_obj){
2800        start_timepicker.val(next_hour_str);
2801        end_timepicker.val("");
2802        end_timepicker.timepicker("option",{"minTime": next_hour_str});
2803      }
2804    }else{
2805      start_timepicker.timepicker("option",{"minTime": restrictTimeStart});
2806    }
2807  }
2808  /*</editor-fold>*/
2809
2810  /*<editor-fold defaultstate="collapsed" desc="Simple Cart Bound Functions">*/
2811  function cart_onUpdate() {
2812    /* need slight delay so simplecart updates before this runs */
2813    setTimeout(cart_onUpdate2, 500);
2814    try{
2815      for(var i=0;i<document.getElementsByClassName("ioCart").length;i++){
2816        document.getElementsByClassName("ioCart")[i].setAttribute("cnt", simpleCart.items().length);
2817      }
2818    }catch(e){}
2819  }
2820
2821  function cart_onUpdate2() {
2822    jQuery("#cartSubtotal").html(simpleCart.toCurrency(simpleCart.total()));
2823    if(io_checkavail=="off") return;
2824    jQuery("#cartWarning").hide();
2825    let hasUnavail = false;
2826    gift_cards_only = false;
2827    simpleCart.each(function (item, x) {
2828      let item_id = item.get("id");
2829      var giftCardValue = item.get("giftcardvalue");
2830      if (giftCardValue && giftCardValue.trim()) {
2831        gift_cards_only = true;
2832      }
2833      let avail = 0;
2834      let stop_loop = false;
2835      if (item.get("availability") != null) avail = item.get("availability").replace(" available", "");
2836      let quantity = Number(item.get("quantity"));
2837      if(item.get("inputtype") == "Map"){
2838        quantity = 1
2839      }
2840      if(typeof item.get("availability") != 'undefined'){
2841        if (quantity > Number(avail) || avail == "not") {
2842          /* item.set("availability","<span style=color:red>"+item.get("availability")+"</span>"); */
2843          setTimeout(function () {
2844            jQuery("#cartItem_" + item_id + " .item-availability").css("color", "red")
2845          }, 10);
2846          //jQuery("#cartWarning").show();
2847          stop_loop = display_cart_warning(item);
2848          hasUnavail = true;
2849        } else {
2850          jQuery("#cartItem_" + item_id + " .item-availability").css("color", "inherit");
2851        }
2852      }else{
2853        event_times = getAvailTimes();
2854        if(!event_times[0] || !event_times[1]){
2855          jQuery("#cartWarning").text("Please set the date and time for your event above.");
2856          jQuery("#cartWarning").show()
2857        }
2858      }
2859
2860      var timeslots_html = item.get("timeslots");
2861      if(typeof timeslots_html != "undefined"){
2862        if(timeslots_html.length > 0){
2863          var timeslot_name = getTimeslotName(timeslots_html);
2864          if(timeslots_html.indexOf("<select") >= 0){
2865            setTimeslotSelected(item, timeslot_name);
2866          }else{
2867            setTimePicker(item, timeslot_name);
2868          }
2869        }
2870      }
2871      if(stop_loop){
2872        return false;
2873      }
2874    });
2875
2876    if(gift_cards_only){
2877      jQuery("#cartCalendarTimePickerContainer").hide();
2878    }else{
2879      jQuery("#cartCalendarTimePickerContainer").show();
2880    }
2881
2882    if(hasUnavail && io_checkavail!="off"){
2883      jQuery(".simpleCart_checkout").removeClass("simpleCart_checkout").addClass("simpleCart_checkout_off").trigger("classChange").click(cartShow);
2884    }else if(io_checkavail!="off"){
2885      jQuery(".simpleCart_checkout_off").removeClass("simpleCart_checkout_off").addClass("simpleCart_checkout").trigger("classChange");
2886    }
2887
2888    add_cart_buttons = document.querySelectorAll("[class*=add_cart_]");
2889    if(add_cart_buttons){
2890      for(let i = 0; i < add_cart_buttons.length; ++i){
2891        add_cart_buttons[i].innerHTML = add_cart_buttons[i].innerHTML.replace("fa-cart-arrow-down", "fa-shopping-cart");
2892        add_cart_buttons[i].innerHTML = add_cart_buttons[i].innerHTML.replace("Added to Cart", "Add to Cart");
2893        add_cart_buttons[i].style.filter = "brightness(100%)";
2894        simpleCart.each(function (item, x) {
2895          if( add_cart_buttons[i].className.includes( item.get("rentalid") ) ){
2896            add_cart_buttons[i].innerHTML = add_cart_buttons[i].innerHTML.replace("fa-shopping-cart", "fa-cart-arrow-down");
2897            add_cart_buttons[i].innerHTML = add_cart_buttons[i].innerHTML.replace("Add to Cart", "Added to Cart");
2898            add_cart_buttons[i].style.filter = "brightness(90%)";
2899          }
2900        });
2901      }
2902    }
2903
2904    /* init time-based items */
2905    if(document.location.href.indexOf("io_quoteform") == -1){
2906      let today = new Date();
2907      let io_dd = today.getDate();
2908      let io_mm = today.getMonth() + 1;
2909      let io_yyyy = today.getFullYear();
2910      if(restrictTimes){
2911        jQuery(".item-timeslots .timepicker").each( function() {
2912          if(this.name.includes("end")){
2913            start_timepicker = jQuery("input[name='"+this.name.replace("end", "start")+"']");
2914            start_timepicker = jQuery(start_timepicker[start_timepicker.length - 1]);
2915
2916            if (io_force_blank_timepickers == "on")
2917            {
2918              start_timepicker.val("");
2919              jQuery(this).timepicker({
2920                startTime: "",
2921                endTime:   "",
2922                minTime:   restrictTimeStart,
2923                maxTime:   restrictTimeEnd,
2924                timeFormat: timeFormat,
2925                separator:  ":",
2926                className:  "elementor-widget-text-editor",
2927                step: 15,
2928                disableTouchKeyboard: true
2929              });
2930            }
2931            else
2932            {
2933              // Existing logic if "force blank" is not active
2934              if (start_timepicker.val() != "") {
2935                jQuery(this).timepicker({
2936                  startTime: new Date(io_mm+"/"+io_dd+"/"+io_yyyy + " " + start_default),
2937                  endTime:   new Date(io_mm+"/"+io_dd+"/"+io_yyyy + " " + end_default),
2938                  minTime:   start_timepicker.val(),
2939                  maxTime:   restrictTimeEnd,
2940                  timeFormat: timeFormat,
2941                  separator:  ":",
2942                  className:  "elementor-widget-text-editor",
2943                  step: 15,
2944                  disableTouchKeyboard: true
2945                });
2946              } else {
2947                jQuery(this).timepicker({
2948                  startTime: new Date(io_mm+"/"+io_dd+"/"+io_yyyy + " " + start_default),
2949                  endTime:   new Date(io_mm+"/"+io_dd+"/"+io_yyyy + " " + end_default),
2950                  minTime:   restrictTimeStart,
2951                  maxTime:   restrictTimeEnd,
2952                  timeFormat: timeFormat,
2953                  separator:  ":",
2954                  className:  "elementor-widget-text-editor",
2955                  step: 15,
2956                  disableTouchKeyboard: true
2957                });
2958              }
2959            }
2960
2961          }
2962          else {
2963            if (io_force_blank_timepickers == "on")
2964            {
2965              start_timepicker.val("");
2966              jQuery(this).timepicker({
2967                startTime: "",
2968                endTime:   "",
2969                minTime:   restrictTimeStart,
2970                maxTime:   restrictTimeEnd,
2971                timeFormat: timeFormat,
2972                separator:  ":",
2973                className:  "elementor-widget-text-editor",
2974                step: 15,
2975                disableTouchKeyboard: true
2976              });
2977            }
2978            else
2979            {
2980              jQuery(this).timepicker({
2981                startTime: new Date(io_mm+"/"+io_dd+"/"+io_yyyy + " " + start_default),
2982                endTime: new Date(io_mm+"/"+io_dd+"/"+io_yyyy + " " + end_default),
2983                minTime:restrictTimeStart,
2984                maxTime:restrictTimeEnd,
2985                timeFormat: timeFormat,
2986                separator: ":",
2987                className: "elementor-widget-text-editor",
2988                step: 15,
2989                disableTouchKeyboard: true
2990              });
2991            }
2992          }
2993        });
2994      } else{
2995        jQuery(".item-timeslots .timepicker").each( function() {
2996          if(this.name.includes("end") != -1){
2997            start_timepicker = jQuery("input[name='"+this.name.replace("end", "start")+"']");
2998            start_timepicker = jQuery(start_timepicker[start_timepicker.length - 1]);
2999            if (io_force_blank_timepickers == "on")
3000            {
3001              start_timepicker.val("");
3002              jQuery(this).timepicker({
3003                startTime: "",
3004                endTime:   "",
3005                minTime:   restrictTimeStart,
3006                maxTime:   restrictTimeEnd,
3007                timeFormat: timeFormat,
3008                separator:  ":",
3009                className:  "elementor-widget-text-editor",
3010                step: 15,
3011                disableTouchKeyboard: true
3012              });
3013            }
3014            else
3015            {
3016              if (start_timepicker.val() != "") {
3017                jQuery(this).timepicker({
3018                  startTime: new Date(io_mm + "/" + io_dd + "/" + io_yyyy + " " + start_default),
3019                  endTime: new Date(io_mm + "/" + io_dd + "/" + io_yyyy + " " + end_default),
3020                  minTime: start_timepicker.val(),
3021                  timeFormat: timeFormat,
3022                  separator: ":",
3023                  className: "elementor-widget-text-editor",
3024                  step: 15,
3025                  disableTouchKeyboard: true
3026                });
3027              } else {
3028                jQuery(this).timepicker({
3029                  startTime: new Date(io_mm + "/" + io_dd + "/" + io_yyyy + " " + start_default),
3030                  endTime: new Date(io_mm + "/" + io_dd + "/" + io_yyyy + " " + end_default),
3031                  timeFormat: timeFormat,
3032                  separator: ":",
3033                  className: "elementor-widget-text-editor",
3034                  step: 15,
3035                  disableTouchKeyboard: true
3036                });
3037              }
3038            }
3039          }
3040          else
3041          {
3042            if (io_force_blank_timepickers == "on")
3043            {
3044              start_timepicker.val("");
3045              jQuery(this).timepicker({
3046                startTime: "",
3047                endTime:   "",
3048                minTime:   restrictTimeStart,
3049                maxTime:   restrictTimeEnd,
3050                timeFormat: timeFormat,
3051                separator:  ":",
3052                className:  "elementor-widget-text-editor",
3053                step: 15,
3054                disableTouchKeyboard: true
3055              });
3056            }
3057            else
3058            {
3059              jQuery(this).timepicker({
3060                startTime: new Date(io_mm + "/" + io_dd + "/" + io_yyyy + " " + start_default),
3061                endTime: new Date(io_mm + "/" + io_dd + "/" + io_yyyy + " " + end_default),
3062                timeFormat: timeFormat,
3063                separator: ":",
3064                className: "elementor-widget-text-editor",
3065                step: 15,
3066                disableTouchKeyboard: true
3067              });
3068            }
3069          }
3070        });
3071      }
3072      setUpTimeRestrictions_timeBasedItems();
3073      if(!event_time_set()){
3074        jQuery(".itemRow .item-total").hide();
3075      }else{
3076        jQuery(".itemRow .item-total").show();
3077      }
3078    }
3079  }
3080  function cart_beforeCheckout(data) {
3081    data.startdate = jQuery("input[name=dateStart]").val();
3082    data.enddate = jQuery("input[name=dateEnd]").val();
3083    if(getCookie("guid")){
3084      data.guid = getCookie("guid");
3085    }else{
3086      data.io_custguid = fetchAndSetCookie("guid");
3087    }
3088    if(io_company_timeslots.length != 0 && io_cartdayselect == "single_day"){
3089      let cart_company_timeslot_selected = jQuery(".ioCartCompanyTimeslots option:selected").first().val();
3090      if(cart_company_timeslot_selected){
3091        setCookie("io_company_timeslot_selected", cart_company_timeslot_selected, 14);
3092        cart_company_timeslot_selected = cart_company_timeslot_selected.split("-");
3093        data.starttime = cart_company_timeslot_selected[0];
3094        data.endtime = cart_company_timeslot_selected[1];
3095      }
3096    } else {
3097      data.starttime = jQuery("input[name=timeStart]").val();
3098      data.endtime = jQuery("input[name=timeEnd]").val();
3099    }
3100  }
3101  function cart_beforeAdd(item) {
3102    var main_id = jQuery(".io_product_container .item_rentalid").first().text();
3103    var item_id = item.get("rentalid");
3104
3105    timeslots = item.get("timeslots");
3106    if(timeslots){
3107      if(timeslots.indexOf("<select") !== -1){
3108        timeslot_name_id_start_pos = timeslots.lastIndexOf('name="timeslot_') + 'name="timeslot_'.length;
3109        timeslot_name_id_end_pos = timeslots.indexOf('"', timeslot_name_id_start_pos);
3110        new_timeslots = [timeslots.slice(0, timeslot_name_id_start_pos), item_id, timeslots.slice(timeslot_name_id_end_pos,timeslots.length)]
3111        new_timeslots = new_timeslots.join("")
3112        item.set("timeslots", new_timeslots);
3113      }else if(timeslots.indexOf("<div name=\"io_timepicker_") !== -1){
3114        timeslot_name_id_start_pos = timeslots.lastIndexOf('name="io_timepicker_') + 'name="io_timepicker_'.length;
3115        timeslot_name_id_end_pos = timeslots.indexOf('"', timeslot_name_id_start_pos);
3116        new_timeslots = [timeslots.slice(0, timeslot_name_id_start_pos), item_id, timeslots.slice(timeslot_name_id_end_pos,timeslots.length)]
3117        new_timeslots = new_timeslots.join("")
3118
3119        timeslot_name_id_start_pos = new_timeslots.lastIndexOf('name="start_timeslot_') + 'name="start_timeslot_'.length;
3120        timeslot_name_id_end_pos = new_timeslots.indexOf('"', timeslot_name_id_start_pos);
3121        new_timeslots = [new_timeslots.slice(0, timeslot_name_id_start_pos), item_id, new_timeslots.slice(timeslot_name_id_end_pos,new_timeslots.length)]
3122        new_timeslots = new_timeslots.join("")
3123
3124        timeslot_name_id_start_pos = new_timeslots.lastIndexOf('name="end_timeslot_') + 'name="end_timeslot_'.length;
3125        timeslot_name_id_end_pos = new_timeslots.indexOf('"', timeslot_name_id_start_pos);
3126        new_timeslots = [new_timeslots.slice(0, timeslot_name_id_start_pos), item_id, new_timeslots.slice(timeslot_name_id_end_pos,new_timeslots.length)]
3127        new_timeslots = new_timeslots.join("")
3128
3129        item.set("timeslots", new_timeslots);
3130      }
3131
3132    }
3133    /* Here we are checking if we are on an item page and if we are adding the main item.
3134           If this is not true, we do not want to continue. Bail here. */
3135    if((!main_id || !item_id)){
3136      return true;
3137    }else if (item_id != main_id){
3138      /* we are adding an accessory, We want to forcibly add the main item first. */
3139      /* IO-26864 */
3140      jQuery("#bookNowBtn").click();
3141    }
3142    let required_dropdown_values = jQuery(".io_acc_li").filter(function() {
3143      let required_ele = jQuery(this).find(".item_required");
3144      let required = 0;
3145      if(required_ele[0]){
3146        required = required_ele[0].outerText;
3147      }
3148      let dropdown_ele = jQuery(this).find(".item_accessorydd");
3149      let dropdown = 0;
3150      if(dropdown_ele[0]){
3151        dropdown = dropdown_ele[0].outerText;
3152      }
3153      return (required > 0 && dropdown == 1)
3154    });
3155    var required_selected = true;
3156    required_dropdown_values.each(function() {
3157      required_value_id = jQuery(this).find(".item_rentalid")[0].outerText;
3158      required_value_id = required_value_id.split("_");
3159      required_value_id = required_value_id[required_value_id.length-1];
3160
3161      let selected = jQuery("[id^='io_acc_"+required_value_id+"']").filter(function() {
3162        return this["selected"];
3163      });
3164
3165      //IO-22431 - This wasnt catching if [0] was undefined
3166      if(jQuery(this).find(".io_acc_li_name")[0] != undefined){
3167        required_value_name = jQuery(this).find(".io_acc_li_name")[0].outerText ? jQuery(this).find(".io_acc_li_name")[0].outerText : "";
3168      }
3169      if(selected.length < jQuery(this).find(".item_required")[0].outerText){
3170        if(item_id == main_id){
3171          alert(required_value_name+" is a required field.");
3172        }
3173        required_selected = false;
3174      }
3175
3176      if(!required_selected){
3177        return false;
3178      }
3179      return true;
3180    });
3181    if(!required_selected){
3182      return false;
3183    }
3184
3185    /* IO-14857 */
3186    if(jQuery(".io_product_measurement_price").length > 0){
3187      let units;
3188      if(jQuery(".io_product_infobox .item_qtytype").text() == "Area"){
3189        units = "sq meters"
3190        if(country === "US") units = "sq feet"
3191      }else if(jQuery(".io_product_infobox .item_qtytype").text() == "Perimeter"){
3192        units = "meters"
3193        if(country === "US") units = "feet"
3194      }
3195      item.set("units", units);
3196      item.set("quantity", jQuery(".io_measure_price_raw_measurement").text());
3197    }
3198  }
3199  function cart_afterAdd(item) {
3200    /*loading animation*/
3201    ioCartLoaderActivate();
3202    setTimeout(function(){ if(io_cart_loading_active && io_cart_loading_count === 0){ io_cart_loading_active=false; ioCartShowOverlay(false);} }, 300);
3203
3204    /* Add required Accessories */
3205    let required_accs = jQuery("[id^=io_acc_required_]").filter(function() {
3206      return parseInt(this["outerText"]) > 0 && this.parentElement.style['display'] != 'none';
3207    });
3208    required_accs.each(function(index) {
3209      simpleCart.parse_html_and_add(this, true);
3210    });
3211
3212
3213    let selected_values = jQuery("[id^=io_acc_]").filter(function() {
3214      return this["selected"];
3215    });
3216
3217    selected_values.each(function() {
3218      let info = {};
3219      let rid = jQuery(this).find(".item_rentalid")[0].outerText;
3220      let split_rid = rid.split("_");
3221      if(split_rid.length == 3){
3222        let parent_rid = split_rid[1];
3223        let main_item_rid = split_rid[0];
3224        info["acc_dd_parent_limit"] = jQuery("#io_acc_accessorylimit_"+main_item_rid+"_"+parent_rid)[0].outerText;
3225      }else{
3226        info["acc_dd_parent_limit"] = "0";
3227      }
3228      info["name"]         = jQuery(this).find(".io_acc_li_name")[0].outerText
3229      info["qtyincrement"] = jQuery(this).find(".item_qtyincrement")[0].outerText
3230      info["quantity"]     = jQuery(this).find(".item_required")[0].outerText > 0 ? jQuery(this).find(".item_required")[0].outerText : 1;
3231      info["rentalid"]     = jQuery(this).find(".item_rentalid")[0].outerText
3232      info["linkqty"]      = jQuery(this).find(".item_linkqty")[0].outerText
3233      info["pagename"]     = io_pagename;
3234      if(jQuery(this).find(".io_acc_li_img_thumb")[0]){
3235        info["image"] = jQuery(this).find(".io_acc_li_img_thumb")[0].src
3236      }
3237      let already_added = simpleCart.items().filter((item) => item.get("rentalid").startsWith(split_rid[0]+"_"+split_rid[1]));
3238      if(jQuery(this).find(".item_accessorydd")[0].outerText != 1 &&
3239         (info["acc_dd_parent_limit"] == "0" || already_added.length < info["acc_dd_parent_limit"]) ){
3240        simpleCart.add(info, true);
3241      }
3242    });
3243
3244    checkAvailCartOnly(true);
3245
3246    let last_upsell_call_time = Date.now() - last_upsell_call;
3247    if(in_cart_upsell && last_upsell_call_time > 2000){
3248      let rental_ids = "";
3249
3250      /* Get the last element in the cart. This is the last item added. */
3251      last_added = jQuery("[id^='cartItem_']").last();
3252      if(last_added.length){
3253        last_added_children = last_added.children();
3254        for(let i = 0; i < last_added_children.length; ++i){
3255          if(last_added_children[i].className == "item-rentalid") {
3256            rental_ids += last_added_children[i].innerText + "|";
3257          }
3258        }
3259      }
3260
3261      if(rental_ids.length>0 && jQuery("#cartPopover").attr("class") == "cartIn"){
3262        var times = getAvailTimes();
3263        last_upsell_call = Date.now();
3264        getUpsellsCall(times[0],times[1],times[2],rental_ids,updateCartUpsell);
3265      }
3266      else{
3267        jQuery("#cart-carousel-container").hide();
3268      }
3269    }
3270
3271    if(io_company_timeslots.length != 0 && io_cartdayselect == "single_day"){
3272      filterTimeslotsByDay_itemTimeslots();
3273      simpleCart.update();
3274    }
3275
3276    if (jQuery(".cartInfo.open,.ioCart.open, .ioCart_link.open").length == 0) {
3277      setTimeout(function () {
3278        cartShow();
3279      }, 100);
3280    }
3281
3282    if(simpleCart.items().length==0){
3283      jQuery(".simpleCart_checkout").hide()
3284    }else{
3285      jQuery(".simpleCart_checkout").show();
3286    }
3287
3288    if(simpleCart.items().length > 0){
3289      let headerBookButton = jQuery("a[href$='io_quoteform/']");
3290      headerBookButton.addClass("ioCart_link");
3291      headerBookButton.attr("href", "javascript:;");
3292    }
3293
3294    checkRestrictedDeliveries()
3295
3296    if(jQuery("#ioInfoHeader").length){
3297      header_increment_step();
3298    }
3299  }
3300  function cart_afterQtyChange(){
3301    let last_checkAvail_call_time = Date.now() - last_checkAvail_call;
3302    if(last_checkAvail_call_time > 2000){
3303      /*loading animation*/
3304      ioCartLoaderActivate();
3305      setTimeout(function(){ if(io_cart_loading_active && io_cart_loading_count === 0){ io_cart_loading_active=false; ioCartShowOverlay(false);} }, 300);
3306      last_checkAvail_call = Date.now();
3307      checkAvailCart();
3308      checkAvailCartTimeslots();
3309    }
3310  }
3311  function cart_hideTimepickerWrapper(){
3312    jQuery(".ui-timepicker-wrapper").hide();
3313  }
3314  function cart_beforeRemove() {
3315    last_remove = Date.now();
3316  }
3317  function cart_afterRemove(removed_item){
3318    checkAvailCart();
3319    last_upsell_call_time = Date.now() - last_upsell_call;
3320    if(in_cart_upsell && last_upsell_call_time > 2000){
3321      rental_ids = getAllRentalIDsFromCart();
3322      if(rental_ids.length>0 && jQuery("#cartPopover").attr("class") == "cartIn"){
3323        var times = getAvailTimes();
3324        last_upsell_call = Date.now();
3325        getUpsellsCall(times[0],times[1],times[2],rental_ids,updateCartUpsell);
3326      }
3327      else{
3328        jQuery("#cart-carousel-container").hide();
3329      }
3330    }
3331
3332    /* IO-24060 */
3333    simpleCart.items().forEach(function (item, index) {
3334      let expression = '^' + removed_item.get('rentalid') + '(?:[_:]\\d+)*';
3335      if(item.get("rentalid").match(expression)){
3336        item.remove();
3337      }
3338    });
3339
3340
3341    checkAvailCartTimeslots();
3342    checkRestrictedDeliveries();
3343    if(simpleCart.items().length==0){
3344      jQuery(".simpleCart_checkout").hide()
3345    }else{
3346      jQuery(".simpleCart_checkout").show();
3347    }
3348
3349    if(jQuery("#ioInfoHeader").length && simpleCart.items().length == 0){
3350      jQuery("#io-step-3").removeClass("io-step-active");
3351      jQuery("#io-step-2").addClass("io-step-active");
3352      jQuery("#io-step-2").removeClass("io-step-done")
3353    }
3354  }
3355  function cart_afterLoad(){
3356    var items_removed = false;
3357    simpleCart.items().forEach(function(item){
3358      if(item.get("pagename") != io_pagename){
3359        item.remove()
3360        items_removed = true;
3361      }
3362    })
3363    if(items_removed){
3364      alert("Some items in the cart are from a different location and have been removed.");
3365    }
3366  }
3367  /*</editor-fold>*/
3368
3369  /*<editor-fold defaultstate="collapsed" desc="Date/Time Object/String Conversion Functions">*/
3370  function getFormatteddate(date_obj){
3371    if(dateFormat.substring(0,1)=='d'){
3372      let month = date_obj.getMonth() + 1;
3373      formatteddate = date_obj.getDate()+'/'+month+'/'+date_obj.getFullYear();
3374    }else{
3375      let month = date_obj.getMonth() + 1;
3376      formatteddate = month+'/'+date_obj.getDate()+'/'+date_obj.getFullYear();
3377    }
3378    return formatteddate;
3379  }
3380
3381  function getFormattedtime(date_obj){
3382    var hour24 = false;
3383    var ampm = 'am';
3384    var starttime = jQuery('[name=timeStart]').val();
3385    if(starttime.length>0 && starttime.indexOf('m')==-1) hour24 = true;
3386    if(hour24){ //24 hour return
3387      return date_obj.getHours()+':'+pad(date_obj.getMinutes(),2);
3388    }else{ //12 hour return
3389      var hour = date_obj.getHours();
3390      if(hour==12) ampm='pm';
3391      if(hour==0) hour=12;
3392      if(hour>12){
3393        hour-=12;
3394        ampm='pm';
3395      }
3396      return hour+':'+pad(date_obj.getMinutes(),2)+' '+ampm;
3397    }
3398  }
3399
3400  function buildDateobjectstring(date,dateformat,time){
3401    var ampm = 'am';
3402    var hour24 = false;
3403    if(typeof date == "undefined") return;
3404    if(typeof dateformat == "undefined") return;
3405    var start_arr = date.split('/');
3406    if(dateformat.substring(0,1)=='d'){
3407      date = start_arr[2]+'/'+pad(start_arr[1],2)+'/'+pad(start_arr[0],2);
3408    }else{
3409      date = start_arr[2]+'/'+pad(start_arr[0],2)+'/'+pad(start_arr[1],2);
3410    }
3411    if(time.length>0 && time.indexOf('m')==-1) hour24 = true;
3412    if(hour24){
3413      try{
3414        var time_arr = time.split(':');
3415        var hour = parseInt(time_arr[0]);
3416        var min = pad(time_arr[1], 2);
3417        time = hour + ':' + min + ':00';
3418      }catch(err){
3419        time = "";
3420      }
3421    }else {
3422      try {
3423        time = time.replace('am', "").replace(' ', "");
3424        if (time.indexOf('pm') != -1) ampm = 'pm';
3425        time = time.replace('pm', "").replace(' ', "");
3426        var time_arr = time.split(':');
3427        var hour = parseInt(time_arr[0]);
3428        var min = pad(time_arr[1], 2);
3429        if (ampm == 'pm') {
3430          if (hour < 12) hour += 12;
3431        } else if (ampm == 'am' && hour == 12) {
3432          hour -= 12;
3433        }
3434        hour = pad(hour, 2);
3435        time = hour + ':' + min + ':00';
3436      } catch (err) {
3437        time = "";
3438      }
3439    }
3440    return date+' '+time;
3441  }
3442
3443  function pad(num, size) {
3444    var s = num+"";
3445    while (s.length < size) s = "0" + s;
3446    return s;
3447  }
3448  function convertDateStringtoDateObject(date_str, time_str=null){
3449    if(date_str){
3450      split_date_str = date_str.split("/");
3451      /* Parse start and end time. */
3452      if(time_str){
3453        /* Check and see if we are in 12 hour format, if so convert it to 24 hour format. */
3454        split_time_str = convert12HourTo24Hour(time_str);
3455      }else{
3456        /* If we do not have a time, then default to zeros */
3457        split_time_str = [0, 0];
3458      }
3459      /* Create date object based off our set date format. */
3460      date_obj = buildDateObj(split_date_str, split_time_str);
3461      return date_obj;
3462    }else{
3463      return new Date();
3464    }
3465  }
3466
3467  function buildDateObj(split_date_str, split_time_str){
3468    if (dateFormat == "d/m/yy"){
3469      return new Date(split_date_str[2], (+split_date_str[1] - 1).toString(), split_date_str[0],
3470              split_time_str[0], split_time_str[1]);
3471    }else{
3472      return new Date(split_date_str[2], (+split_date_str[0] - 1).toString(), split_date_str[1],
3473              split_time_str[0], split_time_str[1]);
3474    }
3475  }
3476
3477  function convert12HourTo24Hour(time_str){
3478    /* This function returns an array containing hours and minutes of provided string in 24 hour format. */
3479    /* This is primarily used for creating JS Date objects */
3480    split_time = time_str.split(":");
3481
3482    /* We are in 12 hour format if there is an "m" attached to minutes portion. */
3483    if(split_time[1].toLowerCase().search("m") != -1) {
3484      let separated_minutes = split_time[1].split(" ");
3485      if(separated_minutes.length==1){
3486        split_time[1] = split_time[1].replace("am"," am");
3487        split_time[1] = split_time[1].replace("pm"," pm");
3488        separated_minutes = split_time[1].split(" ");
3489      }
3490      let minutes = separated_minutes[0];
3491      let modifier = separated_minutes[1];
3492      split_time[1] = minutes;
3493
3494      /* First assume that if the hours are 12, then its midnight. */
3495      if(split_time[0] == "12"){
3496        split_time[0] = "00";
3497      }
3498      /* Second if there is a "p" in the modifier, then add twelve to the hours. */
3499      if(typeof modifier != "undefined"){
3500        if(modifier.toLowerCase().search("p") != -1){
3501          split_time[0] = (parseInt(split_time[0], 10) + 12);
3502        }
3503      }
3504    }
3505    return split_time;
3506  }
3507  /*</editor-fold>*/
3508
3509  /*<editor-fold defaultstate="collapsed" desc="Cart Show and Hide">*/
3510  function cartShow() {
3511    jQuery("#cartPopover").show();
3512    jQuery("#cartPopover").removeClass("cartOut");
3513    jQuery("#cartPopover").addClass("cartIn");
3514    jQuery(".cartInfo,.ioCart,.ioCart_link").addClass("open");
3515    if (/Mobi|Android/i.test(navigator.userAgent)) {
3516      document.body.style.overflow = "hidden";
3517    }
3518    /* jQuery(this).one("click", cartHide); */
3519    jQuery(".cartInfo").unbind("click").one("click", function(event){
3520      event.stopPropagation();
3521      event.stopImmediatePropagation();
3522      cartHide();
3523    });
3524    jQuery(".ioCart, .ioCart_link").unbind("click").one("click", function(event){
3525      event.stopPropagation();
3526      event.stopImmediatePropagation();
3527      cartHide();
3528    });
3529    jQuery(".cartIcon").removeClass("fa-shopping-cart").addClass("fa-close");
3530    if(simpleCart.items().length==0){
3531      jQuery(".simpleCart_checkout").hide()
3532    }else{
3533      jQuery(".simpleCart_checkout").show();
3534    }
3535
3536    checkAvailCartOnly();
3537
3538    last_upsell_call_time = Date.now() - last_upsell_call;
3539    if(in_cart_upsell && last_upsell_call_time > 2000){
3540      rental_ids = getAllRentalIDsFromCart();
3541      if(rental_ids.length>0 && jQuery("#cartPopover").attr("class") == "cartIn"){
3542        var times = getAvailTimes();
3543        last_upsell_call = Date.now();
3544        getUpsellsCall(times[0],times[1],times[2],rental_ids,updateCartUpsell);
3545      }
3546      else{
3547        jQuery("#cart-carousel-container").hide();
3548      }
3549    }
3550  }
3551
3552  function cartHide() {
3553    jQuery("#cartPopover").removeClass("cartIn");
3554    jQuery("#cartPopover").addClass("cartOut");
3555    if (/Mobi|Android/i.test(navigator.userAgent)) {
3556      document.body.style.overflow = "auto";
3557    }
3558    /* jQuery("#cartPopover").hide(); */
3559    jQuery(".cartInfo,.ioCart, .ioCart_link").removeClass("open");
3560    /* jQuery(this).one("click", cartShow); */
3561    jQuery(".cartInfo").unbind("click").one("click", function(event){
3562      event.stopPropagation();
3563      event.stopImmediatePropagation();
3564      cartShow();
3565    });
3566    jQuery(".ioCart, .ioCart_link").unbind("click").one("click", function(event){
3567      event.stopPropagation();
3568      event.stopImmediatePropagation();
3569      cartShow();
3570    });
3571    jQuery(".cartIcon").removeClass("fa-close").addClass("fa-shopping-cart");
3572  }
3573  /*
3574    function set_date_cookie(){
3575        if(this.id.indexOf("start_") !== -1){
3576            setCookie("dateStart", this.value, 14);
3577        } else if(this.id.indexOf("end_") !== -1){
3578            setCookie("dateEnd", this.value, 14);
3579        }
3580    }
3581    */
3582  jQuery(document).ready(function () {setTimeout(simpleCart.init, 3);});
3583  /*</editor-fold>*/
3584
3585  /*<editor-fold defaultstate="collapsed" desc="Check Avail All Call">*/
3586  function checkAvailAll(){
3587    checkAvailCart();
3588    checkAvailCartTimeslots();
3589    checkAvailFilter();
3590  }
3591  /*</editor-fold>*/
3592
3593  /*<editor-fold defaultstate="collapsed" desc="Check Avail - Page">*/
3594  /* for items on page not in cart */
3595  function checkAvailFilter() {
3596    let rental_names = "";
3597    let rental_ids = "";
3598    let batch_ids = [];
3599    let cart_rental_names = "";
3600    let cart_rental_ids = "";
3601    let item_id = "";
3602    let main_id = "";
3603    jQuery(".item_encoded").each(function(){
3604      rental_names += this.innerText + "|";
3605    });
3606    jQuery(".io_product_infobox .item_rentalid").each(function(){
3607      rental_ids += this.innerText + "|";
3608      item_id = this.innerText;
3609      main_id = this.innerText;
3610    });
3611    let batch_count = 0;
3612    let batch_index = 0;
3613    // If we have rental id string set, then we don't want to include availability checking for fpw items in header
3614    // IO-31498
3615    if(!rental_ids) {
3616      jQuery(".io_item2_list_inner .item_rentalid, .io_item2_listrent .item_rentalid").each(function () {
3617        /*
3618        if(rental_ids.indexOf(this.innerText+"|") == -1){
3619          rental_ids += this.innerText + "|";
3620        }
3621        */
3622        if (batch_count < 9) {
3623          if (!batch_ids.length) batch_ids.push("")
3624          if (!rid_in_batch(this.innerText + "|", batch_ids).length) {
3625            batch_ids[batch_index] += this.innerText + "|";
3626            batch_count++;
3627          }
3628        } else {
3629          if (!rid_in_batch(this.innerText + "|", batch_ids).length) {
3630            batch_ids[batch_index] += this.innerText + "|";
3631            batch_index++;
3632            batch_count = 0;
3633            batch_ids.push("");
3634          }
3635        }
3636      });
3637    }
3638    simpleCart.each(function (item, x) {
3639      var cart_name = item.get("encoded");
3640      if(cart_name==null){
3641        cart_name = encodeURIComponent(item.get("name"));
3642        cart_name = encodeURIComponent(decodeURIComponent(cart_name).replace(/[\u2032\u2019]+/ig,"'"));
3643      }
3644      let quantity = item.get("quantity");
3645      if(item.get("inputtype") == "Map"){
3646        quantity = 1
3647      }
3648      cart_rental_names += cart_name + "-" + quantity + "|";
3649      var cart_id = item.get("rentalid");
3650      cart_rental_ids += cart_id + "-" + quantity + "|";
3651    });
3652    /* #14494 IO-13779 */
3653    let delivery_methods_arr = [];
3654    var delivery_prices = [];
3655    if(io_delivery_prices){
3656      if(Object.keys(io_delivery_prices["override"]).includes(item_id)){
3657        delivery_prices = io_delivery_prices["override"][item_id]
3658      }else{
3659        if(!item_is_in_overrride_group(main_id)){
3660          delivery_prices = io_delivery_prices["default"]
3661        }
3662      }
3663      for(item in io_delivery_methods){
3664        if(delivery_prices.includes(io_delivery_methods[item]["id"])){
3665          delivery_methods_arr.push(item);
3666        }
3667      }
3668    }
3669
3670    let custom_prices_arr = [];
3671    if(io_custom_prices){
3672      if(Object.keys(io_custom_prices["override"]).includes(item_id.replace(":", '_'))){
3673        custom_prices_arr = io_custom_prices["override"][item_id.replace(":", '_')]
3674      }else{
3675        if(!item_is_in_overrride_group(main_id)){
3676          custom_prices_arr = io_custom_prices["default"]
3677        }
3678      }
3679    }
3680
3681    /* IO-13548 */
3682    if(io_accessory_price == "on"){
3683      let times = getAvailTimes();
3684      let acc_rental_id_str = getAccIDforPrice();
3685      let return_id = 0;
3686      if(acc_rental_id_str != ""){
3687        checkAvailCall(times[0],times[1],times[2],rental_names,acc_rental_id_str,displayAccessoryPrices,0,[],[],return_id,0,null,1,"",1);
3688      }
3689    }
3690
3691    let times = getAvailTimes();
3692    if(rental_names.length>0){
3693      if(use_weekday_weekend && rental_ids && !item_is_in_overrride_group(main_id)){
3694        let return_id = 0;
3695        let week_weekend = "";
3696        if(rental_ids != ""){
3697          return_id = 1;
3698          week_weekend = get_week_weekend_times(times, main_id);
3699          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);
3700          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);
3701        }
3702      }
3703      let return_id = 0;
3704      if(rental_ids != "" || batch_ids.length){
3705        return_id = 1;
3706      }
3707      if(delivery_methods_arr && rental_ids){
3708        delivery_methods_arr.forEach(function(delivery_method){
3709          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);
3710        });
3711      }
3712      if(custom_prices_arr && rental_ids){
3713        custom_prices_arr.forEach(function(custom_price){
3714          let start_date = times[0];
3715          let start_time = times[1];
3716          if(!start_date){
3717            start_date = getFormatteddate(new Date());
3718          }
3719          if(!start_time){
3720            start_time = io_default_start_time;
3721          }
3722          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']);
3723        });
3724      }
3725
3726      if(batch_ids.length){
3727        batch_ids.forEach(function(rids){
3728          return checkAvailCall(times[0],times[1],times[2],"",rids,updatePageAvail,0,cart_rental_ids,cart_rental_names,return_id,1,null,1,"",1);
3729        });
3730      }else{
3731        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);
3732      }
3733    }
3734  }
3735
3736  function item_is_in_overrride_group(item_id){
3737    for(const group_id in io_prices['override_groups']){
3738      for(const search_id in io_prices['override_groups'][group_id]){
3739        if(search_id == item_id){
3740          return true;
3741        }
3742      }
3743    }
3744    return false
3745  }
3746
3747  function get_week_weekend_times(times, rid){
3748    /* Create a copy instead of reference.*/
3749    let temp_times = JSON.parse(JSON.stringify(times));
3750    let start_date = temp_times[0];
3751    if(!start_date){
3752      start_date = getFormatteddate(new Date());
3753      temp_times[0] = start_date;
3754    }
3755    temp_times[1] = io_default_start_time
3756    var newDate1 = convertDateStringtoDateObject(start_date, io_default_start_time);
3757    var newDate2 = convertDateStringtoDateObject(start_date, io_default_end_time);
3758    let time_duration = ((newDate2 - newDate1) / 3600) / 1000;
3759    temp_times[2] = time_duration;
3760    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
3761    let weekday_weekend = {};
3762    weekday_weekend["rid"] = rid;
3763    if(io_weekendDefine == "friday-sunday"){
3764      if(day == 5 || day == 6 || day == 0){
3765        weekday_weekend["weekend"] = JSON.parse(JSON.stringify(temp_times));
3766        temp_times[0] = getNextMonday(temp_times[0]);
3767        weekday_weekend["weekday"] = JSON.parse(JSON.stringify(temp_times));
3768      }else if(day == 1 || day == 2 || day == 3 || day == 4){
3769        weekday_weekend["weekday"] = JSON.parse(JSON.stringify(temp_times));
3770        temp_times[0] = getNextSaturday(temp_times[0]);
3771        weekday_weekend["weekend"] = JSON.parse(JSON.stringify(temp_times));
3772      }
3773    }else if(io_weekendDefine == "saturday-sunday") {
3774      if (day == 6 || day == 0) {
3775        weekday_weekend["weekend"] = JSON.parse(JSON.stringify(temp_times));
3776        temp_times[0] = getNextMonday(temp_times[0]);
3777        weekday_weekend["weekday"] = JSON.parse(JSON.stringify(temp_times));
3778      } else if (day == 1 || day == 2 || day == 3 || day == 4 || day == 5) {
3779        weekday_weekend["weekday"] = JSON.parse(JSON.stringify(temp_times));
3780        temp_times[0] = getNextSaturday(temp_times[0]);
3781        weekday_weekend["weekend"] = JSON.parse(JSON.stringify(temp_times));
3782      }
3783    }else if (io_weekendDefine == "friday-monday"){
3784      if(day == 5 || day == 6 || day == 0 || day == 1){
3785        weekday_weekend["weekend"] = JSON.parse(JSON.stringify(temp_times));
3786        temp_times[0] = getNextTuesday(temp_times[0]);
3787        weekday_weekend["weekday"] = JSON.parse(JSON.stringify(temp_times));
3788      }else if(day == 2 || day == 3 || day == 4){
3789        weekday_weekend["weekday"] = JSON.parse(JSON.stringify(temp_times));
3790        temp_times[0] = getNextSaturday(temp_times[0]);
3791        weekday_weekend["weekend"] = JSON.parse(JSON.stringify(temp_times));
3792      }
3793    }
3794    return weekday_weekend;
3795  }
3796
3797  /*
3798        helper function found here:
3799        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.
3800    */
3801  function getNextMonday(date_str) {
3802    const date_obj = parseDate(date_str, dateFormat);
3803
3804    const nextMonday = new Date(
3805            date_obj.setDate(
3806                    date_obj.getDate() + ((7 - date_obj.getDay() + 1) % 7 || 7),
3807            ),
3808    );
3809
3810    return getFormatteddate(nextMonday);
3811  }
3812
3813    function getNextTuesday(date_str) {
3814      const date_obj = parseDate(date_str, dateFormat);
3815
3816      const nextMonday = new Date(
3817              date_obj.setDate(
3818                      date_obj.getDate() + ((7 - date_obj.getDay() + 2) % 7 || 7),
3819              ),
3820      );
3821
3822      return getFormatteddate(nextMonday);
3823    }
3824
3825  function parseDate(date_str, format) {
3826      var parts = date_str.split(/[/.-]/);
3827      var day, month, year;
3828
3829      if (format === "m/d/yy") {
3830          month = parseInt(parts[0]) - 1;
3831          day = parseInt(parts[1]);
3832          year = parseInt(parts[2]) + (parts[2].length === 2 ? 2000 : 0);
3833      } else if (format === "d/m/yy") {
3834          day = parseInt(parts[0]);
3835          month = parseInt(parts[1]) - 1;
3836          year = parseInt(parts[2]) + (parts[2].length === 2 ? 2000 : 0);
3837      } else if (format === "yy/m/d") {
3838          year = parseInt(parts[0]) + (parts[0].length === 2 ? 2000 : 0);
3839          month = parseInt(parts[1]) - 1;
3840          day = parseInt(parts[2]);
3841      } else {
3842          throw new Error("Unsupported date format");
3843      }
3844
3845      return new Date(year, month, day);
3846  }
3847
3848  /* modified from function above */
3849  function getNextSaturday(date_str) {
3850    const date_obj = parseDate(date_str, dateFormat);
3851
3852    const next_friday = new Date(
3853            date_obj.setDate(
3854                    date_obj.getDate() + ((7 - date_obj.getDay() + 6) % 7 || 7),
3855            ),
3856    );
3857
3858    return getFormatteddate(next_friday);
3859  }
3860
3861  function updatePageAvail(data){
3862    let use_id = data["return_id"]
3863    delete data["return_id"];
3864    if(use_id == 1){
3865      updatePageAvail_itemIDs(data)
3866    }else{
3867      updatePageAvail_itemNames(data);
3868    }
3869  }
3870  function updatePageAvail_weekday(data){
3871    jQuery.each(data, function (rental_id, qty){
3872      if (rental_id == "price") {
3873        var prices = qty;
3874        jQuery.each(prices, function (price_id, amt) {
3875          let cust_price = document.querySelector(".io_product_cust_price_weekday");
3876          if(cust_price==undefined){
3877            var first_price = document.querySelector(".io_product_price_box");
3878            if(first_price != null){
3879              cust_price = first_price.cloneNode(true);
3880              /* clear all classes */
3881              cust_price.className = "";
3882              cust_price.classList.add("io_product_price_box");
3883              cust_price.classList.add("io_product_cust_price_weekday");
3884              cust_price.style.display = "none";
3885              first_price.before(cust_price);
3886            }
3887          }
3888
3889          main_item_id = jQuery(".io_product_infobox .item_rentalid").first().text();
3890          if(main_item_id == price_id && cust_price!=undefined){
3891            if(typeof amt == "string") amt = Number(amt.replace(",",""));
3892            cust_price.querySelector("p:nth-child(1)").innerHTML=simpleCart.toCurrency(amt);
3893            let times = getAvailTimes();
3894            cust_price.querySelector("p:nth-child(2)").innerHTML = io_weekDayText;
3895            if(amt>0){
3896              cust_price.style.display = "grid";
3897            }else{
3898              cust_price.style.display = "none";
3899            }
3900          }
3901        });
3902      }
3903    });
3904  }
3905  function updatePageAvail_delivery_method(data){
3906    var delivery_method = data["delivery_method"]
3907    jQuery.each(data, function (rental_id, qty){
3908      if (rental_id == "price") {
3909        var prices = qty;
3910        jQuery.each(prices, function (price_id, amt) {
3911          let cust_price = document.querySelector(".io_product_cust_price_delivery_method"+io_delivery_methods[delivery_method]["id"]);
3912          let rid = jQuery(".io_product_container .item_rentalid").first().text();
3913          if(cust_price==undefined && !io_delivery_methods[delivery_method]["restricted"].includes(rid)){
3914            var first_price = document.querySelector(".io_product_price_box");
3915            if(first_price != null){
3916              cust_price = first_price.cloneNode(true);
3917              /* clear all classes */
3918              cust_price.className = "";
3919              cust_price.classList.add("io_product_price_box");
3920              cust_price.classList.add("io_product_cust_price_delivery_method"+io_delivery_methods[delivery_method]["id"]);
3921              cust_price.style.display = "none";
3922              first_price.before(cust_price);
3923            }
3924          }
3925
3926          main_item_id = jQuery(".io_product_infobox .item_rentalid").first().text();
3927          if(main_item_id == price_id && cust_price!=undefined){
3928            if(typeof amt == "string") amt = Number(amt.replace(",",""));
3929            cust_price.querySelector("p:nth-child(1)").innerHTML=simpleCart.toCurrency(amt);
3930            let times = getAvailTimes();
3931            cust_price.querySelector("p:nth-child(2)").innerHTML = make_live_price_editable_time(times, delivery_method);
3932            if(amt>0 && event_time_set()){
3933              cust_price.style.display = "grid";
3934            }else{
3935              cust_price.style.display = "none";
3936            }
3937          }
3938        });
3939      }
3940    });
3941  }
3942  function updatePageAvail_custom_price(data, custom_price_name){
3943    let custom_price_class_name = custom_price_name.replace(/[\s:./()!]/g, '_');
3944    jQuery.each(data, function (rental_id, qty){
3945      if (rental_id == "price") {
3946        var prices = qty;
3947        jQuery.each(prices, function (price_id, amt) {
3948          let cust_price = document.querySelector(".io_product_cust_price_"+custom_price_class_name);
3949          let rid = jQuery(".io_product_container .item_rentalid").first().text();
3950          if(cust_price==undefined){
3951            var first_price = document.querySelector(".io_product_price_box");
3952            if(first_price != null){
3953              cust_price = first_price.cloneNode(true);
3954              /* clear all classes */
3955              cust_price.className = "";
3956              cust_price.classList.add("io_product_price_box");
3957              cust_price.classList.add("io_product_cust_price_"+custom_price_class_name);
3958              cust_price.style.display = "none";
3959              first_price.before(cust_price);
3960            }
3961          }
3962
3963          main_item_id = jQuery(".io_product_infobox .item_rentalid").first().text();
3964          if(main_item_id == price_id && cust_price!=undefined){
3965            if(typeof amt == "string") amt = Number(amt.replace(",",""));
3966            cust_price.querySelector("p:nth-child(1)").innerHTML=simpleCart.toCurrency(amt);
3967            cust_price.querySelector("p:nth-child(2)").innerHTML = "for " + custom_price_name;
3968            if(amt>0){
3969              cust_price.style.display = "grid";
3970            }else{
3971              cust_price.style.display = "none";
3972            }
3973          }
3974        });
3975      }
3976    });
3977  }
3978  function updatePageAvail_weekend(data){
3979    jQuery.each(data, function (rental_id, qty){
3980      if (rental_id == "price") {
3981        var prices = qty;
3982        jQuery.each(prices, function (price_id, amt) {
3983          let cust_price = document.querySelector(".io_product_cust_price_weekend");
3984          if(cust_price==undefined){
3985            var first_price = document.querySelector(".io_product_price_box");
3986            if(first_price != null){
3987              cust_price = first_price.cloneNode(true);
3988              /* clear all classes */
3989              cust_price.className = "";
3990              cust_price.classList.add("io_product_price_box");
3991              cust_price.classList.add("io_product_cust_price_weekend");
3992              cust_price.style.display = "none";
3993              first_price.before(cust_price);
3994            }
3995          }
3996
3997          main_item_id = jQuery(".io_product_infobox .item_rentalid").first().text();
3998          if(main_item_id == price_id && cust_price!=undefined){
3999            if(typeof amt == "string") amt = Number(amt.replace(",",""));
4000            cust_price.querySelector("p:nth-child(1)").innerHTML=simpleCart.toCurrency(amt);
4001            let times = getAvailTimes();
4002            cust_price.querySelector("p:nth-child(2)").innerHTML = io_weekEndText;
4003            if(amt>0){
4004              cust_price.style.display = "grid";
4005            }else{
4006              cust_price.style.display = "none";
4007            }
4008          }
4009        });
4010      }
4011    });
4012  }
4013  function updatePageAvail_itemIDs(data){
4014    jQuery.each(data, function (rental_id, qty){
4015      if (rental_id == "price"  && jQuery(".io_product_infobox .item_inputtype").text() != "Map") {
4016        var prices = qty;
4017        jQuery.each(prices, function (price_id, amt) {
4018          let cust_price = document.querySelector(".io_product_cust_price");
4019          if(cust_price==undefined){
4020            var first_price = document.querySelector(".io_product_price_box");
4021            if(first_price != null){
4022              cust_price = first_price.cloneNode(true);
4023              /* clear all classes */
4024              cust_price.className = "";
4025              cust_price.classList.add("io_product_price_box");
4026              cust_price.classList.add("io_product_cust_price");
4027              cust_price.style.display = "none";
4028              first_price.before(cust_price);
4029            }
4030          }
4031          main_item_id = jQuery(".io_product_infobox .item_rentalid").first().text();
4032          if(main_item_id == price_id && cust_price!=undefined){
4033            if(typeof amt == "string") amt = Number(amt.replace(",",""));
4034            cust_price.querySelector("p:nth-child(1)").innerHTML=simpleCart.toCurrency(amt);
4035            let times = getAvailTimes();
4036            cust_price.querySelector("p:nth-child(2)").innerHTML = make_live_price_editable_time(times);
4037            if(amt>0 && (event_time_set() || io_always_display_live_price == "on")){
4038              cust_price.style.display = "grid";
4039            }else{
4040              cust_price.style.display = "none";
4041            }
4042          }
4043        });
4044      }
4045
4046      if(qty<=0 && rental_id != "delivery_method"){
4047        /* cat,all-item,widget */
4048        if(io_checkavail=="warn"){
4049          jQuery(".add_cart_"+rental_id.replace(":", "\\\:")+" .item_add").removeClass("item_add").addClass("item_add_off").trigger("classChange");
4050          jQuery(".unavailable_message_"+rental_id.replace(":", "\\\:")).show();
4051        }
4052        if(io_checkavail=="hide") jQuery(".add_cart_"+rental_id).parent().parent().parent().hide();
4053
4054        /* product page */
4055        if(jQuery(".io_product_container").length && io_checkavail!="off" && jQuery(".io_product_container .item_rentalid").first().text() === rental_id){
4056          jQuery(".add_cart_"+rental_id.replace(":", "\\\:")+" .item_add").first().removeClass("item_add").addClass("item_add_off").trigger("classChange");
4057          jQuery(".io_product_container .unavailable_message").show();
4058        }
4059      }else if(qty>0){
4060        if(io_checkavail=="warn"){
4061          jQuery(".add_cart_"+rental_id.replace(":", "\\\:")+" .item_add_off").removeClass("item_add_off").addClass("item_add").trigger("classChange");
4062          jQuery(".unavailable_message_"+rental_id.replace(":", "\\\:")).hide();
4063        }
4064        if(io_checkavail=="hide") jQuery(".add_cart_"+rental_id).parent().parent().parent().show();
4065
4066        /* product page */
4067        if(jQuery(".io_product_container").length && io_checkavail!="off" && jQuery(".io_product_container .item_rentalid").first().text() === rental_id){
4068          jQuery(".add_cart_"+rental_id.replace(":", "\\\:")+" .item_add_off").removeClass("item_add_off").addClass("item_add").trigger("classChange");
4069          jQuery(".io_product_container .unavailable_message").hide();
4070        }
4071      }
4072    });
4073  }
4074  function updatePageAvail_itemNames(data){
4075    jQuery.each(data, function (rental_name, qty) {
4076      rental_name = rental_name.replace(/[\u2032\u2019]+/ig,"'");
4077      var main_name_temp = "";
4078      if(typeof main_name_orig != "undefined"){
4079        main_name_temp = main_name_orig.replace(/[\u2032\u2019]+/ig,"'");
4080      }
4081      rental_name_esc = rental_name.replace(/'/g, "\\\\'");
4082      if (rental_name == "price") {
4083        var prices = qty;
4084        jQuery.each(prices, function (price_name, amt) {
4085          /* var prices = document.querySelector(".io_product_price_box:not(.io_product_cust_price)"); */
4086          /* if(prices != null) prices.remove(); */
4087          let cust_price = document.querySelector(".io_product_cust_price");
4088          if(cust_price==undefined){
4089            var first_price = document.querySelector(".io_product_price_box");
4090            if(first_price != null){
4091              cust_price = first_price.cloneNode(true);
4092              /* clear all classes */
4093              cust_price.className = "";
4094              cust_price.classList.add("io_product_price_box");
4095              cust_price.classList.add("io_product_cust_price");
4096              cust_price.style.display = "none";
4097              first_price.before(cust_price);
4098            }
4099          }
4100          try{
4101            var main_name = decodeURIComponent(jQuery(".io_product_container .item_encoded").first().html().replace(/[+]/gi, "%20"));
4102          }catch(e){main_name=""}
4103          var i = main_name.lastIndexOf(":");
4104          let acc_name = "";
4105          let rental_name = "";
4106          var i = main_name.lastIndexOf(":");
4107          if(i>0){
4108            rental_name = main_name.substring(0, i);
4109            acc_name = main_name.substring(i+1);
4110          }
4111          if (acc_name.toUpperCase() == price_name.toUpperCase() && cust_price!=undefined){
4112            var rental_id = document.querySelector(".item_rentalid").innerText;
4113            if(rental_id != null){
4114              rid_arr = rental_id.split(":");
4115              /* ignore the main id for this */
4116              rental_id = rid_arr[rid_arr.length-1];
4117              if(jQuery("#io_acc_overrideprice_"+rental_id).first().text()>0){
4118                amt = prices[acc_name];
4119              }else{
4120                let item_price = Number(prices[rental_name].replace(",",""));
4121                amt = Number(amt.replace(",","")) + item_price;
4122                amt = simpleCart.toCurrency(amt, {symbol:""})
4123              }
4124            }
4125            cust_price.querySelector("p:nth-child(1)").innerText="$"+amt;
4126            if(typeof amt == "string") amt = Number(amt.replace(",",""));
4127            let times = getAvailTimes();
4128            cust_price.querySelector("p:nth-child(2)").innerHTML = make_live_price_editable_time(times);
4129            if(amt>0 && (event_time_set() || io_always_display_live_price == "on")){
4130              cust_price.style.display = "grid";
4131            }else{
4132              cust_price.style.display = "none";
4133            }
4134
4135          }else if(!rental_name && !acc_name && cust_price!=undefined){
4136            amt = prices[main_name];
4137            cust_price.querySelector("p:nth-child(1)").innerText="$"+amt;
4138            if(typeof amt == "string") amt = Number(amt.replace(",",""));
4139            let times = getAvailTimes();
4140            cust_price.querySelector("p:nth-child(2)").innerHTML = make_live_price_editable_time(times);
4141            if(amt>0 && (event_time_set() || io_always_display_live_price == "on")){
4142              cust_price.style.display = "grid";
4143            }else{
4144              cust_price.style.display = "none";
4145            }
4146          }
4147
4148        });
4149      }
4150
4151      if(qty<=0){
4152        /* cat,all-item,widget */
4153        if(io_checkavail=="warn"){
4154          jQuery("div[name='maindiv_"+rental_name_esc+"'] .item_add").removeClass("item_add").addClass("item_add_off").trigger("classChange");
4155          jQuery("div[name='maindiv_"+rental_name_esc+"'] .unavailable_message").show();
4156        }
4157        if(io_checkavail=="hide") jQuery("div[name='maindiv_"+rental_name_esc+"']").hide();
4158
4159        /* product page */
4160        if(jQuery(".io_product_container").length && io_checkavail!="off"){
4161          if(main_name_temp==rental_name){
4162            jQuery(".io_product_container .item_add").first().removeClass("item_add").addClass("item_add_off").trigger("classChange");
4163            jQuery(".io_product_container .unavailable_message").show();
4164          }
4165        }
4166      }else if(qty>0){
4167        /* console.log("good"); */
4168        if(io_checkavail=="warn"){
4169          jQuery("div[name='maindiv_"+rental_name_esc+"'] .item_add_off").removeClass("item_add_off").addClass("item_add").trigger("classChange");
4170          jQuery("div[name='maindiv_"+rental_name_esc+"'] .unavailable_message").hide();
4171        }
4172        if(io_checkavail=="hide") jQuery("div[name='maindiv_"+rental_name_esc+"']").show();
4173
4174        /* product page */
4175        if(jQuery(".io_product_container").length && io_checkavail!="off"){
4176          if(main_name_temp==rental_name){
4177            jQuery(".io_product_container .item_add_off").removeClass("item_add_off").addClass("item_add").trigger("classChange");
4178            jQuery(".io_product_container .unavailable_message").hide();
4179          }
4180        }
4181      }
4182    });
4183  }
4184  function displayAccessoryPrices(data) {
4185      if (data.price) {
4186          let acc_prices = data.price;
4187          for (const [key, value] of Object.entries(acc_prices)) {
4188              let new_key = key;
4189              if ((key.match(/_/g) || []).length > 1) {
4190                  let split_key = key.split("_");
4191                  let second_to_last = split_key[split_key.length - 2];
4192                  let last = split_key[split_key.length - 1];
4193                  new_key = second_to_last + "_" + last;
4194              }
4195              if (io_hide_zero == 1 && value > 0) {
4196                  let id_string = "#io_acc_desc_" + new_key;
4197                  let formatted_price = simpleCart.toCurrency(value);
4198                  if (jQuery("#io_acc_" + new_key + " .io_acc_price").length > 0) {
4199                      jQuery("#io_acc_" + new_key + " .io_acc_price").html(formatted_price);
4200                  } else {
4201                      let price_display = '<span class="io_acc_price"> ' + formatted_price + ' </span>';
4202                      jQuery(id_string).after(price_display);
4203                  }
4204              } else if (io_hide_zero == 0) {
4205                  let id_string = "#io_acc_desc_" + new_key;
4206                  let formatted_price = simpleCart.toCurrency(value);
4207                  if (jQuery("#io_acc_" + new_key + " .io_acc_price").length > 0) {
4208                      jQuery("#io_acc_" + new_key + " .io_acc_price").html(formatted_price);
4209                  } else {
4210                      let price_display = '<span class="io_acc_price"> ' + formatted_price + ' </span>';
4211                      jQuery(id_string).after(price_display);
4212                  }
4213              }
4214          }
4215      }
4216  }
4217  function make_live_price_editable_time(times, delivery_method=null) {
4218    if(!delivery_method) delivery_method = getCookie("io_delivery_method");
4219    let ele_text = "";
4220    if(times[0]) ele_text = "on " + times[0] + " ";
4221    if(times[2] === 0) times[2] = 1;
4222    if(io_hidetimes!="on" && !isNaN(times[2])) ele_text += "for "+times[2]+" hours ";
4223    if(delivery_method) ele_text += "for " + delivery_method + ". ";
4224    ele_text += '<span style="cursor:pointer; color:blue; text-decoration:underline;" onclick=checkAvailDateClick()>edit</span>';
4225    return ele_text;
4226  }
4227  function checkAvailDateClick(){
4228    cartShow();
4229    /* expand the date picker */
4230    setTimeout(calSetDateRange,100);
4231  }
4232  function checkAvailPageOnly(){
4233    checkAvailFilter();
4234    if(addressCookiesSet() && io_distance_charge){
4235      runDeliveryCall(true);
4236    }
4237  }
4238  function getAccIDforPrice(){
4239    let accessory_arr = jQuery(".io_acc_li").toArray();
4240    let acc_rental_id_str = "";
4241    for(let current_accessory = 0; current_accessory < accessory_arr.length; current_accessory++){
4242      let required_tag = jQuery(accessory_arr[current_accessory]).find(".item_required");
4243      if(required_tag.length > 0){
4244        if(required_tag[0].innerText == 0){
4245          acc_rental_id_str += jQuery(accessory_arr[current_accessory]).find(".item_rentalid")[0].innerText +"|";
4246        }
4247      }
4248    }
4249    return acc_rental_id_str;
4250  }
4251  function getUpsellIDforPrice(){
4252    let upsell_arr = jQuery(".page-carousel-rid").toArray();
4253    let upsell_rental_id_str = "";
4254    for(let current_upsell = 0; current_upsell < upsell_arr.length; current_upsell++){
4255      upsell_rental_id_str +=upsell_arr[current_upsell].innerText+"|";
4256    }
4257    return upsell_rental_id_str;
4258  }
4259  function displayUpsellPrices(data){
4260    if(data.price){
4261      let upsell_prices = data.price;
4262      for (const [key, value] of Object.entries(upsell_prices)) {
4263        if(io_hide_zero == 1 && value > 0){
4264          let id_string = "#rid"+ key;
4265          let formatted_price = simpleCart.toCurrency(value);
4266          let price_display ='<span class="page-carousel-price"> '+formatted_price+' </span>';
4267          jQuery(id_string).after(price_display);
4268        }else if(io_hide_zero == 0){
4269          let id_string = "#rid"+ key;
4270          let formatted_price = simpleCart.toCurrency(value);
4271          let price_display ='<span class="page-carousel-price"> '+formatted_price+' </span>';
4272          jQuery(id_string).after(price_display);
4273        }
4274      }
4275      pageFlickityRefresh();
4276    }
4277  }
4278  /*</editor-fold>*/
4279
4280  /*<editor-fold defaultstate="collapsed" desc="Check Avail - Cart">*/
4281  function checkAvailCartOnly(skip_timer=false){
4282    checkAvailCart();
4283    checkAvailCartTimeslots();
4284  }
4285
4286  function checkAvailCartTimeslots(){
4287    let rental_names = "";
4288    let rental_ids = "";
4289    let cart_rental_names = "";
4290    let cart_rental_ids = "";
4291    let times = getAvailTimes();
4292    let start_date = times[0];
4293    let event_duration = times[2];
4294    let end_date = start_date;
4295    var event_start_time = getCookie("io_timeStart");
4296    simpleCart.each(function (item, x) {
4297      var timeslots_html = item.get('timeslots');
4298      if(typeof timeslots_html == "undefined") return;
4299      if(timeslots_html.length == 0) return;
4300      var cart_name = item.get("encoded");
4301      if(cart_name==null) {
4302        cart_name = encodeURIComponent(item.get("name"));
4303        cart_name = encodeURIComponent(decodeURIComponent(cart_name).replace(/[\u2032\u2019]+/ig,"'"));
4304      }
4305      rental_id = item.get("rentalid");
4306
4307      var timeslot_name = getTimeslotName(timeslots_html);
4308      var timeslot_sel_range = jQuery(".item-timeslots [name=\""+timeslot_name+"\"] option:selected").val();
4309      if(typeof timeslot_sel_range != "undefined"){
4310        /* timeslots */
4311        setTimeslotSelected(item, timeslot_name);
4312      }else{
4313        /*  timepickers */
4314        setTimePicker(item, timeslot_name);
4315        let start_timepicker = document.getElementsByName(timeslot_name.replace("io_timepicker_", "start_timeslot_"));
4316        let end_timepicker = document.getElementsByName(timeslot_name.replace("io_timepicker_", "end_timeslot_"));
4317        timeslot_sel_range = start_timepicker[start_timepicker.length-1].value;
4318        timeslot_sel_range += " - " + end_timepicker[end_timepicker.length-1].value;
4319      }
4320
4321      var timeslot_sel_arr = "";
4322      if(typeof timeslot_sel_range != "undefined"){
4323        var [start_time, end_time] = break_timeslot_sel_range(timeslot_sel_range);
4324        if(start_time && end_time){
4325          let newDate1 = convertDateStringtoDateObject(start_date, start_time);
4326          let newDate2 = convertDateStringtoDateObject(end_date, end_time);
4327          let time_duration = ((newDate2 - newDate1) / 3600) / 1000;
4328          let quantity = item.get("quantity");
4329          if(item.get("inputtype") == "Map"){
4330            quantity = 1
4331          }
4332          rental_names += cart_name + "-" + quantity+"|";
4333          rental_ids += rental_id+"-"+quantity+"-"+start_time+"-"+time_duration+"|";
4334          cart_rental_names = rental_names;
4335          cart_rental_ids = rental_ids;
4336        }
4337      }
4338    });
4339    if(rental_ids || rental_names){
4340      checkAvailCall(start_date,event_start_time,event_duration,rental_names,rental_ids,updateCartAvail,1,cart_rental_ids,cart_rental_names,1);
4341    }
4342    return true;
4343  }
4344
4345  function checkAvailCart(){
4346    let rental_names = "";
4347    let rental_ids = "";
4348    let cart_rental_names = "";
4349    let cart_rental_ids = "";
4350    simpleCart.each(function (item, x) {
4351      if(typeof item.get('timeslots') != "undefined"){
4352        if(item.get('timeslots').length > 0){
4353          return;
4354        }
4355      }
4356      var cart_name = item.get("encoded");
4357      if(cart_name==null){
4358        cart_name = encodeURIComponent(item.get("name"));
4359        cart_name = encodeURIComponent(decodeURIComponent(cart_name).replace(/[\u2032\u2019]+/ig,"'"));
4360      }
4361      let quantity = item.get("quantity");
4362      if(item.get("inputtype") == "Map"){
4363        quantity = 1
4364      }
4365      rental_names += cart_name + "-" + quantity + "|";
4366      cart_rental_names += cart_name + "-" + quantity + "|";
4367      var cart_id = item.get("rentalid");
4368      rental_ids += cart_id + "-" + quantity + "|";
4369      cart_rental_ids += cart_id + "-" + quantity + "|";
4370    });
4371    var times = getAvailTimes();
4372    let return_id = 0;
4373    if(rental_ids != ""){
4374      return_id = 1;
4375    }
4376    if(rental_ids != "" || rental_names != ""){
4377      return checkAvailCall(times[0],times[1],times[2],rental_names,rental_ids,updateCartAvail,1,cart_rental_ids,cart_rental_names,return_id);
4378    }
4379    return true;
4380  }
4381  function updateCartAvail(data){
4382    let use_id = data["return_id"]
4383    delete data["return_id"];
4384    if(use_id == 1){
4385      updateCartAvail_itemIDs(data)
4386    }else{
4387      updateCartAvail_itemNames(data);
4388    }
4389    console.log("cart update");
4390    if(addressCookiesSet() && io_distance_charge){
4391      runDeliveryCall(true);
4392    }
4393    /* simpleCart.trigger("update"); */
4394    simpleCart.update();
4395    /* jQuery("#avail").html(output); */
4396  }
4397
4398  function updateCartAvail_itemIDs(data){
4399    jQuery.each(data, function (rental_id, qty){
4400      simpleCart.each(function (item, x) {
4401        if(rental_id == item.get("rentalid")){
4402          if(io_hideQuantityAvail == "off"){
4403            if(qty>=9999 || item.get("inputtype") == "Map" || (item.get("giftcardvalue") && item.get("giftcardvalue").trim())){
4404              item.set("availability", "available");
4405            }else{
4406              item.set("availability", qty + " available");
4407            }
4408          }else if(io_hideQuantityAvail == "on"){
4409            if(qty<=0 || qty < item.get("quantity")){
4410              item.set("availability", "not available");
4411            }else{
4412              item.set("availability", "available");
4413            }
4414          }
4415          var vendorid = item.get("vendorid");
4416          if(vendorid && vendorid.trim()){
4417            item.set("availability", "availability must be verified");
4418          }
4419        }
4420        if (rental_id == "price") {
4421          var prices = qty;
4422          jQuery.each(prices, function (price_name, amt) {
4423            if(price_name == item.get("rentalid")){
4424              if (typeof amt == "string" || amt instanceof String){
4425                if(amt != "TBD"){
4426                  if(typeof amt == "string") amt = Number(amt.replace(",",""));
4427                }
4428              }
4429              item.set("price", amt);
4430            }
4431          });
4432        }
4433      });
4434    });
4435  }
4436
4437  function updateCartAvail_itemNames(data){
4438    jQuery.each(data, function (rental_name, qty) {
4439      rental_name = rental_name.replace(/[\u2032\u2019]+/ig,"'");
4440      simpleCart.each(function (item, x) {
4441        try{
4442          var cart_name = decodeURIComponent(item.get("encoded").replace(/[+]/gi, "%20"));
4443        }catch(e){cart_name=null}
4444        if(cart_name==null) cart_name = item.get("name")
4445        cart_name = cart_name.replace(/[\u2032\u2019]+/ig,"'");
4446        var i = cart_name.lastIndexOf(":");
4447        if(i>0 && cart_name.toUpperCase() != rental_name.toUpperCase() && rental_name!="price"){cart_name = cart_name.substring(i+1)}
4448        if (cart_name.toUpperCase() == rental_name.toUpperCase()) {
4449          if(qty>9999){
4450            item.set("availability", "available");
4451          }else{
4452            item.set("availability", qty + " available");
4453          }
4454        }
4455        if (rental_name == "price") {
4456          var prices = qty;
4457          jQuery.each(prices, function (price_name, amt) {
4458            price_name = price_name.replace(/[\u2032\u2019]+/ig,"'");
4459            let acc_name = "";
4460            let rental_name = "";
4461            var i = cart_name.lastIndexOf(":");
4462            if(i>0){
4463              rental_name = cart_name.substring(0, i);
4464              acc_name = cart_name.substring(i+1);
4465            }
4466            if (acc_name === price_name) {
4467              var rental_id = item.get("rentalid");
4468              if(rental_id != null){
4469                rid_arr = rental_id.split(":");
4470                /* ignore the main id for this */
4471                rental_id = rid_arr[rid_arr.length-1];
4472                if(jQuery("#io_acc_overrideprice_"+rental_id).first().text()>0){
4473                  amt = prices[acc_name];
4474                }else{
4475                  let item_price = Number(prices[rental_name].replace(",",""));
4476                  amt = Number(amt.replace(",","")) + item_price;
4477                  item.set("price", amt);
4478                  return;
4479                }
4480              }
4481              if(amt==null){
4482                amt = "0";
4483              }
4484              /* returned price is per unit */
4485              if(typeof amt == "string") amt = Number(amt.replace(",",""));
4486              item.set("price", amt);
4487            }else if(!rental_name && !acc_name){
4488              amt = Number(prices[cart_name].replace(",",""));
4489              item.set("price", amt);
4490            }
4491          });
4492        }
4493      });
4494    });
4495  }
4496  /*</editor-fold>*/
4497
4498  /*<editor-fold defaultstate="collapsed" desc="Upsell Carousels">*/
4499  function updateCartUpsell(data){
4500    let cart_carousel = jQuery(".cart-carousel");
4501    viewport = jQuery(".cart-carousel .flickity-viewport");
4502    if(viewport.length > 0){
4503      cart_carousel.flickity("destroy");
4504    }
4505    cart_carousel.empty();
4506    data.forEach(function(upsell){
4507      cell = createCartCarouselCell(upsell["image"], upsell["name"], upsell["page"]);
4508      cart_carousel.append(cell);
4509    });
4510    makeCarousel(cart_carousel);
4511    jQuery("#cart-carousel-container").show();
4512    setTimeout(cartFlickityRefresh, 500);
4513  }
4514
4515  function cartFlickityRefresh(){
4516    jQuery(".cart-carousel").flickity("resize");
4517  }
4518
4519  //IO-14031
4520  function isMobile()
4521  {
4522  // Modern detection
4523    if (navigator.userAgentData && navigator.userAgentData.mobile !== undefined) {
4524      return navigator.userAgentData.mobile;
4525    }
4526
4527  // Fallback for older browsers
4528    return /Mobi|Android|iPhone|iPad|iPod/i.test(navigator.userAgent) ||
4529           ('ontouchstart' in window && navigator.maxTouchPoints > 0);
4530  }
4531
4532  function makeCarousel(cart_carousel)
4533  {
4534    cart_carousel.flickity({
4535      wrapAround: true,
4536      draggable: isMobile(),
4537      cellAlign: 'left',
4538      //autoPlay: 3000,
4539      groupCells: true,
4540      resize: true
4541    });
4542    cart_carousel_set = true;
4543  }
4544
4545  function createCartCarouselCell(image, name, page){
4546    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>';
4547    return cell;
4548  }
4549  /*</editor-fold>*/
4550
4551  /*<editor-fold defaultstate="collapsed" desc="Ajax Calls">*/
4552  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) {
4553        /*
4554        IO-21459 If we have no duration set (event not set in cart), and we are doing the call for the page live
4555        price, and we have the setting on where we want to display this price even if the event date is not set:
4556
4557        We set the time_duration to 1 hour. This defaults the start date to January 1, 1970 with duration of
4558        1 hour in the lead meaning it will be available and we have the one hour price.
4559        */
4560    if((isNaN(time_duration) || time_duration===0) && price_only==1 && io_always_display_live_price == "on"){
4561      time_duration = 1;
4562      if(!start_date){
4563        start_date = getFormatteddate(new Date());
4564      }
4565      if(!start_time){
4566        start_time = getFormattedtime(new Date());
4567      }
4568    }else if((isNaN(time_duration) || time_duration===0) && price_only==0 && io_hidetimes === "on"){
4569      /* 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. */
4570      time_duration = 1;
4571    }else if(isNaN(time_duration) || time_duration===0){
4572      return;
4573    }
4574    url = "https://rental.software/quotes/check_availability_v2.php?callback=?";
4575    if(window.location.href.indexOf("localhost") > -1){
4576      //url = "http://localhost/bugs/quotes/check_availability_v2.php?callback=?";
4577      url = "http://localhost/io/bugs/quotes/check_availability_v2.php?callback=?";
4578      //url = "http://localhost/jbug/trunk/quotes/check_availability_v2.php?callback=?";
4579    }
4580    if(!delivery_method) delivery_method = getCookie("io_delivery_method");
4581    let address_data = {
4582      "address": getCookie("io_address"),
4583      "state": getCookie("io_state"),
4584      "city": getCookie("io_city"),
4585      "zip": getCookie("io_zip")
4586    };
4587    if(!ioHasMarketingConsent()){
4588      address_data = {"address":"", "state":"", "city":"", "zip":""};
4589    }
4590    url +=
4591            "&name=" + encodeURIComponent("Top Event Rentals_1") +
4592            "&startdate=" + start_date +
4593            "&starttime=" + start_time +
4594            "&duration=" + time_duration +
4595            "&street=" + encodeURIComponent(address_data["address"]) +
4596            "&city=" + encodeURIComponent(address_data["city"]) +
4597            "&state=" + encodeURIComponent(address_data["state"]) +
4598            "&zip=" + encodeURIComponent(address_data["zip"]) +
4599            "&single_cart=" + singleCart +
4600            "&usecushion=1" +
4601            "&include_price=1" +
4602            "&showlocations=0" +
4603            "&rental_names=" + rental_names +
4604            "&rental_ids=" + rental_ids +
4605            "&cart_rental_names=" + cart_rental_names +
4606            "&cart_rental_ids=" + cart_rental_ids +
4607            "&return_id=" + return_id +
4608            "&delivery_method=" + delivery_method +
4609            "&temp=" + temp +
4610            "&skip_hidden_lead="+ skip_hidden_lead;
4611      if (custom_price_name)
4612      {
4613          ioCartLoaderIncrement();
4614          jQuery.getJSON(url, function (data)
4615          {
4616              try
4617              {
4618                  returnFunc(data, custom_price_name);
4619              }
4620              finally
4621              {
4622                  ioCartLoaderDecrement();
4623              }
4624          });
4625      }
4626      else
4627      {
4628          ioCartLoaderIncrement();
4629          jQuery.getJSON(url, function (data)
4630          {
4631              try
4632              {
4633                  returnFunc(data);
4634              }
4635              finally
4636              {
4637                  ioCartLoaderDecrement();
4638              }
4639          });
4640      }
4641  }
4642
4643  function getUpsellsCall(start_date,start_time,time_duration,rental_ids,returnFunc) {
4644    if(rental_ids.replace(/[|]/g,"").length==0){return;}
4645    url = "https://rental.software/quotes/in_cart_upsell.php?callback=?";
4646    if(window.location.href.indexOf("localhost") > -1){
4647      //url = "http://localhost/bugs/quotes/in_cart_upsell.php?callback=?"
4648      url = "http://localhost/io/bugs/quotes/in_cart_upsell.php?callback=?"
4649    }
4650    url +=
4651            "&name=" + encodeURIComponent("Top Event Rentals_1") +
4652            "&startdate=" + start_date +
4653            "&starttime=" + start_time +
4654            "&duration=" + time_duration +
4655            "&usecushion=1" +
4656            "&include_price=1" +
4657            "&showlocations=0" +
4658            "&rental_ids=" + rental_ids;
4659    //IO-25557
4660    if(window.location.href.indexOf("dev.rental.software") > -1)//if it is a dev site, we need to send
4661    {
4662      let pattern = /(https:\/\/dev\.rental\.software\/[^\/]+\/)/;
4663      let matches = window.location.href.match(pattern);
4664      matches && matches.length > 0 ? url += "&site=" + matches[0]:0;
4665    }
4666    else
4667    {
4668      url += "&site=" + window.location.host;
4669    }
4670    jQuery.getJSON(url, returnFunc);
4671  }
4672  /*</editor-fold>*/
4673
4674  /*<editor-fold defaultstate="collapsed" desc="Customer Geolocation Functions">*/
4675  function setLocationInLocalStorage(city)
4676  {
4677      try
4678      {
4679          const location_data =
4680          {
4681              city: city,
4682              timestamp: Date.now()
4683          };
4684          localStorage.setItem(storage_key, JSON.stringify(location_data));
4685          return true;
4686      }
4687      catch (e)
4688      {
4689          console.warn('Failed to save location to localStorage:', e);
4690          return false;
4691      }
4692  }
4693
4694  function getLocationFromLocalStorage()
4695  {
4696      try
4697      {
4698          const location_data = localStorage.getItem(storage_key);
4699          if (location_data)
4700          {
4701              return JSON.parse(location_data);
4702          }
4703
4704      }
4705      catch (e)
4706      {
4707          console.warn('Failed to retrieve location from localStorage:', e);
4708      }
4709      return null;
4710  }
4711
4712  function displayLocation(city)
4713  {
4714      const location_element = jQuery('.io_geo_city');
4715      const container_element = jQuery('#io_customer_geolocation');
4716
4717      if (location_element.length && container_element.length)
4718      {
4719          location_element.text(`${city}`);
4720          container_element.show();
4721          return true;
4722      }
4723      return false;
4724  }
4725
4726  function getCityFromIO(returnFunc)
4727  {
4728    var url = "https://rental.software/include/geolocation_handler.php?callback=?";
4729    if(window.location.href.indexOf("localhost") > -1)
4730    {
4731      url = "http://localhost//features//include/geolocation_handler.php?callback=?";
4732    }
4733    url +=
4734        "&name=" + encodeURIComponent("Top Event Rentals_1") +
4735        "&ip=" + encodeURIComponent(io_customer_ip);
4736
4737    jQuery.getJSON(url, returnFunc);
4738  }
4739
4740  function initializeGeolocation()
4741  {
4742      try
4743      {
4744      // Check local storage first
4745          const cached_location = getLocationFromLocalStorage();
4746          if (cached_location && cached_location.city)
4747          {
4748              if (displayLocation(cached_location.city))
4749              {
4750                  return;
4751              }
4752          }
4753
4754          // If no cached location, call the handler to get location
4755          getCityFromIO(function(location_data)
4756          {
4757              if (location_data && location_data.city && !location_data.error)
4758              {
4759                  // Display and store the location
4760                  if (displayLocation(location_data.city))
4761                  {
4762                      setLocationInLocalStorage(location_data.city);
4763                  }
4764              }
4765              else
4766              {
4767                  console.warn('Failed to get location:', location_data ? location_data.error : 'Unknown error');
4768              }
4769          });
4770      } 
4771      catch (error)
4772      {
4773          console.error('Geolocation initialization failed:', error);
4774      }
4775  }
4776  /*</editor-fold>*/
4777
4778  /*<editor-fold defaultstate="collapsed" desc="Loading Animation Helpers">*/
4779
4780  /**
4781  * Toggles the visibility of the cart loading overlay.
4782  *
4783  * @param {boolean} show - A boolean value to determine whether to show or hide the overlay.
4784  *                         If true, the overlay becomes visible; if false, it is hidden.
4785  * @return {void} This function does not return a value.
4786  */
4787  function ioCartShowOverlay(show)
4788  {
4789      try
4790      {
4791          var overlay = document.getElementById('ioCartLoadingOverlay');
4792          if (!overlay) return;
4793          if (show)
4794          {
4795              overlay.style.display = 'flex';
4796              overlay.setAttribute('aria-hidden', 'false');
4797          }
4798          else
4799          {
4800              overlay.style.display = 'none';
4801              overlay.setAttribute('aria-hidden', 'true');
4802          }
4803      }
4804      catch (e)
4805      {}
4806  }
4807
4808  /**
4809   * Activates the cart loader by setting the loading state to active, initializing the loading count,
4810   * and displaying the overlay. Includes a fallback to deactivate the loader if no response is received
4811   * within a specified timeout period.
4812   *
4813   * @return {void} This method does not return a value.
4814   */
4815  function ioCartLoaderActivate()
4816  {
4817      io_cart_loading_active = true;
4818      io_cart_loading_count = 0;
4819      ioCartShowOverlay(true);
4820
4821      //fallback in case the availability call doesn't come back
4822      if (io_cart_loading_fallback_timer) clearTimeout(io_cart_loading_fallback_timer);
4823      io_cart_loading_fallback_timer = setTimeout(function () {
4824          if (io_cart_loading_active) {
4825              io_cart_loading_active = false;
4826              io_cart_loading_count = 0;
4827              ioCartShowOverlay(false);
4828          }
4829      }, 15000);
4830  }
4831
4832  /**
4833   * Increments the count of active cart loading operations and ensures the cart overlay is displayed.
4834   *
4835   * This method increases the `io_cart_loading_count` if the `io_cart_loading_active` flag is set to true.
4836   * It also calls the `ioCartShowOverlay` function with a true value to show the overlay.
4837   *
4838   * @return {void} This function does not return any value.
4839   */
4840  function ioCartLoaderIncrement()
4841  {
4842      if (io_cart_loading_active)
4843      {
4844          io_cart_loading_count++;
4845          ioCartShowOverlay(true);
4846      }
4847  }
4848
4849  /**
4850   * Decrements the `io_cart_loading_count` if `io_cart_loading_active` is true.
4851   * If the count reaches zero, it deactivates the loader, removes the overlay,
4852   * and clears the fallback timer
4853   */
4854  function ioCartLoaderDecrement()
4855  {
4856      if (io_cart_loading_active)
4857      {
4858          io_cart_loading_count = Math.max(0, io_cart_loading_count - 1);
4859
4860          if (io_cart_loading_count === 0)
4861          {
4862              io_cart_loading_active = false;
4863              ioCartShowOverlay(false);
4864
4865              if (io_cart_loading_fallback_timer)
4866              {
4867                  clearTimeout(io_cart_loading_fallback_timer);
4868                  io_cart_loading_fallback_timer = null;
4869              }
4870          }
4871      }
4872  }
4873
4874  /*</editor-fold>*/</script>
4874 <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"
4875 id="address_entry_submit"
4876 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> 
4876<script>/* for checking delivery */
4877  function runDeliveryCall(cart_only = false){
4878    let address_fields = jQuery("[id^='io_cd_']");
4879    let address_data = {
4880      "address": getCookie("io_address"),
4881      "state": getCookie("io_state"),
4882      "city": getCookie("io_city"),
4883      "zip": getCookie("io_zip")
4884    };
4885
4886    let times = getAvailTimes();
4887
4888    let start_date = times[0];
4889    let end_date = start_date;
4890    let start_time = times[1];
4891    let duration = times[2];
4892
4893    let rental_ids = "";
4894    simpleCart.each(function (item, x) {
4895      if(typeof item.get('timeslots') != "undefined"){
4896        if(item.get('timeslots').length > 0){
4897        var timeslots_html = item.get('timeslots');
4898        var rental_id = item.get('rentalid');
4899        if(typeof timeslots_html == "undefined") return;
4900        if(timeslots_html.length == 0) return;
4901
4902        var timeslot_name = getTimeslotName(timeslots_html);
4903        var timeslot_sel_range = jQuery(".item-timeslots [name=\""+timeslot_name+"\"] option:selected").val();
4904        if(typeof timeslot_sel_range != "undefined"){
4905          /* timeslots */
4906          setTimeslotSelected(item, timeslot_name);
4907        }else{
4908          /*  timepickers */
4909          setTimePicker(item, timeslot_name);//todo?
4910          let start_timepicker = document.getElementsByName(timeslot_name.replace("io_timepicker_", "start_timeslot_"));
4911          let end_timepicker = document.getElementsByName(timeslot_name.replace("io_timepicker_", "end_timeslot_"));
4912          timeslot_sel_range = start_timepicker[start_timepicker.length-1].value;
4913          timeslot_sel_range += " - " + end_timepicker[end_timepicker.length-1].value;
4914        }
4915
4916        var timeslot_sel_arr = "";
4917        if(typeof timeslot_sel_range != "undefined"){
4918          timeslot_sel_arr = timeslot_sel_range.split(" - ");
4919          var timeslot_start_time = timeslot_sel_arr[0].replace("am"," am").replace("pm"," pm").replace("  "," ");
4920          var timeslot_end_time = timeslot_sel_arr[1].replace("am"," am").replace("pm"," pm").replace("  "," ");
4921          if(timeslot_start_time && timeslot_end_time){
4922            let newDate1 = convertDateStringtoDateObject(start_date, timeslot_start_time);
4923            let newDate2 = convertDateStringtoDateObject(end_date, timeslot_end_time);
4924            let timeslot_duration = ((newDate2 - newDate1) / 3600) / 1000;
4925            rental_ids += rental_id+"-"+item.get("quantity")+"-"+timeslot_start_time+"-"+timeslot_duration+"|";
4926          }
4927        }
4928      }
4929    }
4930  else{
4931    var cart_id = item.get("rentalid");
4932    rental_ids += cart_id + "-" + item.get("quantity") + "|";
4933  }
4934  });
4935
4936  address_fields.each(function() {
4937    let field = this.id.split("_")[2];
4938    value = this.value;
4939    if(!value && !address_data[field]){
4940      jQuery(this).addClass("invalid_address_field")
4941    }
4942    else if(value){
4943      jQuery(this).removeClass("invalid_address_field")
4944      address_data[field] = this.value;
4945    }
4946  });
4947  if(jQuery(".invalid_address_field").length > 0){
4948    return;
4949  }
4950    let delivery_method = ""
4951    if(io_default_delivery_method)
4952    {
4953      delivery_method = io_default_delivery_method;
4954    }
4955    else if(getCookie("io_delivery_method"))
4956    {
4957      delivery_method = getCookie("io_delivery_method");
4958    }
4959
4960
4961  setCookie("io_address", address_data["address"], 14);
4962  setCookie("io_city", address_data["city"], 14);
4963  setCookie("io_state", address_data["state"], 14);
4964  setCookie("io_zip", address_data["zip"], 14);
4965
4966  cart_total = simpleCart.total();
4967  if(cart_total === "TBD") cart_total = 0;
4968  url = "https://rental.software/quotes/get_delivery_info.php?callback=?";
4969  if(window.location.href.indexOf("localhost") > -1){
4970    //url = "http://localhost/bugs/quotes/get_delivery_info.php?callback=?";
4971    url = "http://localhost/io/bugs/quotes/get_delivery_info.php?callback=?";
4972  }
4973  url +=
4974          "&name=" + encodeURIComponent("Top Event Rentals_1") +
4975          "&rental_ids=" + rental_ids +
4976          "&street=" + encodeURIComponent(address_data["address"]) +
4977          "&city=" + encodeURIComponent(address_data["city"]) +
4978          "&state=" + encodeURIComponent(address_data["state"]) +
4979          "&zip=" + encodeURIComponent(address_data["zip"]) +
4980          "&startdate=" + start_date +
4981          "&starttime=" + start_time +
4982          "&duration=" + duration +
4983          "&delivery_method=" + encodeURIComponent(delivery_method) +
4984          "&total=" + cart_total +
4985          "&cart_only=" + cart_only;
4986  jQuery.getJSON(url, function(data){
4987    if(data["delivery_restrict"] === 1){
4988      data["charge"] = 0;
4989    }
4990    handleDeliveryInfo(data, cart_only);
4991  });
4992  }
4993
4994  function handleDeliveryInfo(data, cart_only = false){
4995    jQuery("#deliverSubtotalContainer").show();
4996    jQuery("#checkDeliveryMessage").hide();
4997    let info_box = jQuery("#delivery_charge_info_box");
4998    if(data["delivery_restrict"] == 1){
4999      jQuery("#info_box_header").text("Sorry...");
5000      jQuery("#info_box_information").text(data["error"])
5001      setDeliverySubtotal(data["charge"], true)
5002    }
5003    else{
5004      setDeliverySubtotal(data["charge"])
5005      jQuery("#info_box_header").text("Success!");
5006      if(data["charge"] > 0){
5007        jQuery("#info_box_information").html("We are able to deliver to your location with a " + simpleCart.toCurrency(data["charge"]) +" fee!");
5008      }
5009      else{
5010        jQuery("#info_box_information").html("We are able to deliver to your location with no charge!");
5011      }
5012    }
5013    if(simpleCart.items().length == 0 && cart_only){
5014      jQuery("#info_box_header").text("Items Required.");
5015      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!")
5016    }
5017    info_box.show();
5018    jQuery.fancybox.update(jQuery(".address_entry"));
5019  }
5020  function showAddressEntry(cart_only=false){
5021    cartHide();
5022    jQuery(".invalid_address_field").removeClass("invalid_address_field")
5023    jQuery("#delivery_charge_info_box").hide();
5024    jQuery("#io_cd_address").val(getCookie("io_address"));
5025    jQuery("#io_cd_state").val(getCookie("io_state"));
5026    jQuery("#io_cd_city").val(getCookie("io_city"));
5027    jQuery("#io_cd_zip").val(getCookie("io_zip"));
5028    if(!cart_only){
5029      jQuery("#address_entry_submit").on("click", null, function(){ runDeliveryCall(); });
5030    } else{
5031      jQuery("#address_entry_submit").on("click", null, function(){ runDeliveryCall(cart_only); });
5032    }
5033    jQuery.fancybox.open(jQuery(".address_entry"));
5034  }
5035
5036  function closeAddressEntry(){
5037    jQuery.fancybox.close();
5038  }
5039
5040  function setDeliverySubtotal(amount, unavailable=false){
5041    if(unavailable){
5042      jQuery("#deliverySubtotal").html("Unavailable");
5043    } else{
5044      jQuery("#deliverySubtotal").html(simpleCart.toCurrency(amount));
5045    }
5046  }
5047
5048  function addressCookiesSet(){
5049    if(getCookie("address") && getCookie("state") && getCookie("city") && getCookie("zip")){
5050      return true;
5051    } else{
5052      return false
5053    }
5054  }</script>
vendor: 1 bytes, line 5054
5054
5055<script>let map;
5056  let geocoder;
5057  let item_id_map;
5058  let drawingManager;
5059  let drawingListener;
5060
5061  let polygons = new Array();
5062
5063  let polyline_markers = new Array();
5064  let polylines = new Array();
5065  let previous_marker;
5066  current_polyline = undefined;
5067  let previous_map_height = "";
5068
5069  function initMap() {
5070    map = new google.maps.Map(document.getElementById("map_container"), {
5071      center: { lat: -34.397, lng: 150.644 },
5072      zoom: 8,
5073      mapTypeId: "hybrid",
5074      disableDefaultUI: true,
5075      tilt: 0
5076    });
5077    drawingManager = new google.maps.drawing.DrawingManager({
5078      drawingControl: true,
5079      drawingControlOptions: {
5080        position: google.maps.ControlPosition.TOP_CENTER,
5081        drawingModes: [
5082          google.maps.drawing.OverlayType.POLYGON,
5083        ],
5084      }
5085    });
5086
5087    geocoder = new google.maps.Geocoder();
5088  }
5089
5090  function io_geocode(){
5091    let prefix = "#io_mc_"
5092    let request = ""
5093    let address_value = "";
5094    if(jQuery(prefix+"address").length) {
5095      address_value = jQuery(prefix+"address").val();
5096      if(address_value) setCookie("address", jQuery("#io_mc_address").val(), 14);
5097    }
5098    let city_value = "";
5099    if(jQuery(prefix+"city").length){
5100      city_value = jQuery(prefix+"city").val();
5101      if(city_value) setCookie("city", jQuery("#io_mc_city").val(), 14);
5102    }
5103    let state_value = "";
5104    if(jQuery(prefix+"state").length){
5105      state_value = jQuery(prefix+"state").val();
5106      if(state_value) setCookie("state", jQuery("#io_mc_state").val(), 14);
5107    }
5108    let zip_value = "";
5109    if(jQuery(prefix+"zip").length){
5110      zip_value = jQuery(prefix+"zip").val();
5111      if(zip_value) setCookie("zip", jQuery("#io_mc_zip").val(), 14);
5112    }
5113
5114    request = address_value + " " + city_value + " " + state_value + " " + zip_value;
5115    if(request){
5116      geocoder.geocode({address:request}).then((result) => {
5117        const { results } = result;
5118        map.setCenter(results[0].geometry.location);
5119        map.setZoom(24);
5120        return results;
5121      });
5122
5123    }
5124
5125    if(!addressProvided()) {
5126      jQuery("#io_map_address_entry").attr("open", "open");
5127    }else{
5128      jQuery("#io_map_address_entry").removeAttr("open");
5129    }
5130  }
5131
5132  function openMap(element){
5133    cartHide()
5134    io_map_clear()
5135    let unit = "meters"
5136    if(country === "US") unit = "feet"
5137    polygons = new Array();
5138    polyline_marker_sets = new Array();
5139    polylines = new Array();
5140    previous_marker = undefined;
5141    current_polyline = undefined;
5142
5143    jQuery("#io_mc_address").val(getCookie("address"));
5144    jQuery("#io_mc_state").val(getCookie("state"));
5145    jQuery("#io_mc_city").val(getCookie("city"));
5146    jQuery("#io_mc_zip").val(getCookie("zip"));
5147    io_geocode();
5148
5149    google.maps.event.removeListener(drawingListener);
5150
5151    if(element.id == "calcPriceOpenMap"){
5152      item_id_map = jQuery(".io_product_infobox .item_rentalid").text();
5153      if(jQuery(".io_product_infobox .item_qtytype").text() == "Area"){
5154        setMapTools_Area(unit, true)
5155      }else if(jQuery(".io_product_infobox .item_qtytype").text() == "Perimeter"){
5156        setMapTools_Perimeter(unit, true)
5157      }
5158    }
5159    else{
5160      item_id_map = jQuery(element).parent().parent().find(".item-rentalid").text();
5161      if(jQuery(element).parent().parent().find(".item-qtytype").text() == "Area"){
5162        setMapTools_Area(unit)
5163      }else if(jQuery(element).parent().parent().find(".item-qtytype").text() == "Perimeter"){
5164        setMapTools_Perimeter(unit)
5165      }
5166    }
5167  }
5168
5169  function addressProvided(){
5170    if(jQuery("#io_mc_address").val() && jQuery("#io_mc_state").val() &&
5171            jQuery("#io_mc_city").val() && jQuery("#io_mc_zip").val() ){
5172      return true;
5173    }
5174    return false;
5175  }
5176
5177  function setMapTools_Area(unit, item_page=false){
5178    jQuery.fancybox.open(jQuery(".map_fancybox"));
5179    drawingManager.setOptions({
5180      drawingControlOptions: {
5181        drawingModes: [google.maps.drawing.OverlayType.POLYGON]
5182      },
5183      drawingMode: google.maps.drawing.OverlayType.POLYGON,
5184      polygonOptions: {
5185        fillColor: "#0191fc",
5186        strokeColor: "#0113fc"
5187      },
5188    });
5189    let units = "meters"
5190    if(country === "US") units = "feet"
5191
5192    jQuery("#io_measurement_input_label").text("Approximate area in "+units+": ");
5193    jQuery("#io_map_manual_input").off("click");
5194    jQuery("#io_map_manual_input").on("click", function(){manual_calc_price("Area", item_page)});
5195    jQuery("#io_perimeter_options_container").hide();
5196    jQuery("#io_map_new_line_container").hide();
5197    jQuery("#io_map_instructions").html("Use the map below to take measurements by clicking on each corner of the area y
5197ou 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>")
5198
5199    drawingListener = google.maps.event.addListener(drawingManager, "polygoncomplete", function(polygon) {
5200      polygons.push(polygon);
5201      let convert_feet = 1;
5202      if(country === "US") convert_feet = 10.764;
5203      let approx_area = 0;
5204      polygons.forEach(function(polygon) {
5205        approx_area += google.maps.geometry.spherical.computeArea(polygon.getPath()) * convert_feet;
5206      });
5207      calcprice_approx_area(Math.round(approx_area));
5208    });
5209    drawingManager.setMap(map);
5210  }
5211
5212  function setMapTools_Perimeter(unit, item_page=false){
5213    jQuery.fancybox.open(jQuery(".map_fancybox"));
5214    drawingManager.setOptions({
5215      drawingControlOptions: {
5216        drawingModes: [google.maps.drawing.OverlayType.MARKER]
5217      },
5218      drawingMode: google.maps.drawing.OverlayType.MARKER
5219    });
5220    let height = jQuery("#perimeter_height").val();
5221    let units = "";
5222    if(height){
5223      units = "sq meters"
5224      if(country === "US") units = "sq feet"
5225      jQuery("#io_measurement_input_label").text("Approximate surface area in "+units+": ");
5226      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>")
5227
5228    }else{
5229      units = "meters"
5230      if(country === "US") units = "feet"
5231      jQuery("#io_measurement_input_label").text("Approximate perimeter in "+units+": ");
5232      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>")
5233
5234    }
5235
5236    jQuery("#io_map_manual_input").off("click");
5237    jQuery("#io_map_manual_input").bind("click", function(){manual_calc_price("Perimeter", item_page)});
5238    jQuery("#perimeter_height").bind("change", function(){change_perimeter_instructions()});
5239    jQuery("#io_perimeter_options_container").show();
5240    jQuery("#io_map_clear_container").show();
5241    jQuery("#io_map_new_line_container").show();
5242
5243    current_polyline = new google.maps.Polyline({
5244      map: map,
5245      path: [],
5246      strokeColor: "#0113fc",
5247      strokeOpacity: 1.0,
5248      strokeWeight: 2
5249    })
5250    drawingListener = google.maps.event.addListener(drawingManager, "markercomplete", function(marker) {
5251      polyline_markers.push(marker)
5252      marker.setVisible(false);
5253      current_polyline.getPath().push(marker.getPosition())
5254      if(previous_marker){
5255        let convert_feet = 1;
5256        if(country === "US") convert_feet = 3.281;
5257        let approx_perimeter = 0;
5258        polylines.forEach(function(polyline) {
5259          if(convert_feet > 1) convert_feet = 10.764
5260          approx_perimeter += google.maps.geometry.spherical.computeArea(polyline.getPath()) * convert_feet;
5261        });
5262        approx_perimeter += google.maps.geometry.spherical.computeLength(current_polyline.getPath()) * convert_feet;
5263        calcprice_approx_perimeter(Math.round(approx_perimeter));
5264      }
5265      previous_marker = marker;
5266    });
5267
5268    jQuery("#perimeter_height_contianer").show();
5269
5270    drawingManager.setMap(map);
5271  }
5272
5273  function change_perimeter_instructions(){
5274    let height = jQuery("#perimeter_height").val();
5275    if(height){
5276      units = "sq meters"
5277      if(country === "US") units = "sq feet"
5278      jQuery("#io_measurement_input_label").text("Approximate surface area in "+units+": ");
5279      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>")
5280    }else {
5281      units = "meters"
5282      if(country === "US") units = "feet"
5283      jQuery("#io_measurement_input_label").text("Approximate perimeter in "+units+": ");
5284      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>")
5285    }
5286  }
5287
5288  function manual_calc_price(method, item_page){
5289    let approx_measurement = parseInt(jQuery("#io_measurement_input").val());
5290    let units = "";
5291    if(approx_measurement){
5292      if(method == "Area"){
5293        units = "sq meters"
5294        if(country === "US") units = "sq feet"
5295      }else if(method == "Perimeter"){
5296        let height = jQuery("#perimeter_height").val();
5297        if(height){
5298          units = "sq meters"
5299          if(country === "US") units = "sq feet"
5300        }else{
5301          units = "meters"
5302          if(country === "US") units = "feet"
5303        }
5304      }
5305      simpleCart.items().forEach(function (item, index){
5306        if(item.get("rentalid") === item_id_map){
5307          item.set("units", units);
5308          item.set("quantity", approx_measurement);
5309        }
5310      });
5311
5312      simpleCart.update();
5313
5314      if(item_page || jQuery(".io_product_infobox .item_rentalid").text() == item_id_map) set_price_on_item_page(units, approx_measurement);
5315      if(!item_page) cartShow();
5316    }
5317    jQuery.fancybox.close();
5318  }
5319
5320  function calcprice_approx_area(approx_area){
5321    jQuery("#io_measurement_input").val(approx_area);
5322  }
5323
5324  function calcprice_approx_perimeter(approx_perimeter){
5325    let height = jQuery("#perimeter_height").val();
5326    if(height && height > 0) approx_perimeter *= parseInt(height);
5327
5328    jQuery("#io_measurement_input").val(approx_perimeter);
5329  }
5330
5331  function set_price_on_item_page(units, measurement){
5332    let measurement_price = document.querySelector(".io_product_measurement_price");
5333    if(measurement_price==undefined){
5334      var first_price = document.querySelector(".io_product_price_box");
5335      if(first_price != null){
5336        measurement_price = first_price.cloneNode(true);
5337        /* clear all classes */
5338        measurement_price.className = "";
5339        measurement_price.classList.add("io_product_price_box");
5340        measurement_price.classList.add("io_product_measurement_price");
5341        measurement_price.style.display = "grid";
5342        /* Make a hidden data span for when adding to cart */
5343        raw_measurement = document.createElement("span");
5344        raw_measurement.classList.add("io_measure_price_raw_measurement");
5345        raw_measurement.style.display = "none";
5346        raw_measurement.textContent = measurement;
5347        measurement_price.appendChild(raw_measurement);
5348        first_price.before(measurement_price);
5349      }
5350    }
5351    var price_1h = Number(jQuery(".io_product_price_1h_"+jQuery(".io_product_infobox .item_rentalid").text()).text().replace(/[^0-9.-]+/g,""));
5352    measurement_price.querySelector("p:nth-child(1)").innerHTML = simpleCart.toCurrency(price_1h*measurement);
5353    measurement_price.querySelector("p:nth-child(2)").innerHTML = "For approximately "+measurement+" "+units;
5354  }
5355
5356  function io_map_clear() {
5357    if(drawingManager.getDrawingMode() == "polygon"){
5358      drawingManager.setDrawingMode("polygon");
5359    }
5360
5361    if(polygons) polygons.forEach(function(polygon) {
5362      polygon.setMap(null);
5363    });
5364    if(current_polyline) current_polyline.setMap(null);
5365    if(polylines) polylines.forEach(function(polyline) {
5366      polyline.setMap(null);
5367    });
5368    if(polyline_markers) polyline_markers.forEach(function(marker) {
5369      marker.setMap(null);
5370    });
5371
5372    current_polyline = new google.maps.Polyline({
5373      map: map,
5374      path: [],
5375      strokeColor: "#0113fc",
5376      strokeOpacity: 1.0,
5377      strokeWeight: 2
5378    });
5379    polygons = new Array();
5380    polylines = new Array();
5381    polyline_markers = new Array();
5382    previous_marker = undefined;
5383  }
5384
5385  function io_map_new_line() {
5386    polylines.push(new google.maps.Polyline({
5387              map: map,
5388              path: current_polyline.getPath(),
5389              strokeColor: "#0113fc",
5390              strokeOpacity: 1.0,
5391              strokeWeight: 2
5392            })
5393    );
5394    previous_marker = undefined;
5395    current_polyline.setMap(null);
5396    current_polyline = new google.maps.Polyline({
5397      map: map,
5398      path: [],
5399      strokeColor: "#0113fc",
5400      strokeOpacity: 1.0,
5401      strokeWeight: 2
5402    });
5403  }
5404
5405  function show_more_instruct_click(show_more_button) {
5406    if(show_more_button.textContent == "(more)") {
5407      show_more_button.textContent = "(hide)";
5408      jQuery("#io_map_additional_instructions").show();
5409    }else if(show_more_button.textContent == "(hide)") {
5410      show_more_button.textContent = "(more)";
5411      jQuery("#io_map_additional_instructions").hide();
5412    }
5413  }
5414
5415  function perimeter_height_changed(){
5416    let current_map_height = jQuery("#perimeter_height").val();
5417    if(current_map_height && current_map_height > 0){
5418      if(jQuery("#io_measurement_input").val() && !previous_map_height){
5419        let measurement = jQuery("#io_measurement_input").val();
5420        jQuery("#io_measurement_input").val(measurement * current_map_height);
5421      }else if(jQuery("#io_measurement_input").val() && previous_map_height){
5422        let measurement = jQuery("#io_measurement_input").val();
5423        if(previous_map_height > 0){
5424          measurement = measurement / previous_map_height;
5425        }
5426        jQuery("#io_measurement_input").val(measurement * current_map_height);
5427      }
5428    }else if (!current_map_height || current_map_height == 0){
5429      if(jQuery("#io_measurement_input").val() && previous_map_height){
5430        let measurement = jQuery("#io_measurement_input").val();
5431        if(previous_map_height > 0){
5432          measurement = measurement / previous_map_height;
5433        }
5434        jQuery("#io_measurement_input").val(measurement);
5435      }
5436    }
5437    previous_map_height = current_map_height;
5438  }
5439
5440  window.initMap = initMap;</script>
5440 <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"
5441 id="map_geocode_submit"
5442 onClick="io_geocode()"
5443 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"
5444 id="io_map_manual_input"
5445 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"
5446 id="io_map_clear_btn"
5447 onClick="io_map_clear()"
5448 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"
5449 id="io_map_new_line_btn"
5450 onClick="io_map_new_line()"
5451 href="javascript:;"> Add New Line </a></div></div></div></div> <br><div id="map_container"> 
5451<script src="https://maps.googleapis.com/maps/api/js?key=AIzaSyDEuvvqefKaUABPvydm00SV8Fr8tQeGVcw&libraries=drawing&callback=initMap" defer></script>
5451 </div></div>  
5451<script>jQuery(".io_testimonials, #io_testimonials").each(function(){
5452           io_get_reviews(this);
5453        })
5454        setTimeout(function(){
5455            jQuery(".io_testimonials .w3-ul li p").each(function(){
5456                const container = jQuery(this).parent()
5457                const element = jQuery(this);
5458
5459                if (element[0].scrollHeight > container[0].clientHeight) {
5460
5461                    jQuery(this).parent().parent().append(create_read_more());
5462                }
5463            });
5464        }, 500);
5465
5466        function create_read_more(){
5467            let html = "<p class=\"io_review_readmore\" onClick=\"review_readmore_clicked(this)\">read more</p>"
5468            return html;
5469        }
5470
5471        function review_readmore_clicked(element){
5472            let review_li = jQuery(element).parent().find("li:eq(3)");
5473            new_height = jQuery(review_li).find("p").height() + 16;
5474            jQuery(review_li).height(new_height);
5475            jQuery(element).hide();
5476        }
5477
5478        function io_get_reviews(element){
5479        let io_un = "TopEventRentals";
5480	  let io_loc = "0";
5481	  let io_url1 = 'https://rental.software/testimonials_iframe.php?user=';
5482	  if (location.hostname === "localhost"){
5483	      io_url1 = 'http://localhost/io/bugs/testimonials_iframe.php?user=';
5484          //io_url1 = 'http://localhost/jbug/trunk/testimonials_iframe.php?user=';
5485        }
5486	  let io_url2 = '&location_id=';
5487	  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';
5488	  let io_url_c = io_url1 + io_un + io_url2 + io_loc + io_url3;
5489	  fetch(io_url_c, {
5490		method: 'get'
5491	}).then(
5492	  function(response){
5493		 return response.json();
5494		}
5495	).then(function(data) {
5496
5497
5498
5499	//let element = document.getElementById("io_testimonials");
5500	//DOM-built on purpose: literal markup in this inline script lands in the raw page
5501	//source and SEO crawlers read it as page content (IO-37932).
5502	element.textContent = "";
5503	let review_cnt=0;
5504	let rating_sum = 0;
5505	data.forEach((user) => {
5506				const { name, review, rating, time } = user;
5507				rating_sum += Number(rating);
5508				review_cnt++;
5509				let review_div = document.createElement("div");
5510				let review_list = document.createElement("ul");
5511				review_list.className = "w3-ul";
5512				let name_li = document.createElement("li");
5513				name_li.textContent = name;
5514				let rating_li = document.createElement("li");
5515				rating_li.textContent = rating + " ";
5516				let date_li = document.createElement("li");
5517				date_li.textContent = time;
5518				let review_li = document.createElement("li");
5519				let review_p = document.createElement("p");
5520				review_p.textContent = review;
5521				review_li.appendChild(review_p);
5522				let img_star = Math.round(parseFloat(rating));
5523				let star_img = document.createElement("img");
5524				star_img.className = "review_img";
5525				star_img.src = "https://rental.software/images/" + img_star + "star.png";
5526				rating_li.appendChild(star_img);
5527				review_list.appendChild(name_li);
5528				review_list.appendChild(rating_li);
5529				review_list.appendChild(date_li);
5530				review_list.appendChild(review_li);
5531				review_div.appendChild(review_list);
5532				element.appendChild(review_div);
5533	});
5534	let avg = (parseFloat(rating_sum)/parseFloat(review_cnt)).toFixed(1);
5535	let avg_img = Math.round(avg);
5536	let head = document.createElement("div");
5537	let head_h2 = document.createElement("h2");
5538	head_h2.textContent = "Avg Rating: " + avg;
5539	let head_img = document.createElement("img");
5540	head_img.className = "review_avg_img";
5541	head_img.src = "https://rental.software/images/" + avg_img + "star.png";
5542	head.appendChild(head_h2);
5543	head.appendChild(head_img);
5544	element.prepend(head);
5545	}).catch(function(err) {
5546		console.log(err);
5547	});
5548}</script>
5548 <div data-elementor-type="popup" data-elementor-id="6080" class="elementor elementor-6080 elementor-location-popup" data-elementor-settings="{&quot;entrance_animation&quot;:&quot;zoomIn&quot;,&quot;exit_animation&quot;:&quot;zoomIn&quot;,&quot;entrance_animation_duration&quot;:{&quot;unit&quot;:&quot;px&quot;,&quot;size&quot;:0.3,&quot;sizes&quot;:[]},&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-566e829 elementor-section-boxed elementor-section-height-default elementor-section-height-default" data-id="566e829" 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-100b0c7" data-id="100b0c7" data-element_type="column" data-e-type="column"><div class="elementor-widget-wrap elementor-element-populated"><div class="elementor-element elementor-element-6b367aa elementor-widget elementor-widget-heading" data-id="6b367aa" 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">Are you Residential or Commercial?</h2></div></div><div class="elementor-element elementor-element-657641d elementor-widget elementor-widget-heading" data-id="657641d" 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">Please select the option that best describes your rental type.</p></div></div><section class="elementor-section elementor-inner-section elementor-element elementor-element-d966f06 elementor-section-boxed elementor-section-height-default elementor-section-height-default" data-id="d966f06" data-element_type="section" data-e-type="section"><div class="elementor-container elementor-column-gap-extended"><div class="elementor-column elementor-col-50 elementor-inner-column elementor-element elementor-element-68fbb4b" data-id="68fbb4b" data-element_type="column" data-e-type="column"><div class="elementor-widget-wrap elementor-element-populated"><div class="elementor-element elementor-element-414fcec elementor-align-justify elementor-widget elementor-widget-button" data-id="414fcec" 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" href="https://topeventrental.com/rentals/"> <span class="elementor-button-content-wrapper"> <span class="elementor-button-text">Residential</span> </span> </a></div></div></div></div></div><div class="elementor-column elementor-col-50 elementor-inner-column elementor-element elementor-element-d619ff5" data-id="d619ff5" data-element_type="column" data-e-type="column"><div class="elementor-widget-wrap elementor-element-populated"><div class="elementor-element elementor-element-960ebe1 elementor-align-justify elementor-widget elementor-widget-button" data-id="960ebe1" 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" href="https://rental.software/quotes/quoteme.php?name=Top+Event+Rentals_1" target="_blank"> <span class="elementor-button-content-wrapper"> <span class="elementor-button-text">Commercial</span> </span> </a></div></div></div></div></div></div></section></div></div></div></section></div><style type="text/css">.searchio-live-search-results {
5549						opacity: 0;
5550						transition: opacity .25s ease-in-out;
5551						-moz-transition: opacity .25s ease-in-out;
5552						-webkit-transition: opacity .25s ease-in-out;
5553						height: 0;
5554						overflow: hidden;
5555						z-index: 9999995; /* Exceed searchIO Modal Search Form overlay. */
5556						position: absolute;
5557						display: none;
5558					}
5559
5560					.searchio-live-search-results-showing {
5561						display: block;
5562						opacity: 1;
5563						height: auto;
5564						overflow: auto;
5565					}
5566
5567					.searchio-live-search-no-results {
5568						padding: 3em 2em 0;
5569						text-align: center;
5570					}
5571
5572					.searchio-live-search-no-min-chars:after {
5573						content: "Continue typing";
5574						display: block;
5575						text-align: center;
5576						padding: 2em 2em 0;
5577					}</style> 
5577<script>var _searchIO_LIVE_AJAX_SEARCH_BLOCKS = true;
5578			var _searchIO_LIVE_AJAX_SEARCH_ENGINE = 'default';
5579			var _searchIO_LIVE_AJAX_SEARCH_CONFIG = 'default';</script>
5579 
5579<script>( () => {
5580					const lazyloadRunObserver = () => {
5581						const lazyloadBackgrounds = document.querySelectorAll( `.e-con.e-parent:not(.e-lazyloaded)` );
5582						const lazyloadBackgroundObserver = new IntersectionObserver( ( entries ) => {
5583							entries.forEach( ( entry ) => {
5584								if ( entry.isIntersecting ) {
5585									let lazyloadBackground = entry.target;
5586									if( lazyloadBackground ) {
5587										lazyloadBackground.classList.add( 'e-lazyloaded' );
5588									}
5589									lazyloadBackgroundObserver.unobserve( entry.target );
5590								}
5591							});
5592						}, { rootMargin: '200px 0px 200px 0px' } );
5593						lazyloadBackgrounds.forEach( ( lazyloadBackground ) => {
5594							lazyloadBackgroundObserver.observe( lazyloadBackground );
5595						} );
5596					};
5597					const events = [
5598						'DOMContentLoaded',
5599						'elementor/lazyload/observe',
5600					];
5601					events.forEach( ( event ) => {
5602						document.addEventListener( event, lazyloadRunObserver );
5603					} );
5604				} )();</script>
5604 
5604<script id="jquery-ui-core-js-before">jQuery.uiBackCompat = true;
5605//# sourceURL=jquery-ui-core-js-before</script>
5605 
5605<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});});
5606//# sourceURL=jquery-ui-datepicker-js-after</script>
5606 
5606<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>
5606 
5606<script id="angie-canvas-template-js-before">angieCanvasTemplateData = {"templateSlug":"angie-canvas"};
5607//# sourceURL=angie-canvas-template-js-before</script>
5607 
5607<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.4","is_static":false,"experimentalFeatures":{"additional_custom_breakpoints":true,"theme_builder_v2":true,"import-export-customization":true,"e_pro_atomic_form":true,"e_pro_collection_loop":true,"e_pro_variables":true,"e_pro_interactions":true},"urls":{"assets":"https:\/\/topeventrental.com\/wp-content\/plugins\/elementor\/assets\/","ajaxurl":"https:\/\/topeventrental.com\/wp-admin\/admin-ajax.php","uploadUrl":"https:\/\/topeventrental.com\/wp-content\/uploads"},"nonces":{"floatingButtonsClickTracking":"82eecb4df6","atomicFormsSendForm":"3f08e021e8"},"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":109,"title":"Top%20Event%20Rentals%20Phoenix%20AZ%20-%20Party%20Rental%20and%20Event%20Rental","excerpt":"","featuredImage":false}};
5608//# sourceURL=elementor-frontend-js-before</script>
5608 
5608<script id="swp-live-search-client-js-extra">var searchio_live_search_params = [];
5609searchio_live_search_params = {"ajaxurl":"https:\/\/topeventrental.com\/wp-admin\/admin-ajax.php","origin_id":109,"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"};;
5610//# sourceURL=swp-live-search-client-js-extra</script>
5610 
5610<script id="googlesitekit-events-provider-content-events-js-before">window._googlesitekit = window._googlesitekit || {};
5611window._googlesitekit.contentEvents = {"postID":109,"isReadableSinglePost":false,"hasVimeoEmbed":false,"wordCount":0,"estimatedReadTimeSeconds":0,"isLastPageOfMultiPagePost":false,"readTimeThresholdPercent":85,"minimumReadTimeSeconds":5};
5612//# sourceURL=googlesitekit-events-provider-content-events-js-before</script>
vendor: 131 bytes, line 5612
5612 <script id="elementor-recaptcha_v3-api-js" src="https://www.google.com/recaptcha/api.js?render=explicit&#038;ver=4.2.2"></script> 
5612<script id="wp-hooks-js" src="https://topeventrental.com/wp-includes/js/dist/hooks.min.js?ver=f0f188028580e8dc1255"></script>
5612 
5612<script id="wp-i18n-js" src="https://topeventrental.com/wp-includes/js/dist/i18n.min.js?ver=1dfe7db3940c23ea9216"></script>
5612 
5612<script id="wp-i18n-js-after">wp.i18n.setLocaleData( { 'text direction\u0004ltr': [ 'ltr' ] } );
5613//# sourceURL=wp-i18n-js-after</script>
5613 
5613<script id="elementor-pro-frontend-js-before">var ElementorProFrontendConfig = {"ajaxurl":"https:\/\/topeventrental.com\/wp-admin\/admin-ajax.php","nonce":"81add16754","urls":{"assets":"https:\/\/topeventrental.com\/wp-content\/plugins\/elementor-pro\/assets\/","rest":"https:\/\/topeventrental.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:\/\/topeventrental.com\/wp-content\/plugins\/elementor-pro\/modules\/lottie\/assets\/animations\/default.json"}};
5614//# sourceURL=elementor-pro-frontend-js-before</script>
5614 
5614<script defer src="https://topeventrental.com/wp-content/cache/autoptimize/js/autoptimize_2aafd6380734f541ac99807aad291bc1.js"></script>
5614</body></html>
5615<!-- Cached by WP-Optimize (gzip) - https://teamupdraft.com/wp-optimize/ - Last modified: October 6, 2026 1:10 pm (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.