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