/* DT v2.0.144.4 */ if (document.getElementById){try{if (typeof(_dt) == 'undefined') { var _dt = { debug: false, data: null, frames: [], handlers: {}, trace : function(msg, data) { }, loadScript : function(url, callback) { var scr = document.createElement('SCRIPT'); scr.type = 'text/javascript'; scr.setAttribute('defer','true'); scr.setAttribute('async','true'); if (callback) { if (scr.readyState) { scr.onreadystatechange = function() { if (scr.readyState == 'loaded' || scr.readyState == 'complete') { scr.onreadystatechange = null; callback(); } }; } else { scr.onload = function() { callback(); }; } } scr.src = url; var s0 = document.getElementsByTagName('script')[0]; s0.parentNode.insertBefore(scr, s0); if (this.debug) console.log('Invoking Script: '+url); }, onPageReady : function(handler) { if (document.readyState === 'complete') setTimeout(handler, 1); else if (document.addEventListener) { document.addEventListener('DOMContentLoaded', handler, false); window.addEventListener('load', handler, false); } else if (document.attachEvent) { document.attachEvent('onreadystatechange', handler); window.attachEvent('onload', handler); } }, detachHandler : function(handler) { if (document.addEventListener) { document.removeEventListener('DOMContentLoaded', handler, false); window.removeEventListener('load', handler, false); } else { document.detachEvent('onreadystatechange', handler); window.detachEvent('onload', handler); } }, attachUnloadHandler : function(handler) { this.bindEvent(window, "beforeunload", handler); if (!window.addEventListener) window.attachEvent("onunload", handler); }, parmVal : function(parm){ try { var hashes = [this.data, this.parentData]; for (var i=0; i < hashes.length; i++){ var hash = hashes[i]; if (hash){ if (typeof(hash.parms) != "undefined" && typeof(hash.parms[parm]) != "undefined") return hash.parms[parm]; else if (typeof(hash.event) != "undefined" && typeof(hash.event.parms) != "undefined" && typeof(hash.event.parms[parm]) != "undefined") return hash.event.parms[parm]; } } if (top != window.self && typeof(top._dt) != "undefined" && top._dt.data && typeof(top._dt.data.parms) != "undefined" && typeof(top._dt.data.parms[parm]) != "undefined") return top._dt.data.parms[parm]; }catch(e){this.trace("Exception:_dt.parmVal "+parm);} return null; }, propVal : function(prop){ try { if (this.data && typeof(this.data[prop]) != "undefined") return this.data[prop]; else if (typeof(top._dt) != "undefined" && top._dt.data && typeof(top._dt.data[prop]) != "undefined") return top._dt.data[prop]; }catch(e){this.trace("Exception:_dt.propVal "+prop);} return this.parmVal(prop); }, onDTLoaded : function(callback){ this.trace("Base onDTLoaded"); this.notifyFrames(); if (callback) callback(this.data); }, notifyFrames : function(){ if (this.data && window.postMessage){ if (this.frames.length){ var payload = JSON.stringify({action:"handleParentData", dtData: this.data}); for (var i=0; i < this.frames.length; i++) this.frames[i].postMessage(payload, "*"); } else{ var payload = JSON.stringify({action:"register"}); for (var i=0; i < window.frames.length; i++) window.frames[i].postMessage(payload, "*"); } } }, firePixel : function(url, callback){ if (url){ this.trace("_dt.firePixel "+url); var img = new Image(); if (callback){ img.onload = function(){callback(null);}; img.onerror = function(){callback("Failed to fire "+this.src);}; } img.src = url; } else if (callback) callback('firePixel: No URL specified.'); }, swapQSParm: function(url, parm, val){ var re = new RegExp("([?|&])" + parm + "=.*?(&|$)","i"); if (typeof(val) == "undefined") val = ""; if (url.match(re)) return url.replace(re,'$1' + parm + "=" + encodeURIComponent(val) + '$2'); else return url + '&' + parm + "=" + encodeURIComponent(val); }, parseQueryString: function(url){ var qsParms = {}; url.replace(new RegExp("([^?=&]+)(=([^&]*))", "g"), function($0, $1, $2, $3) { qsParms[$1] = $3; } ); return qsParms; }, toQueryString: function(obj){ var qp = []; if (obj){ for (var key in obj){ if (typeof(obj[key]) != "undefined") qp.push(key+"="+encodeURIComponent(obj[key])); } } return qp.join('&'); }, setCookie: function(name, value, expires){ if (name){ var when = new Date(); when.setTime(when.getTime() + 1000 * (parseInt(expires) || 0)); var domain = location.hostname.split('.').reverse().splice(0,2).reverse().join('.'); document.cookie = name + '=' + value + '; expires=' + when.toGMTString() + '; path=/; domain=.' + domain; } }, dtvisVal: function (){ var result = document.cookie.match('(^|;)\\s*dtvis\\s*=\\s*([^;]+)'); return result ? result.pop() : ''; }, bindEvent : function(element, eventName, handler){ if (element.addEventListener) element.addEventListener(eventName, handler, false); else if (element.attachEvent) window.attachEvent('on'+eventName, handler); }, handleMessage: function(e){ _dt.trace("_dt.handleMessage", e.data); try{ if (e.data && typeof(e.data) == 'string'){ var data = JSON.parse(e.data); var action = data.action; if (action && this.handlers[action]){ for (var i=0; i < this.handlers[action].length; i++){ var handler = this.handlers[action][i]; if (handler && handler._once) this.handlers[action].splice(i--, 1); handler(e, data); } } } }catch(e){this.trace("Exception:_dt.handleMessage ",e);} }, on: function(msg, handler){ if (msg && handler){ if (!this.handlers[msg]) this.handlers[msg] = []; this.handlers[msg].push(handler); } }, once: function(msg, handler){ if (msg && handler){ handler._once = 1; this.on(msg, handler); } }, onRegisterFrame: function(e, msgData){ if (this.frames.indexOf(e.source) === -1) this.frames.push(e.source); if (this.data){ e.source.postMessage(JSON.stringify({action:"handleParentData", dtData: this.data}), "*"); } }, preflightComplete: function(finalURL){ this.loadScript(finalURL); }, getUserData: function(callback){ let userData = this.propVal('profile'); if (callback) callback(_dt.error || null, userData); _dt.trace("getUserData",userData); }, deleteUserData: function(callback){ let url = this.userPixel('deletedata'); this.firePixel(url, function(response){ _dt.trace("deleteUserData complete",response); if (response == null && _dt.data) _dt.data.profile = null; if (callback) callback(response?'deleteUserData request failed':null, null); }); }, doNotSell: function(callback){ let url = this.userPixel('donotsell'); this.firePixel(url, function(err){ _dt.trace("doNotSell complete",err); if (!err){ try{ let dnspixels = _dt.propVal('dnspixels'); if (dnspixels && dnspixels.length){ for (let i=0; i < dnspixels.length; i++) (new Image()).src = dnspixels[i]; } } catch(e){} } if (callback) callback(err?'doNotSell request failed':null, null); }); }, userPixel: function(endPoint){ let sitetype = this.parmVal('sitetype'); let webid = this.parmVal('webid'); let url = this.baseURL + '/dt/user/'+endPoint+'?cs:pa=dtuser'; if (sitetype) url += '&sitetype='+sitetype; if (webid) url += '&webid='+webid; return url + "&_"+ Date.now(); }, getJSON: function(url, callback){ var xhr = new XMLHttpRequest(); xhr.onreadystatechange = function() { if (xhr.readyState == 4 && xhr.status == 200) { try { var data = JSON.parse(xhr.responseText); } catch(err) { _dt.trace(err.message + " in " + xhr.responseText); return; } if (callback) callback(data); } }; xhr.open("GET", url, true); xhr.send(); } }; _dt.bindEvent(window, "message", _dt.handleMessage.bind(_dt)); _dt.on('registerFrame', _dt.onRegisterFrame.bind(_dt)); } _dt.pageView = function(page, parms, callback){ parms = parms || {}; parms['cs:pg'] = page || 'unspecified'; this.recordEvent('pageview', parms, callback); }; _dt.click = function(label, parms, callback){ parms = parms || {}; parms['cs:plb'] = label || 'unspecified'; this.recordEvent('click', parms, callback); }; _dt.recordEvent = function(eventName, parms, callback){ if (this.data && typeof(this.data.event) != "undefined" && typeof(this.data.event.parms) != "undefined"){ var evtParms = Object.assign({},this.data.event.parms); evtParms['cs:ev'] = this.genRandomString(44); if (parms){ for (var key in parms){ if (typeof(parms[key]) != "undefined") evtParms[key] = parms[key]; } } if (!parms['cs:ply']) evtParms['cs:ply'] = evtParms['cs:pg']; if (!parms['cs:plb']) evtParms['cs:plb'] = evtParms['cs:pg']; evtParms['cs:checksum'] = 1; var url = this.data.event.baseURI + "?dt=" + eventName + '&' + this.toQueryString(evtParms); url = url.replace(/\%3A/g, ':').replace(/\%7C/g, '|'); this.firePixel(url, callback); } else if (callback) callback('No event data available'); }; _dt.genRandomString = function(length, chunkSize){ chunkSize = chunkSize || 4; var count = Math.ceil(length/chunkSize); var str = ''; for (var i=1; i <= count; i++) str += (((1 + Math.random()) * 0x10000) | 0).toString(16).substring(1); return str.substr(0,length); }; if (typeof(_dt.initLead) == 'undefined') { _dt.leads = { em:{ id_regex:/mail/i, val:"", submitted:false, validate: function(email){ var re = /\S+@\S+\.\S+/; return re.test(this.cleanVal(email)); }, cleanVal: function(val){ val = (typeof(val) == "string") ? val : this.val; return val.trim().toLowerCase(); } }, ph:{ id_regex:/(phone|mobile)/i, val:"", submitted:false, countryCallingCode: "1", regex: /^\+1\d{10}$/, validate: function(phone){ return this.regex.test(this.cleanVal(phone)); }, cleanVal: function(val){ val = (typeof(val) == "string") ? val : this.val; var re = new RegExp("^(\\+?)" + this.countryCallingCode); val = val.replace(re, ""); val = val.replace(/\D/g, "").trim(); val = val.replace(/^0+/, ""); val = "+" + this.countryCallingCode + val; return val; } } }; _dt.initLead = function(dtHost, passThruParms, phoneConstraints){ if (!this.parmVal("sitetype") || !this.parmVal("webid")){ _dt.trace("initLead: required parameters sitetype and/or webid are missing. Lead detection is disabled."); return false; } if (!phoneConstraints) phoneConstraints = {countryCallingCode:"1", natlPhoneDigits:"10", regex:"/^\\+1\\d{10}$/"}; if (typeof(phoneConstraints.countryCallingCode) != "undefined") this.leads.ph.countryCallingCode = phoneConstraints.countryCallingCode; if (typeof(phoneConstraints.regex) != "undefined") this.leads.ph.regex = new RegExp(phoneConstraints.regex.replace(/^\/|\/$/g, '')); this.constructBaseLeadURL(dtHost, passThruParms); return true; }; _dt.constructBaseLeadURL = function(dtHost, passThruParms){ var passThrus = typeof(passThruParms) == "string" ? passThruParms.split(',') : []; var parms = {}; if (passThrus && passThrus.length > 0){ for (var i=0; i < passThrus.length; i++){ var key = passThrus[i]; var val = this.parmVal(key); if (val) parms[key] = val; } } if (this.data && typeof(this.data.glean) != "undefined" && this.data.glean && typeof(this.data.glean['siteId']) != "undefined") parms['cs:si'] = this.data.glean['siteId'][0]; if (this.debug) parms.debug = this.debug; this.leadURL = "https:" + "/"+"/" + dtHost + "/dt.gif?lead=1&glean=0&" + this.toQueryString(parms); }; _dt.submitLeads = function(trigger, parms, callback){ var url = this.constructLeadURL(trigger); if (url){ if (parms){ for (var p in parms) url = this.swapQSParm(url, p, parms[p]); } _dt.trace("Submitting lead(s) "+url); this.firePixel(url, callback); for (var l in this.leads) if (this.leads[l].val) this.leads[l].submitted = true; } else if (callback) callback('No lead to submit.'); }; _dt.submitLead = function(lead, callback){ var saveLeads = this.leads; var parms = null; if (lead){ parms = lead.parms || null; for (var key in this.leads){ this.leads[key].val = ""; this.leads[key].submitted = false; if (typeof(lead[key]) != "undefined"){ if (this.leads[key].validate(lead[key])){ this.leads[key].val = lead[key]; } } } } this.submitLeads('api', parms, callback); this.leads = saveLeads; }; _dt.constructLeadURL = function(trigger){ var url = ""; if (this.leadURL){ var parms = []; for (var l in this.leads){ var lead = this.leads[l]; if (lead.val && !lead.submitted){ parms.push(l+"="+this.SHA1(lead.cleanVal())); } } if (parms.length || trigger == 'api'){ if (trigger) parms.push("trigger="+trigger); parms.push("cb="+new Date().getTime()); url = this.leadURL + "&" + parms.join("&"); if (this.parentData && typeof(this.parentData.event) !== 'undefined'){ url = this.swapQSParm(url, 'cs:ssi', this.parentData.event.parms['cs:ssi']); url = this.swapQSParm(url, 'cs:vi', this.parentData.event.parms['cs:vi']); } } } else this.trace("ERR: constructLeadURL this.leadURL not yet initialized"); return url; }; _dt.SHA1 = function(r){ function o(r,o){var e=r<>>32-o;return e}function e(r){var o,e,a="";for(o=7;o>=0;o--)e=r>>>4*o&15,a+=e.toString(16);return a}function a(r){r=r.replace(/\r\n/g,"\n");for(var o="",e=0;ea?o+=String.fromCharCode(a):a>127&&2048>a?(o+=String.fromCharCode(a>>6|192),o+=String.fromCharCode(63&a|128)):(o+=String.fromCharCode(a>>12|224),o+=String.fromCharCode(a>>6&63|128),o+=String.fromCharCode(63&a|128))}return o}var t,h,n,C,c,f,d,A,u,g=new Array(80),i=1732584193,s=4023233417,S=2562383102,v=271733878,m=3285377520;r=a(r);var p=r.length,l=new Array;for(h=0;p-3>h;h+=4)n=r.charCodeAt(h)<<24|r.charCodeAt(h+1)<<16|r.charCodeAt(h+2)<<8|r.charCodeAt(h+3),l.push(n);switch(p%4){case 0:h=2147483648;break;case 1:h=r.charCodeAt(p-1)<<24|8388608;break;case 2:h=r.charCodeAt(p-2)<<24|r.charCodeAt(p-1)<<16|32768;break;case 3:h=r.charCodeAt(p-3)<<24|r.charCodeAt(p-2)<<16|r.charCodeAt(p-1)<<8|128}for(l.push(h);l.length%16!=14;)l.push(0);for(l.push(p>>>29),l.push(p<<3&4294967295),t=0;th;h++)g[h]=l[t+h];for(h=16;79>=h;h++)g[h]=o(g[h-3]^g[h-8]^g[h-14]^g[h-16],1);for(C=i,c=s,f=S,d=v,A=m,h=0;19>=h;h++)u=o(C,5)+(c&f|~c&d)+A+g[h]+1518500249&4294967295,A=d,d=f,f=o(c,30),c=C,C=u;for(h=20;39>=h;h++)u=o(C,5)+(c^f^d)+A+g[h]+1859775393&4294967295,A=d,d=f,f=o(c,30),c=C,C=u;for(h=40;59>=h;h++)u=o(C,5)+(c&f|c&d|f&d)+A+g[h]+2400959708&4294967295,A=d,d=f,f=o(c,30),c=C,C=u;for(h=60;79>=h;h++)u=o(C,5)+(c^f^d)+A+g[h]+3395469782&4294967295,A=d,d=f,f=o(c,30),c=C,C=u;i=i+C&4294967295,s=s+c&4294967295,S=S+f&4294967295,v=v+d&4294967295,m=m+A&4294967295}var u=e(i)+e(s)+e(S)+e(v)+e(m);return u.toLowerCase(); }; }_dt.onPageReady(function(){_dt.initLead("dt.cobaltgroup.com","sitetype,uid,uidindex,webid,vin,cs:pg,cs:si,cs:ssi,cs:vi,cblttags",{"countryCallingCode":"1","natlPhoneDigits":"10","regex":"^\\+1\\d{10}$"});});_dt.data = {"parms":{"sitetype":"dealer","cblttags":"1","detectleads":"0","cs:pg":"/about-us/","cs:vendor":"dealerinspire","uidindex":"ws","uid":"x_6455959371839cf7dbe8502cdc54a576_1698746777","referrer":"https://www.woodhousegm.com/about-us/","pfc":"1","pgreferrer":"https://www.woodhousegm.com/about-us/?__cf_chl_tk=4EbivYMcuaJI5ZP87cqHmzTzDvyPzfbPopBWbUGnL4A-1698746768-0-gaNycGzNCiU","webid":"gmps-woodhouse"},"glean":{"webId":["gmps-woodhouse"],"siteId":["afb278d8baba10048eea10145edef7ee"],"contentClass":["Dealer Info"],"sector":"auto"},"profile":{"type":"t3","associates":["gm-t1-buick","gmlslp-buick","gm-t1-chevrolet","gmlslp-chevrolet"],"adsegments":["t3mchevrolet","t3mbg_buick_ner_opt_in","t3mchevy_oem_scr_bolt_aor","t3mgm_chevy_fleet_svc","t3mchevy_fleet_service_nwc_aor"],"affinity":80,"sessionStartTime":1698746777},"dtuid":"1698746777122076036","ctn":null,"event":{"baseURI":"https://traffic.prod.cobaltgroup.com/websites.gif","parms":{"cs:ev":"c1ad4fa13b83e8a00679eb522d65e1c062945fd3f4c7","cs:ssi":"16987467771220760361698746777","cs:vi":"x_6455959371839cf7dbe8502cdc54a576_1698746777","cs:requri":"https://www.woodhousegm.com/about-us/","cs:pg":"/about-us/","cs:ip":"91.90.42.154","cs:s":"gmps-woodhouse","cs:si":"afb278d8baba10048eea10145edef7ee","cs:gvid":"1698746777122076036","cs:vendor":"dealerinspire","cs:ply":"/about-us/","cs:plb":"/about-us/"}}};_dt.debug = 0;_dt.baseURL = "https://dt.cobaltgroup.com";_dt.swapCTN = function(){};let remoteURL = "https://dt.cobaltgroup.com/dt/ckCookies.js?dtuid=1698746777122076036";_dt.loadScript(remoteURL);_dt.onCkDone = function(ok){if (ok){ (new Image()).src="https://dt.admission.net/dt.gif?sync=1&dtuid=1698746777122076036"; (new Image()).src="https://ad.doubleclick.net/activity;src=1139716;dcnet=3880;boom=40149;sz=1x1;ord=967918007?"; (new Image()).src="https://segment-pixel.invitemedia.com/pixel?pixelID=67458&partnerID=198&key=segment"; (new Image()).src="https://dpm.demdex.net/ibs:dpid=313172&dpuuid=1698746777122076036&redir=https%3A%2F%2Fdt.cobaltgroup.com%2Fcookiejar%2F1.0%2Fcorrelate%3Fformat%3Dgif%26logonly%3D1%26uidindex%3Daam%26uid%3D${DD_UUID}"; (new Image()).src="https://pixel.rubiconproject.com/tap.php?v=580120&nid=5494&put=1698746777122076036"; (new Image()).src="https://us-u.openx.net/w/1.0/sd?id=540213371&val=1698746777122076036"; (new Image()).src="https://cm.g.doubleclick.net/pixel?google_nid=cobalt_group_adp&google_hm=MTY5ODc0Njc3NzEyMjA3NjAzNg"; (new Image()).src="https://cm.g.doubleclick.net/pixel?google_nid=admission&google_hm=MTY5ODc0Njc3NzEyMjA3NjAzNg"; };}; (new Image()).src="https://s.amazon-adsystem.com/iu3?d=3pecm&ad=1509026001"; (new Image()).src="https://aa.agkn.com/adscores/g.pixel?sid=9212297528&puid=1698746777122076036"; (new Image()).src="https://px.marchex.io/msid.gif?spid=cdk&uid=1698746777122076036"; (new Image()).src="https://idsync.rlcdn.com/398676.gif?partner_uid=1698746777122076036"; (new Image()).src="https://s.ixiaa.com/a.gif?partner=1183949&client=1183949&campaign=1183989&source=gmps-woodhouse"; (new Image()).src="https://d.turn.com/r/dd/id/L21rdC84MTYvY2lkLzI4NTkwODExL3QvMi9jYXQvMzE2MTg0MTQ"; (new Image()).src="https://traffic.prod.cobaltgroup.com/websites.gif?dt=1&cs:ev=6add844256114427833f23a735bb97de09994dd3918f&cs:ssi=16987467771220760361698746777&cs:vi=x_6455959371839cf7dbe8502cdc54a576_1698746777&cs:requri=https:%2F%2Fwww.woodhousegm.com%2Fabout-us%2F&cs:pg=%2Fabout-us%2F&cs:ip=91.90.42.154&cs:s=gmps-woodhouse&cs:si=afb278d8baba10048eea10145edef7ee&cs:gvid=1698746777122076036&cs:vendor=dealerinspire&cs:ply=%2Fabout-us%2F&cs:plb=%2Fabout-us%2F&cs:checksum=1"; if (typeof(_dt.commitsignals) == 'undefined'){_dt.commitsignals = function(){let src = "https://dt.cobaltgroup.com/cookiejar/1.0/commitsignals?format=gif&uidindex=ws&uid=x_6455959371839cf7dbe8502cdc54a576_1698746777&owner=gmps-woodhouse&debug=0";(new Image()).src = src;_dt.trace("Fired commitsignals:"+src);};_dt.attachUnloadHandler(function _dtCommitSignals() {_dt.commitsignals();_dt.detachHandler(_dtCommitSignals);});}_dt.setCookie('dtvis','x_6455959371839cf7dbe8502cdc54a576_1698746777',63072000);_dt.onDTLoaded();gDisplayTracker = {};}catch(e){}}