diff --git a/data/web/fragment.com/js/auction.js b/data/web/fragment.com/js/auction.js
new file mode 100644
index 0000000000..ccae58e3d6
--- /dev/null
+++ b/data/web/fragment.com/js/auction.js
@@ -0,0 +1,2182 @@
+
+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.75) {
+ $(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 = $('