function getServiceBoundary() { var myCoordinates = [ new google.maps.LatLng(43.58598, -79.5406), new google.maps.LatLng(43.56434, -79.55811), new google.maps.LatLng(43.66215, -79.69047), new google.maps.LatLng(43.67593, -79.67484), new google.maps.LatLng(43.68686, -79.68995), new google.maps.LatLng(43.7015, -79.68102), new google.maps.LatLng(43.71143, -79.67416), new google.maps.LatLng(43.72756, -79.67313), new google.maps.LatLng(43.74492, -79.64635), new google.maps.LatLng(43.75211, -79.63914), new google.maps.LatLng(43.75583, -79.62849), new google.maps.LatLng(43.77691, -79.56258), new google.maps.LatLng(43.78348, -79.54781), new google.maps.LatLng(43.78998, -79.54867), new google.maps.LatLng(43.80117, -79.49932), new google.maps.LatLng(43.81902, -79.50503), new google.maps.LatLng(43.83723, -79.42772), new google.maps.LatLng(43.81451, -79.42356), new google.maps.LatLng(43.82012, -79.39454), new google.maps.LatLng(43.82441, -79.36354), new google.maps.LatLng(43.81359, -79.35281), new google.maps.LatLng(43.8287, -79.2862), new google.maps.LatLng(43.80467, -79.2759), new google.maps.LatLng(43.81247, -79.24312), new google.maps.LatLng(43.79407, -79.23668), new google.maps.LatLng(43.79897, -79.21651), new google.maps.LatLng(43.78261, -79.2014), new google.maps.LatLng(43.76464, -79.19093), new google.maps.LatLng(43.74517, -79.18595), new google.maps.LatLng(43.70733, -79.22149), new google.maps.LatLng(43.70076, -79.24535), new google.maps.LatLng(43.67643, -79.26251), new google.maps.LatLng(43.665, -79.29822), new google.maps.LatLng(43.61482, -79.37375), new google.maps.LatLng(43.58548, -79.53923), ]; return new google.maps.Polygon({ paths: myCoordinates }); } function createMap(mapElement, latLng, zoom) { if (!zoom) { zoom = 8; } const options = { center: { lat: 43.714242, lng: -79.4283693 }, zoom: zoom, // bounds: google.maps.LatLngBounds({lat: 43.5820366, lng: -79.547845}, {lat: 43.8108153, lng: -79.3465338}), disableDefaultUI: true, }; let map = new google.maps.Map(mapElement, options); if (latLng) { const marker = new google.maps.Marker({ map, anchorPoint: new google.maps.Point(0, -29), }); map.setCenter(latLng); marker.setPosition(latLng); marker.setVisible(true); } return map; } function createAutoComplete(block, num) { // console.log(property.find('.addressmap_' + index)); let address_field = block.getElementsByClassName("address_field")[0]; let postal_code_field = block.getElementsByClassName("postal_code_field")[0]; let city_field = block.getElementsByClassName("city_field")[0]; let mapElement = block.getElementsByClassName("map_div")[0]; let within_bounds_field = block.getElementsByClassName( "within_bounds_field" )[0]; let map = createMap(mapElement); var componentTypes = "street_address route postal_code street_number lat lng viewport location formatted_address location_type bounds".split( " " ); const options2 = { fields: ["formatted_address", "address_component", "geometry", "name"], strictBounds: true, componentRestrictions: { country: "ca" }, bounds: new google.maps.LatLngBounds( new google.maps.LatLng(43.512705, -79.815674), new google.maps.LatLng(43.860277, -79.060364) ), }; //-79.612427,43.602273,-79.123535,43.870178 const autocomplete = new google.maps.places.Autocomplete( address_field, options2 ); //autocomplete.bindTo("bounds", map); const marker = new google.maps.Marker({ map, anchorPoint: new google.maps.Point(0, -29), }); autocomplete.addListener("place_changed", () => { marker.setVisible(false); const place = autocomplete.getPlace(); if (!place.geometry || !place.geometry.location) { postal_code_field.value = ""; address_field.value = ""; city_field.value = ""; return; } // If the place has a geometry, then present it on a map. if (place.geometry.viewport) { map.fitBounds(place.geometry.viewport); } else { map.setCenter(place.geometry.location); map.setZoom(17); } var addresscomponents = place.address_components; var streetnumber; var streetname; var postalcode; var city; addresscomponents.forEach(function (component) { if (component.types[0] == "street_number") { streetnumber = component.long_name; } if (component.types[0] == "route") { streetname = component.short_name; } if (component.types[0] == "postal_code") { postalcode = component.long_name; } if (component.types[0] == "locality") { city = component.long_name; } }); if (streetname && streetnumber) { address_field.value = streetnumber + " " + streetname; } if (postalcode) { postal_code_field.value = postalcode; } if (city) { city_field.value = city; } marker.setPosition(place.geometry.location); marker.setVisible(true); var latlng = place.geometry.location; if ( google.maps.geometry.poly.containsLocation(latlng, getServiceBoundary()) ) { within_bounds_field.value = "Within Bounds"; } else { within_bounds_field.value = "Outside of Bounds"; } }); } let removeProperty = (evt) => { let index = evt.currentTarget.propertyNumber - 1; let properties_container = document.getElementsByClassName( "properties_container" )[0]; let property_blocks = properties_container.getElementsByClassName("property_block"); if (property_blocks.length && index < property_blocks.length) { let node = property_blocks[index]; node.remove(); let i = 1; property_blocks = properties_container.getElementsByClassName("property_block"); let num_properties = property_blocks.length; for (let block of property_blocks) { block = setPropertyBlockAttributes(block, i, num_properties); i++; } let num_properties_field = document.getElementById("NumProperties"); num_properties.value = num_properties; } }; let setInputFieldsAttributes = (block, type, num, doClear = false) => { const nameRegex = /\d/; let inputs = block.getElementsByTagName(type); for (let input of inputs) { input.id = input.id.replace(nameRegex, num); input.name = input.name.replace(nameRegex, num); input.dataset.name = input.dataset.name.replace(nameRegex, num); if (doClear) { input.value = ""; } } }; let setPropertyBlockAttributes = ( block, num, num_properties, doClear = false ) => { const nameRegex = /\d/; let mapElement = block.getElementsByClassName("map_div")[0]; mapElement.innerHtml = ""; mapElement.id = mapElement.id.replace(nameRegex, num); let header = block.getElementsByClassName("property_header")[0]; header.innerText = header.innerText.replace(nameRegex, num); setInputFieldsAttributes(block, "input", num, doClear); setInputFieldsAttributes(block, "select", num, doClear); setInputFieldsAttributes(block, "textarea", num, doClear); let labels = block.getElementsByTagName("label"); for (let label of labels) { label.htmlFor = label.htmlFor.replace(nameRegex, num); } let btn = block.getElementsByClassName("btn_remove_property")[0]; console.log(btn, num_properties); if (num > 1) { btn.style.display = "block"; } else { btn.style.display = "hidden"; } btn.propertyNumber = num; btn.addEventListener("click", removeProperty); return block; }; let addProperty = () => { let properties_container = document.getElementsByClassName( "properties_container" )[0]; let property_blocks = properties_container.getElementsByClassName("property_block"); let num_properties = property_blocks.length; if (num_properties > 0) { let first = property_blocks[0]; let clone = first.cloneNode(true); clone = setPropertyBlockAttributes( clone, num_properties + 1, num_properties + 1, true ); createAutoComplete(clone, num_properties + 1); properties_container.appendChild(clone); let num_properties_field = document.getElementById("NumProperties"); num_properties_field.value = num_properties + 1; } }; let setEmailFieldsState = (valid) => { let errorMessage = document.getElementById("emails-not-same-error"); let formChecker = document.getElementById("EmailValidity"); if (valid) { errorMessage.style.display = "none"; formChecker.value = "valid"; } else { errorMessage.style.display = "block"; formChecker.value = ""; } console.log("validity " + valid); }; let onEmailBlur = () => { let Email_Field_1 = document.getElementById("Email_Field_1"); let Email_Field_2 = document.getElementById("Email_Field_2"); if (Email_Field_1 && Email_Field_2) { let val1 = Email_Field_1.value; let val2 = Email_Field_2.value; if (val1.length && val2.length && val1 != val2) { setEmailFieldsState(false); } else { setEmailFieldsState(true); } } else { setEmailFieldsState(true); } }; let setEmailFieldsListeners = () => { let Email_Field_1 = document.getElementById("Email_Field_1"); let Email_Field_2 = document.getElementById("Email_Field_2"); if (Email_Field_1 && Email_Field_2) { [Email_Field_1, Email_Field_2].forEach((field) => { field.addEventListener("blur", onEmailBlur); }); } }; let setResetFormListeners = () => { let quote_form_content = document.getElementById("quote_form_content"); let reset_buttons = quote_form_content.getElementsByClassName("reset_button"); for (let button of reset_buttons) { button.addEventListener("click", resetForm); } }; function submitForm() { const form = document.getElementById("quote_form"); const data = new FormData(form); var object = {}; //remove captcha data and RequestData fields //from form to shorten payload to API data.forEach(function (value, key) { if (key === "g-recaptcha-response") { } else if (key === "RequestData") { } else { object[key] = value; } }); var json = JSON.stringify(object); let body = "RequestData=" + btoa(json); let quote_form_success = document.getElementById("quote_form_success"); let quote_form_error = document.getElementById("quote_form_error"); const url = "https://www.monsterapi.ca/QuickContact"; const apiToken = "fff788425d6a6ebe355d41550642ed7edbf483be"; fetch(url, { method: "POST", body: body, headers: { Authorization: `Bearer ${apiToken}`, }, }).then(function (response) { if (response.ok && response.status == 200) { form.style.display = "none"; quote_form_success.style.display = "block"; } else { form.style.display = "none"; quote_form_error.style.display = "block"; } }); submitted = true; //conversion code gtag_report_conversion(); _tfa.push({ notify: "event", name: "form_submit_boo", id: 1593096 }); } let setFakeSubmitListener = () => { const FakeSubmit = document.getElementById("FakeSubmit"); FakeSubmit.addEventListener("click", submitForm); }; let resetForm = () => { let form = document.getElementById("quote_form"); let quote_form_success = document.getElementById("quote_form_success"); let quote_form_error = document.getElementById("quote_form_error"); let properties_container = document.getElementsByClassName( "properties_container" )[0]; let property_blocks = properties_container.getElementsByClassName("property_block"); if (property_blocks.length > 1) { for (i = 1; i < property_blocks.length; i++) { let block = property_blocks[i]; block.remove(); } } form.reset(); form.style.display = "flex"; quote_form_success.style.display = "none"; quote_form_error.style.display = "none"; grecaptcha.reset(); let num_properties_field = document.getElementById("NumProperties"); num_properties_field.value = 1; submitted = false; }; function initFirstMaps() { let properties_container = document.getElementsByClassName( "properties_container" )[0]; let property_blocks = properties_container.getElementsByClassName("property_block"); let first = property_blocks[0]; createAutoComplete(first, 1); let contact_us_map = document.getElementById("contact_us_map"); createMap( contact_us_map, new google.maps.LatLng(43.71154763448149, -79.46575999444039), 12 ); } let add_property_button = document.getElementsByClassName( "add_property_button" )[0]; if (add_property_button) { add_property_button.addEventListener("click", addProperty); } function disableScroll() { const body = document.body; body.style.overflow = "hidden"; } function enableScroll() { const body = document.body; body.style.overflow = "auto"; } function addHash() { if ("pushState" in history) { history.pushState({}, "", "#request_quote"); } else { let scrollV = document.body.scrollTop; let scrollH = document.body.scrollLeft; loc.hash = "request_quote"; document.body.scrollTop = scrollV; document.body.scrollLeft = scrollH; } } function removeHash() { if ("pushState" in history) { history.pushState( "", document.title, window.location.pathname + window.location.search ); } else { let scrollV = document.body.scrollTop; let scrollH = document.body.scrollLeft; loc.hash = ""; document.body.scrollTop = scrollV; document.body.scrollLeft = scrollH; } } showQuoteForm = () => { let quote_form_modal = document.getElementById("quote_form_modal"); quote_form_modal.style.display = "block"; quote_form_modal.onanimationend = () => { quote_form_modal.style.display = "block"; quote_form_modal.classList.remove("fade-in"); }; quote_form_modal.classList.add("fade-in"); addHash(); disableScroll(); }; hideQuoteForm = () => { let quote_form_modal = document.getElementById("quote_form_modal"); quote_form_modal.onanimationend = () => { quote_form_modal.style.display = "none"; quote_form_modal.classList.remove("fade-out"); }; quote_form_modal.classList.add("fade-out"); if (submitted) { resetForm(); } removeHash(); enableScroll(); }; setEmailFieldsListeners(); setResetFormListeners(); setFakeSubmitListener(); window.initFirstMaps = initFirstMaps; let quote_buttons = document.getElementsByClassName("get_quote_button"); for (let button of quote_buttons) { button.addEventListener("click", showQuoteForm); } var submitted = false; let form_close_button = document.getElementById("form_close_button"); form_close_button.addEventListener("click", hideQuoteForm); let modal_backdrop = document.getElementById("modal_backdrop"); modal_backdrop.addEventListener("click", hideQuoteForm); let num_properties_field = document.getElementById("NumProperties"); num_properties_field.value = 1; window.addEventListener("hashchange", function (e) { console.log(window.location.hash); if (window.location.hash == "") { let quote_form_modal = document.getElementById("quote_form_modal"); if (quote_form_modal.style.display == "block") { hideQuoteForm(); } } });