You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
382 lines
8.8 KiB
382 lines
8.8 KiB
var Tour = (function() { |
|
var t = [], |
|
o, cur |
|
T = { |
|
step: { |
|
pl: "krok", |
|
en: "step", |
|
be: "крок", |
|
ca: "pas", |
|
cs: "krok", |
|
da: "trin", |
|
de: "Schritt", |
|
el: "βήμα", |
|
es: "paso", |
|
et: "samm", |
|
fi: "vaihe", |
|
fr: "étape", |
|
hu: "lépés", |
|
it: "passo", |
|
lt: "žingsnis", |
|
lv: "solis", |
|
mk: "чекор", |
|
nl: "stap", |
|
no: "trinn", |
|
pt: "passo", |
|
ru: "шаг", |
|
sk: "krok", |
|
sl: "korak", |
|
sq: "hapi", |
|
sv: "steg", |
|
tr: "adım", |
|
uk: "крок" |
|
}, |
|
Next: { |
|
pl: "Następny", |
|
en: "Next", |
|
be: "Далей", |
|
ca: "Següent", |
|
cs: "Další", |
|
da: "Næste", |
|
de: "Weiter", |
|
el: "Την επόμενη", |
|
es: "Siguiente", |
|
et: "Järgmine", |
|
fi: "Seuraava", |
|
fr: "Prochaine", |
|
hu: "Következő", |
|
it: "Accanto", |
|
lt: "Kitas", |
|
lv: "Nākamā", |
|
mk: "Следна", |
|
nl: "Volgende", |
|
no: "Neste", |
|
pt: "Próximo", |
|
ru: "Далее", |
|
sk: "Ďalej", |
|
sl: "Naprej", |
|
sq: "Tjetër", |
|
sv: "Nästa", |
|
tr: "Gelecek", |
|
uk: "Далі" |
|
}, |
|
Previous: { |
|
pl: "Poprzedni", |
|
en: "Previous", |
|
be: "Папярэдні", |
|
ca: "Anteriors", |
|
cs: "Předchozí", |
|
da: "Tidligere", |
|
de: "Vorherige", |
|
el: "Προηγούμενο", |
|
es: "Anterior", |
|
et: "Eelmine", |
|
fi: "Edellinen", |
|
fr: "Précédente", |
|
hu: "Előző", |
|
it: "Precedente", |
|
lt: "Ankstesnis", |
|
lv: "Iepriekšējā", |
|
mk: "Претходна", |
|
nl: "Vorige", |
|
no: "Tidligere", |
|
pt: "Anterior", |
|
ru: "Предыдущий", |
|
sk: "Predchádzajúce", |
|
sl: "Prejšnji", |
|
sq: "E mëparshme", |
|
sv: "Föregående", |
|
tr: "Önceki", |
|
uk: "Попередній" |
|
}, |
|
Finish: { |
|
pl: "Zakończ", |
|
en: "Finish", |
|
be: "Аздабленне", |
|
ca: "Acabat", |
|
cs: "Dokončit", |
|
da: "Finish", |
|
de: "Finish", |
|
el: "Τελειώνει", |
|
es: "Acabado", |
|
et: "Lõpeta", |
|
fi: "Loppuun", |
|
fr: "Finition", |
|
hu: "Befejezés", |
|
it: "Finitura", |
|
lt: "Apdaila", |
|
lv: "Apdare", |
|
mk: "Заврши", |
|
nl: "Afwerking", |
|
no: "Ferdig", |
|
pt: "Acabamento", |
|
ru: "Отделка", |
|
sk: "Povrch", |
|
sl: "Zaključek", |
|
sq: "Finish", |
|
sv: "Avsluta", |
|
tr: "Bitir", |
|
uk: "Оздоблення" |
|
} |
|
}; |
|
|
|
function _t(s) { |
|
return T[s][t[cur].language] || T[s]['en']; |
|
} |
|
|
|
function step(n) { |
|
|
|
cur = n; |
|
$('.tourStep, .tourBg').remove(); |
|
|
|
if (!t[n]) { |
|
return; |
|
} |
|
|
|
$('body').append([ |
|
'<div class="tourStep popover" step="' + n + '">', |
|
'<div class="arrow"></div>', |
|
'<div class="card">', |
|
'<div class="card-header">', |
|
!t[n].close ? '' : '<button class="tourClose btn-close float-end">× </button>', |
|
'</div>', |
|
'<div class="card-body">', |
|
t[n].content, |
|
'</div>', |
|
'<div class="card-footer">', |
|
'<div class="pull-right">', |
|
'<div class="tourPrev btn btn-default btn-sm">' + _t('Previous') + '</div> ', |
|
'<div class="tourNext btn btn-primary btn-sm">' + _t('Next') + '</div>', |
|
'</div>', |
|
'</div>', |
|
'</div>', |
|
'</div>' |
|
].join('')); |
|
|
|
var el = $('.tourStep') |
|
.addClass(t[n].position) |
|
.css({ |
|
minWidth: 250 |
|
}), |
|
x = 0, |
|
y = 0; |
|
|
|
if (t[n].element && !!t[n].element.length) { |
|
var x1 = 1e6, |
|
y1 = 1e6, |
|
x2 = 0, |
|
y2 = 0; |
|
|
|
t[n].element.each(function(k, v) { |
|
var ofs = $(v).offset(); |
|
x1 = Math.min(x1, ofs.left + t[n].forceCorrectionLeft); |
|
y1 = Math.min(y1, ofs.top + t[n].forceCorrectionTop); |
|
|
|
x2 = Math.max(x2, ofs.left + t[n].forceCorrectionLeft + t[n].forceCorrectionWidth |
|
+ parseInt($(v).css('border-left-width')) |
|
+ parseInt($(v).css('padding-left')) |
|
+ $(v).width() |
|
+ parseInt($(v).css('padding-right')) |
|
+ parseInt($(v).css('border-right-width')) |
|
); |
|
|
|
y2 = Math.max(y2, ofs.top + t[n].forceCorrectionTop + t[n].forceCorrectionHeight |
|
+ parseInt($(v).css('border-top-width')) |
|
+ parseInt($(v).css('padding-top')) |
|
+ $(v).height() |
|
+ parseInt($(v).css('padding-bottom')) |
|
+ parseInt($(v).css('border-bottom-width')) |
|
); |
|
}); |
|
|
|
switch (t[n].position) { |
|
case 'top': |
|
y = y1 - el.height(); |
|
x = ((x1 + x2) >> 1) - (el.width() >> 1); |
|
break; |
|
|
|
case 'right': |
|
y = ((y1 + y2) >> 1) - (el.height()>> 1); |
|
x = x2; |
|
break; |
|
|
|
case 'left': |
|
y = ((y1 + y2) >> 1) - (el.height()>> 1); |
|
x = x1 - el.width(); |
|
break; |
|
|
|
case 'bottom': |
|
y = y2; |
|
x = ((x1 + x2) >> 1) - (el.width() >> 1); |
|
break; |
|
}; |
|
}; |
|
|
|
el |
|
.css({ |
|
position: 'absolute', |
|
left: x, |
|
top: y |
|
}) |
|
.show(); |
|
|
|
if (t[n].spotlight) { |
|
var p = t[n].padding; |
|
$('body').append(Array(5).join('<div class="tourBg"></div>')); |
|
|
|
var pos = [ |
|
{ |
|
bottom: 'auto', |
|
height: y1 - p |
|
}, |
|
{ |
|
top: y2 + p, |
|
height: $(document).height() - y2 - p |
|
}, |
|
{ |
|
right: 'auto', |
|
bottom: 'auto', |
|
top: y1 - p, |
|
width: x1 - p, |
|
height: 2 * p + y2 - y1 |
|
}, |
|
{ |
|
left: x2 + p, |
|
bottom: 'auto', |
|
top: y1 - p, |
|
height: 2 * p + y2 - y1 |
|
} |
|
]; |
|
|
|
$('.tourBg') |
|
.css({ |
|
position: 'absolute', |
|
zIndex: 1000, |
|
top: 0, |
|
bottom: 0, |
|
right: 0, |
|
left: 0, |
|
background: '#000', |
|
opacity: 0.3 |
|
}).each(function(k, v){ |
|
$(v).css(pos[k]); |
|
}); |
|
} |
|
|
|
if (!!t[n].scroll) { |
|
var my = ((Math.min(y, y1) + Math.max(y + el.height(), y2)) >> 1) - ($(window).height() >> 1), |
|
mx = ((Math.min(x, x1) + Math.max(x + el.width(), x2)) >> 1) - ($(window).width() >> 1); |
|
|
|
$('html, body').animate({ |
|
scrollTop: Math.max(0, Math.min(y, y1, my)), |
|
scrollLeft: Math.max(0, Math.min(x, x1, mx)) |
|
}); |
|
} |
|
|
|
if (!n) { |
|
$('.tourPrev').remove(); |
|
} |
|
|
|
if (n > t.length - 2) { |
|
$('.tourNext').text(_t('Finish')); |
|
} |
|
|
|
$('.tourStep') |
|
.on('click', '.tourNext:not([disabled])', Tour.next) |
|
.on('click', '.tourPrev:not([disabled])', Tour.prev) |
|
.on('click', '.tourClose:not([disabled])', Tour.close); |
|
|
|
(t[n].onstep || Tour.onstep || function(){})(t[n]); |
|
} |
|
|
|
$(window).on('resize', function() { |
|
if (!!Tour.onresize) { |
|
Tour.onresize(); |
|
} |
|
}); |
|
|
|
return { |
|
run: function(tour, options) { |
|
try { |
|
t = []; |
|
cur = 0; |
|
|
|
o = { |
|
close: true, |
|
content: '', |
|
language: 'en', |
|
padding: 5, |
|
position: 'right', |
|
scroll: true, |
|
spotlight: true, |
|
forceCorrectionLeft: 0, |
|
forceCorrectionTop: 0, |
|
forceCorrectionWidth: 0, |
|
forceCorrectionHeight: 0, |
|
onstep: null, |
|
}; |
|
|
|
for (var k in options) { |
|
o[k] = options[k]; |
|
} |
|
|
|
$(tour).each(function(k, v) { |
|
for (var kk in o) { |
|
v[kk] = v[kk] || o[kk]; |
|
}; |
|
|
|
if (v.element && !!v.element.length) { |
|
t.push(v); |
|
} |
|
}); |
|
|
|
step(cur); |
|
|
|
if (!!Tour.onstart) { |
|
Tour.onstart(); |
|
} |
|
} catch(e) {} |
|
}, |
|
|
|
next: function() { |
|
step(cur + 1); |
|
|
|
if (cur == t.length) { |
|
if (!!Tour.onfinish) { |
|
Tour.onfinish(); |
|
} |
|
} |
|
}, |
|
|
|
prev: function(){ |
|
step(cur - 1); |
|
}, |
|
|
|
current: function(){ |
|
return cur; |
|
}, |
|
|
|
close: function(){ |
|
step(-1); |
|
|
|
if (!!Tour.onclose) { |
|
Tour.onclose(); |
|
} |
|
}, |
|
|
|
onstart: null, |
|
onfinish: null, |
|
onclose: null, |
|
onstep: null, |
|
|
|
onresize: function() { |
|
var n = cur - 1; |
|
step(-1); |
|
cur = n; |
|
|
|
setTimeout(function() { |
|
Tour.next(); |
|
}, 20); |
|
} |
|
}; |
|
})(); |