Estimate only; final pricing follows an on-site inspection. Includes tear-off of one layer, disposal, underlayment, ice and water barrier, starter, ridge cap and ventilation. Excludes decking, extra layers and permits.
';var v=function(a){return document.getElementById(a)},x=Array.prototype.slice.call(a.querySelectorAll(".arp-q")),h=0,b={mat:"asphalt",pitch:1.12,layers:"1"},y=null,k="",w="",_=!1,C=!1,z=0,S=!1,q=window.crypto&&crypto.randomUUID?crypto.randomUUID():Date.now().toString(36)+Math.random().toString(36).slice(2),E={intro:0,addr:0,measure:1,mat:2,pitch:2,layers:2,gate:3,result:3},L=["mailinator.com","guerrillamail.com","10minutemail.com","tempmail.com","temp-mail.org","yopmail.com","trashmail.com","sharklasers.com","getnada.com","dispostable.com","maildrop.cc","fakeinbox.com","throwawaymail.com","test.com","example.com","asdf.com","none.com"],A={"gamil.com":"gmail.com","gmial.com":"gmail.com","gmal.com":"gmail.com","gmali.com":"gmail.com","gnail.com":"gmail.com","gmaill.com":"gmail.com","gmail.co":"gmail.com","gmail.cm":"gmail.com","gmail.om":"gmail.com","yaho.com":"yahoo.com","yahooo.com":"yahoo.com","yahoo.co":"yahoo.com","hotnail.com":"hotmail.com","hotmial.com":"hotmail.com","hotmall.com":"hotmail.com","outlok.com":"outlook.com","iclould.com":"icloud.com","icoud.com":"icloud.com","comcastnet.com":"comcast.net"},M=["test","asdf","fake","none","noname","abc","aaa","xyz","qwerty","baby","googoo","gaga","na","no","anon","anonymous"],T={name:!1,phone:!1,email:!1};["name","phone","email"].forEach(function(a){var t=v("arp-g-"+a);t.addEventListener("input",function(){G(a)}),t.addEventListener("blur",function(){G(a)})});var P=null;a.querySelectorAll(".arp-opts").forEach(function(a){var t=a.getAttribute("data-key");a.querySelectorAll(".arp-opt").forEach(function(e){e.addEventListener("click",function(){a.querySelectorAll(".arp-opt").forEach(function(a){a.classList.remove("on")}),e.classList.add("on"),b[t]="pitch"===t?parseFloat(e.dataset.v):e.dataset.v})})}),v("arp-next").addEventListener("click",function(){var a=O(h);if("addr"!==a)return"measure"!==a||I()?void("mat"!==a||"asphalt"===b.mat?U(h+1):U(j("layers"))):(v("arp-m-note").textContent="Enter a roof size between 300 and 20,000 sq ft.",void F("area_invalid"));ta()}),v("arp-back").addEventListener("click",function(){var a=O(h);"addr"===a&&aa(),"layers"!==a||"asphalt"===b.mat?U(Math.max(0,h-1)):U(j("mat"))}),v("arp-address").addEventListener("keydown",function(a){"Enter"===a.key&&(a.preventDefault(),v("arp-next").click())}),v("arp-start").addEventListener("click",function(){ea(),U(j("addr"));try{v("arp-address").focus({preventScroll:!0})}catch(a){}}),["focus","input"].forEach(function(a){v("arp-address").addEventListener(a,ea)}),v("arp-cta").addEventListener("click",function(){R("calc_book_click",{calc_territory:D()})}),v("arp-cta-alt").addEventListener("click",function(){R("calc_book_click",{calc_territory:"spk"===D()?"tri":"spk"})}),v("arp-unlock").addEventListener("click",function(){var a=v("arp-unlock");if(!a.disabled&&!C)if(G("name"),G("phone"),G("email"),T.name&&T.phone&&T.email){C=!0,a.disabled=!0,a.textContent="Unlocking…";var t=v("arp-g-name").value.trim(),r=Y(v("arp-g-phone").value),o=v("arp-g-email").value.trim().toLowerCase(),i=I(),s=i*l/100,p=H(),d={input_8:t,input_2:r,input_3:o,input_9:k||"(manual entry)",input_11:"Residential Roofing",input_5:e,input_6:location.href,input_7:"Calculator estimate: "+p+" | "+s.toFixed(1)+" squares | "+Math.round(i)+" sq ft | material: "+b.mat+" | layers: "+b.layers+" | territory: "+D()+" | source: "+(y?"aerial":"manual")+" | run: "+q},c=window.AbortController?new AbortController:null,u=setTimeout(function(){c&&c.abort()},1e4);g().catch(function(a){if(a&&"lead_rejected"===a.code)throw a;return new Promise(function(a){setTimeout(a,1500)}).then(g)}).then(function(){clearTimeout(u),R("calc_lead",{calc_estimate:p,calc_territory:D(),calc_source:y?"aerial":"manual"}),ra()}).catch(function(a){clearTimeout(u),F(a&&a.code||"lead_network"),v("arp-sent").innerHTML="Your estimate is below. We could not send the copy just now — call or text "+m+" and we will send it over.",ra()})}else F("gate_invalid");function g(){return fetch("/wp-json/gf/v2/forms/"+n+"/submissions",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(d),signal:c?c.signal:void 0}).then(function(a){return"opaqueredirect"===a.type||0===a.status||a.redirected?{accepted:!0}:a.text().then(function(t){var e={};try{e=JSON.parse(t)}catch(a){}if(!1===e.is_valid){var r=new Error("lead_rejected");throw r.code="lead_rejected",r}if(!a.ok){var o=new Error("lead_http");throw o.code="lead_http_"+a.status,o}return e})})}}),U(0),R("calc_view",{calc_landing_step:"intro"})}function N(a,t,e,r){return'
'+a+(r?" MOST POPULAR":"")+""+t+'
—
'}function R(a,t){try{window.dataLayer=window.dataLayer||[];var e={event:a,calc_run_id:q,calc_page:r,calc_version:"v3"};if(t)for(var o in t)e[o]=t[o];window.dataLayer.push(e)}catch(a){}}function F(a){R("calc_step_error",{step_name:O(h),error_code:a})}function O(a){return x[a].getAttribute("data-q")}function j(a){for(var t=0;t=1){try{document.activeElement&&document.activeElement.blur()}catch(a){}try{var i=x[t].querySelector('[tabindex="-1"]');i&&i.focus({preventScroll:!0})}catch(a){}}n!==w&&(w=n,R("calc_step_view",{step_name:n,step_index:t}))}function B(a){return"$"+(50*Math.round(a/50)).toLocaleString("en-US")}function W(a,t){var e=v("arp-status");e.textContent=a,e.className="arp-status"+(t?" err":"")}function I(){if(y&&isFinite(y.areaSqFt)&&y.areaSqFt>=300)return y.areaSqFt;var a=parseFloat(v("arp-sqft").value)||0;return!isFinite(a)||a<300||a>2e4?0:"foot"===v("arp-mode").value?a*b.pitch:a}function D(){if(!y)return"spk";var a=1.27*(47.6-y.lat)-119.3;return y.lng>a?"spk":"tri"}function H(){var a=I()*l/100;return"asphalt"===b.mat?B(a*i[0])+" - "+B(a*p[1]):B(a*i[0])+"+ ("+b.mat+")"}function Z(){!function(){var a=D(),t=v("arp-cta"),e=v("arp-cta-alt");t.href="spk"===a?c:u,e.href="spk"===a?u:c,e.textContent="spk"===a?"Not in Spokane? Book with our Tri-Cities team →":"Closer to Spokane? Book with our Spokane team →"}();var a=I(),t=a*l/100;v("arp-addr-echo").textContent=k||"manual entry",v("arp-squares").textContent=t.toFixed(1),v("arp-area").textContent=Math.round(a).toLocaleString("en-US");var e=v("arp-alt"),r=v("arp-tiers");"asphalt"===b.mat?(r.style.display="",e.style.display="none",v("arp-range").textContent=B(t*i[0])+" – "+B(t*p[1]),v("arp-t1").textContent=B(t*i[0])+" – "+B(t*i[1]),v("arp-t2").textContent=B(t*s[0])+" – "+B(t*s[1]),v("arp-t3").textContent=B(t*p[0])+" – "+B(t*p[1])):(r.style.display="none",e.style.display="",v("arp-range").textContent=B(t*i[0])+"+",e.textContent=("metal"===b.mat?"Standing-seam metal":"flat"===b.mat?"TPO / low-slope":"Tile and wood")+" pricing depends on the profile and details chosen. The figure above is the asphalt baseline for your roof size; we quote it exactly after a free on-site measurement."),_||(_=!0,R("calc_estimate_shown",{calc_estimate:H(),calc_territory:D(),calc_source:y?"aerial":"manual"}))}function Y(a){var t,e,r="";for(a=a||"",t=0;t="0"&&e<="9"&&(r+=e);return 11===r.length&&"1"===r.charAt(0)&&(r=r.slice(1)),r}function J(a){var t;for(t=1;t?';var o=r.querySelector(".arp-fix");o.textContent=t.fix,o.addEventListener("click",function(){v("arp-g-email").value=t.fix,G("email")})}else r.textContent=t.m||"";v("arp-unlock").disabled=!(T.name&&T.phone&&T.email)}function G(a){if("name"===a)return $("name",function(a){if(!(a=(a||"").trim()))return{s:"",m:""};if(a.length<4)return{s:"bad",m:"Please enter your first and last name."};if(!/^[a-zA-Z'’ .-]+$/.test(a))return{s:"bad",m:"Letters only, please."};var t=a.split(/[\s,]+/).filter(Boolean);if(t.length<2)return{s:"bad",m:"We need a first and last name."};for(var e=0;e-1)return{s:"bad",m:"That does not look like a real name."};if(r.length>2&&J(r))return{s:"bad",m:"That does not look like a real name."}}return{s:"ok",m:""}}(v("arp-g-name").value));if("phone"===a){var t=v("arp-g-phone"),e=Y(t.value);return e.length<=10&&document.activeElement===t&&(t.value=(r=e).length<4?r:r.length<7?"("+r.slice(0,3)+") "+r.slice(3):"("+r.slice(0,3)+") "+r.slice(3,6)+"-"+r.slice(6,10)),$("phone",function(a){var t=Y(a);if(!t)return{s:"",m:""};if(t.length<10)return{s:"",m:""};if(11===t.length&&"1"===t.charAt(0)&&(t=t.substring(1)),t.length>10)return{s:"bad",m:"That is too many digits for a US number."};var e=t.substr(0,3),r=t.substr(3,3),o=t.substr(6,4);return J(t)||"1234567890"===t||"0123456789"===t||"9876543210"===t?{s:"bad",m:"That is not a real phone number."}:/^(800|833|844|855|866|877|888|900)$/.test(e)?{s:"bad",m:"Please use a mobile or home number, not a toll-free line."}:",201,202,203,204,205,206,207,208,209,210,212,213,214,215,216,217,218,219,220,223,224,225,226,227,228,229,231,234,235,236,239,240,248,249,250,251,252,253,254,256,257,260,262,263,267,269,270,272,274,276,279,281,283,289,301,302,303,304,305,306,307,308,309,310,312,313,314,315,316,317,318,319,320,321,323,324,325,326,327,329,330,331,332,334,336,337,339,341,343,346,347,350,351,352,353,354,360,361,363,364,365,367,368,369,380,382,385,386,401,402,403,404,405,406,407,408,409,410,412,413,414,415,416,417,418,419,423,424,425,428,430,431,432,434,435,437,438,440,442,443,445,447,448,450,458,463,464,468,469,470,472,474,475,478,479,480,484,501,502,503,504,505,506,507,508,509,510,512,513,514,515,516,517,518,519,520,530,531,532,534,539,540,541,548,551,557,559,561,562,563,564,567,570,571,572,573,574,575,579,580,581,582,584,585,586,587,601,602,603,604,605,606,607,608,609,610,612,613,614,615,616,617,618,619,620,623,626,628,629,630,631,633,636,639,640,641,645,646,647,650,651,656,657,659,660,661,662,667,669,672,678,680,681,682,683,686,689,701,702,703,704,705,706,707,708,709,712,713,714,715,716,717,718,719,720,724,725,726,727,728,730,731,732,734,737,738,740,742,743,747,748,753,754,757,760,762,763,765,769,770,771,772,773,774,775,778,779,780,781,782,785,786,801,802,803,804,805,806,807,808,810,812,813,814,815,816,817,818,819,820,821,825,826,828,830,831,832,835,838,839,840,843,845,847,848,850,854,856,857,858,859,860,862,863,864,865,867,870,872,873,878,879,901,902,903,904,905,906,907,908,909,910,912,913,914,915,916,917,918,919,920,925,928,929,930,931,934,936,937,938,940,941,942,943,945,947,948,949,951,952,954,956,959,970,971,972,973,975,978,979,980,983,984,985,986,989,".indexOf(","+e+",")>-1?r.charAt(0)<"2"||"555"===r||"1"===r.charAt(1)&&"1"===r.charAt(2)?{s:"bad",m:"That exchange is not a working number."}:"0000"===o||J(r+o)?{s:"bad",m:"That is not a real phone number."}:(function(p){var O=["5092369583","5099877818","5092365880"];if(O.indexOf(p)>-1)return!0;var L=document.querySelectorAll('a[href^="tel:"]'),k,d;for(k=0;k-1)return{s:"bad",m:"No spaces in an email address."};var t=a.indexOf("@");if(t<1)return{s:"",m:""};if(a.indexOf("@",t+1)>-1)return{s:"bad",m:"That address has two @ signs."};var e=a.substring(t+1);return e.indexOf(".")<1?{s:"",m:""}:/^[a-z0-9-]+(\.[a-z0-9-]+)*\.[a-z]{2,}$/.test(e)?L.indexOf(e)>-1?{s:"bad",m:"A temporary inbox will not receive your estimate."}:A[e]?{s:"bad",m:"",fix:a.substring(0,t+1)+A[e]}:{s:"ok",m:""}:{s:"bad",m:"That domain does not look right."}}(v("arp-g-email").value))}function Q(){return!!(window.google&&google.maps&&google.maps.importLibrary)}function V(a,t,e){return new Promise(function(r,o){var n=setTimeout(function(){var a=new Error(e);a.code=e,o(a)},t);a.then(function(a){clearTimeout(n),r(a)},function(a){clearTimeout(n),o(a)})})}function X(a,e,r,o){var n="maps";return V((window.__arpMaps||(window.__arpMaps=new Promise(function(a,e){if(Q())return a();var r=document.createElement("script");r.src="https://maps.googleapis.com/maps/api/js?key="+t+"&v=weekly&loading=async",r.async=!0,r.onload=function(){var t=0,r=setInterval(function(){Q()?(clearInterval(r),a()):++t>100&&(clearInterval(r),e(new Error("maps_timeout")))},100)},r.onerror=function(){e(new Error("maps_load_error"))},document.head.appendChild(r)}).then(function(){return google.maps.importLibrary("geocoding")}).catch(function(a){throw window.__arpMaps=null,a})),window.__arpMaps),d,"maps_timeout").then(function(){return R("calc_address_status",{status:"maps_ready",elapsed_ms:Math.round(performance.now()-r),attempt:o}),n="geocode",V((new google.maps.Geocoder).geocode({address:a,componentRestrictions:{country:"US"}}),d,"geocode_timeout")}).catch(function(a){var t=a?a.code:"";if("geocode"===n){var e="ZERO_RESULTS"===t?"geocode_zero":"geocode_timeout"===t?"geocode_timeout":"geocode_error",r=new Error(e);throw r.code=e,r}var o=t||a.message||"maps_error",i=new Error(o);throw i.code=o,i}).then(function(a){if(!a||!a.results||!a.results.length){var i=new Error("geocode_zero");throw i.code="geocode_zero",i}R("calc_address_status",{status:"geocoded",elapsed_ms:Math.round(performance.now()-r),attempt:o});var s,p,l=a.results[0],c=l.geometry.location;return n="solar",V((s="https://solar.googleapis.com/v1/buildingInsights:findClosest?location.latitude="+c.lat()+"&location.longitude="+c.lng()+"&requiredQuality=BASE&key="+t,p=e.signal,fetch(s,{signal:p}).then(function(a){return a.text().then(function(t){var e={};try{e=JSON.parse(t)}catch(a){}if(!a.ok){var r=new Error("solar_http_"+a.status);throw r.code=404===a.status?"no_solar_data":403===a.status||429===a.status?"solar_denied":"solar_http",r}return e})})),d,"solar_timeout").then(function(a){var t=a.solarPotential||{},e=t.wholeRoofStats||{};if(!e.areaMeters2){var r=new Error("no_solar_data");throw r.code="no_solar_data",r}var o=a.center?{lat:a.center.latitude,lng:a.center.longitude}:{lat:c.lat(),lng:c.lng()},n=t.roofSegmentStats||[],i=0,s=0;return n.forEach(function(a){var t=(a.stats?a.stats.areaMeters2:0)||0;i+=t*(a.pitchDegrees||0),s+=t}),{lat:o.lat,lng:o.lng,address:l.formatted_address,areaSqFt:10.7639*e.areaMeters2,pitchDeg:s?i/s:0,faces:n.length}})})}function K(e){y=e,k=e.address,function(a){var e=v("arp-snap");if(t&&isFinite(a.lat)&&isFinite(a.lng)){var r="https://maps.googleapis.com/maps/api/staticmap?maptype=satellite&scale=2&key="+t+"¢er="+a.lat+","+a.lng+"&zoom=20&size=640x260";e.style.backgroundImage="url("+r+")",e.className="arp-snap on"}else e.className="arp-snap"}(e),v("arp-stage").classList.add("sat"),v("arp-manual").style.display="none",v("arp-m-area").textContent=Math.round(e.areaSqFt).toLocaleString("en-US");var r,o,n=e.pitchDeg?12*Math.tan(e.pitchDeg*Math.PI/180):5;v("arp-m-pitch").textContent=e.pitchDeg?Math.round(n)+"/12":"—",v("arp-m-faces").textContent=e.faces||"—",v("arp-m-note").textContent=e.address,v("arp-pitch-sub").textContent="We pre-selected this from the aerial measurement.",v("arp-measured").style.display="",v("arp-measured-t").textContent="Aerial measurement complete",a.querySelector('.arp-q[data-q="measure"] .arp-title').textContent="We found your roof",r="pitch",o=n<=3.5?1.05:n<=6.5?1.12:n<=9.5?1.25:1.4,a.querySelector('.arp-opts[data-key="'+r+'"]').querySelectorAll(".arp-opt").forEach(function(a){a.classList.toggle("on",a.dataset.v===String(o))}),b[r]="pitch"===r?parseFloat(o):String(o)}function aa(){if(P){try{P.ctrl.abort()}catch(a){}P=null}v("arp-next").disabled=!1}function ta(){var t=v("arp-address").value.trim();if(!t)return W("Please enter your street address to measure your roof.",!0),void F("address_required");aa();var e=++z,r=window.AbortController?new AbortController:{signal:void 0,abort:function(){}},o=performance.now();P={att:e,ctrl:r},v("arp-next").disabled=!0,W("Locating your roof from aerial imagery…"),R("calc_address_status",{status:"started",elapsed_ms:0,attempt:e}),X(t,r,o,e).then(function(a){P&&P.att===e&&"addr"===O(h)&&(P=null,v("arp-next").disabled=!1,W(""),R("calc_address_status",{status:"success",elapsed_ms:Math.round(performance.now()-o),attempt:e}),K(a),U(j("measure")))}).catch(function(t){if(P&&P.att===e){P=null,v("arp-next").disabled=!1;var r=(t?t.code:"")||"unknown";if(R("calc_address_status",{status:"failed",error_code:r,elapsed_ms:Math.round(performance.now()-o),attempt:e}),"addr"===O(h))!function(t){y=null;var e=v("arp-address").value.trim();k=e?e+" (size entered manually)":"",v("arp-manual").style.display="",v("arp-m-area").textContent="—",v("arp-m-pitch").textContent="—",v("arp-m-faces").textContent="—",v("arp-m-note").textContent=t||"Enter your roof size below. An approximate number is fine.",v("arp-pitch-sub").textContent="Not sure? Medium is right for most homes.",v("arp-measured").style.display="none",v("arp-snap").className="arp-snap",v("arp-stage").classList.remove("sat"),a.querySelector('.arp-q[data-q="measure"] .arp-title').textContent="Tell us about your roof"}(("geocode_zero"===r?"We could not find that address.":"no_solar_data"===r?"No aerial roof data is available for that address yet.":"The aerial lookup is not responding right now.")+" Enter an approximate roof size below and your estimate stays within about 10 percent."),U(j("measure"))}})}function ea(){S||(S=!0,R("calc_start"))}function ra(){v("arp-systems").classList.remove("locked"),v("arp-galt").classList.remove("locked");var a=v("arp-lock");a.textContent="Unlocked",a.className="arp-lock open",setTimeout(function(){U(j("result"))},750)}}();