@alexsab-ru/scripts 0.5.5 → 0.6.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -21
- package/README.md +153 -153
- package/README_RU.md +153 -153
- package/index.js +4 -4
- package/lib/analytics.js +111 -111
- package/lib/calltouch.js +73 -73
- package/lib/cookie.js +51 -51
- package/lib/form.js +320 -262
- package/package.json +29 -29
package/lib/analytics.js
CHANGED
|
@@ -1,111 +1,111 @@
|
|
|
1
|
-
window.dataLayer = window.dataLayer || [];
|
|
2
|
-
|
|
3
|
-
export function reachGoal(eventAction, t = {}) {
|
|
4
|
-
t.eventAction = eventAction;
|
|
5
|
-
dl("reachGoal-"+eventAction, {
|
|
6
|
-
...t
|
|
7
|
-
})
|
|
8
|
-
}
|
|
9
|
-
|
|
10
|
-
export function pageView(eventAction, t = {}) {
|
|
11
|
-
t.eventAction = eventAction;
|
|
12
|
-
dl("pageView-"+eventAction, {
|
|
13
|
-
...t
|
|
14
|
-
})
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
export function dl(event, t = {}) {
|
|
18
|
-
// console.log(event, t);
|
|
19
|
-
void 0 !== window.dataLayer && window.dataLayer.push({
|
|
20
|
-
event: event,
|
|
21
|
-
...t
|
|
22
|
-
})
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
export function getFormDataObject(formData, form_id) {
|
|
26
|
-
let obj = {"eventProperties":{}};
|
|
27
|
-
formData.forEach((value, key) => (obj["eventProperties"][key] = value));
|
|
28
|
-
obj['eventCategory'] = 'Lead';
|
|
29
|
-
obj["eventProperties"]['formID'] = form_id;
|
|
30
|
-
obj['sourceName'] = 'page';
|
|
31
|
-
return obj;
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
export function ymGoal(goalName,goalParams) {
|
|
35
|
-
try {
|
|
36
|
-
Ya._metrika.getCounters().forEach((me)=>{
|
|
37
|
-
ym(me.id, "reachGoal", goalName, goalParams||{})
|
|
38
|
-
})
|
|
39
|
-
} catch (err) {
|
|
40
|
-
console.error(goalName + ' - error send goal to Metrika');
|
|
41
|
-
}
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
export function ymPage(pageName,goalParams) {
|
|
45
|
-
try {
|
|
46
|
-
Ya._metrika.getCounters().forEach((me)=>{
|
|
47
|
-
ym(me.id, "hit", pageName, goalParams||{})
|
|
48
|
-
})
|
|
49
|
-
} catch (err) {
|
|
50
|
-
console.error(pageName + ' - error send page to Metrika');
|
|
51
|
-
}
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
export function addClickCopyContextmenuGoals(item, prefix) {
|
|
55
|
-
item.addEventListener('click', function(evt) {
|
|
56
|
-
reachGoal(prefix + '_click');
|
|
57
|
-
});
|
|
58
|
-
item.addEventListener('copy', function(evt) {
|
|
59
|
-
reachGoal(prefix + '_copy');
|
|
60
|
-
});
|
|
61
|
-
item.addEventListener('contextmenu', function(evt) {
|
|
62
|
-
reachGoal(prefix + '_contextmenu');
|
|
63
|
-
});
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
document.querySelectorAll('a[href^\="tel:"]').forEach((tel)=>{
|
|
67
|
-
addClickCopyContextmenuGoals(tel, "phone");
|
|
68
|
-
});
|
|
69
|
-
document.querySelectorAll('a[href^\="mailto:"]').forEach((tel)=>{
|
|
70
|
-
addClickCopyContextmenuGoals(tel, "email");
|
|
71
|
-
});
|
|
72
|
-
|
|
73
|
-
let goals = [
|
|
74
|
-
{
|
|
75
|
-
selector: 'form input',
|
|
76
|
-
action: 'click',
|
|
77
|
-
goal: 'form_click',
|
|
78
|
-
title: 'Клик в поле любой формы',
|
|
79
|
-
},
|
|
80
|
-
{
|
|
81
|
-
selector: 'form input',
|
|
82
|
-
action: 'change',
|
|
83
|
-
goal: 'form_change',
|
|
84
|
-
title: 'Изменения полей любой формы',
|
|
85
|
-
},
|
|
86
|
-
|
|
87
|
-
];
|
|
88
|
-
|
|
89
|
-
goals.forEach(function(value, index, array){
|
|
90
|
-
if(value.goal != null) {
|
|
91
|
-
document.querySelectorAll(value.selector).forEach(function(element) {
|
|
92
|
-
// console.log("Set \"" + value.goal + "\" goal", element);
|
|
93
|
-
element.addEventListener(value.action, function(){
|
|
94
|
-
reachGoal(value.goal, {
|
|
95
|
-
title: value.title,
|
|
96
|
-
});
|
|
97
|
-
});
|
|
98
|
-
});
|
|
99
|
-
} else if(value.hit != null) {
|
|
100
|
-
document.querySelectorAll(value.selector).forEach(function(element) {
|
|
101
|
-
// console.log("Set \"" + value.goal + "\" hit", element);
|
|
102
|
-
element.addEventListener(value.action, function(){
|
|
103
|
-
pageView(value.hit, {
|
|
104
|
-
title: value.title,
|
|
105
|
-
});
|
|
106
|
-
});
|
|
107
|
-
});
|
|
108
|
-
} else {
|
|
109
|
-
console.warn("Ошибка в списке целей", value);
|
|
110
|
-
}
|
|
111
|
-
});
|
|
1
|
+
window.dataLayer = window.dataLayer || [];
|
|
2
|
+
|
|
3
|
+
export function reachGoal(eventAction, t = {}) {
|
|
4
|
+
t.eventAction = eventAction;
|
|
5
|
+
dl("reachGoal-"+eventAction, {
|
|
6
|
+
...t
|
|
7
|
+
})
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
export function pageView(eventAction, t = {}) {
|
|
11
|
+
t.eventAction = eventAction;
|
|
12
|
+
dl("pageView-"+eventAction, {
|
|
13
|
+
...t
|
|
14
|
+
})
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
export function dl(event, t = {}) {
|
|
18
|
+
// console.log(event, t);
|
|
19
|
+
void 0 !== window.dataLayer && window.dataLayer.push({
|
|
20
|
+
event: event,
|
|
21
|
+
...t
|
|
22
|
+
})
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
export function getFormDataObject(formData, form_id) {
|
|
26
|
+
let obj = {"eventProperties":{}};
|
|
27
|
+
formData.forEach((value, key) => (obj["eventProperties"][key] = value));
|
|
28
|
+
obj['eventCategory'] = 'Lead';
|
|
29
|
+
obj["eventProperties"]['formID'] = form_id;
|
|
30
|
+
obj['sourceName'] = 'page';
|
|
31
|
+
return obj;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
export function ymGoal(goalName,goalParams) {
|
|
35
|
+
try {
|
|
36
|
+
Ya._metrika.getCounters().forEach((me)=>{
|
|
37
|
+
ym(me.id, "reachGoal", goalName, goalParams||{})
|
|
38
|
+
})
|
|
39
|
+
} catch (err) {
|
|
40
|
+
console.error(goalName + ' - error send goal to Metrika');
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
export function ymPage(pageName,goalParams) {
|
|
45
|
+
try {
|
|
46
|
+
Ya._metrika.getCounters().forEach((me)=>{
|
|
47
|
+
ym(me.id, "hit", pageName, goalParams||{})
|
|
48
|
+
})
|
|
49
|
+
} catch (err) {
|
|
50
|
+
console.error(pageName + ' - error send page to Metrika');
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
export function addClickCopyContextmenuGoals(item, prefix) {
|
|
55
|
+
item.addEventListener('click', function(evt) {
|
|
56
|
+
reachGoal(prefix + '_click');
|
|
57
|
+
});
|
|
58
|
+
item.addEventListener('copy', function(evt) {
|
|
59
|
+
reachGoal(prefix + '_copy');
|
|
60
|
+
});
|
|
61
|
+
item.addEventListener('contextmenu', function(evt) {
|
|
62
|
+
reachGoal(prefix + '_contextmenu');
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
document.querySelectorAll('a[href^\="tel:"]').forEach((tel)=>{
|
|
67
|
+
addClickCopyContextmenuGoals(tel, "phone");
|
|
68
|
+
});
|
|
69
|
+
document.querySelectorAll('a[href^\="mailto:"]').forEach((tel)=>{
|
|
70
|
+
addClickCopyContextmenuGoals(tel, "email");
|
|
71
|
+
});
|
|
72
|
+
|
|
73
|
+
let goals = [
|
|
74
|
+
{
|
|
75
|
+
selector: 'form input',
|
|
76
|
+
action: 'click',
|
|
77
|
+
goal: 'form_click',
|
|
78
|
+
title: 'Клик в поле любой формы',
|
|
79
|
+
},
|
|
80
|
+
{
|
|
81
|
+
selector: 'form input',
|
|
82
|
+
action: 'change',
|
|
83
|
+
goal: 'form_change',
|
|
84
|
+
title: 'Изменения полей любой формы',
|
|
85
|
+
},
|
|
86
|
+
|
|
87
|
+
];
|
|
88
|
+
|
|
89
|
+
goals.forEach(function(value, index, array){
|
|
90
|
+
if(value.goal != null) {
|
|
91
|
+
document.querySelectorAll(value.selector).forEach(function(element) {
|
|
92
|
+
// console.log("Set \"" + value.goal + "\" goal", element);
|
|
93
|
+
element.addEventListener(value.action, function(){
|
|
94
|
+
reachGoal(value.goal, {
|
|
95
|
+
title: value.title,
|
|
96
|
+
});
|
|
97
|
+
});
|
|
98
|
+
});
|
|
99
|
+
} else if(value.hit != null) {
|
|
100
|
+
document.querySelectorAll(value.selector).forEach(function(element) {
|
|
101
|
+
// console.log("Set \"" + value.goal + "\" hit", element);
|
|
102
|
+
element.addEventListener(value.action, function(){
|
|
103
|
+
pageView(value.hit, {
|
|
104
|
+
title: value.title,
|
|
105
|
+
});
|
|
106
|
+
});
|
|
107
|
+
});
|
|
108
|
+
} else {
|
|
109
|
+
console.warn("Ошибка в списке целей", value);
|
|
110
|
+
}
|
|
111
|
+
});
|
package/lib/calltouch.js
CHANGED
|
@@ -1,74 +1,74 @@
|
|
|
1
|
-
export const createRequest = (routeKey, phoneValue, verbose = false) => {
|
|
2
|
-
return new Promise((resolve, reject) => {
|
|
3
|
-
let errorText = '';
|
|
4
|
-
if(window.ctw) {
|
|
5
|
-
window.ctw.getRouteKeyData(routeKey, function(success, data){
|
|
6
|
-
verbose && console.log(success, data);
|
|
7
|
-
if (success) {
|
|
8
|
-
if (data.widgetFound) {
|
|
9
|
-
if (data.widgetData.callCenterWorkingMode == 'working_hours') {
|
|
10
|
-
verbose && console.log('колл-центр работает, отображение виджета');
|
|
11
|
-
} else {
|
|
12
|
-
if (data.widgetData.collectNonWorkingRequests) {
|
|
13
|
-
verbose && console.log('колл-центр не работает, но можем отобразить форму нерабочего времени');
|
|
14
|
-
} else {
|
|
15
|
-
verbose && console.log('колл-центр не работает, заявки в нерабочее время не собираем');
|
|
16
|
-
}
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
var phone_ct = phoneValue.replace(/[^0-9]/gim, '');
|
|
20
|
-
if (phone_ct[0] == '8') { phone_ct = phone_ct.substring(1); }
|
|
21
|
-
if (phone_ct[0] == '7') { phone_ct = phone_ct.substring(1); }
|
|
22
|
-
phone_ct = '7' + phone_ct;
|
|
23
|
-
|
|
24
|
-
window.ctw.createRequest(
|
|
25
|
-
routeKey,
|
|
26
|
-
phone_ct,
|
|
27
|
-
[],
|
|
28
|
-
function (success, data) {
|
|
29
|
-
verbose && console.log(success, data)
|
|
30
|
-
if (success) {
|
|
31
|
-
verbose && console.log('Создана заявка на колбек, идентификатор: ' + data.callbackRequestId);
|
|
32
|
-
resolve(data); // Разрешаем Promise данными от createRequest
|
|
33
|
-
}
|
|
34
|
-
else {
|
|
35
|
-
errorText = 'Error in createRequest';
|
|
36
|
-
switch (data.type) {
|
|
37
|
-
case "request_throttle_timeout":
|
|
38
|
-
case "request_throttle_count":
|
|
39
|
-
errorText = 'Достигнут лимит создания заявок, попробуйте позже';
|
|
40
|
-
verbose && console.log(errorText);
|
|
41
|
-
break;
|
|
42
|
-
case "request_phone_blacklisted":
|
|
43
|
-
errorText = 'номер телефона находится в черном списке';
|
|
44
|
-
verbose && console.log(errorText);
|
|
45
|
-
break;
|
|
46
|
-
case "validation_error":
|
|
47
|
-
errorText = 'были переданы некорректные данные';
|
|
48
|
-
verbose && console.log(errorText);
|
|
49
|
-
break;
|
|
50
|
-
default:
|
|
51
|
-
errorText = 'Во время выполнения запроса произошла ошибка: ' + data.type;
|
|
52
|
-
verbose && console.log(errorText);
|
|
53
|
-
}
|
|
54
|
-
reject(errorText); // Отклоняем Promise в случае ошибки
|
|
55
|
-
}
|
|
56
|
-
}
|
|
57
|
-
);
|
|
58
|
-
} else {
|
|
59
|
-
errorText = 'не найден включенный виджет '+routeKey+', либо услуга обратного звонка не активна';
|
|
60
|
-
verbose && console.log(errorText);
|
|
61
|
-
reject(errorText);
|
|
62
|
-
}
|
|
63
|
-
} else {
|
|
64
|
-
errorText = 'во время обработки произошла ошибка';
|
|
65
|
-
verbose && console.log(errorText);
|
|
66
|
-
verbose && console.log(data)
|
|
67
|
-
reject(errorText);
|
|
68
|
-
}
|
|
69
|
-
});
|
|
70
|
-
} else {
|
|
71
|
-
reject("window.ctw is not defined");
|
|
72
|
-
}
|
|
73
|
-
});
|
|
1
|
+
export const createRequest = (routeKey, phoneValue, verbose = false) => {
|
|
2
|
+
return new Promise((resolve, reject) => {
|
|
3
|
+
let errorText = '';
|
|
4
|
+
if(window.ctw) {
|
|
5
|
+
window.ctw.getRouteKeyData(routeKey, function(success, data){
|
|
6
|
+
verbose && console.log(success, data);
|
|
7
|
+
if (success) {
|
|
8
|
+
if (data.widgetFound) {
|
|
9
|
+
if (data.widgetData.callCenterWorkingMode == 'working_hours') {
|
|
10
|
+
verbose && console.log('колл-центр работает, отображение виджета');
|
|
11
|
+
} else {
|
|
12
|
+
if (data.widgetData.collectNonWorkingRequests) {
|
|
13
|
+
verbose && console.log('колл-центр не работает, но можем отобразить форму нерабочего времени');
|
|
14
|
+
} else {
|
|
15
|
+
verbose && console.log('колл-центр не работает, заявки в нерабочее время не собираем');
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
var phone_ct = phoneValue.replace(/[^0-9]/gim, '');
|
|
20
|
+
if (phone_ct[0] == '8') { phone_ct = phone_ct.substring(1); }
|
|
21
|
+
if (phone_ct[0] == '7') { phone_ct = phone_ct.substring(1); }
|
|
22
|
+
phone_ct = '7' + phone_ct;
|
|
23
|
+
|
|
24
|
+
window.ctw.createRequest(
|
|
25
|
+
routeKey,
|
|
26
|
+
phone_ct,
|
|
27
|
+
[],
|
|
28
|
+
function (success, data) {
|
|
29
|
+
verbose && console.log(success, data)
|
|
30
|
+
if (success) {
|
|
31
|
+
verbose && console.log('Создана заявка на колбек, идентификатор: ' + data.callbackRequestId);
|
|
32
|
+
resolve(data); // Разрешаем Promise данными от createRequest
|
|
33
|
+
}
|
|
34
|
+
else {
|
|
35
|
+
errorText = 'Error in createRequest';
|
|
36
|
+
switch (data.type) {
|
|
37
|
+
case "request_throttle_timeout":
|
|
38
|
+
case "request_throttle_count":
|
|
39
|
+
errorText = 'Достигнут лимит создания заявок, попробуйте позже';
|
|
40
|
+
verbose && console.log(errorText);
|
|
41
|
+
break;
|
|
42
|
+
case "request_phone_blacklisted":
|
|
43
|
+
errorText = 'номер телефона находится в черном списке';
|
|
44
|
+
verbose && console.log(errorText);
|
|
45
|
+
break;
|
|
46
|
+
case "validation_error":
|
|
47
|
+
errorText = 'были переданы некорректные данные';
|
|
48
|
+
verbose && console.log(errorText);
|
|
49
|
+
break;
|
|
50
|
+
default:
|
|
51
|
+
errorText = 'Во время выполнения запроса произошла ошибка: ' + data.type;
|
|
52
|
+
verbose && console.log(errorText);
|
|
53
|
+
}
|
|
54
|
+
reject(errorText); // Отклоняем Promise в случае ошибки
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
);
|
|
58
|
+
} else {
|
|
59
|
+
errorText = 'не найден включенный виджет '+routeKey+', либо услуга обратного звонка не активна';
|
|
60
|
+
verbose && console.log(errorText);
|
|
61
|
+
reject(errorText);
|
|
62
|
+
}
|
|
63
|
+
} else {
|
|
64
|
+
errorText = 'во время обработки произошла ошибка';
|
|
65
|
+
verbose && console.log(errorText);
|
|
66
|
+
verbose && console.log(data)
|
|
67
|
+
reject(errorText);
|
|
68
|
+
}
|
|
69
|
+
});
|
|
70
|
+
} else {
|
|
71
|
+
reject("window.ctw is not defined");
|
|
72
|
+
}
|
|
73
|
+
});
|
|
74
74
|
};
|
package/lib/cookie.js
CHANGED
|
@@ -1,52 +1,52 @@
|
|
|
1
|
-
export function getCookie(name)
|
|
2
|
-
{
|
|
3
|
-
let matches = document.cookie.match(new RegExp(
|
|
4
|
-
"(?:^|; )" + name.replace(/([\.$?*|{}\(\)\[\]\\\/\+^])/g, '\\$1') + "=([^;]*)"
|
|
5
|
-
));
|
|
6
|
-
return matches ? decodeURIComponent(matches[1]) : undefined;
|
|
7
|
-
}
|
|
8
|
-
|
|
9
|
-
export function setCookie(name, value, props)
|
|
10
|
-
{
|
|
11
|
-
props = props || {}
|
|
12
|
-
var exp = props.expires
|
|
13
|
-
if (typeof exp == "number" && exp) {
|
|
14
|
-
var d = new Date()
|
|
15
|
-
d.setTime(d.getTime() + exp*1000)
|
|
16
|
-
exp = props.expires = d
|
|
17
|
-
}
|
|
18
|
-
if(exp && exp.toUTCString) { props.expires = exp.toUTCString() }
|
|
19
|
-
value = encodeURIComponent(value)
|
|
20
|
-
var updatedCookie = name + "=" + value
|
|
21
|
-
for(var propName in props){
|
|
22
|
-
updatedCookie += "; " + propName
|
|
23
|
-
var propValue = props[propName]
|
|
24
|
-
if(propValue !== true){ updatedCookie += "=" + propValue }
|
|
25
|
-
}
|
|
26
|
-
document.cookie = updatedCookie
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
export function deleteCookie(name)
|
|
30
|
-
{
|
|
31
|
-
setCookie(name, null, { 'domain':
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
export function cookiecook(days = 90)
|
|
35
|
-
{
|
|
36
|
-
let cookiecook = getCookie("cookiecook"),
|
|
37
|
-
cookiewin = document.querySelector('.cookie_notice');
|
|
38
|
-
|
|
39
|
-
if (cookiecook != "no") {
|
|
40
|
-
|
|
41
|
-
cookiewin.classList.remove("hidden");
|
|
42
|
-
|
|
43
|
-
document.getElementById("cookie_close").addEventListener("click", function(e){
|
|
44
|
-
e.preventDefault();
|
|
45
|
-
cookiewin.classList.add("hidden");
|
|
46
|
-
|
|
47
|
-
let date = new Date;
|
|
48
|
-
date.setDate(date.getDate() + days);
|
|
49
|
-
document.cookie = "cookiecook=no; path=/; expires=" + date.toUTCString();
|
|
50
|
-
});
|
|
51
|
-
}
|
|
1
|
+
export function getCookie(name)
|
|
2
|
+
{
|
|
3
|
+
let matches = document.cookie.match(new RegExp(
|
|
4
|
+
"(?:^|; )" + name.replace(/([\.$?*|{}\(\)\[\]\\\/\+^])/g, '\\$1') + "=([^;]*)"
|
|
5
|
+
));
|
|
6
|
+
return matches ? decodeURIComponent(matches[1]) : undefined;
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
export function setCookie(name, value, props)
|
|
10
|
+
{
|
|
11
|
+
props = props || {}
|
|
12
|
+
var exp = props.expires
|
|
13
|
+
if (typeof exp == "number" && exp) {
|
|
14
|
+
var d = new Date()
|
|
15
|
+
d.setTime(d.getTime() + exp*1000)
|
|
16
|
+
exp = props.expires = d
|
|
17
|
+
}
|
|
18
|
+
if(exp && exp.toUTCString) { props.expires = exp.toUTCString() }
|
|
19
|
+
value = encodeURIComponent(value)
|
|
20
|
+
var updatedCookie = name + "=" + value
|
|
21
|
+
for(var propName in props){
|
|
22
|
+
updatedCookie += "; " + propName
|
|
23
|
+
var propValue = props[propName]
|
|
24
|
+
if(propValue !== true){ updatedCookie += "=" + propValue }
|
|
25
|
+
}
|
|
26
|
+
document.cookie = updatedCookie
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
export function deleteCookie(name)
|
|
30
|
+
{
|
|
31
|
+
setCookie(name, null, { 'domain':window.location.hostname,'path':'/','expires': -1 })
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
export function cookiecook(days = 90)
|
|
35
|
+
{
|
|
36
|
+
let cookiecook = getCookie("cookiecook"),
|
|
37
|
+
cookiewin = document.querySelector('.cookie_notice');
|
|
38
|
+
|
|
39
|
+
if (cookiecook != "no") {
|
|
40
|
+
|
|
41
|
+
cookiewin.classList.remove("hidden");
|
|
42
|
+
|
|
43
|
+
document.getElementById("cookie_close").addEventListener("click", function(e){
|
|
44
|
+
e.preventDefault();
|
|
45
|
+
cookiewin.classList.add("hidden");
|
|
46
|
+
|
|
47
|
+
let date = new Date;
|
|
48
|
+
date.setDate(date.getDate() + days);
|
|
49
|
+
document.cookie = "cookiecook=no; path=/; expires=" + date.toUTCString();
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
52
|
}
|