Shaleych (обсуждение | вклад) мНет описания правки |
Shaleych (обсуждение | вклад) мНет описания правки |
||
(не показано 460 промежуточных версий 3 участников) | |||
Строка 1: | Строка 1: | ||
+ | /* Размещённый здесь код JavaScript будет загружаться пользователям при обращении к каждой странице */ |
||
− | /* Any JavaScript here will be loaded for all users on every page load. */ |
||
+ | // Фильтр для таблицы Бонусы знака |
||
+ | $(".insignia-bonuses-table").before('<fieldset style="border: 1px solid #919191; border-radius: 5px;"><legend>Параметры:</legend><span>Возможно за: </span><input list="mountsList" id="selectedMount" style="width: 20%;" placeholder="Поиск по названию..."><datalist id="mountsList"></datalist><span> Содержащие знак: </span><div class="table-filters" style="display: inline-block !important; padding: 5px !important; display: flex; justify-content: center; align-items: center; flex-wrap: wrap;"><button class="btnIBT" type="button" value="Ячейка серповидных знаков"><img src="https://static.wikia.nocookie.net/neverwinter_ru_gamepedia/images/6/61/Серповидный_знак.png" style="width: 32px;"></button><button class="btnIBT" type="button" value="Ячейка просвещенных знаков"><img src="https://static.wikia.nocookie.net/neverwinter_ru_gamepedia/images/3/3c/Просвещенный_знак.png" style="width: 32px;"></button><button class="btnIBT" type="button" value="Ячейка украшенных знаков"><img src="https://static.wikia.nocookie.net/neverwinter_ru_gamepedia/images/c/c9/Украшенный_знак.png" style="width: 32px;"></button><button class="btnIBT" type="button" value="Ячейка царственных знаков"><img src="https://static.wikia.nocookie.net/neverwinter_ru_gamepedia/images/1/1a/Царственный_знак.png" style="width: 32px;"></button><button class="btnIBT" type="button" value="Ячейка шипастых знаков"><img src="https://static.wikia.nocookie.net/neverwinter_ru_gamepedia/images/5/52/Шипастый_знак.png" style="width: 32px;"></button></div></fieldset>'); |
||
+ | $(function(){ |
||
− | /******************************* |
||
+ | var uniqueMounts = new Set(); // Массив уникальных значений маунтов |
||
− | /* Wiki Subpage Tooltip Script * |
||
− | /*******************************/ |
||
− | // Author: Shawn Bruckner |
||
− | // Date: 2013-Apr-28 |
||
− | // License: CC-BY 3.0 |
||
− | // Version: beta |
||
+ | // Проходим по каждой строке в таблице |
||
− | var wst = wst || { |
||
+ | $('.insignia-bonuses-table tbody tr').each(function() { |
||
+ | // Получаем маунты из текущей строки и разделяем их |
||
+ | var mountsData = $(this).data('mounts'); |
||
+ | var mounts = mountsData ? mountsData.split(', ') : []; |
||
+ | // Добавляем уникальные маунты в массив |
||
− | dataSubpageTitle : '/Подсказка', |
||
+ | mounts.forEach(function(mount) { |
||
− | loadingTemplate: 'Шаблон:Tooltip hover box loading', |
||
+ | uniqueMounts.add(mount); |
||
− | loadedTemplate: 'Шаблон:Tooltip hover box', |
||
− | + | }); |
|
+ | }); |
||
− | classPrefix: 'wst-tooltip-', |
||
− | articlePath : null, |
||
− | fullScriptPath : null, |
||
− | scriptPath: null, |
||
− | dataTitlesToCheck: Array(), |
||
− | contentTitles: Array(), |
||
− | dataTitles: Array(), |
||
+ | // Сортируем массив уникальных маунтов по алфавиту |
||
− | encodeAllSpecial : function( unencoded ) { |
||
+ | var sortedMounts = Array.from(uniqueMounts).sort(); |
||
− | var encoded = ""; |
||
− | var c; |
||
− | var safeChars = /[0-9A-Za-zА-Яа-я]/; |
||
− | for( var i = 0; i < unencoded.length; i++ ) { |
||
− | c = unencoded.charAt(i); |
||
− | if ( safeChars.test( c ) ) { |
||
− | encoded = encoded + c; |
||
− | } else { |
||
− | encoded = encoded + '_' + c.charCodeAt().toString(16) + '-'; |
||
− | } |
||
− | } |
||
− | return encoded; |
||
− | }, |
||
+ | // Заполняем выпадающий список отсортированными значениями |
||
− | getTitleFromHref : function( href ) { |
||
+ | sortedMounts.forEach(function(mount) { |
||
− | var end; |
||
+ | $('#mountsList').append($('<option>', { value: mount, text: mount })); |
||
− | var result = null; |
||
+ | }); |
||
− | if ( href.indexOf( wst.fullScriptPath ) === 0 ) { |
||
+ | |||
− | end = href.substring( wst.fullScriptPath.length ); |
||
+ | // Обработчики событий для выпадающего списка и кнопок |
||
− | result = ( new RegExp( 'title=([^&]*)' ) ).exec( end ); |
||
+ | $('#selectedMount, .btnIBT').on('input click', updateFilters); |
||
− | } else if ( href.indexOf( wst.scriptPath ) === 0 ) { |
||
+ | |||
− | end = href.substring( wst.scriptPath.length ); |
||
+ | // Функция обновления фильтров |
||
− | result = ( new RegExp( 'title=([^&]*)' ) ).exec( end ); |
||
+ | function updateFilters() { |
||
− | } else if ( href.indexOf( wst.articlePath ) === 0 ) { |
||
+ | var selectedMount = $('#selectedMount').val(); |
||
− | end = href.substring( wst.articlePath.length ); |
||
− | + | var selectedButtons = $('.btnIBT.active').map(function() { |
|
− | + | return $(this).val(); |
|
+ | }).get(); |
||
+ | $('.btnIBT:not(.active)').prop('disabled', selectedButtons.length >= 4); |
||
+ | |||
+ | // Удаляем все строки "Не найдено" |
||
+ | $('.insignia-bonuses-table tbody tr.not-found').remove(); |
||
+ | |||
+ | // Проверяем, есть ли выбранный маунт или введенные слова |
||
+ | if (selectedMount || selectedButtons.length > 0) { |
||
+ | var filterString = (selectedMount ? '[data-mounts*="' + selectedMount + '"]' : '') + selectedButtons.map(function(buttonValue) { |
||
+ | return '[data-filter*="' + buttonValue + '"]'; |
||
+ | }).join(''); |
||
+ | var $filteredRows = $('.insignia-bonuses-table tbody tr').hide().filter(filterString); |
||
− | if ( |
+ | if ($filteredRows.length === 0) { |
+ | $('.insignia-bonuses-table tbody').append('<tr class="not-found"><td colspan="2" style="text-align: center;font-weight: bold;">Не найдено</td></tr>'); |
||
− | if ( decodeURIComponent( result[1] ).substring(0, 10) !== "Служебная:" ) { |
||
− | return decodeURIComponent( result[1] ); |
||
} else { |
} else { |
||
− | + | $filteredRows.show(); |
|
} |
} |
||
} else { |
} else { |
||
+ | // Если ничего не выбрано или не введено, показываем все строки |
||
− | return null; |
||
+ | $('.insignia-bonuses-table tbody tr').show(); |
||
} |
} |
||
− | } |
+ | } |
+ | // Обработчик клика по кнопкам |
||
− | getTitlesAndContentLinks : function() { |
||
+ | $('.btnIBT').click(function() { |
||
− | var links = $( '#mw-content-text a[href]' ); |
||
− | + | $(this).toggleClass('active'); |
|
− | + | updateFilters(); |
|
+ | }); |
||
+ | }); |
||
− | for ( var i = 0; i < links.length; i++ ) { |
||
− | if( title = wst.getTitleFromHref( links[i].href ) ) { |
||
− | uniqueTitles[title] = null; // hackish way to ensure only unique titles are added |
||
− | } |
||
− | } |
||
+ | $("#artifacts-table").prepend('<fieldset><legend>Параметры фильтра таблицы:</legend><p style="margin-bottom: 0.5em;">Нижеследующие таблицы можно отфильтровать. Несколько фильтров могут быть применены сразу, выбрав несколько параметров.</p><div class="table-filters-hide-option" id="table-filters"><select class="stats"><option>Выбрать...</option></select><select class="stats"><option>Выбрать...</option></select><select class="stats"><option>Выбрать...</option></select><select class="stats"><option>Выбрать...</option></select></div></fieldset>'); |
||
− | for ( uniqueTitle in uniqueTitles ) { |
||
− | wst.dataTitlesToCheck.push( uniqueTitle + wst.dataSubpageTitle ); // put unique titles into the array |
||
− | } |
||
− | }, |
||
+ | $("#equipment-table").wrap($('<div id="fieldset-equipment-table" />"')); |
||
− | beginLinkSetup : function() { |
||
+ | $("#fieldset-equipment-table").prepend('<fieldset id="settings"><legend>Параметры:</legend><table><tbody><tr><td><span>Предмет:</span></td><td><input type="text" name="search" placeholder="Поиск предмета по имени"></div></td></tr><tr><td><span>Ячейка/Категория:</span></td><td><select class="category"><option>Все</option></select></td></tr><tr><td><span>Качество:</span></td><td><select class="quality"><option>Любое качество</option></select></td></tr><tr><td><span>На себе:</span></td><td><select class="equip"><option>Все</option></select></td></tr><tr><td><span>Класс:</span></td><td><select class="role"></select></td></tr><tr><td><span>Минимальный уровень:</span></td><td><label>Мин.: <input type="text" size="1" name="min"></label> - <label>Макс.: <input type="text" size="1" name="max"></label></td></tr><tr><td><span>Уровень предмета:</span></td><td><label>Мин.: <input type="text" size="1" name="min"></label> - <label>Макс.: <input type="text" size="1" name="max"></label></td></tr></tbody></table><div style="float: right;"><span>Параметры (можно выбрать макс. три параметра): </span><div class="stats"></div></div></fieldset>'); |
||
− | wst.articlePath = mw.config.get( 'wgServer' ) + mw.config.get( 'wgArticlePath' ).replace( /\$1/, '' ); |
||
− | wst.fullScriptPath = mw.config.get( 'wgServer' ) + mw.config.get( 'wgScript' ); |
||
− | wst.scriptPath = mw.config.get( 'wgScript' ); |
||
+ | // merges a repeating cell in a table |
||
− | wst.getTitlesAndContentLinks(); |
||
+ | var all = $('.merge-duplicate-td'); |
||
+ | var first; |
||
+ | var prev = undefined; |
||
+ | var rowspan = 1; |
||
+ | |||
+ | var setRowspan = function() { |
||
+ | first.attr('rowspan', rowspan); |
||
+ | rowspan = 1; |
||
+ | } |
||
+ | |||
+ | all.each(function() { |
||
+ | var txt = $(this).text(); |
||
+ | if (prev === txt) { |
||
+ | rowspan += 1; |
||
+ | $(this).remove(); |
||
+ | } else { |
||
+ | // doesnt match, set colspan on first and reset colspan counter |
||
+ | if (rowspan > 1) { |
||
+ | setRowspan(); |
||
+ | } |
||
+ | first = $(this); |
||
+ | prev = txt; |
||
+ | } |
||
+ | }); |
||
+ | |||
+ | if (rowspan > 1) { |
||
+ | setRowspan(); |
||
+ | } |
||
+ | |||
+ | $('.artifact-weapon-table tr').each(function(){ |
||
+ | var $this = $(this), |
||
+ | title = $this.attr('data-power'); |
||
+ | var $foundFIgure = $('[data-power="'+title+'"]'); |
||
+ | |||
+ | if($foundFIgure.length > 1){ |
||
+ | $foundFIgure.eq(0).addClass("artifact-weapon-table-top"); |
||
+ | $foundFIgure.eq(1).addClass("artifact-weapon-table-bottom"); |
||
+ | } |
||
+ | }); |
||
+ | // default setting to turn tooltips on |
||
− | if ( wst.dataTitlesToCheck.length > 0 ) { |
||
+ | var tooltipsOn = true; |
||
− | $.ajax( { |
||
− | type: 'POST', |
||
− | url: mw.util.wikiScript( 'api' ), |
||
− | data: { action: 'parse', format: 'json', text: '{{:' + wst.loadingTemplate + '}}' }, |
||
− | dataType: 'json', |
||
− | success: wst.midLinkSetup |
||
− | } ); |
||
− | } |
||
− | }, |
||
+ | var $tfb; |
||
− | midLinkSetup: function( jsonData ) { |
||
+ | var activeHoverLink = null; |
||
− | wst.loadingHtml = jsonData.parse.text['*']; |
||
+ | var tipCache = new Object(); |
||
+ | // hides the tooltip |
||
− | wst.startQueryPageExistence(); |
||
+ | function hideTip() { |
||
− | }, |
||
+ | $tfb.html("").removeClass("tooltip-ready").addClass("hidden").css("visibility","hidden"); |
||
+ | activeHoverLink = null; |
||
+ | } |
||
+ | // displays the tooltip |
||
− | startQueryPageExistence : function( ) { |
||
+ | function displayTip(e) { |
||
− | titleSubset = Array(); |
||
+ | $tfb.not(":empty").removeClass("hidden").addClass("tooltip-ready"); |
||
− | for ( i = 0; i < 50 && wst.dataTitlesToCheck.length > 0; i++ ) { |
||
+ | moveTip(e); |
||
− | titleSubset.push( wst.dataTitlesToCheck.pop() ); |
||
+ | $tfb.not(":empty").css("visibility","visible"); |
||
− | } |
||
+ | moveTip(e); |
||
− | var titles = titleSubset.join( '|' ); |
||
+ | } |
||
+ | // moves the tooltip |
||
− | $.ajax( { |
||
+ | function moveTip(e) { |
||
− | type: 'POST', |
||
+ | var $ct = $tfb.not(":empty"); |
||
− | url: mw.util.wikiScript( 'api' ), |
||
+ | var eh = $ct.innerHeight() + 20, wh = $(window).height(); |
||
− | data: { action: 'query', format: 'json', titles: titles }, |
||
+ | var newTop = e.clientY + ((e.clientY > (wh/2)) ? -eh : 20); |
||
− | dataType: 'json', |
||
+ | var newLeft = e.clientX + ((e.clientX > ($(window).width()/2)) ? -($ct.innerWidth()+20):20); |
||
− | success: wst.finishQueryPageExistence |
||
+ | newTop = Math.max(105, Math.min(wh - eh, newTop)); |
||
− | } ); |
||
+ | $ct.css({"position":"fixed","font-size":"0.90em","top":newTop + "px","left":newLeft + "px"}); |
||
− | }, |
||
+ | } |
||
+ | // AJAX tooltips |
||
− | finishQueryPageExistence : function( jsonData ) { |
||
+ | function showTip(e) { |
||
− | wst.filterTitles( jsonData.query.pages ); |
||
+ | var $t=$(this); |
||
+ | activeHoverLink = $t; |
||
+ | $p=$t.parent(); |
||
+ | if ($p.hasClass("selflink")==false) { |
||
+ | $t.removeAttr("title"); |
||
+ | $p.removeAttr("title"); |
||
+ | /*var url = "/ru/index.php?title="+$t.data("tt").replace(/ /g,"_").replace(/\?/g,"%3F").replace(/\+/g,"%2B")+"&action=render .tooltip-content";*/ |
||
+ | var url = "/ru/index.php?title=" + encodeURIComponent(decodeURIComponent($t.data("tt"))) + "&action=render " + 'div[class*="tooltip"]'; |
||
+ | if (tipCache[url] != null) { |
||
+ | $tfb.html(tipCache[url]); |
||
+ | displayTip(e); |
||
+ | return; |
||
+ | } |
||
+ | $tfb.load(url,function () { |
||
+ | if ($t != activeHoverLink) return; |
||
+ | if ($tfb.html() == "") $tfb.html('<div class="tooltip"><b>Error</b><br />This target either has no tooltip<br />or was not intended to have one.</div>'); |
||
+ | $tfb.find(".tooltip").css("display",""); |
||
+ | tipCache[url] = $tfb.html(); |
||
+ | displayTip(e); |
||
+ | }); |
||
+ | } |
||
+ | } |
||
+ | function bindTT() { |
||
− | if ( wst.dataTitlesToCheck.length > 0 ) { |
||
+ | $t=$(this); |
||
− | wst.startQueryPageExistence(); |
||
+ | $p=$t.parent(); |
||
− | } else { |
||
+ | if ($p.hasClass("selflink") == false) { |
||
− | wst.finishLinkSetup(); |
||
+ | $t.data("tt", $p.attr("title").replace(" (page does not exist)","").replace("?","%3F")).hover(showTip,hideTip).mousemove(moveTip); |
||
− | } |
||
− | + | } |
|
+ | } |
||
+ | // check to see if it is active then do it |
||
− | filterTitles : function( pageData ) { |
||
+ | function ttMouseOver() { |
||
− | var result, title; |
||
+ | if (tooltipsOn) { |
||
− | for ( index in pageData ) { |
||
+ | $("#content").append('<div id="tfb" class="htt"></div>'); |
||
− | result = pageData[index]; |
||
+ | $tfb = $("#tfb"); |
||
− | if ( result.missing === undefined ) { |
||
+ | $("#content .ajaxttlink").each(bindTT); |
||
− | title = result.title.replace( / /g, '_' ); |
||
+ | } |
||
− | wst.dataTitles.push( title ); |
||
+ | } |
||
− | wst.contentTitles.push( title.substring( 0, title.length - wst.dataSubpageTitle.length ) ); |
||
− | } |
||
− | } |
||
− | }, |
||
+ | $(ttMouseOver); |
||
− | finishLinkSetup : function( ) { |
||
− | for ( var i = 0; i < wst.contentTitles.length; i++ ) { |
||
− | $( 'body' ).append( '<div id="' + wst.classPrefix + wst.encodeAllSpecial( wst.contentTitles[i] ) + |
||
− | '" style="display: none; position: absolute; z-index: 10000;">' + |
||
− | wst.loadingHtml.replace( /\$1/, wst.contentTitles[i].replace( /_/, " " ) ) + '</div>' ); |
||
− | } |
||
+ | /** |
||
− | var title, id; |
||
+ | * demarcateDialogue |
||
− | var links = $( '#mw-content-text a[href]' ); |
||
+ | * Additional class formatting "dialogue" for sections titled as dialogue or text on mainspace articles |
||
− | for ( var i = 0; i < links.length; i++ ) { |
||
+ | */ |
||
− | title = wst.getTitleFromHref( links[i].href ); |
||
+ | (function demarcateDialogue (window, document) { |
||
− | if ( title !== null && $.inArray( title, wst.contentTitles ) !== -1 ) { |
||
+ | if (mw.config.get('wgNamespaceNumber') == 0) { |
||
− | id = wst.classPrefix + wst.encodeAllSpecial( title ); |
||
+ | $('h2').each(function (i, e) { |
||
− | links.eq(i).on( 'mouseover', { id : id, title : title }, function( event ) { wst.showTooltip( event ); } ); |
||
+ | var h2Content = this.innerHTML.match(/(диалог|text)/i); |
||
− | links.eq(i).on( 'mousemove', { id : id }, function( event ) { wst.moveTooltip( event ); } ); |
||
+ | if (h2Content) { |
||
− | links.eq(i).on( 'mouseout', { id : id }, function( event ) { wst.hideTooltip( event ); } ); |
||
+ | $(this).nextUntil(this.tagName).wrapAll('<div class="dialogue"></div>'); |
||
} |
} |
||
− | } |
+ | }); |
− | } |
+ | } |
+ | }) (window, document); |
||
− | showTooltip : function( event ) { |
||
− | tooltipBox = $( '#' + event.data.id ); |
||
− | wst.positionTooltip( event.data.id, event.pageX, event.pageY ); |
||
− | tooltipBox.fadeIn(); |
||
+ | /** |
||
− | if ( !tooltipBox.hasClass( 'loaded' ) && !tooltipBox.hasClass( 'loading' ) ) { |
||
+ | * Simple craft calculator |
||
− | tooltipBox.addClass( wst.classPrefix + 'loading' ); |
||
+ | */ |
||
− | wst.beginLoadTooltip( event.data.id, event.data.title ); |
||
+ | $(function(){ |
||
− | } |
||
+ | var resultCountInput = '<input type="text" size="4" maxlength="4"/>'; |
||
− | }, |
||
+ | $(".simpleCraftCalcResultCount").empty().append(resultCountInput); |
||
+ | var craftCountSpans = ' (<span class="simpleCraftCalcCraftCount">1</span> × ' + |
||
+ | '<span class="simpleCraftCalcInitialCount">1</span> = <span class="simpleCraftCalcProduct">1</span>) <sup>' + |
||
+ | '<abbr title="Кол-во крафтов × кол-во предметов, изготавливаемых за 1 крафт = получаемое кол-во предметов в результате">?</abbr></sup>'; |
||
+ | $(".simpleCraftCalcResultCount").append(craftCountSpans); |
||
+ | $(".simpleCraftCalcResultCount").each(function(index, element) |
||
+ | { |
||
+ | var resultEl = $(element); |
||
+ | var countInput = resultEl.find("input"); |
||
+ | var initialCount = parseInt(resultEl.data("initial-count")); |
||
+ | countInput.val(initialCount); |
||
+ | if(initialCount > 1) countInput.attr("title", "Округляется вверх до ближайшего кратного " + initialCount); |
||
+ | countInput.change(valueChanged); |
||
+ | countInput.keyup(valueChanged); |
||
+ | resultEl.find(".simpleCraftCalcInitialCount").text(initialCount); |
||
− | beginLoadTooltip : function( id, title ) { |
||
+ | resultEl.find(".simpleCraftCalcProduct").text(initialCount); |
||
− | $.ajax( { |
||
+ | }); |
||
− | type: 'POST', |
||
− | url: mw.util.wikiScript( 'api' ), |
||
− | data: { action: 'parse', format: 'json', title: title.replace( /_/, ' ' ), |
||
− | text: '{{:' + title + wst.dataSubpageTitle + '|' + wst.loadedTemplate + '}}' }, |
||
− | dataType: 'json', |
||
− | success: function( jsonData ) { wst.finishLoadTooltip( id, jsonData ); } |
||
− | } ); |
||
− | }, |
||
+ | function valueChanged(event) |
||
− | finishLoadTooltip : function( id, jsonData ) { |
||
+ | { |
||
− | tooltipBox = $( '#' + id ); |
||
+ | var countInput = $(this); |
||
− | tooltipBox.addClass( 'loaded' ); |
||
+ | var count = parseInt(countInput.val()); |
||
− | tooltipBox.removeClass( 'loading' ); |
||
+ | if(isFinite(count) && count > 0) |
||
− | tooltipBox.html( jsonData.parse.text['*'] ); |
||
− | + | { |
|
+ | var initialCount = parseInt(countInput.parents(".simpleCraftCalcResultCount").data("initial-count")); |
||
+ | var crafts = craftCount(count, initialCount); |
||
+ | var recipeBase = countInput.parents(".simpleCraftCalcRecipeBase"); |
||
+ | var craftCountSpan = recipeBase.find(".simpleCraftCalcCraftCount"); |
||
+ | craftCountSpan.text(crafts); |
||
+ | var productSpan = recipeBase.find(".simpleCraftCalcProduct"); |
||
+ | productSpan.text(crafts * initialCount); |
||
+ | recipeBase.find(".simpleCraftCalcIngredientCount").each(function(index, element) |
||
− | moveTooltip : function( event ) { |
||
+ | { |
||
− | wst.positionTooltip( event.data.id, event.pageX, event.pageY ); |
||
+ | var ingSpan = $(this); |
||
− | }, |
||
+ | var ingInitialCount = parseInt(ingSpan.data("initial-count")); |
||
+ | ingSpan.text(crafts * ingInitialCount); |
||
+ | }); |
||
+ | } |
||
+ | } |
||
+ | function craftCount(resultCount, initialCount) |
||
− | positionTooltip: function( id, pageX, pageY ) { |
||
+ | { |
||
− | var tooltip = $( '#' + id ); |
||
+ | return Math.ceil(resultCount / initialCount); |
||
− | var bodyOffsets = document.body.getBoundingClientRect(); |
||
+ | } |
||
− | var bodyX = pageX - bodyOffsets.left; |
||
+ | }); |
||
− | var bodyY = pageY - bodyOffsets.top; |
||
− | var scrollX = $( document ).scrollLeft(); |
||
− | var scrollY = $( document ).scrollTop(); |
||
− | var bodyWidth = $( 'body' ).width(); |
||
− | var bodyHeight = $( 'body' ).height(); |
||
− | var viewWidth = $( window ).width(); |
||
− | var viewHeight = $( window ).height(); |
||
− | var topAdjust = 6; |
||
+ | // Filter table |
||
− | if ( tooltip.width() * 1.1 > pageX - scrollX ) { |
||
+ | $(function() { |
||
− | tooltip.css( { 'left' : bodyX - scrollX + 15, 'right' : 'auto' } ); |
||
− | + | var pattern = [], |
|
− | + | tbody = $(".filter-table tbody"), |
|
+ | trs = $("[data-stats]", tbody), |
||
− | tooltip.css( { 'right' : bodyWidth - bodyX + scrollX + 6, 'left' : 'auto' } ); |
||
+ | temp = { "stats": new Set() }; |
||
+ | |||
+ | $.each(trs, function() { |
||
+ | if (typeof $(this).data('stats') != 'undefined'){ |
||
+ | $stats = $(this).data('stats'); |
||
+ | $stats = $stats.split(","); |
||
+ | $.each($stats, function(index, value) { temp.stats.add(value.trim()); }); |
||
} |
} |
||
+ | }); |
||
+ | // Adds item parameters |
||
− | if ( tooltip.height() * 1.5 > pageY - scrollY ) { |
||
+ | temp.stats.forEach(function (item) { |
||
− | tooltip.css( { 'top' : bodyY - scrollY + topAdjust, 'bottom' : 'auto' } ); |
||
+ | item = '<option value="' + item + '">' + item + '</option>'; |
||
− | } else { |
||
+ | $("#table-filters .stats").append(item); |
||
− | tooltip.css( { 'bottom' : bodyHeight - bodyY + scrollY + 3, 'top' : 'auto' } ); |
||
+ | }); |
||
+ | |||
+ | var $selHideOption = $('#table-filters select'), |
||
+ | $opt = $('option:not(:first-child)', $selHideOption); |
||
+ | |||
+ | $("#table-filters select").each(function(i, select) { |
||
+ | var el = $(select); |
||
+ | pattern.push(select.value); |
||
+ | el.change(function() { |
||
+ | |||
+ | // Hides already selected options from other <select></select> |
||
+ | var $chosen = $selHideOption.map(function(i, el){ |
||
+ | console.log(); |
||
+ | return $(':selected',el); |
||
+ | }); |
||
+ | var $teamId = null; |
||
+ | $opt.prop('disabled', false); |
||
+ | $chosen.each(function(i, el){0 |
||
+ | $teamId = $(el).val(); |
||
+ | $opt.not(el).filter(function(){ |
||
+ | return $(this).val() == $teamId; |
||
+ | }).prop('disabled', true); |
||
+ | }) |
||
+ | |||
+ | pattern[i] = select.value; |
||
+ | var rows = trs.hide().filter(function(i, tr) { |
||
+ | var data = $(tr).data("stats").split(","); |
||
+ | var arr = pattern.slice(0); |
||
+ | data.forEach(function(a) { |
||
+ | var i = arr.indexOf(a.trim()); |
||
+ | if(i != -1) arr.splice(i,1); |
||
+ | }) |
||
+ | return arr.every(function(txt, k) { |
||
+ | return txt == "Выбрать..." |
||
+ | }) |
||
+ | }).show(); |
||
+ | // Outputs the string "Items not found" if the results are "0". |
||
+ | if (rows.length == 0) {tbody.append("<tr><td colspan=\"3\">Предметы не найдены</td></tr>");} |
||
+ | }) |
||
+ | }) |
||
+ | }); |
||
+ | |||
+ | //Filter for equipment table |
||
+ | //Author: Roni (Рони) Thanks to him for this script |
||
+ | $(function() { |
||
+ | var $tbody = $("#equipment-table").children("tbody"); |
||
+ | var $trs = $("tr", $tbody).toArray(); |
||
+ | var colCount = $("#equipment-table > thead > tr > th").length; |
||
+ | var temp = { |
||
+ | "equip": new Set(), |
||
+ | "stats": new Set(), |
||
+ | "category": ["Голова", "Доспехи", "Руки", "Ноги", "Рубаха", "Пояс", "Штаны", "Шея", "Кольцо", "Правая руки", "Левая рука", "Только для спутников"], |
||
+ | "role": ["Любой класс", "Клирик", "Варвар", "Чернокнижник", "Плут", "Воин", "Бард", "Паладин", "Следопыт", "Волшебник"], |
||
+ | }; |
||
+ | |||
+ | $.each($trs, function() { |
||
+ | if (typeof $(this).data('equip') != 'undefined'){ |
||
+ | $equip = $(this).data('equip'); |
||
+ | temp.equip.add($equip); |
||
} |
} |
||
+ | if (typeof $(this).data('stats') != 'undefined'){ |
||
− | }, |
||
+ | $stats = $(this).data('stats'); |
||
+ | $stats = $stats.split(","); |
||
+ | $.each($stats, function(index, value) { temp.stats.add(value.trim()); }); |
||
+ | } |
||
+ | }); |
||
+ | |||
+ | // Adds equip bonus |
||
+ | Array.from(temp.equip).sort().forEach(function (item) { |
||
+ | item = '<option value="' + item + '">' + item + '</option>' |
||
+ | $("#settings .equip").append(item); |
||
+ | }); |
||
+ | // Adds item parameters |
||
+ | temp.stats.forEach(function (item) { |
||
+ | item = "<label class=\"checkbox\" value='" + item + "'><input type='checkbox' name='" + item + "'>" + item + "</label>"; |
||
+ | $("#settings .stats").append(item); |
||
+ | }); |
||
+ | |||
+ | // Adds item role |
||
+ | temp.role.forEach(function (item) { |
||
+ | item = '<option value="' + item + '">' + item + '</option>'; |
||
+ | $("#settings .role").append(item); |
||
+ | }); |
||
+ | // Adds item categories to the dropdown list |
||
− | hideTooltip : function( event ) { |
||
+ | temp.category.forEach(function (item) { |
||
− | $( '#' + event.data.id ).fadeOut(); |
||
+ | item = '<option value="' + item + '">' + item + '</option>'; |
||
− | } |
||
+ | $("#settings .category").append(item); |
||
+ | }); |
||
+ | item = '<option value="Обычный">Обычный</option><option value="Необычный">Необычный</option><option value="Редкий">Редкий</option><option value="Эпический">Эпический</option><option value="Легендарный">Легендарный</option><option value="Мифический">Мифический</option>'; |
||
− | }; |
||
+ | $("#settings .quality").append(item); |
||
+ | //Limit on the number of selected parameters |
||
− | $( document ).ready( wst.beginLinkSetup ); |
||
+ | $('#settings .stats input[type=checkbox]').change(function(){ |
||
+ | if($('#settings .stats input[type=checkbox]:checked').length >= 3){ |
||
+ | $('#settings .stats input[type=checkbox]:not(:checked)').prop('disabled', true); |
||
+ | } else{ |
||
+ | $('#settings .stats input[type=checkbox]:disabled').prop('disabled', false); |
||
+ | } |
||
+ | }); |
||
+ | // Main search script |
||
− | /*********************************** |
||
+ | $('#settings').on('input', function() { |
||
− | /* End Wiki Subpage Tooltip Script * |
||
+ | // Search by parameters |
||
− | /***********************************/ |
||
+ | var pattern = [], trs = $("[data-stats]", $tbody), el; |
||
+ | $("#settings .stats :checked").each(function(i, checked) { |
||
+ | el = $(checked); |
||
+ | pattern.push(checked.name); |
||
+ | }) |
||
+ | var rows = trs.hide().filter(function(i, tr) { |
||
+ | var data = $(tr).data("stats").split(","); |
||
+ | var arr = pattern.slice(0); |
||
+ | data.forEach(function(a) { |
||
+ | var i = arr.indexOf(a.trim()); |
||
+ | if(i != -1) arr.splice(i,1); |
||
+ | }) |
||
+ | return arr.every(function(txt, k) { |
||
− | /** |
||
+ | return txt == "" |
||
− | * demarcateDialogue |
||
+ | }) |
||
− | * Additional class formatting "dialogue" for sections titled as dialogue or text on mainspace articles |
||
+ | |||
− | */ |
||
+ | }).show(); |
||
− | (function demarcateDialogue (window, document) { |
||
+ | |||
− | if (mw.config.get('wgNamespaceNumber') == 0) { |
||
+ | // Outputs the string "Items not found" if the results are "0". |
||
− | $('h2').each(function (i, e) { |
||
+ | if (rows.length === 0) {$tbody.append("<tr><td colspan=" + colCount + ">Предметы не найдены</td></tr>");} |
||
− | var h2Content = this.innerHTML.match(/(диалог|text)/i); |
||
+ | |||
− | if (h2Content) { |
||
+ | $.each($trs, function(index, tr) { |
||
− | $(this).nextUntil(this.tagName).wrapAll('<div class="dialogue"></div>'); |
||
+ | //ECMAScript 6 |
||
+ | //let {subject, level, category, quality, role, stats} = $(tr).data(); |
||
+ | |||
+ | var $subject = $(tr).data('subject').toLowerCase(), $quality = $(tr).data('quality'), $level = $(tr).data('level'); |
||
+ | |||
+ | // Search by equip |
||
+ | if (typeof $(this).data('equip') != 'undefined'){ |
||
+ | $equip = $(this).data('equip'); |
||
+ | $equip = $equip.toLowerCase().split(","); |
||
+ | var $txt = $("#settings .equip").val().toLowerCase(); |
||
+ | $equip = $equip.some(function (e) { |
||
+ | return e.trim() == $txt; |
||
+ | }); |
||
+ | if ($txt !== "все" && !$equip) { |
||
+ | $(tr).hide(); |
||
+ | return; |
||
+ | } |
||
+ | } |
||
+ | // Search by class |
||
+ | if (typeof $(this).data('role') != 'undefined'){ |
||
+ | $role = $(this).data('role'); |
||
+ | $role = $role.toLowerCase().split(","); |
||
+ | var $txt = $("#settings .role").val().toLowerCase(); |
||
+ | $role = $role.some(function (e) { |
||
+ | return e.trim() == $txt; |
||
+ | }); |
||
+ | if ($txt !== "любой класс" && !$role) { |
||
+ | $(tr).hide(); |
||
+ | return; |
||
+ | } |
||
+ | } |
||
+ | |||
+ | // Search by category |
||
+ | if (typeof $(this).data('category') != 'undefined'){ |
||
+ | $category = $(this).data('category'); |
||
+ | $category = $category.toLowerCase().split(","); |
||
+ | var $txt = $("#settings .category").val().toLowerCase(); |
||
+ | $category = $category.some(function (e) { |
||
+ | return e.trim() == $txt; |
||
+ | }); |
||
+ | if ($txt !== "все" && !$category) { |
||
+ | $(tr).hide(); |
||
+ | return; |
||
+ | } |
||
+ | } |
||
+ | |||
+ | // Search by quality |
||
+ | if (typeof $(this).data('quality') != 'undefined'){ |
||
+ | var $txt = $("#settings .quality").val().toLowerCase(); |
||
+ | if ($txt !== "любое качество" && $txt !== $quality.toLowerCase()) { |
||
+ | $(tr).hide(); |
||
+ | return; |
||
+ | } |
||
+ | } |
||
+ | // Search by name |
||
+ | var $search = $("[name='search']").val().toLowerCase(); |
||
+ | if ($subject.includes($search) == false) { |
||
+ | $(tr).hide(); |
||
+ | return; |
||
+ | } |
||
+ | |||
+ | // Search by minimum level |
||
+ | var $min = $("[name='min']").val(); |
||
+ | if ($min && $level < +$min) { |
||
+ | $(tr).hide(); |
||
+ | return; |
||
+ | } |
||
+ | |||
+ | // Search by max level |
||
+ | var $max =$("[name='max']").val(); |
||
+ | if ($max && $level > +$max) { |
||
+ | $(tr).hide(); |
||
+ | return; |
||
} |
} |
||
}); |
}); |
||
+ | |||
− | } |
||
+ | |||
− | }) (window, document); |
||
+ | // Outputs the string "Items not found" if the results are "0". |
||
+ | //ECMAScript 6 |
||
+ | //if ($tbody.children().length === 0) {$tbody.append(`<tr><td colspan="${colCount}" style="text-align: center;">Предметы не найдены</td></tr>`);} |
||
+ | if ($("#equipment-table > tbody > tr:visible").length === 0) {$tbody.append('<tr id="last"><td colspan=\"' + colCount + '\" style="text-align: center;">Предметы не найдены</td></tr>'); |
||
+ | |||
+ | }else{$("#equipment-table > tbody > tr#last").remove(); } |
||
+ | |||
+ | }) |
||
+ | }); |
Текущая версия от 12:51, 8 февраля 2024
/* Размещённый здесь код JavaScript будет загружаться пользователям при обращении к каждой странице */
// Фильтр для таблицы Бонусы знака
$(".insignia-bonuses-table").before('<fieldset style="border: 1px solid #919191; border-radius: 5px;"><legend>Параметры:</legend><span>Возможно за: </span><input list="mountsList" id="selectedMount" style="width: 20%;" placeholder="Поиск по названию..."><datalist id="mountsList"></datalist><span> Содержащие знак: </span><div class="table-filters" style="display: inline-block !important; padding: 5px !important; display: flex; justify-content: center; align-items: center; flex-wrap: wrap;"><button class="btnIBT" type="button" value="Ячейка серповидных знаков"><img src="https://static.wikia.nocookie.net/neverwinter_ru_gamepedia/images/6/61/Серповидный_знак.png" style="width: 32px;"></button><button class="btnIBT" type="button" value="Ячейка просвещенных знаков"><img src="https://static.wikia.nocookie.net/neverwinter_ru_gamepedia/images/3/3c/Просвещенный_знак.png" style="width: 32px;"></button><button class="btnIBT" type="button" value="Ячейка украшенных знаков"><img src="https://static.wikia.nocookie.net/neverwinter_ru_gamepedia/images/c/c9/Украшенный_знак.png" style="width: 32px;"></button><button class="btnIBT" type="button" value="Ячейка царственных знаков"><img src="https://static.wikia.nocookie.net/neverwinter_ru_gamepedia/images/1/1a/Царственный_знак.png" style="width: 32px;"></button><button class="btnIBT" type="button" value="Ячейка шипастых знаков"><img src="https://static.wikia.nocookie.net/neverwinter_ru_gamepedia/images/5/52/Шипастый_знак.png" style="width: 32px;"></button></div></fieldset>');
$(function(){
var uniqueMounts = new Set(); // Массив уникальных значений маунтов
// Проходим по каждой строке в таблице
$('.insignia-bonuses-table tbody tr').each(function() {
// Получаем маунты из текущей строки и разделяем их
var mountsData = $(this).data('mounts');
var mounts = mountsData ? mountsData.split(', ') : [];
// Добавляем уникальные маунты в массив
mounts.forEach(function(mount) {
uniqueMounts.add(mount);
});
});
// Сортируем массив уникальных маунтов по алфавиту
var sortedMounts = Array.from(uniqueMounts).sort();
// Заполняем выпадающий список отсортированными значениями
sortedMounts.forEach(function(mount) {
$('#mountsList').append($('<option>', { value: mount, text: mount }));
});
// Обработчики событий для выпадающего списка и кнопок
$('#selectedMount, .btnIBT').on('input click', updateFilters);
// Функция обновления фильтров
function updateFilters() {
var selectedMount = $('#selectedMount').val();
var selectedButtons = $('.btnIBT.active').map(function() {
return $(this).val();
}).get();
$('.btnIBT:not(.active)').prop('disabled', selectedButtons.length >= 4);
// Удаляем все строки "Не найдено"
$('.insignia-bonuses-table tbody tr.not-found').remove();
// Проверяем, есть ли выбранный маунт или введенные слова
if (selectedMount || selectedButtons.length > 0) {
var filterString = (selectedMount ? '[data-mounts*="' + selectedMount + '"]' : '') + selectedButtons.map(function(buttonValue) {
return '[data-filter*="' + buttonValue + '"]';
}).join('');
var $filteredRows = $('.insignia-bonuses-table tbody tr').hide().filter(filterString);
if ($filteredRows.length === 0) {
$('.insignia-bonuses-table tbody').append('<tr class="not-found"><td colspan="2" style="text-align: center;font-weight: bold;">Не найдено</td></tr>');
} else {
$filteredRows.show();
}
} else {
// Если ничего не выбрано или не введено, показываем все строки
$('.insignia-bonuses-table tbody tr').show();
}
}
// Обработчик клика по кнопкам
$('.btnIBT').click(function() {
$(this).toggleClass('active');
updateFilters();
});
});
$("#artifacts-table").prepend('<fieldset><legend>Параметры фильтра таблицы:</legend><p style="margin-bottom: 0.5em;">Нижеследующие таблицы можно отфильтровать. Несколько фильтров могут быть применены сразу, выбрав несколько параметров.</p><div class="table-filters-hide-option" id="table-filters"><select class="stats"><option>Выбрать...</option></select><select class="stats"><option>Выбрать...</option></select><select class="stats"><option>Выбрать...</option></select><select class="stats"><option>Выбрать...</option></select></div></fieldset>');
$("#equipment-table").wrap($('<div id="fieldset-equipment-table" />"'));
$("#fieldset-equipment-table").prepend('<fieldset id="settings"><legend>Параметры:</legend><table><tbody><tr><td><span>Предмет:</span></td><td><input type="text" name="search" placeholder="Поиск предмета по имени"></div></td></tr><tr><td><span>Ячейка/Категория:</span></td><td><select class="category"><option>Все</option></select></td></tr><tr><td><span>Качество:</span></td><td><select class="quality"><option>Любое качество</option></select></td></tr><tr><td><span>На себе:</span></td><td><select class="equip"><option>Все</option></select></td></tr><tr><td><span>Класс:</span></td><td><select class="role"></select></td></tr><tr><td><span>Минимальный уровень:</span></td><td><label>Мин.: <input type="text" size="1" name="min"></label> - <label>Макс.: <input type="text" size="1" name="max"></label></td></tr><tr><td><span>Уровень предмета:</span></td><td><label>Мин.: <input type="text" size="1" name="min"></label> - <label>Макс.: <input type="text" size="1" name="max"></label></td></tr></tbody></table><div style="float: right;"><span>Параметры (можно выбрать макс. три параметра): </span><div class="stats"></div></div></fieldset>');
// merges a repeating cell in a table
var all = $('.merge-duplicate-td');
var first;
var prev = undefined;
var rowspan = 1;
var setRowspan = function() {
first.attr('rowspan', rowspan);
rowspan = 1;
}
all.each(function() {
var txt = $(this).text();
if (prev === txt) {
rowspan += 1;
$(this).remove();
} else {
// doesnt match, set colspan on first and reset colspan counter
if (rowspan > 1) {
setRowspan();
}
first = $(this);
prev = txt;
}
});
if (rowspan > 1) {
setRowspan();
}
$('.artifact-weapon-table tr').each(function(){
var $this = $(this),
title = $this.attr('data-power');
var $foundFIgure = $('[data-power="'+title+'"]');
if($foundFIgure.length > 1){
$foundFIgure.eq(0).addClass("artifact-weapon-table-top");
$foundFIgure.eq(1).addClass("artifact-weapon-table-bottom");
}
});
// default setting to turn tooltips on
var tooltipsOn = true;
var $tfb;
var activeHoverLink = null;
var tipCache = new Object();
// hides the tooltip
function hideTip() {
$tfb.html("").removeClass("tooltip-ready").addClass("hidden").css("visibility","hidden");
activeHoverLink = null;
}
// displays the tooltip
function displayTip(e) {
$tfb.not(":empty").removeClass("hidden").addClass("tooltip-ready");
moveTip(e);
$tfb.not(":empty").css("visibility","visible");
moveTip(e);
}
// moves the tooltip
function moveTip(e) {
var $ct = $tfb.not(":empty");
var eh = $ct.innerHeight() + 20, wh = $(window).height();
var newTop = e.clientY + ((e.clientY > (wh/2)) ? -eh : 20);
var newLeft = e.clientX + ((e.clientX > ($(window).width()/2)) ? -($ct.innerWidth()+20):20);
newTop = Math.max(105, Math.min(wh - eh, newTop));
$ct.css({"position":"fixed","font-size":"0.90em","top":newTop + "px","left":newLeft + "px"});
}
// AJAX tooltips
function showTip(e) {
var $t=$(this);
activeHoverLink = $t;
$p=$t.parent();
if ($p.hasClass("selflink")==false) {
$t.removeAttr("title");
$p.removeAttr("title");
/*var url = "/ru/index.php?title="+$t.data("tt").replace(/ /g,"_").replace(/\?/g,"%3F").replace(/\+/g,"%2B")+"&action=render .tooltip-content";*/
var url = "/ru/index.php?title=" + encodeURIComponent(decodeURIComponent($t.data("tt"))) + "&action=render " + 'div[class*="tooltip"]';
if (tipCache[url] != null) {
$tfb.html(tipCache[url]);
displayTip(e);
return;
}
$tfb.load(url,function () {
if ($t != activeHoverLink) return;
if ($tfb.html() == "") $tfb.html('<div class="tooltip"><b>Error</b><br />This target either has no tooltip<br />or was not intended to have one.</div>');
$tfb.find(".tooltip").css("display","");
tipCache[url] = $tfb.html();
displayTip(e);
});
}
}
function bindTT() {
$t=$(this);
$p=$t.parent();
if ($p.hasClass("selflink") == false) {
$t.data("tt", $p.attr("title").replace(" (page does not exist)","").replace("?","%3F")).hover(showTip,hideTip).mousemove(moveTip);
}
}
// check to see if it is active then do it
function ttMouseOver() {
if (tooltipsOn) {
$("#content").append('<div id="tfb" class="htt"></div>');
$tfb = $("#tfb");
$("#content .ajaxttlink").each(bindTT);
}
}
$(ttMouseOver);
/**
* demarcateDialogue
* Additional class formatting "dialogue" for sections titled as dialogue or text on mainspace articles
*/
(function demarcateDialogue (window, document) {
if (mw.config.get('wgNamespaceNumber') == 0) {
$('h2').each(function (i, e) {
var h2Content = this.innerHTML.match(/(диалог|text)/i);
if (h2Content) {
$(this).nextUntil(this.tagName).wrapAll('<div class="dialogue"></div>');
}
});
}
}) (window, document);
/**
* Simple craft calculator
*/
$(function(){
var resultCountInput = '<input type="text" size="4" maxlength="4"/>';
$(".simpleCraftCalcResultCount").empty().append(resultCountInput);
var craftCountSpans = ' (<span class="simpleCraftCalcCraftCount">1</span> × ' +
'<span class="simpleCraftCalcInitialCount">1</span> = <span class="simpleCraftCalcProduct">1</span>) <sup>' +
'<abbr title="Кол-во крафтов × кол-во предметов, изготавливаемых за 1 крафт = получаемое кол-во предметов в результате">?</abbr></sup>';
$(".simpleCraftCalcResultCount").append(craftCountSpans);
$(".simpleCraftCalcResultCount").each(function(index, element)
{
var resultEl = $(element);
var countInput = resultEl.find("input");
var initialCount = parseInt(resultEl.data("initial-count"));
countInput.val(initialCount);
if(initialCount > 1) countInput.attr("title", "Округляется вверх до ближайшего кратного " + initialCount);
countInput.change(valueChanged);
countInput.keyup(valueChanged);
resultEl.find(".simpleCraftCalcInitialCount").text(initialCount);
resultEl.find(".simpleCraftCalcProduct").text(initialCount);
});
function valueChanged(event)
{
var countInput = $(this);
var count = parseInt(countInput.val());
if(isFinite(count) && count > 0)
{
var initialCount = parseInt(countInput.parents(".simpleCraftCalcResultCount").data("initial-count"));
var crafts = craftCount(count, initialCount);
var recipeBase = countInput.parents(".simpleCraftCalcRecipeBase");
var craftCountSpan = recipeBase.find(".simpleCraftCalcCraftCount");
craftCountSpan.text(crafts);
var productSpan = recipeBase.find(".simpleCraftCalcProduct");
productSpan.text(crafts * initialCount);
recipeBase.find(".simpleCraftCalcIngredientCount").each(function(index, element)
{
var ingSpan = $(this);
var ingInitialCount = parseInt(ingSpan.data("initial-count"));
ingSpan.text(crafts * ingInitialCount);
});
}
}
function craftCount(resultCount, initialCount)
{
return Math.ceil(resultCount / initialCount);
}
});
// Filter table
$(function() {
var pattern = [],
tbody = $(".filter-table tbody"),
trs = $("[data-stats]", tbody),
temp = { "stats": new Set() };
$.each(trs, function() {
if (typeof $(this).data('stats') != 'undefined'){
$stats = $(this).data('stats');
$stats = $stats.split(",");
$.each($stats, function(index, value) { temp.stats.add(value.trim()); });
}
});
// Adds item parameters
temp.stats.forEach(function (item) {
item = '<option value="' + item + '">' + item + '</option>';
$("#table-filters .stats").append(item);
});
var $selHideOption = $('#table-filters select'),
$opt = $('option:not(:first-child)', $selHideOption);
$("#table-filters select").each(function(i, select) {
var el = $(select);
pattern.push(select.value);
el.change(function() {
// Hides already selected options from other <select></select>
var $chosen = $selHideOption.map(function(i, el){
console.log();
return $(':selected',el);
});
var $teamId = null;
$opt.prop('disabled', false);
$chosen.each(function(i, el){0
$teamId = $(el).val();
$opt.not(el).filter(function(){
return $(this).val() == $teamId;
}).prop('disabled', true);
})
pattern[i] = select.value;
var rows = trs.hide().filter(function(i, tr) {
var data = $(tr).data("stats").split(",");
var arr = pattern.slice(0);
data.forEach(function(a) {
var i = arr.indexOf(a.trim());
if(i != -1) arr.splice(i,1);
})
return arr.every(function(txt, k) {
return txt == "Выбрать..."
})
}).show();
// Outputs the string "Items not found" if the results are "0".
if (rows.length == 0) {tbody.append("<tr><td colspan=\"3\">Предметы не найдены</td></tr>");}
})
})
});
//Filter for equipment table
//Author: Roni (Рони) Thanks to him for this script
$(function() {
var $tbody = $("#equipment-table").children("tbody");
var $trs = $("tr", $tbody).toArray();
var colCount = $("#equipment-table > thead > tr > th").length;
var temp = {
"equip": new Set(),
"stats": new Set(),
"category": ["Голова", "Доспехи", "Руки", "Ноги", "Рубаха", "Пояс", "Штаны", "Шея", "Кольцо", "Правая руки", "Левая рука", "Только для спутников"],
"role": ["Любой класс", "Клирик", "Варвар", "Чернокнижник", "Плут", "Воин", "Бард", "Паладин", "Следопыт", "Волшебник"],
};
$.each($trs, function() {
if (typeof $(this).data('equip') != 'undefined'){
$equip = $(this).data('equip');
temp.equip.add($equip);
}
if (typeof $(this).data('stats') != 'undefined'){
$stats = $(this).data('stats');
$stats = $stats.split(",");
$.each($stats, function(index, value) { temp.stats.add(value.trim()); });
}
});
// Adds equip bonus
Array.from(temp.equip).sort().forEach(function (item) {
item = '<option value="' + item + '">' + item + '</option>'
$("#settings .equip").append(item);
});
// Adds item parameters
temp.stats.forEach(function (item) {
item = "<label class=\"checkbox\" value='" + item + "'><input type='checkbox' name='" + item + "'>" + item + "</label>";
$("#settings .stats").append(item);
});
// Adds item role
temp.role.forEach(function (item) {
item = '<option value="' + item + '">' + item + '</option>';
$("#settings .role").append(item);
});
// Adds item categories to the dropdown list
temp.category.forEach(function (item) {
item = '<option value="' + item + '">' + item + '</option>';
$("#settings .category").append(item);
});
item = '<option value="Обычный">Обычный</option><option value="Необычный">Необычный</option><option value="Редкий">Редкий</option><option value="Эпический">Эпический</option><option value="Легендарный">Легендарный</option><option value="Мифический">Мифический</option>';
$("#settings .quality").append(item);
//Limit on the number of selected parameters
$('#settings .stats input[type=checkbox]').change(function(){
if($('#settings .stats input[type=checkbox]:checked').length >= 3){
$('#settings .stats input[type=checkbox]:not(:checked)').prop('disabled', true);
} else{
$('#settings .stats input[type=checkbox]:disabled').prop('disabled', false);
}
});
// Main search script
$('#settings').on('input', function() {
// Search by parameters
var pattern = [], trs = $("[data-stats]", $tbody), el;
$("#settings .stats :checked").each(function(i, checked) {
el = $(checked);
pattern.push(checked.name);
})
var rows = trs.hide().filter(function(i, tr) {
var data = $(tr).data("stats").split(",");
var arr = pattern.slice(0);
data.forEach(function(a) {
var i = arr.indexOf(a.trim());
if(i != -1) arr.splice(i,1);
})
return arr.every(function(txt, k) {
return txt == ""
})
}).show();
// Outputs the string "Items not found" if the results are "0".
if (rows.length === 0) {$tbody.append("<tr><td colspan=" + colCount + ">Предметы не найдены</td></tr>");}
$.each($trs, function(index, tr) {
//ECMAScript 6
//let {subject, level, category, quality, role, stats} = $(tr).data();
var $subject = $(tr).data('subject').toLowerCase(), $quality = $(tr).data('quality'), $level = $(tr).data('level');
// Search by equip
if (typeof $(this).data('equip') != 'undefined'){
$equip = $(this).data('equip');
$equip = $equip.toLowerCase().split(",");
var $txt = $("#settings .equip").val().toLowerCase();
$equip = $equip.some(function (e) {
return e.trim() == $txt;
});
if ($txt !== "все" && !$equip) {
$(tr).hide();
return;
}
}
// Search by class
if (typeof $(this).data('role') != 'undefined'){
$role = $(this).data('role');
$role = $role.toLowerCase().split(",");
var $txt = $("#settings .role").val().toLowerCase();
$role = $role.some(function (e) {
return e.trim() == $txt;
});
if ($txt !== "любой класс" && !$role) {
$(tr).hide();
return;
}
}
// Search by category
if (typeof $(this).data('category') != 'undefined'){
$category = $(this).data('category');
$category = $category.toLowerCase().split(",");
var $txt = $("#settings .category").val().toLowerCase();
$category = $category.some(function (e) {
return e.trim() == $txt;
});
if ($txt !== "все" && !$category) {
$(tr).hide();
return;
}
}
// Search by quality
if (typeof $(this).data('quality') != 'undefined'){
var $txt = $("#settings .quality").val().toLowerCase();
if ($txt !== "любое качество" && $txt !== $quality.toLowerCase()) {
$(tr).hide();
return;
}
}
// Search by name
var $search = $("[name='search']").val().toLowerCase();
if ($subject.includes($search) == false) {
$(tr).hide();
return;
}
// Search by minimum level
var $min = $("[name='min']").val();
if ($min && $level < +$min) {
$(tr).hide();
return;
}
// Search by max level
var $max =$("[name='max']").val();
if ($max && $level > +$max) {
$(tr).hide();
return;
}
});
// Outputs the string "Items not found" if the results are "0".
//ECMAScript 6
//if ($tbody.children().length === 0) {$tbody.append(`<tr><td colspan="${colCount}" style="text-align: center;">Предметы не найдены</td></tr>`);}
if ($("#equipment-table > tbody > tr:visible").length === 0) {$tbody.append('<tr id="last"><td colspan=\"' + colCount + '\" style="text-align: center;">Предметы не найдены</td></tr>');
}else{$("#equipment-table > tbody > tr#last").remove(); }
})
});