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 » Feed" href="https://topeventrental.com/feed/" /><link rel="alternate" type="application/rss+xml" title="Top Event Rentals Phoenix AZ » 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&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="{"background_background":"classic"}"><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="{"background_background":"classic"}"><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="{"background_background":"classic"}"><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="{"background_background":"slideshow","background_slideshow_gallery":[{"id":6055,"url":"https:\/\/topeventrental.com\/wp-content\/uploads\/2025\/06\/Scottsdale-Culinary-Festival.jpg"},{"id":6059,"url":"https:\/\/topeventrental.com\/wp-content\/uploads\/2025\/06\/Festival-of-the-Arts.jpg"},{"id":5760,"url":"https:\/\/topeventrental.com\/wp-content\/uploads\/2025\/06\/ASU-Homecoming-Aerial.png"},{"id":5733,"url":"https:\/\/topeventrental.com\/wp-content\/uploads\/2025\/06\/Mavericks-Obstacle-Course.jpg"},{"id":5764,"url":"https:\/\/topeventrental.com\/wp-content\/uploads\/2025\/06\/Baby-Shower.jpg"}],"background_slideshow_slide_duration":2000,"background_slideshow_loop":"yes","background_slideshow_slide_transition":"fade","background_slideshow_transition_duration":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 & 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="{"navigation":"both","autoplay":"yes","pause_on_hover":"yes","pause_on_interaction":"yes","autoplay_speed":5000,"infinite":"yes","transition":"slide","transition_speed":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="{"background_background":"classic","shape_divider_top":"curve","shape_divider_bottom":"curve"}"><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="{"background_background":"classic","animation":"fadeInUp","animation_delay":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 & 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="{"background_background":"classic","animation":"fadeInUp","animation_delay":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 & 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="{"background_background":"classic","animation":"fadeInUp"}"><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 & 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="{"slides_to_show":"5","slides_to_scroll":"5","image_spacing_custom":{"unit":"px","size":39,"sizes":[]},"autoplay_speed":50500,"speed":600,"navigation":"both","autoplay":"yes","pause_on_interaction":"yes","infinite":"yes","image_spacing_custom_tablet":{"unit":"px","size":"","sizes":[]},"image_spacing_custom_mobile":{"unit":"px","size":"","sizes":[]}}" 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="{"background_background":"classic","shape_divider_top":"curve"}"><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="{"skin":"slideshow","slideshow_slides_per_view_mobile":"2","effect":"slide","show_arrows":"yes","speed":500,"autoplay":"yes","autoplay_speed":5000,"loop":"yes","pause_on_hover":"yes","pause_on_interaction":"yes","space_between":{"unit":"px","size":10,"sizes":[]},"space_between_tablet":{"unit":"px","size":10,"sizes":[]},"space_between_mobile":{"unit":"px","size":10,"sizes":[]}}" 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('https://topeventrental.com/wp-content/uploads/2026/02/Chair-Rentals-Phoenix-Arizona-Scottsdale.jpg')"></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('https://topeventrental.com/wp-content/uploads/2026/02/Biltmore-Table-and-Chair-Rentals-Phoenix-and-Scottsdale.jpg')"></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('https://topeventrental.com/wp-content/uploads/2026/02/Festival-Tent-rentals-phoenix-arizona.jpg')"></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('https://topeventrental.com/wp-content/uploads/2026/01/Resin-Chair-Rental-Tempe.png')"></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('https://topeventrental.com/wp-content/uploads/2026/04/IMG_0383-scaled.jpeg')"></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('https://topeventrental.com/wp-content/uploads/2026/02/Goodyear-Holiday-Beer-Garden-event-rentals.png')"></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('https://topeventrental.com/wp-content/uploads/2026/02/32-x-32-Dance-Floor-Rental-Phoenix.png')"></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('https://topeventrental.com/wp-content/uploads/2026/02/ASU-Inflatables-bounce-house-rentals-tempe-arizona-scaled.jpg')"></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('https://topeventrental.com/wp-content/uploads/2026/03/Tent-Rentals-Sacaton-Arizona-scaled.jpeg')"></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('https://topeventrental.com/wp-content/uploads/2026/02/Goodyear-Obstacle-Course-bounce-house-rentals-arizona-scaled.jpg')"></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('https://topeventrental.com/wp-content/uploads/2026/02/phoenix-festival-
167of-the-arts-tent-rentals-phoenix.webp')"></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('https://topeventrental.com/wp-content/uploads/2026/02/Festival-Tent-Rentals-Phoenix.webp')"></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('https://topeventrental.com/wp-content/uploads/2026/02/Firefighter-Christmas-Party-rentals-arizona-.png')"></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('https://topeventrental.com/wp-content/uploads/2026/02/Goodyear-Lakeside-Music-Festival-event-rentals.png')"></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('https://topeventrental.com/wp-content/uploads/2026/02/Bellair-Golf-Park-Water-Slide-rentals-event-rentals-arizona.jpg')"></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('https://topeventrental.com/wp-content/uploads/2026/02/Scottsdale-Speech-chair-rentals-phoenix-Arizona.png')"></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('https://topeventrental.com/wp-content/uploads/2026/02/ASU-Homecoming-Aerial-event-rentals-tempe-Arizona.png')"></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('https://topeventrental.com/wp-content/uploads/2026/02/Goodyear-Bounce-House-Rentals-and-Event-Rentals-scaled.jpg')"></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('https://topeventrental.com/wp-content/uploads/2026/02/Scottsdale-Tent-Rentals.jpg')"></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('https://topeventrental.com/wp-content/uploads/2026/02/Mavericks-Obstacle-Course-for-rent.jpg')"></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('https://topeventrental.com/wp-content/uploads/2026/01/2025-12-26.webp')"></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('https://topeventrental.com/wp-content/uploads/2026/03/Tent-Rentals-Arizona-FOODIELAND-scaled.jpeg')"></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('https://topeventrental.com/wp-content/uploads/2026/02/Karime-Marquee-Letter-rentals-phoenix-arizona.jpg')"></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('https://topeventrental.com/wp-content/uploads/2026/02/Goodyear-Sign-Tent-Rentals-scaled.jpg')"></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('https://topeventrental.com/wp-content/uploads/2026/02/Political-Rally-Chair-Rentals-Scottsdale.png')"></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('https://topeventrental.com/wp-content/uploads/2026/02/Satyr-Entertainment-x-Top-Event-Rentals-Tent-rentals-near-me.webp')"></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('https://topeventrental.com/wp-content/uploads/2026/01/2025-12-30.webp')"></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('https://topeventrental.com/wp-content/uploads/2026/01/2025-09-25.webp')"></div> </a></div><div class="swiper-slide" role="group" aria-roledescription="slide"> <a href="https://secure.acsevents.org/site/STR?pg=entry&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('https://topeventrental.com/wp-content/uploads/2026/01/2025-06-25.webp')"></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('https://topeventrental.com/wp-content/uploads/2026/02/Black-Resin-Chair-Conference.png')"></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('https://topeventrental.com/wp-content/uploads/2026/07/Crybaby-watch-party-tent-rental-phoenix-arizona.jpg')"></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('
167https://topeventrental.com/wp-content/uploads/2026/05/DJI_20260403192633_0628_D-scaled-e1781643694116.jpeg')"></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('https://topeventrental.com/wp-content/uploads/2026/04/IMG_1854-scaled.jpeg')"></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('https://topeventrental.com/wp-content/uploads/2026/05/IMG_0123.jpeg')"></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('https://topeventrental.com/wp-content/uploads/2026/05/IMG_3034-scaled.jpeg')"></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('https://topeventrental.com/wp-content/uploads/2026/05/Table-and-chair-rentals-near-me-scaled.jpg')"></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('https://topeventrental.com/wp-content/uploads/2026/08/Phoenix-Event-Rentals.jpg')"></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('https://topeventrental.com/wp-content/uploads/2026/08/Goodyear-event-rentals.jpg')"></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('https://topeventrental.com/wp-content/uploads/2026/02/Chair-Rentals-Phoenix-Arizona-Scottsdale.jpg')"></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('https://topeventrental.com/wp-content/uploads/2026/02/Biltmore-Table-and-Chair-Rentals-Phoenix-and-Scottsdale.jpg')"></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('https://topeventrental.com/wp-content/uploads/2026/02/Festival-Tent-rentals-phoenix-arizona.jpg')"></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('https://topeventrental.com/wp-content/uploads/2026/01/Resin-Chair-Rental-Tempe.png')"></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('https://topeventrental.com/wp-content/uploads/2026/04/IMG_0383-scaled.jpeg')"></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('https://topeventrental.com/wp-content/uploads/2026/02/Goodyear-Holiday-Beer-Garden-event-rentals.png')"></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('https://topeventrental.com/wp-content/uploads/2026/02/32-x-32-Dance-Floor-Rental-Phoenix.png')"></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('https://topeventrental.com/wp-content/uploads/2026/02/ASU-Inflatables-bounce-house-rentals-tempe-arizona-scaled.jpg')"></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('https://topeventrental.com/wp-content/uploads/2026/03/Tent-Rentals-Sacaton-Arizona-scaled.jpeg')"></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('https://topeventrental.com/wp-content/uploads/2026/02/Goodyear-Obstacle-Course-bounce-house-rentals-arizona-scaled.jpg')"></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('https://topeventrental.com/wp-content/uploads/2026/02/phoenix-festival-of-the-arts-tent-rentals-phoenix.webp')"></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('https://topeventrental.com/wp-content/uploads/2026/02/Festival-Tent-Rentals-Phoenix.webp')"></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('https://topeventrental.com/wp-content/uploads/2026/02/Firefighter-Christmas-Party-rentals-arizona-.png')"></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('https://topeventrental.com/wp-content/uploads/2026/02/Goodyear-Lakeside-Music-Festival-event-rentals.png')"></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('https://topeventrental.com/wp-content/uploads/2026/02/Bellair-Golf-Park-Water-Slide-rentals-event-rentals-arizona.jpg')"></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('https://topeventrental.com/wp-content/uploads/2026/02/Scottsdale-Speech-chair-rentals-phoenix-Arizona.png')"></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('https://topeventrental.com/wp-content/uploads/2026/02/ASU-Homecoming-Aerial-event-rentals-tempe-Arizona.png')"></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('https://topeventrental.com/wp-content/uploads/2026/02/Goodyear-Bounce-House-Rentals-and-Event-Rentals-scaled.jpg')"></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('https://topeventrental.com/wp-content/uploads/2026/02/Scottsdale-Tent-Rentals.jpg')"></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('https://topeventrental.com/wp-content/uploads/2026/02/Mavericks-Obstacle-Course-for-rent.jpg')"></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('https://topeventrental.com/wp-content/uploads/2026/01/2025-12-26.webp')"></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('https://topeventrental.com/wp-content/uploads/2026/03/Tent-Rentals-Arizona-FOODIELAND-scaled.jpeg')"></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('https://topeventrental.com/wp-content/uploads/2026/02/Karime-Marquee-Letter-rentals-phoenix-arizona.jpg')"></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('https://topeventrental.com/wp-content/uploads/2026/02/Goodyear-Sign-Tent-Rentals-scaled.jpg')"></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('https://topeventrental.com/wp-content/uploads/2026/02/Political-Rally-Chair-Rentals-Scottsdale.png')"></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('https://topeventrental.com/wp-content/uploads/2026/02/Satyr-Entertainment-x-Top-Event-Rentals-Tent-rentals-near-me.webp')"></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('https://topeventrental.com/wp-content/uploads/2026/01/2025-12-30.webp')"></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('https://topeventrental.com/wp-content/uploads/2026/01/2025-09-25.webp')"></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('https://topeventrental.com/wp-content/uploads/2026/01/2025-06-25.webp')"></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('https://topeventrental.com/wp-content/uploads/2026/02/Black-Resin-Chair-Conference.png')"></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('https://topeventrental.com/wp-content/uploads/2026/07/Crybaby-watch-party-tent-rental-phoenix-arizona.jpg')"></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('https://topeventrental.com/wp-content/uploads/2026/05/DJI_20260403192633_0628_D-scaled-e1781643694116.jpeg')"></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('https://topeventrental.com/wp-content/uploads/2026/04/IMG_1854-scaled.jpeg')"></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('https://topeventrental.com/wp-content/uploads/2026/05/IMG_0123.jpeg')"></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('https://topeventrental.com/wp-content/uploads/2026/05/IMG_3034-scaled.jpeg')"></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('https://topeventrental.com/wp-content/uploads/2026/05/Table-and-chair-rentals-near-me-scaled.jpg')"></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('https://topeventrental.com/wp-content/uploads/2026/08/Phoenix-Event-Rentals.jpg')"></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('https://topeventrental.com/wp-content/uploads/2026/08/Goodyear-event-rentals.jpg')"></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="{"background_background":"classic"}"><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'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="{"background_background":"classic","shape_divider_top":"curve"}"><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&source=web&rct=j&opi=89978449&url=https://www.linkedin.com/company/top-event-rentals&ved=2ahUKEwj505CIwYmUAxV4le4BHZ_bJ-cQ9zB6BAg2EAc&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&_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="{"step_next_label":"Next","step_previous_label":"Previous","button_width":"100","step_type":"number_text","step_icon_shape":"circle"}" 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()#&+*-=.]+" 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=""I need help from a human sales rep.""></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="{"background_background":"classic"}"><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="{"entrance_animation":"zoomIn","exit_animation":"zoomIn","entrance_animation_duration":{"unit":"px","size":0.3,"sizes":[]},"a11y_navigation":"yes","timing":[]}" 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&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.