var Main = {
CHECK_PERIOD: 400,
UPDATE_PERIOD: 1200,
FORCE_UPDATE_PERIOD: 5000,
init: function() {
Aj.onLoad(function(state) {
var cont = Aj.ajContainer;
$(window).on('resize', Main.onResize);
$('.js-logo-hoverable').on('mouseover', Main.ePlayLogo);
$('.js-logo-clickable').on('click', Main.ePlayLogo);
$('.js-logo-icon').on('animationend', Main.eLogoAnimEnd);
$(cont).on('click.curPage', '.js-header-menu-button', Main.eHeaderMenu);
$(cont).on('click.curPage', '.js-header-menu-close-button', Main.eHeaderMenuClose);
$(cont).on('click.curPage', '.js-btn-tonkeeper', Main.eTonkeeperOpen);
$(cont).on('click.curPage', '.js-auction-unavail', Main.eAuctionUnavailable);
$(cont).on('click.curPage', '.js-howitworks', Main.eHowitworks);
$(cont).on('click.curPage', '.js-howofferworks', Main.eHowofferworks);
$(cont).on('click.curPage', '.js-bots-about', Main.eBotsAbout);
$(cont).on('click.curPage', '.logout-link', Login.logOut);
$(cont).on('click.curPage', '.ton-logout-link', Login.tonLogOut);
$(cont).on('click.curPage', '.js-copy-code', Main.copyCode);
$(cont).on('click.curPage', '.js-main-search-dd-item', Main.eMainSearchDDSelected);
state.$headerMenu = $('.js-header-menu');
state.$unavailPopup = $('.js-unavailable-popup');
state.$howitworksPopup = $('.js-howitworks-popup');
state.$howofferworksPopup = $('.js-howofferworks-popup');
state.$botsaboutPopup = $('.js-botsabout-popup');
state.$mainSearchField = $('.js-main-search-field');
state.$mainSearchForm = $('.js-main-search-form');
state.$mainSearchForm.on('submit', Main.eMainSearchSubmit);
state.$mainSearchForm.field('query').on('input', Main.eMainSearchInput);
state.mainSearchCache = {};
$('.js-form-clear', state.$mainSearchForm).on('click', Main.eMainSearchClear);
Main.updateTime();
Main.initViewport();
Main.initLogo();
});
Aj.onUnload(function(state) {
clearTimeout(Aj.state.searchTimeout);
$(window).off('resize', Main.onResize);
$('.js-logo-hoverable').off('mouseover', Main.ePlayLogo);
$('.js-logo-clickable').off('click', Main.ePlayLogo);
$('.js-logo-icon').off('animationend', Main.eLogoAnimEnd);
state.$mainSearchForm.off('submit', Main.eMainSearchSubmit);
state.$mainSearchForm.field('query').off('input', Main.eMainSearchInput);
$('.js-form-clear', state.$mainSearchForm).off('click', Main.eMainSearchClear);
});
},
initForm: function(form) {
var $form = $(form);
$('.form-control:has(+.form-control-hint)', $form).on('keyup change input', Main.eUpdateFieldHint);
$('.js-amount-input', $form).on('keyup change input', Main.eUpdateAmountField);
$('.js-amount-input', $form).trigger('input');
},
destroyForm: function(form) {
var $form = $(form);
$('.form-control:has(+.form-control-hint)', $form).off('keyup change input', Main.eUpdateFieldHint);
$('.js-amount-input', $form).off('keyup change input', Main.eUpdateAmountField);
},
updateTime: function() {
var now = Math.round(+(new Date) / 1000);
if (Main._lastUpdateTime != now) {
Main._lastUpdateTime = now;
$('time[datetime]', Aj.ajContainer).each(function () {
var $time = $(this), datetime = $time.attr('datetime');
var mode = $time.attr('data-relative');
if (mode) {
var date = new Date(datetime);
var cur_date = new Date();
var time_left = Math.floor((date - cur_date) / 1000);
if (mode == 'ago-text') {
time_left = -time_left;
}
var ended = time_left < 0;
if (time_left < 0) time_left = 0;
var days = Math.floor(time_left / 86400);
var hours = Math.floor((time_left % 86400) / 3600);
var minutes = Math.floor((time_left % 3600) / 60);
var seconds = (time_left % 60);
var days_html = l('{n:# days|# day|# days}', {n: days});
if (mode == 'counter') {
var hours0 = Math.floor(hours / 10);
var hours1 = hours % 10;
var minutes0 = Math.floor(minutes / 10);
var minutes1 = minutes % 10;
var seconds0 = Math.floor(seconds / 10);
var seconds1 = seconds % 10;
Main.updateDigit($('.timer-d', this), days_html);
Main.updateDigit($('.timer-h0', this), hours0);
Main.updateDigit($('.timer-h1', this), hours1);
Main.updateDigit($('.timer-m0', this), minutes0);
Main.updateDigit($('.timer-m1', this), minutes1);
Main.updateDigit($('.timer-s0', this), seconds0);
Main.updateDigit($('.timer-s1', this), seconds1);
} else {
var arr = [];
if (days > 0) {
arr.push(days_html);
}
if (arr.length || hours > 0) {
arr.push(l('{n:# hours|# hour|# hours}', {n: hours}));
}
if (arr.length || minutes > 0) {
arr.push(l('{n:# minutes|# minute|# minutes}', {n: minutes}));
}
if (!days && !hours && (mode == 'text' || !minutes)) {
arr.push(l('{n:# seconds|# second|# seconds}', {n: seconds}));
}
arr = arr.slice(0, mode == 'short-text' ? 2 : (mode == 'ago-text' ? 1 : 3));
var text = arr.join(' ');
if (text != $time.text()) {
$time.text(text);
}
}
$(this).closest('.js-timer-wrap').toggleClass('ended', ended);
} else {
var title = $time.attr('title'),
html = $time.html(),
new_html = formatDateTime(datetime, false, !$time.hasClass('short'));
if (html != new_html) {
$time.html(new_html);
}
$time.removeAttr('datetime');
}
});
}
requestAnimationFrame(Main.updateTime);
},
updateDigit: function($el, value) {
var cur_value = $el.attr('data-val');
if (cur_value != value) {
$el.removeAttr('data-prev-val');
$el.map(function(){ this.offsetTop; });
$el.attr('data-val', value);
$el.attr('data-prev-val', cur_value);
}
},
fitUsername: function($el) {
$el.each(function(){
var init_size = $(this).data('init-size');
if (!init_size) {
init_size = parseInt($(this).css('font-size'));
$(this).data('init-size', init_size);
}
var size = parseInt($(this).css('font-size'));
size = parseInt(size);
while (this.scrollWidth > this.offsetWidth) {
size -= 0.5;
if (size >= init_size * 0.65) {
$(this).css('font-size', size + 'px');
} else {
break;
}
}
var text = $(this).attr('title') || $(this).text();
var prefix_len = text.length - 3;
while (this.scrollWidth > this.offsetWidth &&
prefix_len > 3) {
prefix_len--;
$(this).text(text.substr(0, prefix_len) + '…' + text.substr(-3));
}
});
},
initViewport: function() {
if (!window.$viewportHelper) {
window.$viewportHelper = $('
').css({position: 'absolute', left: '-100px', top: '0', height: '100vh'}).appendTo('body');
}
Main.onResize();
},
onResize: function() {
var vh = window.innerHeight;
if (window.$viewportHelper && window.$viewportHelper.height() != vh) {
document.documentElement.style.setProperty('--viewport-height', vh + 'px');
} else {
document.documentElement.style.removeProperty('--viewport-height');
}
},
initLogo: function() {
if (!Aj.globalState.logoInited) {
Aj.globalState.logoInited = true;
var main_url = '/img/TelemintLogoSprite1.svg';
var mainLogo = new Image();
mainLogo.onload = function() {
Aj.globalState.logoImageMain = main_url;
$('.js-header-logo').each(function() {
Main.playLogo(this, true);
});
};
mainLogo.src = main_url;
var url2 = '/img/TelemintLogoSprite2.svg';
var logo2 = new Image();
logo2.onload = function() {
Aj.globalState.logoImage2 = url2;
};
logo2.src = url2;
var url3 = '/img/TelemintLogoSprite3.svg';
var logo3 = new Image();
logo3.onload = function() {
Aj.globalState.logoImage3 = url3;
};
logo3.src = url3;
}
},
ePlayLogo: function(e) {
Main.playLogo(this);
},
playLogo: function(el, init_logo) {
var $el = $(el);
if (!$el.hasClass('play')) {
var url = Aj.globalState.logoImageMain;
if (!init_logo && $el.hasClass('js-random-logo')) {
var rnd = Math.random();
if (rnd > 0.9 && Aj.globalState.logoImage3) {
url = Aj.globalState.logoImage3;
} else if (rnd > 0.8 && Aj.globalState.logoImage2) {
url = Aj.globalState.logoImage2;
}
}
$el.each(function() {
this.style.setProperty('--image-url-logo-icon-animated', 'url(\'' + url + '\')');
});
$el.addClass('play');
}
},
eLogoAnimEnd: function(e) {
$(this).parents('.js-logo').removeClass('play');
},
eHeaderMenu: function(e) {
e.preventDefault();
openPopup(Aj.state.$headerMenu, {
noAppend: true
});
},
eHeaderMenuClose: function(e) {
e.preventDefault();
closePopup(Aj.state.$headerMenu);
},
eAuctionUnavailable: function(e) {
e.preventDefault();
var username = $(this).attr('data-username');
var later = +$(this).attr('data-later');
var onEnterPress = function(e) {
if (e.keyCode == Keys.RETURN) {
e.stopImmediatePropagation();
closePopup(Aj.state.$unavailPopup);
}
};
openPopup(Aj.state.$unavailPopup, {
onOpen: function() {
$('.js-username', this).html(username);
$('.js-unavailable-text', this).toggleClass('hide', !!later);
$('.js-available-later-text', this).toggleClass('hide', !later);
$(document).on('keydown', onEnterPress);
},
onClose: function() {
$(document).off('keydown', onEnterPress);
}
});
},
eHowitworks: function(e) {
e.preventDefault();
e.stopImmediatePropagation();
var onEnterPress = function(e) {
if (e.keyCode == Keys.RETURN) {
e.stopImmediatePropagation();
closePopup(Aj.state.$howitworksPopup);
}
};
openPopup(Aj.state.$howitworksPopup, {
onOpen: function() {
$(document).on('keydown', onEnterPress);
},
onClose: function() {
$(document).off('keydown', onEnterPress);
}
});
},
eHowofferworks: function(e) {
e.preventDefault();
e.stopImmediatePropagation();
var onEnterPress = function(e) {
if (e.keyCode == Keys.RETURN) {
e.stopImmediatePropagation();
closePopup(Aj.state.$howofferworksPopup);
}
};
openPopup(Aj.state.$howofferworksPopup, {
onOpen: function() {
$(document).on('keydown', onEnterPress);
},
onClose: function() {
$(document).off('keydown', onEnterPress);
}
});
},
eBotsAbout: function(e) {
e.preventDefault();
e.stopImmediatePropagation();
var onEnterPress = function(e) {
if (e.keyCode == Keys.RETURN) {
e.stopImmediatePropagation();
closePopup(Aj.state.$botsaboutPopup);
}
};
openPopup(Aj.state.$botsaboutPopup, {
onOpen: function() {
$(document).on('keydown', onEnterPress);
},
onClose: function() {
$(document).off('keydown', onEnterPress);
}
});
},
amountFieldValue: function($form, field) {
var $fieldEl = field ? $form.field(field) : $form;
var minValue = $fieldEl.attr('data-min') || null;
var maxValue = $fieldEl.attr('data-max') || null;
var decPoint = $fieldEl.attr('data-dec-point') || '.';
var value = $fieldEl.value();
var float_value = value.length ? value : '0';
if (decPoint != '.') {
float_value.split(decPoint).join('.');
}
float_value = parseFloat(float_value);
if (isNaN(float_value) || float_value >= 1e12) {
return false;
}
if (minValue !== null && float_value < minValue ||
maxValue !== null && float_value > maxValue) {
return false;
} else {
return float_value;
}
},
eUpdateFieldHint: function(e) {
var $fieldEl = $(this);
var has_value = $fieldEl.value().length > 0;
$('+.form-control-hint', $fieldEl).toggle(has_value);
},
eUpdateAmountField: function(e) {
var $fieldEl = $(this);
var minValue = $fieldEl.attr('data-min') || null;
var maxValue = $fieldEl.attr('data-max') || null;
var decPoint = $fieldEl.attr('data-dec-point') || '.';
var decimals = $fieldEl.attr('data-decimals') || 0;
var sel_dir = this.selectionDirection;
var sel_start = this.selectionStart;
var sel_end = this.selectionEnd;
var value = this.value;
var new_sel_start = sel_start;
var new_sel_end = sel_end;
var new_value = '';
var has_decimal = false;
var chars_len = 0;
var decimal_len = 0;
for (var i = 0; i < value.length; i++) {
var char = value[i];
if ((char == '.' || char == ',') && !has_decimal && decimals > 0) {
if (!chars_len) {
new_value += '0';
if (i < sel_start) new_sel_start++;
if (i < sel_end) new_sel_end++;
}
has_decimal = true;
new_value += decPoint;
} else if (char >= '0' && char <= '9' && chars_len < 12 && (!has_decimal || decimal_len < decimals)) {
new_value += char;
if (has_decimal) decimal_len++;
else chars_len++;
} else {
if (i < sel_start) new_sel_start--;
if (i < sel_end) new_sel_end--;
}
}
this.value = new_value;
this.setSelectionRange(new_sel_start, new_sel_end, sel_dir);
var float_value = new_value.length ? new_value : '0';
if (decPoint != '.') {
float_value.split(decPoint).join('.');
}
float_value = parseFloat(float_value);
var is_invalid = (isNaN(float_value) || float_value >= 1e12);
var field_value = float_value;
if (minValue !== null && float_value < minValue ||
maxValue !== null && float_value > maxValue ||
is_invalid) {
field_value = false;
// Main.showFieldError($fieldEl);
} else {
// Main.hideFieldError($fieldEl);
}
if (e.type == 'change') {
if (new_value.length && !is_invalid) {
this.value = Main.wrapTonAmount(float_value, true);
}
}
if (e.type == 'input') {
var forClass, usdForClass;
if (forClass = $fieldEl.attr('data-for')) {
$('.' + forClass).html(Main.wrapTonAmount(field_value));
}
if (usdForClass = $fieldEl.attr('data-usd-for')) {
$('.' + usdForClass).html(Main.wrapUsdAmount(field_value));
}
}
},
wrapTonAmount: function(value, field_format) {
if (!value) {
return '';
}
var dec = (Math.floor(value * 1000000) % 1000000) + '';
while (dec.substr(-1) == '0') {
dec = dec.slice(0, -1);
}
return formatNumber(value, dec.length, '.', field_format ? '' : ',');
},
wrapUsdAmount: function(value, field_format) {
value = Math.round(value * Aj.state.tonRate * 100) / 100;
return formatNumber(value, (value % 1) && value < 1000 ? 2 : 0, '.', field_format ? '' : ',');
},
eTonkeeperOpen: function(e) {
e.stopImmediatePropagation();
e.preventDefault();
var href = $(this).attr('data-href');
if (href) {
location.href = href;
}
},
copyText: function(text) {
var $text = $('