sourcebuster.js
878 lines
| 1 | !function(e){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=e();else if("function"==typeof define&&define.amd)define([],e);else{var f;"undefined"!=typeof window?f=window:"undefined"!=typeof global?f=global:"undefined"!=typeof self&&(f=self),f.sbjs=e()}}(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(_dereq_,module,exports){ |
| 2 | "use strict"; |
| 3 | |
| 4 | var init = _dereq_('./init'); |
| 5 | |
| 6 | var sbjs = { |
| 7 | init: function(prefs) { |
| 8 | this.get = init(prefs); |
| 9 | if (prefs && prefs.callback && typeof prefs.callback === 'function') { |
| 10 | prefs.callback(this.get); |
| 11 | } |
| 12 | } |
| 13 | }; |
| 14 | |
| 15 | module.exports = sbjs; |
| 16 | },{"./init":6}],2:[function(_dereq_,module,exports){ |
| 17 | "use strict"; |
| 18 | |
| 19 | var terms = _dereq_('./terms'), |
| 20 | utils = _dereq_('./helpers/utils'); |
| 21 | |
| 22 | var data = { |
| 23 | |
| 24 | containers: { |
| 25 | current: 'sbjs_current', |
| 26 | current_extra: 'sbjs_current_add', |
| 27 | first: 'sbjs_first', |
| 28 | first_extra: 'sbjs_first_add', |
| 29 | session: 'sbjs_session', |
| 30 | udata: 'sbjs_udata', |
| 31 | promocode: 'sbjs_promo' |
| 32 | }, |
| 33 | |
| 34 | service: { |
| 35 | migrations: 'sbjs_migrations' |
| 36 | }, |
| 37 | |
| 38 | delimiter: '|||', |
| 39 | |
| 40 | aliases: { |
| 41 | |
| 42 | main: { |
| 43 | type: 'typ', |
| 44 | source: 'src', |
| 45 | medium: 'mdm', |
| 46 | campaign: 'cmp', |
| 47 | content: 'cnt', |
| 48 | term: 'trm', |
| 49 | id: 'id' |
| 50 | }, |
| 51 | |
| 52 | extra: { |
| 53 | fire_date: 'fd', |
| 54 | entrance_point: 'ep', |
| 55 | referer: 'rf' |
| 56 | }, |
| 57 | |
| 58 | session: { |
| 59 | pages_seen: 'pgs', |
| 60 | current_page: 'cpg' |
| 61 | }, |
| 62 | |
| 63 | udata: { |
| 64 | visits: 'vst', |
| 65 | ip: 'uip', |
| 66 | agent: 'uag' |
| 67 | }, |
| 68 | |
| 69 | promo: 'code' |
| 70 | |
| 71 | }, |
| 72 | |
| 73 | pack: { |
| 74 | |
| 75 | main: function(sbjs) { |
| 76 | return ( |
| 77 | data.aliases.main.type + '=' + sbjs.type + data.delimiter + |
| 78 | data.aliases.main.source + '=' + sbjs.source + data.delimiter + |
| 79 | data.aliases.main.medium + '=' + sbjs.medium + data.delimiter + |
| 80 | data.aliases.main.campaign + '=' + sbjs.campaign + data.delimiter + |
| 81 | data.aliases.main.content + '=' + sbjs.content + data.delimiter + |
| 82 | data.aliases.main.term + '=' + sbjs.term + data.delimiter + |
| 83 | data.aliases.main.id + '=' + sbjs.id |
| 84 | ); |
| 85 | }, |
| 86 | |
| 87 | extra: function(timezone_offset) { |
| 88 | return ( |
| 89 | data.aliases.extra.fire_date + '=' + utils.setDate(new Date, timezone_offset) + data.delimiter + |
| 90 | data.aliases.extra.entrance_point + '=' + document.location.href + data.delimiter + |
| 91 | data.aliases.extra.referer + '=' + (document.referrer || terms.none) |
| 92 | ); |
| 93 | }, |
| 94 | |
| 95 | user: function(visits, user_ip) { |
| 96 | return ( |
| 97 | data.aliases.udata.visits + '=' + visits + data.delimiter + |
| 98 | data.aliases.udata.ip + '=' + user_ip + data.delimiter + |
| 99 | data.aliases.udata.agent + '=' + navigator.userAgent |
| 100 | ); |
| 101 | }, |
| 102 | |
| 103 | session: function(pages) { |
| 104 | return ( |
| 105 | data.aliases.session.pages_seen + '=' + pages + data.delimiter + |
| 106 | data.aliases.session.current_page + '=' + document.location.href |
| 107 | ); |
| 108 | }, |
| 109 | |
| 110 | promo: function(promo) { |
| 111 | return ( |
| 112 | data.aliases.promo + '=' + utils.setLeadingZeroToInt(utils.randomInt(promo.min, promo.max), promo.max.toString().length) |
| 113 | ); |
| 114 | } |
| 115 | |
| 116 | } |
| 117 | }; |
| 118 | |
| 119 | module.exports = data; |
| 120 | |
| 121 | },{"./helpers/utils":5,"./terms":9}],3:[function(_dereq_,module,exports){ |
| 122 | "use strict"; |
| 123 | |
| 124 | var delimiter = _dereq_('../data').delimiter; |
| 125 | |
| 126 | module.exports = { |
| 127 | |
| 128 | encodeData: function(s) { |
| 129 | return encodeURIComponent(s).replace(/\!/g, '%21') |
| 130 | .replace(/\~/g, '%7E') |
| 131 | .replace(/\*/g, '%2A') |
| 132 | .replace(/\'/g, '%27') |
| 133 | .replace(/\(/g, '%28') |
| 134 | .replace(/\)/g, '%29'); |
| 135 | }, |
| 136 | |
| 137 | decodeData: function(s) { |
| 138 | try { |
| 139 | return decodeURIComponent(s).replace(/\%21/g, '!') |
| 140 | .replace(/\%7E/g, '~') |
| 141 | .replace(/\%2A/g, '*') |
| 142 | .replace(/\%27/g, "'") |
| 143 | .replace(/\%28/g, '(') |
| 144 | .replace(/\%29/g, ')'); |
| 145 | } catch(err1) { |
| 146 | // try unescape for backward compatibility |
| 147 | try { return unescape(s); } catch(err2) { return ''; } |
| 148 | } |
| 149 | }, |
| 150 | |
| 151 | set: function(name, value, minutes, domain, excl_subdomains) { |
| 152 | var expires, basehost; |
| 153 | |
| 154 | if (minutes) { |
| 155 | var date = new Date(); |
| 156 | date.setTime(date.getTime() + (minutes * 60 * 1000)); |
| 157 | expires = '; expires=' + date.toGMTString(); |
| 158 | } else { |
| 159 | expires = ''; |
| 160 | } |
| 161 | if (domain && !excl_subdomains) { |
| 162 | basehost = ';domain=.' + domain; |
| 163 | } else { |
| 164 | basehost = ''; |
| 165 | } |
| 166 | document.cookie = this.encodeData(name) + '=' + this.encodeData(value) + expires + basehost + '; path=/'; |
| 167 | }, |
| 168 | |
| 169 | get: function(name) { |
| 170 | var nameEQ = this.encodeData(name) + '=', |
| 171 | ca = document.cookie.split(';'); |
| 172 | |
| 173 | for (var i = 0; i < ca.length; i++) { |
| 174 | var c = ca[i]; |
| 175 | while (c.charAt(0) === ' ') { c = c.substring(1, c.length); } |
| 176 | if (c.indexOf(nameEQ) === 0) { |
| 177 | return this.decodeData(c.substring(nameEQ.length, c.length)); |
| 178 | } |
| 179 | } |
| 180 | return null; |
| 181 | }, |
| 182 | |
| 183 | destroy: function(name, domain, excl_subdomains) { |
| 184 | this.set(name, '', -1, domain, excl_subdomains); |
| 185 | }, |
| 186 | |
| 187 | parse: function(yummy) { |
| 188 | |
| 189 | var cookies = [], |
| 190 | data = {}; |
| 191 | |
| 192 | if (typeof yummy === 'string') { |
| 193 | cookies.push(yummy); |
| 194 | } else { |
| 195 | for (var prop in yummy) { |
| 196 | if (yummy.hasOwnProperty(prop)) { |
| 197 | cookies.push(yummy[prop]); |
| 198 | } |
| 199 | } |
| 200 | } |
| 201 | |
| 202 | for (var i1 = 0; i1 < cookies.length; i1++) { |
| 203 | var cookie_array; |
| 204 | data[this.unsbjs(cookies[i1])] = {}; |
| 205 | if (this.get(cookies[i1])) { |
| 206 | cookie_array = this.get(cookies[i1]).split(delimiter); |
| 207 | } else { |
| 208 | cookie_array = []; |
| 209 | } |
| 210 | for (var i2 = 0; i2 < cookie_array.length; i2++) { |
| 211 | var tmp_array = cookie_array[i2].split('='), |
| 212 | result_array = tmp_array.splice(0, 1); |
| 213 | result_array.push(tmp_array.join('=')); |
| 214 | data[this.unsbjs(cookies[i1])][result_array[0]] = this.decodeData(result_array[1]); |
| 215 | } |
| 216 | } |
| 217 | |
| 218 | return data; |
| 219 | |
| 220 | }, |
| 221 | |
| 222 | unsbjs: function (string) { |
| 223 | return string.replace('sbjs_', ''); |
| 224 | } |
| 225 | |
| 226 | }; |
| 227 | |
| 228 | },{"../data":2}],4:[function(_dereq_,module,exports){ |
| 229 | "use strict"; |
| 230 | |
| 231 | module.exports = { |
| 232 | |
| 233 | parse: function(str) { |
| 234 | var o = this.parseOptions, |
| 235 | m = o.parser[o.strictMode ? 'strict' : 'loose'].exec(str), |
| 236 | uri = {}, |
| 237 | i = 14; |
| 238 | |
| 239 | while (i--) { uri[o.key[i]] = m[i] || ''; } |
| 240 | |
| 241 | uri[o.q.name] = {}; |
| 242 | uri[o.key[12]].replace(o.q.parser, function ($0, $1, $2) { |
| 243 | if ($1) { uri[o.q.name][$1] = $2; } |
| 244 | }); |
| 245 | |
| 246 | return uri; |
| 247 | }, |
| 248 | |
| 249 | parseOptions: { |
| 250 | strictMode: false, |
| 251 | key: ['source','protocol','authority','userInfo','user','password','host','port','relative','path','directory','file','query','anchor'], |
| 252 | q: { |
| 253 | name: 'queryKey', |
| 254 | parser: /(?:^|&)([^&=]*)=?([^&]*)/g |
| 255 | }, |
| 256 | parser: { |
| 257 | strict: /^(?:([^:\/?#]+):)?(?:\/\/((?:(([^:@]*)(?::([^:@]*))?)?@)?([^:\/?#]*)(?::(\d*))?))?((((?:[^?#\/]*\/)*)([^?#]*))(?:\?([^#]*))?(?:#(.*))?)/, |
| 258 | loose: /^(?:(?![^:@]+:[^:@\/]*@)([^:\/?#.]+):)?(?:\/\/)?((?:(([^:@]*)(?::([^:@]*))?)?@)?([^:\/?#]*)(?::(\d*))?)(((\/(?:[^?#](?![^?#\/]*\.[^?#\/.]+(?:[?#]|$)))*\/?)?([^?#\/]*))(?:\?([^#]*))?(?:#(.*))?)/ |
| 259 | } |
| 260 | }, |
| 261 | |
| 262 | getParam: function(custom_params) { |
| 263 | var query_string = {}, |
| 264 | query = custom_params ? custom_params : window.location.search.substring(1), |
| 265 | vars = query.split('&'); |
| 266 | |
| 267 | for (var i = 0; i < vars.length; i++) { |
| 268 | var pair = vars[i].split('='); |
| 269 | if (typeof query_string[pair[0]] === 'undefined') { |
| 270 | query_string[pair[0]] = pair[1]; |
| 271 | } else if (typeof query_string[pair[0]] === 'string') { |
| 272 | var arr = [ query_string[pair[0]], pair[1] ]; |
| 273 | query_string[pair[0]] = arr; |
| 274 | } else { |
| 275 | query_string[pair[0]].push(pair[1]); |
| 276 | } |
| 277 | } |
| 278 | return query_string; |
| 279 | }, |
| 280 | |
| 281 | getHost: function(request) { |
| 282 | return this.parse(request).host.replace('www.', ''); |
| 283 | } |
| 284 | |
| 285 | }; |
| 286 | },{}],5:[function(_dereq_,module,exports){ |
| 287 | "use strict"; |
| 288 | |
| 289 | module.exports = { |
| 290 | |
| 291 | escapeRegexp: function(string) { |
| 292 | return string.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, "\\$&"); |
| 293 | }, |
| 294 | |
| 295 | setDate: function(date, offset) { |
| 296 | var utc_offset = date.getTimezoneOffset() / 60, |
| 297 | now_hours = date.getHours(), |
| 298 | custom_offset = offset || offset === 0 ? offset : -utc_offset; |
| 299 | |
| 300 | date.setHours(now_hours + utc_offset + custom_offset); |
| 301 | |
| 302 | var year = date.getFullYear(), |
| 303 | month = this.setLeadingZeroToInt(date.getMonth() + 1, 2), |
| 304 | day = this.setLeadingZeroToInt(date.getDate(), 2), |
| 305 | hour = this.setLeadingZeroToInt(date.getHours(), 2), |
| 306 | minute = this.setLeadingZeroToInt(date.getMinutes(), 2), |
| 307 | second = this.setLeadingZeroToInt(date.getSeconds(), 2); |
| 308 | |
| 309 | return (year + '-' + month + '-' + day + ' ' + hour + ':' + minute + ':' + second); |
| 310 | }, |
| 311 | |
| 312 | setLeadingZeroToInt: function(num, size) { |
| 313 | var s = num + ''; |
| 314 | while (s.length < size) { s = '0' + s; } |
| 315 | return s; |
| 316 | }, |
| 317 | |
| 318 | randomInt: function(min, max) { |
| 319 | return Math.floor(Math.random() * (max - min + 1)) + min; |
| 320 | } |
| 321 | |
| 322 | }; |
| 323 | |
| 324 | },{}],6:[function(_dereq_,module,exports){ |
| 325 | "use strict"; |
| 326 | |
| 327 | var data = _dereq_('./data'), |
| 328 | terms = _dereq_('./terms'), |
| 329 | cookies = _dereq_('./helpers/cookies'), |
| 330 | uri = _dereq_('./helpers/uri'), |
| 331 | utils = _dereq_('./helpers/utils'), |
| 332 | params = _dereq_('./params'), |
| 333 | migrations = _dereq_('./migrations'); |
| 334 | |
| 335 | module.exports = function(prefs) { |
| 336 | |
| 337 | var p = params.fetch(prefs); |
| 338 | var get_param = uri.getParam(); |
| 339 | var domain = p.domain.host, |
| 340 | isolate = p.domain.isolate, |
| 341 | lifetime = p.lifetime; |
| 342 | |
| 343 | migrations.go(lifetime, domain, isolate); |
| 344 | |
| 345 | var __sbjs_type, |
| 346 | __sbjs_source, |
| 347 | __sbjs_medium, |
| 348 | __sbjs_campaign, |
| 349 | __sbjs_content, |
| 350 | __sbjs_term, |
| 351 | __sbjs_id; |
| 352 | |
| 353 | function mainData() { |
| 354 | var sbjs_data; |
| 355 | if ( |
| 356 | typeof get_param.utm_source !== 'undefined' || |
| 357 | typeof get_param.utm_medium !== 'undefined' || |
| 358 | typeof get_param.utm_campaign !== 'undefined' || |
| 359 | typeof get_param.utm_content !== 'undefined' || |
| 360 | typeof get_param.utm_term !== 'undefined' || |
| 361 | typeof get_param.utm_id !== 'undefined' || |
| 362 | typeof get_param.gclid !== 'undefined' || |
| 363 | typeof get_param.yclid !== 'undefined' || |
| 364 | typeof get_param[p.campaign_param] !== 'undefined' || |
| 365 | typeof get_param[p.term_param] !== 'undefined' || |
| 366 | typeof get_param[p.content_param] !== 'undefined' |
| 367 | ) { |
| 368 | setFirstAndCurrentExtraData(); |
| 369 | sbjs_data = getData(terms.traffic.utm); |
| 370 | } else if (checkReferer(terms.traffic.organic)) { |
| 371 | setFirstAndCurrentExtraData(); |
| 372 | sbjs_data = getData(terms.traffic.organic); |
| 373 | } else if (!cookies.get(data.containers.session) && checkReferer(terms.traffic.referral)) { |
| 374 | setFirstAndCurrentExtraData(); |
| 375 | sbjs_data = getData(terms.traffic.referral); |
| 376 | } else if (!cookies.get(data.containers.first) && !cookies.get(data.containers.current)) { |
| 377 | setFirstAndCurrentExtraData(); |
| 378 | sbjs_data = getData(terms.traffic.typein); |
| 379 | } else { |
| 380 | return cookies.get(data.containers.current); |
| 381 | } |
| 382 | |
| 383 | return sbjs_data; |
| 384 | } |
| 385 | |
| 386 | function getData(type) { |
| 387 | |
| 388 | switch (type) { |
| 389 | |
| 390 | case terms.traffic.utm: |
| 391 | |
| 392 | __sbjs_type = terms.traffic.utm; |
| 393 | |
| 394 | if (typeof get_param.utm_source !== 'undefined') { |
| 395 | __sbjs_source = get_param.utm_source; |
| 396 | } else if (typeof get_param.gclid !== 'undefined') { |
| 397 | __sbjs_source = 'google'; |
| 398 | } else if (typeof get_param.yclid !== 'undefined') { |
| 399 | __sbjs_source = 'yandex'; |
| 400 | } else { |
| 401 | __sbjs_source = terms.none; |
| 402 | } |
| 403 | |
| 404 | if (typeof get_param.utm_medium !== 'undefined') { |
| 405 | __sbjs_medium = get_param.utm_medium; |
| 406 | } else if (typeof get_param.gclid !== 'undefined') { |
| 407 | __sbjs_medium = 'cpc'; |
| 408 | } else if (typeof get_param.yclid !== 'undefined') { |
| 409 | __sbjs_medium = 'cpc'; |
| 410 | } else { |
| 411 | __sbjs_medium = terms.none; |
| 412 | } |
| 413 | |
| 414 | if (typeof get_param.utm_campaign !== 'undefined') { |
| 415 | __sbjs_campaign = get_param.utm_campaign; |
| 416 | } else if (typeof get_param[p.campaign_param] !== 'undefined') { |
| 417 | __sbjs_campaign = get_param[p.campaign_param]; |
| 418 | } else if (typeof get_param.gclid !== 'undefined') { |
| 419 | __sbjs_campaign = 'google_cpc'; |
| 420 | } else if (typeof get_param.yclid !== 'undefined') { |
| 421 | __sbjs_campaign = 'yandex_cpc'; |
| 422 | } else { |
| 423 | __sbjs_campaign = terms.none; |
| 424 | } |
| 425 | |
| 426 | if (typeof get_param.utm_content !== 'undefined') { |
| 427 | __sbjs_content = get_param.utm_content; |
| 428 | } else if (typeof get_param[p.content_param] !== 'undefined') { |
| 429 | __sbjs_content = get_param[p.content_param]; |
| 430 | } else { |
| 431 | __sbjs_content = terms.none; |
| 432 | } |
| 433 | |
| 434 | __sbjs_id = get_param.utm_id || terms.none; |
| 435 | |
| 436 | if (typeof get_param.utm_term !== 'undefined') { |
| 437 | __sbjs_term = get_param.utm_term; |
| 438 | } else if (typeof get_param[p.term_param] !== 'undefined') { |
| 439 | __sbjs_term = get_param[p.term_param]; |
| 440 | } else { |
| 441 | __sbjs_term = getUtmTerm() || terms.none; |
| 442 | } |
| 443 | |
| 444 | break; |
| 445 | |
| 446 | case terms.traffic.organic: |
| 447 | __sbjs_type = terms.traffic.organic; |
| 448 | __sbjs_source = __sbjs_source || uri.getHost(document.referrer); |
| 449 | __sbjs_medium = terms.referer.organic; |
| 450 | __sbjs_campaign = terms.none; |
| 451 | __sbjs_content = terms.none; |
| 452 | __sbjs_term = terms.none; |
| 453 | __sbjs_id = terms.none; |
| 454 | break; |
| 455 | |
| 456 | case terms.traffic.referral: |
| 457 | __sbjs_type = terms.traffic.referral; |
| 458 | __sbjs_source = __sbjs_source || uri.getHost(document.referrer); |
| 459 | __sbjs_medium = __sbjs_medium || terms.referer.referral; |
| 460 | __sbjs_campaign = terms.none; |
| 461 | __sbjs_content = uri.parse(document.referrer).path; |
| 462 | __sbjs_term = terms.none; |
| 463 | __sbjs_id = terms.none; |
| 464 | break; |
| 465 | |
| 466 | case terms.traffic.typein: |
| 467 | __sbjs_type = terms.traffic.typein; |
| 468 | __sbjs_source = p.typein_attributes.source; |
| 469 | __sbjs_medium = p.typein_attributes.medium; |
| 470 | __sbjs_campaign = terms.none; |
| 471 | __sbjs_content = terms.none; |
| 472 | __sbjs_term = terms.none; |
| 473 | __sbjs_id = terms.none; |
| 474 | break; |
| 475 | |
| 476 | default: |
| 477 | __sbjs_type = terms.oops; |
| 478 | __sbjs_source = terms.oops; |
| 479 | __sbjs_medium = terms.oops; |
| 480 | __sbjs_campaign = terms.oops; |
| 481 | __sbjs_content = terms.oops; |
| 482 | __sbjs_term = terms.oops; |
| 483 | __sbjs_id = terms.oops; |
| 484 | } |
| 485 | var sbjs_data = { |
| 486 | type: __sbjs_type, |
| 487 | source: __sbjs_source, |
| 488 | medium: __sbjs_medium, |
| 489 | campaign: __sbjs_campaign, |
| 490 | content: __sbjs_content, |
| 491 | term: __sbjs_term, |
| 492 | id: __sbjs_id |
| 493 | }; |
| 494 | |
| 495 | return data.pack.main(sbjs_data); |
| 496 | |
| 497 | } |
| 498 | |
| 499 | function getUtmTerm() { |
| 500 | var referer = document.referrer; |
| 501 | if (get_param.utm_term) { |
| 502 | return get_param.utm_term; |
| 503 | } else if (referer && uri.parse(referer).host && uri.parse(referer).host.match(/^(?:.*\.)?yandex\..{2,9}$/i)) { |
| 504 | try { |
| 505 | return uri.getParam(uri.parse(document.referrer).query).text; |
| 506 | } catch (err) { |
| 507 | return false; |
| 508 | } |
| 509 | } else { |
| 510 | return false; |
| 511 | } |
| 512 | } |
| 513 | |
| 514 | function checkReferer(type) { |
| 515 | var referer = document.referrer; |
| 516 | switch(type) { |
| 517 | case terms.traffic.organic: |
| 518 | return (!!referer && checkRefererHost(referer) && isOrganic(referer)); |
| 519 | case terms.traffic.referral: |
| 520 | return (!!referer && checkRefererHost(referer) && isReferral(referer)); |
| 521 | default: |
| 522 | return false; |
| 523 | } |
| 524 | } |
| 525 | |
| 526 | function checkRefererHost(referer) { |
| 527 | if (p.domain) { |
| 528 | if (!isolate) { |
| 529 | var host_regex = new RegExp('^(?:.*\\.)?' + utils.escapeRegexp(domain) + '$', 'i'); |
| 530 | return !(uri.getHost(referer).match(host_regex)); |
| 531 | } else { |
| 532 | return (uri.getHost(referer) !== uri.getHost(domain)); |
| 533 | } |
| 534 | } else { |
| 535 | return (uri.getHost(referer) !== uri.getHost(document.location.href)); |
| 536 | } |
| 537 | } |
| 538 | |
| 539 | function isOrganic(referer) { |
| 540 | |
| 541 | var y_host = 'yandex', |
| 542 | y_param = 'text', |
| 543 | g_host = 'google'; |
| 544 | |
| 545 | var y_host_regex = new RegExp('^(?:.*\\.)?' + utils.escapeRegexp(y_host) + '\\..{2,9}$'), |
| 546 | y_param_regex = new RegExp('.*' + utils.escapeRegexp(y_param) + '=.*'), |
| 547 | g_host_regex = new RegExp('^(?:www\\.)?' + utils.escapeRegexp(g_host) + '\\..{2,9}$'); |
| 548 | |
| 549 | if ( |
| 550 | !!uri.parse(referer).query && |
| 551 | !!uri.parse(referer).host.match(y_host_regex) && |
| 552 | !!uri.parse(referer).query.match(y_param_regex) |
| 553 | ) { |
| 554 | __sbjs_source = y_host; |
| 555 | return true; |
| 556 | } else if (!!uri.parse(referer).host.match(g_host_regex)) { |
| 557 | __sbjs_source = g_host; |
| 558 | return true; |
| 559 | } else if (!!uri.parse(referer).query) { |
| 560 | for (var i = 0; i < p.organics.length; i++) { |
| 561 | if ( |
| 562 | uri.parse(referer).host.match(new RegExp('^(?:.*\\.)?' + utils.escapeRegexp(p.organics[i].host) + '$', 'i')) && |
| 563 | uri.parse(referer).query.match(new RegExp('.*' + utils.escapeRegexp(p.organics[i].param) + '=.*', 'i')) |
| 564 | ) { |
| 565 | __sbjs_source = p.organics[i].display || p.organics[i].host; |
| 566 | return true; |
| 567 | } |
| 568 | if (i + 1 === p.organics.length) { |
| 569 | return false; |
| 570 | } |
| 571 | } |
| 572 | } else { |
| 573 | return false; |
| 574 | } |
| 575 | } |
| 576 | |
| 577 | function isReferral(referer) { |
| 578 | if (p.referrals.length > 0) { |
| 579 | for (var i = 0; i < p.referrals.length; i++) { |
| 580 | if (uri.parse(referer).host.match(new RegExp('^(?:.*\\.)?' + utils.escapeRegexp(p.referrals[i].host) + '$', 'i'))) { |
| 581 | __sbjs_source = p.referrals[i].display || p.referrals[i].host; |
| 582 | __sbjs_medium = p.referrals[i].medium || terms.referer.referral; |
| 583 | return true; |
| 584 | } |
| 585 | if (i + 1 === p.referrals.length) { |
| 586 | __sbjs_source = uri.getHost(referer); |
| 587 | return true; |
| 588 | } |
| 589 | } |
| 590 | } else { |
| 591 | __sbjs_source = uri.getHost(referer); |
| 592 | return true; |
| 593 | } |
| 594 | } |
| 595 | |
| 596 | function setFirstAndCurrentExtraData() { |
| 597 | cookies.set(data.containers.current_extra, data.pack.extra(p.timezone_offset), lifetime, domain, isolate); |
| 598 | if (!cookies.get(data.containers.first_extra)) { |
| 599 | cookies.set(data.containers.first_extra, data.pack.extra(p.timezone_offset), lifetime, domain, isolate); |
| 600 | } |
| 601 | } |
| 602 | |
| 603 | (function setData() { |
| 604 | |
| 605 | // Main data |
| 606 | cookies.set(data.containers.current, mainData(), lifetime, domain, isolate); |
| 607 | if (!cookies.get(data.containers.first)) { |
| 608 | cookies.set(data.containers.first, cookies.get(data.containers.current), lifetime, domain, isolate); |
| 609 | } |
| 610 | |
| 611 | // User data |
| 612 | var visits, udata; |
| 613 | if (!cookies.get(data.containers.udata)) { |
| 614 | visits = 1; |
| 615 | udata = data.pack.user(visits, p.user_ip); |
| 616 | } else { |
| 617 | visits = parseInt(cookies.parse(data.containers.udata)[cookies.unsbjs(data.containers.udata)][data.aliases.udata.visits]) || 1; |
| 618 | visits = cookies.get(data.containers.session) ? visits : visits + 1; |
| 619 | udata = data.pack.user(visits, p.user_ip); |
| 620 | } |
| 621 | cookies.set(data.containers.udata, udata, lifetime, domain, isolate); |
| 622 | |
| 623 | // Session |
| 624 | var pages_count; |
| 625 | if (!cookies.get(data.containers.session)) { |
| 626 | pages_count = 1; |
| 627 | } else { |
| 628 | pages_count = parseInt(cookies.parse(data.containers.session)[cookies.unsbjs(data.containers.session)][data.aliases.session.pages_seen]) || 1; |
| 629 | pages_count += 1; |
| 630 | } |
| 631 | cookies.set(data.containers.session, data.pack.session(pages_count), p.session_length, domain, isolate); |
| 632 | |
| 633 | // Promocode |
| 634 | if (p.promocode && !cookies.get(data.containers.promocode)) { |
| 635 | cookies.set(data.containers.promocode, data.pack.promo(p.promocode), lifetime, domain, isolate); |
| 636 | } |
| 637 | |
| 638 | })(); |
| 639 | |
| 640 | return cookies.parse(data.containers); |
| 641 | |
| 642 | }; |
| 643 | |
| 644 | },{"./data":2,"./helpers/cookies":3,"./helpers/uri":4,"./helpers/utils":5,"./migrations":7,"./params":8,"./terms":9}],7:[function(_dereq_,module,exports){ |
| 645 | "use strict"; |
| 646 | |
| 647 | var data = _dereq_('./data'), |
| 648 | cookies = _dereq_('./helpers/cookies'); |
| 649 | |
| 650 | module.exports = { |
| 651 | |
| 652 | go: function(lifetime, domain, isolate) { |
| 653 | |
| 654 | var migrate = this.migrations, |
| 655 | _with = { l: lifetime, d: domain, i: isolate }; |
| 656 | |
| 657 | var i; |
| 658 | |
| 659 | if (!cookies.get(data.containers.first) && !cookies.get(data.service.migrations)) { |
| 660 | |
| 661 | var mids = []; |
| 662 | for (i = 0; i < migrate.length; i++) { mids.push(migrate[i].id); } |
| 663 | |
| 664 | var advance = ''; |
| 665 | for (i = 0; i < mids.length; i++) { |
| 666 | advance += mids[i] + '=1'; |
| 667 | if (i < mids.length - 1) { advance += data.delimiter; } |
| 668 | } |
| 669 | cookies.set(data.service.migrations, advance, _with.l, _with.d, _with.i); |
| 670 | |
| 671 | } else if (!cookies.get(data.service.migrations)) { |
| 672 | |
| 673 | // We have only one migration for now, so just |
| 674 | for (i = 0; i < migrate.length; i++) { |
| 675 | migrate[i].go(migrate[i].id, _with); |
| 676 | } |
| 677 | |
| 678 | } |
| 679 | |
| 680 | }, |
| 681 | |
| 682 | migrations: [ |
| 683 | |
| 684 | { |
| 685 | id: '1418474375998', |
| 686 | version: '1.0.0-beta', |
| 687 | go: function(mid, _with) { |
| 688 | |
| 689 | var success = mid + '=1', |
| 690 | fail = mid + '=0'; |
| 691 | |
| 692 | var safeReplace = function($0, $1, $2) { |
| 693 | return ($1 || $2 ? $0 : data.delimiter); |
| 694 | }; |
| 695 | |
| 696 | try { |
| 697 | |
| 698 | // Switch delimiter and renew cookies |
| 699 | var _in = []; |
| 700 | for (var prop in data.containers) { |
| 701 | if (data.containers.hasOwnProperty(prop)) { |
| 702 | _in.push(data.containers[prop]); |
| 703 | } |
| 704 | } |
| 705 | |
| 706 | for (var i = 0; i < _in.length; i++) { |
| 707 | if (cookies.get(_in[i])) { |
| 708 | var buffer = cookies.get(_in[i]).replace(/(\|)?\|(\|)?/g, safeReplace); |
| 709 | cookies.destroy(_in[i], _with.d, _with.i); |
| 710 | cookies.destroy(_in[i], _with.d, !_with.i); |
| 711 | cookies.set(_in[i], buffer, _with.l, _with.d, _with.i); |
| 712 | } |
| 713 | } |
| 714 | |
| 715 | // Update `session` |
| 716 | if (cookies.get(data.containers.session)) { |
| 717 | cookies.set(data.containers.session, data.pack.session(0), _with.l, _with.d, _with.i); |
| 718 | } |
| 719 | |
| 720 | // Yay! |
| 721 | cookies.set(data.service.migrations, success, _with.l, _with.d, _with.i); |
| 722 | |
| 723 | } catch (err) { |
| 724 | // Oops |
| 725 | cookies.set(data.service.migrations, fail, _with.l, _with.d, _with.i); |
| 726 | } |
| 727 | } |
| 728 | } |
| 729 | |
| 730 | ] |
| 731 | |
| 732 | }; |
| 733 | },{"./data":2,"./helpers/cookies":3}],8:[function(_dereq_,module,exports){ |
| 734 | "use strict"; |
| 735 | |
| 736 | var terms = _dereq_('./terms'), |
| 737 | uri = _dereq_('./helpers/uri'); |
| 738 | |
| 739 | module.exports = { |
| 740 | |
| 741 | fetch: function(prefs) { |
| 742 | |
| 743 | var user = prefs || {}, |
| 744 | params = {}; |
| 745 | |
| 746 | // Set `lifetime of the cookie` in months |
| 747 | params.lifetime = this.validate.checkFloat(user.lifetime) || 6; |
| 748 | params.lifetime = parseInt(params.lifetime * 30 * 24 * 60); |
| 749 | |
| 750 | // Set `session length` in minutes |
| 751 | params.session_length = this.validate.checkInt(user.session_length) || 30; |
| 752 | |
| 753 | // Set `timezone offset` in hours |
| 754 | params.timezone_offset = this.validate.checkInt(user.timezone_offset); |
| 755 | |
| 756 | // Set `campaign param` for AdWords links |
| 757 | params.campaign_param = user.campaign_param || false; |
| 758 | |
| 759 | // Set `term param` and `content param` for AdWords links |
| 760 | params.term_param = user.term_param || false; |
| 761 | params.content_param = user.content_param || false; |
| 762 | |
| 763 | // Set `user ip` |
| 764 | params.user_ip = user.user_ip || terms.none; |
| 765 | |
| 766 | // Set `promocode` |
| 767 | if (user.promocode) { |
| 768 | params.promocode = {}; |
| 769 | params.promocode.min = parseInt(user.promocode.min) || 100000; |
| 770 | params.promocode.max = parseInt(user.promocode.max) || 999999; |
| 771 | } else { |
| 772 | params.promocode = false; |
| 773 | } |
| 774 | |
| 775 | // Set `typein attributes` |
| 776 | if (user.typein_attributes && user.typein_attributes.source && user.typein_attributes.medium) { |
| 777 | params.typein_attributes = {}; |
| 778 | params.typein_attributes.source = user.typein_attributes.source; |
| 779 | params.typein_attributes.medium = user.typein_attributes.medium; |
| 780 | } else { |
| 781 | params.typein_attributes = { source: '(direct)', medium: '(none)' }; |
| 782 | } |
| 783 | |
| 784 | // Set `domain` |
| 785 | if (user.domain && this.validate.isString(user.domain)) { |
| 786 | params.domain = { host: user.domain, isolate: false }; |
| 787 | } else if (user.domain && user.domain.host) { |
| 788 | params.domain = user.domain; |
| 789 | } else { |
| 790 | params.domain = { host: uri.getHost(document.location.hostname), isolate: false }; |
| 791 | } |
| 792 | |
| 793 | // Set `referral sources` |
| 794 | params.referrals = []; |
| 795 | |
| 796 | if (user.referrals && user.referrals.length > 0) { |
| 797 | for (var ir = 0; ir < user.referrals.length; ir++) { |
| 798 | if (user.referrals[ir].host) { |
| 799 | params.referrals.push(user.referrals[ir]); |
| 800 | } |
| 801 | } |
| 802 | } |
| 803 | |
| 804 | // Set `organic sources` |
| 805 | params.organics = []; |
| 806 | |
| 807 | if (user.organics && user.organics.length > 0) { |
| 808 | for (var io = 0; io < user.organics.length; io++) { |
| 809 | if (user.organics[io].host && user.organics[io].param) { |
| 810 | params.organics.push(user.organics[io]); |
| 811 | } |
| 812 | } |
| 813 | } |
| 814 | |
| 815 | params.organics.push({ host: 'bing.com', param: 'q', display: 'bing' }); |
| 816 | params.organics.push({ host: 'yahoo.com', param: 'p', display: 'yahoo' }); |
| 817 | params.organics.push({ host: 'about.com', param: 'q', display: 'about' }); |
| 818 | params.organics.push({ host: 'aol.com', param: 'q', display: 'aol' }); |
| 819 | params.organics.push({ host: 'ask.com', param: 'q', display: 'ask' }); |
| 820 | params.organics.push({ host: 'globososo.com', param: 'q', display: 'globo' }); |
| 821 | params.organics.push({ host: 'go.mail.ru', param: 'q', display: 'go.mail.ru' }); |
| 822 | params.organics.push({ host: 'rambler.ru', param: 'query', display: 'rambler' }); |
| 823 | params.organics.push({ host: 'tut.by', param: 'query', display: 'tut.by' }); |
| 824 | |
| 825 | params.referrals.push({ host: 't.co', display: 'twitter.com' }); |
| 826 | params.referrals.push({ host: 'plus.url.google.com', display: 'plus.google.com' }); |
| 827 | |
| 828 | |
| 829 | return params; |
| 830 | |
| 831 | }, |
| 832 | |
| 833 | validate: { |
| 834 | |
| 835 | checkFloat: function(v) { |
| 836 | return v && this.isNumeric(parseFloat(v)) ? parseFloat(v) : false; |
| 837 | }, |
| 838 | |
| 839 | checkInt: function(v) { |
| 840 | return v && this.isNumeric(parseInt(v)) ? parseInt(v) : false; |
| 841 | }, |
| 842 | |
| 843 | isNumeric: function(v){ |
| 844 | return !isNaN(v); |
| 845 | }, |
| 846 | |
| 847 | isString: function(v) { |
| 848 | return Object.prototype.toString.call(v) === '[object String]'; |
| 849 | } |
| 850 | |
| 851 | } |
| 852 | |
| 853 | }; |
| 854 | },{"./helpers/uri":4,"./terms":9}],9:[function(_dereq_,module,exports){ |
| 855 | "use strict"; |
| 856 | |
| 857 | module.exports = { |
| 858 | |
| 859 | traffic: { |
| 860 | utm: 'utm', |
| 861 | organic: 'organic', |
| 862 | referral: 'referral', |
| 863 | typein: 'typein' |
| 864 | }, |
| 865 | |
| 866 | referer: { |
| 867 | referral: 'referral', |
| 868 | organic: 'organic', |
| 869 | social: 'social' |
| 870 | }, |
| 871 | |
| 872 | none: '(none)', |
| 873 | oops: '(Houston, we have a problem)' |
| 874 | |
| 875 | }; |
| 876 | |
| 877 | },{}]},{},[1])(1) |
| 878 | }); |