1<!doctype html><html lang="en-US" prefix="og: https://ogp.me/ns#"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1"><link rel="profile" href="http://gmpg.org/xfn/11"><link media="all" href="https://www.aspartyrental.com/wp-content/cache/autoptimize/1/css/autoptimize_514fa4878cd558bd1f72e4d1e999296c.css" rel="stylesheet"><title>Top 100 Exclusive Trackless Train W/ Roofed Carts - A & S Party Rental And More</title><meta name="description" content="Carnival Rides Rentals Oh, Ky, Indiana - Trackless Train w/ Roofed Carts - Tent Rentals Ohio Cincinnati and Dayton - Party Rentals - Bounce House Rentals -"/><meta name="robots" content="follow, index, max-snippet:-1, max-video-preview:-1, max-image-preview:large"/><link rel="canonical" href="https://www.aspartyrental.com/rentals/carnival-ride-rentals/trackless-train-w-roofed-carts/" /><meta property="og:locale" content="en_US" /><meta property="og:type" content="article" /><meta property="og:title" content="Top 100 Exclusive Trackless Train W/ Roofed Carts - A & S Party Rental And More" /><meta property="og:description" content="Carnival Rides Rentals Oh, Ky, Indiana - Trackless Train w/ Roofed Carts - Tent Rentals Ohio Cincinnati and Dayton - Party Rentals - Bounce House Rentals -" /><meta property="og:url" content="https://www.aspartyrental.com/rentals/carnival-ride-rentals/trackless-train-w-roofed-carts/" /><meta property="og:site_name" content="A&S Party Rental - Dayton Cincinnati Party Rentals" /><meta property="article:author" content="https://www.facebook.com/aspartyrentalohio" /><meta property="og:updated_time" content="2026-08-18T17:44:13+00:00" /><meta property="og:image" content="https://www.aspartyrental.com/wp-content/uploads/2023/09/Trackless20Train20NEW_832321_big.jpg" /><meta property="og:image:secure_url" content="https://www.aspartyrental.com/wp-content/uploads/2023/09/Trackless20Train20NEW_832321_big.jpg" /><meta property="og:image:width" content="562" /><meta property="og:image:height" content="750" /><meta property="og:image:alt" content="trackless20train20new_832321_big" /><meta property="og:image:type" content="image/jpeg" /><meta name="twitter:card" content="summary_large_image" /><meta name="twitter:title" content="Top 100 Exclusive Trackless Train W/ Roofed Carts - A & S Party Rental And More" /><meta name="twitter:description" content="Carnival Rides Rentals Oh, Ky, Indiana - Trackless Train w/ Roofed Carts - Tent Rentals Ohio Cincinnati and Dayton - Party Rentals - Bounce House Rentals -" /><meta name="twitter:site" content="@asplayzone" /><meta name="twitter:creator" content="@asplayzone" /><meta name="twitter:image" content="https://www.aspartyrental.com/wp-content/uploads/2023/09/Trackless20Train20NEW_832321_big.jpg" /><meta name="twitter:label1" content="Time to read" /><meta name="twitter:data1" content="3 minutes" />
1<script type="application/ld+json" class="rank-math-schema-pro">{"@context":"https://schema.org","@graph":[{"@type":"BreadcrumbList","@id":"https://www.aspartyrental.com/rentals/carnival-ride-rentals/trackless-train-w-roofed-carts/#breadcrumb","itemListElement":[{"@type":"ListItem","position":"1","item":{"@id":"https://www.aspartyrental.com","name":"Home"}},{"@type":"ListItem","position":"2","item":{"@id":"https://www.aspartyrental.com/rentals/","name":"Inventory"}},{"@type":"ListItem","position":"3","item":{"@id":"https://www.aspartyrental.com/rentals/carnival-ride-rentals/","name":"Carnival Rides Rentals Oh, Ky, Indiana"}},{"@type":"ListItem","position":"4","item":{"@id":"https://www.aspartyrental.com/rentals/carnival-ride-rentals/trackless-train-w-roofed-carts/","name":"Trackless Train w/ Roofed Carts"}}]}]}</script>
1 <link rel='dns-prefetch' href='//cdnjs.cloudflare.com' /><link rel="alternate" type="application/rss+xml" title="A & S Party Rental » Feed" href="https://www.aspartyrental.com/feed/" /><link rel="alternate" type="application/rss+xml" title="A & S Party Rental » Comments Feed" href="https://www.aspartyrental.com/comments/feed/" /><link rel="alternate" title="oEmbed (JSON)" type="application/json+oembed" href="https://www.aspartyrental.com/wp-json/oembed/1.0/embed?url=https%3A%2F%2Fwww.aspartyrental.com%2Frentals%2Fcarnival-ride-rentals%2Ftrackless-train-w-roofed-carts%2F" /><link rel="alternate" title="oEmbed (XML)" type="text/xml+oembed" href="https://www.aspartyrental.com/wp-json/oembed/1.0/embed?url=https%3A%2F%2Fwww.aspartyrental.com%2Frentals%2Fcarnival-ride-rentals%2Ftrackless-train-w-roofed-carts%2F&format=xml" /><style id="wp-img-auto-sizes-contain-inline-css">img:is([sizes=auto i],[sizes^="auto," i]){contain-intrinsic-size:3000px 1500px} 2/*# sourceURL=wp-img-auto-sizes-contain-inline-css */</style><style id="classic-theme-styles-inline-css">/*! This file is auto-generated */ 3.wp-block-button__link{color:#fff;background-color:#32373c;border-radius:9999px;box-shadow:none;text-decoration:none;padding:calc(.667em + 2px) calc(1.333em + 2px);font-size:1.125em}.wp-block-file__button{background:#32373c;color:#fff;text-decoration:none} 4/*# sourceURL=/wp-includes/css/classic-themes.min.css */</style><style id="global-styles-inline-css">:root{--wp--preset--aspect-ratio--square: 1;--wp--preset--aspect-ratio--4-3: 4/3;--wp--preset--aspect-ratio--3-4: 3/4;--wp--preset--aspect-ratio--3-2: 3/2;--wp--preset--aspect-ratio--2-3: 2/3;--wp--preset--aspect-ratio--16-9: 16/9;--wp--preset--aspect-ratio--9-16: 9/16;--wp--preset--color--black: #000000;--wp--preset--color--cyan-bluish-gray: #abb8c3;--wp--preset--color--white: #ffffff;--wp--preset--color--pale-pink: #f78da7;--wp--preset--color--vivid-red: #cf2e2e;--wp--preset--color--luminous-vivid-orange: #ff6900;--wp--preset--color--luminous-vivid-amber: #fcb900;--wp--preset--color--light-green-cyan: #7bdcb5;--wp--preset--color--vivid-green-cyan: #00d084;--wp--preset--color--pale-cyan-blue: #8ed1fc;--wp--preset--color--vivid-cyan-blue: #0693e3;--wp--preset--color--vivid-purple: #9b51e0;--wp--preset--gradient--vivid-cyan-blue-to-vivid-purple: linear-gradient(135deg,rgb(6,147,227) 0%,rgb(155,81,224) 100%);--wp--preset--gradient--light-green-cyan-to-vivid-green-cyan: linear-gradient(135deg,rgb(122,220,180) 0%,rgb(0,208,130) 100%);--wp--preset--gradient--luminous-vivid-amber-to-luminous-vivid-orange: linear-gradient(135deg,rgb(252,185,0) 0%,rgb(255,105,0) 100%);--wp--preset--gradient--luminous-vivid-orange-to-vivid-red: linear-gradient(135deg,rgb(255,105,0) 0%,rgb(207,46,46) 100%);--wp--preset--gradient--very-light-gray-to-cyan-bluish-gray: linear-gradient(135deg,rgb(238,238,238) 0%,rgb(169,184,195) 100%);
4--wp--preset--gradient--cool-to-warm-spectrum: linear-gradient(135deg,rgb(74,234,220) 0%,rgb(151,120,209) 20%,rgb(207,42,186) 40%,rgb(238,44,130) 60%,rgb(251,105,98) 80%,rgb(254,248,76) 100%);--wp--preset--gradient--blush-light-purple: linear-gradient(135deg,rgb(255,206,236) 0%,rgb(152,150,240) 100%);--wp--preset--gradient--blush-bordeaux: linear-gradient(135deg,rgb(254,205,165) 0%,rgb(254,45,45) 50%,rgb(107,0,62) 100%);--wp--preset--gradient--luminous-dusk: linear-gradient(135deg,rgb(255,203,112) 0%,rgb(199,81,192) 50%,rgb(65,88,208) 100%);--wp--preset--gradient--pale-ocean: linear-gradient(135deg,rgb(255,245,203) 0%,rgb(182,227,212) 50%,rgb(51,167,181) 100%);--wp--preset--gradient--electric-grass: linear-gradient(135deg,rgb(202,248,128) 0%,rgb(113,206,126) 100%);--wp--preset--gradient--midnight: linear-gradient(135deg,rgb(2,3,129) 0%,rgb(40,116,252) 100%);--wp--preset--font-size--small: 13px;--wp--preset--font-size--medium: 20px;--wp--preset--font-size--large: 36px;--wp--preset--font-size--x-large: 42px;--wp--preset--spacing--20: 0.44rem;--wp--preset--spacing--30: 0.67rem;--wp--preset--spacing--40: 1rem;--wp--preset--spacing--50: 1.5rem;--wp--preset--spacing--60: 2.25rem;--wp--preset--spacing--70: 3.38rem;--wp--preset--spacing--80: 5.06rem;--wp--preset--shadow--natural: 6px 6px 9px rgba(0, 0, 0, 0.2);--wp--preset--shadow--deep: 12px 12px 50px rgba(0, 0, 0, 0.4);--wp--preset--shadow--sharp: 6px 6px 0px rgba(0, 0, 0, 0.2);--wp--preset--shadow--outlined: 6px 6px 0px -3px rgb(255, 255, 255), 6px 6px rgb(0, 0, 0);--wp--preset--shadow--crisp: 6px 6px 0px rgb(0, 0, 0);}.wp-block-button{--wp--preset--dimension--25: 25%;--wp--preset--dimension--50: 50%;--wp--preset--dimension--75: 75%;--wp--preset--dimension--100: 100%;}:where(body) { margin: 0; }:where(.is-layout-flex){gap: 0.5em;}:where(.is-layout-grid){gap: 0.5em;}body .is-layout-flex{display: flex;}.is-layout-flex{flex-wrap: wrap;align-items: center;}.is-layout-flex > :is(*, div){margin: 0;}body .is-layout-grid{display: grid;}.is-layout-grid > :is(*, div){margin: 0;}body{padding-top: 0px;padding-right: 0px;padding-bottom: 0px;padding-left: 0px;}:root :where(.wp-element-button, .wp-block-button__link){background-color: #32373c;border-width: 0;color: #fff;font-family: inherit;font-size: inherit;font-style: inherit;font-weight: inherit;letter-spacing: inherit;line-height: inherit;padding-top: calc(0.667em + 2px);padding-right: calc(1.333em + 2px);padding-bottom: calc(0.667em + 2px);padding-left: calc(1.333em + 2px);text-decoration: none;text-transform: inherit;}.has-black-color{color: var(--wp--preset--color--black) !important;}.has-cyan-bluish-gray-color{color: var(--wp--preset--color--cyan-bluish-gray) !important;}.has-white-color{color: var(--wp--preset--color--white) !important;}.has-pale-pink-color{color: var(--wp--preset--color--pale-pink) !important;}.has-vivid-red-color{color: var(--wp--preset--color--vivid-red) !important;}.has-luminous-vivid-orange-color{color: var(--wp--preset--color--luminous-vivid-orange) !important;}.has-luminous-vivid-amber-color{color: var(--wp--preset--color--luminous-vivid-amber) !important;}.has-light-green-cyan-color{color: var(--wp--preset--color--light-green-cyan) !important;}.has-vivid-green-cyan-color{color: var(--wp--preset--color--vivid-green-cyan) !important;}.has-pale-cyan-blue-color{color: var(--wp--preset--color--pale-cyan-blue) !important;}.has-vivid-cyan-blue-color{color: var(--wp--preset--color--vivid-cyan-blue) !important;}.has-vivid-purple-color{color: var(--wp--preset--color--vivid-purple) !important;}.has-black-background-color{background-color: var(--wp--preset--color--black) !important;}.has-cyan-bluish-gray-background-color{background-color: var(--wp--preset--color--cyan-bluish-gray) !important;}.has-white-background-color{background-color: var(--wp--preset--color--white) !important;}.has-pale-pink-background-color{background-color: var(--wp--preset--color--pale-pink) !important;}.has-vivid-red-background-color{background-color: var(--wp--preset--color--vivid-red) !important;}.has-luminous-vivid-orange-background-color{background-color: var(--wp--preset--color--luminous-vivid-orange) !important;}.has-luminous-vivid-amber-background-color{background-color: var(--wp--preset--color--luminous-vivid-amber) !important;}.has-light-green-cyan-background-color{background-color: var(--wp--preset--color--light-green-cyan) !important;}.has-vivid-green-cyan-background-color{background-color: var(--wp--preset--color--vivid-green-cyan) !important;}.has-pale-cyan-blue-background-color{background-color: var(--wp--preset--color--pale-cyan-blue) !important;}.has-vivid-cyan-blue-background-color{background-color: var(--wp--preset--color--vivid-cyan-blue) !important;}.has-vivid-purple-background-color{background-color: var(--wp--preset--color--vivid-purple) !important;}.has-black-border-color{border-color: var(--wp--preset--color--black) !important;}.has-cyan-bluish-gray-border-color{border-color: var(--wp--preset--color--cyan-bluish-gray) !important;}.has-white-border-color{border-color: var(--wp--preset--color--white) !important;}.has-pale-pink-border-color{border-color: var(--wp--preset--color--pale-pink) !important;}.has-vivid-red-border-color{border-color: var(--wp--preset--color--vivid-red) !important;}.has-luminous-vivid-orange-border-color{border-color: var(--wp--preset--color--luminous-vivid-orange) !important;}.has-luminous-vivid-amber-border-color{border-color: var(--wp--preset--color--luminous-vivid-amber) !important;}.has-light-green-cyan-border-color{border-color: var(--wp--preset--color--light-green-cyan) !important;}.has-vivid-green-cyan-border-color{border-color: var(--wp--preset--color--vivid-green-cyan) !important;}.has-pale-cyan-blue-border-color{border-color: var(--wp--preset--color--pale-cyan-blue) !important;}.has-vivid-cyan-blue-border-color{border-color: var(--wp--preset--color--vivid-cyan-blue) !important;}.has-vivid-purple-border-color{border-color: var(--wp--preset--color--vivid-purple) !important;}.has-vivid-cyan-blue-to-vivid-purple-gradient-background{background: var(--wp--preset--gradient--vivid-cyan-blue-to-vivid-purple) !important;}.has-light-green-cyan-to-vivid-green-cyan-gradient-background{background: var(--wp--preset--gradient--light-green-cyan-to-vivid-green-cyan) !important;}.has-luminous-vivid-amber-to-luminous-vivid-orange-gradient-background{background: var(--wp--preset--gradient--luminous-vivid-amber-to-luminous-vivid-orange) !important;}.has-luminous-vivid-orange-to-vivid-red-gradient-background{background: var(--wp--preset--gradient--luminous-vivid-orange-to-vivid-red) !important;}
4.has-very-light-gray-to-cyan-bluish-gray-gradient-background{background: var(--wp--preset--gradient--very-light-gray-to-cyan-bluish-gray) !important;}.has-cool-to-warm-spectrum-gradient-background{background: var(--wp--preset--gradient--cool-to-warm-spectrum) !important;}.has-blush-light-purple-gradient-background{background: var(--wp--preset--gradient--blush-light-purple) !important;}.has-blush-bordeaux-gradient-background{background: var(--wp--preset--gradient--blush-bordeaux) !important;}.has-luminous-dusk-gradient-background{background: var(--wp--preset--gradient--luminous-dusk) !important;}.has-pale-ocean-gradient-background{background: var(--wp--preset--gradient--pale-ocean) !important;}.has-electric-grass-gradient-background{background: var(--wp--preset--gradient--electric-grass) !important;}.has-midnight-gradient-background{background: var(--wp--preset--gradient--midnight) !important;}.has-small-font-size{font-size: var(--wp--preset--font-size--small) !important;}.has-medium-font-size{font-size: var(--wp--preset--font-size--medium) !important;}.has-large-font-size{font-size: var(--wp--preset--font-size--large) !important;}.has-x-large-font-size{font-size: var(--wp--preset--font-size--x-large) !important;} 5:root :where(.wp-block-icon svg){width: 24px;} 6:where(.wp-block-gallery.is-layout-flex){gap: var( --wp--style--gallery-gap-default, var( --gallery-block--gutter-size, var( --wp--style--block-gap, 0.5em ) ) );}:where(.wp-block-gallery.is-layout-grid){gap: var( --wp--style--gallery-gap-default, var( --gallery-block--gutter-size, var( --wp--style--block-gap, 0.5em ) ) );} 7:where(.wp-block-latest-posts.is-layout-flex){gap: 1.25em;}:where(.wp-block-latest-posts.is-layout-grid){gap: 1.25em;} 8:where(.wp-block-post-template.is-layout-flex){gap: 1.25em;}:where(.wp-block-post-template.is-layout-grid){gap: 1.25em;} 9:where(.wp-block-term-template.is-layout-flex){gap: 1.25em;}:where(.wp-block-term-template.is-layout-grid){gap: 1.25em;} 10:where(.wp-block-columns.is-layout-flex){gap: 2em;}:where(.wp-block-columns.is-layout-grid){gap: 2em;} 11:root :where(.wp-block-pullquote){font-size: 1.5em;line-height: 1.6;} 12/*# sourceURL=global-styles-inline-css */</style><link rel='stylesheet' id='slick-carousel-css-css' href='https://cdnjs.cloudflare.com/ajax/libs/slick-carousel/1.8.1/slick.min.css?ver=7.1.2' media='all' /><link rel='stylesheet' id='slick-carousel-theme-css-css' href='https://cdnjs.cloudflare.com/ajax/libs/slick-carousel/1.8.1/slick-theme.min.css?ver=7.1.2' media='all' /><link crossorigin="anonymous" integrity="sha512-QeR2VH+lsBE5LSAe1Q5EnTBbe7XTBubt8dG93Y7gidSgdMCr8nVqKcfKAMyN96SV8KDbZVTDXChatu5G2KQGzg==" rel='stylesheet' id='bfa-font-awesome-css' href='https://cdnjs.cloudflare.com/ajax/libs/font-awesome/7.3.1/css/all.min.css?ver=3.1.0' media='all' /><link crossorigin="anonymous" integrity="sha512-fM3aspSlL5o6SevLwPnXicgQcKy/KXGBuCcNPdqFkgEBhXVCiPiYLw8cA7TWoshlHHd3pY6TO8G2vniqcdzaSg==" rel='stylesheet' id='bfa-font-awesome-v5-compat-css' href='https://cdnjs.cloudflare.com/ajax/libs/font-awesome/7.3.1/css/v5-font-face.min.css?ver=3.1.0' media='all' />
12<script id="jquery-core-js" src="https://www.aspartyrental.com/wp-includes/js/jquery/jquery.min.js?ver=3.7.1"></script>
12
12<script id="io-scripts-js-extra">var io_scripts_vars = {"io_username":"reservations@asplayzone","io_locationid":"3460","io_phonenumber":"(937) 885-5454","io_emailaddress":"[email protected]","io_businesshours":"","io_facebooklink":"https://www.facebook.com/","io_twitterlink":"https://twitter.com/","io_instagramlink":"https://www.instagram.com/","io_youtubelink":"","io_fpnumber":"","io_companyname":"A & S Party Rental"}; 13//# sourceURL=io-scripts-js-extra</script>
13 <link rel="https://api.w.org/" href="https://www.aspartyrental.com/wp-json/" /><link rel="alternate" title="JSON" type="application/json" href="https://www.aspartyrental.com/wp-json/wp/v2/pages/4588" /><link rel="EditURI" type="application/rsd+xml" title="RSD" href="https://www.aspartyrental.com/xmlrpc.php?rsd" /><meta name="generator" content="WordPress 7.1.2" /><link rel='shortlink' href='https://www.aspartyrental.com/?p=4588' /><meta name="generator" content="Elementor 4.3.2; features: additional_custom_breakpoints; settings: css_print_method-external, google_font-enabled, font_display-auto"><style>.e-con.e-parent:nth-of-type(n+4):not(.e-lazyloaded):not(.e-no-lazyload), 14 .e-con.e-parent:nth-of-type(n+4):not(.e-lazyloaded):not(.e-no-lazyload) * { 15 background-image: none !important; 16 } 17 @media screen and (max-height: 1024px) { 18 .e-con.e-parent:nth-of-type(n+3):not(.e-lazyloaded):not(.e-no-lazyload), 19 .e-con.e-parent:nth-of-type(n+3):not(.e-lazyloaded):not(.e-no-lazyload) * { 20 background-image: none !important; 21 } 22 } 23 @media screen and (max-height: 640px) { 24 .e-con.e-parent:nth-of-type(n+2):not(.e-lazyloaded):not(.e-no-lazyload), 25 .e-con.e-parent:nth-of-type(n+2):not(.e-lazyloaded):not(.e-no-lazyload) * { 26 background-image: none !important; 27 } 28 }</style><style class="wpcode-css-snippet">/* Enhanced CSS - Improved title area and padding */ 29 30/* EXCLUDE header and footer elements */ 31body.single-post header, 32body.single-post footer, 33body.single-post .site-header, 34body.single-post .site-footer, 35body.single-post nav, 36body.single-post .navigation, 37body.single-post .main-navigation, 38body.single-post .site-navigation, 39body.single-post .menu, 40body.single-post .menu-item, 41body.single-post .widget-area, 42body.single-post .sidebar, 43body.single-post aside, 44body.single-post .comments-area, 45body.single-post #comments, 46body.single-post .site-info, 47body.single-post .footer-widgets, 48body.single-post .nav-links, 49body.single-post .post-navigation { 50 /* Reset any styles we might have applied */ 51 all: revert !important; 52 font-family: inherit !important; 53 font-size: inherit !important; 54 line-height: inherit !important; 55 color: inherit !important; 56 margin: initial !important; 57 padding: initial !important; 58 max-width: none !important; 59 width: auto !important; 60} 61 62/* Add spacing to main content area */ 63body.single-post #main, 64body.single-post main, 65body.single-post .content-area, 66body.single-post .site-main, 67body.single-post .site-content { 68 padding-top: 50px !important; 69 padding-bottom: 50px !important; 70} 71 72/* Improve title area and breadcrumbs */ 73body.single-post .entry-header, 74body.single-post .page-header, 75body.single-post .entry-title-container, 76body.single-post .post-header, 77body.single-post .breadcrumbs { 78 margin-bottom: 40px !important; 79 padding: 20px 0 !important; 80 background-color: #f7f7f7 !important; 81 border-bottom: 1px solid #e5e5e5 !important; 82 text-align: center !important; 83} 84 85/* Style post title */ 86body.single-post .entry-title, 87body.single-post .post-title, 88body.single-post h1.title { 89 font-family: 'Montserrat', Arial, sans-serif !important; 90 font-size: 36px !important; 91 font-weight: 700 !important; 92 color: #222 !important; 93 line-height: 1.3 !important; 94 margin: 20px 0 15px 0 !important; 95 text-align: center !important; 96} 97 98/* Style breadcrumbs */ 99body.single-post .breadcrumbs, 100body.single-post .breadcrumb, 101body.single-post .breadcrumb-trail, 102body.single-post .breadcrumb-container { 103 text-align: center !important; 104 font-size: 14px !important; 105 color: #666 !important; 106 margin-bottom: 10px !important; 107} 108 109body.single-post .breadcrumbs a, 110body.single-post .breadcrumb a, 111body.single-post .breadcrumb-trail a, 112body.single-post .breadcrumb-container a { 113 color: #0073aa !important; 114 text-decoration: none !important; 115 border-bottom: none !important; 116} 117 118/* Only target the main content area */ 119body.single-post .post, 120body.single-post .entry, 121body.single-post .entry-content, 122body.single-post article .entry-content, 123body.single-post .type-post .entry-content, 124body.single-post .post-content, 125body.single-post article > .post-content, 126body.single-post .the-content, 127body.single-post .page-content, 128body.single-post .single-content, 129body.single-post .content-area .entry-content, 130body.single-post #primary .entry-content, 131body.single-post main .entry-content { 132 max-width: 800px !important; 133 margin-left: auto !important; 134 margin-right: auto !important; 135 padding: 30px !important; /* Added padding around content */ 136 font-family: 'Open Sans', Arial, sans-serif !important; 137 font-size: 17px !important; 138 line-height: 1.7 !important; 139 color: #333 !important; 140 background-color: #ffffff !important; /* Ensure white background */ 141 border-radius: 4px !important; 142 box-shadow: 0 1px 3px rgba(0,0,0,0.1) !important; /* Subtle shadow */ 143} 144 145/* Content Container */ 146body.single-post article, 147body.single-post .post, 148body.single-post .type-post, 149body.single-post .blog-post { 150 padding: 0 15px !important; /* Add side padding on mobile */ 151} 152 153/* Specifically target paragraphs ONLY within the content */ 154body.single-post .entry-content p, 155body.single-post .post-content p, 156body.single-post article .entry-content p, 157body.single-post .type-post .entry-content p, 158body.single-post .the-content p, 159body.single-post .page-content p, 160body.single-post .single-content p { 161 margin-bottom: 24px !important; 162 text-align: left !important; 163 font-size: 17px !important; 164 line-height: 1.7 !important; 165 color: #333 !important; 166 font-family: 'Open Sans', Arial, sans-serif !important; 167} 168 169/* Headings ONLY within content */ 170body.single-post .entry-content h1, 171body.single-post .entry-content h2, 172body.single-post .entry-content h3, 173body.single-post .entry-content h4, 174body.single-post .entry-content h5, 175body.single-post .entry-content h6, 176body.single-post .post-content h1, 177body.single-post .post-content h2, 178body.single-post .post-content h3, 179body.single-post .post-content h4, 180body.single-post .post-content h5, 181body.single-post .post-content h6 { 182 font-family: 'Montserrat', Arial, sans-serif !important; 183 font-weight: 600 !important; 184 margin-top: 40px !important; 185 margin-bottom: 20px !important; 186 color: #222 !important; 187 line-height: 1.3 !important; 188} 189 190body.single-post .entry-content h2, 191body.single-post .post-content h2 { 192 font-size: 28px !important; 193 border-bottom: 2px solid #f5f5f5 !important; 194 padding-bottom: 10px !important; 195} 196 197body.single-post .entry-content h3, 198body.single-post .post-content h3 { 199 font-size: 24px !important; 200} 201 202/* Lists within content only */ 203body.single-post .entry-content ul, 204body.single-post .entry-content ol, 205body.single-post .post-content ul, 206body.single-post .post-content ol { 207 margin-bottom: 24px !important; 208 padding-left: 30px !important; 209} 210 211body.single-post .entry-content li, 212body.single-post .post-content li { 213 margin-bottom: 10px !important; 214} 215 216/* Blockquotes within content only */ 217body.single-post .entry-content blockquote, 218body.single-post .post-content blockquote { 219 background-color: #f7f7f7 !important; 220 border-left: 4px solid #0073aa !important; 221 padding: 20px !important; 222 margin: 30px 0 !important; 223 font-style: italic !important; 224} 225 226body.single-post .entry-content blockquote p:last-child, 227body.single-post .post-content blockquote p:last-child { 228 margin-bottom: 0 !important; 229} 230 231/* Images within content only */ 232body.single-post .entry-content img, 233body.single-post .post-content img { 234 max-width: 100% !important; 235 height: auto !important; 236 margin: 30px auto !important; 237 display: block !important; 238 border-radius: 4px !important; 239 box-shadow: 0 2px 10px rgba(0,0,0,0.1) !important; 240} 241 242/* Links within content only */ 243body.single-post .entry-content a, 244body.single-post .post-content a { 245 color: #0073aa !important; 246 text-decoration: none !important; 247 border-bottom: 1px solid rgba(0,115,170,0.3) !important; 248 transition: all 0.2s ease !important; 249} 250 251body.single-post .entry-content a:hover, 252body.single-post .post-content a:hover { 253 color: #005077 !important; 254 border-bottom-color: #005077 !important; 255} 256 257/* Tables within content only */ 258body.single-post .entry-content table, 259body.single-post .post-content table { 260 width: 100% !important; 261 border-collapse: collapse !important; 262 margin: 30px 0 !important; 263 font-size: 16px !important; 264} 265 266body.single-post .entry-content th, 267body.single-post .entry-content td, 268body.single-post .post-content th, 269body.single-post .post-content td { 270 padding: 12px 15px !important; 271 border: 1px solid #ddd !important; 272 text-align: left !important; 273} 274 275body.single-post .entry-content th, 276body.single-post .post-content th { 277 background-color: #f5f5f5 !important; 278 font-weight: 600 !important; 279} 280 281/* Special elements (scoped to content) */ 282body.single-post .entry-content .aspr-blog-cta-box, 283body.single-post .post-content .aspr-blog-cta-box { 284 background-color: #f0f7fc !important; 285 border: 1px solid #d0e5f5 !important; 286 border-radius: 6px !important; 287 padding: 25px !important; 288 margin: 40px 0 !important; 289 text-align: center !important; 290} 291 292body.single-post .entry-content .aspr-blog-cta-box h4, 293body.single-post .post-content .aspr-blog-cta-box h4 {
294 margin-top: 0 !important; 295 font-size: 22px !important; 296 color: #0073aa !important; 297} 298 299body.single-post .entry-content .aspr-blog-cta-box .aspr-cta-button, 300body.single-post .post-content .aspr-blog-cta-box .aspr-cta-button { 301 display: inline-block !important; 302 background-color: #0073aa !important; 303 color: white !important; 304 padding: 12px 24px !important; 305 border-radius: 4px !important; 306 font-weight: 600 !important; 307 text-decoration: none !important; 308 border-bottom: none !important; 309 transition: background-color 0.2s ease !important; 310 margin-top: 15px !important; 311} 312 313body.single-post .entry-content .aspr-rental-tip, 314body.single-post .post-content .aspr-rental-tip { 315 background-color: #fff8e6 !important; 316 border-left: 4px solid #f9c100 !important; 317 padding: 20px !important; 318 margin: 30px 0 !important; 319} 320 321body.single-post .entry-content .aspr-rental-tip h4, 322body.single-post .post-content .aspr-rental-tip h4 { 323 color: #d69e00 !important; 324 margin-top: 0 !important; 325 font-size: 20px !important; 326} 327 328/* Mobile responsive adjustments */ 329@media (max-width: 768px) { 330 body.single-post .entry-content p, 331 body.single-post .post-content p { 332 font-size: 16px !important; 333 } 334 335 body.single-post .entry-content h2, 336 body.single-post .post-content h2 { 337 font-size: 24px !important; 338 } 339 340 body.single-post .entry-content h3, 341 body.single-post .post-content h3 { 342 font-size: 20px !important; 343 } 344 345 body.single-post .entry-title, 346 body.single-post .post-title, 347 body.single-post h1.title { 348 font-size: 28px !important; 349 } 350 351 body.single-post #main, 352 body.single-post main, 353 body.single-post .content-area, 354 body.single-post .site-main, 355 body.single-post .site-content { 356 padding-top: 25px !important; 357 padding-bottom: 25px !important; 358 } 359 360 body.single-post .post, 361 body.single-post .entry, 362 body.single-post .entry-content, 363 body.single-post article .entry-content { 364 padding: 20px !important; 365 } 366}</style><meta name="google-site-verification" content="g5YR__UeKDKVsb8RCbdueBlmySeDNijKK4kUqthFqT0" />
366<script>
vendor: 327 bytes, lines 366-370
366(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start': 367new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0], 368j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src= 369'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f); 370})(window,document,'script','dataLayer','
370GTM-P934D7R
vendor: 3 bytes, line 370
370');
370</script>
370 <link rel="icon" href="https://www.aspartyrental.com/wp-content/uploads/2020/02/finalllll-150x150.png" sizes="32x32" /><link rel="icon" href="https://www.aspartyrental.com/wp-content/uploads/2020/02/finalllll.png" sizes="192x192" /><link rel="apple-touch-icon" href="https://www.aspartyrental.com/wp-content/uploads/2020/02/finalllll.png" /><meta name="msapplication-TileImage" content="https://www.aspartyrental.com/wp-content/uploads/2020/02/finalllll.png" /><style id="wp-custom-css">.grecaptcha-badge { visibility: hidden; } 371 372.search-submit{display:none;} 373 374.cartInfo{ 375 display:none !important; 376} 377.io-footer-link a { 378color: var(--e-global-color-accent, orange); 379} 380 381.catDescriptionIO.catDescriptionIO_small.elementor-widget-text-editor { 382 padding: 10px; 383 font-size: small; 384 text-align: left; 385} 386 387 388.io_catdiv2 .catDescriptionIO{ 389 display:none; 390} 391 392.page-content .io_catdiv2{ 393 margin:0 auto !important; 394 grid-template-columns: repeat(auto-fit, minmax(251px, 300px)); 395} 396 397.elementor-192 .elementor-button { 398 background-color: #d90000; 399} 400 401 402 403@media screen and (max-width: 700px) { 404.io_catdiv2 .cat_img { 405 min-height: 20px !important; 406} 407 .page-content .io_catdiv2 { 408 margin: 0 auto !important; 409 grid-template-columns: repeat(auto-fit, minmax(101px, 150px)) !important; 410} 411} 412 413.io_catdiv2 .cat_img { 414 width: auto; 415 min-height: 250px; 416 max-height: 250px !important; 417 max-width: 100%; 418 object-fit: contain; 419} 420span.io_forrent { 421 visibility: hidden; 422} 423.io_item2_list, .io_mm_item { 424 padding: 0 !important; 425 border: dodgerblue 2px solid; 426 box-shadow: 5px 5px 4px rgba(0, 0, 0, 0.3) !important; 427} 428.page-content .io_catdiv2 { 429 margin: 0 auto !important; 430 grid-template-columns: repeat(auto-fit, minmax(201px, 250px)); 431} 432.io_item2_list div.view-product-button { 433 padding: 0 !important; 434} 435 436/* added 10-22-2024 */ 437 438.io_mm_outer .cat_img { 439 max-height: unset; 440} 441#mega-menu-wrap-max_mega_menu_1 #mega-menu-max_mega_menu_1 input, #mega-menu-wrap-max_mega_menu_1 #mega-menu-max_mega_menu_1 img { 442 max-width: 100%; 443 max-height: 125px; 444} 445 446 447 448 449/* Custom CSS for A&S Party Rental Blog Posts Only */ 450 451/* Main content styling - highly specific to blog posts only */ 452body.single-post #main .entry-content { 453 max-width: 800px; 454 margin: 0 auto; 455 font-family: 'Open Sans', Arial, sans-serif; 456 font-size: 17px; 457 line-height: 1.7; 458 color: #333; 459} 460 461/* Paragraph spacing */ 462body.single-post #main .entry-content p { 463 margin-bottom: 24px; 464 text-align: left; 465} 466 467/* Headings */ 468body.single-post #main .entry-content h1, 469body.single-post #main .entry-content h2, 470body.single-post #main .entry-content h3, 471body.single-post #main .entry-content h4, 472body.single-post #main .entry-content h5, 473body.single-post #main .entry-content h6 { 474 font-family: 'Montserrat', Arial, sans-serif; 475 font-weight: 600; 476 margin-top: 40px; 477 margin-bottom: 20px; 478 color: #222; 479 line-height: 1.3; 480} 481 482body.single-post #main .entry-content h2 { 483 font-size: 28px; 484 border-bottom: 2px solid #f5f5f5; 485 padding-bottom: 10px; 486} 487 488body.single-post #main .entry-content h3 { 489 font-size: 24px; 490} 491 492/* Lists */ 493body.single-post #main .entry-content ul, 494body.single-post #main .entry-content ol { 495 margin-bottom: 24px; 496 padding-left: 30px; 497} 498 499body.single-post #main .entry-content li { 500 margin-bottom: 10px; 501} 502 503/* Blockquotes for testimonials or highlights */ 504body.single-post #main .entry-content blockquote { 505 background-color: #f7f7f7; 506 border-left: 4px solid #0073aa; 507 padding: 20px; 508 margin: 30px 0; 509 font-style: italic; 510} 511 512body.single-post #main .entry-content blockquote p:last-child { 513 margin-bottom: 0; 514} 515 516/* Images */ 517body.single-post #main .entry-content img { 518 max-width: 100%; 519 height: auto; 520 margin: 30px auto; 521 display: block; 522 border-radius: 4px; 523 box-shadow: 0 2px 10px rgba(0,0,0,0.1); 524} 525 526body.single-post #main .entry-content figure.wp-block-image { 527 margin: 30px auto; 528} 529 530body.single-post #main .entry-content figcaption { 531 text-align: center; 532 font-size: 14px; 533 color: #666; 534 margin-top: 8px; 535} 536 537/* Links */ 538body.single-post #main .entry-content a { 539 color: #0073aa; 540 text-decoration: none; 541 border-bottom: 1px solid rgba(0,115,170,0.3); 542 transition: all 0.2s ease; 543} 544 545body.single-post #main .entry-content a:hover { 546 color: #005077; 547 border-bottom-color: #005077; 548} 549 550/* Tables */ 551body.single-post #main .entry-content table { 552 width: 100%; 553 border-collapse: collapse; 554 margin: 30px 0; 555 font-size: 16px; 556} 557 558body.single-post #main .entry-content th, 559body.single-post #main .entry-content td { 560 padding: 12px 15px; 561 border: 1px solid #ddd; 562 text-align: left; 563} 564 565body.single-post #main .entry-content th { 566 background-color: #f5f5f5; 567 font-weight: 600; 568} 569 570body.single-post #main .entry-content tr:nth-child(even) { 571 background-color: #f9f9f9; 572} 573 574/* Call to action box - namespaced to avoid conflicts */ 575body.single-post #main .entry-content .aspr-blog-cta-box { 576 background-color: #f0f7fc; 577 border: 1px solid #d0e5f5; 578 border-radius: 6px; 579 padding: 25px; 580 margin: 40px 0; 581 text-align: center; 582} 583 584body.single-post #main .entry-content .aspr-blog-cta-box h4 {
585 margin-top: 0; 586 font-size: 22px; 587 color: #0073aa; 588} 589 590body.single-post #main .entry-content .aspr-blog-cta-box .aspr-cta-button { 591 display: inline-block; 592 background-color: #0073aa; 593 color: white; 594 padding: 12px 24px; 595 border-radius: 4px; 596 font-weight: 600; 597 text-decoration: none; 598 border-bottom: none; 599 transition: background-color 0.2s ease; 600 margin-top: 15px; 601} 602 603body.single-post #main .entry-content .aspr-blog-cta-box .aspr-cta-button:hover { 604 background-color: #005077; 605} 606 607/* Special sections for party rental tips - namespaced */ 608body.single-post #main .entry-content .aspr-rental-tip { 609 background-color: #fff8e6; 610 border-left: 4px solid #f9c100; 611 padding: 20px; 612 margin: 30px 0; 613} 614 615body.single-post #main .entry-content .aspr-rental-tip h4 { 616 color: #d69e00; 617 margin-top: 0; 618 font-size: 20px; 619} 620 621/* Mobile responsive adjustments */ 622@media (max-width: 768px) { 623 body.single-post #main .entry-content { 624 font-size: 16px; 625 padding: 0 15px; 626 } 627 628 body.single-post #main .entry-content h2 { 629 font-size: 24px; 630 } 631 632 body.single-post #main .entry-content h3 { 633 font-size: 20px; 634 } 635}</style></head><body class="wp-singular page-template-default page page-id-4588 page-child parent-pageid-3566 wp-custom-logo wp-theme-io-kenos eio-default mega-menu-max-mega-menu-4 mega-menu-max-mega-menu-5 elementor-default elementor-kit-812 elementor-page elementor-page-4588"><header data-elementor-type="header" data-elementor-id="79821" class="elementor elementor-79821 elementor-location-header" data-elementor-post-type="elementor_library"><section class="elementor-section elementor-top-section elementor-element elementor-element-4cd2fa82 elementor-section-full_width io_header elementor-section-height-default elementor-section-height-default" data-id="4cd2fa82" data-element_type="section" data-e-type="section" id="top" data-settings="{"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-7afb3e7e" data-id="7afb3e7e" data-element_type="column" data-e-type="column"><div class="elementor-widget-wrap elementor-element-populated"><section class="elementor-section elementor-inner-section elementor-element elementor-element-12322a63 elementor-section-content-middle elementor-section-boxed elementor-section-height-default elementor-section-height-default" data-id="12322a63" data-element_type="section" data-e-type="section" data-settings="{"background_background":"classic"}"><div class="elementor-container elementor-column-gap-no"><div class="elementor-column elementor-col-25 elementor-inner-column elementor-element elementor-element-b4963f4 elementor-hidden-mobile" data-id="b4963f4" data-element_type="column" data-e-type="column"><div class="elementor-widget-wrap elementor-element-populated"><div class="elementor-element elementor-element-31989892 elementor-widget-tablet__width-initial elementor-widget elementor-widget-heading" data-id="31989892" data-element_type="widget" data-e-type="widget" data-widget_type="heading.default"><div class="elementor-widget-container"><h2 class="elementor-heading-title elementor-size-default">Proud Supporters of</h2></div></div><div class="elementor-element elementor-element-797ee18a elementor-widget-tablet__width-initial elementor-widget elementor-widget-image" data-id="797ee18a" data-element_type="widget" data-e-type="widget" data-widget_type="image.default"><div class="elementor-widget-container"> <img fetchpriority="high" width="1024" height="326" src="https://www.aspartyrental.com/wp-content/uploads/2024/04/KLOVE_2014.svg_-1024x326.png" class="attachment-large size-large wp-image-79819" alt="klove_2014-svg_-png" srcset="https://www.aspartyrental.com/wp-content/uploads/2024/04/KLOVE_2014.svg_-1024x326.png 1024w, https://www.aspartyrental.com/wp-content/uploads/2024/04/KLOVE_2014.svg_-300x96.png 300w, https://www.aspartyrental.com/wp-content/uploads/2024/04/KLOVE_2014.svg_-768x245.png 768w, https://www.aspartyrental.com/wp-content/uploads/2024/04/KLOVE_2014.svg_.png 1280w" sizes="(max-width: 1024px) 100vw, 1024px" /></div></div></div></div><div class="elementor-column elementor-col-25 elementor-inner-column elementor-element elementor-element-d735bf7" data-id="d735bf7" data-element_type="column" data-e-type="column"><div class="elementor-widget-wrap elementor-element-populated"><div class="elementor-element elementor-element-d38f6b0 elementor-widget__width-initial elementor-widget-tablet__width-initial elementor-widget elementor-widget-image" data-id="d38f6b0" data-element_type="widget" data-e-type="widget" data-widget_type="image.default"><div class="elementor-widget-container"> <a href="https://www.bengals.com/"> <img width="792" height="612" src="https://www.aspartyrental.com/wp-content/uploads/2026/04/Bengal-B_FullColor.png" class="attachment-large size-large wp-image-148117" alt="" srcset="https://www.aspartyrental.com/wp-content/uploads/2026/04/Bengal-B_FullColor.png 792w, https://www.aspartyrental.com/wp-content/uploads/2026/04/Bengal-B_FullColor-300x232.png 300w, https://www.aspartyrental.com/wp-content/uploads/2026/04/Bengal-B_FullColor-768x593.png 768w" sizes="(max-width: 792px) 100vw, 792px" />
635 </a></div></div><div class="elementor-element elementor-element-0705a53 elementor-widget-tablet__width-initial elementor-widget elementor-widget-heading" data-id="0705a53" data-element_type="widget" data-e-type="widget" data-widget_type="heading.default"><div class="elementor-widget-container"><h2 class="elementor-heading-title elementor-size-default">Official Event Management Partner</h2></div></div></div></div><div class="elementor-column elementor-col-25 elementor-inner-column elementor-element elementor-element-26d9d985" data-id="26d9d985" data-element_type="column" data-e-type="column"><div class="elementor-widget-wrap elementor-element-populated"><div class="elementor-element elementor-element-1d768b66 e-grid-align-mobile-center elementor-widget__width-initial elementor-widget-tablet__width-initial elementor-shape-rounded elementor-grid-0 e-grid-align-center elementor-widget elementor-widget-social-icons" data-id="1d768b66" data-element_type="widget" data-e-type="widget" data-widget_type="social-icons.default"><div class="elementor-widget-container"><div class="elementor-social-icons-wrapper elementor-grid" role="list"> <span class="elementor-grid-item" role="listitem"> <a class="elementor-icon elementor-social-icon elementor-social-icon-facebook elementor-repeater-item-e148ae9" href="https://www.facebook.com/aspartyrentalohio/" target="_blank"> <span class="elementor-screen-only">Facebook</span> <i aria-hidden="true" class="fab fa-facebook"></i> </a> </span> <span class="elementor-grid-item" role="listitem"> <a class="elementor-icon elementor-social-icon elementor-social-icon-twitter elementor-repeater-item-3d5c8fd" href="https://twitter.com/asplayzone" target="_blank"> <span class="elementor-screen-only">Twitter</span> <i aria-hidden="true" class="fab fa-twitter"></i> </a> </span> <span class="elementor-grid-item" role="listitem"> <a class="elementor-icon elementor-social-icon elementor-social-icon-youtube elementor-repeater-item-d6d0b41" href="https://www.youtube.com/channel/UCDuZ8Whx0S5aCFvUAPffVzA" target="_blank"> <span class="elementor-screen-only">Youtube</span> <i aria-hidden="true" class="fab fa-youtube"></i> </a> </span> <span class="elementor-grid-item" role="listitem"> <a class="elementor-icon elementor-social-icon elementor-social-icon-instagram elementor-repeater-item-ec39958" href="https://www.instagram.com/aspartyrentalevents/" target="_blank"> <span class="elementor-screen-only">Instagram</span> <i aria-hidden="true" class="fab fa-instagram"></i> </a> </span> <span class="elementor-grid-item" role="listitem"> <a class="elementor-icon elementor-social-icon elementor-social-icon-tiktok elementor-repeater-item-9f0051d" href="https://www.tiktok.com/@aspartyrental" target="_blank"> <span class="elementor-screen-only">Tiktok</span> <i aria-hidden="true" class="fab fa-tiktok"></i> </a> </span> <span class="elementor-grid-item" role="listitem"> <a class="elementor-icon elementor-social-icon elementor-social-icon-pinterest elementor-repeater-item-eb341a5" href="https://www.pinterest.com/ASplayzoneOh/" target="_blank"> <span class="elementor-screen-only">Pinterest</span> <i aria-hidden="true" class="fab fa-pinterest"></i> </a> </span></div></div></div></div></div><div class="elementor-column elementor-col-25 elementor-inner-column elementor-element elementor-element-65ca1157" data-id="65ca1157" data-element_type="column" data-e-type="column"><div class="elementor-widget-wrap elementor-element-populated"><div class="elementor-element elementor-element-129cc4b3 elementor-widget elementor-widget-heading" data-id="129cc4b3" data-element_type="widget" data-e-type="widget" data-widget_type="heading.default"><div class="elementor-widget-container"><h2 class="elementor-heading-title elementor-size-default">Find your location</h2></div></div><div class="elementor-element elementor-element-1eb05753 elementor-widget elementor-widget-html" data-id="1eb05753" data-element_type="widget" data-e-type="widget" data-widget_type="html.default"><div class="elementor-widget-container"><div class="zip" style="display:flex;justify-content:end"> <input type="text" id="io_zipRedirectField"> <button id="io_zipRedirectButton">Search</button></div><div id="io_zipRedirectWarning" style="display:none"></div>
635<script>jQuery(document).ready(function() { 636 jQuery("#io_zipRedirectButton").click(zipRedirect); 637 }); 638 639 function zipRedirect(){ 640 let zip_provided = jQuery("#io_zipRedirectField").val(); 641 switch(checkZipLocation(zip_provided)) { 642 case "Dayton/Franklin": 643 setCookie("zip", zip_provided, 14); 644 window.location.href = "https://www.aspartyrental.com/"; 645 break; 646 case "Cincinnati": 647 setCookie("zip", zip_provided, 14); 648 window.location.href = "https://www.aspartyrental.com/cincinnati"; 649 break; 650 case "Lima": 651 setCookie("zip", zip_provided, 14); 652 window.location.href = "https://www.aspartyrental.com/lima"; 653 break; 654 case "Lexington": 655 setCookie("zip", zip_provided, 14); 656 window.location.href = "https://www.aspartyrental.com/lexington"; 657 break; 658 default: 659 window.location.href = "https://www.aspartyrental.com/delivery-area"; 660 break; 661 } 662 } 663 664 function checkZipLocation(zip_provided){ 665 let dayton_franklin_zips = ["45371","45401","45402","45403","45404","45405","45406","45409","45410","45412","45414","45416","45417","45419","45420","45422","45423","45424","45426","45428","45431","45432","45439","45469","45482","45005"]; 666 let cincinnati_zips = ["45201","45202","45203","45403","45204","45205","45206","45207","45208","45209","45211","45212","45213","45214","45215","45216","45217","45219","45220","45221","45222","45223","45224","45225","45226","45227","45227","45229","45230","45232","45233","45234","45237","45238","45239","45248","45250","45263","45264","45267","45268","45269","45270","45271","45273","45274","45296","45298","45299","45999"]; 667 let lima_zips = ["45801","45804","45805"]; 668 let lexington_zips = ["40502","40503","40504","40505","40506","40507","40508","40509","40510","40511","40512","40513","40514","40515","40516","40517","40522","40523","40524","40526","40533","40536","40544","40546","40550","40555","40574","40575","40576","40577","40578","40579","40580","40581","40582","40583","40588","40591","40598"]; 669 670 if(dayton_franklin_zips.includes(zip_provided)){ 671 return "Dayton/Franklin"; 672 } 673 if(cincinnati_zips.includes(zip_provided)){ 674 return "Cincinnati"; 675 } 676 if(lima_zips.includes(zip_provided)){ 677 return "Lima"; 678 } 679 if(lexington_zips.includes(zip_provided)){ 680 return "Lexington"; 681 } 682 683 return zip_provided; 684 }</script>
684 </div></div></div></div></div></section><section class="elementor-section elementor-inner-section elementor-element elementor-element-5fbfe484 elementor-hidden-desktop elementor-hidden-tablet elementor-hidden-mobile elementor-section-boxed elementor-section-height-default elementor-section-height-default" data-id="5fbfe484" data-element_type="section" data-e-type="section" data-settings="{"background_background":"classic"}"><div class="elementor-background-overlay"></div><div class="elementor-container elementor-column-gap-default"><div class="elementor-column elementor-col-100 elementor-inner-column elementor-element elementor-element-6d634d17" data-id="6d634d17" data-element_type="column" data-e-type="column"><div class="elementor-widget-wrap elementor-element-populated"><div class="elementor-element elementor-element-3a1d4adc elementor-icon-list--layout-inline elementor-align-center elementor-mobile-align-center elementor-hidden-desktop elementor-hidden-tablet elementor-list-item-link-full_width elementor-widget elementor-widget-icon-list" data-id="3a1d4adc" data-element_type="widget" data-e-type="widget" data-widget_type="icon-list.default"><div class="elementor-widget-container"><ul class="elementor-icon-list-items elementor-inline-items"><li class="elementor-icon-list-item elementor-inline-item"> <a href="tel:855-752-9966"> <span class="elementor-icon-list-icon"> <i aria-hidden="true" class="fas fa-phone-alt"></i> </span> <span class="elementor-icon-list-text"><a href="https://www.aspartyrental.com/dayton">Nationwide </a></span> </a></li><li class="elementor-icon-list-item elementor-inline-item"> <a href="tel:937-885-5454"> <span class="elementor-icon-list-icon"> <i aria-hidden="true" class="fas fa-phone-alt"></i> </span> <span class="elementor-icon-list-text"><a href="https://www.aspartyrental.com/dayton">Dayton </a></span> </a></li><li class="elementor-icon-list-item elementor-inline-item"> <a href="tel:513-315-9110"> <span class="elementor-icon-list-icon"> <i aria-hidden="true" class="fas fa-phone-alt"></i> </span> <span class="elementor-icon-list-text"><a href="https://www.aspartyrental.com/cincinnati">Cincinnati </a></span> </a></li><li class="elementor-icon-list-item elementor-inline-item"> <a href="tel:419-339-9701"> <span class="elementor-icon-list-icon"> <i aria-hidden="true" class="fas fa-phone-alt"></i> </span> <span class="elementor-icon-list-text"><a href="https://www.aspartyrental.com/Lima">Lima</a></span> </a></li><li class="elementor-icon-list-item elementor-inline-item"> <a href="tel:859-800-1110"> <span class="elementor-icon-list-icon"> <i aria-hidden="true" class="fas fa-phone-alt"></i> </span> <span class="elementor-icon-list-text"><a href="https://www.aspartyrental.com/Lexington">Lexington</a></span> </a></li></ul></div></div></div></div></div></section><section class="elementor-section elementor-inner-section elementor-element elementor-element-41cb96d7 elementor-section-boxed elementor-section-height-default elementor-section-height-default" data-id="41cb96d7" data-element_type="section" data-e-type="section" data-settings="{"background_background":"classic"}"><div class="elementor-background-overlay"></div><div class="elementor-container elementor-column-gap-default"><div class="elementor-column elementor-col-16 elementor-inner-column elementor-element elementor-element-254defc7" data-id="254defc7" data-element_type="column" data-e-type="column"><div class="elementor-widget-wrap elementor-element-populated"><div class="elementor-element elementor-element-56057cde elementor-widget elementor-widget-theme-site-logo elementor-widget-image" data-id="56057cde" data-element_type="widget" data-e-type="widget" data-widget_type="theme-site-logo.default"><div class="elementor-widget-container"> <a href="https://www.aspartyrental.com"> <img width="300" height="219" src="https://www.aspartyrental.com/wp-content/uploads/2020/02/AS-Blue-Logo-No-Words1-300x219.png" class="attachment-medium size-medium wp-image-7119" alt="A&S Party Rentals logo" srcset="https://www.aspartyrental.com/wp-content/uploads/2020/02/AS-Blue-Logo-No-Words1-300x219.png 300w, https://www.aspartyrental.com/wp-content/uploads/2020/02/AS-Blue-Logo-No-Words1.png 649w" sizes="(max-width: 300px) 100v
684w, 300px" /> </a></div></div></div></div><div class="elementor-column elementor-col-66 elementor-inner-column elementor-element elementor-element-7406b851" data-id="7406b851" data-element_type="column" data-e-type="column"><div class="elementor-widget-wrap elementor-element-populated"><div class="elementor-element elementor-element-0815fe8 elementor-widget-mobile__width-initial elementor-widget elementor-widget-wp-widget-maxmegamenu" data-id="0815fe8" data-element_type="widget" data-e-type="widget" data-widget_type="wp-widget-maxmegamenu.default"><div class="elementor-widget-container"><div id="mega-menu-wrap-max_mega_menu_5" class="mega-menu-wrap"><div class="mega-menu-toggle"><div class="mega-toggle-blocks-left"></div><div class="mega-toggle-blocks-center"><div class='mega-toggle-block mega-menu-toggle-block mega-toggle-block-1' id='mega-toggle-block-1'><span aria-expanded="false" aria-haspopup="true" role="button" class='mega-toggle-label'><span class='mega-toggle-label-closed'></span><span class='mega-toggle-label-open'></span></span></div></div><div class="mega-toggle-blocks-right"></div></div><ul id="mega-menu-max_mega_menu_5" class="mega-menu max-mega-menu mega-menu-horizontal mega-no-js" data-event="hover_intent" data-effect="fade_up" data-effect-speed="200" data-effect-mobile="disabled" data-effect-speed-mobile="0" data-mobile-force-width="body" data-second-click="go" data-document-click="collapse" data-vertical-behaviour="standard" data-breakpoint="600" data-unbind="true" data-mobile-state="collapse_all" data-mobile-direction="vertical"><li class="mega-menu-item mega-menu-item-type-post_type mega-menu-item-object-page mega-menu-item-has-children mega-align-bottom-left mega-menu-flyout mega-menu-item-5211" id="mega-menu-item-5211"><a class="mega-menu-link" href="https://www.aspartyrental.com/event-planning/" aria-expanded="false" aria-controls="mega-sub-menu-5211">Event Planning<span class="mega-indicator" aria-hidden="true"></span></a><ul class="mega-sub-menu" id='mega-sub-menu-5211'><li class="mega-menu-item mega-menu-item-type-post_type mega-menu-item-object-page mega-menu-item-10889" id="mega-menu-item-10889"><a class="mega-menu-link" href="https://www.aspartyrental.com/event-planning/newsletter/">Newsletter</a></li><li class="mega-menu-item mega-menu-item-type-post_type mega-menu-item-object-page mega-menu-item-5181" id="mega-menu-item-5181"><a class="mega-menu-link" href="https://www.aspartyrental.com/corporate-event-planning/">Company Picnic & Corporate Event Planning</a></li><li class="mega-menu-item mega-menu-item-type-post_type mega-menu-item-object-page mega-menu-item-12469" id="mega-menu-item-12469"><a class="mega-menu-link" href="https://www.aspartyrental.com/team-building/">Team Building</a></li><li class="mega-menu-item mega-menu-item-type-post_type mega-menu-item-object-page mega-menu-item-144015" id="mega-menu-item-144015"><a class="mega-menu-link" href="https://www.aspartyrental.com/rentals/trade-show-expo/">Trade Show & Expo</a></li><li class="mega-menu-item mega-menu-item-type-post_type mega-menu-item-object-page mega-menu-item-5184" id="mega-menu-item-5184"><a class="mega-menu-link" href="https://www.aspartyrental.com/college-event-ideas/">College Event Ideas</a></li><li class="mega-menu-item mega-menu-item-type-post_type mega-menu-item-object-page mega-menu-item-10444" id="mega-menu-item-10444"><a class="mega-menu-link" href="https://www.aspartyrental.com/school-carnivals-festivals/">School Carnivals & Festivals</a></li><li class="mega-menu-item mega-menu-item-type-post_type mega-menu-item-object-page mega-menu-item-93525" id="mega-menu-item-93525"><a class="mega-menu-link" href="https://www.aspartyrental.com/rentals/fall-festival-event-rental/">Fall Festival Event Rental</a></li><li class="mega-menu-item mega-menu-item-type-post_type mega-menu-item-object-page mega-menu-item-93521" id="mega-menu-item-93521"><a class="mega-menu-link" href="https://www.aspartyrental.com/rentals/winter-event-rental/">Winter Event Rental</a></li><li class="mega-menu-item mega-menu-item-type-post_type mega-menu-item-object-page mega-menu-item-93523" id="mega-menu-item-93523"><a class="mega-menu-link" href="https://www.aspartyrental.com/rentals/summer-fun-rentals/">Summer Fun Rentals</a></li><li class="mega-menu-item mega-menu-item-type-post_type mega-menu-item-object-page mega-menu-item-12487" id="mega-menu-item-12487"><a class="mega-menu-link" href="https://www.aspartyrental.com/wedding-event-ideas/">Wedding Event Ideas</a></li><li class="mega-menu-item mega-menu-item-type-post_type mega-menu-item-object-page mega-menu-item-5135" id="mega-menu-item-5135"><a class="mega-menu-link" href="https://www.aspartyrental.com/inflatable-rental-info/">Inflatable Rental Info</a></li><li class="mega-menu-item mega-menu-item-type-post_type mega-menu-item-object-page mega-menu-item-5180" id="mega-menu-item-5180"><a class="mega-menu-link" href="https://www.aspartyrental.com/graduation-parties-ideas-and-more/">Graduation Parties Ideas</a></li><li class="mega-menu-item mega-menu-item-type-post_type mega-menu-item-object-page mega-menu-item-12468" id="mega-menu-item-12468"><a class="mega-menu-link" href="https://www.aspartyrental.com/birthday-party-ideas/">Birthday Party Ideas!</a></li><li class="mega-menu-item mega-menu-item-type-post_type mega-menu-item-object-page mega-menu-item-5144" id="mega-menu-item-5144"><a class="mega-menu-link" href="https://www.aspartyrental.com/table-and-linen-rental/">Table and Linen Rental</a></li><li class="mega-menu-item mega-menu-item-type-post_type mega-menu-item-object-page mega-menu-item-5182" id="mega-menu-item-5182"><a class="mega-menu-link" href="https://www.aspartyrental.com/tent-rental-info/">Tent Rental Info</a></li><li class="mega-menu-item mega-menu-item-type-post_type mega-menu-item-object-page mega-menu-item-5183" id="mega-menu-item-5183"><a class="mega-menu-link" href="https://www.aspartyrental.com/what-size-tent-rental-do-i-need-in-cincinnati-dayton/">What Size Tent Do I Need?</a></li><li class="mega-menu-item mega-menu-item-type-post_type mega-menu-item-object-page mega-menu-item-5136" id="mega-menu-item-5136"><a class="mega-menu-link" href="https://www.aspartyrental.com/catering/">Catering</a></li><li class="mega-menu-item mega-menu-item-type-post_type mega-menu-item-object-page mega-menu-item-148295" id="mega-menu-item-148295"><a class="mega-menu-link" href="https://www.aspartyrental.com/event-planning/columbus-party-and-event-rentals/">Columbus Party and Event Rentals</a></li></ul></li><li class="mega-menu-item mega-menu-item-type-post_type mega-menu-item-object-page mega-menu-item-has-children mega-align-bottom-left mega-menu-flyout mega-menu-item-3449" id="mega-menu-item-3449"><a class="mega-menu-link" href="https://www.aspartyrental.com/about-us/" aria-expanded="false" aria-controls="mega-sub-menu-3449">About Us<span class="mega-indicator" aria-hidden="true"></span></a><ul class="mega-sub-menu" id='mega-sub-menu-3449'><li class="mega-menu-item mega-menu-item-type-post_type mega-menu-item-object-page mega-menu-item-3448" id="mega-menu-item-3448"><a class="mega-menu-link" href="https://www.aspartyrental.com/faqs/">FAQs</a></li><li class="mega-menu-item mega-menu-item-type-post_type mega-menu-item-object-page mega-menu-item-3445" id="mega-menu-item-3445"><a class="mega-menu-link" href="https://www.aspartyrental.com/contact-us/">Contact Us</a></li><li class="mega-menu-item mega-menu-item-type-post_type mega-menu-item-object-page mega-menu-item-11506" id="mega-menu-item-11506"><a target="_blank" class="mega-menu-link" href="https://www.aspartyrental.com/employment/">Employment</a></li></ul></li><li class="mega-menu-item mega-menu-item-type-custom mega-menu-item-object-custom mega-menu-item-has-children mega-align-bottom-left mega-menu-flyout mega-menu-item-6948" id="mega-menu-item-6948"><a class="mega-menu-link" href="#" aria-expanded="false" aria-controls="mega-sub-menu-6948">Locations<span class="mega-indicator" aria-hidden="true"></span></a><ul class="mega-sub-menu" id='mega-sub-menu-6948'><li class="mega-menu-item mega-menu-item-type-custom mega-menu-item-object-custom mega-menu-item-6994" id="mega-menu-item-6994"><a class="mega-menu-link" href="https://www.aspartyrental.com/dayton">Dayton / Franklin, OH</a></li><li class="mega-menu-item mega-menu-item-type-custom mega-menu-item-object-custom mega-menu-item-6949" id="mega-menu-item-6949"><a class="mega-menu-link" href="https://www.aspartyrental.com/cincinnati/">Cincinnati, OH</a></li><li class="mega-menu-item mega-menu-item-type-custom mega-menu-item-object-custom mega-menu-item-6950" id="mega-menu-item-6950"><a class="mega-menu-link" href="https://www.aspartyrental.com/lima/">Lima, OH</a></li><li class="mega-menu-item mega-menu-item-type-custom mega-menu-item-object-custom mega-menu-item-6951" id="mega-menu-item-6951"><a class="mega-menu-link" href="https://www.aspartyrental.com/lexington/">Lexington, KY</a></li><li class="mega-menu-item mega-menu-item-type-post_type mega-menu-item-object-page mega-menu-item-7524" id="mega-menu-item-7524"><a class="mega-menu-link" href="https://www.aspartyrental.com/delivery-area/">Nationwide Delivery</a></li></ul></li><li class="mega-menu-item mega-menu-item-type-custom mega-menu-item-object-custom mega-menu-item-7243" id="mega-menu-item-7243"><a target="_blank" class="mega-menu-link" href="https://www.aspartyrental.com/wp-content/uploads/2023/08/AS-Party-Rental-Catalog-2023-FINAL.pdf">Digital Catalog</a></li></ul></div></div></div><div class="elementor-element elementor-element-2696478c elementor-align-center elementor-mobile-align-center elementor-widget-mobile__width-initial elementor-widget elementor-widget-button" data-id="2696478c" data-element_type="widget" data-e-type="widget" data-widget_type="button.default"><div class="elementor-widget-container"><div class="elementor-button-wrapper"> <a class="elementor-button elementor-button-link elementor-size-sm elementor-animation-grow" href="#elementor-action%3Aaction%3Dpopup%3Aopen%26settings%3DeyJpZCI6IjU4OTUzIiwidG9nZ2xlIjpmYWxzZX0%3D"> <span class="elementor-button-content-wrapper"> <span class="elementor-button-text">Request a Proposal</span> </span> </a></div></div></div></div></div><div class="elementor-column elementor-col-16 elementor-inner-column elementor-element elementor-element-2dc9c617" data-id="2dc9c617" data-element_type="column" data-e-type="column" data-settings="{"background_background":"classic"}"><div class="elementor-widget-wrap elementor-element-populated"><div class="elementor-element elementor-element-6c1b5389 ioCart elementor-widget-mobile__width-initial elementor-view-default elementor-widget elementor-widget-icon" data-id="6c1b5389" data-element_type="widget" data-e-type="widget" data-widget_type="icon.default"><div class="elementor-widget-container"><div class="elementor-icon-wrapper"><div class="elementor-icon"> <i aria-hidden="true" class="fas fa-shopping-cart"></i></div></div></div></div></div></div></div></section><section class="elementor-section elementor-inner-section elementor-element elementor-element-52e9dd0 elementor-section-boxed elementor-section-height-default elementor-section-height-default" data-id="52e9dd0" data-element_type="section" data-e-type="section" data-settings="{"background_background":"classic"}"><div class="elementor-background-overlay"></div><div class="elementor-container elementor-column-gap-default"><div class="elementor-column elementor-col-100 elementor-inner-column elementor-element elementor-element-4ab6e890" data-id="4ab6e890" data-element_type="column" data-e-type="column"><div class="elementor-widget-wrap elementor-element-populated"><div class="elementor-element elementor-element-672ead51 elementor-icon-list--layout-inline elementor-align-center elementor-list-item-link-full_width elementor-widget elementor-widget-icon-list" data-id="672ead51" data-element_type="widget" data-e-type="widget" data-widget_type="icon-list.default"><div class="elementor-widget-container"><ul class="elementor-icon-list-items elementor-inline-items"><li class="elementor-icon-list-item elementor-inline-item"> <a href="tel:1-800-917-6863"> <span class="elementor-icon-list-icon"> <i aria-hidden="true" class="fas fa-phone-alt"></i> </span> <span class="elementor-icon-list-text">Nationwide​<br />1-800-917-6863</span> </a></li><li class="elementor-icon-list-item elementor-inline-item"> <a href="tel:937-885-5454"> <span class="elementor-icon-list-icon"> <i aria-hidden="true" class="fas fa-phone-alt"></i> </span> <span class="elementor-icon-list-text">Dayton<br />937-885-5454</span> </a></li><li class="elementor-icon-list-item elementor-inline-item"> <a href="tel:513-315-9110"> <span class="elementor-icon-list-icon"> <i aria-hidden="true" class="fas fa-phone-alt"></i> </span> <span class="elementor-icon-list-text">Cincinnati<br />513-315-9110</span> </a></li><li class="elementor-icon-list-item elementor-inline-item"> <a href="tel:419-339-9701"> <span class="elementor-icon-list-icon"> <i aria-hidden="true" class="fas fa-phone-alt"></i> </span> <span class="elementor-icon-list-text">Lima<br />419-339-9701</span> </a></li><li class="elementor-icon-list-item elementor-inline-item"> <a href="tel:859-800-1110"> <span class="elementor-icon-list-icon"> <i aria-hidden="true" class="fas fa-phone-alt"></i> </span> <span class="elementor-icon-list-text">Lexington<br />859-800-1110</span> </a></li></ul></div></div></div></div></div></section></div></div></div></section></header><main id="main" class="site-main" role="main"><header class="page-header io_phshow"><div class ="elementor-widget-heading"><p id="breadcrumbs" class="io-entry-title elementor-heading-title"><a href="https://www.aspartyrental.com">Home</a><span class="separator"> - </span><a href="https://www.aspartyrental.com/rentals/">Inventory</a><span class="separator"> - </span><a href="https://www.aspartyrental.com/rentals/carnival-ride-rentals/">Carnival Rides Rentals Oh, Ky, Indiana</a><span class="separator"> - </span><span class="last">Trackless Train w/ Roofed Carts</span></p></div></header><div class="page-content"><div data-elementor-type="wp-page" data-elementor-id="4588" class="elementor elementor-4588" data-elementor-post-type="page"><section class="elementor-section elementor-top-section elementor-element elementor-element-418f4921 elementor-section-boxed elementor-section-height-default elementor-section-height-default" data-id="418f4921" data-element_type="section" data-e-type="section"><div class="elementor-container elementor-column-gap-default"><div class="elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-3567ab4a" data-id="3567ab4a" data-element_type="column" data-e-type="column"><div class="elementor-widget-wrap elementor-element-populated"><div class="elementor-element elementor-element-78a16c3 elementor-widget elementor-widget-text-editor" data-id="78a16c3" data-element_type="widget" data-e-type="widget" data-widget_type="text-editor.default"><div class="elementor-widget-container"><div class="io_product_container elementor-widget-text-editor io_product_container_216569"><div class="cartInfo" style="display:none"> <i class="cartIcon fas fa-shopping-cart"></i> <span class="simpleCart_quantity"></span> items</div><div class="simpleCart_ioShelfItem"><div class="io_product_picbox"><div id="io_main_media_container"> <a rel="img_group noopener" id="single_image" href="https://www.aspartyrental.com/wp-content/uploads/2023/09/Trackless20Train20NEW_832321_big.jpg"> <img decoding="async" class="io_image_big item_image" title="Trackless Train w/ Roofed Carts" src="https://www.aspartyrental.com/wp-content/uploads/2023/09/Trackless20Train20NEW_832321_big.jpg" alt="Trackless Train w/ Roofed Carts" />
684 </a><video class="io_video_big" id="io_main_video" controls preload="none" style="max-width:100%;" playsinline> <source src="" type="video/mp4"></video></div> <br><div class="io_image_thumbbox" id="io_media_thumbbox"></div></div><div class="io_product_infobox"><div class="elementor-widget-heading"><h1 class="io_product_title elementor-heading-title item_name">Trackless Train w/ Roofed Carts</h1></div><p class="item_encoded" style="display:none;">Trackless+Train+w%2F+Roofed+Carts</p><p class="item_rentalid" style="display:none;">216569</p><p class="item_quantity" style="display:none;">1</p><p class="item_vendorid" style="display:none;"></p><p class="item_qtytype" style="display:none;">Limited</p><p class="item_inputtype" style="display:none;">Dropdown</p> <span class="item_qtyincrement" style="display:none;">1</span><div class="item_timeslots" style="display:none;"></div><p class="item_giftcardvalue" style="display:none;"></p><div class="io_star_rating"><div class="io_stars_216569 io_stars"></div> <a href="#page_product_reviews">See Reviews</a></div><div id="item_live_price_time_set_message" style="display:none"><p> <span style="cursor:pointer; color:blue; text-decoration:underline;" onclick=checkAvailDateClick()> click here </span> to set an event time so you can see a more accurate price for this item</p></div><div id="item_additonal_info_open_message" style="display:none"><p> <span style="cursor:pointer; color:blue; text-decoration:underline;" onclick=checkAvailDateClick()> click here </span> to provide information required for pricing.</p></div><div id="io_all_prices"><div class="io_product_price_box io_product_price_1h io_product_price_1h_216569"><p class="io_product_price_top_left">$1,400.00</p><p class="io_product_price_top_right">per hour</p></div><div class="io_product_price_box io_product_price_2h io_product_price_2h_216569"><p class="io_product_price_top_left">$1,400.00</p><p class="io_product_price_top_right">for 2 hours</p></div><div class="io_product_price_box io_product_price_3h io_product_price_3h_216569"><p class="io_product_price_top_left">$1,400.00</p><p class="io_product_price_top_right">for 3 hours</p></div><div class="io_product_price_box io_product_price_4h io_product_price_4h_216569"><p class="io_product_price_top_left">$1,400.00</p><p class="io_product_price_top_right">for 4 hours</p></div><div class="io_product_price_box io_product_price_5h io_product_price_5h_216569"><p class="io_product_price_top_left">$1,750.00</p><p class="io_product_price_top_right">for 5 hours</p></div><div class="io_product_price_box io_product_price_6h io_product_price_6h_216569"><p class="io_product_price_top_left">$2,100.00</p><p class="io_product_price_top_right">for 6 hours</p></div><div class="io_product_price_box io_product_price_7h io_product_price_7h_216569"><p class="io_product_price_left">$2,450.00</p><p class="io_product_price_right">for 7 hours</p></div><div class="io_product_price_box io_product_price_8h io_product_price_8h_216569"><p class="io_product_price_left">$2,800.00</p><p class="io_product_price_right">for 8 hours</p></div><div class="io_product_price_box io_product_price_9h io_product_price_9h_216569"><p class="io_product_price_left">$3,150.00</p><p class="io_product_price_right">for 9 hours</p></div><div class="io_product_price_box io_product_price_10h io_product_price_10h_216569"><p class="io_product_price_left">$0.00</p><p class="io_product_price_right">for 10 hours</p></div><div class="io_product_price_box io_product_price_11h io_product_price_11h_216569"><p class="io_product_price_left">$0.00</p><p class="io_product_price_right">for 11 hours</p></div><div class="io_product_price_box io_product_price_12h io_product_price_12h_216569"><p class="io_product_price_left">$0.00</p><p class="io_product_price_right">for 12 hours</p></div><div class="io_product_price_box io_product_price_13h io_product_price_13h_216569"><p class="io_product_price_left">$0.00</p><p class="io_product_price_right">for 13 hours</p></div><div class="io_product_price_box io_product_price_14h io_product_price_14h_216569"><p class="io_product_price_left">$0.00</p><p class="io_product_price_right">for 14 hours</p></div><div class="io_product_price_box io_product_price_15h io_product_price_15h_216569"><p class="io_product_price_left">$0.00</p><p class="io_product_price_right">for 15 hours</p></div><div class="io_product_price_box io_product_price_16h io_product_price_16h_216569"><p class="io_product_price_left">$0.00</p><p class="io_product_price_right">for 16 hours</p></div><div class="io_product_price_box io_product_price_24h io_product_price_24h_216569"><p class="io_product_price_left">$0.00</p><p class="io_product_price_right">per day</p></div><div class="io_product_price_box io_product_price_additionalhour io_product_price_additionalhour_216569"><p class="io_product_price_left">$350.00</p><p class="io_product_price_right">per additional hour</p></div><div class="io_product_price_box io_product_price_additionalday io_product_price_additionalday_216569"><p class="io_product_price_left">$0.00</p><p class="io_product_price_right">per additional day</p></div><div class="io_product_price_box io_product_price_48h io_product_price_48h_216569"><p class="io_product_price_left">$0.00</p><p class="io_product_price_right">for 2 days</p></div><div class="io_product_price_box io_product_price_72h io_product_price_72h_216569"><p class="io_product_price_left">$0.00</p><p class="io_product_price_right">for 3 days</p></div><div class="io_product_price_box io_product_price_96h io_product_price_96h_216569"><p class="io_product_price_left">$0.00</p><p class="io_product_price_right">for 4 days</p></div><div class="io_product_price_box io_product_price_120h io_product_price_120h_216569"><p class="io_product_price_left">$0.00</p><p class="io_product_price_right">for 5 days</p></div><div class="io_product_price_box io_product_price_168h io_product_price_168h_216569"><p class="io_product_price_left">$0.00</p><p class="io_product_price_right">for 1 week</p></div><div class="io_product_price_box io_product_price_336h io_product_price_336h_216569"><p class="io_product_price_left">$0.00</p><p class="io_product_price_right">for 2 weeks</p></div><div class="io_product_price_box io_product_price_504h io_product_price_504h_216569"><p class="io_product_price_left">$0.00</p><p class="io_product_price_right">for 3 weeks</p></div><div class="io_product_price_box io_product_price_720h io_product_price_720h_216569"><p class="io_product_price_left">$0.00</p><p class="io_product_price_right">for 1 month</p></div></div><div class="io_product_price_box io_product_price_fixed io_product_price_fixed_216569" style="display:none"><p class="io_product_price_top_left">$0.00</p><p class="io_product_price_top_right">per item</p></div><div class="io_product_price_box io_product_price_sqfoot io_product_price_sqfoot_216569" style="display:none"><p class="io_product_price_top_left">$0.00</p><p class="io_product_price_top_right">per sq foot</p></div><div class="io_product_acc_pkg" style="margin-top:14px;"></div><div class="elementor-widget-button io_phrase_216569" style="display:none;margin-top:25px; "> <label for="phraseInput" style="color:darkred"> Enter the phrase you want displayed: </label><br> <input 685 type="text" 686 id="phraseInput" 687 class="io_phrase_216569" 688 style="width: 300px;" 689 oninput="phraseUpdateCount(this)" 690 /></div><div style="display: inline-flex"><div><div class="elementor-widget-button add_cart_216569"> <a id="bookNowBtn" 691 class="item_add elementor-button elementor-size-sm elementor-animation-grow io_button" 692 href="javascript:;"><i class="fas fa-shopping-cart"></i>
692 Add to Cart</a></div><div class="unavailable_message" onclick="checkAvailDateClick()">item unavailable (change date)</div></div><div class="delivery_charge_check_container"><div class="elementor-widget-button check_delivery_216569"> <a id="checkDeliveryButton" 693 class="elementor-button elementor-size-sm elementor-animation-grow io_button" 694 href="javascript:;" onClick="showAddressEntry()"><i class="fas fa-truck"></i> Check Delivery</a></div></div><div class="calc_price_with_map_container"><div class="elementor-widget-button calc_price_map_216569"> <a id="calcPriceOpenMap" 695 class="elementor-button elementor-size-sm elementor-animation-grow io_button" 696 href="javascript:;" onClick="openMap(this)"><i class="fas fa-map"></i> Calculate Price </a></div></div></div><div class="io_product_detailbox"><h3 class="io_product_subtitle">Product Information:</h3><div class="io_product_desc"><h1>Have a seat on our Trackless Train!</h1><p>A&S Party Rental's Trackless Train is always a hit at every big city holiday event, church festival, and everywhere it goes! Everybody loves trains, and this colorful trackless train give little ones a rare experience that they will never forget. One of our professional drivers will steer the carts down city streets or parking lots as kids smile and wave with joy! Climb aboard and take a ride on one of the 16 seats on this train, and you will see why A&S brings out the fun in everyone!</p><h2>If you like our Trackless Train…</h2><p>We've got some REALLY RAD <a data-saferedirecturl="https://www.google.com/url?q=https://www.aspartyrental.com/extreme-attractions/&source=gmail&ust=1674659217489000&usg=AOvVaw3JMUTCLei2LjNVnUHmEu5_" href="https://www.aspartyrental.com/extreme-attractions/" rel="noopener" target="_blank">Extreme Attractions</a>, such as the Ninja Warrior Run and a Mechanical Bull, that would make your 2023 event the best ever!!!</p><p>Did you know we have an authentic <a data-saferedirecturl="https://www.google.com/url?q=https://www.aspartyrental.com/product/tea-cup-amusement-ride-rental/&source=gmail&ust=1674659217489000&usg=AOvVaw10b7peh2FDEdLI1Sipsc1j" href="https://www.aspartyrental.com/product/tea-cup-amusement-ride-rental/" rel="noopener" target="_blank">Tea Cup amusement ride</a>? This ride is in high demand because it is one of the only ones in the US. We can bring it to your next church festival or city event!</p><p>Let us bring one of our <a data-saferedirecturl="https://www.google.com/url?q=https://www.aspartyrental.com/product/face-painters/&source=gmail&ust=1674659217489000&usg=AOvVaw3waSedUo_tlVAhmwnBG_dE" href="https://www.aspartyrental.com/product/face-painters/" rel="noopener" target="_blank">face painters</a> to paint some rainbows, unicorns, and sunshine onto everybody's faces! Our artists can do many professional designs and will make your celebration even more enjoyable.</p><p><strong>Keep up to date with A&S Party Rental with our Social Media :</strong></p><p>See our tweets and tweet at us on <a href="https://twitter.com/asplayzone?lang=en" target="_blank" rel="noopener">TWITTER</a>!</p><p>Give us a like and a follow on our <a href="https://www.facebook.com/ASPartyRentalOh/" target="_blank" rel="noopener">FACEBOOK</a>!</p><p>Don’t forget to see our happenings on <a href="https://www.instagram.com/aspartyrentalweddings/?hl=en" target="_blank" rel="noopener">INSTAGRAM</a>!</p><p>You cannot forget to see us on your For You Page on <a href="https://www.tiktok.com/@aspartyrental?lang=en" target="_blank" rel="noopener">TIK TOK</a>!</p><p>Reviews give an insight into our business practices on <a data-et-has-event-already="true" href="https://www.google.com/search?q=A%26S+Party+Rental+Google&rlz=1C1UEAD_enUS1007US1007&oq=A%26S+Party+Rental+Google&aqs=chrome..69i57j33i160l2.4839j0j4&sourceid=chrome&ie=UTF-8#lrd=0x88408a7a5ec41115:0x66efbcf84bf158e8,1,,," target="_blank" rel="noopener">GOOGLE</a>!</p><p>Professionalism at its finest, make sure to follow us on<a href="https://ec.linkedin.com/company/a-&-s-play-zone?trk=public_profile_experience-item_profile-section-card_image-click" target="_blank" rel="noopener"> LINKEDIN</a>!</p><p>We are always hosting giveaways and special coupons on our Social Media, so make sure to give us a follow, like, or comment!</p></div></div><div class="io_product_detail_box" style="margin-top:40px"><p class="io_product_circuits_left">Circuits needed:</p><p class="io_product_circuits_right">0</p></div><div class="io_product_detail_box"><p class="io_product_dimensions_left">Item Dimensions:</p><p class="io_product_dimensions_right">4 x 22 x7</p></div><div class="io_product_detail_box"><p class="io_product_footprint_left">Space Needed:</p><p class="io_product_footprint_right"></p></div><div class="eh_additional_description" style="display:none"><ul><li><strong>DELIVERY:</strong> We deliver to <a href=https://www.aspartyrental.com/party-rentals-in-dayton-ohio/>Dayton Ohio</a> and surrounding areas (delivery fees calculated at checkout).</li><li><strong>COUPONS:</strong><a href="/coupon-form/">
696Click here to check for coupons.</a></li><li><strong>RAIN POLICY:</strong> You can reschedule your rental due to rain at no extra cost as long as 24 hour notice is given.</li><li><strong>OCCUPANCY:</strong> A maximum of 5-6 kids of equal size at one time for bounce houses, and 1 person at a time for slides is what most inflatable manufacturers recommend.</li><li><strong>CLEANING:</strong> All units are cleaned and sanitized before use.</li><li><strong>WHAT’S INCLUDED:</strong><ul class="square"><li>Extension Cord</li><li>Blower</li><li>Safety Stakes to secure to ground</li></ul></li><li><strong>WHAT YOU’LL NEED:</strong><ul class="square"><li>Enough space for us to setup your rental</li><li>Electric outlet within 50 feet of setup area</li><li>Water source and water hose if renting a water slide</li></ul></li></ul></div></div></div><div class="io_product_requiredDD_accessories" style="display:none"><h3 class="io_acc_h3">Required Accessories:</h3><hr></div><div class="io_product_accessories"></div> <a name="page_product_reviews"></a><div class="io_product_reviewbox"><h3 class="io_review_h3">Product Reviews:</h3><ul class="io_review_ul"><li class="io_review_li"><div class="io_review_stars io_stars"><div class="fas fa-star" style="color:goldenrod"></div><div class="fas fa-star" style="color:goldenrod"></div><div class="fas fa-star" style="color:goldenrod"></div><div class="fas fa-star" style="color:goldenrod"></div><div class="fas fa-star" style="color:goldenrod"></div></div><span class="io_review_li_date">9/23/23</span><span class="io_review_li_name">Jamie</span><span class="io_review_li_desc">The kids LOVED this!! We can’t wait to do it again next year!! </span></li></ul></div><div class="io_product_upsell"><h3 class="io_upsell_h3">You might also be interested in:</h3><div class="page-carousel"></div></div><div class="io_landingpages io_landingpages_216569 elementor-widget-text-editor"> Professional delivery to <span class=\"io_city_list\"><a href=https://www.aspartyrental.com/party-rentals-in-dayton-ohio/>Dayton Ohio</a></span> and surrounding areas. Please submit a quote or contact us to be sure we service your area.</div></div>
696<script>//stars 697 jQuery(document).ready(function () { 698 for(i=0;i<05;i++){ 699 star_html = `<div class=\"fas fa-star\" style=\"color:goldenrod\"></div>`; 700 jQuery(".io_stars_216569").append(star_html); 701 } 702 var times = getAvailTimes(); 703 getUpsellsCall(times[0],times[1],times[2],jQuery(".io_product_infobox .item_rentalid").first().text(), updatePageUpsell); 704 acc_obj_relate = order_acc_obj_relate(); 705 jQuery(".io_product_price_top_left").each(function () { 706 if( !Number( this.textContent.replace(/[^0-9.-]+/g,"") ) ){ 707 jQuery(this.parentElement).hide(); 708 } 709 }); 710 jQuery(".io_product_price_left").each(function () { 711 if( !Number( this.textContent.replace(/[^0-9.-]+/g,"") ) ){ 712 jQuery(this.parentElement).attr("style","display:none !important"); 713 } 714 }); 715 }); 716 717 try{ var acc_obj_relate = JSON.parse('{} '); } 718 catch{ var acc_obj_relate = {}; } 719 720 try{ var images_arr = JSON.parse('{"0":{"rentalimage_id":"53889","rentalimage_createtime":"0","rentalimage_modifiedtime":"0","rentalimage_itemid":"216569","rentalimage_order":"0","rentalimage_imageloc":"https://www.aspartyrental.com/wp-content/uploads/2023/09/Trackless20Train20NEW_832321.jpg","rentalimage_imagelocbig":"https://www.aspartyrental.com/wp-content/uploads/2023/09/Trackless20Train20NEW_832321_big.jpg","media_type":"image"},"1":{"rentalimage_id":"1213201","rentalimage_createtime":null,"rentalimage_modifiedtime":null,"rentalimage_itemid":"216569","rentalimage_order":"1","rentalimage_imageloc":"https://www.aspartyrental.com/wp-content/uploads/2023/10/IMG_5743_1698174966.jpg","rentalimage_imagelocbig":"https://www.aspartyrental.com/wp-content/uploads/2023/10/IMG_5743_1698174966_big.jpg","media_type":"image"}} '); } 721 catch { var images_arr = {}; } 722 723 try{ var acc_obj_order = JSON.parse('{} '); } 724 catch { var acc_obj_order = {}; } 725 726 var rental_name_template = "Trackless Train w/ Roofed Carts"; 727 var alt_text_template = "Trackless Train w/ Roofed Carts"; 728 729 function ioRentalMatchVideoToImage() 730 { 731 var $bigImage = jQuery('#single_image .io_image_big'); 732 var $mainVideo = jQuery('#io_main_video'); 733 734 $mainVideo.css( 735 { 736 width: $bigImage.outerWidth() + 'px', 737 height: $bigImage.outerHeight() + 'px', 738 display: 'block' 739 }); 740 } 741 function ioRentalShowVideo(el) 742 { 743 var $el = jQuery(el); 744 var $container = jQuery('#io_main_media_container'); 745 var $bigImage = jQuery('#single_image .io_image_big'); 746 var $mainVideo = jQuery('#io_main_video'); 747 748 var imgHeight = $bigImage.outerHeight(); 749 if (imgHeight > 0) { 750 $container.css('min-height', imgHeight + 'px'); 751 } 752 753 $mainVideo.find('source').attr('src', $el.data('video-src')); 754 755 if ($mainVideo.length && $mainVideo[0]) { 756 $mainVideo[0].load(); 757 } 758 759 $container.addClass('is-video-active'); 760 } 761 762 function ioRentalShowImage(el) 763 { 764 var $el = jQuery(el); 765 var $container = jQuery('#io_main_media_container'); 766 var $singleImage = jQuery('#single_image'); 767 var $bigImage = jQuery('#single_image .io_image_big'); 768 var $mainVideo = jQuery('#io_main_video'); 769 770 if ($el.data('big')) 771 { 772 $bigImage.attr('src', $el.data('big')); 773 $singleImage.attr('href', $el.data('big')); 774 } 775 776 $container.removeClass('is-video-active'); 777 778 if ($mainVideo.length && $mainVideo[0]) { 779 $mainVideo[0].pause(); 780 $mainVideo[0].currentTime = 0; 781 } 782 } 783 784 // Build unified media thumbnails and lightbox links from images_arr 785 jQuery(document).ready(function() 786 { 787 var thumbbox = jQuery('#io_media_thumbbox'); 788 if (jQuery.isEmptyObject(images_arr)) return; 789 790 jQuery('#single_image').attr('data-elementor-open-lightbox', 'no'); 791 792 // If first media item is a video, show video player instead of broken image on page load 793 var firstMedia = images_arr[Object.keys(images_arr)[0]]; 794 if (firstMedia && firstMedia.media_type === 'video' && firstMedia.rentalimage_imagelocbig) 795 { 796 var mainVideo = jQuery('#io_main_video'); 797 mainVideo.find('source').attr('src', firstMedia.rentalimage_imagelocbig); 798 if (mainVideo.length && mainVideo[0]) mainVideo[0].load(); 799 jQuery('#io_main_media_container').addClass('is-video-active'); 800 } 801 802 var count = 0; 803 for (var key in images_arr) 804 { 805 var media = images_arr[key]; 806 count++; 807 808 if (media.media_type === 'video' && media.rentalimage_imagelocbig) 809 { 810 var thumb = jQuery( 811 '<div class="io_media_thumb_wrapper io_video_thumb_wrapper">' + 812 '<img class="io_image_thumb io_video_thumb skip-lazy" ' + 813 'src="' + media.rentalimage_imageloc + '" ' +
814 'data-video-src="' + media.rentalimage_imagelocbig + '" ' + 815 'data-media-type="video" ' + 816 'title="' + rental_name_template + '" ' + 817 'alt="' + alt_text_template + '" ' + 818 'id="io_img_thumb' + count + '" />' + 819 '<div class="io_video_play_icon"><i class="fas fa-play-circle"></i></div>' + 820 '</div>' 821 ); 822 823 thumb.find('img').on('click', function() 824 { 825 ioRentalShowVideo(this); 826 }); 827 828 thumbbox.append(thumb); 829 } 830 else if (media.rentalimage_imageloc) 831 { 832 var thumb = jQuery( 833 '<img class="io_image_thumb skip-lazy" ' + 834 'title="' + rental_name_template + '" ' + 835 'src="' + media.rentalimage_imageloc + '" ' + 836 'alt="' + alt_text_template + '" ' + 837 'data-big="' + media.rentalimage_imagelocbig + '" ' + 838 'data-media-type="image" ' + 839 'id="io_img_thumb' + count + '" />' 840 ); 841 842 thumb.on('click', function() 843 { 844 ioRentalShowImage(this); 845 }); 846 847 thumbbox.append(thumb); 848 } 849 } 850 851 // Build FancyBox gallery array from images for #single_image click only 852 var fancyboxImages = []; 853 for (var fkey in images_arr) 854 { 855 var fmedia = images_arr[fkey]; 856 if (fmedia.media_type !== 'video' && fmedia.rentalimage_imagelocbig) 857 { 858 fancyboxImages.push({ href: fmedia.rentalimage_imagelocbig, title: rental_name_template }); 859 } 860 } 861 862 if (fancyboxImages.length && (window.innerWidth > 500 || window.location.href.indexOf("io_") > -1) && window.location.href.indexOf("io_contactform") == -1) 863 { 864 jQuery('#single_image').off('click.fancybox').on('click', function(e) 865 { 866 e.preventDefault(); 867 e.stopPropagation(); 868 var currentHref = jQuery(this).attr('href'); 869 var startIndex = 0; 870 for (var fi = 0; fi < fancyboxImages.length; fi++) 871 { 872 if (fancyboxImages[fi].href === currentHref) 873 { 874 startIndex = fi; 875 break; 876 } 877 } 878 jQuery.fancybox.open(fancyboxImages, 879 { 880 "transitionIn": "none", 881 "transitionOut": "none", 882 "titlePosition": "over", 883 "cyclic": true, 884 index: startIndex, 885 helpers: {title: { type: "over"}}, 886 beforeShow: function () { this.title = (this.title ? "" + this.title + "" : "") + "Image " + (this.index +1) + " of " + this.group.length; } 887 }); 888 }); 889 } 890 else 891 { 892 let imageClick = document.querySelector(".io_product_picbox a#single_image"); 893 if (imageClick != undefined || imageClick != null) imageClick.addEventListener("click", (e) => {e.preventDefault();}); 894 } 895 }); 896 897 function updatePageUpsell(data){ 898 let page_carousel = jQuery(".page-carousel"); 899 data.forEach(function(upsell){ 900 cell = createPageCarouselCell(upsell["image"], upsell["name"], upsell["page"], upsell["rental_id"]); 901 page_carousel.append(cell); 902 }); 903 makeCarousel(page_carousel); 904 setTimeout(pageFlickityRefresh, 500); 905 if(io_upsell_price == "on"){ 906 let times = getAvailTimes(); 907 let upsell_rental_id_str = getUpsellIDforPrice(); 908 let return_id = 0; 909 let rental_names = "off"; 910 if(upsell_rental_id_str != ""){ 911 checkAvailCall(times[0],times[1],times[2],rental_names,upsell_rental_id_str,displayUpsellPrices,0,[],[],return_id,0,null,1,"",1); 912 } 913 } 914 } 915 function createPageCarouselCell(image, name, page, rental_id){ 916 cell = `<div class="io_page_carousel_cell"> <a href="`+page+`" class="page-carousel-link"> <img decoding="async" class="page-carousel-image skip-lazy" src="`+image+`"> <p class="page-carousel-name"> `+name+` </p> <span class="page-carousel-rid" id="rid`+rental_id+`" style="display:none">`+rental_id+`</span> </a> </div>`; 917 return cell; 918 } 919 function pageFlickityRefresh(){ 920 jQuery(".page-carousel").flickity("resize"); 921 } 922 function order_acc_obj_relate(){ 923 let new_acc_obj_relate = new Map(); 924 if(!jQuery.isEmptyObject(acc_obj_relate) && !jQuery.isEmptyObject(acc_obj_order)){ 925 for(const [index, rid] of Object.entries(acc_obj_order)){ 926 new_acc_obj_relate.set(rid, acc_obj_relate[rid]) 927 } 928 } 929 return new_acc_obj_relate 930 } 931 /* if an item is consumable IO-21288*/
932 if(jQuery(".item_qtytype")[0].innerText == "Supply"){ 933 jQuery("#io_all_prices").hide(); 934 jQuery(".io_product_price_fixed").show(); 935 }</script>
935</div></div></div></div></div></section></div></div></main><footer data-elementor-type="footer" data-elementor-id="198" class="elementor elementor-198 elementor-location-footer" data-elementor-post-type="elementor_library"><section class="elementor-section elementor-top-section elementor-element elementor-element-45401a35 elementor-section-height-min-height elementor-section-boxed elementor-section-height-default elementor-section-items-middle" data-id="45401a35" data-element_type="section" data-e-type="section" id="io_contactform" data-settings="{"background_background":"classic"}"><div class="elementor-container elementor-column-gap-default"><div class="elementor-column elementor-col-33 elementor-top-column elementor-element elementor-element-4dcb0932" data-id="4dcb0932" data-element_type="column" data-e-type="column"><div class="elementor-widget-wrap elementor-element-populated"><div class="elementor-element elementor-element-5ec24e6c elementor-widget elementor-widget-heading" data-id="5ec24e6c" data-element_type="widget" data-e-type="widget" data-widget_type="heading.default"><div class="elementor-widget-container"><h2 class="elementor-heading-title elementor-size-xl">Contact Us</h2></div></div><div class="elementor-element elementor-element-3646316f elementor-widget elementor-widget-text-editor" data-id="3646316f" data-element_type="widget" data-e-type="widget" data-widget_type="text-editor.default"><div class="elementor-widget-container"> Have questions? We have answers! Can’t find what you’re looking for or curious about one of our products? Don’t hesitate to give us a call or use our <a href="#io_contactform">contact form</a> to reach out to us anytime!</div></div><div class="elementor-element elementor-element-3b11b9c elementor-icon-list--layout-inline elementor-mobile-align-start elementor-list-item-link-full_width elementor-widget elementor-widget-global elementor-global-1877 elementor-widget-icon-list" data-id="3b11b9c" data-element_type="widget" data-e-type="widget" data-widget_type="icon-list.default"><div class="elementor-widget-container"><ul class="elementor-icon-list-items elementor-inline-items"><li class="elementor-icon-list-item elementor-inline-item"> <a href="tel:(937)%20885-5454"> <span class="elementor-icon-list-icon"> <i aria-hidden="true" class="fas fa-phone-alt"></i> </span> <span class="elementor-icon-list-text">(937) 885-5454</span> </a></li><li class="elementor-icon-list-item elementor-inline-item"> <a href="mailto:[email protected]"> <span class="elementor-icon-list-icon"> <i aria-hidden="true" class="fas fa-envelope"></i> </span> <span class="elementor-icon-list-text">[email protected]</span> </a></li></ul></div></div><div class="elementor-element elementor-element-6b20e22 elementor-widget elementor-widget-heading" data-id="6b20e22" data-element_type="widget" data-e-type="widget" data-widget_type="heading.default"><div class="elementor-widget-container"><p class="elementor-heading-title elementor-size-default"><a href="https://www.aspartyrental.com/privacy-policy/">Privacy Policy</a></p></div></div></div></div><div class="elementor-column elementor-col-33 elementor-top-column elementor-element elementor-element-616d481" data-id="616d481" data-element_type="column" data-e-type="column"><div class="elementor-widget-wrap elementor-element-populated"><div class="elementor-element elementor-element-6be860c elementor-widget elementor-widget-heading" data-id="6be860c" data-element_type="widget" data-e-type="widget" data-widget_type="heading.default"><div class="elementor-widget-container"><h3 class="elementor-heading-title elementor-size-default"><a href="https://www.aspartyrental.com/lexington">Columbus</a></h3></div></div><div class="elementor-element elementor-element-be31190 elementor-widget elementor-widget-heading" data-id="be31190" data-element_type="widget" data-e-type="widget" data-widget_type="heading.default"><div class="elementor-widget-container"><h3 class="elementor-heading-title elementor-size-default"><a href="tel:800-917-6863">800-917-6863</a></h3></div></div><div class="elementor-element elementor-element-3a00036 elementor-widget-divider--view-line elementor-widget elementor-widget-divider" data-id="3a00036" data-element_type="widget" data-e-type="widget" data-widget_type="divider.default"><div class="elementor-widget-container"><div class="elementor-divider"> <span class="elementor-divider-separator"> </span></div></div></div><div class="elementor-element elementor-element-9583dbb elementor-widget elementor-widget-heading" data-id="9583dbb" data-element_type="widget" data-e-type="widget" data-widget_type="heading.default"><div class="elementor-widget-container"><h3 class="elementor-heading-title elementor-size-default"><a href="https://www.aspartyrental.com/cincinnati/">Cincinnati</a></h3></div></div><div class="elementor-element elementor-element-441e236 elementor-icon-list--layout-inline elementor-mobile-align-start elementor-widget__width-initial elementor-list-item-link-full_width elementor-widget elementor-widget-icon-list" data-id="441e236" data-element_type="widget" data-e-type="widget" data-widget_type="icon-list.default"><div class="elementor-widget-container"><ul class="elementor-icon-list-items elementor-inline-items"><li class="elementor-icon-list-item elementor-inline-item"> <span class="elementor-icon-list-text">3200 East Kemper Rd Cincinnati Ohio 45241</span></li></ul></div></div><div class="elementor-element elementor-element-f550164 elementor-widget elementor-widget-heading" data-id="f550164" data-element_type="widget" data-e-type="widget" data-widget_type="heading.default"><div class="elementor-widget-container"><h3 class="elementor-heading-title elementor-size-default"><a href="tel:513-315-9110">513-315-9110</a></h3></div></div><div class="elementor-element elementor-element-24624f2 elementor-widget-divider--view-line elementor-widget elementor-widget-divider" data-id="24624f2" data-element_type="widget" data-e-type="widget" data-widget_type="divider.default"><div class="elementor-widget-container"><div class="elementor-divider"> <span class="elementor-divider-separator"> </span></div></div></div><div class="elementor-element elementor-element-ca38203 elementor-widget elementor-widget-heading" data-id="ca38203" data-element_type="widget" data-e-type="widget" data-widget_type="heading.default"><div class="elementor-widget-container"><h3 class="elementor-heading-title elementor-size-default"><a href="https://www.aspartyrental.com/dayton/">Dayton</a></h3></div></div><div class="elementor-element elementor-element-3bda2fa elementor-icon-list--layout-inline elementor-mobile-align-start elementor-widget__width-initial elementor-list-item-link-full_width elementor-widget elementor-widget-icon-list" data-id="3bda2fa" data-element_type="widget" data-e-type="widget" data-widget_type="icon-list.default"><div class="elementor-widget-container"><ul class="elementor-icon-list-items elementor-inline-items"><li class="elementor-icon-list-item elementor-inline-item"> <span class="elementor-icon-list-text">300 Conover Dr Franklin, OH 45005</span></li></ul></div></div><div class="elementor-element elementor-element-d79c8c4 elementor-widget__width-initial elementor-widget elementor-widget-heading" data-id="d79c8c4" data-element_type="widget" data-e-type="widget" data-widget_type="heading.default"><div class="elementor-widget-container"><h3 class="elementor-heading-title elementor-size-default"><a href="tel:937-885-5454">937-885-5454</a></h3></div></div><div class="elementor-element elementor-element-bd4c34a elementor-widget-divider--view-line elementor-widget elementor-widget-divider" data-id="bd4c34a" data-element_type="widget" data-e-type="widget" data-widget_type="divider.default"><div class="elementor-widget-container"><div class="elementor-divider"> <span class="elementor-divider-separator"> </span></div></div></div><div class="elementor-element elementor-element-f5123b3 elementor-widget elementor-widget-heading" data-id="f5123b3" data-element_type="widget" data-e-type="widget" data-widget_type="heading.default"><div class="elementor-widget-container"><h3 class="elementor-heading-title elementor-size-default"><a href="https://www.aspartyrental.com/lima">Lima</a></h3></div></div><div class="elementor-element elementor-element-f7d264b elementor-icon-list--layout-inline elementor-mobile-align-start elementor-widget__width-initial elementor-list-item-link-full_width elementor-widget elementor-widget-icon-list" data-id="f7d264b" data-element_type="widget" data-e-type="widget" data-widget_type="icon-list.default"><div class="elementor-widget-container"><ul class="elementor-icon-list-items elementor-inline-items"><li class="elementor-icon-list-item elementor-inline-item"> <span class="elementor-icon-list-text">Good Road Delphos, OH 45833</span></li></ul></div></div><div class="elementor-element elementor-element-26f4d8d elementor-widget elementor-widget-heading" data-id="26f4d8d" data-element_type="widget" data-e-type="widget" data-widget_type="heading.default"><div class="elementor-widget-container"><h3 class="elementor-heading-title elementor-size-default"><a href="tel:419-339-9701">419-339-9701</a></h3></div></div><div class="elementor-element elementor-element-b547d2c elementor-widget-divider--view-line elementor-widget elementor-widget-divider" data-id="b547d2c" data-element_type="widget" data-e-type="widget" data-widget_type="divider.default"><div class="elementor-widget-container"><div class="elementor-divider"> <span class="elementor-divider-separator"> </span></div></div></div><div class="elementor-element elementor-element-1201eb0 elementor-widget elementor-widget-heading" data-id="1201eb0" data-element_type="widget" data-e-type="widget" data-widget_type="heading.default"><div class="elementor-widget-container"><h3 class="elementor-heading-title elementor-size-default"><a href="https://www.aspartyrental.com/lexington">Lexington</a></h3></div></div><div class="elementor-element elementor-element-0898bd5 elementor-widget elementor-widget-heading" data-id="0898bd5" data-element_type="widget" data-e-type="widget" data-widget_type="heading.default"><div class="elementor-widget-container"><h3 class="elementor-heading-title elementor-size-default"><a href="tel:859-800-1110">859-800-1110</a></h3></div></div></div></div><div class="elementor-column elementor-col-33 elementor-top-column elementor-element elementor-element-1acf2971" data-id="1acf2971" data-element_type="column" data-e-type="column"><div class="elementor-widget-wrap elementor-element-populated"><div class="elementor-element elementor-element-72d0f80a elementor-button-align-stretch elementor-widget elementor-widget-form" data-id="72d0f80a" data-element_type="widget" data-e-type="widget" data-settings="{"button_width":"33","step_next_label":"Next","step_previous_label":"Previous","step_type":"number_text","step_icon_shape":"circle"}" data-widget_type="form.default"><div class="elementor-widget-container"><form class="elementor-form" method="post" name="New Form" aria-label="New Form"> <input type="hidden" name="post_id" value="198"/> <input type="hidden" name="form_id" value="72d0f80a"/> <input type="hidden" name="referer_title" value="White Manzanita Tree 30" - A & S Party Rental And More" /> <input type="hidden" name="queried_id" value="4174"/><div class="elementor-form-fields-wrapper elementor-labels-"><div class="elementor-field-type-text elementor-field-group elementor-column elementor-field-group-firstandlastname elementor-col-33"> <label for="form-field-firstandlastname" class="elementor-field-label elementor-screen-only"> Name </label> <input size="1" type="text" name="form_fields[firstandlastname]" id="form-field-firstandlastname" class="elementor-field elementor-size-sm elementor-field-textual" placeholder="Name"></div><div class="elementor-field-type-email elementor-field-group elementor-column elementor-field-group-email elementor-col-33 elementor-field-required"> <label for="form-field-email" class="elementor-field-label elementor-screen-only"> Email </label> <input size="1" type="email" name="form_fields[email]" id="form-field-email" class="elementor-field elementor-size-sm elementor-field-textual" placeholder="Email" required="required"></div><div class="elementor-field-type-tel elementor-field-group elementor-column elementor-field-group-cellphone elementor-col-33"> <label for="form-field-cellphone" class="elementor-field-label elementor-screen-only"> Phone </label> <input size="1" type="tel" name="form_fields[cellphone]" id="form-field-cellphone" class="elementor-field elementor-size-sm elementor-field-textual" placeholder="Phone" pattern="[0-9()#&+*-=.]+" title="Only numbers and phone characters (#, -, *, etc) are accepted."></div><div class="elementor-field-type-acceptance elementor-field-group elementor-column elementor-field-group-field_9054d07 elementor-col-100"> <label for="form-field-field_9054d07" class="elementor-field-label elementor-screen-only"> Text notifications okay? </label><div class="elementor-field-subgroup"> <span class="elementor-field-option"> <input type="checkbox" name="form_fields[field_9054d07]" id="form-field-field_9054d07" class="elementor-field elementor-size-sm elementor-acceptance-field"> <label for="form-field-field_9054d07">
935Text notifications okay? (by checking this box you agree to receive text messages from A&S Party Rental)</label> </span></div></div><div class="elementor-field-type-textarea elementor-field-group elementor-column elementor-field-group-notes elementor-col-100"> <label for="form-field-notes" class="elementor-field-label elementor-screen-only"> Message </label><textarea class="elementor-field-textual elementor-field elementor-size-sm" name="form_fields[notes]" id="form-field-notes" rows="2" placeholder="Message"></textarea></div><div class="elementor-field-type-recaptcha_v3 elementor-field-group elementor-column elementor-field-group-field_1fe1092 elementor-col-100 recaptcha_v3-bottomright"><div class="elementor-field" id="form-field-field_1fe1092"><div class="elementor-g-recaptcha" data-sitekey="6LcSNw8eAAAAAN1cy4N20ZlzWX4YetiG7zmLXN_f" data-type="v3" data-action="Form" data-badge="bottomright" data-size="invisible"></div></div></div><div class="elementor-field-group elementor-column elementor-field-type-submit elementor-col-33 e-form__buttons"> <button class="elementor-button elementor-size-md" type="submit"> <span class="elementor-button-content-wrapper"> <span class="elementor-button-text">Send</span> </span> </button></div></div></form></div></div><div class="elementor-element elementor-element-ac1d4fe elementor-widget elementor-widget-text-editor" data-id="ac1d4fe" data-element_type="widget" data-e-type="widget" data-widget_type="text-editor.default"><div class="elementor-widget-container"> This site is protected by reCAPTCHA and the Google <a href="https://policies.google.com/privacy">Privacy Policy</a> and <a href="https://policies.google.com/terms">Terms of Service</a> apply.</div></div></div></div></div></section><section class="elementor-section elementor-top-section elementor-element elementor-element-44976d16 elementor-section-content-middle elementor-section-boxed elementor-section-height-default elementor-section-height-default" data-id="44976d16" data-element_type="section" data-e-type="section" data-settings="{"background_background":"classic"}"><div class="elementor-container elementor-column-gap-no"><div class="elementor-column elementor-col-50 elementor-top-column elementor-element elementor-element-6f87dea" data-id="6f87dea" data-element_type="column" data-e-type="column"><div class="elementor-widget-wrap elementor-element-populated"><div class="elementor-element elementor-element-d3eeee0 elementor-widget elementor-widget-text-editor" data-id="d3eeee0" data-element_type="widget" data-e-type="widget" data-widget_type="text-editor.default"><div class="elementor-widget-container"><p>Copyright © <span id="ioyeario">2022</span><span id="io_fbs"> A&S Party Rental Franklin OH</span> All Rights Reserved | Rental Software Powered By <a href="https://www.inflatableoffice.com/" target="_blank" rel="noopener">InflatableOffice</a></p></div></div></div></div><div class="elementor-column elementor-col-50 elementor-top-column elementor-element elementor-element-255b5384" data-id="255b5384" data-element_type="column" data-e-type="column"><div class="elementor-widget-wrap elementor-element-populated"><div class="elementor-element elementor-element-aeec8b2 elementor-view-default elementor-widget elementor-widget-icon" data-id="aeec8b2" data-element_type="widget" data-e-type="widget" data-widget_type="icon.default"><div class="elementor-widget-container"><div class="elementor-icon-wrapper"> <a class="elementor-icon elementor-animation-grow" href="#top"> <i aria-hidden="true" class="fas fa-angle-up"></i> </a></div></div></div></div></div></div></section></footer>
935<script type="speculationrules">{"prefetch":[{"source":"document","where":{"and":[{"href_matches":"/*"},{"not":{"href_matches":["/wp-*.php","/wp-admin/*","/wp-content/uploads/*","/wp-content/*","/wp-content/plugins/*","/wp-content/themes/io-kenos/*","/*\\?(.+)"]}},{"not":{"selector_matches":"a[rel~=\"nofollow\"]"}},{"not":{"selector_matches":".no-prefetch, .no-prefetch a"}}]},"eagerness":"conservative"}]}</script>
935 <img src="https://rental.software/include/iotracking.php" style="display:none;" importance="low" alt="dynamic io trk code" /><style>.io_product_price_4h,.io_product_price_8h,.io_product_price_24h,.io_product_price_additionalday{display:none}.io_product_price_24h{display: grid !important}.io_product_price_4h_1137109,.io_product_price_4h_274419{display: grid !important}.io_product_price_24h_1137109,.io_product_price_24h_274419,.io_product_price_24h_1137109,.io_product_price_24h_274419,.io_product_price_572166_1137109,.io_product_price_572166_274419,.io_product_price_572166_1137109,.io_product_price_572166_274419{display: none !important} 936 /* ALWAYS hide toggle buttons and list view on inventory/all-items pages (no category ID) */ 937 body.io-no-category-id .io_view_toggle_container, 938 body.io-no-category-id .io_list_view_content 939 { 940 display: none !important; 941 } 942 943 /* Force grid/tile layout on pages without category IDs */ 944 body.io-no-category-id .io_catdiv2.list-view { 945 display: grid !important; 946 grid-template-columns: repeat(auto-fit, minmax(250px, 350px)) !important; 947 grid-gap: 10px !important; 948 margin: 50px !important; 949 max-width: none !important; 950 justify-content: space-evenly !important; 951 } 952 body.io-no-category-id .io_catdiv2.list-view .io_item2_list { 953 display: block !important; 954 flex-direction: column !important; 955 margin-bottom: 0 !important; 956 padding: 0 !important; 957 align-items: initial !important; 958 text-align: center !important; 959 } 960 body.io-no-category-id .io_catdiv2.list-view .cat_div { 961 flex: initial !important; 962 margin-right: 0 !important; 963 position: relative !important; 964 } 965 body.io-no-category-id .io_catdiv2.list-view .cat_img { 966 width: 100% !important; 967 height: auto !important; 968 object-fit: cover !important; 969 } 970 body.io-no-category-id .io_catdiv2.list-view .io_item2_list_inner { 971 flex: initial !important; 972 margin-top: initial !important; 973 display: block !important; 974 flex-direction: initial !important; 975 justify-content: initial !important; 976 min-height: auto !important; 977 height: auto !important; 978 } 979 980 .io_all_item_cat{ 981 display:none; 982 float:none; 983 width:100%; 984 margin-top:20px; 985 }</style>
985<script>var io_wp_local_path = ""; 986 var io_checkavail = "warn"; 987 var io_hidetimes = "off"; 988 var io_user_country = "US"; 989 var io_user_currency = "USD"; 990 var io_default_start_time = "7:00 pm"; 991 var io_default_end_time = "9:00 pm"; 992 var io_default_duration = 2.00; 993 var io_force_blank_timepickers = ""; 994 var io_hide_end_time = ""; 995 var io_cart_date_format = "m/d/yy"; 996 var io_cart_message = ""; 997 var io_cart_time_format = "g:i a"; 998 var io_multidayquote = "on"; 999 var io_cartdayselect = "dropdown_options"; 1000 var io_cartAllowSameDay = ""; 1001 var io_overnightPickupTime = "10:00 am"; 1002 var io_incartupsell = "on"; 1003 var io_distancecharge = "on"; 1004 var io_deliverymethod = "off"; 1005 var io_brand = "IO"; 1006 var io_restrict_times = "off"; 1007 var io_restrict_time_start = "8:00 am"; 1008 var io_restrict_time_end = "9:00 pm"; 1009 var io_default_state = "OH"; 1010 var io_hide_zero = "1"; 1011 var io_weekEndPrice = "off"; 1012 var io_weekDayText = "Weekday price."; 1013 var io_weekEndText = "Weekend price."; 1014 var io_weekendDefine = "friday-sunday"; 1015 var io_accessory_price = "off"; 1016 var io_accessory_select = "off"; 1017 var io_upsell_price = "off"; 1018 var io_cart_party_planner_email = ""; 1019 var io_cart_party_planner_destination = ""; 1020 var io_hideQuantityAvail = "off"; 1021 var io_company_timeslots = []; 1022 var io_info_required = "off"; 1023 var io_always_display_live_price = "on"; 1024 var io_default_delivery_method = ""; 1025 var io_hide_live_prices = 1; 1026 var io_info_required_data = []; 1027 var io_prices = {"0":"isset","override_groups":{"5755134":{"1137109":1,"274419":1}},"1":"io_product_price_24h","2":"io_custom_price_572166","3":"io_product_price_4h_1137109","4":"io_product_price_4h_274419","5":"io_custom_price_939838_1137109","6":"io_custom_price_939838_274419"}; 1028 var io_delivery_prices = {"default":[],"override":[]}; 1029 var io_custom_prices = {"default":[{"name":"CALL FOR PRICING","duration":"CALL FOR PRICING","id":"572166"}],"override":{"1137109":[{"name":"CALL FOR PRICING","duration":"CALL FOR PRICING","id":"939838"}],"274419":[{"name":"CALL FOR PRICING","duration":"CALL FOR PRICING","id":"939838"}]}}; 1030 var io_delivery_methods = {"Customer Pick-Up\/Return":{"restricted":"[]","id":"55365"},"Delivery & Return":{"restricted":"[]","id":"55367"}}; 1031 var io_customer_geolocation = ""; 1032 var io_customer_ip = "183.82.7.245"; 1033 var io_delivery_methods_restrict = null; 1034 var io_pagename = "300 Conover Dr"; 1035 var io_categoryVariantImages = ""; 1036 //var io_seocitylinktext = "Professional delivery to <span class=\"io_city_list\">%%landing_pages%%</span> and surrounding areas. Please submit a quote or contact us to be sure we service your area."; 1037 jQuery( document ).ready(function() { 1038 1039 //force all quote form links to use cart data 1040 //removing back to cart shortcode as this needs to only be done if cart is not empty IO-22561 1041 /* 1042 let headerBookButton = jQuery("a[href$='io_quoteform/']"); 1043 headerBookButton.addClass("ioCart_link"); 1044 headerBookButton.attr("href", "javascript:;"); 1045 */ 1046 1047 1048 let last_cat_name = ""; 1049 let ioTrigger = false; 1050 jQuery(".io_all_item_cat").each(function() { 1051 current_cat_name = jQuery(this).html(); 1052 if(last_cat_name !== current_cat_name) { 1053 jQuery(this).show(); 1054 ioTrigger = true; 1055 } 1056 last_cat_name = current_cat_name; 1057 }); 1058 1059 // Setup gen page blocks 1060 let io_divs = document.querySelectorAll(".io_item2_list, .io_item2_listcat, .io_item2_listrent, .io_all_item_cat"); 1061 let io_divscat = document.querySelectorAll(".io_item2_listcat"); 1062 let io_divsrent = document.querySelectorAll(".io_item2_listrent"); 1063 let io_divcat = document.querySelector(".io_catdiv2"); 1064 let io_pcc = document.querySelector(".page-content"); 1065 let io_html; 1066 1067 if (io_divs.length > 0) { 1068 for (let i of io_divs) { 1069 if(i.parentNode.className.indexOf("io_mm_") === -1){ 1070 io_divcat.appendChild(i); 1071 } 1072 } 1073 if(io_divcat!==null) io_divcat.style.display = "grid"; 1074 } 1075 1076 if (ioTrigger) { 1077 let pageBlock = document.querySelector(".io_catdiv2"); 1078 pageBlock.classList.add("elementor-widget-heading"); 1079 let scanRes = pageBlock.querySelectorAll(".io_item2_listrent"); 1080 pageBlock.style.display = "block"; 1081 pageBlock.style.margin = "auto"; 1082 pageBlock.style.textAlign = "center"; 1083 pageBlock.style.marginLeft = "5px"; 1084 pageBlock.style.marginRight = "5px"; 1085 for (let i of scanRes) { 1086 i.style.display = "inline-block"; 1087 i.style.marginLeft = "5px"; 1088 i.style.marginRight = "5px"; 1089 } 1090 } 1091 1092 /* fix font color on older sites */ 1093 if(jQuery("#cartData").css("background-color")=="rgb(35, 36, 37)"){ 1094 jQuery("#cartData").css("color","white"); 1095 } 1096 });</script>
1096<style>.ui-datepicker-trigger{display:none}</style><div id="cartPopover"><div id="ioCartLoadingOverlay" aria-hidden="true"><div class="io-spinner" role="status" aria-live="polite" aria-label="Loading"></div></div><div id="triangle"></div><div id="cartCalendarTimePickerContainer"><div id="cartCalendar"></div><div id="cartTimePicker"><div id="div-overnight"> Days <select style="color:black;" name="whatday" id="whatday" onchange="endDisplay();"><option value="Same Day" selected="selected">Single Day</option><option value="Overnight">Overnight</option><option value="Multi-Day">Multi-Day</option> </select></div> <br><div id="ioCartTimeSelectContainer"><div> <span class="calTimeLabel calTimeLabelStart">Start</span> <i class="fas fa-calendar-check"></i> <input type="text" name="dateStart" class="ioCartDateInput" readonly="readonly" /> <i class="fas fa-clock"></i> <input type="text" name="timeStart" class="timepicker" style="width:75px;" /></div><div> <span class="calTimeLabel calTimeLabelEnd">End</span> <i class="fas fa-calendar-check"></i> <input type="text" name="dateEnd" class="ioCartDateInput" readonly="readonly" /> <i class="fas fa-clock"></i> <input type="text" name="timeEnd" class="timepicker" style="width:75px;" /></div></div> <br><div id="ioDeliveryMethodContainer" style="display:none; text-align: center;"></div> <br><div id="ioAdditonalInformationContainer" style="display:none; text-align: center;"><div class="io_info_modal_data_container" id="io_info_modal_address"> <label for="address" id="io_iml_address_label" style="width:105px"> Street Address </label> <input class="io_modal_input_address" style="margin-left:5px" id="io_im_address" name="address" type="text"></input> <br></div><div class="io_info_modal_data_container" id="io_info_modal_city"> <label for="city" id="io_iml_city_label" style="width:105px"> City </label> <input class="io_modal_input_city" style="margin-left:5px" id="io_im_city" name="city" type="text"></input> <br></div><div class="io_info_modal_data_container" id="io_info_modal_zip"> <label for="zip" id="io_iml_zip_label" style="width:105px"> Zip Code </label> <input class="io_modal_input_zip" id="io_im_zip" style="margin-left:5px" name="zip" type="text"></input></div></div> <br><div class="elementor-widget-button" style="padding:10px;display:inline-block;"> <a onclick="calApply()" href="javascript:;" 1097 class="elementor-button-link elementor-button elementor-size-sm elementor-animation-grow" 1098 style="text-decoration: none;">Apply</a></div><div class="elementor-widget-button" style="padding:10px;display:inline-block;"> <a onclick="calCancel()" href="javascript:;" 1099 class="elementor-button-link elementor-button elementor-size-sm elementor-animation-grow simpleCart_cancel" 1100 style="text-decoration: none;">Cancel</a></div></div><div id="cartDateRange" class="ioDateRange" onclick="calSetDateRange(1)" style="display:none;"></div><div class="changeDateLinkWrapper elementor-widget-button"><div id="changeDateLink" onclick="calSetDateRange(1)" class="elementor-button elementor-animation-grow">Change Date</div></div></div><div id="cartPartyBuilderEmailContainer" style="display:none;text-align:center"><p>Provide an email address here to recieve our free party planner!</p> <input type="text" id="cartPartyBuilderEmailInput"><div class="elementor-widget-button" style="display:inline-block;"> <a onclick="io_party_planner_email_submit()" href="javascript:;" class="elementor-button-link elementor-button elementor-size-sm" style="padding: 6px 15px;text-decoration: none;">Go</a></div><div id="cartPartyBuilderEmailWarning" style="display:none">Pleave provide a valid email address.</div> <br><br></div><div id="cartCustomMessage" style="display:none;text-align:center"></div><div id="cartWarning" class="clearfix"></div><div id="deliveryMethodWarning" class="clearfix">Some items are not available for the selected delivery method.</div> <span class="io_locationRedirectLink">You may not be on the correct site. Click here to change location.</span><div id="cartData" class="clearfix"><div class="simpleCart_items"></div></div><div class="cartSubtotalBox"> Subtotal (estimate):<div id="cartSubtotal"></div></div><div class="checkDeliveryCartContainer"><div id="checkDeliveryMessage" class="cartDeliverytotalBox"><a class="cartLink" href="javascript:;" onClick="showAddressEntry(true)">Check Delivery</a></div><div id="deliverSubtotalContainer" class="cartDeliverytotalBox"> Delivery Fee (<span><a class="cartLink" href="javascript:;" onClick="showAddressEntry(true)">Change Address</a></span>):<div id="deliverySubtotal"></div></div></div><div id="cartCheckoutButton" class="clearfix"><div class="elementor-widget-button"> <a href="javascript:cartHide();
1100" class="simpleCart_continue elementor-button elementor-size-sm elementor-animation-grow io_button">Continue Shopping</a> <a href="javascript:;" class="simpleCart_checkout elementor-button elementor-size-sm elementor-animation-grow io_button">Checkout</a></div><div id="cart-carousel-container" style="display:none"> <label> Some items you may be interested in: </label> <br><div class="cart-carousel"></div></div><div class="ioLink"><a href="https://www.inflatableoffice.com" target="_blank">powered by io</a></div></div></div>
1100<script>/* configurable globals */ 1101 var start_default = "11:00 am"; 1102 if(io_default_start_time != "") start_default = io_default_start_time; 1103 var end_default = "3:00 pm"; 1104 if(io_default_end_time != "") end_default = io_default_end_time; 1105 1106 if(io_user_currency){ 1107 var currency = io_user_currency; 1108 } else{ 1109 var currency = "USD"; 1110 } 1111 1112 if(io_user_country){ 1113 var country = io_user_country; 1114 } else{ 1115 var country = "US"; 1116 } 1117 1118 1119 var timeFormat = "g:i a"; 1120 if(io_cart_time_format != "") timeFormat = io_cart_time_format; 1121 var dateFormat = "m/d/yy"; 1122 if(io_cart_date_format != "") dateFormat = io_cart_date_format; 1123 1124 var restrictTimes = false; 1125 if(io_restrict_times === "on") restrictTimes = true; 1126 var restrictTimeStart = start_default; 1127 if(io_restrict_time_start != "") restrictTimeStart = io_restrict_time_start; 1128 var restrictTimeEnd = end_default; 1129 if(io_restrict_time_end != "") restrictTimeEnd = io_restrict_time_end; 1130 1131 1132 var multi_day = true; 1133 if(io_multidayquote === "off" || io_cartdayselect == "Single Day") multi_day = false; 1134 var in_cart_upsell = false; 1135 if(io_incartupsell === "on") in_cart_upsell = true; 1136 var io_distance_charge = false; 1137 if(io_distancecharge === "on") io_distance_charge = true; 1138 1139 /* other globals */ 1140 var pallet_color1 = ""; /* set in onready */ 1141 /* track the date start/end of calendar clicking */ 1142 var click_count = 0; 1143 1144 /* for configuring upsell carosel in cart */ 1145 var cart_carousel_set = false; 1146 1147 /* for checking when we remove an item from the cart */ 1148 var last_remove = 0; 1149 var last_upsell_call = 0; 1150 1151 /* for buffering cart qty changes checkAvail calls for qty change only */ 1152 var last_checkAvail_call = 0; 1153 1154 /* for cart loading animation */ 1155 var io_cart_loading_active = false; 1156 var io_cart_loading_count = 0; 1157 var io_cart_loading_fallback_timer = null; 1158 1159 /*var start_default = "11:00"; 1160 var end_default = "15:00"; 1161 var currency = "EUR"; 1162 var timeFormat = "G:i"; 1163 var dateFormat = "d/m/yy";*/ 1164 1165 1166 /* For weekday weekend pricing */ 1167 var use_weekday_weekend = false; 1168 if(io_weekEndPrice == "on") use_weekday_weekend = true; 1169 1170 /* Accessory and Upsell Prices */ 1171 var show_accessory_price = false; 1172 if(io_accessory_price == "on") show_accessory_price = true; 1173 var show_upsell_price = false; 1174 if(io_upsell_price == "on") show_upsell_price = true; 1175 1176 /* For customer geolocation shortcode */ 1177 var storage_key = 'io_customer_location'; 1178 1179 /*<editor-fold defaultstate="collapsed" desc="On Ready">*/ 1180 jQuery(document).ready(function () { 1181 pallet_color1 = "var( --e-global-color-accent,green )"; 1182 if(pallet_color1=="rgba(0, 0, 0, 0)" || pallet_color1=="rgb(255, 255, 255)") pallet_color1="rgb(25, 147, 35)"; 1183 1184 /*<editor-fold defaultstate="collapsed" desc="SimpleCart Init">*/ 1185 simpleCart({ 1186 currency: currency, 1187 cartColumns: [{ 1188 view: "image", 1189 attr: "image", 1190 label: "Image" 1191 }, 1192 { 1193 attr: "name", 1194 label: "Name" 1195 }, 1196 { 1197 attr: "encoded", 1198 label: false 1199 }, 1200 { 1201 attr: "rentalid", 1202 label: false 1203 }, 1204 { 1205 attr: "availability", 1206 label: false 1207 }, 1208 { 1209 view: "decrement", 1210 label: false, 1211 text: "<i class='fas far fa-minus-square' style='color:" + pallet_color1 + "'></i>" 1212 }, 1213 { 1214 view: "calculate_area", 1215 label: false 1216 }, 1217 { 1218 view:"input", 1219 attr:"quantity" 1220 1221 }, 1222 { 1223 attr: "qtyincrement", 1224 label: false 1225 }, 1226 { 1227 attr: "inputtype", 1228 label: false 1229 }, 1230 { 1231 attr: "qtytype", 1232 label: false 1233 }, 1234 { 1235 attr: "vendorid", 1236 label: false 1237 }, 1238 { 1239 view: "increment", 1240 label: false, 1241 text: "<i class='fas far fa-plus-square' style='color:" + pallet_color1 + "'></i>" 1242 }, 1243 { 1244 attr: "price", 1245 label: "Price", 1246 view: 'currency' 1247 }, 1248 { 1249 view: "remove", 1250 label: false,
1251 text: "<i class='fas fa-trash' style='color:" + pallet_color1 + "'></i>" 1252 }, 1253 { 1254 attr: "total", 1255 label: "SubTotal", 1256 view: 'currency' 1257 }, 1258 { 1259 attr: "timeslots", 1260 label: false 1261 }, 1262 { 1263 attr: "timeslots-orig", 1264 label: false 1265 }, 1266 { 1267 attr: "href", 1268 label: false 1269 }, 1270 { 1271 attr: "linkqty", 1272 label: false 1273 }, 1274 { 1275 attr: "acc_dd_parent_limit", 1276 label: false 1277 } 1278 ], 1279 checkout: { 1280 type: "SendForm", 1281 method: "GET", 1282 url: io_wp_local_path+"/io_quoteform/", 1283 extra_data: { 1284 /* name: decodeURIComponent("300 Conover Dr".replace(/[+]/gi, " ")), */ 1285 clear_rentals: "1", 1286 selected_only: "1", 1287 wp_checkout: "1", 1288 startdate: "", 1289 enddate: "", 1290 starttime: "", 1291 endtime: "", 1292 io_custguid: "" 1293 } 1294 } 1295 }); 1296 1297 simpleCart.bind('update', cart_onUpdate); 1298 simpleCart.bind('beforeSave', cart_hideTimepickerWrapper); 1299 simpleCart.bind('beforeRemove', cart_beforeRemove); 1300 simpleCart.bind('afterRemove', cart_afterRemove); 1301 simpleCart.bind('afterQtyChange', cart_afterQtyChange); 1302 simpleCart.bind('beforeCheckout', cart_beforeCheckout); 1303 simpleCart.bind('afterAdd', cart_afterAdd); 1304 simpleCart.bind('beforeAdd', cart_beforeAdd); 1305 simpleCart.bind('load', cart_afterLoad) 1306 /*</editor-fold>*/ 1307 1308 /* showAvail(""); */ 1309 let io_star_pic = document.querySelector("#io_star_pic"); 1310 if (io_star_pic != null) { 1311 let io_star_src = io_star_pic.src; 1312 if (io_star_src.indexOf("0star") > -1 || io_star_src.indexOf("1star") > -1 || io_star_src.indexOf("2star") > -1 || 1313 io_star_src.indexOf("3star") > -1) { 1314 io_star_pic.style.display = "none"; 1315 } 1316 } 1317 1318 /*<editor-fold desc="Build Thumb Images">*/ 1319 /* build multiple thumb images */ 1320 1321 /*</editor-fold>*/ 1322 1323 /*<editor-fold desc="Set up Accessories">*/ 1324 /* Add Add To Cart Buttons */ 1325 let button_add = document.querySelector("#bookNowBtn"); 1326 var main_id = 0; 1327 if(jQuery(".io_product_container .item_rentalid")){ 1328 main_id = jQuery(".io_product_container .item_rentalid").first().text(); 1329 } 1330 /* if main item is dd but not pkg (linen code) */ 1331 if(jQuery(".io_acc_accessorydd").text()==1 && jQuery(".io_acc_ispackage").text()!=1){ 1332 /* if order is defined, then reorder here. */ 1333 var acc_cls = jQuery('.io_product_accessories') 1334 acc_cls.hide(); 1335 let pkg = document.querySelector(".io_product_acc_pkg"); 1336 if(pkg==undefined){ 1337 pkg = document.createElement("div"); 1338 pkg.classList.add("io_product_acc_pkg"); 1339 pkg.style.textAlign = "center"; 1340 acc_cls.after(pkg); 1341 } 1342 for (let [key, value] of acc_obj_relate) { 1343 elem = getAccElem(key,main_id); 1344 if(elem){ 1345 btn = makeAccBtn(elem,main_id); 1346 pkg.append(btn); 1347 } 1348 1349 } 1350 let line = document.createElement("div"); 1351 line.innerHTML = "<br>"; 1352 pkg.append(line.cloneNode(true)); 1353 for (let [key, value] of acc_obj_relate) { 1354 for (key2 in acc_obj_relate.get(key)) { 1355 if(Object.keys(value[key2]).length > 0){ 1356 /* 3rd level */ 1357 pkg.append(line.cloneNode(true)); 1358 for (key3 in acc_obj_relate.get(key)[key2]) { 1359 elem = getAccElem(key3,key2); 1360 if(elem){ 1361 btn = makeAccBtn(elem,key2); 1362 btn.style.display = "none"; 1363 pkg.append(btn); 1364 } 1365 } 1366 }else{ 1367 elem = getAccElem(key2,key); 1368 if(elem){ 1369 btn = makeAccBtn(elem,key); 1370 btn.style.display = "none"; 1371 pkg.append(btn); 1372 } 1373 1374 } 1375 } 1376 } 1377 }else { 1378 let access_array = document.querySelectorAll(".io_acc_li"); 1379 let count = 0; 1380 for (let i of access_array) { 1381 let path = i.id.replace("io_acc_",""); 1382 count++; 1383 let newButton = button_add.cloneNode(true); 1384 newButton.id = button_add.id + count; 1385 newButton.classList.remove("elementor-animation-grow"); 1386 newButton.classList.add("elementor-animation-shrink"); 1387 1388 let path_arr = path.split("_"); 1389 let pid = parseInt(path_arr[0]); 1390 let this_id = parseInt(path_arr[1]); 1391 if(path_arr.length==1) pid=0; 1392 1393 if(jQuery("#io_acc_accessorydd_"+path).first().text()==1){ 1394 /* display different to provide choices in dd */ 1395 //main_id = pid; 1396 }else{ 1397 /* hide accessories inside a pkg when under an accessory choice item until clicked */ 1398 if(jQuery("#io_acc_accessorydd_"+main_id+"_"+pid).first().text()==1){ 1399 }else{ 1400 /* jpa - not finished/tested yet */ 1401 /*jQuery("#io_acc_"+path).hide();*/ 1402 } 1403 /* Fix broken images for accessories. */ 1404 let img_box = document.querySelectorAll(".io_acc_li_img_thumb"); 1405 let firstImg = true; 1406 let lastAcc = ""; 1407 for (let i of img_box) { 1408 if(lastAcc=="") lastAcc = i.id;
1409 if(lastAcc!=i.id){ 1410 lastAcc = i.id; 1411 firstImg = true; 1412 } 1413 let io_img_src = i.src; 1414 if(io_img_src!==null) io_img_src = io_img_src.toLowerCase(); 1415 let io_img_datasrc = i.getAttribute("data-src"); 1416 if(io_img_datasrc===null){ 1417 io_img_datasrc = ""; 1418 }else{ 1419 io_img_datasrc = io_img_datasrc.toLowerCase(); 1420 } 1421 if ((io_img_src.indexOf("io_noimage.png") >= 0 || io_img_datasrc.indexOf("io_noimage.png") >= 0) || (io_img_src.indexOf(".jpg") == -1 && io_img_src.indexOf(".jpe") == -1 && io_img_src.indexOf(".png") == -1 && io_img_src.indexOf(".gif") == -1 && io_img_src.indexOf(".tif") == -1 && io_img_src.indexOf(".webp") == -1)){ 1422 i.style.display = "none"; 1423 }else if(!firstImg && jQuery("#io_acc_accessorydd_"+main_id+"_"+pid).first().text()!=1){ 1424 i.style.display = "none"; 1425 } 1426 firstImg = false; 1427 } 1428 if(jQuery("#io_acc_accessorydd_"+main_id+"_"+pid).first().text()==1){ 1429 /* Make the accessory category look more mike a label. */ 1430 jQuery("#iothumb_"+main_id+"_"+pid).hide(); 1431 jQuery("#io_acc_"+main_id+"_"+pid).css("border", "none"); 1432 jQuery("#io_acc_"+main_id+"_"+pid).css("width", "100%"); 1433 jQuery("#io_acc_"+main_id+"_"+pid).css("margin-bottom", "5vh"); 1434 jQuery("#io_acc_"+main_id+"_"+pid).css("box-shadow", "none"); 1435 jQuery("#io_acc_shortname_"+pid).css("font-weight", "bold"); 1436 jQuery("#io_acc_shortname_"+pid).css("position", "absolute"); 1437 /* Make this auto selected to fix an issue where we can not add to cart if this item is 1438 a child of another hidden accessory on screen */ 1439 jQuery("#io_acc_"+main_id+"_"+pid).prop("selected", true); 1440 accessory_cat_text = jQuery("#io_acc_shortname_"+pid).first().text(); 1441 /* This is necessary to make sure there are not multiple colons. */ 1442 if(!accessory_cat_text.includes(":")){ 1443 jQuery("#io_acc_shortname_"+pid).text(accessory_cat_text+":"); 1444 } 1445 /* Remove Href so we do not open images on click for dd accessories. */ 1446 jQuery("[id^=io_acc_imgbig_"+pid+"_]").removeAttr("href"); 1447 1448 /* Get the accessory limit for this set of acessories, then set up click events. */ 1449 /* Unbind is used to prevent cascading calls. */ 1450 accLmt = parseInt(jQuery("#io_acc_accessorylimit_"+main_id+"_"+pid).prop("textContent")); 1451 jQuery("[id^=io_acc_"+pid+"_]").unbind("click").click({pid: pid, accLmt: accLmt}, accDDClicked); 1452 jQuery("[id^=io_acc_"+pid+"_]").css("cursor", "pointer"); 1453 /* Set up the slected property of all children accessories. Default to false. */ 1454 jQuery("[id^=io_acc_"+pid+"_]").prop("selected", false); 1455 /* We need to add a hidden button so we can simulate a click on add_item for the cart. */ 1456 let newButton = button_add.cloneNode(true); 1457 newButton.id = button_add.id + count; 1458 newButton.classList.remove("elementor-animation-grow"); 1459 newButton.setAttribute("style", "display: none !important"); 1460 i.appendChild(newButton); 1461 }else{ 1462 let button_wrap = document.createElement("div"); 1463 button_wrap.classList.add("elementor-widget-button"); 1464 button_wrap.classList.add("io_access_button"); 1465 button_wrap.appendChild(newButton); 1466 let req = false; 1467 if(jQuery("#io_acc_required_"+path).first().text()>0) req = true; 1468 if(!req){ 1469 i.appendChild(button_wrap); 1470 }else{ 1471 var textnode = document.createTextNode("Included"); 1472 i.appendChild(textnode); 1473 } 1474 } 1475 } 1476 } 1477 } 1478 /*</editor-fold>*/ 1479 1480 let upsell_array = document.querySelectorAll(".io_upsell_li"); 1481 count = 0; 1482 for (let i of upsell_array) { 1483 count++; 1484 let newButton = button_add.cloneNode(true); 1485 newButton.id = button_add.id + count; 1486 newButton.classList.remove("elementor-animation-grow"); 1487 newButton.classList.add("elementor-animation-shrink"); 1488 1489 let button_wrap = document.createElement("div"); 1490 button_wrap.classList.add("elementor-widget-button"); 1491 button_wrap.classList.add("io_upsell_button"); 1492 button_wrap.appendChild(newButton); 1493 i.appendChild(button_wrap); 1494 } 1495 1496 if(io_deliverymethod == "on" && jQuery(".calDeliveryMethodLabel").length==0){ 1497 let delivery_method_container = jQuery("#ioDeliveryMethodContainer").first(); 1498 delivery_method_container.append('<span class="calDeliveryMethodLabel">Select Delivery Method</span>'); 1499 let delivery_method_html = '<select class="ioDeliveryMethods" onchange="deliveryMethodSelected()">'; 1500 let delivery_methods = Object.keys(io_delivery_methods) 1501 for(const index in delivery_methods){ 1502 if(!io_delivery_methods_restrict){ 1503 delivery_method_html += '<option value="'+delivery_methods[index]+'">'+delivery_methods[index]+'</option>'; 1504 if(index == 0 && !getCookie("io_delivery_method")) setCookie("io_delivery_method", delivery_methods[index], 14); 1505 }else if( !io_delivery_methods_restrict.includes( io_delivery_methods[ delivery_methods[index] ]["id"] ) ){ 1506 delivery_method_html += '<option value="'+delivery_methods[index]+'">'+delivery_methods[index]+'</option>'; 1507 if(index == 0 && !getCookie("io_delivery_method")) setCookie("io_delivery_method", delivery_methods[index], 14); 1508 } 1509 } 1510 delivery_method_container.append(delivery_method_html); 1511 delivery_method_container.show(); 1512 if(getCookie("io_delivery_method")){ 1513 jQuery(".ioDeliveryMethods").val(getCookie("io_delivery_method")); 1514 } 1515 }else{
1516 setCookie("io_delivery_method", "", 14); 1517 } 1518 1519 let allow_same_day = 1; 1520 if(io_cartAllowSameDay == "on"){ 1521 allow_same_day = 0; 1522 } 1523 1524 /*<editor-fold desc="Cart Calandar and Time Settings Setup">*/ 1525 //var fullmonth_array = jQuery.datepicker.regional["en"].monthNames; 1526 jQuery("#cartCalendar").datepicker({ 1527 changeMonth: true, 1528 changeYear: true, 1529 //monthNamesShort : fullmonth_array, 1530 dateFormat: dateFormat, 1531 rangeSelect: true, 1532 numberOfMonths: 1, 1533 stepMonths: 1, 1534 prevText: "<< Previous Months", 1535 nextText: "Next Months >>", 1536 speed: "fast", 1537 showOn: "both", 1538 onChangeMonthYear: cal_onChangeMonthYear, 1539 onSelect: cal_onSelect, 1540 buttonText: "Calendar", 1541 minDate: allow_same_day, 1542 firstDay: 0 1543 }); 1544 jQuery(".ui-datepicker-trigger").hide(); 1545 if(restrictTimes){ 1546 jQuery(".timepicker").timepicker({ 1547 startTime: new Date(0, 0, 10, 0, 0, 0), 1548 endTime: new Date(0, 0, 0, 20, 0, 0, 0), 1549 minTime:restrictTimeStart, 1550 maxTime:restrictTimeEnd, 1551 /*show24Hours: $show24Hours,*/ 1552 timeFormat: timeFormat, 1553 separator: ":", 1554 className: "elementor-widget-text-editor", 1555 step: 15, 1556 disableTouchKeyboard: true 1557 }).keypress(function(e){ 1558 e.preventDefault(); 1559 }); 1560 } else{ 1561 jQuery(".timepicker").timepicker({ 1562 startTime: new Date(0, 0, 10, 0, 0, 0), 1563 endTime: new Date(0, 0, 0, 20, 0, 0, 0), 1564 /*show24Hours: $show24Hours,*/ 1565 timeFormat: timeFormat, 1566 separator: ":", 1567 className: "elementor-widget-text-editor", 1568 step: 15, 1569 disableTouchKeyboard: true 1570 }); 1571 } 1572 1573 /* if we have company wide timeslots, alter time select in cart. Do this only if we are set to single day only */ 1574 if(io_company_timeslots.length != 0 && io_cartdayselect == "single_day"){ 1575 let time_select_container = jQuery("#ioCartTimeSelectContainer").first(); 1576 time_select_container.empty(); 1577 let selected_date_html = '<span style="margin-right: 5px !important" class="calTimeLabel">Date</span><i class="fas fa-calendar-check"></i><input style="margin-left: 5px !important" type="text" name="dateStart" class="ioCartDateInput" readonly="readonly" /><input style="display: none !important" type="text" name="dateEnd" class="ioCartDateInput" readonly="readonly" />' 1578 time_select_container.append(selected_date_html); 1579 time_select_container.append("<br>") 1580 time_select_container.append('<span class="calTimeLabel">Select Timeslot</span>'); 1581 let timeslot_html = '<select class="ioCartCompanyTimeslots">'; 1582 for(i=0; i<io_company_timeslots.length; ++i){ 1583 timeslot_html += io_company_timeslots[i]; 1584 } 1585 timeslot_html += "</select>" 1586 time_select_container.append(timeslot_html); 1587 1588 } 1589 1590 // Timeslot element on Quote Form 1591 const timeslotSelectElement = jQuery(".controls select[name=timeslot]"); 1592 1593 /* jQuery( ".datepicker" ).datepicker({dateFormat: "m/d/yy",minDate:0}); */ 1594 /* jQuery( ".datepicker" ).val(getCookie("checkDate")); */ 1595 start_date = getCookie("io_dateStart"); 1596 end_date = getCookie("io_dateEnd"); 1597 start_time = getCookie("io_timeStart"); 1598 end_time = getCookie("io_timeEnd"); 1599 jQuery("input[name=dateStart]").val(start_date); 1600 jQuery("input[name=dateEnd]").val(end_date); 1601 if(io_company_timeslots.length != 0 && io_cartdayselect == "single_day" && getCookie("io_company_timeslot_selected")){ 1602 jQuery(".ioCartCompanyTimeslots").val(getCookie("company_timeslot_selected")); 1603 // Set it on the quote page too. 1604 timeslotSelectElement.val(getCookie("io_company_timeslot_selected")); 1605 } else{ 1606 jQuery("input[name=timeStart]").val(start_time); 1607 jQuery("input[name=timeEnd]").val(end_time); 1608 } 1609 1610 timeslotSelectElement.on('change', function() { 1611 // IO-31167: Upon timeslot change on Quote Form, 1612 // update timeslot cookie value for persistence 1613 if(this.value) { 1614 setCookie('io_company_timeslot_selected', this.value, 14); 1615 } 1616 }); 1617 1618 if (jQuery("input[name=dateEnd]").val() != "") {
1619 setCalBackground(); 1620 jQuery("#cartSubtotal").html(simpleCart.toCurrency(simpleCart.total())); 1621 if(getCookie("io_dateApplied") === "true") calCancel(); 1622 else { 1623 jQuery("input[name=dateStart]").val(getCookie("io_dateStart")); 1624 jQuery("input[name=dateEnd]").val(getCookie("io_dateEnd")); 1625 if(io_company_timeslots.length != 0 && io_cartdayselect == "single_day" && getCookie("io_company_timeslot_selected")){ 1626 jQuery(".ioCartCompanyTimeslots").val(getCookie("io_company_timeslot_selected")); 1627 } 1628 else if(io_force_blank_timepickers == "on") 1629 { 1630 setCookie("io_timeStart", "", 14); 1631 setCookie("io_timeEnd", "", 14); 1632 jQuery('[name=timeStart]').val(""); 1633 jQuery('[name=timeEnd]').val(""); 1634 } 1635 else{ 1636 jQuery("input[name=timeStart]").val(getCookie("io_timeStart")); 1637 jQuery("input[name=timeEnd]").val(getCookie("io_timeEnd")); 1638 } 1639 1640 jQuery(".changeDateLinkWrapper").hide(); 1641 } 1642 } 1643 /*</editor-fold>*/ 1644 1645 jQuery("#io-dialog").dialog({ 1646 autoOpen: false, 1647 resizable: false, 1648 modal: true, 1649 dialogClass: "noTitleStuff", 1650 width: 350, 1651 open: function () { 1652 jQuery(".ui-widget-overlay").bind("click", function () { 1653 jQuery("#io-dialog").dialog("close"); 1654 }) 1655 } 1656 }); 1657 1658 /* change jquery calendar next/prev buttons to fa arrows w/matching site color */ 1659 jQuery("#cartCalendar .ui-datepicker-prev").addClass("fas fa-arrow-left").css("color", pallet_color1); 1660 jQuery("#cartCalendar .ui-datepicker-next").addClass("fas fa-arrow-right").css("color", pallet_color1); 1661 1662 /* hide sections if not set */ 1663 if(jQuery(".io_product_circuits_right").first().text()=="0"){jQuery(".io_product_circuits_right,.io_product_circuits_left").hide();} 1664 if(jQuery(".io_city_list").html()==""){jQuery(".io_landingpages").hide();} 1665 /* using this instead as it will handle custom ones added */ 1666 let io_field_valbox = document.querySelector(".io_product_infobox"); 1667 if (io_field_valbox != null || io_field_valbox != undefined) { 1668 let io_field_valarr = io_field_valbox.querySelectorAll(".io_product_detail_box"); 1669 for (let i of io_field_valarr) { 1670 let check = i.querySelector("p:nth-child(2)"); 1671 if (check != null && check.innerText == "") i.style.display = "none"; 1672 } 1673 } 1674 1675 /* Hide description if there is no description */ 1676 desc_box = document.querySelector(".io_product_desc") 1677 if(desc_box != null && desc_box.innerText.length == 0 && desc_box.innerHTML.length == 0){ 1678 desc_detail_box = desc_box.parentElement; 1679 desc_detail_box.style.display = "none"; 1680 } 1681 1682 if(document.querySelector(".io_product_reviewbox")!=null){ 1683 if (document.querySelector(".io_product_reviewbox").innerText == "") { 1684 if(document.querySelector(".io_star_rating")!=null) document.querySelector(".io_star_rating a").style.display = "none"; 1685 } 1686 } 1687 1688 let rid = jQuery(".io_product_container .item_rentalid").first().text(); 1689 let regex = new RegExp("^io_product_price_.*_" + rid + "$"); 1690 for (const price_index in io_prices){ 1691 if(regex.test(io_prices[price_index])){ 1692 use_weekday_weekend = false; 1693 } 1694 } 1695 1696 /* hide end date input. */ 1697 if(!multi_day){ 1698 /* TODO: Need to wait and see if this is necessary. If so needs to be more involved than this. */ 1699 /* jQuery("input[name=dateEnd]").style("visibility", "hidden"); */ 1700 } 1701 /* Call page avail now so we can display live price if its enabled */ 1702 setTimeout(function(){ 1703 if(jQuery(".io_acc_accessorydd").text()==1 && jQuery(".io_acc_ispackage").text()!=1){ 1704 jQuery("#bookNowBtn").removeClass("item_add").addClass("item_add_off").trigger("classChange"); 1705 checkAvailPageOnly(); 1706 }else{ 1707 checkAvailPageOnly(); 1708 } 1709 },50); 1710 1711 /* Adjust picbox for header heights */ 1712 setTimeout(adjustPicBoxForHeader,500); 1713 1714 /* Show buttons for distance charge check if the setting is on. Hide or show map button if applicable*/ 1715 if(io_distance_charge){ 1716 jQuery(".delivery_charge_check_container").show(); 1717 jQuery(".calc_price_with_map_container").hide(); 1718 jQuery(".checkDeliveryCartContainer").show(); 1719 } else { 1720 jQuery(".delivery_charge_check_container").hide(); 1721 jQuery(".calc_price_with_map_container").hide(); 1722 jQuery(".checkDeliveryCartContainer").hide(); 1723 } 1724 if(io_brand=="EH"){ 1725 jQuery(".delivery_charge_check_container").hide(); 1726 jQuery(".eh_additional_description").show(); 1727 } 1728 if(jQuery(".io_product_infobox .item_inputtype").text() === "Map"){ 1729 jQuery(".delivery_charge_check_container").hide(); 1730 jQuery(".checkDeliveryCartContainer").hide(); 1731 jQuery(".calc_price_with_map_container").show(); 1732 } 1733 1734 /* If we have delivery set in cookie, be sure to show the charge in the cart. */ 1735 if(getCookie("io_deliveryFee") && simpleCart.items().length > 0) { 1736 setDeliverySubtotal(getCookie("io_deliveryFee")); 1737 jQuery("#deliverSubtotalContainer").show(); 1738 jQuery("#checkDeliveryMessage").hide(); 1739 } else{ 1740 jQuery("#deliverSubtotalContainer").hide(); 1741 } 1742 1743 /* moved back here for IO-22561 */ 1744 if(simpleCart.items().length > 0){ 1745 let headerBookButton = jQuery("a[href$='io_quoteform/']"); 1746 headerBookButton.addClass("ioCart_link"); 1747 headerBookButton.attr("href", "javascript:;"); 1748 } 1749 jQuery(".cartInfo").unbind("click").one("click", function(event){ 1750 event.stopPropagation(); 1751 event.stopImmediatePropagation(); 1752 cartShow(); 1753 }); 1754 jQuery(".ioCart,.ioCart_link").unbind("click").one("click", function(event){ 1755 event.stopPropagation(); 1756 event.stopImmediatePropagation(); 1757 cartShow(); 1758 }); 1759 1760 /* hide if click outside cart */ 1761 jQuery(document).mouseup(function(e){ 1762 var container = jQuery("#cartPopover"); 1763 var cartButton = jQuery(".cartInfo, .ioCart, .ioCart_link"); 1764 var addButton = jQuery(".item_add"); 1765 var timePicker = jQuery(".ui-timepicker-wrapper"); 1766 1767 if(jQuery(".cartInfo, .ioCart, .ioCart_link").hasClass("open")){ 1768 if(!container.is(e.target) && container.has(e.target).length === 0 && !cartButton.is(e.target) && cartButton.has(e.target).length === 0 && !addButton.is(e.target) && addButton.has(e.target).length === 0 && !timePicker.is(e.target) && timePicker.has(e.target).length === 0 && !jQuery(".address_entry").is(e.target) && jQuery(".address_entry").has(e.target).length === 0){ 1769 cartHide(); 1770 } 1771 } 1772 }); 1773 1774 if(!getCookie("io_state") && io_default_state){
1775 setCookie("io_state", io_default_state, 14); 1776 } 1777 if(country != "US") { 1778 jQuery("#io_cd_state").replaceWith('<input id="io_cd_state" style="display: table-cell" name="state" type="text"></input>'); 1779 jQuery("#io_cdl_zip_label").text("Postal code"); 1780 if(country == "CA"){ 1781 jQuery("#io_cdl_state_label").text("Province"); 1782 } else if(country == "AU"){ 1783 jQuery("#io_cdl_city_label").text("Suburb"); 1784 } 1785 } else{ 1786 jQuery("#io_cd_zip").attr("type", "number"); 1787 } 1788 /* Set up on change events to stop end timepickers from allowing users to pick times before start time */ 1789 setTimeout(restrictEndTimepickers, 500); 1790 if(io_hide_end_time == "on" && io_default_duration > 0){ 1791 jQuery('[name="timeEnd"]').parent().hide(); 1792 // Hide end time stuff on checkout page and in the text. 1793 jQuery(".io_event_body_time .control-group:nth-child(2)").hide(); 1794 jQuery(".io_event_body_time_display_text").text(jQuery(".io_event_body_time_display_text").text().replace(/\s*→.*/, "")) 1795 jQuery('[name="timeStart"]').change(function(){ 1796 const regex = /^(\d{1,2}):(\d{2})(?:\s*([AP]M))?$/i; 1797 const match = this.value.match(regex); 1798 1799 let hours = parseInt(match[1], 10); 1800 const minutes = parseInt(match[2], 10); 1801 const period = match[3] ? match[3].toUpperCase() : null; 1802 1803 if (period) { 1804 if (period === "PM" && hours !== 12) hours += 12; 1805 if (period === "AM" && hours === 12) hours = 0; 1806 } 1807 1808 const baseDate = new Date(1970, 0, 1, hours, minutes); 1809 const newTime = new Date(baseDate.getTime() + io_default_duration * 3600000); 1810 1811 if (period) { 1812 // 12-hour 1813 let newHours = newTime.getHours(); 1814 const newMinutes = newTime.getMinutes(); 1815 const newPeriod = newHours >= 12 ? "PM" : "AM"; 1816 newHours = newHours % 12; 1817 if (newHours === 0) newHours = 12; 1818 let end_time = `${newHours}:${newMinutes.toString().padStart(2, "0")} ${newPeriod}`; 1819 jQuery('[name="timeEnd"]').val(end_time); 1820 } else { 1821 // 24 hour 1822 let end_time = `${newTime.getHours().toString().padStart(2, "0")}:${newTime.getMinutes().toString().padStart(2, "0")}`; 1823 jQuery('[name="timeEnd"]').val(end_time); 1824 } 1825 }); 1826 } 1827 1828 /* If we have a custom message in cart, display it. */ 1829 if(io_cart_message){ 1830 show_cart_message(); 1831 } 1832 1833 /* code for day select in cart */ 1834 if(io_cartdayselect == "dropdown_options" && io_multidayquote === "on"){ 1835 saved_whatday = getCookie("io_whatday"); 1836 if(saved_whatday) jQuery("#whatday").val(saved_whatday); 1837 endDisplay(); 1838 setCalBackground(); 1839 } else{ 1840 jQuery("#div-overnight").hide(); 1841 jQuery("#whatday").val(""); 1842 } 1843 1844 checkRestrictedDeliveries() 1845 /* If we are using the information gathering tool, we do not want to show this message. */ 1846 if( live_pricing_is_on() && io_info_required == "off" ){ 1847 if(!event_time_set() && io_always_display_live_price != "on"){ 1848 jQuery("#item_live_price_time_set_message").show(); 1849 }else{ 1850 jQuery("#item_live_price_time_set_message").hide(); 1851 } 1852 } 1853 1854 1855 /* Check if information gathering header exists. If it does, Remove set even button and add some classes on onclicks */ 1856 if(jQuery("#ioInfoHeader").length){ 1857 remove_set_event_buttton(); 1858 add_classes_and_onClicks(); 1859 header_increment_step(); 1860 } 1861 1862 jQuery(".io_acc_li").each(function() { 1863 if(jQuery(this).find(".item_required").first().text() > 0 && jQuery(this).find(".item_accessorydd").first().text() == 1){ 1864 jQuery(jQuery(jQuery(this).parent()).prev()).appendTo(".io_product_requiredDD_accessories"); 1865 jQuery(jQuery(this).parent()).appendTo(".io_product_requiredDD_accessories"); 1866 jQuery(".io_product_requiredDD_accessories").show(); 1867 } 1868 }); 1869 1870 if(jQuery(".io_product_accessories .io_acc_li").length == 0) jQuery(".io_product_accessories").hide(); 1871 1872 /* Hide the cart add button for items with required accessories on category page */ 1873 jQuery(".item_hasRequiredAcc").each(function() { 1874 if (this.innerText == '1') { 1875 let rental_id_element = jQuery(this).parent().find(".item_rentalid")[0]; 1876 let addCartButton = jQuery(".io_item2_list_inner .add_cart_" + rental_id_element.innerText).find('.io_button'); 1877 addCartButton.removeClass("item_add"); 1878 addCartButton.html('<i class="fas fa-arrow-right"></i>'); 1879 1880 let itemHref = jQuery(this).parent().find(".item_href").text(); 1881 addCartButton.attr('href', itemHref); 1882 } 1883 }); 1884 1885 1886 /* If they have same day selection allowed, need to update checkout page datepicker on delay to make sure it works */ 1887 if(io_cartAllowSameDay == "on"){ 1888 setTimeout(allow_same_day_select_on_checkout, 500); 1889 } 1890 1891 if(io_info_required_data && io_info_required == "on"){ 1892 let io_required_data = io_info_required_data; 1893 jQuery("#ioAdditonalInformationContainer").show(); 1894 for (const [data, value] of Object.entries(io_required_data)) { 1895 if(value == 1){ 1896 jQuery("#io_info_modal_"+data).css("display", "inline-flex") 1897 jQuery("#io_im_"+data).val(getCookie(data)); 1898 } 1899 } 1900 show_or_hide_required_info_message() 1901 } 1902 if(jQuery(".bootstrap-timepicker").length == 0) { 1903 if (!/Mobi|Android/i.test(navigator.userAgent)) { 1904 jQuery("#cartPopover").scroll(function () { 1905 jQuery("[name=timeStart]").timepicker("hide"); 1906 jQuery("[name=timeEnd]").timepicker("hide"); 1907 }); 1908 jQuery(window).scroll(function () { 1909 jQuery("#cartPopover [name=timeStart]").timepicker("hide"); 1910 jQuery("#cartPopover [name=timeEnd]").timepicker("hide"); 1911 }); 1912 } 1913 } 1914 1915 if(jQuery(".io_product_infobox .item_inputtype").text() == "Map"){
1916 simpleCart.items().forEach(function (item, index){ 1917 if(item.get("rentalid") === jQuery(".io_product_infobox .item_rentalid").text()){ 1918 if(item.get("quantity") > 1){ 1919 let units; 1920 if(jQuery(".io_product_infobox .item_qtytype").text() == "Area"){ 1921 units = "sq meters" 1922 if(country === "US") units = "sq feet" 1923 }else if(jQuery(".io_product_infobox .item_qtytype").text() == "Perimeter"){ 1924 units = "meters" 1925 if(country === "US") units = "feet" 1926 } 1927 set_price_on_item_page(units, item.get("quantity")); 1928 } 1929 } 1930 }); 1931 } 1932 /* IO-21808 */ 1933 jQuery(".io_product_price_box").each(function() { 1934 let classes = jQuery(this).attr("class"); 1935 jQuery(this).attr("class", classes.replace(":", "_")); 1936 }); 1937 1938 /* Set time instructions (IO-21496) */ 1939 set_cart_time_instructions(); 1940 1941 if(io_accessory_select === "on"){ 1942 if(jQuery(".io_product_acc_pkg").children().length > 0){ 1943 let main_rental_id = jQuery(".item_rentalid").text(); 1944 let sel_div = jQuery("<div class=\"io_product_acc_pkg\" style=\"display:flex; margin-top:10px;\"></div>"); 1945 let sel = jQuery("<select class=\"io_product_acc_pkg\" onchange=\"accOnClick(this)\" />"); 1946 sel.append("<option value=\"\" selected=\"selected\" style=\"display:none\" disabled>Select one..</option>") 1947 jQuery("[id^=io_acc_shortname_"+main_rental_id+"]").each(function(){ 1948 sel.append("<option value="+this.id+">"+this.innerHTML+"</option>") 1949 if(this.id.split("_").length > 4){ 1950 let split_id = this.id.split("_"); 1951 let option_rental_id = split_id[split_id.length - 1]; 1952 let sel2 = jQuery("<select id=\"io_product_acc_pkg_sel_"+option_rental_id+"\" style=\"display:none; margin-left:5px;\" onchange=\"accOnClick(this)\" />"); 1953 sel2.append("<option value=\"\" selected=\"selected\" style=\"display:none\" disabled>Select one..</option>") 1954 jQuery("[id^=io_acc_shortname_"+option_rental_id+"_]").each(function(){ 1955 sel2.append("<option value="+this.id+">"+this.innerHTML+"</option>") 1956 }); 1957 sel_div.append(sel2); 1958 } 1959 }); 1960 sel_div.prepend(sel); 1961 jQuery(".io_product_acc_pkg").replaceWith(sel_div); 1962 } 1963 } 1964 if(io_cart_party_planner_email === "on" && io_cart_party_planner_destination){ 1965 jQuery("#cartPartyBuilderEmailContainer").show() 1966 if(getCookie("io_email")){ 1967 jQuery("#cartPartyBuilderEmailInput").val(getCookie("io_email")); 1968 } 1969 } 1970 1971 if(io_brand == "PW"){ 1972 jQuery(".io_product_price_box").attr("style", "display: none !important;"); 1973 jQuery(".io_product_price_sqfoot").attr("style", "display: grid !important;"); 1974 } 1975 1976 setTimeout(simpleCart.init, 100); 1977 if(io_hide_zero == 1){ 1978 jQuery(".io_product_price_top_left").each(function (){ 1979 if(Number(this.innerText.replace(/[^0-9.-]+/g,"")) == 0){ 1980 jQuery(this).parent().attr('style','display:none !important'); 1981 } 1982 }); 1983 jQuery(".io_product_price_left").each(function (){ 1984 if(Number(this.innerText.replace(/[^0-9.-]+/g,"")) == 0){ 1985 jQuery(this).parent().attr('style','display:none !important'); 1986 } 1987 }); 1988 } 1989 if (io_categoryVariantImages == 'on'){ 1990 jQuery(".io_category_thumbox").show(); 1991 jQuery('.view-product-button').addClass('view-product-button2') 1992 } 1993 let giftcard_value = jQuery(".item_giftcardvalue"); 1994 if(giftcard_value && giftcard_value.text()){ 1995 jQuery(".delivery_charge_check_container").hide(); 1996 } 1997 1998 if (io_customer_geolocation == 'on') initializeGeolocation(); 1999 }); /*end of on-ready*/ 2000 /*</editor-fold>*/ 2001 2002 /*<editor-fold defaultstate="collapsed" desc="Helper Functions">*/ 2003 function phraseUpdateCount(inputElement) 2004 { 2005 //read the text and strip out spaces 2006 const fullText = inputElement.value; 2007 const lettersOnly = fullText.replace(/\s+/g, ""); 2008 const count = lettersOnly.length; 2009 2010 const cookieKey = inputElement.classList[0]; 2011 2012 document.querySelector(".item_quantity").textContent = count; 2013
2014 setCookie(cookieKey, fullText, 45); 2015 } 2016 function io_party_planner_email_submit(){ 2017 let valid_regex = /^(([^<>()[\]\\.,;:\s@"]+(\.[^<>()[\]\\.,;:\s@"]+)*)|.(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/; 2018 let email = jQuery("#cartPartyBuilderEmailInput").val(); 2019 if(email){ 2020 if(email.match(valid_regex)){ 2021 setCookie("io_email", email, 14); 2022 window.open(io_cart_party_planner_destination, '_blank').focus(); 2023 }else{ 2024 jQuery("#cartPartyBuilderEmailWarning").show(); 2025 } 2026 }else{ 2027 jQuery("#cartPartyBuilderEmailWarning").show(); 2028 } 2029 } 2030 2031 function rid_in_batch(rid, batch_ids){ 2032 let result = batch_ids.filter(function(batch){ 2033 if(batch.includes(this)) return true; 2034 }, rid); 2035 return result 2036 } 2037 2038 function set_cart_time_instructions(){ 2039 /* Making it clearer that customers need to set the time in order to see pricing and availability. */ 2040 let instructions_container = jQuery("<p id=\"ioCartTimeInstructions\"></p>"); 2041 let instructions = ""; 2042 2043 if(multi_day){ 2044 instructions += "Select the event date or date range using the calendar"; 2045 }else{ 2046 instructions += "Select the event date using the calendar"; 2047 } 2048 instructions += "."; 2049 instructions_container.text(instructions); 2050 jQuery("#cartCalendar").append(instructions_container); 2051 } 2052 2053 function live_pricing_is_on(){ 2054 /* 2055 Checks to see if live pricing is on. Assumes it is on unless one of the following conditions: 2056 The setting Hide Live Price is off. 2057 The setting Show Weekend/Weekday Pricing is off. 2058 Delivery method pricing is enabled by default. 2059 We are on an item page that uses delivery method pricing. 2060 */ 2061 if(io_hide_live_prices != 1 || io_weekEndPrice != "on" || 2062 io_delivery_prices["default"].length != 0 || jQuery(".io_product_infobox .item_rentalid").innerText in io_delivery_prices["override"] || 2063 io_custom_prices["default"].length != 0 || jQuery(".io_product_infobox .item_rentalid").innerText in io_delivery_prices["override"]){ 2064 return false; 2065 } 2066 return true; 2067 } 2068 2069 function allow_same_day_select_on_checkout(){ 2070 jQuery(".jquery-datepicker").datepicker("option", "minDate", 0); 2071 } 2072 2073 function show_or_hide_required_info_message(){ 2074 if(io_info_required == "on"){ 2075 if(!all_info_provided()){ 2076 jQuery("#io_all_prices").hide(); 2077 jQuery("#item_additonal_info_open_message").show(); 2078 }else{ 2079 jQuery("#io_all_prices").show(); 2080 jQuery("#item_additonal_info_open_message").hide(); 2081 } 2082 } 2083 } 2084 2085 function all_info_provided(){ 2086 /* This is used for when the "Hide all pricing on page until information is provided" setting is on price settings. */ 2087 let all_data_provided = true; 2088 let io_required_data = io_info_required_data; 2089 for (const [data, value] of Object.entries(io_required_data)) { 2090 if(value == 1){ 2091 if(!getCookie(data)){ 2092 all_data_provided = false 2093 } 2094 } 2095 } 2096 2097 if(live_pricing_is_on() && !event_time_set()) { 2098 all_data_provided = false; 2099 } 2100 2101 return all_data_provided; 2102 } 2103 2104 function event_time_set(){ 2105 if(getCookie("io_timeStart") && 2106 getCookie("io_timeEnd") && 2107 getCookie("io_dateStart") && 2108 getCookie("io_dateEnd")){ 2109 return true; 2110 } else{ 2111 return false 2112 } 2113 } 2114 2115 function show_cart_message(){ 2116 message_container = jQuery("#cartCustomMessage"); 2117 message_container.html(io_cart_message); 2118 message_container.show(); 2119 } 2120 2121 function deliveryMethodSelected(){ 2122 setCookie("io_delivery_method", jQuery(".ioDeliveryMethods option:selected").text(), 14); 2123 checkRestrictedDeliveries(); 2124 } 2125 2126 function adjustPicBoxForHeader(){ 2127 /* For some reason its hard to get css with querySelector so we use jQuery to get the picbox. */ 2128 pic_box = jQuery(".io_product_picbox"); 2129 io_header = document.querySelector(".io_header"); 2130 if(pic_box != null && pic_box.css("position") == "sticky"){ 2131 if(io_header != null){ 2132 header_height = io_header.offsetHeight; 2133 pic_box.css("top", (10+header_height).toString()+"px"); 2134 } 2135 else{ 2136 possible_headers = document.querySelectorAll("header,section")
2137 possible_headers.forEach((ele) =>{ 2138 if(ele.style.top == "0px" && (ele.style.position == "fixed" || ele.style.position == "sticky")){ 2139 header = ele; 2140 header_height = header.offsetHeight; 2141 pic_box.css("top", (10+header_height).toString()+"px"); 2142 2143 } 2144 }); 2145 } 2146 } 2147 } 2148 function cart_times_all_set(){ 2149 if(jQuery("#ioCartTimeSelectContainer [name=dateStart]").val() == ""){ 2150 return false; 2151 } 2152 if(io_hidetimes === "off" || io_hidetimes === ""){ 2153 if(jQuery("#ioCartTimeSelectContainer [name=timeStart]").val() == ""){ 2154 return false; 2155 } 2156 if(jQuery("#ioCartTimeSelectContainer [name=timeEnd]").val() == ""){ 2157 return false; 2158 } 2159 } 2160 2161 return true; 2162 } 2163 function checkRestrictedDeliveries(){ 2164 let items = simpleCart.items() 2165 let restrictions_found = false; 2166 for(i in items){ 2167 let rid = items[i].get("rentalid"); 2168 if(typeof jQuery(".ioDeliveryMethods").val() != "undefined"){ 2169 if(io_delivery_methods[jQuery(".ioDeliveryMethods").val()]["restricted"].includes(rid)){ 2170 jQuery("#deliveryMethodWarning").show(); 2171 restrictions_found = true; 2172 } 2173 } 2174 } 2175 if(!restrictions_found){ 2176 jQuery("#deliveryMethodWarning").hide(); 2177 } 2178 } 2179 2180 function display_cart_warning(item){ 2181 let cart_warning_container = jQuery("#cartWarning"); 2182 2183 // Check if an event date if not we should tell them to set it. 2184 event_times = getAvailTimes(); 2185 if(!event_times[0] || !event_times[1]){ 2186 cart_warning_container.text("Please set the date and time for your event above."); 2187 cart_warning_container.show(); 2188 return false; 2189 } 2190 2191 let item_name = item.get("name"); 2192 let item_timeslots = item.get("timeslots"); 2193 let timeslot_name = getTimeslotName(item_timeslots); 2194 2195 let stop_loop = false; 2196 if(item_timeslots){ 2197 if(jQuery(item_timeslots).nodeName == "SELECT"){ 2198 /* NOTE: It should not be possible for timeslots to be empty. 2199 But in the event they somehow are, we should have this here. */ 2200 /* timeslots */ 2201 var timeslot_sel_range = jQuery(".item-timeslots [name=\""+timeslot_name+"\"] option:selected").val(); 2202 if(typeof timeslot_sel_range != "undefined"){ 2203 var [start_time, end_time] = break_timeslot_sel_range(timeslot_sel_range); 2204 } 2205 }else{ 2206 /* timepickers */ 2207 let [start_timepicker, end_timepicker] = get_cart_timepickers(timeslot_name); 2208 var start_time = start_timepicker.value; 2209 var end_time = end_timepicker.value; 2210 } 2211 if(!start_time || !end_time){ 2212 cart_warning_container.text("Please select a time range for the following item: " + item_name); 2213 cart_warning_container.show() 2214 stop_loop = true; 2215 } 2216 } else{ 2217 cart_warning_container.text("Some items are not available on this date."); 2218 cart_warning_container.show() 2219 } 2220 return stop_loop 2221 } 2222 2223 const io_personal_cookie_keys = ["io_email", "io_phone", "io_address", "io_city", "io_state", "io_zip"]; 2224 2225 function ioHasMarketingConsent(){ 2226 if(typeof cmplz_has_consent !== 'function'){ 2227 return true; 2228 } 2229 return cmplz_has_consent('marketing'); 2230 } 2231 2232 function ioUnwrapStoredValue(raw) { 2233 // Fully peel any {v,e} wrapper layers that may have accumulated when an 2234 // older plugin version re-saved an already-wrapped value (IO-36799). Cart 2235 // values (dates, times, addresses) are never JSON objects, so any layer 2236 // that parses to a {v,...} object is a wrapper to unwrap. Returns 2237 // { value, expired, malformed } describing the innermost stored string. 2238 var value = (raw == null) ? "" : String(raw); 2239 for (var depth = 0; depth < 25; depth++) { 2240 var trimmed = value.trim(); 2241 if (trimmed.charAt(0) !== '{') break; // plain value -> done 2242 var obj; 2243 try { 2244 obj = JSON.parse(trimmed); 2245 } catch (e) { 2246 break; // not parseable -> stop, keep value 2247 } 2248 if (!obj || typeof obj !== 'object' || !('v' in obj)) break; // not our wrapper 2249 if (obj.e && Date.now() > obj.e) { 2250 return { value: "", expired: true, malformed: false }; 2251 } 2252 value = (obj.v != null) ? String(obj.v) : ""; 2253 } 2254 // Only flag as malformed if what remains still looks like our own broken 2255 // {"v":...} wrapper (e.g. truncated) -- never an ordinary value that just 2256 // happens to start with "{", which must be preserved untouched. 2257 var malformed = /^\s*\{\s*"v"\s*:/.test(value); 2258 return { value: value, expired: false, malformed: malformed }; 2259 } 2260 2261 function setCookie(cname, cvalue, exdays) { 2262 if(io_personal_cookie_keys.indexOf(cname) !== -1 && !ioHasMarketingConsent()){ 2263 return; 2264 } 2265 // Store values in localStorage with an io_ prefix for uniqueness and emulate expiration
2266 try { 2267 // Unwrap first so an already-wrapped value can never be re-wrapped and 2268 // compound into nested {v,e} layers (IO-36799). 2269 var clean = ioUnwrapStoredValue(cvalue).value; 2270 var expiresAt = (typeof exdays === 'number' && exdays > 0) 2271 ? Date.now() + (exdays * 24 * 60 * 60 * 1000) 2272 : null; 2273 var payload = JSON.stringify({ v: clean, e: expiresAt }); 2274 window.localStorage.setItem(cname, payload); 2275 } catch (e) { 2276 // Swallow errors to keep behavior similar to cookie writes silently failing 2277 console.log(e); 2278 } 2279 } 2280 2281 function getCookie(cname) { 2282 // Read values from localStorage honoring expiration; return empty string if missing/expired 2283 try { 2284 var raw = window.localStorage.getItem(cname); 2285 if (!raw) return ""; 2286 var result = ioUnwrapStoredValue(raw); 2287 if (result.expired || result.malformed) { 2288 // Drop expired or corrupted entries so they self-heal instead of being 2289 // rendered as raw JSON in the date/time fields (IO-36799). 2290 try { window.localStorage.removeItem(cname); } catch (e) {} 2291 return ""; 2292 } 2293 return result.value; 2294 } catch (e) { 2295 return ""; 2296 } 2297 } 2298 async function fetchAndSetCookie(name) { 2299 var requestInit = { credentials: "include" }; 2300 fetch("https://rental.software/include/get_cookie.php?name=" + name, requestInit).then(function (response) { 2301 return response.json(); 2302 }).then(function (response) { 2303 return handleResponse(name, response); 2304 }); 2305 } 2306 2307 function handleResponse(name, response) { 2308 var currentCookieValue = getCookie(name); 2309 if (!!response.value && currentCookieValue !== response.value) { 2310 setCookie(name, response.value, 14); 2311 } 2312 return response.value; 2313 } 2314 2315 function clearIoPersonalDataForNoConsent(){ 2316 io_personal_cookie_keys.forEach(function(key){ 2317 try { 2318 window.localStorage.removeItem(key); 2319 } catch (e) { 2320 console.log(e); 2321 } 2322 }); 2323 2324 var trackingUrl = (window.location.href.indexOf("localhost") > -1) 2325 ? "http://localhost/io/bugs/include/iotracking.php" 2326 : "https://rental.software/include/iotracking.php"; 2327 var clearImg = new Image(); 2328 clearImg.src = trackingUrl + "?action=remove&nocache=" + Math.random(); 2329 } 2330 2331 document.addEventListener("cmplz_status_change", function (e) { 2332 if (e.detail.category === 'marketing' && e.detail.value === 'deny') { 2333 clearIoPersonalDataForNoConsent(); 2334 } 2335 }); 2336 2337 function break_timeslot_sel_range(timeslot_sel_range){ 2338 /* Takes a time range given by selected timeslot and gets the start and end time removing meridiem.*/ 2339 timeslot_sel_arr = timeslot_sel_range.split(" - "); 2340 var start_time = timeslot_sel_arr[0].replace("am"," am").replace("pm"," pm").replace(" "," "); 2341 var end_time = timeslot_sel_arr[1].replace("am"," am").replace("pm"," pm").replace(" "," "); 2342 2343 return Array(start_time, end_time); 2344 } 2345 function getAvailTimes(){ 2346 /* 2347 Commonly used helper function. Accomplishes two things: 2348 Returns an array containing start_date, start_time, and event duration. 2349 Sets cookies for start and end date, and start and end time. 2350 2351 Uses the inputs available in the cart if they are filled out, so dateStart, dateEnd, timeStart, and timeEnd. 2352 If timeslots are being used in cart it chooses the selected timeslot and breaks it on - and gets the start ane end time from that. 2353 */ 2354 let start_date = jQuery("input[name=dateStart]").val(); 2355 let end_date = jQuery("input[name=dateEnd]").val(); 2356 if(io_company_timeslots.length != 0 && io_cartdayselect == "single_day"){ 2357 let cart_company_timeslot_selected = jQuery(".ioCartCompanyTimeslots option:selected").first().val(); 2358 if(cart_company_timeslot_selected){ 2359 setCookie("io_company_timeslot_selected", cart_company_timeslot_selected, 14); 2360 cart_company_timeslot_selected = cart_company_timeslot_selected.split("-"); 2361 var start_time = cart_company_timeslot_selected[0].trim(); 2362 var end_time = cart_company_timeslot_selected[1].trim(); 2363 } 2364 } else { 2365 var start_time = jQuery("input[name=timeStart]").val(); 2366 var end_time = jQuery("input[name=timeEnd]").val(); 2367 } 2368 2369 if (start_date.length == 0) { 2370 start_date = getCookie("io_dateStart"); 2371 end_date = getCookie("io_dateEnd"); 2372 start_time = getCookie("io_timeStart"); 2373 end_time = getCookie("io_timeEnd"); 2374 } 2375 2376 const has_selected_company_timeslot = io_company_timeslots.length != 0 2377 && io_cartdayselect == "single_day" 2378 && jQuery(".ioCartCompanyTimeslots option:selected").first().val(); 2379 2380 if(io_hidetimes === "on" 2381 && io_force_blank_timepickers != "on" 2382 && !has_selected_company_timeslot) { 2383 start_time = start_default; 2384 end_time = end_default; 2385 jQuery("input[name=timeStart]").val(start_time); 2386 jQuery("input[name=timeEnd]").val(end_time); 2387 } 2388 2389 if(io_force_blank_timepickers != "on") 2390 { 2391 if(start_time.length == 0) 2392 { 2393 start_time = start_default; 2394 } 2395 if(end_time.length == 0) 2396 { 2397 end_time = end_default; 2398 } 2399 } 2400 2401 2402 /* no past dates */ 2403 if(start_date.length != 0 && convertDateStringtoDateObject(start_date, start_time) < new Date()){ 2404 start_date=""; 2405 end_date=""; 2406 } 2407 /* setCookie("checkDate", start_date, 14); */
2408 setCookie("io_dateStart", start_date, 14); 2409 setCookie("io_dateEnd", end_date, 14); 2410 setCookie("io_timeStart", start_time, 14); 2411 setCookie("io_timeEnd", end_time, 14); 2412 /* If we are using the information gathering tool, we do not want to show this message.*/ 2413 if( live_pricing_is_on() && io_info_required == "off" ){ 2414 if(!event_time_set() && io_always_display_live_price != "on"){ 2415 jQuery("#item_live_price_time_set_message").show(); 2416 }else{ 2417 jQuery("#item_live_price_time_set_message").hide(); 2418 } 2419 } 2420 2421 var newDate1 = convertDateStringtoDateObject(start_date, start_time); 2422 var newDate2 = convertDateStringtoDateObject(end_date, end_time); 2423 let time_duration = ((newDate2 - newDate1) / 3600) / 1000; 2424 return [start_date,start_time,time_duration]; 2425 } 2426 2427 function getAllRentalIDsFromCart(){ 2428 let rental_ids = ""; 2429 jQuery("[id^='cartItem_']").each(function(){ 2430 children = this.children 2431 for(let i = 0; i < children.length; ++i){ 2432 if(children[i].className == "item-rentalid") { 2433 rental_ids += children[i].innerText + "|"; 2434 break; 2435 } 2436 } 2437 }); 2438 return rental_ids 2439 } 2440 /*</editor-fold>*/ 2441 2442 /*<editor-fold defaultstate="collapsed" desc="Info Header Functions">*/ 2443 function init_date_timepicker_for_info_header(){ 2444 jQuery(".ioInfoDatepicker").datepicker({ 2445 changeMonth: true, 2446 changeYear: true, 2447 dateFormat: dateFormat, 2448 rangeSelect: true, 2449 numberOfMonths: 1, 2450 stepMonths: 1, 2451 speed: "fast", 2452 showOn: "both", 2453 onChangeMonthYear: cal_onChangeMonthYear, 2454 buttonText: "Calendar", 2455 minDate: 1, 2456 firstDay: 0 2457 }); 2458 jQuery("#ioHeaderDateStart").datepicker("option", { onSelect: function() { 2459 set_info_header_end_date(); 2460 saveInfoHeader(); 2461 // Add more functions if needed 2462 } 2463 }); 2464 2465 if(restrictTimes){ 2466 jQuery(".ioInfoTimepicker").timepicker({ 2467 startTime: new Date(0, 0, 10, 0, 0, 0), 2468 endTime: new Date(0, 0, 0, 20, 0, 0, 0), 2469 minTime:restrictTimeStart, 2470 maxTime:restrictTimeEnd, 2471 /*show24Hours: $show24Hours,*/ 2472 timeFormat: timeFormat, 2473 separator: ":", 2474 className: "elementor-widget-text-editor", 2475 step: 15, 2476 disableTouchKeyboard: true 2477 }); 2478 } else{ 2479 jQuery(".ioInfoTimepicker").timepicker({ 2480 startTime: new Date(0, 0, 10, 0, 0, 0), 2481 endTime: new Date(0, 0, 0, 20, 0, 0, 0), 2482 /*show24Hours: $show24Hours,*/ 2483 timeFormat: timeFormat, 2484 separator: ":", 2485 className: "elementor-widget-text-editor", 2486 step: 15, 2487 disableTouchKeyboard: true 2488 }); 2489 } 2490 setTimeout(setUpTimeRestrictions_infoHeaderTimepickers, 500); 2491 } 2492 2493 function saveInfoHeader(){ 2494 let info_header_start_date = jQuery("[id$=ioHeaderDateStart]"); 2495 let info_header_end_date = jQuery("[id$=ioHeaderDateEnd]"); 2496 let info_header_start_time = jQuery("[id$=ioHeaderTimeStart]"); 2497 let info_header_end_time = jQuery("[id$=ioHeaderTimeEnd]"); 2498 let info_header_address = jQuery("[id$=ioHeaderAddress]"); 2499 let info_header_city = jQuery("[id$=ioHeaderCity]"); 2500 let info_header_state = jQuery("[id$=ioHeaderState]"); 2501 let info_header_zip = jQuery("[id$=ioHeaderZipCode]"); 2502 let info_header_phone = jQuery("[id$=ioHeaderPhone]"); 2503 let info_header_email = jQuery("[id$=ioHeaderEmail]"); 2504 2505 if(info_header_start_time.val()) setCookie("io_timeStart", info_header_start_time.val(), 14); 2506 if(info_header_end_time.val()) setCookie("io_timeEnd", info_header_end_time.val(), 14); 2507 if(info_header_start_date.val()) setCookie("io_dateStart", info_header_start_date.val(), 14); 2508 if(info_header_end_date.val()) setCookie("io_dateEnd", info_header_end_date.val(), 14); 2509 if(info_header_address.val()) setCookie("io_address", info_header_address.val(), 14); 2510 if(info_header_city.val()) setCookie("io_city", info_header_city.val(), 14); 2511 if(info_header_state.val()) setCookie("io_state", info_header_state.val(), 14); 2512 if(info_header_zip.val()) setCookie("io_zip", info_header_zip.val(), 14); 2513 if(info_header_phone.val()) setCookie("io_phone", info_header_phone.val(), 14); 2514 if(info_header_email.val()) setCookie("io_email", info_header_email.val(), 14); 2515 2516 /* Set information in the cart. */ 2517 calCancel(); 2518 2519 header_increment_step(); 2520 2521 /* Stop form from doing anything else for elementor */ 2522 // jpa - still allow, turn off actions in form if wanted. to turn off io lead submission use the plugin settings 2523 //event.preventDefault(); 2524 //event.stopPropagation(); 2525 return true; 2526 } 2527 2528 function set_info_header_values(){ 2529 let info_header_start_date = jQuery("[id$=ioHeaderDateStart]"); 2530 let info_header_end_date = jQuery("[id$=ioHeaderDateEnd]"); 2531 let info_header_start_time = jQuery("[id$=ioHeaderTimeStart]"); 2532 let info_header_end_time = jQuery("[id$=ioHeaderTimeEnd]"); 2533 let info_header_street = jQuery("[id$=ioHeaderAddress]"); 2534 let info_header_city = jQuery("[id$=ioHeaderCity]"); 2535 let info_header_state = jQuery("[id$=ioHeaderState]"); 2536 let info_header_zip = jQuery("[id$=ioHeaderZipCode]"); 2537 let info_header_phone = jQuery("[id$=ioHeaderPhone]"); 2538 let info_header_email = jQuery("[id$=ioHeaderEmail]"); 2539 2540 if(getCookie("io_timeStart")) info_header_start_time.val(getCookie("io_timeStart")); 2541 if(getCookie("io_timeEnd")) info_header_end_time.val(getCookie("io_timeEnd")); 2542 if(getCookie("io_dateStart")) info_header_start_date.val(getCookie("io_dateStart")); 2543 if(getCookie("io_dateEnd")) info_header_end_date.val(getCookie("io_dateEnd")); 2544 if(getCookie("io_address")) info_header_street.val(getCookie("io_address")); 2545 if(getCookie("io_city")) info_header_city.val(getCookie("io_city")); 2546 if(getCookie("io_state")) info_header_state.val(getCookie("io_state")); 2547 if(getCookie("io_zip")) info_header_zip.val(getCookie("io_zip")); 2548 if(getCookie("io_phone")) info_header_phone.val(getCookie("io_phone")); 2549 if(getCookie("io_email")) info_header_email.val(getCookie("io_email")); 2550 } 2551 2552 function add_classes_and_onClicks(){ 2553 2554 /* First set up for dates */ 2555 let info_header_start_date = jQuery("#ioHeaderDateStart"); 2556 let info_header_end_date = jQuery("#ioHeaderDateEnd"); 2557 info_header_start_date.addClass("ioInfoDatepicker"); 2558 info_header_end_date.addClass("ioInfoDatepicker"); 2559 2560 /* Now Timepickers */ 2561 let info_header_start_time = jQuery("#ioHeaderTimeStart"); 2562 let info_header_end_time = jQuery("#ioHeaderTimeEnd"); 2563 info_header_start_time.addClass("ioInfoTimepicker"); 2564 info_header_end_time.addClass("ioInfoTimepicker"); 2565 2566 /* Add the onClick to the button */ 2567 let button = jQuery("#ioInfoHeaderSubmit"); 2568 button.click(saveInfoHeader); 2569 button.css("cursor", "pointer"); 2570 2571 /* Init datepicker and timepickers */ 2572 init_date_timepicker_for_info_header(); 2573 2574 /* Lastly set the values if they are set already */ 2575 set_info_header_values(); 2576 } 2577 2578 function remove_set_event_buttton(){ 2579 let set_event_button = jQuery(".pageDateRangeWrapper"); 2580 if(set_event_button.length > 0) set_event_button.hide(); 2581 } 2582 2583 function set_info_header_end_date(){ 2584 if(!jQuery("#ioHeaderDateEnd").val()){ 2585 jQuery("#ioHeaderDateEnd").val(jQuery("#ioHeaderDateStart").val()) 2586 } 2587 jQuery("#ioHeaderDateEnd").datepicker("option", { minDate: new Date(jQuery("#ioHeaderDateStart").val()) }); 2588 } 2589 2590 function header_increment_step(){ 2591 let active = jQuery(".io-step-active"); 2592 2593 switch(active.attr("id")){ 2594 case "io-step-1": 2595 if (/Mobi|Android/i.test(navigator.userAgent)) { 2596 jQuery("#io-step-2,#io-step-3,#io-step-4").hide(); 2597 } 2598 if(check_header_step_one(active)){ 2599 active.removeClass("io-step-active"); 2600 active.addClass("io-step-done") 2601 jQuery("#io-step-2").addClass("io-step-active") 2602 header_increment_step(); 2603 } 2604 break; 2605 case "io-step-2": 2606 if (/Mobi|Android/i.test(navigator.userAgent)) { 2607 jQuery("#io-step-2,#io-step-3,#io-step-4").show(); 2608 } 2609 if(simpleCart.items().length > 0){ 2610 active.removeClass("io-step-active"); 2611 active.addClass("io-step-done") 2612 jQuery("#io-step-3").addClass("io-step-active") 2613 header_increment_step(); 2614 } 2615 break; 2616 case "io-step-3": 2617 if (/Mobi|Android/i.test(navigator.userAgent)) { 2618 jQuery("#io-step-2,#io-step-3,#io-step-4").show(); 2619 } 2620 if(document.location.href.indexOf("io_quoteconfirm") >= 0){ 2621 active.removeClass("io-step-active"); 2622 active.addClass("io-step-done") 2623 jQuery("#io-step-4").addClass("io-step-active") 2624 header_increment_step(); 2625 } 2626 break; 2627 case "io-step-4": 2628 if (/Mobi|Android/i.test(navigator.userAgent)) { 2629 jQuery("#io-step-2,#io-step-3,#io-step-4").show(); 2630 } 2631 break; 2632 } 2633 } 2634 2635 function check_header_step_one(active) { 2636 var allInputs = active.find('input'); 2637 2638 for (var i = 0; i < allInputs.length; i++) { 2639 if (jQuery(allInputs[i]).val() === "") { 2640 return false; // Return false if any input is empty 2641 } 2642 } 2643 return true; // Return true if all inputs have a value 2644 } 2645 2646 /*</editor-fold>*/ 2647 2648 /*<editor-fold defaultstate="collapsed" desc="Accessory Click Functions">*/ 2649 function accDDClicked(event){ 2650 this_element = jQuery(this) 2651 if(!this_element.prop("selected")){ 2652 pid = event.data.pid 2653 accLmt = event.data.accLmt 2654 all_elements = jQuery("[id^=io_acc_"+pid+"_]") 2655 let count = 0; 2656 /* Tried using .filter and .length to get the count of selected items but could not make it work. */ 2657 for(i = 0; i < all_elements.length; ++i){ 2658 if(all_elements[i].selected){ 2659 ++count; 2660 } 2661 } 2662 if(accLmt == 0){ 2663 this_element.css("border", "5px solid #bbb"); 2664 this_element.prop("selected", true); 2665 } else if(count >= accLmt){ 2666 let selected_value = jQuery("[id^=io_acc_"+pid+"_]").filter(function() { 2667 return this["selected"]; 2668 }); 2669 /* be sure to unselect other slected values if our acc limit has been reached. */ 2670 selected_value.prop("selected", false); 2671 selected_value.css("border", "1px solid #bbb"); 2672 } 2673 this_element.css("border", "5px solid #bbb"); 2674 this_element.prop("selected", true); 2675 } else{ 2676 this_element.prop("selected", false); 2677 this_element.css("border", "1px solid #bbb"); 2678 } 2679 } 2680 2681 /* when accessory choice is clicked */ 2682 function accOnClick(acc_select=null){ 2683 /* set name/img back to original main in case they are just clicking on a 1st level size option */ 2684 jQuery("#bookNowBtn").removeClass("item_add").addClass("item_add_off").trigger("classChange"); 2685 jQuery(".io_product_title.item_name").html(main_name_orig); 2686 jQuery(".io_product_container .item_image").first().attr("src",main_img_src); 2687 jQuery(".io_product_container .item_image").first().attr("data-src",main_img_src); 2688 jQuery(".io_product_container .item_encoded").first().html(main_encoded); 2689 jQuery(".io_product_container .io_image_big").first().attr("src",main_img_src); 2690 jQuery(".io_product_container .io_image_big").first().attr("data-src",main_img_src); 2691 let main_id = jQuery(".io_product_container .item_rentalid").first().text();
2692 let main_id_arr = main_id.split(":") 2693 jQuery(".io_product_container .item_rentalid").html(main_id_arr[0]); 2694 let clk_id; 2695 if(jQuery(acc_select).find(":selected").val()){ 2696 clk_id = jQuery(acc_select).find(":selected").val().replace("io_acc_shortname_",""); 2697 }else{ 2698 clk_id = this.id.replace("io_acc_shortname_",""); 2699 } 2700 clk_id = clk_id.replace("iothumb_",""); 2701 let click_id_arr = clk_id.split("_"); 2702 /* let pid = main_id; */ 2703 /* if(main_id.split("_").length>1) pid = parseInt(click_id_arr[0]); */ 2704 let acc_obj_relate_is_map = acc_obj_relate instanceof Map; 2705 let acc_obj_relate_entries = acc_obj_relate_is_map ? acc_obj_relate.entries() : Object.entries(acc_obj_relate); 2706 for (let [key, value] of acc_obj_relate_entries) { 2707 let id = key; 2708 let children = acc_obj_relate_is_map ? acc_obj_relate.get(key) : value; 2709 if(Object.keys(children).length>0){ 2710 for (key2 in children) { 2711 if(Object.keys(children[key2]).length > 0){ 2712 /* 3rd level */ 2713 for (key3 in children[key2]) { 2714 displayPackageChoices(clk_id,key2,key3,children[key2]); 2715 } 2716 }else{ 2717 displayPackageChoices(clk_id,key,key2,children); 2718 } 2719 } 2720 }else{ 2721 displayPackageChoices(clk_id,0,id,acc_obj_relate); 2722 } 2723 } 2724 } 2725 2726 /* show/hide accessory levels as needed */ 2727 /* clk_id: one they clicked on, pid: parentid, id: iterator, arr: relationship array */ 2728 function displayPackageChoices(clk_id,pid,id,arr){ 2729 let main_id = jQuery(".io_product_container .item_rentalid").first().text(); 2730 let main_arr = main_id.split("_"); 2731 if(main_arr.length>1) main_id = parseInt(main_arr[0]); 2732 let click_id_arr = clk_id.split("_"); 2733 elem = getAccElem(id,pid); 2734 if(click_id_arr[0]==pid || click_id_arr[1]==pid || pid==0){ 2735 elem.style.display="inline-block"; 2736 }else{ 2737 elem.style.display="none"; 2738 } 2739 if(click_id_arr[1]==id && (click_id_arr[0]==pid || (pid==0 && click_id_arr[0]==main_id) ) || (click_id_arr.length==1 && click_id_arr[0]==id)){ 2740 jQuery("#bookNowBtn").removeClass("item_add_off").addClass("item_add").trigger("classChange"); 2741 updateMainItem(id,pid); 2742 } 2743 } 2744 2745 /* update it with accessory data for choices */ 2746 var main_img_src = jQuery("#single_image").first().attr("href"); 2747 var main_name_orig = jQuery(".io_product_title.item_name").html(); 2748 var main_encoded = jQuery(".io_product_container .item_encoded").html(); 2749 var main_desc = jQuery(".io_product_detailbox .io_product_desc").html(); 2750 function updateMainItem(id,pid){ 2751 /* update add to cart btn, name, img, desc */ 2752 let name = ""; 2753 let name_enc = ""; 2754 let main_id = jQuery(".io_product_container .item_rentalid").first().text(); 2755 let main_arr = main_id.split(":"); 2756 if(main_arr.length>1) main_id = main_arr[0]; 2757 if(pid!=0){ 2758 name += jQuery("#io_acc_itemname_"+pid).html()+":"; 2759 name_enc += jQuery("#io_acc_itemname_"+pid).html()+":"; 2760 name += jQuery("#io_acc_shortname_"+id).html(); 2761 name_enc += jQuery("#io_acc_itemname_"+id).html(); 2762 }else{ 2763 pid = main_id; 2764 name += jQuery("#io_acc_itemname_"+id).html(); 2765 name_enc += jQuery("#io_acc_itemname_"+id).html(); 2766 } 2767 jQuery(".io_product_container .item_encoded").html(encodeURIComponent(name_enc.replace(/[\u2032\u2019]+/ig,"'"))); 2768 jQuery(".io_product_container .item_rentalid").html(main_id+":"+pid+"_"+id); 2769 jQuery(".io_product_title.item_name").html(name); 2770 // Make sure the description actually displays text. 2771 let acc_desc = jQuery("#io_acc_desc_"+pid+"_"+id).first(); 2772 if(acc_desc.length>0 && acc_desc.text()){ 2773 jQuery(".io_product_container .io_product_desc").first().html(jQuery("#io_acc_desc_"+pid+"_"+id).first()[0].innerHTML); 2774 } 2775 2776 /* swap accessory image with main image pic for drop-down type items (linens) */ 2777 let img = jQuery("#io_acc_imgbig_"+pid+"_"+id).first().attr("href"); 2778 if(img==null) img = jQuery("#iothumb_"+pid+"_"+id).first().attr("src") 2779 if(img==null){ 2780 }else{ 2781 if(img.length==0 && pid==main_id){ 2782 /* for 1 level dd items that have no img, use the main img */ 2783 img = main_img_src; 2784 } 2785 jQuery(".io_product_container .io_image_big").first().attr("src",img); 2786 jQuery(".io_product_container .io_image_big").first().attr("data-src",
2786img); 2787 jQuery(".io_product_container .item_image").first().attr("src",jQuery("#iothumb_"+pid+"_"+id).first().attr("src")); 2788 jQuery(".io_product_container .item_image").first().attr("data-src",jQuery("#iothumb_"+pid+"_"+id).first().attr("src")); 2789 2790 jQuery("#single_image").first().attr("href",img).show(); 2791 } 2792 checkAvailFilter(); 2793 } 2794 2795 /* get either img or text for accessory choices */ 2796 function getAccElem(id,pid){ 2797 let path =pid+"_"+id; 2798 if(pid==0){ 2799 path=id; 2800 } 2801 let elem = null; 2802 try{ 2803 elem = document.querySelector("#ioAccButtonWrapper_"+path); 2804 }catch(e){} 2805 if(elem == null){ 2806 try{ 2807 elem = document.querySelector("#iothumb_"+path); 2808 }catch(e){} 2809 } 2810 if(elem==null){ 2811 try{ 2812 elem = document.querySelector("#io_product_acc_pkg_sel_"+pid); 2813 }catch(e){} 2814 if(elem!=null) return elem; 2815 }else{ return elem; } 2816 if(elem == null){ 2817 try{ 2818 elem = document.querySelector("#io_acc_shortname_"+path); 2819 }catch(e){} 2820 }else if(elem.src=="" | elem.getAttribute("data-src")==""){ 2821 try{ 2822 elem = document.querySelector("#io_acc_shortname_"+path); 2823 }catch(e){} 2824 }else if(elem.src.substr(-1)=="/"){ 2825 try{ 2826 elem = document.querySelector("#io_acc_shortname_"+path); 2827 }catch(e){} 2828 } 2829 if(elem==null){ 2830 try{ 2831 elem = document.querySelector("#io_acc_shortname_"+id); 2832 }catch(e){} 2833 } 2834 return elem; 2835 } 2836 2837 /* create the accessory choice btn (img/text) */ 2838 function makeAccBtn(button_add,pid){ 2839 let newButton; 2840 if(button_add.nodeName=="IMG"){ 2841 newButton = button_add; 2842 let id = newButton.id.replace("iothumb_"+pid,""); 2843 var wrapper = document.createElement("div"); 2844 wrapper.setAttribute("id", "ioAccButtonWrapper_"+pid+id); 2845 wrapper.style.display = "inline-block"; 2846 wrapper.appendChild(newButton); 2847 let acc_name = document.createElement("span"); 2848 acc_name.style.overflow = "hidden"; 2849 acc_name.style.textOverflow = "ellipsis"; 2850 acc_name.style.maxWidth = "80px"; 2851 acc_name.style.display = "block"; 2852 acc_name.style.whiteSpace = "nowrap"; 2853 acc_name.textContent = jQuery("#io_acc_shortname"+id).text(); 2854 acc_name.classList.add("accTextName"); 2855 acc_name.setAttribute("id", "io_acc_shortname_"+pid+id); 2856 wrapper.appendChild(document.createElement("br")); 2857 wrapper.appendChild(acc_name); 2858 2859 }else{ 2860 newButton = button_add.cloneNode(true); 2861 let id = newButton.id.replace("io_acc_shortname_",""); 2862 newButton.id = "io_acc_shortname_" + pid + "_" + id; 2863 } 2864 newButton.classList.add("elementor-animation-grow"); 2865 newButton.classList.remove("item_image"); 2866 newButton.style="cursor:pointer;border: solid 1px grey"; 2867 newButton.classList.add("io_access_button"); 2868 newButton.style.display = "inline-block"; 2869 newButton.style.verticalAlign = "top"; 2870 newButton.onclick=accOnClick; 2871 if(newButton.nodeName=="IMG"){ 2872 newButton.style.minWidth = "80px"; 2873 newButton.style.width = "80px"; 2874 newButton.style.margin = "2px"; 2875 newButton.style.height = "80px"; 2876 }else{ 2877 newButton.style.margin = "0px 2px 0px 2px"; 2878 } 2879 if(button_add.nodeName=="IMG"){ 2880 return wrapper 2881 } 2882 2883 return newButton; 2884 } 2885 /* when clicking the thumb swatches under main image (2nd image for an item) */ 2886 function updateMainPic(img) { 2887 let container = img.parentElement; 2888 while (container && !container.querySelector(".io_image_big")) { 2889 container = container.parentElement; 2890 } 2891 2892 const main_img = container ? container.querySelector(".io_image_big") : null; 2893 if (!main_img) return; 2894 2895 const dataBigSrc = img.getAttribute("data-big-src"); 2896 if (dataBigSrc) { 2897 main_img.src = dataBigSrc; 2898 return; 2899 } 2900 2901 let thumb_id = img.id; 2902 let big_id = thumb_id.replace("thumb", "big"); 2903 const img_big = document.getElementById(big_id); 2904 2905 if (img_big && img_big.href) { 2906 main_img.src = img_big.href; 2907 } 2908 } 2909 /*</editor-fold>*/ 2910 2911 /*<editor-fold defaultstate="collapsed" desc="Calendar Functions">*/ 2912 function calApply() { 2913 /* reset timeslots if filtering is on */ 2914 filterTimeslotsByDay_itemTimeslots();
2915 simpleCart.update(); 2916 2917 /* Prevent zero-duration selection: disallow identical start and end date/time */ 2918 try 2919 { 2920 var ds = jQuery("input[name=dateStart]").val(); 2921 var de = jQuery("input[name=dateEnd]").val(); 2922 var ts = jQuery("input[name=timeStart]").val(); 2923 var te = jQuery("input[name=timeEnd]").val(); 2924 if(ts && te && ds && de) 2925 { 2926 var s24 = convert12HourTo24Hour(ts); 2927 var e24 = convert12HourTo24Hour(te); 2928 var sObj = buildDateObj(ds.split("/"), s24); 2929 var eObj = buildDateObj(de.split("/"), e24); 2930 if(sObj && eObj && typeof sObj.getTime === 'function' && typeof eObj.getTime === 'function') 2931 { 2932 if(eObj.getTime() === sObj.getTime()) 2933 { 2934 alert("Please choose an end time that's after the start time."); 2935 jQuery("input[name=timeEnd]").val(""); 2936 return false; 2937 } 2938 } 2939 } 2940 }catch(e){} 2941 2942 if(cart_times_all_set()){ 2943 ioCartLoaderActivate(); 2944 setCookie("io_dateApplied", "true", 1) 2945 checkAvailAll(); 2946 // If no availability calls were made, hide loader shortly after 2947 setTimeout(function() 2948 { 2949 if(io_cart_loading_active && io_cart_loading_count === 0) 2950 { 2951 io_cart_loading_active = false; 2952 ioCartShowOverlay(false); 2953 } 2954 }, 300); 2955 calCancel(); 2956 } 2957 2958 2959 let io_required_data = io_info_required_data; 2960 for (const [data, value] of Object.entries(io_required_data)) { 2961 if(value == 1){ 2962 setCookie(data, jQuery("#io_im_"+data).val(), 14); 2963 } 2964 } 2965 2966 /* Check if information gathering header exists. If it does, update the times on there. */ 2967 if(jQuery("#ioInfoHeader").length){ 2968 jQuery("#ioHeaderTimeStart").val(jQuery("[name=timeStart]").val()); 2969 jQuery("#ioHeaderTimeEnd").val(jQuery("[name=timeEnd]").val()); 2970 jQuery("#ioHeaderDateStart").val(jQuery("[name=dateStart]").val()); 2971 jQuery("#ioHeaderDateEnd").val(jQuery("[name=dateEnd]").val()); 2972 header_increment_step(); 2973 } 2974 2975 show_or_hide_required_info_message() 2976 /* if(!cartStayOpen) cartHide(); */ 2977 } 2978 2979 function calCancel() { 2980 click_count = 0; 2981 start_date = getCookie("io_dateStart"); 2982 end_date = getCookie("io_dateEnd"); 2983 start_time = getCookie("io_timeStart"); 2984 end_time = getCookie("io_timeEnd"); 2985 jQuery("input[name=dateStart]").val(start_date); 2986 jQuery("input[name=dateEnd]").val(end_date); 2987 if(io_company_timeslots.length != 0 && io_cartdayselect == "single_day" && getCookie("io_company_timeslot_selected")){ 2988 jQuery(".ioCartCompanyTimeslots").val(getCookie("io_company_timeslot_selected")); 2989 } else{ 2990 jQuery("input[name=timeStart]").val(start_time); 2991 jQuery("input[name=timeEnd]").val(end_time); 2992 } 2993 setCalBackground(); 2994 2995 jQuery(".ioDateRange").html(smartFormatDateRange()) 2996 jQuery("#cartCalendar, #cartTimePicker").hide(); 2997 jQuery(".ioDateRange").show(); 2998 jQuery(".changeDateLinkWrapper").show(); 2999 } 3000 3001 /* var cartStayOpen = false; */ 3002 function calSetDateRange(stayOpen) { 3003 /* 3004 if(stayOpen==1){ 3005 cartStayOpen = true; 3006 }else{ 3007 cartStayOpen = false; 3008 } 3009 */ 3010 jQuery(".changeDateLinkWrapper").hide(); 3011 jQuery("#cartCalendar, #cartTimePicker").show(); 3012 jQuery("#cartDateRange").hide(); 3013 } 3014 3015 function smartFormatDateRange() { 3016 let start_date = jQuery("input[name=dateStart]").val(); 3017 let end_date = jQuery("input[name=dateEnd]").val(); 3018 if(io_company_timeslots.length != 0 && io_cartdayselect == "single_day"){ 3019 let cart_company_timeslot_selected = jQuery(".ioCartCompanyTimeslots option:selected").first().val(); 3020 if(cart_company_timeslot_selected){ 3021 setCookie("io_company_timeslot_selected", cart_company_timeslot_selected, 14); 3022 cart_company_timeslot_selected = cart_company_timeslot_selected.split("-"); 3023 var start_time = cart_company_timeslot_selected[0].trim(); 3024 var end_time = cart_company_timeslot_selected[1].trim(); 3025 } 3026 } else { 3027 var start_time = jQuery("input[name=timeStart]").val(); 3028 var end_time = jQuery("input[name=timeEnd]").val(); 3029 } 3030 3031 let text = ""; 3032 text = start_date; 3033 if(io_hidetimes!="on") text += " " + start_time; 3034 3035 if (start_date == end_date) { 3036 if(io_hidetimes!="on"){ 3037 text += " <i class='fas fa-arrow-right' style='padding:5px;'></i> "; 3038 text += end_time; 3039 } 3040 } else { 3041 text += " <i class='fas fa-arrow-right' style='padding:5px;'></i> "; 3042 text += end_date; 3043 if(io_hidetimes!="on") text += " " + end_time; 3044 } 3045 /* text += " <i class='fas fa-pencil-alt' style='margin-left:9px;color:"+pallet_color1+";'></i> "; */ 3046 3047 return text; 3048 } 3049 3050 3051 function resetCalButtons() { 3052 jQuery("#cartCalendar .ui-datepicker-prev").addClass("fas fa-arrow-left").css("color", pallet_color1); 3053 jQuery("#cartCalendar .ui-datepicker-next").addClass("fas fa-arrow-right").
3053css("color", pallet_color1); 3054 } 3055 3056 function cal_onChangeMonthYear(year, month, obj) { 3057 setTimeout(resetCalButtons, 10); 3058 setTimeout(setCalBackground, 10); 3059 } 3060 3061 function cal_onSelect(dateText, obj) { 3062 setTimeout(resetCalButtons, 10); 3063 let whatday_choice = ""; 3064 if(io_cartdayselect === "dropdown_options" && io_multidayquote === "on"){ 3065 let choice_obj = jQuery("#whatday"); 3066 if(choice_obj){ 3067 whatday_choice = choice_obj.val(); 3068 } 3069 } 3070 3071 click_count++; 3072 end_timepicker = jQuery("input[name=timeEnd]"); 3073 let timeStart = jQuery("input[name=timeStart]").val(); 3074 if(io_force_blank_timepickers != "on") 3075 { 3076 if (timeStart == "") { 3077 jQuery("input[name=timeStart]").val(start_default); 3078 jQuery("input[name=timeEnd]").val(end_default); 3079 } 3080 } 3081 3082 if (click_count == 1 || !multi_day || whatday_choice==="Same Day" || whatday_choice==="Overnight") { 3083 jQuery("input[name=dateStart]").val(dateText); 3084 jQuery("input[name=dateEnd]").val(dateText) 3085 end_timepicker.timepicker("option",{"minTime": jQuery("input[name=timeStart]").val()}); 3086 if(EndTimeLessThanStartTime( 3087 jQuery("input[name=timeStart]").val(), 3088 end_timepicker.val(), 3089 jQuery("[name='dateStart']").val(), 3090 jQuery("[name='dateEnd']").val() ) ) { 3091 end_timepicker.val(""); 3092 } 3093 if(io_cartAllowSameDay == "on"){ 3094 restrictStartTimepickerOnSameDaySelect(dateText, jQuery("input[name=timeStart]"), end_timepicker); 3095 } 3096 } else if (click_count == 2) { 3097 jQuery("input[name=dateEnd]").val(dateText); 3098 let start_date_str = jQuery("input[name=dateStart]").val(); 3099 let start_date_obj = convertDateStringtoDateObject(start_date_str); 3100 let end_date_obj = convertDateStringtoDateObject(dateText); 3101 if(end_date_obj < start_date_obj){ 3102 jQuery("input[name=dateStart]").val(dateText); 3103 if(io_cartAllowSameDay == "on"){ 3104 restrictStartTimepickerOnSameDaySelect(dateText, jQuery("input[name=timeStart]"), end_timepicker); 3105 } 3106 } else{ 3107 end_timepicker.timepicker("option",{"minTime": io_restrict_time_start}); 3108 } 3109 click_count = 0; 3110 } else { 3111 click_count = 0; 3112 } 3113 //custom code for suncoast_event 3114 if(io_cartdayselect === "dropdown_options" && io_multidayquote === "on"){ 3115 endDisplay(); 3116 //daysSelect(); 3117 } 3118 filterTimeslotsByDay_companyTimeslots(); 3119 3120 setTimeout(setCalBackground, 10); 3121 } 3122 3123 function endDisplay(){ 3124 //todo: need to figure out if these work and set triggers 3125 // trigger enddisplay after date is selected or possibly when dateEnd changes? 3126 let choice = jQuery("#whatday").val(); 3127 3128 setCookie("io_whatday", choice, 14); 3129 let dateStart = jQuery("[name=dateStart]"); 3130 let timeStart = jQuery("[name=timeStart]"); 3131 let dateEnd = jQuery("[name=dateEnd]"); 3132 let timeEnd = jQuery("[name=timeEnd]"); 3133 if(choice==='Overnight'){ 3134 let startdate = dateStart.val(); 3135 let starttime = io_overnightPickupTime; 3136 let endcalc_date_obj = new Date(buildDateobjectstring(startdate,dateFormat,starttime)); 3137 let duration_hrs = 24; 3138 let end_date_obj = new Date(endcalc_date_obj.getTime()+duration_hrs*60*60*1000); 3139 if(!isNaN(end_date_obj)){ 3140 dateEnd.val(getFormatteddate(end_date_obj)); 3141 timeEnd.val(getFormattedtime(end_date_obj)); 3142 timeEnd.attr('readonly','readonly'); 3143 } 3144 }else if(choice==='Multi-Day'){ 3145 let startdate = dateStart.val(); 3146 let starttime = timeStart.val() || start_default; 3147 let start_date_obj = new Date(buildDateobjectstring(startdate, dateFormat, starttime)); 3148 if(!isNaN(start_date_obj)){ 3149 //dateEnd.val(getFormatteddate(start_date_obj)); 3150 let cal = jQuery("#cartCalendar"); 3151 let origOnSelect = cal.datepicker("option", "onSelect"); 3152 cal.datepicker("option", "onSelect", null); 3153 cal.datepicker("setDate", start_date_obj); 3154 cal.datepicker("option", "onSelect", origOnSelect); 3155 } 3156 timeEnd.removeAttr('readonly'); 3157 if(io_force_blank_timepickers == "on" && !timeEnd.val()){ 3158 timeEnd.val(""); 3159 } else if(!timeEnd.val()){ 3160 timeEnd.val(end_default); 3161 } 3162 }else{ 3163 let startdate = dateStart.val(); 3164 let starttime = timeStart.val() || start_default; 3165 let start_date_obj = new Date(buildDateobjectstring(startdate, dateFormat, starttime)); 3166 if(!isNaN(start_date_obj)){ 3167 dateEnd.val(getFormatteddate(start_date_obj)); 3168 let cal = jQuery("#cartCalendar"); 3169 let origOnSelect = cal.datepicker("option", "onSelect"); 3170 cal.datepicker("option", "onSelect", null); 3171 cal.datepicker("setDate", start_date_obj); 3172 cal.datepicker("option", "onSelect", origOnSelect); 3173 } 3174 timeEnd.removeAttr('readonly'); 3175 if(io_force_blank_timepickers == "on" && !timeEnd.val()){ 3176 timeEnd.val(""); 3177 } else if(!timeEnd.val()){ 3178 timeEnd.val(end_default); 3179 } 3180 click_count = 0; 3181 }
3182 setTimeout(setCalBackground, 10); 3183 } 3184 function setCalBackground() { 3185 let dateStart_string = jQuery("input[name=dateStart]").val(); 3186 let dateEnd_string = jQuery("input[name=dateEnd]").val(); 3187 3188 if (dateFormat == "d/m/yy") { 3189 let dateStartArray = dateStart_string.split("/"); 3190 let dateEndArray = dateEnd_string.split("/"); 3191 var dateStart = new Date(dateStartArray[2], Number(dateStartArray[1])-1, dateStartArray[0]); 3192 var dateEnd = new Date(dateEndArray[2], Number(dateEndArray[1])-1, dateEndArray[0]); 3193 } else { 3194 var dateStart = new Date(dateStart_string); 3195 var dateEnd = new Date(dateEnd_string); 3196 } 3197 3198 3199 let sday = dateStart.getDate(); 3200 let smonth = dateStart.getMonth(); 3201 let syear = dateStart.getFullYear(); 3202 3203 let eday = dateEnd.getDate(); 3204 let emonth = dateEnd.getMonth(); 3205 let eyear = dateEnd.getFullYear(); 3206 3207 /* clear any (in case of cancel) */ 3208 jQuery(".ui-datepicker-calendar [data-handler=selectDay]").css("background-color","initial"); 3209 3210 /* set the selected ones */ 3211 jQuery("#cartCalendar [data-month=" + smonth + "][data-year=" + syear + "], #cartCalendar [data-month=" + 3212 emonth + "][data-year=" + eyear + "]").each(function (i) { 3213 let cday = jQuery(this).find("a").first().text(); 3214 let cmonth = jQuery(this).attr("data-month"); 3215 let cyear = jQuery(this).attr("data-year"); 3216 /* let dateCurrent = new Date(Date.UTC(cyear,cmonth,cday,12)); */ 3217 let dateCurrent = new Date(cyear, cmonth, cday); 3218 if (click_count == 1 && dateEnd_string.length == 0) dateEnd = dateStart; 3219 if (dateCurrent.getTime() == dateStart.getTime() && dateCurrent.getTime() == dateEnd.getTime()) { 3220 jQuery(this).css("border-radius", "6px 6px 6px 6px"); 3221 } else if (dateCurrent.getTime() == dateStart.getTime()) { 3222 jQuery(this).css("border-radius", "6px 0 0 6px"); 3223 } else if (dateCurrent.getTime() == dateEnd.getTime()) { 3224 jQuery(this).css("border-radius", "0 6px 6px 0"); 3225 } 3226 3227 if (dateCurrent >= dateStart && dateCurrent <= dateEnd) { 3228 jQuery(this).css("background-color", pallet_color1); 3229 } 3230 3231 3232 }); 3233 } 3234 /*</editor-fold>*/ 3235 3236 /*<editor-fold defaultstate="collapsed" desc="Timeslot/Timepicker Functions">*/ 3237 /* called from simplecart */ 3238 function timeslotChange(){ 3239 checkAvailCartTimeslots(); 3240 } 3241 function filterTimeslotsByDay_companyTimeslots(){ 3242 var weekday = new Array(); 3243 weekday[0] = "Sunday"; 3244 weekday[1] = "Monday"; 3245 weekday[2] = "Tuesday"; 3246 weekday[3] = "Wednesday"; 3247 weekday[4] = "Thursday"; 3248 weekday[5] = "Friday"; 3249 weekday[6] = "Saturday"; 3250 3251 let times = getAvailTimes(); 3252 let start_date = times[0]; 3253 var newDate1 = convertDateStringtoDateObject(start_date); 3254 let day = weekday[new Date(newDate1).getDay()]; 3255 3256 let selected_option_label = jQuery(".ioCartCompanyTimeslots option:selected").first().text().toLowerCase(); 3257 if(optionHasDay(weekday, selected_option_label)){ 3258 if(selected_option_label.indexOf(day.toLowerCase()) === -1){ 3259 jQuery(".ioCartCompanyTimeslots").val(""); 3260 } 3261 } 3262 if(io_company_timeslots.length != 0 && io_cartdayselect == "single_day"){ 3263 jQuery(".ioCartCompanyTimeslots > option").each(function() { 3264 if(optionHasDay(weekday, this.text.toLowerCase())){ 3265 for(i=0; i<weekday.length; ++i){ 3266 if(day.toLowerCase() == weekday[i].toLowerCase() && this.text.toLowerCase().indexOf(day.toLowerCase()) !== -1){ 3267 jQuery(this).show(); 3268 day_missing = false; 3269 } else if(day.toLowerCase() != weekday[i].toLowerCase() && this.text.toLowerCase().indexOf(day.toLowerCase()) === -1){ 3270 jQuery(this).hide(); 3271 } 3272 } 3273 } 3274 }); 3275 } 3276 } 3277 3278 function filterTimeslotsByDay_itemTimeslots(){ 3279 var weekday = new Array(); 3280 weekday[0] = "Sunday"; 3281 weekday[1] = "Monday"; 3282 weekday[2] = "Tuesday"; 3283 weekday[3] = "Wednesday"; 3284 weekday[4] = "Thursday"; 3285 weekday[5] = "Friday"; 3286 weekday[6] = "Saturday"; 3287 3288 let times = getAvailTimes(); 3289 let start_date = times[0]; 3290 var newDate1 = convertDateStringtoDateObject(start_date); 3291 let day = weekday[new Date(newDate1).getDay()]; 3292 3293 simpleCart.each(function (item, x) { 3294 var timeslots_html = item.get('timeslots'); 3295 if(typeof timeslots_html != "undefined" && jQuery.parseHTML(timeslots_html)[0].nodeName == "SELECT"){ 3296 if(timeslots_html.length > 0){ 3297 var timeslot_name = getTimeslotName(timeslots_html); 3298 if(typeof item.get("timeslots-orig") == "undefined"){ 3299 var timeslots_obj = jQuery.parseHTML(timeslots_html); 3300 } else{ 3301 var timeslots_obj = jQuery.parseHTML(item.get('timeslots-orig')); 3302 } 3303 jQuery(timeslots_obj).find("option").each(function(){ 3304 if(optionHasDay(weekday, this.text.toLowerCase())){ 3305 for(i=0; i<weekday.length; ++i){ 3306 if(day.toLowerCase() == weekday[i].toLowerCase() && this.text.toLowerCase().indexOf(day.toLowerCase()) !== -1){ 3307 /* jQuery(this).show(); */ 3308 } else if(day.toLowerCase() != weekday[i].toLowerCase() && this.text.toLowerCase().indexOf(day.toLowerCase()) === -1){ 3309 jQuery(this).remove(); 3310 } 3311 } 3312 } 3313 }); 3314 if(typeof item.get("timeslots-orig") == "undefined") item.set("timeslots-orig",item.get("timeslots")); 3315 item.set("timeslots",'<select class="simpleCart_timeslots" name="'+timeslot_name+'">'+jQuery(timeslots_obj).html()+'</select>'); 3316 } 3317 } 3318 }); 3319 } 3320 3321 function optionHasDay(weekdays, option_label){ 3322 for(i=0; i<weekdays.length; ++i){ 3323 if(option_label.indexOf(weekdays[i].toLowerCase()) !== -1){ 3324 return true; 3325 } 3326 } 3327 return false;
3328 } 3329 3330 function getTimeslotName(timeslots_html){ 3331 if(typeof timeslots_html=="undefined") return ""; 3332 var timeslot_name_s = timeslots_html.indexOf('name="'); 3333 timeslot_name_s += 6; 3334 var timeslot_name_e = timeslots_html.indexOf('"',timeslot_name_s); 3335 var timeslot_name = timeslots_html.substr(timeslot_name_s,timeslot_name_e-timeslot_name_s); 3336 return timeslot_name; 3337 } 3338 function setTimeslotSelected(item, timeslot_name){ 3339 jQuery(".item-timeslots [name=\""+timeslot_name+"\"] option").not(":selected").removeAttr("selected"); 3340 jQuery(".item-timeslots [name=\""+timeslot_name+"\"] option:selected").attr("selected","selected"); 3341 if(jQuery(".item-timeslots [name=\""+timeslot_name+"\"]").length>0){ 3342 item.set("timeslots",jQuery(".item-timeslots [name=\""+timeslot_name+"\"]")[0].outerHTML); 3343 } 3344 3345 /* set on quote page */ 3346 jQuery(".controls [name=\""+timeslot_name+"\"] option").not(":selected").removeAttr("selected"); 3347 jQuery(".controls [name=\""+timeslot_name+"\"] option[value='"+jQuery(".item-timeslots [name=\""+timeslot_name+"\"] option:selected").val()+"']").attr("selected","selected"); 3348 } 3349 3350 function setTimePicker(item, timepicker_name){ 3351 let [start_timepicker, end_timepicker] = get_cart_timepickers(timepicker_name); 3352 let start_time = start_timepicker.value; 3353 let end_time = end_timepicker.value; 3354 3355 if(!start_time){ 3356 start_timepicker.style.borderColor = "red"; 3357 } else{ 3358 start_timepicker.style.borderColor = ""; 3359 } 3360 if(!end_time){ 3361 end_timepicker.style.borderColor = "red"; 3362 } else{ 3363 end_timepicker.style.borderColor = ""; 3364 } 3365 3366 let start_timepicker_html = start_timepicker.outerHTML; 3367 let end_timepicker_html = end_timepicker.outerHTML; 3368 if(document.querySelectorAll(".item-timeslots [name=\""+timepicker_name+"\"]").length>0){ 3369 start_timepicker_html = addOrReplaceValueInTimepicker(start_timepicker_html, start_time); 3370 end_timepicker_html = addOrReplaceValueInTimepicker(end_timepicker_html, end_time); 3371 item.set("timeslots", '<div name="'+timepicker_name+'"> Start: '+start_timepicker_html+' End: '+end_timepicker_html+'</div>'); 3372 } 3373 /* set on quote page */ 3374 /* For linen type items with timepickers */ 3375 let rental_id = item.get("rentalid"); 3376 let split_on_colon = rental_id.split(":"); 3377 if(split_on_colon.length > 1){ 3378 fix_time_name_for_linen_rid(timepicker_name, split_on_colon, start_time, end_time, rental_id) 3379 }else{ 3380 let quote_page_start_timepicker = document.querySelectorAll(".controls [name=\""+timepicker_name.replace("io_timepicker_", "starttime_")+"\"]")[0]; 3381 let quote_page_end_timepicker = document.querySelectorAll(".controls [name=\""+timepicker_name.replace("io_timepicker_", "endtime_")+"\"]")[0]; 3382 if(quote_page_start_timepicker != null && quote_page_end_timepicker != null){ 3383 quote_page_start_timepicker.value = start_time; 3384 quote_page_end_timepicker.value = end_time; 3385 } 3386 } 3387 } 3388 3389 function fix_time_name_for_linen_rid(time_name, split_rid, start_time, end_time, rental_id){ 3390 for(let x = 0; x < split_rid.length; x++){ 3391 temp_timepicker_name = time_name.replace(rental_id, split_rid[x]); 3392 let quote_page_start_timepicker = document.querySelectorAll(".controls [name=\""+temp_timepicker_name.replace("io_timepicker_", "starttime_")+"\"]")[0]; 3393 let quote_page_end_timepicker = document.querySelectorAll(".controls [name=\""+temp_timepicker_name.replace("io_timepicker_", "endtime_")+"\"]")[0]; 3394 if(quote_page_start_timepicker != null && quote_page_end_timepicker != null){ 3395 quote_page_start_timepicker.value = start_time; 3396 quote_page_end_timepicker.value = end_time; 3397 } 3398 } 3399 } 3400 3401 function addOrReplaceValueInTimepicker(timepicker_html, time_value){ 3402 if(timepicker_html.includes("value=")){ 3403 timepicker_html = [timepicker_html.slice(0, timepicker_html.indexOf("value=")), 'value="'+time_value+'"', timepicker_html.slice(timepicker_html.length-1)].join(""); 3404 }else{ 3405 /* No value defined. Add it at the end of the outer html. */ 3406 let position = timepicker_html.lastIndexOf(">"); 3407 timepicker_html = [timepicker_html.slice(0, position), ' value="'+time_value+'"', timepicker_html.slice(position)].join(""); 3408 } 3409 return timepicker_html 3410 } 3411 3412 function restrictEndTimepickers(){ 3413 setUpTimeRestrictions_cartTimepickers() 3414 setUpTimeRestrictions_timeBasedItems() 3415 } 3416 3417 function setUpTimeRestrictions_timeBasedItems(){ 3418 jQuery("input[name^=start_timeslot_]").change(function() 3419 { 3420 end_timepicker = jQuery("input[name='"+this.name.replace("start", "end")+"']"); 3421 end_timepicker = jQuery(end_timepicker[end_timepicker.length - 1]); 3422 end_timepicker.timepicker("option",{"minTime": jQuery(this).val()}); 3423 if( EndTimeLessThanStartTime( jQuery(this).val(), end_timepicker.val(), "0/0/0", "0/0/0" ) ){ 3424 end_timepicker.val(""); 3425 } 3426 }); 3427 } 3428 3429 function setUpTimeRestrictions_cartTimepickers(){ 3430 jQuery("input[name=timeStart]").change(function() 3431 { 3432 end_timepicker = jQuery("[name='"+this.name.replace("Start", "End")+"']"); 3433 if(jQuery("[name='dateStart']").val() === jQuery("input[name='dateEnd']").val()){ 3434 end_timepicker.timepicker("option",{"minTime": jQuery(this).val()}); 3435 if(EndTimeLessThanStartTime( 3436 jQuery(this).val(), 3437 end_timepicker.val(), 3438 jQuery("[name='dateStart']").val(), 3439 jQuery("[name='dateEnd']").val() ) ) { 3440 end_timepicker.val(""); 3441 } 3442 } 3443 }); 3444 } 3445 3446 function setUpTimeRestrictions_infoHeaderTimepickers(){ 3447 jQuery("#ioHeaderTimeStart").change(function() 3448 { 3449 end_timepicker = jQuery("#ioHeaderTimeEnd"); 3450 if(jQuery("#ioHeaderDateStart").val() === jQuery("#ioHeaderDateEnd").val()){ 3451 end_timepicker.timepicker("option",{"minTime": jQuery(this).val()}); 3452 if(EndTimeLessThanStartTime( 3453 jQuery(this).val(), 3454 end_timepicker.val(), 3455 jQuery("#ioHeaderDateStart").val(), 3456 jQuery("#ioHeaderDateEnd").val() ) ) { 3457 end_timepicker.val(""); 3458 } 3459 } 3460 }); 3461 } 3462 3463 /* 3464 helper function to see if the value from a start timepicker is less than the string value of an end timepicker. 3465 3466 param start_time: string representation of the start time picker. 12hr or 24hr. 3467 param end_time: string representation of the end time picker. 12hr or 24hr. 3468 param start_date: string representation of the start date, seperated by "/". Can be wither d/m/y or m/d/y. Pass "0/0/0" if dates do not matter. 3469 param end_date: string representation of the end date, seperated by "/". Can be wither d/m/y or m/d/y. Pass "0/0/0" if dates do not matter. 3470 3471 */ 3472 function EndTimeLessThanStartTime(start_time, end_time, start_date, end_date){ 3473 if(!start_time || !end_time) return false;
3474 start_time = convert12HourTo24Hour(start_time); 3475 end_time = convert12HourTo24Hour(end_time); 3476 var split_start_date = start_date.split("/"); 3477 var split_end_date = end_date.split("/"); 3478 var startDate = buildDateObj(split_start_date, start_time); 3479 var endDate = buildDateObj(split_end_date, end_time); 3480 if(endDate < startDate){ 3481 return true; 3482 } else { 3483 return false; 3484 } 3485 } 3486 function get_cart_timepickers(timepicker_name){ 3487 let start_timepicker = document.getElementsByName(timepicker_name.replace("io_timepicker_", "start_timeslot_")); 3488 let end_timepicker = document.getElementsByName(timepicker_name.replace("io_timepicker_", "end_timeslot_")); 3489 start_timepicker = start_timepicker[start_timepicker.length-1]; 3490 end_timepicker = end_timepicker[end_timepicker.length-1]; 3491 return Array(start_timepicker, end_timepicker); 3492 } 3493 function restrictStartTimepickerOnSameDaySelect(start_date_str, start_timepicker, end_timepicker){ 3494 let selected_date_obj = convertDateStringtoDateObject(start_date_str); 3495 let current_date_obj = new Date(); 3496 if(current_date_obj.getDate() == selected_date_obj.getDate() && 3497 current_date_obj.getMonth() == selected_date_obj.getMonth() && 3498 current_date_obj.getYear() == selected_date_obj.getYear()){ 3499 let next_hour_time_stamp = current_date_obj.setMinutes(60); 3500 let next_hour_str = getFormattedtime(new Date(next_hour_time_stamp)) 3501 start_timepicker.timepicker("option",{"minTime": next_hour_str}); 3502 3503 /* If the time in the input box is less than the time we just restricted too, then clear time inputs */ 3504 restricted_time_obj = convertDateStringtoDateObject(start_date_str, next_hour_str); 3505 currently_selected_time_obj = convertDateStringtoDateObject(start_date_str, start_timepicker.val()); 3506 if(currently_selected_time_obj < restricted_time_obj){ 3507 start_timepicker.val(next_hour_str); 3508 end_timepicker.val(""); 3509 end_timepicker.timepicker("option",{"minTime": next_hour_str}); 3510 } 3511 }else{ 3512 start_timepicker.timepicker("option",{"minTime": restrictTimeStart}); 3513 } 3514 } 3515 /*</editor-fold>*/ 3516 3517 /*<editor-fold defaultstate="collapsed" desc="Simple Cart Bound Functions">*/ 3518 function cart_onUpdate() { 3519 /* need slight delay so simplecart updates before this runs */ 3520 setTimeout(cart_onUpdate2, 500); 3521 try{ 3522 for(var i=0;i<document.getElementsByClassName("ioCart").length;i++){ 3523 document.getElementsByClassName("ioCart")[i].setAttribute("cnt", simpleCart.items().length); 3524 } 3525 }catch(e){} 3526 } 3527 3528 function cart_onUpdate2() { 3529 jQuery("#cartSubtotal").html(simpleCart.toCurrency(simpleCart.total())); 3530 if(io_checkavail=="off") return; 3531 jQuery("#cartWarning").hide(); 3532 let hasUnavail = false; 3533 gift_cards_only = false; 3534 simpleCart.each(function (item, x) { 3535 let item_id = item.get("id"); 3536 var giftCardValue = item.get("giftcardvalue"); 3537 if (giftCardValue && giftCardValue.trim()) { 3538 gift_cards_only = true; 3539 } 3540 let avail = 0; 3541 let stop_loop = false; 3542 if (item.get("availability") != null) avail = item.get("availability").replace(" available", ""); 3543 let quantity = Number(item.get("quantity")); 3544 if(item.get("inputtype") == "Map"){ 3545 quantity = 1 3546 } 3547 if(typeof item.get("availability") != 'undefined'){ 3548 if (quantity > Number(avail) || avail == "not") { 3549 /* item.set("availability","<span style=color:red>"+item.get("availability")+"</span>"); */ 3550 setTimeout(function () { 3551 jQuery("#cartItem_" + item_id + " .item-availability").css("color", "red") 3552 }, 10); 3553 //jQuery("#cartWarning").show(); 3554 stop_loop = display_cart_warning(item); 3555 hasUnavail = true; 3556 } else { 3557 jQuery("#cartItem_" + item_id + " .item-availability").css("color", "inherit"); 3558 } 3559 }else{ 3560 event_times = getAvailTimes(); 3561 if(!event_times[0] || !event_times[1]){ 3562 jQuery("#cartWarning").text("Please set the date and time for your event above."); 3563 jQuery("#cartWarning").show() 3564 } 3565 } 3566 3567 var timeslots_html = item.get("timeslots"); 3568 if(typeof timeslots_html != "undefined"){ 3569 if(timeslots_html.length > 0){ 3570 var timeslot_name = getTimeslotName(timeslots_html); 3571 if(timeslots_html.indexOf("<select") >= 0){ 3572 setTimeslotSelected(item, timeslot_name); 3573 }else{ 3574 setTimePicker(item, timeslot_name); 3575 } 3576 } 3577 } 3578 if(stop_loop){ 3579 return false;
3580 } 3581 }); 3582 3583 if(gift_cards_only){ 3584 jQuery("#cartCalendarTimePickerContainer").hide(); 3585 }else{ 3586 jQuery("#cartCalendarTimePickerContainer").show(); 3587 } 3588 3589 if(hasUnavail && io_checkavail!="off"){ 3590 jQuery(".simpleCart_checkout").removeClass("simpleCart_checkout").addClass("simpleCart_checkout_off").trigger("classChange").click(cartShow); 3591 }else if(io_checkavail!="off"){ 3592 jQuery(".simpleCart_checkout_off").removeClass("simpleCart_checkout_off").addClass("simpleCart_checkout").trigger("classChange"); 3593 } 3594 3595 add_cart_buttons = document.querySelectorAll("[class*=add_cart_]"); 3596 if(add_cart_buttons){ 3597 for(let i = 0; i < add_cart_buttons.length; ++i){ 3598 add_cart_buttons[i].innerHTML = add_cart_buttons[i].innerHTML.replace("fa-cart-arrow-down", "fa-shopping-cart"); 3599 add_cart_buttons[i].innerHTML = add_cart_buttons[i].innerHTML.replace("Added to Cart", "Add to Cart"); 3600 add_cart_buttons[i].style.filter = "brightness(100%)"; 3601 simpleCart.each(function (item, x) { 3602 if( add_cart_buttons[i].className.includes( item.get("rentalid") ) ){ 3603 add_cart_buttons[i].innerHTML = add_cart_buttons[i].innerHTML.replace("fa-shopping-cart", "fa-cart-arrow-down"); 3604 add_cart_buttons[i].innerHTML = add_cart_buttons[i].innerHTML.replace("Add to Cart", "Added to Cart"); 3605 add_cart_buttons[i].style.filter = "brightness(90%)"; 3606 } 3607 }); 3608 } 3609 } 3610 3611 /* init time-based items */ 3612 if(document.location.href.indexOf("io_quoteform") == -1){ 3613 let today = new Date(); 3614 let io_dd = today.getDate(); 3615 let io_mm = today.getMonth() + 1; 3616 let io_yyyy = today.getFullYear(); 3617 if(restrictTimes){ 3618 jQuery(".item-timeslots .timepicker").each( function() { 3619 if(this.name.includes("end")){ 3620 start_timepicker = jQuery("input[name='"+this.name.replace("end", "start")+"']"); 3621 start_timepicker = jQuery(start_timepicker[start_timepicker.length - 1]); 3622 3623 if (io_force_blank_timepickers == "on") 3624 { 3625 start_timepicker.val(""); 3626 jQuery(this).timepicker({ 3627 startTime: "", 3628 endTime: "", 3629 minTime: restrictTimeStart, 3630 maxTime: restrictTimeEnd, 3631 timeFormat: timeFormat, 3632 separator: ":", 3633 className: "elementor-widget-text-editor", 3634 step: 15, 3635 disableTouchKeyboard: true 3636 }); 3637 } 3638 else 3639 { 3640 // Existing logic if "force blank" is not active 3641 if (start_timepicker.val() != "") { 3642 jQuery(this).timepicker({ 3643 startTime: new Date(io_mm+"/"+io_dd+"/"+io_yyyy + " " + start_default), 3644 endTime: new Date(io_mm+"/"+io_dd+"/"+io_yyyy + " " + end_default), 3645 minTime: start_timepicker.val(), 3646 maxTime: restrictTimeEnd, 3647 timeFormat: timeFormat, 3648 separator: ":", 3649 className: "elementor-widget-text-editor", 3650 step: 15, 3651 disableTouchKeyboard: true 3652 }); 3653 } else { 3654 jQuery(this).timepicker({ 3655 startTime: new Date(io_mm+"/"+io_dd+"/"+io_yyyy + " " + start_default), 3656 endTime: new Date(io_mm+"/"+io_dd+"/"+io_yyyy + " " + end_default), 3657 minTime: restrictTimeStart, 3658 maxTime: restrictTimeEnd, 3659 timeFormat: timeFormat, 3660 separator: ":", 3661 className: "elementor-widget-text-editor", 3662 step: 15, 3663 disableTouchKeyboard: true 3664 }); 3665 } 3666 } 3667 3668 } 3669 else { 3670 if (io_force_blank_timepickers == "on") 3671 { 3672 start_timepicker.val(""); 3673 jQuery(this).timepicker({ 3674 startTime: "", 3675 endTime: "", 3676 minTime: restrictTimeStart, 3677 maxTime: restrictTimeEnd, 3678 timeFormat: timeFormat, 3679 separator: ":", 3680 className: "elementor-widget-text-editor", 3681 step: 15, 3682 disableTouchKeyboard: true 3683 }); 3684 } 3685 else 3686 { 3687 jQuery(this).timepicker({ 3688 startTime: new Date(io_mm+"/"+io_dd+"/"+io_yyyy + " " + start_default), 3689 endTime: new Date(io_mm+"/"+io_dd+"/"+io_yyyy + " " + end_default), 3690 minTime:restrictTimeStart, 3691 maxTime:restrictTimeEnd, 3692 timeFormat: timeFormat, 3693 separator: ":", 3694 className: "elementor-widget-text-editor", 3695 step: 15, 3696 disableTouchKeyboard: true 3697 }); 3698 } 3699 } 3700 }); 3701 } else{ 3702 jQuery(".item-timeslots .timepicker").each( function() { 3703 if(this.name.includes("end") != -1){ 3704 start_timepicker = jQuery("input[name='"+this.name.replace("end", "start")+"']"); 3705 start_timepicker = jQuery(start_timepicker[start_timepicker.length - 1]); 3706 if (io_force_blank_timepickers == "on") 3707 { 3708 start_timepicker.val(""); 3709 jQuery(this).timepicker({ 3710 startTime: "", 3711 endTime: "", 3712 minTime: restrictTimeStart, 3713 maxTime: restrictTimeEnd, 3714 timeFormat: timeFormat, 3715 separator: ":", 3716 className: "elementor-widget-text-editor", 3717 step: 15, 3718 disableTouchKeyboard: true 3719 }); 3720 } 3721 else 3722 { 3723 if (start_timepicker.val() != "") { 3724 jQuery(this).timepicker({ 3725 startTime: new Date(io_mm + "/" + io_dd + "/" + io_yyyy + " " + start_default), 3726 endTime: new Date(io_mm + "/" + io_dd + "/" + io_yyyy + " " + end_default), 3727 minTime: start_timepicker.val(), 3728 timeFormat: timeFormat, 3729 separator: ":", 3730 className: "elementor-widget-text-editor", 3731 step: 15, 3732 disableTouchKeyboard: true 3733 }); 3734 } else { 3735 jQuery(this).timepicker({ 3736 startTime: new Date(io_mm + "/" + io_dd + "/" + io_yyyy + " " + start_default), 3737 endTime: new Date(io_mm + "/" + io_dd + "/" + io_yyyy + " " + end_default), 3738 timeFormat: timeFormat, 3739 separator: ":", 3740 className: "elementor-widget-text-editor", 3741 step: 15, 3742 disableTouchKeyboard: true 3743 }); 3744 } 3745 } 3746 } 3747 else 3748 { 3749 if (io_force_blank_timepickers == "on") 3750 { 3751 start_timepicker.val(""); 3752 jQuery(this).timepicker({ 3753 startTime: "", 3754 endTime: "", 3755 minTime: restrictTimeStart, 3756 maxTime: restrictTimeEnd, 3757 timeFormat: timeFormat, 3758 separator: ":", 3759 className: "elementor-widget-text-editor", 3760 step: 15, 3761 disableTouchKeyboard: true 3762 }); 3763 } 3764 else 3765 { 3766 jQuery(this).timepicker({ 3767 startTime: new Date(io_mm + "/" + io_dd + "/" + io_yyyy + " " + start_default), 3768 endTime: new Date(io_mm + "/" + io_dd + "/" + io_yyyy + " " + end_default), 3769 timeFormat: timeFormat, 3770 separator: ":", 3771 className: "elementor-widget-text-editor", 3772 step: 15, 3773 disableTouchKeyboard: true 3774 }); 3775 } 3776 } 3777 }); 3778 } 3779 setUpTimeRestrictions_timeBasedItems(); 3780 if(!event_time_set()){ 3781 jQuery(".itemRow .item-total").hide(); 3782 }else{ 3783 jQuery(".itemRow .item-total").show(); 3784 } 3785 } 3786 } 3787 function cart_beforeCheckout(data) { 3788 data.startdate = jQuery("input[name=dateStart]").val(); 3789 data.enddate = jQuery("input[name=dateEnd]").val(); 3790 if(getCookie("guid")){ 3791 data.guid = getCookie("guid"); 3792 }else{ 3793 data.io_custguid = fetchAndSetCookie("guid"); 3794 } 3795 if(io_company_timeslots.length != 0 && io_cartdayselect == "single_day"){ 3796 let cart_company_timeslot_selected = jQuery(".ioCartCompanyTimeslots option:selected").first().val(); 3797 if(cart_company_timeslot_selected){
3798 setCookie("io_company_timeslot_selected", cart_company_timeslot_selected, 14); 3799 cart_company_timeslot_selected = cart_company_timeslot_selected.split("-"); 3800 data.starttime = cart_company_timeslot_selected[0]; 3801 data.endtime = cart_company_timeslot_selected[1]; 3802 } 3803 } else { 3804 data.starttime = jQuery("input[name=timeStart]").val(); 3805 data.endtime = jQuery("input[name=timeEnd]").val(); 3806 } 3807 } 3808 function cart_beforeAdd(item) { 3809 var main_id = jQuery(".io_product_container .item_rentalid").first().text(); 3810 var item_id = item.get("rentalid"); 3811 3812 timeslots = item.get("timeslots"); 3813 if(timeslots){ 3814 if(timeslots.indexOf("<select") !== -1){ 3815 timeslot_name_id_start_pos = timeslots.lastIndexOf('name="timeslot_') + 'name="timeslot_'.length; 3816 timeslot_name_id_end_pos = timeslots.indexOf('"', timeslot_name_id_start_pos); 3817 new_timeslots = [timeslots.slice(0, timeslot_name_id_start_pos), item_id, timeslots.slice(timeslot_name_id_end_pos,timeslots.length)] 3818 new_timeslots = new_timeslots.join("") 3819 item.set("timeslots", new_timeslots); 3820 }else if(timeslots.indexOf("<div name=\"io_timepicker_") !== -1){ 3821 timeslot_name_id_start_pos = timeslots.lastIndexOf('name="io_timepicker_') + 'name="io_timepicker_'.length; 3822 timeslot_name_id_end_pos = timeslots.indexOf('"', timeslot_name_id_start_pos); 3823 new_timeslots = [timeslots.slice(0, timeslot_name_id_start_pos), item_id, timeslots.slice(timeslot_name_id_end_pos,timeslots.length)] 3824 new_timeslots = new_timeslots.join("") 3825 3826 timeslot_name_id_start_pos = new_timeslots.lastIndexOf('name="start_timeslot_') + 'name="start_timeslot_'.length; 3827 timeslot_name_id_end_pos = new_timeslots.indexOf('"', timeslot_name_id_start_pos); 3828 new_timeslots = [new_timeslots.slice(0, timeslot_name_id_start_pos), item_id, new_timeslots.slice(timeslot_name_id_end_pos,new_timeslots.length)] 3829 new_timeslots = new_timeslots.join("") 3830 3831 timeslot_name_id_start_pos = new_timeslots.lastIndexOf('name="end_timeslot_') + 'name="end_timeslot_'.length; 3832 timeslot_name_id_end_pos = new_timeslots.indexOf('"', timeslot_name_id_start_pos); 3833 new_timeslots = [new_timeslots.slice(0, timeslot_name_id_start_pos), item_id, new_timeslots.slice(timeslot_name_id_end_pos,new_timeslots.length)] 3834 new_timeslots = new_timeslots.join("") 3835 3836 item.set("timeslots", new_timeslots); 3837 } 3838 3839 } 3840 /* Here we are checking if we are on an item page and if we are adding the main item. 3841 If this is not true, we do not want to continue. Bail here. */ 3842 if((!main_id || !item_id)){ 3843 return true; 3844 }else if (item_id != main_id){ 3845 /* we are adding an accessory, We want to forcibly add the main item first. */ 3846 /* IO-26864 */ 3847 jQuery("#bookNowBtn").click(); 3848 } 3849 let required_dropdown_values = jQuery(".io_acc_li").filter(function() { 3850 let required_ele = jQuery(this).find(".item_required"); 3851 let required = 0; 3852 if(required_ele[0]){ 3853 required = required_ele[0].outerText; 3854 } 3855 let dropdown_ele = jQuery(this).find(".item_accessorydd"); 3856 let dropdown = 0; 3857 if(dropdown_ele[0]){ 3858 dropdown = dropdown_ele[0].outerText; 3859 } 3860 return (required > 0 && dropdown == 1) 3861 }); 3862 var required_selected = true; 3863 required_dropdown_values.each(function() { 3864 required_value_id = jQuery(this).find(".item_rentalid")[0].outerText; 3865 required_value_id = required_value_id.split("_"); 3866 required_value_id = required_value_id[required_value_id.length-1]; 3867 3868 let selected = jQuery("[id^='io_acc_"+required_value_id+"']").filter(function() { 3869 return this["selected"]; 3870 }); 3871 3872 //IO-22431 - This wasnt catching if [0] was undefined 3873 if(jQuery(this).find(".io_acc_li_name")[0] != undefined){ 3874 required_value_name = jQuery(this).find(".io_acc_li_name")[0].outerText ? jQuery(this).find(".io_acc_li_name")[0].outerText : ""; 3875 } 3876 if(selected.length < jQuery(this).find(".item_required")[0].outerText){ 3877 if(item_id == main_id){ 3878 alert(required_value_name+" is a required field."); 3879 } 3880 required_selected = false;
3881 } 3882 3883 if(!required_selected){ 3884 return false; 3885 } 3886 return true; 3887 }); 3888 if(!required_selected){ 3889 return false; 3890 } 3891 3892 /* IO-14857 */ 3893 if(jQuery(".io_product_measurement_price").length > 0){ 3894 let units; 3895 if(jQuery(".io_product_infobox .item_qtytype").text() == "Area"){ 3896 units = "sq meters" 3897 if(country === "US") units = "sq feet" 3898 }else if(jQuery(".io_product_infobox .item_qtytype").text() == "Perimeter"){ 3899 units = "meters" 3900 if(country === "US") units = "feet" 3901 } 3902 item.set("units", units); 3903 item.set("quantity", jQuery(".io_measure_price_raw_measurement").text()); 3904 } 3905 } 3906 function cart_afterAdd(item) { 3907 /*loading animation*/ 3908 ioCartLoaderActivate(); 3909 setTimeout(function(){ if(io_cart_loading_active && io_cart_loading_count === 0){ io_cart_loading_active=false; ioCartShowOverlay(false);} }, 300); 3910 3911 /* Add required Accessories */ 3912 let required_accs = jQuery("[id^=io_acc_required_]").filter(function() { 3913 return parseInt(this["outerText"]) > 0 && this.parentElement.style['display'] != 'none'; 3914 }); 3915 required_accs.each(function(index) { 3916 simpleCart.parse_html_and_add(this, true); 3917 }); 3918 3919 3920 let selected_values = jQuery("[id^=io_acc_]").filter(function() { 3921 return this["selected"]; 3922 }); 3923 3924 selected_values.each(function() { 3925 let info = {}; 3926 let rid = jQuery(this).find(".item_rentalid")[0].outerText; 3927 let split_rid = rid.split("_"); 3928 if(split_rid.length == 3){ 3929 let parent_rid = split_rid[1]; 3930 let main_item_rid = split_rid[0]; 3931 info["acc_dd_parent_limit"] = jQuery("#io_acc_accessorylimit_"+main_item_rid+"_"+parent_rid)[0].outerText; 3932 }else{ 3933 info["acc_dd_parent_limit"] = "0"; 3934 } 3935 info["name"] = jQuery(this).find(".io_acc_li_name")[0].outerText 3936 info["qtyincrement"] = jQuery(this).find(".item_qtyincrement")[0].outerText 3937 info["quantity"] = jQuery(this).find(".item_required")[0].outerText > 0 ? jQuery(this).find(".item_required")[0].outerText : 1; 3938 info["rentalid"] = jQuery(this).find(".item_rentalid")[0].outerText 3939 info["linkqty"] = jQuery(this).find(".item_linkqty")[0].outerText 3940 info["pagename"] = io_pagename; 3941 if(jQuery(this).find(".io_acc_li_img_thumb")[0]){ 3942 info["image"] = jQuery(this).find(".io_acc_li_img_thumb")[0].src 3943 } 3944 let already_added = simpleCart.items().filter((item) => item.get("rentalid").startsWith(split_rid[0]+"_"+split_rid[1])); 3945 if(jQuery(this).find(".item_accessorydd")[0].outerText != 1 && 3946 (info["acc_dd_parent_limit"] == "0" || already_added.length < info["acc_dd_parent_limit"]) ){ 3947 simpleCart.add(info, true); 3948 } 3949 }); 3950 3951 checkAvailCartOnly(true); 3952 3953 let last_upsell_call_time = Date.now() - last_upsell_call; 3954 if(in_cart_upsell && last_upsell_call_time > 2000){ 3955 let rental_ids = ""; 3956 3957 /* Get the last element in the cart. This is the last item added. */ 3958 last_added = jQuery("[id^='cartItem_']").last(); 3959 if(last_added.length){ 3960 last_added_children = last_added.children(); 3961 for(let i = 0; i < last_added_children.length; ++i){ 3962 if(last_added_children[i].className == "item-rentalid") { 3963 rental_ids += last_added_children[i].innerText + "|"; 3964 } 3965 } 3966 } 3967 3968 if(rental_ids.length>0 && jQuery("#cartPopover").attr("class") == "cartIn"){ 3969 var times = getAvailTimes(); 3970 last_upsell_call = Date.now(); 3971 getUpsellsCall(times[0],times[1],times[2],rental_ids,updateCartUpsell); 3972 } 3973 else{ 3974 jQuery("#cart-carousel-container").hide(); 3975 } 3976 } 3977 3978 if(io_company_timeslots.length != 0 && io_cartdayselect == "single_day"){ 3979 filterTimeslotsByDay_itemTimeslots(); 3980 simpleCart.update(); 3981 } 3982 3983 if (jQuery(".cartInfo.open,.ioCart.open, .ioCart_link.open").length == 0) { 3984 setTimeout(function () { 3985 cartShow(); 3986 }, 100); 3987 } 3988 3989 if(simpleCart.items().length==0){
3990 jQuery(".simpleCart_checkout").hide() 3991 }else{ 3992 jQuery(".simpleCart_checkout").show(); 3993 } 3994 3995 if(simpleCart.items().length > 0){ 3996 let headerBookButton = jQuery("a[href$='io_quoteform/']"); 3997 headerBookButton.addClass("ioCart_link"); 3998 headerBookButton.attr("href", "javascript:;"); 3999 } 4000 4001 checkRestrictedDeliveries() 4002 4003 if(jQuery("#ioInfoHeader").length){ 4004 header_increment_step(); 4005 } 4006 } 4007 function cart_afterQtyChange(){ 4008 let last_checkAvail_call_time = Date.now() - last_checkAvail_call; 4009 if(last_checkAvail_call_time > 2000){ 4010 /*loading animation*/ 4011 ioCartLoaderActivate(); 4012 setTimeout(function(){ if(io_cart_loading_active && io_cart_loading_count === 0){ io_cart_loading_active=false; ioCartShowOverlay(false);} }, 300); 4013 last_checkAvail_call = Date.now(); 4014 checkAvailCart(); 4015 checkAvailCartTimeslots(); 4016 } 4017 } 4018 function cart_hideTimepickerWrapper(){ 4019 jQuery(".ui-timepicker-wrapper").hide(); 4020 } 4021 function cart_beforeRemove() { 4022 last_remove = Date.now(); 4023 } 4024 function cart_afterRemove(removed_item){ 4025 checkAvailCart(); 4026 last_upsell_call_time = Date.now() - last_upsell_call; 4027 if(in_cart_upsell && last_upsell_call_time > 2000){ 4028 rental_ids = getAllRentalIDsFromCart(); 4029 if(rental_ids.length>0 && jQuery("#cartPopover").attr("class") == "cartIn"){ 4030 var times = getAvailTimes(); 4031 last_upsell_call = Date.now(); 4032 getUpsellsCall(times[0],times[1],times[2],rental_ids,updateCartUpsell); 4033 } 4034 else{ 4035 jQuery("#cart-carousel-container").hide(); 4036 } 4037 } 4038 4039 /* IO-24060 */
4040 simpleCart.items().forEach(function (item, index) { 4041 let expression = '^' + removed_item.get('rentalid') + '(?:[_:]\\d+)*'; 4042 if(item.get("rentalid").match(expression)){ 4043 item.remove(); 4044 } 4045 }); 4046 4047 4048 checkAvailCartTimeslots(); 4049 checkRestrictedDeliveries(); 4050 if(simpleCart.items().length==0){ 4051 jQuery(".simpleCart_checkout").hide() 4052 }else{ 4053 jQuery(".simpleCart_checkout").show(); 4054 } 4055 4056 if(jQuery("#ioInfoHeader").length && simpleCart.items().length == 0){ 4057 jQuery("#io-step-3").removeClass("io-step-active"); 4058 jQuery("#io-step-2").addClass("io-step-active"); 4059 jQuery("#io-step-2").removeClass("io-step-done") 4060 } 4061 } 4062 function cart_afterLoad(){ 4063 var items_removed = false; 4064 simpleCart.items().forEach(function(item){ 4065 if(item.get("pagename") != io_pagename){ 4066 item.remove() 4067 items_removed = true; 4068 } 4069 }) 4070 if(items_removed){ 4071 alert("Some items in the cart are from a different location and have been removed."); 4072 } 4073 } 4074 /*</editor-fold>*/ 4075 4076 /*<editor-fold defaultstate="collapsed" desc="Date/Time Object/String Conversion Functions">*/ 4077 function getFormatteddate(date_obj){ 4078 if(dateFormat.substring(0,1)=='d'){ 4079 let month = date_obj.getMonth() + 1; 4080 formatteddate = date_obj.getDate()+'/'+month+'/'+date_obj.getFullYear(); 4081 }else{ 4082 let month = date_obj.getMonth() + 1; 4083 formatteddate = month+'/'+date_obj.getDate()+'/'+date_obj.getFullYear(); 4084 } 4085 return formatteddate; 4086 } 4087 4088 function getFormattedtime(date_obj){ 4089 var hour24 = false;
4090 var ampm = 'am'; 4091 var starttime = jQuery('[name=timeStart]').val(); 4092 if(starttime.length>0 && starttime.indexOf('m')==-1) hour24 = true; 4093 if(hour24){ //24 hour return 4094 return date_obj.getHours()+':'+pad(date_obj.getMinutes(),2); 4095 }else{ //12 hour return 4096 var hour = date_obj.getHours(); 4097 if(hour==12) ampm='pm'; 4098 if(hour==0) hour=12; 4099 if(hour>12){ 4100 hour-=12; 4101 ampm='pm'; 4102 } 4103 return hour+':'+pad(date_obj.getMinutes(),2)+' '+ampm; 4104 } 4105 } 4106 4107 function buildDateobjectstring(date,dateformat,time){ 4108 var ampm = 'am'; 4109 var hour24 = false; 4110 if(typeof date == "undefined") return; 4111 if(typeof dateformat == "undefined") return; 4112 var start_arr = date.split('/'); 4113 if(dateformat.substring(0,1)=='d'){ 4114 date = start_arr[2]+'/'+pad(start_arr[1],2)+'/'+pad(start_arr[0],2); 4115 }else{ 4116 date = start_arr[2]+'/'+pad(start_arr[0],2)+'/'+pad(start_arr[1],2); 4117 } 4118 if(time.length>0 && time.indexOf('m')==-1) hour24 = true; 4119 if(hour24){ 4120 try{ 4121 var time_arr = time.split(':'); 4122 var hour = parseInt(time_arr[0]); 4123 var min = pad(time_arr[1], 2); 4124 time = hour + ':' + min + ':00'; 4125 }catch(err){ 4126 time = ""; 4127 } 4128 }else { 4129 try { 4130 time = time.replace('am', "").replace(' ', ""); 4131 if (time.indexOf('pm') != -1) ampm = 'pm'; 4132 time = time.replace('pm', "").replace(' ', ""); 4133 var time_arr = time.split(':'); 4134 var hour = parseInt(time_arr[0]); 4135 var min = pad(time_arr[1], 2); 4136 if (ampm == 'pm') { 4137 if (hour < 12) hour += 12; 4138 } else if (ampm == 'am' && hour == 12) { 4139 hour -= 12; 4140 } 4141 hour = pad(hour, 2); 4142 time = hour + ':' + min + ':00'; 4143 } catch (err) { 4144 time = ""; 4145 } 4146 } 4147 return date+' '+time; 4148 } 4149 4150 function pad(num, size) { 4151 var s = num+""; 4152 while (s.length < size) s = "0" + s; 4153 return s; 4154 } 4155 function convertDateStringtoDateObject(date_str, time_str=null){ 4156 if(date_str){ 4157 split_date_str = date_str.split("/"); 4158 /* Parse start and end time. */ 4159 if(time_str){ 4160 /* Check and see if we are in 12 hour format, if so convert it to 24 hour format. */ 4161 split_time_str = convert12HourTo24Hour(time_str); 4162 }else{ 4163 /* If we do not have a time, then default to zeros */ 4164 split_time_str = [0, 0]; 4165 } 4166 /* Create date object based off our set date format. */ 4167 date_obj = buildDateObj(split_date_str, split_time_str); 4168 return date_obj; 4169 }else{ 4170 return new Date(); 4171 } 4172 } 4173 4174 function buildDateObj(split_date_str, split_time_str){ 4175 if (dateFormat == "d/m/yy"){ 4176 return new Date(split_date_str[2], (+split_date_str[1] - 1).toString(), split_date_str[0], 4177 split_time_str[0], split_time_str[1]); 4178 }else{ 4179 return new Date(split_date_str[2], (+split_date_str[0] - 1).toString(), split_date_str[1], 4180 split_time_str[0], split_time_str[1]); 4181 } 4182 } 4183 4184 function convert12HourTo24Hour(time_str){ 4185 /* This function returns an array containing hours and minutes of provided string in 24 hour format. */ 4186 /* This is primarily used for creating JS Date objects */ 4187 split_time = time_str.split(":"); 4188 4189 /* We are in 12 hour format if there is an "m" attached to minutes portion. */ 4190 if(split_time[1].toLowerCase().search("m") != -1) { 4191 let separated_minutes = split_time[1].split(" "); 4192 if(separated_minutes.length==1){ 4193 split_time[1] = split_time[1].replace("am"," am"); 4194 split_time[1] = split_time[1].replace("pm"," pm"); 4195 separated_minutes = split_time[1].split(" "); 4196 } 4197 let minutes = separated_minutes[0]; 4198 let modifier = separated_minutes[1]; 4199 split_time[1] = minutes; 4200 4201 /* First assume that if the hours are 12, then its midnight. */ 4202 if(split_time[0] == "12"){ 4203 split_time[0] = "00"; 4204 } 4205 /* Second if there is a "p" in the modifier, then add twelve to the hours. */ 4206 if(typeof modifier != "undefined"){ 4207 if(modifier.toLowerCase().search("p") != -1){ 4208 split_time[0] = (parseInt(split_time[0], 10) + 12); 4209 } 4210 } 4211 } 4212 return split_time; 4213 } 4214 /*</editor-fold>*/ 4215 4216 /*<editor-fold defaultstate="collapsed" desc="Cart Show and Hide">*/ 4217 function cartShow() { 4218 jQuery("#cartPopover").show(); 4219 jQuery("#cartPopover").removeClass("cartOut"); 4220 jQuery("#cartPopover").addClass("cartIn"); 4221 jQuery(".cartInfo,.ioCart,.ioCart_link").addClass("open"); 4222 if (/Mobi|Android/i.test(navigator.userAgent)) { 4223 document.body.style.overflow = "hidden"; 4224 } 4225 /* jQuery(this).one("click", cartHide); */ 4226 jQuery(".cartInfo").unbind("click").one("click", function(event){ 4227 event.stopPropagation(); 4228 event.stopImmediatePropagation(); 4229 cartHide(); 4230 }); 4231 jQuery(".ioCart, .ioCart_link").unbind("click").one("click", function(event){ 4232 event.stopPropagation(); 4233 event.stopImmediatePropagation(); 4234 cartHide(); 4235 }); 4236 jQuery(".cartIcon").removeClass("fa-shopping-cart").addClass("fa-close"); 4237 if(simpleCart.items().length==0){
4238 jQuery(".simpleCart_checkout").hide() 4239 }else{ 4240 jQuery(".simpleCart_checkout").show(); 4241 } 4242 4243 checkAvailCartOnly(); 4244 4245 last_upsell_call_time = Date.now() - last_upsell_call; 4246 if(in_cart_upsell && last_upsell_call_time > 2000){ 4247 rental_ids = getAllRentalIDsFromCart(); 4248 if(rental_ids.length>0 && jQuery("#cartPopover").attr("class") == "cartIn"){ 4249 var times = getAvailTimes(); 4250 last_upsell_call = Date.now(); 4251 getUpsellsCall(times[0],times[1],times[2],rental_ids,updateCartUpsell); 4252 } 4253 else{ 4254 jQuery("#cart-carousel-container").hide(); 4255 } 4256 } 4257 } 4258 4259 function cartHide() { 4260 jQuery("#cartPopover").removeClass("cartIn"); 4261 jQuery("#cartPopover").addClass("cartOut"); 4262 if (/Mobi|Android/i.test(navigator.userAgent)) { 4263 document.body.style.overflow = "auto"; 4264 } 4265 /* jQuery("#cartPopover").hide(); */ 4266 jQuery(".cartInfo,.ioCart, .ioCart_link").removeClass("open"); 4267 /* jQuery(this).one("click", cartShow); */ 4268 jQuery(".cartInfo").unbind("click").one("click", function(event){ 4269 event.stopPropagation(); 4270 event.stopImmediatePropagation(); 4271 cartShow(); 4272 }); 4273 jQuery(".ioCart, .ioCart_link").unbind("click").one("click", function(event){ 4274 event.stopPropagation(); 4275 event.stopImmediatePropagation(); 4276 cartShow(); 4277 }); 4278 jQuery(".cartIcon").removeClass("fa-close").addClass("fa-shopping-cart"); 4279 } 4280 /* 4281 function set_date_cookie(){ 4282 if(this.id.indexOf("start_") !== -1){ 4283 setCookie("dateStart", this.value, 14); 4284 } else if(this.id.indexOf("end_") !== -1){ 4285 setCookie("dateEnd", this.value, 14); 4286 } 4287 } 4288 */ 4289 jQuery(document).ready(function () {setTimeout(simpleCart.init, 3);}); 4290 /*</editor-fold>*/ 4291 4292 /*<editor-fold defaultstate="collapsed" desc="Check Avail All Call">*/ 4293 function checkAvailAll(){ 4294 checkAvailCart(); 4295 checkAvailCartTimeslots(); 4296 checkAvailFilter(); 4297 } 4298 /*</editor-fold>*/ 4299 4300 /*<editor-fold defaultstate="collapsed" desc="Check Avail - Page">*/ 4301 /* for items on page not in cart */ 4302 function checkAvailFilter() { 4303 let rental_names = ""; 4304 let rental_ids = ""; 4305 let batch_ids = []; 4306 let cart_rental_names = ""; 4307 let cart_rental_ids = ""; 4308 let item_id = ""; 4309 let main_id = ""; 4310 jQuery(".item_encoded").each(function(){ 4311 rental_names += this.innerText + "|"; 4312 }); 4313 jQuery(".io_product_infobox .item_rentalid").each(function(){ 4314 rental_ids += this.innerText + "|"; 4315 item_id = this.innerText; 4316 main_id = this.innerText; 4317 }); 4318 let batch_count = 0; 4319 let batch_index = 0; 4320 // If we have rental id string set, then we don't want to include availability checking for fpw items in header 4321 // IO-31498 4322 if(!rental_ids) { 4323 jQuery(".io_item2_list_inner .item_rentalid, .io_item2_listrent .item_rentalid").each(function () { 4324 /* 4325 if(rental_ids.indexOf(this.innerText+"|") == -1){ 4326 rental_ids += this.innerText + "|"; 4327 } 4328 */ 4329 if (batch_count < 9) { 4330 if (!batch_ids.length) batch_ids.push("") 4331 if (!rid_in_batch(this.innerText + "|", batch_ids).length) { 4332 batch_ids[batch_index] += this.innerText + "|"; 4333 batch_count++; 4334 } 4335 } else { 4336 if (!rid_in_batch(this.innerText + "|", batch_ids).length) { 4337 batch_ids[batch_index] += this.innerText + "|"; 4338 batch_index++; 4339 batch_count = 0; 4340 batch_ids.push(""); 4341 } 4342 } 4343 }); 4344 } 4345 simpleCart.each(function (item, x) { 4346 var cart_name = item.get("encoded"); 4347 if(cart_name==null){ 4348 cart_name = encodeURIComponent(item.get("name")); 4349 cart_name = encodeURIComponent(decodeURIComponent(cart_name).replace(/[\u2032\u2019]+/ig,"'")); 4350 } 4351 let quantity = item.get("quantity"); 4352 if(item.get("inputtype") == "Map"){ 4353 quantity = 1 4354 } 4355 cart_rental_names += cart_name + "-" + quantity + "|"; 4356 var cart_id = item.get("rentalid"); 4357 cart_rental_ids += cart_id + "-" + quantity + "|"; 4358 }); 4359 /* #14494 IO-13779 */ 4360 let delivery_methods_arr = []; 4361 var delivery_prices = []; 4362 if(io_delivery_prices){ 4363 if(Object.keys(io_delivery_prices["override"]).includes(item_id)){ 4364 delivery_prices = io_delivery_prices["override"][item_id] 4365 }else{ 4366 if(!item_is_in_overrride_group(main_id)){ 4367 delivery_prices = io_delivery_prices["default"] 4368 } 4369 } 4370 for(item in io_delivery_methods){ 4371 if(delivery_prices.includes(io_delivery_methods[item]["id"])){ 4372 delivery_methods_arr.push(item); 4373 } 4374 } 4375 } 4376
4377 let custom_prices_arr = []; 4378 if(io_custom_prices){ 4379 if(Object.keys(io_custom_prices["override"]).includes(item_id.replace(":", '_'))){ 4380 custom_prices_arr = io_custom_prices["override"][item_id.replace(":", '_')] 4381 }else{ 4382 if(!item_is_in_overrride_group(main_id)){ 4383 custom_prices_arr = io_custom_prices["default"] 4384 } 4385 } 4386 } 4387 4388 /* IO-13548 */ 4389 if(io_accessory_price == "on"){ 4390 let times = getAvailTimes(); 4391 let acc_rental_id_str = getAccIDforPrice(); 4392 let return_id = 0; 4393 if(acc_rental_id_str != ""){ 4394 checkAvailCall(times[0],times[1],times[2],rental_names,acc_rental_id_str,displayAccessoryPrices,0,[],[],return_id,0,null,1,"",1); 4395 } 4396 } 4397 4398 let times = getAvailTimes(); 4399 if(rental_names.length>0){ 4400 if(use_weekday_weekend && rental_ids && !item_is_in_overrride_group(main_id)){ 4401 let return_id = 0; 4402 let week_weekend = ""; 4403 if(rental_ids != ""){ 4404 return_id = 1; 4405 week_weekend = get_week_weekend_times(times, main_id); 4406 checkAvailCall(week_weekend["weekday"][0],week_weekend["weekday"][1],week_weekend["weekday"][2],rental_names,rental_ids,updatePageAvail_weekday,0,cart_rental_ids,cart_rental_names,return_id,1); 4407 checkAvailCall(week_weekend["weekend"][0],week_weekend["weekend"][1],week_weekend["weekend"][2],rental_names,rental_ids,updatePageAvail_weekend,0,cart_rental_ids,cart_rental_names,return_id,1); 4408 } 4409 } 4410 let return_id = 0; 4411 if(rental_ids != "" || batch_ids.length){ 4412 return_id = 1; 4413 } 4414 if(delivery_methods_arr && rental_ids){ 4415 delivery_methods_arr.forEach(function(delivery_method){ 4416 checkAvailCall(times[0],times[1],times[2],rental_names,rental_ids,updatePageAvail_delivery_method,0,cart_rental_ids,cart_rental_names,return_id,1,delivery_method); 4417 }); 4418 } 4419 if(custom_prices_arr && rental_ids){ 4420 custom_prices_arr.forEach(function(custom_price){ 4421 let start_date = times[0]; 4422 let start_time = times[1]; 4423 if(!start_date){ 4424 start_date = getFormatteddate(new Date()); 4425 } 4426 if(!start_time){ 4427 start_time = io_default_start_time; 4428 } 4429 checkAvailCall(start_date,start_time,custom_price['duration'],rental_names,rental_ids,updatePageAvail_custom_price,0,cart_rental_ids,cart_rental_names,return_id,1,"",1,custom_price['name']); 4430 }); 4431 } 4432 4433 if(batch_ids.length){ 4434 batch_ids.forEach(function(rids){ 4435 return checkAvailCall(times[0],times[1],times[2],"",rids,updatePageAvail,0,cart_rental_ids,cart_rental_names,return_id,1,null,1,"",1); 4436 }); 4437 }else{ 4438 return checkAvailCall(times[0],times[1],times[2],rental_names,rental_ids,updatePageAvail,0,cart_rental_ids,cart_rental_names,return_id,1,null,1); 4439 } 4440 } 4441 } 4442 4443 function item_is_in_overrride_group(item_id){ 4444 for(const group_id in io_prices['override_groups']){ 4445 for(const search_id in io_prices['override_groups'][group_id]){ 4446 if(search_id == item_id){ 4447 return true; 4448 } 4449 } 4450 } 4451 return false 4452 } 4453 4454 function get_week_weekend_times(times, rid){ 4455 /* Create a copy instead of reference.*/ 4456 let temp_times = JSON.parse(JSON.stringify(times)); 4457 let start_date = temp_times[0]; 4458 if(!start_date){ 4459 start_date = getFormatteddate(new Date()); 4460 temp_times[0] = start_date; 4461 } 4462 temp_times[1] = io_default_start_time 4463 var newDate1 = convertDateStringtoDateObject(start_date, io_default_start_time); 4464 var newDate2 = convertDateStringtoDateObject(start_date, io_default_end_time); 4465 let time_duration = ((newDate2 - newDate1) / 3600) / 1000; 4466 temp_times[2] = time_duration; 4467 let day = new Date(newDate1).getDay(); //IO-28150 - Other countries put the date dd/mm/yy so using the formatted newDate1 instead of start_date accounts for this 4468 let weekday_weekend = {}; 4469 weekday_weekend["rid"] = rid; 4470 if(io_weekendDefine == "friday-sunday"){ 4471 if(day == 5 || day == 6 || day == 0){ 4472 weekday_weekend["weekend"] = JSON.parse(JSON.stringify(temp_times)); 4473 temp_times[0] = getNextMonday(temp_times[0]); 4474 weekday_weekend["weekday"] = JSON.parse(JSON.stringify(temp_times)); 4475 }else if(day == 1 || day == 2 || day == 3 || day == 4){ 4476 weekday_weekend["weekday"] = JSON.parse(JSON.stringify(temp_times)); 4477 temp_times[0] = getNextSaturday(temp_times[0]); 4478 weekday_weekend["weekend"] = JSON.parse(JSON.stringify(temp_times)); 4479 } 4480 }else if(io_weekendDefine == "saturday-sunday") { 4481 if (day == 6 || day == 0) { 4482 weekday_weekend["weekend"] = JSON.parse(JSON.stringify(temp_times)); 4483 temp_times[0] = getNextMonday(temp_times[0]); 4484 weekday_weekend["weekday"] = JSON.parse(JSON.stringify(temp_times)); 4485 } else if (day == 1 || day == 2 || day == 3 || day == 4 || day == 5) { 4486 weekday_weekend["weekday"] = JSON.parse(JSON.stringify(temp_times)); 4487 temp_times[0] = getNextSaturday(temp_times[0]); 4488 weekday_weekend["weekend"] = JSON.parse(JSON.stringify(temp_times)); 4489 } 4490 }else if (io_weekendDefine == "friday-monday"){ 4491 if(day == 5 || day == 6 || day == 0 || day == 1){ 4492 weekday_weekend["weekend"] = JSON.parse(JSON.stringify(temp_times)); 4493 temp_times[0] = getNextTuesday(temp_times[0]); 4494 weekday_weekend["weekday"] = JSON.parse(JSON.stringify(temp_times)); 4495 }else if(day == 2 || day == 3 || day == 4){ 4496 weekday_weekend["weekday"] = JSON.parse(JSON.stringify(temp_times)); 4497 temp_times[0] = getNextSaturday(temp_times[0]); 4498 weekday_weekend["weekend"] = JSON.parse(JSON.stringify(temp_times)); 4499 } 4500 } 4501 return weekday_weekend; 4502 } 4503 4504 /* 4505 helper function found here: 4506 https://bobbyhadz.com/blog/javascript-get-date-of-next-monday#:~:text=To%20get%20the%20next%20Monday%2C%20we%3A&text=If%20the%20remainder%20is%20equal,month%20for%20the%20next%20Monday. 4507 */ 4508 function getNextMonday(date_str) { 4509 const date_obj = parseDate(date_str, dateFormat); 4510 4511 const nextMonday = new Date( 4512 date_obj.setDate( 4513 date_obj.getDate() + ((7 - date_obj.getDay() + 1) % 7 || 7), 4514 ), 4515 ); 4516 4517 return getFormatteddate(nextMonday); 4518 } 4519 4520 function getNextTuesday(date_str) { 4521 const date_obj = parseDate(date_str, dateFormat); 4522 4523 const nextMonday = new Date( 4524 date_obj.setDate( 4525 date_obj.getDate() + ((7 - date_obj.getDay() + 2) % 7 || 7), 4526 ), 4527 ); 4528 4529 return getFormatteddate(nextMonday); 4530 } 4531 4532 function parseDate(date_str, format) { 4533 var parts = date_str.split(/[/.-]/); 4534 var day, month, year; 4535 4536 if (format === "m/d/yy") {
4537 month = parseInt(parts[0]) - 1; 4538 day = parseInt(parts[1]); 4539 year = parseInt(parts[2]) + (parts[2].length === 2 ? 2000 : 0); 4540 } else if (format === "d/m/yy") { 4541 day = parseInt(parts[0]); 4542 month = parseInt(parts[1]) - 1; 4543 year = parseInt(parts[2]) + (parts[2].length === 2 ? 2000 : 0); 4544 } else if (format === "yy/m/d") { 4545 year = parseInt(parts[0]) + (parts[0].length === 2 ? 2000 : 0); 4546 month = parseInt(parts[1]) - 1; 4547 day = parseInt(parts[2]); 4548 } else { 4549 throw new Error("Unsupported date format"); 4550 } 4551 4552 return new Date(year, month, day); 4553 } 4554 4555 /* modified from function above */ 4556 function getNextSaturday(date_str) { 4557 const date_obj = parseDate(date_str, dateFormat); 4558 4559 const next_friday = new Date( 4560 date_obj.setDate( 4561 date_obj.getDate() + ((7 - date_obj.getDay() + 6) % 7 || 7), 4562 ), 4563 ); 4564 4565 return getFormatteddate(next_friday); 4566 } 4567 4568 function updatePageAvail(data){ 4569 let use_id = data["return_id"] 4570 delete data["return_id"]; 4571 if(use_id == 1){ 4572 updatePageAvail_itemIDs(data) 4573 }else{ 4574 updatePageAvail_itemNames(data); 4575 } 4576 } 4577 function updatePageAvail_weekday(data){ 4578 jQuery.each(data, function (rental_id, qty){ 4579 if (rental_id == "price") { 4580 var prices = qty; 4581 jQuery.each(prices, function (price_id, amt) { 4582 let cust_price = document.querySelector(".io_product_cust_price_weekday"); 4583 if(cust_price==undefined){ 4584 var first_price = document.querySelector(".io_product_price_box"); 4585 if(first_price != null){ 4586 cust_price = first_price.cloneNode(true); 4587 /* clear all classes */ 4588 cust_price.className = ""; 4589 cust_price.classList.add("io_product_price_box"); 4590 cust_price.classList.add("io_product_cust_price_weekday"); 4591 cust_price.style.display = "none"; 4592 first_price.before(cust_price); 4593 } 4594 } 4595 4596 main_item_id = jQuery(".io_product_infobox .item_rentalid").first().text(); 4597 if(main_item_id == price_id && cust_price!=undefined){ 4598 if(typeof amt == "string") amt = Number(amt.replace(",","")); 4599 cust_price.querySelector("p:nth-child(1)").innerHTML=simpleCart.toCurrency(amt); 4600 let times = getAvailTimes(); 4601 cust_price.querySelector("p:nth-child(2)").innerHTML = io_weekDayText; 4602 if(amt>0){ 4603 cust_price.style.display = "grid"; 4604 }else{ 4605 cust_price.style.display = "none"; 4606 } 4607 } 4608 }); 4609 } 4610 }); 4611 } 4612 function updatePageAvail_delivery_method(data){ 4613 var delivery_method = data["delivery_method"] 4614 jQuery.each(data, function (rental_id, qty){ 4615 if (rental_id == "price") { 4616 var prices = qty; 4617 jQuery.each(prices, function (price_id, amt) { 4618 let cust_price = document.querySelector(".io_product_cust_price_delivery_method"+io_delivery_methods[delivery_method]["id"]); 4619 let rid = jQuery(".io_product_container .item_rentalid").first().text(); 4620 if(cust_price==undefined && !io_delivery_methods[delivery_method]["restricted"].includes(rid)){ 4621 var first_price = document.querySelector(".io_product_price_box"); 4622 if(first_price != null){ 4623 cust_price = first_price.cloneNode(true); 4624 /* clear all classes */ 4625 cust_price.className = ""; 4626 cust_price.classList.add("io_product_price_box"); 4627 cust_price.classList.add("io_product_cust_price_delivery_method"+io_delivery_methods[delivery_method]["id"]); 4628 cust_price.style.display = "none"; 4629 first_price.before(cust_price); 4630 } 4631 } 4632 4633 main_item_id = jQuery(".io_product_infobox .item_rentalid").first().text(); 4634 if(main_item_id == price_id && cust_price!=undefined){ 4635 if(typeof amt == "string") amt = Number(amt.replace(",","")); 4636 cust_price.querySelector("p:nth-child(1)").innerHTML=simpleCart.toCurrency(amt); 4637 let times = getAvailTimes(); 4638 cust_price.querySelector("p:nth-child(2)").innerHTML = make_live_price_editable_time(times, delivery_method); 4639 if(amt>0 && event_time_set()){ 4640 cust_price.style.display = "grid"; 4641 }else{ 4642 cust_price.style.display = "none"; 4643 } 4644 } 4645 }); 4646 } 4647 }); 4648 } 4649 function updatePageAvail_custom_price(data, custom_price_name){
4650 let custom_price_class_name = custom_price_name.replace(/[\s:./()!]/g, '_'); 4651 jQuery.each(data, function (rental_id, qty){ 4652 if (rental_id == "price") { 4653 var prices = qty; 4654 jQuery.each(prices, function (price_id, amt) { 4655 let cust_price = document.querySelector(".io_product_cust_price_"+custom_price_class_name); 4656 let rid = jQuery(".io_product_container .item_rentalid").first().text(); 4657 if(cust_price==undefined){ 4658 var first_price = document.querySelector(".io_product_price_box"); 4659 if(first_price != null){ 4660 cust_price = first_price.cloneNode(true); 4661 /* clear all classes */ 4662 cust_price.className = ""; 4663 cust_price.classList.add("io_product_price_box"); 4664 cust_price.classList.add("io_product_cust_price_"+custom_price_class_name); 4665 cust_price.style.display = "none"; 4666 first_price.before(cust_price); 4667 } 4668 } 4669 4670 main_item_id = jQuery(".io_product_infobox .item_rentalid").first().text(); 4671 if(main_item_id == price_id && cust_price!=undefined){ 4672 if(typeof amt == "string") amt = Number(amt.replace(",","")); 4673 cust_price.querySelector("p:nth-child(1)").innerHTML=simpleCart.toCurrency(amt); 4674 cust_price.querySelector("p:nth-child(2)").innerHTML = "for " + custom_price_name; 4675 if(amt>0){ 4676 cust_price.style.display = "grid"; 4677 }else{ 4678 cust_price.style.display = "none"; 4679 } 4680 } 4681 }); 4682 } 4683 }); 4684 } 4685 function updatePageAvail_weekend(data){ 4686 jQuery.each(data, function (rental_id, qty){ 4687 if (rental_id == "price") { 4688 var prices = qty; 4689 jQuery.each(prices, function (price_id, amt) { 4690 let cust_price = document.querySelector(".io_product_cust_price_weekend"); 4691 if(cust_price==undefined){ 4692 var first_price = document.querySelector(".io_product_price_box"); 4693 if(first_price != null){ 4694 cust_price = first_price.cloneNode(true); 4695 /* clear all classes */ 4696 cust_price.className = ""; 4697 cust_price.classList.add("io_product_price_box"); 4698 cust_price.classList.add("io_product_cust_price_weekend"); 4699 cust_price.style.display = "none"; 4700 first_price.before(cust_price); 4701 } 4702 } 4703 4704 main_item_id = jQuery(".io_product_infobox .item_rentalid").first().text(); 4705 if(main_item_id == price_id && cust_price!=undefined){ 4706 if(typeof amt == "string") amt = Number(amt.replace(",","")); 4707 cust_price.querySelector("p:nth-child(1)").innerHTML=simpleCart.toCurrency(amt); 4708 let times = getAvailTimes(); 4709 cust_price.querySelector("p:nth-child(2)").innerHTML = io_weekEndText; 4710 if(amt>0){ 4711 cust_price.style.display = "grid"; 4712 }else{ 4713 cust_price.style.display = "none"; 4714 } 4715 } 4716 }); 4717 } 4718 }); 4719 } 4720 function updatePageAvail_itemIDs(data){ 4721 jQuery.each(data, function (rental_id, qty){ 4722 if (rental_id == "price" && jQuery(".io_product_infobox .item_inputtype").text() != "Map") { 4723 var prices = qty; 4724 jQuery.each(prices, function (price_id, amt) { 4725 let cust_price = document.querySelector(".io_product_cust_price"); 4726 if(cust_price==undefined){ 4727 var first_price = document.querySelector(".io_product_price_box"); 4728 if(first_price != null){ 4729 cust_price = first_price.cloneNode(true); 4730 /* clear all classes */ 4731 cust_price.className = ""; 4732 cust_price.classList.add("io_product_price_box"); 4733 cust_price.classList.add("io_product_cust_price"); 4734 cust_price.style.display = "none"; 4735 first_price.before(cust_price); 4736 } 4737 } 4738 main_item_id = jQuery(".io_product_infobox .item_rentalid").first().text(); 4739 if(main_item_id == price_id && cust_price!=undefined){ 4740 if(typeof amt == "string") amt = Number(amt.replace(",","")); 4741 cust_price.querySelector("p:nth-child(1)").innerHTML=simpleCart.toCurrency(amt); 4742 let times = getAvailTimes(); 4743 cust_price.querySelector("p:nth-child(2)").innerHTML = make_live_price_editable_time(times); 4744 if(amt>0 && (event_time_set() || io_always_display_live_price == "on")){ 4745 cust_price.style.display = "grid"; 4746 }else{ 4747 cust_price.style.display = "none"; 4748 } 4749 } 4750 }); 4751 } 4752 4753 if(qty<=0 && rental_id != "delivery_method"){ 4754 /* cat,all-item,widget */ 4755 if(io_checkavail=="warn"){ 4756 jQuery(".add_cart_"+rental_id.replace(":", "\\\:")+" .item_add").removeClass("item_add").addClass("item_add_off").trigger("classChange"); 4757 jQuery(".unavailable_message_"+rental_id.replace(":", "\\\:")).show(); 4758 }
4759 if(io_checkavail=="hide") jQuery(".add_cart_"+rental_id).parent().parent().parent().hide(); 4760 4761 /* product page */ 4762 if(jQuery(".io_product_container").length && io_checkavail!="off" && jQuery(".io_product_container .item_rentalid").first().text() === rental_id){ 4763 jQuery(".add_cart_"+rental_id.replace(":", "\\\:")+" .item_add").first().removeClass("item_add").addClass("item_add_off").trigger("classChange"); 4764 jQuery(".io_product_container .unavailable_message").show(); 4765 } 4766 }else if(qty>0){ 4767 if(io_checkavail=="warn"){ 4768 jQuery(".add_cart_"+rental_id.replace(":", "\\\:")+" .item_add_off").removeClass("item_add_off").addClass("item_add").trigger("classChange"); 4769 jQuery(".unavailable_message_"+rental_id.replace(":", "\\\:")).hide(); 4770 } 4771 if(io_checkavail=="hide") jQuery(".add_cart_"+rental_id).parent().parent().parent().show(); 4772 4773 /* product page */ 4774 if(jQuery(".io_product_container").length && io_checkavail!="off" && jQuery(".io_product_container .item_rentalid").first().text() === rental_id){ 4775 jQuery(".add_cart_"+rental_id.replace(":", "\\\:")+" .item_add_off").removeClass("item_add_off").addClass("item_add").trigger("classChange"); 4776 jQuery(".io_product_container .unavailable_message").hide(); 4777 } 4778 } 4779 }); 4780 } 4781 function updatePageAvail_itemNames(data){ 4782 jQuery.each(data, function (rental_name, qty) { 4783 rental_name = rental_name.replace(/[\u2032\u2019]+/ig,"'"); 4784 var main_name_temp = ""; 4785 if(typeof main_name_orig != "undefined"){ 4786 main_name_temp = main_name_orig.replace(/[\u2032\u2019]+/ig,"'"); 4787 } 4788 rental_name_esc = rental_name.replace(/'/g, "\\\\'"); 4789 if (rental_name == "price") { 4790 var prices = qty; 4791 jQuery.each(prices, function (price_name, amt) { 4792 /* var prices = document.querySelector(".io_product_price_box:not(.io_product_cust_price)"); */ 4793 /* if(prices != null) prices.remove(); */ 4794 let cust_price = document.querySelector(".io_product_cust_price"); 4795 if(cust_price==undefined){ 4796 var first_price = document.querySelector(".io_product_price_box"); 4797 if(first_price != null){ 4798 cust_price = first_price.cloneNode(true); 4799 /* clear all classes */ 4800 cust_price.className = ""; 4801 cust_price.classList.add("io_product_price_box"); 4802 cust_price.classList.add("io_product_cust_price"); 4803 cust_price.style.display = "none"; 4804 first_price.before(cust_price); 4805 } 4806 } 4807 try{ 4808 var main_name = decodeURIComponent(jQuery(".io_product_container .item_encoded").first().html().replace(/[+]/gi, "%20")); 4809 }catch(e){main_name=""} 4810 var i = main_name.lastIndexOf(":"); 4811 let acc_name = ""; 4812 let rental_name = ""; 4813 var i = main_name.lastIndexOf(":"); 4814 if(i>0){ 4815 rental_name = main_name.substring(0, i); 4816 acc_name = main_name.substring(i+1); 4817 } 4818 if (acc_name.toUpperCase() == price_name.toUpperCase() && cust_price!=undefined){ 4819 var rental_id = document.querySelector(".item_rentalid").innerText; 4820 if(rental_id != null){ 4821 rid_arr = rental_id.split(":"); 4822 /* ignore the main id for this */ 4823 rental_id = rid_arr[rid_arr.length-1]; 4824 if(jQuery("#io_acc_overrideprice_"+rental_id).first().text()>0){ 4825 amt = prices[acc_name]; 4826 }else{ 4827 let item_price = Number(prices[rental_name].replace(",","")); 4828 amt = Number(amt.replace(",","")) + item_price; 4829 amt = simpleCart.toCurrency(amt, {symbol:""}) 4830 } 4831 } 4832 cust_price.querySelector("p:nth-child(1)").innerText="$"+amt; 4833 if(typeof amt == "string") amt = Number(amt.replace(",","")); 4834 let times = getAvailTimes(); 4835 cust_price.querySelector("p:nth-child(2)").innerHTML = make_live_price_editable_time(times); 4836 if(amt>0 && (event_time_set() || io_always_display_live_price == "on")){ 4837 cust_price.style.display = "grid"; 4838 }else{ 4839 cust_price.style.display = "none"; 4840 } 4841 4842 }else if(!rental_name && !acc_name && cust_price!=undefined){ 4843 amt = prices[main_name]; 4844 cust_price.querySelector("p:nth-child(1)").innerText="$"+amt; 4845 if(typeof amt == "string") amt = Number(amt.replace(",","")); 4846 let times = getAvailTimes(); 4847 cust_price.querySelector("p:nth-child(2)").innerHTML = make_live_price_editable_time(times); 4848 if(amt>0 && (event_time_set() || io_always_display_live_price == "on")){ 4849 cust_price.style.display = "grid"; 4850 }else{ 4851 cust_price.style.display = "none"; 4852 } 4853 } 4854 4855 }); 4856 } 4857 4858 if(qty<=0){ 4859 /* cat,all-item,widget */ 4860 if(io_checkavail=="warn"){ 4861 jQuery("div[name='maindiv_"+rental_name_esc+"'] .item_add").removeClass("item_add").addClass("item_add_off").trigger("classChange"); 4862 jQuery("div[name='maindiv_"+rental_name_esc+"'] .unavailable_message").show(); 4863 }
4864 if(io_checkavail=="hide") jQuery("div[name='maindiv_"+rental_name_esc+"']").hide(); 4865 4866 /* product page */ 4867 if(jQuery(".io_product_container").length && io_checkavail!="off"){ 4868 if(main_name_temp==rental_name){ 4869 jQuery(".io_product_container .item_add").first().removeClass("item_add").addClass("item_add_off").trigger("classChange"); 4870 jQuery(".io_product_container .unavailable_message").show(); 4871 } 4872 } 4873 }else if(qty>0){ 4874 /* console.log("good"); */ 4875 if(io_checkavail=="warn"){ 4876 jQuery("div[name='maindiv_"+rental_name_esc+"'] .item_add_off").removeClass("item_add_off").addClass("item_add").trigger("classChange"); 4877 jQuery("div[name='maindiv_"+rental_name_esc+"'] .unavailable_message").hide(); 4878 } 4879 if(io_checkavail=="hide") jQuery("div[name='maindiv_"+rental_name_esc+"']").show(); 4880 4881 /* product page */ 4882 if(jQuery(".io_product_container").length && io_checkavail!="off"){ 4883 if(main_name_temp==rental_name){ 4884 jQuery(".io_product_container .item_add_off").removeClass("item_add_off").addClass("item_add").trigger("classChange"); 4885 jQuery(".io_product_container .unavailable_message").hide(); 4886 } 4887 } 4888 } 4889 }); 4890 } 4891 function displayAccessoryPrices(data) { 4892 if (data.price) { 4893 let acc_prices = data.price; 4894 for (const [key, value] of Object.entries(acc_prices)) { 4895 let new_key = key; 4896 if ((key.match(/_/g) || []).length > 1) { 4897 let split_key = key.split("_"); 4898 let second_to_last = split_key[split_key.length - 2]; 4899 let last = split_key[split_key.length - 1]; 4900 new_key = second_to_last + "_" + last; 4901 } 4902 if (io_hide_zero == 1 && value > 0) { 4903 let id_string = "#io_acc_desc_" + new_key; 4904 let formatted_price = simpleCart.toCurrency(value); 4905 if (jQuery("#io_acc_" + new_key + " .io_acc_price").length > 0) { 4906 jQuery("#io_acc_" + new_key + " .io_acc_price").html(formatted_price); 4907 } else { 4908 let price_display = '<span class="io_acc_price"> ' + formatted_price + ' </span>'; 4909 jQuery(id_string).after(price_display); 4910 } 4911 } else if (io_hide_zero == 0) { 4912 let id_string = "#io_acc_desc_" + new_key; 4913 let formatted_price = simpleCart.toCurrency(value); 4914 if (jQuery("#io_acc_" + new_key + " .io_acc_price").length > 0) { 4915 jQuery("#io_acc_" + new_key + " .io_acc_price").html(formatted_price); 4916 } else { 4917 let price_display = '<span class="io_acc_price"> ' + formatted_price + ' </span>'; 4918 jQuery(id_string).after(price_display); 4919 } 4920 } 4921 } 4922 } 4923 } 4924 function make_live_price_editable_time(times, delivery_method=null) { 4925 if(!delivery_method) delivery_method = getCookie("io_delivery_method"); 4926 let ele_text = ""; 4927 if(times[0]) ele_text = "on " + times[0] + " "; 4928 if(times[2] === 0) times[2] = 1; 4929 if(io_hidetimes!="on" && !isNaN(times[2])) ele_text += "for "+times[2]+" hours "; 4930 if(delivery_method) ele_text += "for " + delivery_method + ". "; 4931 ele_text += '<span style="cursor:pointer; color:blue; text-decoration:underline;" onclick=checkAvailDateClick()>edit</span>'; 4932 return ele_text; 4933 } 4934 function checkAvailDateClick(){ 4935 cartShow(); 4936 /* expand the date picker */ 4937 setTimeout(calSetDateRange,100); 4938 } 4939 function checkAvailPageOnly(){ 4940 checkAvailFilter(); 4941 if(addressCookiesSet() && io_distance_charge){ 4942 runDeliveryCall(true); 4943 } 4944 } 4945 function getAccIDforPrice(){ 4946 let accessory_arr = jQuery(".io_acc_li").toArray(); 4947 let acc_rental_id_str = ""; 4948 for(let current_accessory = 0; current_accessory < accessory_arr.length; current_accessory++){ 4949 let required_tag = jQuery(accessory_arr[current_accessory]).find(".item_required"); 4950 if(required_tag.length > 0){ 4951 if(required_tag[0].innerText == 0){ 4952 acc_rental_id_str += jQuery(accessory_arr[current_accessory]).find(".item_rentalid")[0].innerText +"|"; 4953 } 4954 } 4955 } 4956 return acc_rental_id_str; 4957 } 4958 function getUpsellIDforPrice(){ 4959 let upsell_arr = jQuery(".page-carousel-rid").toArray(); 4960 let upsell_rental_id_str = ""; 4961 for(let current_upsell = 0; current_upsell < upsell_arr.length; current_upsell++){ 4962 upsell_rental_id_str +=upsell_arr[current_upsell].innerText+"|"; 4963 } 4964 return upsell_rental_id_str; 4965 } 4966 function displayUpsellPrices(data){ 4967 if(data.price){ 4968 let upsell_prices = data.price; 4969 for (const [key, value] of Object.entries(upsell_prices)) { 4970 if(io_hide_zero == 1 && value > 0){ 4971 let id_string = "#rid"+ key; 4972 let formatted_price = simpleCart.toCurrency(value); 4973 let price_display ='<span class="page-carousel-price"> '+formatted_price+' </span>'; 4974 jQuery(id_string).after(price_display); 4975 }else if(io_hide_zero == 0){ 4976 let id_string = "#rid"+ key; 4977 let formatted_price = simpleCart.toCurrency(value); 4978 let price_display ='<span class="page-carousel-price"> '+formatted_price+' </span>'; 4979 jQuery(id_string).after(price_display); 4980 } 4981 } 4982 pageFlickityRefresh(); 4983 } 4984 } 4985 /*</editor-fold>*/ 4986 4987 /*<editor-fold defaultstate="collapsed" desc="Check Avail - Cart">*/ 4988 function checkAvailCartOnly(skip_timer=false){ 4989 checkAvailCart(); 4990 checkAvailCartTimeslots(); 4991 } 4992 4993 function checkAvailCartTimeslots(){ 4994 let rental_names = ""; 4995 let rental_ids = "";
4996 let cart_rental_names = ""; 4997 let cart_rental_ids = ""; 4998 let times = getAvailTimes(); 4999 let start_date = times[0]; 5000 let event_duration = times[2]; 5001 let end_date = start_date; 5002 var event_start_time = getCookie("io_timeStart"); 5003 simpleCart.each(function (item, x) { 5004 var timeslots_html = item.get('timeslots'); 5005 if(typeof timeslots_html == "undefined") return; 5006 if(timeslots_html.length == 0) return; 5007 var cart_name = item.get("encoded"); 5008 if(cart_name==null) { 5009 cart_name = encodeURIComponent(item.get("name")); 5010 cart_name = encodeURIComponent(decodeURIComponent(cart_name).replace(/[\u2032\u2019]+/ig,"'")); 5011 } 5012 rental_id = item.get("rentalid"); 5013 5014 var timeslot_name = getTimeslotName(timeslots_html); 5015 var timeslot_sel_range = jQuery(".item-timeslots [name=\""+timeslot_name+"\"] option:selected").val(); 5016 if(typeof timeslot_sel_range != "undefined"){ 5017 /* timeslots */ 5018 setTimeslotSelected(item, timeslot_name); 5019 }else{ 5020 /* timepickers */ 5021 setTimePicker(item, timeslot_name); 5022 let start_timepicker = document.getElementsByName(timeslot_name.replace("io_timepicker_", "start_timeslot_")); 5023 let end_timepicker = document.getElementsByName(timeslot_name.replace("io_timepicker_", "end_timeslot_")); 5024 timeslot_sel_range = start_timepicker[start_timepicker.length-1].value; 5025 timeslot_sel_range += " - " + end_timepicker[end_timepicker.length-1].value; 5026 } 5027 5028 var timeslot_sel_arr = ""; 5029 if(typeof timeslot_sel_range != "undefined"){ 5030 var [start_time, end_time] = break_timeslot_sel_range(timeslot_sel_range); 5031 if(start_time && end_time){ 5032 let newDate1 = convertDateStringtoDateObject(start_date, start_time); 5033 let newDate2 = convertDateStringtoDateObject(end_date, end_time); 5034 let time_duration = ((newDate2 - newDate1) / 3600) / 1000; 5035 let quantity = item.get("quantity"); 5036 if(item.get("inputtype") == "Map"){ 5037 quantity = 1 5038 } 5039 rental_names += cart_name + "-" + quantity+"|"; 5040 rental_ids += rental_id+"-"+quantity+"-"+start_time+"-"+time_duration+"|"; 5041 cart_rental_names = rental_names; 5042 cart_rental_ids = rental_ids; 5043 } 5044 } 5045 }); 5046 if(rental_ids || rental_names){ 5047 checkAvailCall(start_date,event_start_time,event_duration,rental_names,rental_ids,updateCartAvail,1,cart_rental_ids,cart_rental_names,1); 5048 } 5049 return true; 5050 } 5051 5052 function checkAvailCart(){ 5053 let rental_names = ""; 5054 let rental_ids = ""; 5055 let cart_rental_names = ""; 5056 let cart_rental_ids = ""; 5057 simpleCart.each(function (item, x) { 5058 if(typeof item.get('timeslots') != "undefined"){ 5059 if(item.get('timeslots').length > 0){ 5060 return; 5061 } 5062 } 5063 var cart_name = item.get("encoded"); 5064 if(cart_name==null){ 5065 cart_name = encodeURIComponent(item.get("name")); 5066 cart_name = encodeURIComponent(decodeURIComponent(cart_name).replace(/[\u2032\u2019]+/ig,"'")); 5067 } 5068 let quantity = item.get("quantity"); 5069 if(item.get("inputtype") == "Map"){ 5070 quantity = 1 5071 } 5072 rental_names += cart_name + "-" + quantity + "|"; 5073 cart_rental_names += cart_name + "-" + quantity + "|"; 5074 var cart_id = item.get("rentalid"); 5075 rental_ids += cart_id + "-" + quantity + "|"; 5076 cart_rental_ids += cart_id + "-" + quantity + "|"; 5077 }); 5078 var times = getAvailTimes(); 5079 let return_id = 0; 5080 if(rental_ids != ""){ 5081 return_id = 1; 5082 } 5083 if(rental_ids != "" || rental_names != ""){ 5084 return checkAvailCall(times[0],times[1],times[2],rental_names,rental_ids,updateCartAvail,1,cart_rental_ids,cart_rental_names,return_id); 5085 } 5086 return true; 5087 } 5088 function updateCartAvail(data){ 5089 let use_id = data["return_id"] 5090 delete data["return_id"]; 5091 if(use_id == 1){ 5092 updateCartAvail_itemIDs(data) 5093 }else{ 5094 updateCartAvail_itemNames(data); 5095 } 5096 console.log("cart update"); 5097 if(addressCookiesSet() && io_distance_charge){ 5098 runDeliveryCall(true); 5099 } 5100 /* simpleCart.trigger("update"); */
5101 simpleCart.update(); 5102 /* jQuery("#avail").html(output); */ 5103 } 5104 5105 function updateCartAvail_itemIDs(data){ 5106 jQuery.each(data, function (rental_id, qty){ 5107 simpleCart.each(function (item, x) { 5108 if(rental_id == item.get("rentalid")){ 5109 if(io_hideQuantityAvail == "off"){ 5110 if(qty>=9999 || item.get("inputtype") == "Map" || (item.get("giftcardvalue") && item.get("giftcardvalue").trim())){ 5111 item.set("availability", "available"); 5112 }else{ 5113 item.set("availability", qty + " available"); 5114 } 5115 }else if(io_hideQuantityAvail == "on"){ 5116 if(qty<=0 || qty < item.get("quantity")){ 5117 item.set("availability", "not available"); 5118 }else{ 5119 item.set("availability", "available"); 5120 } 5121 } 5122 var vendorid = item.get("vendorid"); 5123 if(vendorid && vendorid.trim()){ 5124 item.set("availability", "availability must be verified"); 5125 } 5126 } 5127 if (rental_id == "price") { 5128 var prices = qty; 5129 jQuery.each(prices, function (price_name, amt) { 5130 if(price_name == item.get("rentalid")){ 5131 if (typeof amt == "string" || amt instanceof String){ 5132 if(amt != "TBD"){ 5133 if(typeof amt == "string") amt = Number(amt.replace(",","")); 5134 } 5135 } 5136 item.set("price", amt); 5137 } 5138 }); 5139 } 5140 }); 5141 }); 5142 } 5143 5144 function updateCartAvail_itemNames(data){ 5145 jQuery.each(data, function (rental_name, qty) { 5146 rental_name = rental_name.replace(/[\u2032\u2019]+/ig,"'"); 5147 simpleCart.each(function (item, x) { 5148 try{ 5149 var cart_name = decodeURIComponent(item.get("encoded").replace(/[+]/gi, "%20")); 5150 }catch(e){cart_name=null} 5151 if(cart_name==null) cart_name = item.get("name") 5152 cart_name = cart_name.replace(/[\u2032\u2019]+/ig,"'"); 5153 var i = cart_name.lastIndexOf(":"); 5154 if(i>0 && cart_name.toUpperCase() != rental_name.toUpperCase() && rental_name!="price"){cart_name = cart_name.substring(i+1)} 5155 if (cart_name.toUpperCase() == rental_name.toUpperCase()) { 5156 if(qty>9999){ 5157 item.set("availability", "available"); 5158 }else{ 5159 item.set("availability", qty + " available"); 5160 } 5161 } 5162 if (rental_name == "price") { 5163 var prices = qty; 5164 jQuery.each(prices, function (price_name, amt) { 5165 price_name = price_name.replace(/[\u2032\u2019]+/ig,"'"); 5166 let acc_name = ""; 5167 let rental_name = ""; 5168 var i = cart_name.lastIndexOf(":"); 5169 if(i>0){ 5170 rental_name = cart_name.substring(0, i); 5171 acc_name = cart_name.substring(i+1); 5172 } 5173 if (acc_name === price_name) { 5174 var rental_id = item.get("rentalid"); 5175 if(rental_id != null){ 5176 rid_arr = rental_id.split(":"); 5177 /* ignore the main id for this */ 5178 rental_id = rid_arr[rid_arr.length-1]; 5179 if(jQuery("#io_acc_overrideprice_"+rental_id).first().text()>0){ 5180 amt = prices[acc_name]; 5181 }else{ 5182 let item_price = Number(prices[rental_name].replace(",","")); 5183 amt = Number(amt.replace(",","")) + item_price; 5184 item.set("price", amt); 5185 return; 5186 } 5187 } 5188 if(amt==null){ 5189 amt = "0"; 5190 } 5191 /* returned price is per unit */ 5192 if(typeof amt == "string") amt = Number(amt.replace(",","")); 5193 item.set("price", amt); 5194 }else if(!rental_name && !acc_name){ 5195 amt = Number(prices[cart_name].replace(",","")); 5196 item.set("price", amt); 5197 } 5198 }); 5199 } 5200 }); 5201 }); 5202 } 5203 /*</editor-fold>*/ 5204 5205 /*<editor-fold defaultstate="collapsed" desc="Upsell Carousels">*/ 5206 function updateCartUpsell(data){ 5207 let cart_carousel = jQuery(".cart-carousel"); 5208 viewport = jQuery(".cart-carousel .flickity-viewport"); 5209 if(viewport.length > 0){ 5210 cart_carousel.flickity("destroy"); 5211 } 5212 cart_carousel.empty(); 5213 data.forEach(function(upsell){ 5214 cell = createCartCarouselCell(upsell["image"], upsell["name"], upsell["page"]); 5215 cart_carousel.append(cell); 5216 }); 5217 makeCarousel(cart_carousel); 5218 jQuery("#cart-carousel-container").show(); 5219 setTimeout(cartFlickityRefresh, 500); 5220 } 5221 5222 function cartFlickityRefresh(){ 5223 jQuery(".cart-carousel").flickity("resize"); 5224 } 5225 5226 //IO-14031 5227 function isMobile() 5228 { 5229 // Modern detection 5230 if (navigator.userAgentData && navigator.userAgentData.mobile !== undefined) { 5231 return navigator.userAgentData.mobile; 5232 } 5233 5234 // Fallback for older browsers 5235 return /Mobi|Android|iPhone|iPad|iPod/i.test(navigator.userAgent) || 5236 ('ontouchstart' in window && navigator.maxTouchPoints > 0); 5237 } 5238 5239 function makeCarousel(cart_carousel) 5240 { 5241 cart_carousel.flickity({ 5242 wrapAround: true, 5243 draggable: isMobile(), 5244 cellAlign: 'left', 5245 //autoPlay: 3000, 5246 groupCells: true, 5247 resize: true 5248 }); 5249 cart_carousel_set = true; 5250 } 5251 5252 function createCartCarouselCell(image, name, page){ 5253 cell = '<div class="io_cart_carousel_cell"> <a href='+page+' class="cart-carousel-link"> <img class="cart-carousel-image" src='+image+'> <p class="cart-carousel-name"> '+name+' </p> </a> </div>'; 5254 return cell; 5255 } 5256 /*</editor-fold>*/ 5257 5258 /*<editor-fold defaultstate="collapsed" desc="Ajax Calls">*/ 5259 function checkAvailCall(start_date,start_time,time_duration,rental_names,rental_ids,returnFunc,singleCart,cart_rental_ids,cart_rental_names,return_id,temp=0,delivery_method=null,price_only=0,custom_price_name="", skip_hidden_lead = 0) { 5260 /*
5261 IO-21459 If we have no duration set (event not set in cart), and we are doing the call for the page live 5262 price, and we have the setting on where we want to display this price even if the event date is not set: 5263 5264 We set the time_duration to 1 hour. This defaults the start date to January 1, 1970 with duration of 5265 1 hour in the lead meaning it will be available and we have the one hour price. 5266 */ 5267 if((isNaN(time_duration) || time_duration===0) && price_only==1 && io_always_display_live_price == "on"){ 5268 time_duration = 1; 5269 if(!start_date){ 5270 start_date = getFormatteddate(new Date()); 5271 } 5272 if(!start_time){ 5273 start_time = getFormattedtime(new Date()); 5274 } 5275 }else if((isNaN(time_duration) || time_duration===0) && price_only==0 && io_hidetimes === "on"){ 5276 /* IO-22689 if they have times hidden, and happen to have the same default start and end time, we still want to do the call. */ 5277 time_duration = 1; 5278 }else if(isNaN(time_duration) || time_duration===0){ 5279 return; 5280 } 5281 url = "https://rental.software/quotes/check_availability_v2.php?callback=?"; 5282 if(window.location.href.indexOf("localhost") > -1){ 5283 //url = "http://localhost/bugs/quotes/check_availability_v2.php?callback=?"; 5284 url = "http://localhost/io/bugs/quotes/check_availability_v2.php?callback=?"; 5285 //url = "http://localhost/jbug/trunk/quotes/check_availability_v2.php?callback=?"; 5286 } 5287 if(!delivery_method) delivery_method = getCookie("io_delivery_method"); 5288 let address_data = { 5289 "address": getCookie("io_address"), 5290 "state": getCookie("io_state"), 5291 "city": getCookie("io_city"), 5292 "zip": getCookie("io_zip") 5293 }; 5294 if(!ioHasMarketingConsent()){ 5295 address_data = {"address":"", "state":"", "city":"", "zip":""}; 5296 } 5297 url += 5298 "&name=" + encodeURIComponent("300 Conover Dr") + 5299 "&startdate=" + start_date + 5300 "&starttime=" + start_time + 5301 "&duration=" + time_duration + 5302 "&street=" + encodeURIComponent(address_data["address"]) + 5303 "&city=" + encodeURIComponent(address_data["city"]) + 5304 "&state=" + encodeURIComponent(address_data["state"]) + 5305 "&zip=" + encodeURIComponent(address_data["zip"]) + 5306 "&single_cart=" + singleCart + 5307 "&usecushion=1" + 5308 "&include_price=1" + 5309 "&showlocations=0" + 5310 "&rental_names=" + rental_names + 5311 "&rental_ids=" + rental_ids + 5312 "&cart_rental_names=" + cart_rental_names + 5313 "&cart_rental_ids=" + cart_rental_ids + 5314 "&return_id=" + return_id + 5315 "&delivery_method=" + delivery_method + 5316 "&temp=" + temp + 5317 "&skip_hidden_lead="+ skip_hidden_lead; 5318 if (custom_price_name) 5319 { 5320 ioCartLoaderIncrement(); 5321 jQuery.getJSON(url, function (data) 5322 { 5323 try 5324 { 5325 returnFunc(data, custom_price_name); 5326 } 5327 finally 5328 { 5329 ioCartLoaderDecrement(); 5330 } 5331 }); 5332 } 5333 else 5334 { 5335 ioCartLoaderIncrement(); 5336 jQuery.getJSON(url, function (data) 5337 { 5338 try 5339 { 5340 returnFunc(data); 5341 } 5342 finally 5343 { 5344 ioCartLoaderDecrement(); 5345 } 5346 }); 5347 } 5348 } 5349 5350 function getUpsellsCall(start_date,start_time,time_duration,rental_ids,returnFunc) { 5351 if(rental_ids.replace(/[|]/g,"").length==0){return;} 5352 url = "https://rental.software/quotes/in_cart_upsell.php?callback=?"; 5353 if(window.location.href.indexOf("localhost") > -1){ 5354 //url = "http://localhost/bugs/quotes/in_cart_upsell.php?callback=?" 5355 url = "http://localhost/io/bugs/quotes/in_cart_upsell.php?callback=?" 5356 } 5357 url += 5358 "&name=" + encodeURIComponent("300 Conover Dr") + 5359 "&startdate=" + start_date + 5360 "&starttime=" + start_time + 5361 "&duration=" + time_duration + 5362 "&usecushion=1" + 5363 "&include_price=1" + 5364 "&showlocations=0" + 5365 "&rental_ids=" + rental_ids; 5366 //IO-25557 5367 if(window.location.href.indexOf("dev.rental.software") > -1)//if it is a dev site, we need to send 5368 { 5369 let pattern = /(https:\/\/dev\.rental\.software\/[^\/]+\/)/; 5370 let matches = window.location.href.match(pattern); 5371 matches && matches.length > 0 ? url += "&site=" + matches[0]:0; 5372 } 5373 else 5374 { 5375 url += "&site=" + window.location.host; 5376 } 5377 jQuery.getJSON(url, returnFunc); 5378 } 5379 /*</editor-fold>*/ 5380 5381 /*<editor-fold defaultstate="collapsed" desc="Customer Geolocation Functions">*/ 5382 function setLocationInLocalStorage(city) 5383 {
5384 try 5385 { 5386 const location_data = 5387 { 5388 city: city, 5389 timestamp: Date.now() 5390 }; 5391 localStorage.setItem(storage_key, JSON.stringify(location_data)); 5392 return true; 5393 } 5394 catch (e) 5395 { 5396 console.warn('Failed to save location to localStorage:', e); 5397 return false; 5398 } 5399 } 5400 5401 function getLocationFromLocalStorage() 5402 { 5403 try 5404 { 5405 const location_data = localStorage.getItem(storage_key); 5406 if (location_data) 5407 { 5408 return JSON.parse(location_data); 5409 } 5410 5411 } 5412 catch (e) 5413 { 5414 console.warn('Failed to retrieve location from localStorage:', e); 5415 } 5416 return null; 5417 } 5418 5419 function displayLocation(city) 5420 { 5421 const location_element = jQuery('.io_geo_city'); 5422 const container_element = jQuery('#io_customer_geolocation'); 5423 5424 if (location_element.length && container_element.length) 5425 { 5426 location_element.text(`${city}`); 5427 container_element.show(); 5428 return true; 5429 } 5430 return false; 5431 } 5432 5433 function getCityFromIO(returnFunc) 5434 { 5435 var url = "https://rental.software/include/geolocation_handler.php?callback=?"; 5436 if(window.location.href.indexOf("localhost") > -1) 5437 { 5438 url = "http://localhost//features//include/geolocation_handler.php?callback=?"; 5439 } 5440 url += 5441 "&name=" + encodeURIComponent("300 Conover Dr") + 5442 "&ip=" + encodeURIComponent(io_customer_ip); 5443 5444 jQuery.getJSON(url, returnFunc); 5445 } 5446 5447 function initializeGeolocation() 5448 { 5449 try 5450 { 5451 // Check local storage first 5452 const cached_location = getLocationFromLocalStorage(); 5453 if (cached_location && cached_location.city) 5454 { 5455 if (displayLocation(cached_location.city)) 5456 { 5457 return; 5458 } 5459 } 5460 5461 // If no cached location, call the handler to get location 5462 getCityFromIO(function(location_data) 5463 { 5464 if (location_data && location_data.city && !location_data.error) 5465 { 5466 // Display and store the location 5467 if (displayLocation(location_data.city)) 5468 { 5469 setLocationInLocalStorage(location_data.city); 5470 } 5471 } 5472 else 5473 { 5474 console.warn('Failed to get location:', location_data ? location_data.error : 'Unknown error'); 5475 } 5476 }); 5477 } 5478 catch (error) 5479 { 5480 console.error('Geolocation initialization failed:', error); 5481 } 5482 } 5483 /*</editor-fold>*/ 5484 5485 /*<editor-fold defaultstate="collapsed" desc="Loading Animation Helpers">*/ 5486 5487 /** 5488 * Toggles the visibility of the cart loading overlay. 5489 * 5490 * @param {boolean} show - A boolean value to determine whether to show or hide the overlay. 5491 * If true, the overlay becomes visible; if false, it is hidden. 5492 * @return {void} This function does not return a value. 5493 */ 5494 function ioCartShowOverlay(show) 5495 { 5496 try 5497 { 5498 var overlay = document.getElementById('ioCartLoadingOverlay'); 5499 if (!overlay) return; 5500 if (show) 5501 { 5502 overlay.style.display = 'flex'; 5503 overlay.setAttribute('aria-hidden', 'false'); 5504 } 5505 else 5506 { 5507 overlay.style.display = 'none'; 5508 overlay.setAttribute('aria-hidden', 'true'); 5509 } 5510 } 5511 catch (e) 5512 {} 5513 } 5514 5515 /** 5516 * Activates the cart loader by setting the loading state to active, initializing the loading count, 5517 * and displaying the overlay. Includes a fallback to deactivate the loader if no response is received 5518 * within a specified timeout period. 5519 * 5520 * @return {void} This method does not return a value. 5521 */ 5522 function ioCartLoaderActivate() 5523 { 5524 io_cart_loading_active = true; 5525 io_cart_loading_count = 0; 5526 ioCartShowOverlay(true); 5527 5528 //fallback in case the availability call doesn't come back 5529 if (io_cart_loading_fallback_timer) clearTimeout(io_cart_loading_fallback_timer); 5530 io_cart_loading_fallback_timer = setTimeout(function () { 5531 if (io_cart_loading_active) { 5532 io_cart_loading_active = false;
5533 io_cart_loading_count = 0; 5534 ioCartShowOverlay(false); 5535 } 5536 }, 15000); 5537 } 5538 5539 /** 5540 * Increments the count of active cart loading operations and ensures the cart overlay is displayed. 5541 * 5542 * This method increases the `io_cart_loading_count` if the `io_cart_loading_active` flag is set to true. 5543 * It also calls the `ioCartShowOverlay` function with a true value to show the overlay. 5544 * 5545 * @return {void} This function does not return any value. 5546 */ 5547 function ioCartLoaderIncrement() 5548 { 5549 if (io_cart_loading_active) 5550 { 5551 io_cart_loading_count++; 5552 ioCartShowOverlay(true); 5553 } 5554 } 5555 5556 /** 5557 * Decrements the `io_cart_loading_count` if `io_cart_loading_active` is true. 5558 * If the count reaches zero, it deactivates the loader, removes the overlay, 5559 * and clears the fallback timer 5560 */ 5561 function ioCartLoaderDecrement() 5562 { 5563 if (io_cart_loading_active) 5564 { 5565 io_cart_loading_count = Math.max(0, io_cart_loading_count - 1); 5566 5567 if (io_cart_loading_count === 0) 5568 { 5569 io_cart_loading_active = false; 5570 ioCartShowOverlay(false); 5571 5572 if (io_cart_loading_fallback_timer) 5573 { 5574 clearTimeout(io_cart_loading_fallback_timer); 5575 io_cart_loading_fallback_timer = null; 5576 } 5577 } 5578 } 5579 } 5580 5581 /*</editor-fold>*/</script>
5581 <div class="address_entry elementor-widget-text-editor"><table><tr><td> <label for="address" id="io_cdl_address_label" style="display: table-cell"> Street Address </label></td><td> <input id="io_cd_address" style="display: table-cell" name="address" type="text"></input></td></tr><tr><td> <label for="city" id="io_cdl_city_label" style="display: table-cell"> City </label></td><td> <input id="io_cd_city" style="display: table-cell" name="city" type="text"></input></td></tr><tr id="us-state-select"><td> <label for="state" id="io_cdl_state_label" style="display: table-cell"> State </label></td><td> <select name="state" id="io_cd_state" style="display: table-cell" class="input-mini"><option value=""></option><option value="AK">AK</option><option value="AL">AL</option><option value="AR">AR</option><option value="AZ">AZ</option><option value="CA">CA</option><option value="CO">CO</option><option value="CT">CT</option><option value="DC">DC</option><option value="DE">DE</option><option value="FL">FL</option><option value="GA">GA</option><option value="HI">HI</option><option value="IA">IA</option><option value="ID">ID</option><option value="IL">IL</option><option value="IN">IN</option><option value="KS">KS</option><option value="KY">KY</option><option value="LA">LA</option><option value="MA">MA</option><option value="MD">MD</option><option value="ME">ME</option><option value="MI">MI</option><option value="MN">MN</option><option value="MO">MO</option><option value="MS">MS</option><option value="MT">MT</option><option value="NC">NC</option><option value="ND">ND</option><option value="NE">NE</option><option value="NH">NH</option><option value="NJ">NJ</option><option value="NM">NM</option><option value="NV">NV</option><option value="NY">NY</option><option value="OH">OH</option><option value="OK">OK</option><option value="OR">OR</option><option value="PA">PA</option><option value="RI">RI</option><option value="SC">SC</option><option value="SD">SD</option><option value="TN">TN</option><option value="TX">TX</option><option value="UT">UT</option><option value="VA">VA</option><option value="VT">VT</option><option value="WA">WA</option><option value="WI">WI</option><option value="WV">WV</option><option value="WY">WY</option> </select></td></tr><tr><td> <label for="zip" id="io_cdl_zip_label" style="display: table-cell"> Zip Code </label></td><td> <input id="io_cd_zip" style="display: table-cell" name="zip" type="text"></input></td></tr></table> <a class="elementor-button elementor-size-sm io_button" 5582 id="address_entry_submit" 5583 href="javascript:;"> Save Address </a><div id="delivery_charge_info_box"><hr><h3 id="info_box_header"></h3><p id="info_box_information"></p> <a href="javascript:;" onClick="closeAddressEntry()" class="delivery_info_continue elementor-button elementor-size-sm io_button">Continue Shopping</a></div></div>
5583<script>/* for checking delivery */ 5584 function runDeliveryCall(cart_only = false){ 5585 let address_fields = jQuery("[id^='io_cd_']"); 5586 let address_data = { 5587 "address": getCookie("io_address"), 5588 "state": getCookie("io_state"), 5589 "city": getCookie("io_city"), 5590 "zip": getCookie("io_zip") 5591 }; 5592 5593 let times = getAvailTimes(); 5594 5595 let start_date = times[0]; 5596 let end_date = start_date; 5597 let start_time = times[1]; 5598 let duration = times[2]; 5599 5600 let rental_ids = ""; 5601 simpleCart.each(function (item, x) { 5602 if(typeof item.get('timeslots') != "undefined"){ 5603 if(item.get('timeslots').length > 0){ 5604 var timeslots_html = item.get('timeslots'); 5605 var rental_id = item.get('rentalid'); 5606 if(typeof timeslots_html == "undefined") return; 5607 if(timeslots_html.length == 0) return; 5608 5609 var timeslot_name = getTimeslotName(timeslots_html); 5610 var timeslot_sel_range = jQuery(".item-timeslots [name=\""+timeslot_name+"\"] option:selected").val(); 5611 if(typeof timeslot_sel_range != "undefined"){ 5612 /* timeslots */ 5613 setTimeslotSelected(item, timeslot_name); 5614 }else{ 5615 /* timepickers */ 5616 setTimePicker(item, timeslot_name);//todo? 5617 let start_timepicker = document.getElementsByName(timeslot_name.replace("io_timepicker_", "start_timeslot_")); 5618 let end_timepicker = document.getElementsByName(timeslot_name.replace("io_timepicker_", "end_timeslot_")); 5619 timeslot_sel_range = start_timepicker[start_timepicker.length-1].value; 5620 timeslot_sel_range += " - " + end_timepicker[end_timepicker.length-1].value; 5621 } 5622 5623 var timeslot_sel_arr = ""; 5624 if(typeof timeslot_sel_range != "undefined"){ 5625 timeslot_sel_arr = timeslot_sel_range.split(" - "); 5626 var timeslot_start_time = timeslot_sel_arr[0].replace("am"," am").replace("pm"," pm").replace(" "," "); 5627 var timeslot_end_time = timeslot_sel_arr[1].replace("am"," am").replace("pm"," pm").replace(" "," "); 5628 if(timeslot_start_time && timeslot_end_time){ 5629 let newDate1 = convertDateStringtoDateObject(start_date, timeslot_start_time); 5630 let newDate2 = convertDateStringtoDateObject(end_date, timeslot_end_time); 5631 let timeslot_duration = ((newDate2 - newDate1) / 3600) / 1000; 5632 rental_ids += rental_id+"-"+item.get("quantity")+"-"+timeslot_start_time+"-"+timeslot_duration+"|"; 5633 } 5634 } 5635 } 5636 } 5637 else{ 5638 var cart_id = item.get("rentalid"); 5639 rental_ids += cart_id + "-" + item.get("quantity") + "|"; 5640 } 5641 }); 5642 5643 address_fields.each(function() { 5644 let field = this.id.split("_")[2]; 5645 value = this.value; 5646 if(!value && !address_data[field]){ 5647 jQuery(this).addClass("invalid_address_field") 5648 } 5649 else if(value){ 5650 jQuery(this).removeClass("invalid_address_field") 5651 address_data[field] = this.value; 5652 } 5653 }); 5654 if(jQuery(".invalid_address_field").length > 0){ 5655 return; 5656 } 5657 let delivery_method = "" 5658 if(io_default_delivery_method) 5659 { 5660 delivery_method = io_default_delivery_method; 5661 } 5662 else if(getCookie("io_delivery_method")) 5663 { 5664 delivery_method = getCookie("io_delivery_method"); 5665 } 5666 5667 5668 setCookie("io_address", address_data["address"], 14); 5669 setCookie("io_city", address_data["city"], 14); 5670 setCookie("io_state", address_data["state"], 14); 5671 setCookie("io_zip", address_data["zip"], 14); 5672 5673 cart_total = simpleCart.total(); 5674 if(cart_total === "TBD") cart_total = 0; 5675 url = "https://rental.software/quotes/get_delivery_info.php?callback=?"; 5676 if(window.location.href.indexOf("localhost") > -1){ 5677 //url = "http://localhost/bugs/quotes/get_delivery_info.php?callback=?"; 5678 url = "http://localhost/io/bugs/quotes/get_delivery_info.php?callback=?"; 5679 } 5680 url += 5681 "&name=" + encodeURIComponent("300 Conover Dr") + 5682 "&rental_ids=" + rental_ids + 5683 "&street=" + encodeURIComponent(address_data["address"]) + 5684 "&city=" + encodeURIComponent(address_data["city"]) + 5685 "&state=" + encodeURIComponent(address_data["state"]) + 5686 "&zip=" + encodeURIComponent(address_data["zip"]) + 5687 "&startdate=" + start_date + 5688 "&starttime=" + start_time + 5689 "&duration=" + duration + 5690 "&delivery_method=" + encodeURIComponent(delivery_method) + 5691 "&total=" + cart_total + 5692 "&cart_only=" + cart_only; 5693 jQuery.getJSON(url, function(data){ 5694 if(data["delivery_restrict"] === 1){ 5695 data["charge"] = 0; 5696 }
5697 handleDeliveryInfo(data, cart_only); 5698 }); 5699 } 5700 5701 function handleDeliveryInfo(data, cart_only = false){ 5702 jQuery("#deliverSubtotalContainer").show(); 5703 jQuery("#checkDeliveryMessage").hide(); 5704 let info_box = jQuery("#delivery_charge_info_box"); 5705 if(data["delivery_restrict"] == 1){ 5706 jQuery("#info_box_header").text("Sorry..."); 5707 jQuery("#info_box_information").text(data["error"]) 5708 setDeliverySubtotal(data["charge"], true) 5709 } 5710 else{ 5711 setDeliverySubtotal(data["charge"]) 5712 jQuery("#info_box_header").text("Success!"); 5713 if(data["charge"] > 0){ 5714 jQuery("#info_box_information").html("We are able to deliver to your location with a " + simpleCart.toCurrency(data["charge"]) +" fee!"); 5715 } 5716 else{ 5717 jQuery("#info_box_information").html("We are able to deliver to your location with no charge!"); 5718 } 5719 } 5720 if(simpleCart.items().length == 0 && cart_only){ 5721 jQuery("#info_box_header").text("Items Required."); 5722 jQuery("#info_box_information").html("There needs to be items in your cart to check for delivery fees. But we will save the address information so you don't have to enter it again!") 5723 } 5724 info_box.show(); 5725 jQuery.fancybox.update(jQuery(".address_entry")); 5726 } 5727 function showAddressEntry(cart_only=false){ 5728 cartHide(); 5729 jQuery(".invalid_address_field").removeClass("invalid_address_field") 5730 jQuery("#delivery_charge_info_box").hide(); 5731 jQuery("#io_cd_address").val(getCookie("io_address")); 5732 jQuery("#io_cd_state").val(getCookie("io_state")); 5733 jQuery("#io_cd_city").val(getCookie("io_city")); 5734 jQuery("#io_cd_zip").val(getCookie("io_zip")); 5735 if(!cart_only){ 5736 jQuery("#address_entry_submit").on("click", null, function(){ runDeliveryCall(); }); 5737 } else{ 5738 jQuery("#address_entry_submit").on("click", null, function(){ runDeliveryCall(cart_only); }); 5739 } 5740 jQuery.fancybox.open(jQuery(".address_entry")); 5741 } 5742 5743 function closeAddressEntry(){ 5744 jQuery.fancybox.close(); 5745 } 5746 5747 function setDeliverySubtotal(amount, unavailable=false){ 5748 if(unavailable){ 5749 jQuery("#deliverySubtotal").html("Unavailable"); 5750 } else{ 5751 jQuery("#deliverySubtotal").html(simpleCart.toCurrency(amount)); 5752 } 5753 } 5754 5755 function addressCookiesSet(){ 5756 if(getCookie("address") && getCookie("state") && getCookie("city") && getCookie("zip")){ 5757 return true; 5758 } else{ 5759 return false 5760 } 5761 }</script>
vendor: 1 bytes, line 5761
5761
5762<script>let map; 5763 let geocoder; 5764 let item_id_map; 5765 let drawingManager; 5766 let drawingListener; 5767 5768 let polygons = new Array(); 5769 5770 let polyline_markers = new Array(); 5771 let polylines = new Array(); 5772 let previous_marker; 5773 current_polyline = undefined; 5774 let previous_map_height = ""; 5775 5776 function initMap() { 5777 map = new google.maps.Map(document.getElementById("map_container"), { 5778 center: { lat: -34.397, lng: 150.644 }, 5779 zoom: 8, 5780 mapTypeId: "hybrid", 5781 disableDefaultUI: true, 5782 tilt: 0 5783 }); 5784 drawingManager = new google.maps.drawing.DrawingManager({ 5785 drawingControl: true, 5786 drawingControlOptions: { 5787 position: google.maps.ControlPosition.TOP_CENTER, 5788 drawingModes: [ 5789 google.maps.drawing.OverlayType.POLYGON, 5790 ], 5791 } 5792 }); 5793 5794 geocoder = new google.maps.Geocoder(); 5795 } 5796 5797 function io_geocode(){ 5798 let prefix = "#io_mc_" 5799 let request = "" 5800 let address_value = ""; 5801 if(jQuery(prefix+"address").length) { 5802 address_value = jQuery(prefix+"address").val(); 5803 if(address_value) setCookie("address", jQuery("#io_mc_address").val(), 14); 5804 } 5805 let city_value = ""; 5806 if(jQuery(prefix+"city").length){ 5807 city_value = jQuery(prefix+"city").val(); 5808 if(city_value) setCookie("city", jQuery("#io_mc_city").val(), 14); 5809 } 5810 let state_value = ""; 5811 if(jQuery(prefix+"state").length){ 5812 state_value = jQuery(prefix+"state").val(); 5813 if(state_value) setCookie("state", jQuery("#io_mc_state").val(), 14); 5814 } 5815 let zip_value = ""; 5816 if(jQuery(prefix+"zip").length){ 5817 zip_value = jQuery(prefix+"zip").val(); 5818 if(zip_value) setCookie("zip", jQuery("#io_mc_zip").val(), 14); 5819 } 5820 5821 request = address_value + " " + city_value + " " + state_value + " " + zip_value; 5822 if(request){ 5823 geocoder.geocode({address:request}).then((result) => { 5824 const { results } = result; 5825 map.setCenter(results[0].geometry.location); 5826 map.setZoom(24); 5827 return results; 5828 }); 5829 5830 } 5831 5832 if(!addressProvided()) { 5833 jQuery("#io_map_address_entry").attr("open", "open"); 5834 }else{ 5835 jQuery("#io_map_address_entry").removeAttr("open"); 5836 } 5837 } 5838 5839 function openMap(element){ 5840 cartHide() 5841 io_map_clear() 5842 let unit = "meters" 5843 if(country === "US") unit = "feet" 5844 polygons = new Array(); 5845 polyline_marker_sets = new Array(); 5846 polylines = new Array(); 5847 previous_marker = undefined; 5848 current_polyline = undefined; 5849 5850 jQuery("#io_mc_address").val(getCookie("address")); 5851 jQuery("#io_mc_state").val(getCookie("state")); 5852 jQuery("#io_mc_city").val(getCookie("city")); 5853 jQuery("#io_mc_zip").val(getCookie("zip")); 5854 io_geocode(); 5855 5856 google.maps.event.removeListener(drawingListener); 5857 5858 if(element.id == "calcPriceOpenMap"){ 5859 item_id_map = jQuery(".io_product_infobox .item_rentalid").text(); 5860 if(jQuery(".io_product_infobox .item_qtytype").text() == "Area"){ 5861 setMapTools_Area(unit, true) 5862 }else if(jQuery(".io_product_infobox .item_qtytype").text() == "Perimeter"){ 5863 setMapTools_Perimeter(unit, true) 5864 } 5865 } 5866 else{ 5867 item_id_map = jQuery(element).parent().parent().find(".item-rentalid").text(); 5868 if(jQuery(element).parent().parent().find(".item-qtytype").text() == "Area"){ 5869 setMapTools_Area(unit) 5870 }else if(jQuery(element).parent().parent().find(".item-qtytype").text() == "Perimeter"){ 5871 setMapTools_Perimeter(unit) 5872 } 5873 } 5874 } 5875 5876 function addressProvided(){ 5877 if(jQuery("#io_mc_address").val() && jQuery("#io_mc_state").val() && 5878 jQuery("#io_mc_city").val() && jQuery("#io_mc_zip").val() ){ 5879 return true; 5880 } 5881 return false; 5882 } 5883 5884 function setMapTools_Area(unit, item_page=false){ 5885 jQuery.fancybox.open(jQuery(".map_fancybox")); 5886 drawingManager.setOptions({ 5887 drawingControlOptions: { 5888 drawingModes: [google.maps.drawing.OverlayType.POLYGON] 5889 }, 5890 drawingMode: google.maps.drawing.OverlayType.POLYGON, 5891 polygonOptions: { 5892 fillColor: "#0191fc", 5893 strokeColor: "#0113fc" 5894 }, 5895 }); 5896 let units = "meters" 5897 if(country === "US") units = "feet" 5898 5899 jQuery("#io_measurement_input_label").text("Approximate area in "+units+": "); 5900 jQuery("#io_map_manual_input").off("click"); 5901 jQuery("#io_map_manual_input").on("click", function(){manual_calc_price("Area", item_page)}); 5902 jQuery("#io_perimeter_options_container").hide(); 5903 jQuery("#io_map_new_line_container").hide(); 5904 jQuery("#io_map_instructions").html("Use the map below to take measurements by clicking on each corner of the area y
5904ou want to measure. <span id=\"io_map_additional_instructions\">You can draw multiple polygons to include multiple separate surfaces in the total area. Press Clear to remove all polygons and start again. Alternatively if you know the approximate area in "+units+" you can enter the measurement manually below. When finished press Done and the price of the item will be updated </span><i id=\"io_show_more_instructions\" onClick=\"show_more_instruct_click(this)\">(more)</i>") 5905 5906 drawingListener = google.maps.event.addListener(drawingManager, "polygoncomplete", function(polygon) { 5907 polygons.push(polygon); 5908 let convert_feet = 1; 5909 if(country === "US") convert_feet = 10.764; 5910 let approx_area = 0; 5911 polygons.forEach(function(polygon) { 5912 approx_area += google.maps.geometry.spherical.computeArea(polygon.getPath()) * convert_feet; 5913 }); 5914 calcprice_approx_area(Math.round(approx_area)); 5915 }); 5916 drawingManager.setMap(map); 5917 } 5918 5919 function setMapTools_Perimeter(unit, item_page=false){ 5920 jQuery.fancybox.open(jQuery(".map_fancybox")); 5921 drawingManager.setOptions({ 5922 drawingControlOptions: { 5923 drawingModes: [google.maps.drawing.OverlayType.MARKER] 5924 }, 5925 drawingMode: google.maps.drawing.OverlayType.MARKER 5926 }); 5927 let height = jQuery("#perimeter_height").val(); 5928 let units = ""; 5929 if(height){ 5930 units = "sq meters" 5931 if(country === "US") units = "sq feet" 5932 jQuery("#io_measurement_input_label").text("Approximate surface area in "+units+": "); 5933 jQuery("#io_map_instructions").html("Use the map below to take measurements by clicking on each corner of the area you want to measure. <span id=\"io_map_additional_instructions\">You can add additional lines by clicking Add New Line button to include more structures into the total. Press Clear to remove all lines and start again. Alternatively if you know the approximate surface area in "+units+" you can enter the measurement manually below. When finished press Done and the price of the item will be updated </span><i id=\"io_show_more_instructions\" onClick=\"show_more_instruct_click(this)\">(more)</i>") 5934 5935 }else{ 5936 units = "meters" 5937 if(country === "US") units = "feet" 5938 jQuery("#io_measurement_input_label").text("Approximate perimeter in "+units+": "); 5939 jQuery("#io_map_instructions").html("Use the map below to take measurements by clicking on each corner of the area you want to measure. <span id=\"io_map_additional_instructions\">You can add additional lines by clicking Add New Line button to include more structures into the total. Press Clear to remove all lines and start again. Alternatively if you know the approximate perimeter in "+units+" you can enter the measurement manually below. When finished press Done and the price of the item will be updated </span><i id=\"io_show_more_instructions\" onClick=\"show_more_instruct_click(this)\">(more)</i>") 5940 5941 } 5942 5943 jQuery("#io_map_manual_input").off("click"); 5944 jQuery("#io_map_manual_input").bind("click", function(){manual_calc_price("Perimeter", item_page)}); 5945 jQuery("#perimeter_height").bind("change", function(){change_perimeter_instructions()}); 5946 jQuery("#io_perimeter_options_container").show(); 5947 jQuery("#io_map_clear_container").show(); 5948 jQuery("#io_map_new_line_container").show(); 5949 5950 current_polyline = new google.maps.Polyline({ 5951 map: map, 5952 path: [], 5953 strokeColor: "#0113fc", 5954 strokeOpacity: 1.0, 5955 strokeWeight: 2 5956 }) 5957 drawingListener = google.maps.event.addListener(drawingManager, "markercomplete", function(marker) { 5958 polyline_markers.push(marker) 5959 marker.setVisible(false); 5960 current_polyline.getPath().push(marker.getPosition()) 5961 if(previous_marker){ 5962 let convert_feet = 1; 5963 if(country === "US") convert_feet = 3.281; 5964 let approx_perimeter = 0; 5965 polylines.forEach(function(polyline) { 5966 if(convert_feet > 1) convert_feet = 10.764 5967 approx_perimeter += google.maps.geometry.spherical.computeArea(polyline.getPath()) * convert_feet; 5968 }); 5969 approx_perimeter += google.maps.geometry.spherical.computeLength(current_polyline.getPath()) * convert_feet; 5970 calcprice_approx_perimeter(Math.round(approx_perimeter)); 5971 } 5972 previous_marker = marker; 5973 }); 5974 5975 jQuery("#perimeter_height_contianer").show(); 5976
5977 drawingManager.setMap(map); 5978 } 5979 5980 function change_perimeter_instructions(){ 5981 let height = jQuery("#perimeter_height").val(); 5982 if(height){ 5983 units = "sq meters" 5984 if(country === "US") units = "sq feet" 5985 jQuery("#io_measurement_input_label").text("Approximate surface area in "+units+": "); 5986 jQuery("#io_map_instructions").html("Use the map below to take measurements by clicking on each corner of the area you want to measure. <span id=\"io_map_additional_instructions\">You can add additional lines by clicking Add New Line button to include more structures into the total. Press Clear to remove all lines and start again. Alternatively if you know the approximate surface area in "+units+" you can enter the measurement manually below. When finished press Done and the price of the item will be updated </span><i id=\"io_show_more_instructions\" onClick=\"show_more_instruct_click(this)\">(more)</i>") 5987 }else { 5988 units = "meters" 5989 if(country === "US") units = "feet" 5990 jQuery("#io_measurement_input_label").text("Approximate perimeter in "+units+": "); 5991 jQuery("#io_map_instructions").html("Use the map below to take measurements by clicking on each corner of the area you want to measure. <span id=\"io_map_additional_instructions\">You can add additional lines by clicking Add New Line button to include more structures into the total. Press Clear to remove all lines and start again. Alternatively if you know the approximate perimeter in "+units+" you can enter the measurement manually below. When finished press Done and the price of the item will be updated </span><i id=\"io_show_more_instructions\" onClick=\"show_more_instruct_click(this)\">(more)</i>") 5992 } 5993 } 5994 5995 function manual_calc_price(method, item_page){ 5996 let approx_measurement = parseInt(jQuery("#io_measurement_input").val()); 5997 let units = ""; 5998 if(approx_measurement){ 5999 if(method == "Area"){ 6000 units = "sq meters" 6001 if(country === "US") units = "sq feet" 6002 }else if(method == "Perimeter"){ 6003 let height = jQuery("#perimeter_height").val(); 6004 if(height){ 6005 units = "sq meters" 6006 if(country === "US") units = "sq feet" 6007 }else{ 6008 units = "meters" 6009 if(country === "US") units = "feet" 6010 } 6011 }
6012 simpleCart.items().forEach(function (item, index){ 6013 if(item.get("rentalid") === item_id_map){ 6014 item.set("units", units); 6015 item.set("quantity", approx_measurement); 6016 } 6017 }); 6018 6019 simpleCart.update(); 6020 6021 if(item_page || jQuery(".io_product_infobox .item_rentalid").text() == item_id_map) set_price_on_item_page(units, approx_measurement); 6022 if(!item_page) cartShow(); 6023 } 6024 jQuery.fancybox.close(); 6025 } 6026 6027 function calcprice_approx_area(approx_area){ 6028 jQuery("#io_measurement_input").val(approx_area); 6029 } 6030 6031 function calcprice_approx_perimeter(approx_perimeter){ 6032 let height = jQuery("#perimeter_height").val(); 6033 if(height && height > 0) approx_perimeter *= parseInt(height); 6034 6035 jQuery("#io_measurement_input").val(approx_perimeter); 6036 } 6037 6038 function set_price_on_item_page(units, measurement){ 6039 let measurement_price = document.querySelector(".io_product_measurement_price"); 6040 if(measurement_price==undefined){ 6041 var first_price = document.querySelector(".io_product_price_box"); 6042 if(first_price != null){ 6043 measurement_price = first_price.cloneNode(true); 6044 /* clear all classes */ 6045 measurement_price.className = ""; 6046 measurement_price.classList.add("io_product_price_box"); 6047 measurement_price.classList.add("io_product_measurement_price"); 6048 measurement_price.style.display = "grid"; 6049 /* Make a hidden data span for when adding to cart */ 6050 raw_measurement = document.createElement("span"); 6051 raw_measurement.classList.add("io_measure_price_raw_measurement"); 6052 raw_measurement.style.display = "none"; 6053 raw_measurement.textContent = measurement; 6054 measurement_price.appendChild(raw_measurement); 6055 first_price.before(measurement_price); 6056 } 6057 } 6058 var price_1h = Number(jQuery(".io_product_price_1h_"+jQuery(".io_product_infobox .item_rentalid").text()).text().replace(/[^0-9.-]+/g,"")); 6059 measurement_price.querySelector("p:nth-child(1)").innerHTML = simpleCart.toCurrency(price_1h*measurement); 6060 measurement_price.querySelector("p:nth-child(2)").innerHTML = "For approximately "+measurement+" "+units; 6061 } 6062 6063 function io_map_clear() { 6064 if(drawingManager.getDrawingMode() == "polygon"){ 6065 drawingManager.setDrawingMode("polygon"); 6066 } 6067 6068 if(polygons) polygons.forEach(function(polygon) { 6069 polygon.setMap(null); 6070 }); 6071 if(current_polyline) current_polyline.setMap(null); 6072 if(polylines) polylines.forEach(function(polyline) { 6073 polyline.setMap(null); 6074 }); 6075 if(polyline_markers) polyline_markers.forEach(function(marker) { 6076 marker.setMap(null); 6077 }); 6078 6079 current_polyline = new google.maps.Polyline({ 6080 map: map, 6081 path: [], 6082 strokeColor: "#0113fc", 6083 strokeOpacity: 1.0, 6084 strokeWeight: 2 6085 }); 6086 polygons = new Array(); 6087 polylines = new Array(); 6088 polyline_markers = new Array(); 6089 previous_marker = undefined; 6090 } 6091 6092 function io_map_new_line() { 6093 polylines.push(new google.maps.Polyline({ 6094 map: map, 6095 path: current_polyline.getPath(), 6096 strokeColor: "#0113fc", 6097 strokeOpacity: 1.0, 6098 strokeWeight: 2 6099 }) 6100 ); 6101 previous_marker = undefined; 6102 current_polyline.setMap(null); 6103 current_polyline = new google.maps.Polyline({ 6104 map: map, 6105 path: [], 6106 strokeColor: "#0113fc", 6107 strokeOpacity: 1.0, 6108 strokeWeight: 2 6109 }); 6110 } 6111 6112 function show_more_instruct_click(show_more_button) { 6113 if(show_more_button.textContent == "(more)") { 6114 show_more_button.textContent = "(hide)"; 6115 jQuery("#io_map_additional_instructions").show(); 6116 }else if(show_more_button.textContent == "(hide)") { 6117 show_more_button.textContent = "(more)"; 6118 jQuery("#io_map_additional_instructions").hide(); 6119 } 6120 } 6121 6122 function perimeter_height_changed(){ 6123 let current_map_height = jQuery("#perimeter_height").val(); 6124 if(current_map_height && current_map_height > 0){ 6125 if(jQuery("#io_measurement_input").val() && !previous_map_height){ 6126 let measurement = jQuery("#io_measurement_input").val(); 6127 jQuery("#io_measurement_input").val(measurement * current_map_height); 6128 }else if(jQuery("#io_measurement_input").val() && previous_map_height){ 6129 let measurement = jQuery("#io_measurement_input").val(); 6130 if(previous_map_height > 0){ 6131 measurement = measurement / previous_map_height; 6132 } 6133 jQuery("#io_measurement_input").val(measurement * current_map_height); 6134 } 6135 }else if (!current_map_height || current_map_height == 0){ 6136 if(jQuery("#io_measurement_input").val() && previous_map_height){ 6137 let measurement = jQuery("#io_measurement_input").val(); 6138 if(previous_map_height > 0){ 6139 measurement = measurement / previous_map_height; 6140 } 6141 jQuery("#io_measurement_input").val(measurement); 6142 } 6143 } 6144 previous_map_height = current_map_height; 6145 } 6146 6147 window.initMap = initMap;</script>
6147 <div class="map_fancybox"><div class="elementor-widget-text-editor"><div> <details id="io_map_address_entry"> <summary style = "cursor:pointer">Enter Address Information (edit)</summary><table style="margin-left: 10px"><tr><td> <label for="address" id="io_mcl_address_label" style="display: table-cell"> Street Address </label></td><td> <input id="io_mc_address" style="display: table-cell" name="address" type="text"></input></td></tr><tr><td> <label for="city" id="io_mcl_city_label" style="display: table-cell"> City </label></td><td> <input id="io_mc_city" style="display: table-cell" name="city" type="text"></input></td></tr><tr id="io_mc_us-state-select"><td> <label for="state" id="io_mcl_state_label" style="display: table-cell"> State </label></td><td> <select name="state" id="io_mc_state" style="display: table-cell" class="input-mini"><option value=""></option><option value="AK">AK</option><option value="AL">AL</option><option value="AR">AR</option><option value="AZ">AZ</option><option value="CA">CA</option><option value="CO">CO</option><option value="CT">CT</option><option value="DC">DC</option><option value="DE">DE</option><option value="FL">FL</option><option value="GA">GA</option><option value="HI">HI</option><option value="IA">IA</option><option value="ID">ID</option><option value="IL">IL</option><option value="IN">IN</option><option value="KS">KS</option><option value="KY">KY</option><option value="LA">LA</option><option value="MA">MA</option><option value="MD">MD</option><option value="ME">ME</option><option value="MI">MI</option><option value="MN">MN</option><option value="MO">MO</option><option value="MS">MS</option><option value="MT">MT</option><option value="NC">NC</option><option value="ND">ND</option><option value="NE">NE</option><option value="NH">NH</option><option value="NJ">NJ</option><option value="NM">NM</option><option value="NV">NV</option><option value="NY">NY</option><option value="OH">OH</option><option value="OK">OK</option><option value="OR">OR</option><option value="PA">PA</option><option value="RI">RI</option><option value="SC">SC</option><option value="SD">SD</option><option value="TN">TN</option><option value="TX">TX</option><option value="UT">UT</option><option value="VA">VA</option><option value="VT">VT</option><option value="WA">WA</option><option value="WI">WI</option><option value="WV">WV</option><option value="WY">WY</option> </select></td></tr><tr><td> <label for="zip" id="io_mcl_zip_label" style="display: table-cell"> Zip Code </label></td><td> <input id="io_mc_zip" style="display: table-cell" name="zip" type="text"></input></td></tr></table> <a class="elementor-button elementor-size-sm io_button" 6148 id="map_geocode_submit" 6149 onClick="io_geocode()" 6150 href="javascript:;"> Locate </a> </details><div id="perimeter_height_contianer"><p>If you are taking measurements for a structure such as a building or fence, please provide the height of the structure here. If height does not apply to the wash, for instance for a gutter wash, leave this field empty. <strong> Please note if you enter a value here after taking measurements, you will need to take measurements again. </strong></p> <label> Height of structure: </label> <input type="number" id="perimeter_height" onChange="perimeter_height_changed()"/></div><div><p id="io_map_instructions"></p></div><div id="io_measurement_input_container"> <label id="io_measurement_input_label"> </label> <input type="number" id="io_measurement_input"/> <a class="elementor-button elementor-size-sm io_button" 6151 id="io_map_manual_input" 6152 href="javascript:;"> Done </a></div><div style="display: inline-flex"><div id="io_map_clear_container"> <a class="elementor-button elementor-size-sm io_button" 6153 id="io_map_clear_btn" 6154 onClick="io_map_clear()" 6155 href="javascript:;"> Clear </a></div><div id="io_map_new_line_container" style="margin-left:5px"> <a class="elementor-button elementor-size-sm io_button" 6156 id="io_map_new_line_btn" 6157 onClick="io_map_new_line()" 6158 href="javascript:;"> Add New Line </a></div></div></div></div> <br><div id="map_container">
6158<script src="https://maps.googleapis.com/maps/api/js?key=AIzaSyDEuvvqefKaUABPvydm00SV8Fr8tQeGVcw&libraries=drawing&callback=initMap" defer></script>
6158 </div></div>
6158<script>jQuery(".io_testimonials, #io_testimonials").each(function(){ 6159 io_get_reviews(this); 6160 }) 6161 setTimeout(function(){ 6162 jQuery(".io_testimonials .w3-ul li p").each(function(){ 6163 const container = jQuery(this).parent() 6164 const element = jQuery(this); 6165 6166 if (element[0].scrollHeight > container[0].clientHeight) { 6167 6168 jQuery(this).parent().parent().append(create_read_more()); 6169 } 6170 }); 6171 }, 500); 6172 6173 function create_read_more(){ 6174 let html = "<p class=\"io_review_readmore\" onClick=\"review_readmore_clicked(this)\">read more</p>" 6175 return html; 6176 } 6177 6178 function review_readmore_clicked(element){ 6179 let review_li = jQuery(element).parent().find("li:eq(3)"); 6180 new_height = jQuery(review_li).find("p").height() + 16; 6181 jQuery(review_li).height(new_height); 6182 jQuery(element).hide(); 6183 } 6184 6185 function io_get_reviews(element){ 6186 let io_un = "reservations@asplayzone"; 6187 let io_loc = "3460"; 6188 let io_url1 = 'https://rental.software/testimonials_iframe.php?user='; 6189 if (location.hostname === "localhost"){ 6190 io_url1 = 'http://localhost/io/bugs/testimonials_iframe.php?user='; 6191 //io_url1 = 'http://localhost/jbug/trunk/testimonials_iframe.php?user='; 6192 } 6193 let io_url2 = '&location_id='; 6194 let io_url3 = '&width=100%&number_of_reviews=10&show_average_rating=1&show_stars=1&show_date=&show_reviewer_name=1&orderby=time&iframe=0'; 6195 let io_url_c = io_url1 + io_un + io_url2 + io_loc + io_url3; 6196 fetch(io_url_c, { 6197 method: 'get' 6198 }).then( 6199 function(response){ 6200 return response.json(); 6201 } 6202 ).then(function(data) { 6203 6204 6205 6206 //let element = document.getElementById("io_testimonials"); 6207 //DOM-built on purpose: literal markup in this inline script lands in the raw page 6208 //source and SEO crawlers read it as page content (IO-37932). 6209 element.textContent = ""; 6210 let review_cnt=0; 6211 let rating_sum = 0; 6212 data.forEach((user) => { 6213 const { name, review, rating, time } = user; 6214 rating_sum += Number(rating); 6215 review_cnt++; 6216 let review_div = document.createElement("div"); 6217 let review_list = document.createElement("ul"); 6218 review_list.className = "w3-ul"; 6219 let name_li = document.createElement("li"); 6220 name_li.textContent = name; 6221 let rating_li = document.createElement("li"); 6222 rating_li.textContent = rating + " "; 6223 let date_li = document.createElement("li"); 6224 date_li.textContent = time; 6225 let review_li = document.createElement("li"); 6226 let review_p = document.createElement("p"); 6227 review_p.textContent = review; 6228 review_li.appendChild(review_p); 6229 let img_star = Math.round(parseFloat(rating)); 6230 let star_img = document.createElement("img"); 6231 star_img.className = "review_img"; 6232 star_img.src = "https://rental.software/images/" + img_star + "star.png"; 6233 rating_li.appendChild(star_img); 6234 review_list.appendChild(name_li); 6235 review_list.appendChild(rating_li); 6236 review_list.appendChild(date_li); 6237 review_list.appendChild(review_li); 6238 review_div.appendChild(review_list); 6239 element.appendChild(review_div); 6240 }); 6241 let avg = (parseFloat(rating_sum)/parseFloat(review_cnt)).toFixed(1); 6242 let avg_img = Math.round(avg); 6243 let head = document.createElement("div"); 6244 let head_h2 = document.createElement("h2"); 6245 head_h2.textContent = "Avg Rating: " + avg; 6246 let head_img = document.createElement("img"); 6247 head_img.className = "review_avg_img"; 6248 head_img.src = "https://rental.software/images/" + avg_img + "star.png"; 6249 head.appendChild(head_h2); 6250 head.appendChild(head_img); 6251 element.prepend(head); 6252 }).catch(function(err) { 6253 console.log(err); 6254 }); 6255}</script>
6255<div id="wow-notification-1" class="wow-notification"><div class="wow-notification-block"><div class="wow-notification-img"><span class="fas fa-bell"></span></div><div class="wow-notification-text-block"><div class="wow-wow-notification-text">[amount] people have booked in the last 24 Hours</div></div></div></div><div data-elementor-type="popup" data-elementor-id="58953" class="elementor elementor-58953 elementor-location-popup" data-elementor-settings="{"a11y_navigation":"yes","timing":[]}" data-elementor-post-type="elementor_library"><section class="elementor-section elementor-top-section elementor-element elementor-element-e0cd885 elementor-section-boxed elementor-section-height-default elementor-section-height-default" data-id="e0cd885" data-element_type="section" data-e-type="section"><div class="elementor-container elementor-column-gap-default"><div class="elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-782a99f" data-id="782a99f" data-element_type="column" data-e-type="column"><div class="elementor-widget-wrap elementor-element-populated"><div class="elementor-element elementor-element-bd04d59 elementor-button-align-stretch elementor-invisible elementor-widget elementor-widget-form" data-id="bd04d59" data-element_type="widget" data-e-type="widget" data-settings="{"step_next_label":"Next","step_previous_label":"Previous","_animation":"zoomIn","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" name="Proposal Request" aria-label="Proposal Request"> <input type="hidden" name="post_id" value="58953"/> <input type="hidden" name="form_id" value="bd04d59"/> <input type="hidden" name="referer_title" value="White Manzanita Tree 30" - A & S Party Rental And More" /> <input type="hidden" name="queried_id" value="4174"/><div class="elementor-form-fields-wrapper elementor-labels-above"><div class="elementor-field-type-text elementor-field-group elementor-column elementor-field-group-name elementor-col-50 elementor-field-required elementor-mark-required"> <label for="form-field-name" class="elementor-field-label"> FIrst Name </label> <input size="1" type="text" name="form_fields[name]" id="form-field-name" class="elementor-field elementor-size-sm elementor-field-textual" placeholder="FIrst Name" required="required"></div><div class="elementor-field-type-text elementor-field-group elementor-column elementor-field-group-field_105c18f elementor-col-50 elementor-field-required elementor-mark-required"> <label for="form-field-field_105c18f" class="elementor-field-label"> Last Name </label> <input size="1" type="text" name="form_fields[field_105c18f]" id="form-field-field_105c18f" class="elementor-field elementor-size-sm elementor-field-textual" placeholder="Last Name" required="required"></div><div class="elementor-field-type-tel elementor-field-group elementor-column elementor-field-group-field_a799412 elementor-col-50 elementor-field-required elementor-mark-required"> <label for="form-field-field_a799412" class="elementor-field-label"> Phone </label> <input size="1" type="tel" name="form_fields[field_a799412]" id="form-field-field_a799412" class="elementor-field elementor-size-sm elementor-field-textual" placeholder="Phone" required="required" pattern="[0-9()#&+*-=.]+" title="Only numbers and phone characters (#, -, *, etc) are accepted."></div><div class="elementor-field-type-email elementor-field-group elementor-column elementor-field-group-email elementor-col-50 elementor-field-required elementor-mark-required"> <label for="form-field-email" class="elementor-field-label"> Email </label> <input size="1" type="email" name="form_fields[email]" id="form-field-email" class="elementor-field elementor-size-sm elementor-field-textual" placeholder="Email" required="required"></div><div class="elementor-field-type-text elementor-field-group elementor-column elementor-field-group-field_eb5e90b elementor-col-100"> <label for="form-field-field_eb5e90b" class="elementor-field-label"> Organization Name </label> <input size="1" type="text" name="form_fields[field_eb5e90b]" id="form-field-field_eb5e90b" class="elementor-field elementor-size-sm elementor-field-textual" placeholder="John Smith, Inc."></div><div class="elementor-field-type-date elementor-field-group elementor-column elementor-field-group-field_a68c456 elementor-col-33 elementor-field-required elementor-mark-required"> <label for="form-field-field_a68c456" class="elementor-field-label"> Event Date </label> <input type="date" name="form_fields[field_a68c456]" id="form-field-field_a68c456" class="elementor-field elementor-size-sm elementor-field-textual elementor-date-field elementor-use-native" placeholder="MM/DD/YYYY" required="required" pattern="[0-9]{4}-[0-9]{2}-[0-9]{2}"></div><div class="elementor-field-type-time elementor-field-group elementor-column elementor-field-group-field_2fe961a elementor-col-33 elementor-field-required elementor-mark-required"> <label for="form-field-field_2fe961a" class="elementor-field-label"> Event Start Time </label> <input type="time" name="form_fields[field_2fe961a]" id="form-field-field_2fe961a" class="elementor-field elementor-size-sm elementor-field-textual elementor-time-field elementor-use-native" required="required"></div><div class="elementor-field-type-text elementor-field-group elementor-column elementor-field-group-field_3834ab6 elementor-col-33"> <label for="form-field-field_3834ab6" class="elementor-field-label"> Event Length </label> <input size="1" type="text" name="form_fields[field_3834ab6]" id="form-field-field_3834ab6" class="elementor-field elementor-size-sm elementor-field-textual" placeholder="4 hours"></div><div class="elementor-field-type-text elementor-field-group elementor-column elementor-field-group-field_abdfcd7 elementor-col-100 elementor-field-required elementor-mark-required"> <label for="form-field-field_abdfcd7" class="elementor-field-label"> Name of Event </label> <input size="1" type="text" name="form_fields[field_abdfcd7]" id="form-field-field_abdfcd7" class="elementor-field elementor-size-sm elementor-field-textual" placeholder="Winter Carnival" required="required"></div><div class="elementor-field-type-text elementor-field-group elementor-column elementor-field-group-field_bb2d205 elementor-col-100 elementor-field-required elementor-mark-required"> <label for="form-field-field_bb2d205" class="elementor-field-label"> Event Address 1 </label> <input size="1" type="text" name="form_fields[field_bb2d205]" id="form-field-field_bb2d205" class="elementor-field elementor-size-sm elementor-field-textual" placeholder="123 Main Street" required="required"></div><div class="elementor-field-type-text elementor-field-group elementor-column elementor-field-group-field_8c29dd3 elementor-col-100"> <label for="form-field-field_8c29dd3" class="elementor-field-label"> Event Address 2 </label> <input size="1" type="text" name="form_fields[field_8c29dd3]" id="form-field-field_8c29dd3" class="elementor-field elementor-size-sm elementor-field-textual"></div><div class="elementor-field-type-text elementor-field-group elementor-column elementor-field-group-field_41b798e elementor-col-25 elementor-field-required elementor-mark-required"> <label for="form-field-field_41b798e" class="elementor-field-label"> City </label> <input size="1" type="text" name="form_fields[field_41b798e]" id="form-field-field_41b798e" class="elementor-field elementor-size-sm elementor-field-textual" placeholder="Dayton" required="required"></div><div class="elementor-field-type-select elementor-field-group elementor-column elementor-field-group-field_82d2d49 elementor-col-50 elementor-field-required elementor-mark-required"> <label for="form-field-field_82d2d49" class="elementor-field-label"> State </label><div class="elementor-field elementor-select-wrapper remove-before "><div class="select-caret-down-wrapper"> <i aria-hidden="true" class="eicon-caret-down"></i></div> <select name="form_fields[field_82d2d49]" id="form-field-field_82d2d49" class="elementor-field-textual elementor-size-sm" required="required"><option value="Alabama">AL</option><option value="Alaska">AK</option><option value="Arizona">AZ</option><option value="Arkansas">AR</option><option value="California">CA</option><option value="Colorado">CO</option><option value="Connecticut">CT</option><option value="Delaware">DE</option><option value="Florida">FL</option><option value="Georgia">GA</option><option value="Hawaii">HI</option><option value="Idaho">ID</option><option value="Illinois">IL</option><option value="Indiana">IN</option><option value="Iowa">IA</option><option value="Kansas">KS</option><option value="Kentucky">KY</option><option value="Louisiana">LA</option><option value="Maine">ME</option><option value="Maryland">MD</option><option value="Massachusetts">MA</option><option value="Michigan">MI</option><option value="Minnesota">MN</option><option value="Mississippi">MS</option><option value="Missouri">MO</option><option value="Montana">MT</option><option value="Nebraska">NE</option><option value="Nevada">NV</option><option value="New Hampshire">NH</option><option value="New Jersey">NJ</option><option value="New Mexico">NM</option><option value="New York">NY</option><option value="North Carolina">NC</option><option value="North Dakota">ND</option><option value="Ohio">OH</option><option value="Oklahoma">OK</option><option value="Oregon">OR</option><option value="Pennsylvania">PA</option><option value="Rhode Island">RI</option><option value="South Carolina">SC</option><option value="South Dakota">SD</option><option value="Tennessee">TN</option><option value="Texas">TX</option><option value="Utah">UT</option><option value="Vermont">VT</option><option value="Virginia">VA</option><option value="Washington">WA</option><option value="West Virginia">WV</option><option value="Wisconsin">WI</option><option value="Wyoming">WY</option> </select></div></div><div class="elementor-field-type-number elementor-field-group elementor-column elementor-field-group-field_994086b elementor-col-25 elementor-field-required elementor-mark-required"> <label for="form-field-field_994086b" class="elementor-field-label">
6255 Zip Code </label> <input type="number" name="form_fields[field_994086b]" id="form-field-field_994086b" class="elementor-field elementor-size-sm elementor-field-textual" placeholder="XXXXX" required="required" min="5" max="" ></div><div class="elementor-field-type-html elementor-field-group elementor-column elementor-field-group-field_1fd5351 elementor-col-100"> <u>Optional: Want to tell us more?</u></div><div class="elementor-field-type-radio elementor-field-group elementor-column elementor-field-group-field_47fea2b elementor-col-100"> <label for="form-field-field_47fea2b" class="elementor-field-label"> Type of Event </label><div class="elementor-field-subgroup elementor-subgroup-inline"><span class="elementor-field-option"><input type="radio" value="college" id="form-field-field_47fea2b-0" name="form_fields[field_47fea2b]"> <label for="form-field-field_47fea2b-0">College</label></span><span class="elementor-field-option"><input type="radio" value="school" id="form-field-field_47fea2b-1" name="form_fields[field_47fea2b]"> <label for="form-field-field_47fea2b-1">School</label></span><span class="elementor-field-option"><input type="radio" value="sporting" id="form-field-field_47fea2b-2" name="form_fields[field_47fea2b]"> <label for="form-field-field_47fea2b-2">Sporting</label></span><span class="elementor-field-option"><input type="radio" value="city" id="form-field-field_47fea2b-3" name="form_fields[field_47fea2b]"> <label for="form-field-field_47fea2b-3">City</label></span><span class="elementor-field-option"><input type="radio" value="corporate" id="form-field-field_47fea2b-4" name="form_fields[field_47fea2b]"> <label for="form-field-field_47fea2b-4">Corporate</label></span><span class="elementor-field-option"><input type="radio" value="wedding" id="form-field-field_47fea2b-5" name="form_fields[field_47fea2b]"> <label for="form-field-field_47fea2b-5">Wedding</label></span><span class="elementor-field-option"><input type="radio" value="other" id="form-field-field_47fea2b-6" name="form_fields[field_47fea2b]"> <label for="form-field-field_47fea2b-6">Other</label></span></div></div><div class="elementor-field-type-radio elementor-field-group elementor-column elementor-field-group-field_097259a elementor-col-100"> <label for="form-field-field_097259a" class="elementor-field-label"> Budget </label><div class="elementor-field-subgroup elementor-subgroup-inline"><span class="elementor-field-option"><input type="radio" value="1-1500" id="form-field-field_097259a-0" name="form_fields[field_097259a]"> <label for="form-field-field_097259a-0">$1,500 or less</label></span><span class="elementor-field-option"><input type="radio" value="1500-2500" id="form-field-field_097259a-1" name="form_fields[field_097259a]"> <label for="form-field-field_097259a-1">$1,500-$2,500</label></span><span class="elementor-field-option"><input type="radio" value="2500-3500" id="form-field-field_097259a-2" name="form_fields[field_097259a]"> <label for="form-field-field_097259a-2">$2,500-$3,500</label></span><span class="elementor-field-option"><input type="radio" value="3500-5000" id="form-field-field_097259a-3" name="form_fields[field_097259a]"> <label for="form-field-field_097259a-3">$3,500-$5,000</label></span><span class="elementor-field-option"><input type="radio" value="5000+" id="form-field-field_097259a-4" name="form_fields[field_097259a]"> <label for="form-field-field_097259a-4">$5,000+</label></span></div></div><div class="elementor-field-type-radio elementor-field-group elementor-column elementor-field-group-field_c939173 elementor-col-100"> <label for="form-field-field_c939173" class="elementor-field-label"> Surface </label><div class="elementor-field-subgroup elementor-subgroup-inline"><span class="elementor-field-option"><input type="radio" value="hardscape" id="form-field-field_c939173-0" name="form_fields[field_c939173]"> <label for="form-field-field_c939173-0">Hardscape: Asphalt/Concrete</label></span><span class="elementor-field-option"><input type="radio" value="softscape" id="form-field-field_c939173-1" name="form_fields[field_c939173]"> <label for="form-field-field_c939173-1">Softscape: Grass/Lawn/Mulch</label></span><span class="elementor-field-option"><input type="radio" value="interior" id="form-field-field_c939173-2" name="form_fields[field_c939173]"> <label for="form-field-field_c939173-2">Interior: Concrete/Carpet/Wood</label></span></div></div><div class="elementor-field-type-radio elementor-field-group elementor-column elementor-field-group-field_492739b elementor-col-100"> <label for="form-field-field_492739b" class="elementor-field-label"> Indoor/Outdoor </label><div class="elementor-field-subgroup elementor-subgroup-inline"><span class="elementor-field-option"><input type="radio" value="indoor" id="form-field-field_492739b-0" name="form_fields[field_492739b]"> <label for="form-field-field_492739b-0">Indoor</label></span><span class="elementor-field-option"><input type="radio" value="outdoor" id="form-field-field_492739b-1" name="form_fields[field_492739b]"> <label for="form-field-field_492739b-1">Outdoor</label></span></div></div><div class="elementor-field-type-radio elementor-field-group elementor-column elementor-field-group-field_e3abeec elementor-col-100"> <label for="form-field-field_e3abeec" class="elementor-field-label"> Estimated Attendance </label><div class="elementor-field-subgroup elementor-subgroup-inline"><span class="elementor-field-option">
6255<input type="radio" value="0-50" id="form-field-field_e3abeec-0" name="form_fields[field_e3abeec]"> <label for="form-field-field_e3abeec-0">Less than 50</label></span><span class="elementor-field-option"><input type="radio" value="50-200" id="form-field-field_e3abeec-1" name="form_fields[field_e3abeec]"> <label for="form-field-field_e3abeec-1">50-200</label></span><span class="elementor-field-option"><input type="radio" value="200-500" id="form-field-field_e3abeec-2" name="form_fields[field_e3abeec]"> <label for="form-field-field_e3abeec-2">200-500</label></span><span class="elementor-field-option"><input type="radio" value="500-1000" id="form-field-field_e3abeec-3" name="form_fields[field_e3abeec]"> <label for="form-field-field_e3abeec-3">500-1000</label></span><span class="elementor-field-option"><input type="radio" value="More than 5000" id="form-field-field_e3abeec-4" name="form_fields[field_e3abeec]"> <label for="form-field-field_e3abeec-4">More than 5000</label></span></div></div><div class="elementor-field-type-textarea elementor-field-group elementor-column elementor-field-group-message elementor-col-100"> <label for="form-field-message" class="elementor-field-label"> Activities Wanted </label><textarea class="elementor-field-textual elementor-field elementor-size-sm" name="form_fields[message]" id="form-field-message" rows="4" placeholder="Portable Zipline, Axe Throwing, Bounce House, Catering, etc."></textarea></div><div class="elementor-field-type-textarea elementor-field-group elementor-column elementor-field-group-field_23f50e4 elementor-col-100"> <label for="form-field-field_23f50e4" class="elementor-field-label"> Additional comments or details </label><textarea class="elementor-field-textual elementor-field elementor-size-sm" name="form_fields[field_23f50e4]" id="form-field-field_23f50e4" rows="4" placeholder="Please provide any additional details..."></textarea></div><div class="elementor-field-type-radio elementor-field-group elementor-column elementor-field-group-field_556639c elementor-col-100 elementor-field-required elementor-mark-required"> <label for="form-field-field_556639c" class="elementor-field-label"> Would you like a digital catalog? </label><div class="elementor-field-subgroup elementor-subgroup-inline"><span class="elementor-field-option"><input type="radio" value="yes_catalog" id="form-field-field_556639c-0" name="form_fields[field_556639c]" required="required"> <label for="form-field-field_556639c-0">Yes</label></span><span class="elementor-field-option"><input type="radio" value="no_catalog" id="form-field-field_556639c-1" name="form_fields[field_556639c]" required="required"> <label for="form-field-field_556639c-1">No</label></span></div></div><div class="elementor-field-type-radio elementor-field-group elementor-column elementor-field-group-field_3df5669 elementor-col-100 elementor-field-required elementor-mark-required"> <label for="form-field-field_3df5669" class="elementor-field-label"> Would you like to signup for our newsletter? </label><div class="elementor-field-subgroup "><span class="elementor-field-option"><input type="radio" value="yes_newsletter" id="form-field-field_3df5669-0" name="form_fields[field_3df5669]" required="required"> <label for="form-field-field_3df5669-0">Yes</label></span><span class="elementor-field-option"><input type="radio" value="no_newsletter" id="form-field-field_3df5669-1" name="form_fields[field_3df5669]" required="required"> <label for="form-field-field_3df5669-1">No</label></span></div></div><div class="elementor-field-group elementor-column elementor-field-type-submit elementor-col-100 e-form__buttons"> <button class="elementor-button elementor-size-sm" type="submit"> <span class="elementor-button-content-wrapper"> <span class="elementor-button-text">Submit</span> </span> </button></div></div></form></div></div></div></div></div></section></div><style type="text/css">.searchio-live-search-results { 6256 opacity: 0; 6257 transition: opacity .25s ease-in-out; 6258 -moz-transition: opacity .25s ease-in-out; 6259 -webkit-transition: opacity .25s ease-in-out; 6260 height: 0; 6261 overflow: hidden; 6262 z-index: 9999995; /* Exceed searchIO Modal Search Form overlay. */ 6263 position: absolute; 6264 display: none; 6265 } 6266 6267 .searchio-live-search-results-showing { 6268 display: block; 6269 opacity: 1; 6270 height: auto; 6271 overflow: auto; 6272 } 6273 6274 .searchio-live-search-no-results { 6275 padding: 3em 2em 0; 6276 text-align: center; 6277 } 6278 6279 .searchio-live-search-no-min-chars:after { 6280 content: "Continue typing"; 6281 display: block; 6282 text-align: center; 6283 padding: 2em 2em 0; 6284 }</style>
6284<script>var _searchIO_LIVE_AJAX_SEARCH_BLOCKS = true; 6285 var _searchIO_LIVE_AJAX_SEARCH_ENGINE = 'default'; 6286 var _searchIO_LIVE_AJAX_SEARCH_CONFIG = 'default';</script>
6286
6286<script>( () => { 6287 const lazyloadRunObserver = () => { 6288 const lazyloadBackgrounds = document.querySelectorAll( `.e-con.e-parent:not(.e-lazyloaded)` ); 6289 const lazyloadBackgroundObserver = new IntersectionObserver( ( entries ) => { 6290 entries.forEach( ( entry ) => { 6291 if ( entry.isIntersecting ) { 6292 let lazyloadBackground = entry.target; 6293 if( lazyloadBackground ) { 6294 lazyloadBackground.classList.add( 'e-lazyloaded' ); 6295 } 6296 lazyloadBackgroundObserver.unobserve( entry.target ); 6297 } 6298 }); 6299 }, { rootMargin: '200px 0px 200px 0px' } ); 6300 lazyloadBackgrounds.forEach( ( lazyloadBackground ) => { 6301 lazyloadBackgroundObserver.observe( lazyloadBackground ); 6302 } ); 6303 }; 6304 const events = [ 6305 'DOMContentLoaded', 6306 'elementor/lazyload/observe', 6307 ]; 6308 events.forEach( ( event ) => { 6309 document.addEventListener( event, lazyloadRunObserver ); 6310 } ); 6311 } )();</script>
6311
6311<script id="jquery-ui-core-js-before">jQuery.uiBackCompat = true; 6312//# sourceURL=jquery-ui-core-js-before</script>
6312
6312<script id="jquery-ui-datepicker-js-after">jQuery(function(jQuery){jQuery.datepicker.setDefaults({"closeText":"Close","currentText":"Today","monthNames":["January","February","March","April","May","June","July","August","September","October","November","December"],"monthNamesShort":["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],"nextText":"Next","prevText":"Previous","dayNames":["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],"dayNamesShort":["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],"dayNamesMin":["S","M","T","W","T","F","S"],"dateFormat":"MM d, yy","firstDay":1,"isRTL":false});}); 6313//# sourceURL=jquery-ui-datepicker-js-after</script>
6313
6313<script id="slick-carousel-js-js" src="https://cdnjs.cloudflare.com/ajax/libs/slick-carousel/1.8.1/slick.min.js?ver=1.8.1"></script>
6313
6313<script id="elementor-frontend-js-before">var elementorFrontendConfig = {"environmentMode":{"edit":false,"wpPreview":false,"isScriptDebug":false},"i18n":{"shareOnFacebook":"Share on Facebook","shareOnX":"Share on X","pinIt":"Pin it","download":"Download","downloadImage":"Download image","fullscreen":"Fullscreen","zoom":"Zoom","share":"Share","playVideo":"Play Video","previous":"Previous","next":"Next","close":"Close","a11yCarouselPrevSlideMessage":"Previous slide","a11yCarouselNextSlideMessage":"Next slide","a11yCarouselFirstSlideMessage":"This is the first slide","a11yCarouselLastSlideMessage":"This is the last slide","a11yCarouselPaginationBulletMessage":"Go to slide"},"is_rtl":false,"breakpoints":{"xs":0,"sm":480,"md":768,"lg":1025,"xl":1440,"xxl":1600},"responsive":{"breakpoints":{"mobile":{"label":"Mobile Portrait","value":767,"default_value":767,"direction":"max","is_enabled":true},"mobile_extra":{"label":"Mobile Landscape","value":880,"default_value":880,"direction":"max","is_enabled":false},"tablet":{"label":"Tablet Portrait","value":1024,"default_value":1024,"direction":"max","is_enabled":true},"tablet_extra":{"label":"Tablet Landscape","value":1200,"default_value":1200,"direction":"max","is_enabled":false},"laptop":{"label":"Laptop","value":1366,"default_value":1366,"direction":"max","is_enabled":false},"widescreen":{"label":"Widescreen","value":2400,"default_value":2400,"direction":"min","is_enabled":false}},"hasCustomBreakpoints":false},"version":"4.3.2","is_static":false,"experimentalFeatures":{"additional_custom_breakpoints":true,"theme_builder_v2":true,"landing-pages":true,"import-export-customization":true,"e_pro_atomic_form":true,"e_pro_collection_loop":true},"urls":{"assets":"https:\/\/www.aspartyrental.com\/wp-content\/plugins\/elementor\/assets\/","ajaxurl":"https:\/\/www.aspartyrental.com\/wp-admin\/admin-ajax.php","uploadUrl":"https:\/\/www.aspartyrental.com\/wp-content\/uploads"},"nonces":{"floatingButtonsClickTracking":"e0bc1b73d8","atomicFormsSendForm":"1cc2d17a5f"},"swiperClass":"swiper","settings":{"page":[],"editorPreferences":[]},"kit":{"body_background_background":"classic","active_breakpoints":["viewport_mobile","viewport_tablet"],"lightbox_enable_counter":"yes","lightbox_enable_fullscreen":"yes","lightbox_enable_zoom":"yes","lightbox_enable_share":"yes","lightbox_title_src":"title","lightbox_description_src":"description"},"post":{"id":4588,"title":"Top%20100%20Exclusive%20Trackless%20Train%20W%2F%20Roofed%20Carts%20-%20A%20%26%20S%20Party%20Rental%20And%20More","excerpt":"","featuredImage":"https:\/\/www.aspartyrental.com\/wp-content\/uploads\/2023\/09\/Trackless20Train20NEW_832321_big.jpg"}}; 6314//# sourceURL=elementor-frontend-js-before</script>
6314
6314<script id="swp-live-search-client-js-extra">var searchio_live_search_params = []; 6315searchio_live_search_params = {"ajaxurl":"https:\/\/www.aspartyrental.com\/wp-admin\/admin-ajax.php","origin_id":4588,"config":{"default":{"engine":"default","input":{"delay":300,"min_chars":3},"results":{"position":"bottom","width":"auto","offset":{"x":0,"y":5}},"spinner":{"lines":12,"length":8,"width":3,"radius":8,"scale":1,"corners":1,"color":"#424242","fadeColor":"transparent","speed":1,"rotate":0,"animation":"searchio-spinner-line-fade-quick","direction":1,"zIndex":2000000000,"className":"spinner","top":"50%","left":"50%","shadow":"0 0 1px transparent","position":"absolute"}}},"msg_no_config_found":"No valid searchIO Live Search configuration found!","aria_instructions":"When autocomplete results are available use up and down arrows to review and enter to go to the desired page. Touch device users, explore by touch or with swipe gestures.","io_search_results_same_width":"1","io_search_results_width":"400","io_search_results_align":"right"};; 6316//# sourceURL=swp-live-search-client-js-extra</script>
vendor: 131 bytes, line 6316
6316 <script id="elementor-recaptcha_v3-api-js" src="https://www.google.com/recaptcha/api.js?render=explicit&ver=4.3.0"></script>
6316<script id="mwp-herd-effect-js-extra">var HerdEffectsObj = {"wow-notification-1":{"openTime":{"type":"stable","min":9000},"number":3,"variables":{"amount":[3,20]},"style":{"--radius":"5px","--inset":"10% 10% auto auto","--text-block":"200px","--text-size":"14px","--text-line":"18px","--text-color":"#ffffff","--text-background":"rgba(0, 0, 0, 0.75)","--text-font":"inherit","--text-padding":"10px","--img-block":"60px","--img-size":"40px","--img-background":"rgba(0,0,0,0.75)","--img-color":"#ffffff"}}}; 6317//# sourceURL=mwp-herd-effect-js-extra</script>
6317
6317<script id="wp-hooks-js" src="https://www.aspartyrental.com/wp-includes/js/dist/hooks.min.js?ver=f0f188028580e8dc1255"></script>
6317
6317<script id="wp-i18n-js" src="https://www.aspartyrental.com/wp-includes/js/dist/i18n.min.js?ver=1dfe7db3940c23ea9216"></script>
6317
6317<script id="wp-i18n-js-after">wp.i18n.setLocaleData( { 'text direction\u0004ltr': [ 'ltr' ] } ); 6318//# sourceURL=wp-i18n-js-after</script>
6318
6318<script id="elementor-pro-frontend-js-before">var ElementorProFrontendConfig = {"ajaxurl":"https:\/\/www.aspartyrental.com\/wp-admin\/admin-ajax.php","nonce":"30b54fd320","urls":{"assets":"https:\/\/www.aspartyrental.com\/wp-content\/plugins\/elementor-pro\/assets\/","rest":"https:\/\/www.aspartyrental.com\/wp-json\/"},"settings":{"lazy_load_background_images":true},"popup":{"hasPopUps":true},"shareButtonsNetworks":{"facebook":{"title":"Facebook","has_counter":true},"twitter":{"title":"Twitter"},"linkedin":{"title":"LinkedIn","has_counter":true},"pinterest":{"title":"Pinterest","has_counter":true},"reddit":{"title":"Reddit","has_counter":true},"vk":{"title":"VK","has_counter":true},"odnoklassniki":{"title":"OK","has_counter":true},"tumblr":{"title":"Tumblr"},"digg":{"title":"Digg"},"skype":{"title":"Skype"},"stumbleupon":{"title":"StumbleUpon","has_counter":true},"mix":{"title":"Mix"},"telegram":{"title":"Telegram"},"pocket":{"title":"Pocket","has_counter":true},"xing":{"title":"XING","has_counter":true},"whatsapp":{"title":"WhatsApp"},"email":{"title":"Email"},"print":{"title":"Print"},"x-twitter":{"title":"X"},"threads":{"title":"Threads"}},"facebook_sdk":{"lang":"en_US","app_id":""},"lottie":{"defaultAnimationUrl":"https:\/\/www.aspartyrental.com\/wp-content\/plugins\/elementor-pro\/modules\/lottie\/assets\/animations\/default.json"}}; 6319//# sourceURL=elementor-pro-frontend-js-before</script>
6319
6319<script defer src="https://www.aspartyrental.com/wp-content/cache/autoptimize/1/js/autoptimize_2490caa87a2e693e45e4b0cba33e9997.js"></script>
6319</body></html> 6320<!-- Cached by WP-Optimize (gzip) - https://teamupdraft.com/wp-optimize/ - Last modified: September 28, 2026 10:49 am (UTC:0) -->
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.