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 = $('