1// ÐниÑиализаÑÐ¸Ñ Ð±Ð¸Ð±Ð»Ð¸Ð¾Ñеки 2BX.ready(function() { 3 4 BX.namespace("MikoCallTracking"); 5 6 MikoCallTracking={ 7 8 debugMode: false, 9 poolTimeout: '', 10 poolStarted: false, 11 replaceClassName: '', 12 defaultNumber: '', 13 resetToDefaultTimeout: '', 14 mainDomain: '', 15 apiUrl: '', 16 previousVisitorId: '', 17 currentVisitorId: '', 18 lastGoalLinkedid: '', 19 20 // ÐнÑоÑмаÑÐ¸Ñ Ð¾ поÑеÑиÑеле 21 visitorData: function(){ 22 23 // ÐолÑÑаем иденÑиÑикаÑÐ¾Ñ ÐºÐ»Ð¸ÐµÐ½Ñа Google (кÑки _ga Ð¼Ð¾Ð¶ÐµÑ Ð½Ðµ бÑÑÑ, еÑли Google-Ñег ÑбÑан) 24 var gaCookie = BX.getCookie('_ga') || ''; 25 var match = gaCookie.match(/(\d+\.\d+)$/); 26 var gacid = (match) ? match[1] : ''; 27 28 var yacid = BX.getCookie('_ym_uid'); 29 var lastVisitor =''; 30 if (parseInt(MikoCallTracking.previousVisitorId)>0 31 && MikoCallTracking.previousVisitorId!=MikoCallTracking.currentVisitorId){ 32 lastVisitor = MikoCallTracking.previousVisitorId; 33 } 34 35 var result={ 36 TRAFFIC_TYPE: sbjs.get.current.typ, // Ñип ÑÑаÑика // возможнÑе знаÑениÑ: `utm`, `organic`, `referral`, `typein` 37 UTM_SOURCE: sbjs.get.current.src, // иÑÑоÑник (utm_source) 38 UTM_MEDIUM: sbjs.get.current.mdm, // канал (utm_medium) 39 UTM_CAMPAIGN: sbjs.get.current.cmp, // ÐºÐ°Ð¼Ð¿Ð°Ð½Ð¸Ñ (utm_campaign) 40 UTM_CONTENT: sbjs.get.current.cnt, // конÑÐµÐ½Ñ (utm_content) 41 UTM_TERM: sbjs.get.current.trm, // клÑÑевое Ñлово (utm_term) 42 SOURCE: sbjs.get.current_add.ep, // ÑоÑка Ð²Ñ Ð¾Ð´Ð° 43 REFERRER: sbjs.get.current_add.rf, // ÑеÑеÑÐµÑ 44 FIRST_SOURCE: sbjs.get.first_add.ep, // пеÑÐ²Ð°Ñ ÑоÑка Ð²Ñ Ð¾Ð´Ð° 45 FIRST_REFERRER: sbjs.get.first_add.rf, // пеÑÐ²Ð°Ñ ÑоÑка Ð²Ñ Ð¾Ð´Ð° 46 FIRST_VISIT: sbjs.get.first_add.fd, // даÑа пеÑвого поÑеÑÐµÐ½Ð¸Ñ 47 GOOGLE_CID: gacid, 48 YANDEX_CID: yacid, 49 HOST: window.location.hostname, 50 PREVIOUS_VISITOR_ID: lastVisitor, 51 52 } 53 return result; 54 }, 55 56 // ÐниÑиализаÑÐ¸Ñ ÐºÐ¾Ð»Ð»ÑÑекинга 57 init: function (params){ 58 59 MikoCallTracking.debugMode=params.debugMode; 60 MikoCallTracking.poolTimeout=params.poolTimeout; 61 MikoCallTracking.replaceClassName=params.replaceClassName; 62 MikoCallTracking.resetToDefaultTimeout=params.resetToDefaultTimeout; 63 MikoCallTracking.mainDomain=params.mainDomain; 64 MikoCallTracking.apiUrl=params.apiUrl; 65 66 MikoCallTracking.previousVisitorId = BX.getCookie('_miko_visitor_id'); 67 68 // ÐапÑÑÑим библиоÑÐµÐºÑ Ð¾ÑÑÐ»ÐµÐ¶Ð¸Ð²Ð°Ð½Ð¸Ñ Ð¿ÐµÑÐµÑ Ð¾Ð´Ð¾Ð² поÑеÑиÑелей 69 var sbjs_param={}; 70 sbjs_param.callback = MikoCallTracking.RegisterNewVisitor; 71 sbjs_param.domain = MikoCallTracking.mainDomain; 72 sbjs_param.referrals= [ 73 { 74 host: 't.co', // ÐÑо Ñ Ð¾ÑÑ Twitter'а из `http referer` 75 medium: 'social', // ÐÑо наÑÑÑаиваемÑй `utm_medium`, еÑли не ÑказаÑÑ - бÑÐ´ÐµÑ `referral` 76 display: 'twitter.com' // Так оно ÑÐ¾Ñ ÑаниÑÑÑ Ð² кÑÐºÑ 77 }, 78 { 79 host: 'plus.url.google.com', 80 medium: 'social', 81 display: 'plus.google.com' 82 }, 83 { 84 host: 'facebook.com', 85 medium: 'social', 86 display: 'facebook.com' 87 } 88 ]; 89 sbjs.init(sbjs_param); 90 91 // ÐÑвободим Ð½Ð¾Ð¼ÐµÑ Ð¿Ñи закÑÑÑии ÑÑÑаниÑÑ 92 // 93 $(window).bind("beforeunload", function() { 94 BX.ajax.post( 95 MikoCallTracking.apiUrl+'?action=freenumber', 96 {'userData': 97 { 98 'visitorId': MikoCallTracking.currentVisitorId 99 } 100 } 101 ); 102 }); 103 104 }, 105 106 // ÐаменÑÐµÑ Ð²Ñе номеÑа на ÑÑÑаниÑе на пеÑеданнÑй в паÑамеÑÑ 107 // newNum Ð½Ð¾Ð¼ÐµÑ Ð² ÑоÑмаÑе подÑÑановки 108 replaceNumbers: function (newNum) { 109 var nodes = BX.findChildrenByClassName(BX(document.body), MikoCallTracking.replaceClassName);
110 nodes.forEach(function(element){ 111 if (MikoCallTracking.defaultNumber.length==0 ) { 112 MikoCallTracking.defaultNumber = element.text; 113 if (MikoCallTracking.debugMode) console.log("ÐÐÐÐ: ÐоллÑÑекинг","ÐÑÑ Ð¾Ð´Ð½Ñй пеÑед подменой", MikoCallTracking.defaultNumber); 114 } 115 BX.adjust(element, 116 { 117 "text": newNum, 118 "props":{ "href":"tel:"+newNum} 119 }) 120 }) 121 }, 122 123 124 RegisterNewVisitor: function(sb){ 125 126 var visitorData = MikoCallTracking.visitorData(); 127 128 BX.ajax.post( 129 MikoCallTracking.apiUrl+'?action=registerVisitor', 130 { 131 'userData': visitorData, 132 }, 133 function (response) { // полÑÑаем id поÑеÑиÑелÑ, и ÑÐ¾Ñ ÑанÑем в кÑÐºÑ Ð½Ð° пол года 134 135 if (MikoCallTracking.debugMode) console.log('ÐÐÐÐ: ÐоллÑÑекинг:','ÐÑÐ²ÐµÑ ÑеÑвеÑа на ÑегиÑÑÑаÑÐ¸Ñ Ð¿Ð¾ÑеÑиÑелÑ',response); 136 137 if (/{*}/.test(response)) { 138 var result = JSON.parse(response); 139 140 if (result.visitorId) { 141 142 MikoCallTracking.currentVisitorId= result.visitorId; 143 144 // ÐÑовеÑим еÑÑÑ Ð»Ð¸ на ÑÑÑаниÑе ÑелеÑÐ¾Ð½Ñ Ð´Ð»Ñ Ð¿Ð¾Ð´Ð¼ÐµÐ½Ñ, еÑли Ð¸Ñ Ð½ÐµÑ, Ñо не бÑдем запÑÑкаÑÑ Ð½Ð¸Ñего 145 // 146 if (BX.findChildrenByClassName(BX(document.body), MikoCallTracking.replaceClassName,false).length>0) 147 { 148 MikoCallTracking.StartCallTracking(); 149 } else { 150 if (MikoCallTracking.debugMode) console.log('ÐÐÐÐ: ÐоллÑÑекинг','Ðа ÑÑÑаниÑе Ð½ÐµÑ ÑлеменÑов Ñ ÑелеÑоном или не ÑÑÑановлен клаÑÑ', MikoCallTracking.replaceClassName); 151 } 152 153 BX.setCookie('_miko_visitor_id',result.visitorId, { expires: 86400*180}); 154 155 // Ðбновим даннÑе ÑеÑÑии Ñ Ð½ÐµÐ±Ð¾Ð»ÑÑим ÑаймаÑÑом, еÑÑÑ Ð¿Ñоблема Ñ Ð·Ð°Ð³ÑÑзкой аÑÐ¸Ð½Ñ ÑоннÑÑ ÑкÑипÑов 156 // 157 setTimeout(function() { 158 MikoCallTracking.updateAnalyticsInfo(); 159 }, 8000); 160 161 // ÐапÑÑÑим оÑÑлеживание 60 ÑекÑндной конвеÑÑии ÑеÑез 10 ÑекÑнд поÑле Ð²Ñ Ð¾Ð´Ð° на ÑÑÑаниÑÑ 162 // 163 MikoCallTracking.track60secconversion(); 164 // setTimeout(function() { 165 // 166 // }, 10000); 167 168 } 169 } 170 } 171 ) 172 }, 173 174 175 176 // ÐапÑоÑим новÑй Ð½Ð¾Ð¼ÐµÑ Ð½Ð° Ð´Ð»Ñ Ð¿Ð¾Ð´Ð¼ÐµÐ½Ñ Ð½Ð° ÑекÑÑей ÑÑÑаниÑе 177 // 178 StartCallTracking: function(){ 179 180 BX.ajax.post( 181 MikoCallTracking.apiUrl+'?action=getNewNumber', 182 { 183 'visitorId': MikoCallTracking.currentVisitorId 184 }, 185 function (response) { // полÑÑаем Ð½Ð¾Ð¼ÐµÑ Ð´Ð»Ñ Ð¿Ð¾Ð´Ð¼ÐµÐ½Ñ 186 if (MikoCallTracking.debugMode) console.log('ÐÐÐÐ: ÐоллÑÑекинг:','ÐÑÐ²ÐµÑ ÑеÑвеÑа на запÑÐ¾Ñ Ð½Ð¾Ð¼ÐµÑа',response); 187 if (/{*}/.test(response)) { 188 var result = JSON.parse(response); 189 if (result.number!=null) { 190 MikoCallTracking.replaceNumbers(result.number); 191 if (MikoCallTracking.debugMode) console.log('ÐÐÐÐ: ÐоллÑÑекинг:','ÐодменÑем Ð½Ð¾Ð¼ÐµÑ Ð½Ð° ',result.number); 192 193 // ÐÑвободим Ð½Ð¾Ð¼ÐµÑ Ð¸Ð· пÑла пÑи ÑаймаÑÑе полÑзоваÑÐµÐ»Ñ 194 // 195 setTimeout(function() { 196 MikoCallTracking.poolStarted=false; 197 MikoCallTracking.replaceNumbers(MikoCallTracking.defaultNumber); 198 if (MikoCallTracking.debugMode) console.log('ÐÐÐÐ: ÐоллÑÑекинг','ÐозвÑÐ°Ñ Ð½Ð¾Ð¼ÐµÑа по ÑаймаÑÑÑ', MikoCallTracking.defaultNumber); 199 }, MikoCallTracking.resetToDefaultTimeout); 200 201 if (result.startpoll) { 202 MikoCallTracking.poolStarted=true; 203 MikoCallTracking.poll(); 204 } else { 205 MikoCallTracking.poolStarted=false; 206 } 207 } 208 } 209 }) 210 }, 211 212 // Ðополним даннÑе о поÑеÑиÑеле из ÑÑеÑÑиков Google и Yandex 213 // 214 updateAnalyticsInfo: function (){ 215 216 BX.ajax.post( 217 MikoCallTracking.apiUrl+'?action=updateAnalyticsInfo', 218 { 219 'userData': MikoCallTracking.visitorData(), 220 'visitorId': MikoCallTracking.currentVisitorId 221 } 222 ) 223 if (MikoCallTracking.debugMode) console.log('ÐÐÐÐ: ÐоллÑÑекинг:','ÐÑпÑавили даннÑе Ð´Ð»Ñ Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ',MikoCallTracking.visitorData()); 224 }, 225 226 // ÐÑпÑавка Ñели во вÑе иниÑиализиÑованнÑе на ÑÑÑаниÑе ÑÑÑÑÑики ЯндекÑ.ÐеÑÑики. 227 // СÑÑÑÑики опÑеделÑÑÑÑÑ Ð°Ð²ÑомаÑиÑеÑки, поÑÑÐ¾Ð¼Ñ ÐºÐ¾Ð½ÑигÑÑаÑÐ¸Ñ Ð½Ðµ нÑжна и код 228 // ÑабоÑÐ°ÐµÑ Ð½Ð° лÑбом ÑайÑе Ñ Ð¿Ð¾Ð´ÐºÐ»ÑÑÑнной ÐеÑÑикой (обÑее ÑдÑо на неÑколÑко ÑайÑов). 229 reachYandexGoal: function (goal, params) { 230 try { 231 if (!window.ym) return; 232 var ids = []; 233 // ÐÑновной иÑÑоÑник â ÑеалÑно иниÑиализиÑованнÑе ÑÑÑÑÑики ÐеÑÑики (клÑÑи вида "30535012:0") 234 if (window.Ya && window.Ya._metrika && window.Ya._metrika.counters) { 235 for (var key in window.Ya._metrika.counters) { 236 var cid = parseInt(key, 10); 237 if (cid && ids.indexOf(cid) === -1) ids.push(cid); 238 } 239 } 240 // РезеÑвнÑй иÑÑоÑник â оÑеÑÐµÐ´Ñ Ð²Ñзовов ym(<id>,'init',...), еÑли ÐеÑÑика еÑÑ Ð½Ðµ догÑÑзилаÑÑ 241 if (ids.length === 0 && window.ym.a) { 242 window.ym.a.forEach(function (args) { 243 if (args[1] === 'init' && ids.indexOf(args[0]) === -1) ids.push(args[0]); 244 }); 245 } 246 ids.forEach(function (id) { window.ym(id, 'reachGoal', goal, params || {}); }); 247 if (MikoCallTracking.debugMode) console.log('ÐÐÐÐ: ÐоллÑÑекинг:','ÐÑпÑавлена ÑÐµÐ»Ñ ÐеÑÑики',goal,'в ÑÑÑÑÑики',ids); 248 } catch (e) { 249 if (MikoCallTracking.debugMode) console.log('ÐÐÐÐ: ÐоллÑÑекинг:','ÐÑибка оÑпÑавки Ñели ÐеÑÑики',e); 250 } 251 }, 252 253 track60secconversion: function(){ 254 255 $('body') . activity({ 256 'achieveTime':60 257 ,'testPeriod':10 258 ,useMultiMode: 1 259 ,callBack: function (e) { 260 261 BX.ajax.post( 262 MikoCallTracking.apiUrl+'?action=Register60SecConversion', 263 { 264 'visitorId': MikoCallTracking.currentVisitorId 265 } 266 ); 267 if (MikoCallTracking.debugMode) console.log('ÐÐÐÐ: ÐоллÑÑекинг:','СÑабоÑала конвеÑÑÐ¸Ñ 60 ÑекÑнд'); 268 } 269 }) 270 }, 271 // ÐапÑÑÑим поÑÑоÑнное Ñоединение Ñ ÑайÑом на ÑлÑÑай звонка клиенÑа 272 // 273 poll: function () { 274 if (!MikoCallTracking.poolStarted) return; // ÐÑеÑвем пÑл 275 276 setTimeout(function() { 277 BX.ajax.post( 278 MikoCallTracking.apiUrl+'?action=getnewcall', 279 { 280 'visitorId': MikoCallTracking.currentVisitorId, 281 'secondsago': MikoCallTracking.poolTimeout 282 }, 283 function (result) { // ÐÑли еÑÑÑ Ð¾ÑÐ²ÐµÑ Ð¾Ñ ÑеÑвеÑа, знаÑÐ¸Ñ Ð±Ñл звонк, оÑпÑавим в меÑÑÐ¸ÐºÑ Ð´Ð°Ð½Ð½Ñе 284 if (/{*}/.test(result)) 285 { 286 var call = JSON.parse(result); 287 // Ðдин и ÑÐ¾Ñ Ð¶Ðµ звонок ÑеÑÐ²ÐµÑ Ð²Ð¾Ð·Ð²ÑаÑÐ°ÐµÑ Ð² ÑеÑение вÑего окна secondsago, 288 // поÑÑÐ¾Ð¼Ñ ÑÐµÐ»Ñ ÑлÑм ÑолÑко один Ñаз на linkedid, инаÑе бÑÐ´ÐµÑ ÑлÑд в ÐеÑÑикÑ. 289 if (call.linkedid && call.linkedid !== MikoCallTracking.lastGoalLinkedid) { 290 MikoCallTracking.lastGoalLinkedid = call.linkedid; 291 // ÐеÑедаÑм ÑÐµÐ»Ñ Ð·Ð²Ð¾Ð½ÐºÐ° в ÑÑÑÑÑики: dataLayer (еÑли на ÑайÑе оÑÑалÑÑ GTM) + наÑÐ¸Ð²Ð½Ð°Ñ Ð¯Ð½Ð´ÐµÐºÑ.ÐеÑÑика 292 if (window.dataLayer) { 293 dataLayer.push({ 294 'event': 'calltracking', 295 'category': 'phone', 296 'action': 'call', 297 'linkedid': call.linkedid 298 }); 299 } 300 MikoCallTracking.reachYandexGoal('calltracking', { linkedid: call.linkedid }); 301 if (MikoCallTracking.debugMode) console.log('ÐÐÐÐ: ÐоллÑÑекинг','ÐовÑй звонок', call); 302 } 303 } else { 304 if (MikoCallTracking.debugMode) console.log('ÐÐÐÐ: ÐоллÑÑекинг','ÐовÑй Ñикл Long Polling',result); 305 }
306 // ÐапÑÑкаем Ñикл из ajax запÑоÑов 307 MikoCallTracking.poll(); 308 } 309 ) 310 }, MikoCallTracking.poolTimeout*1000); 311 } 312 313 }; 314 315 316});
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.