MediaWiki:Common.js

Материал из ArcheAge
Перейти к: навигация, поиск

Замечание. Возможно, после сохранения вам придётся очистить кэш своего браузера, чтобы увидеть изменения.

  • Firefox / Safari: Удерживая клавишу Shift, нажмите на панели инструментов Обновить либо нажмите Ctrl-F5 или Ctrl-R (⌘-R на Mac)
  • Google Chrome: Нажмите Ctrl-Shift-R (⌘-Shift-R на Mac)
  • Internet Explorer: Удерживая Ctrl, нажмите Обновить либо нажмите Ctrl-F5
  • Opera: Выберите очистку кэша в меню Инструменты → Настройки
/* Размещённый здесь код JavaScript будет загружаться пользователям при обращении к каждой странице */
/* selectTextOnClick */
$(function()
{
  jQuery.fn.selectText = function()
  {
    var doc = document;
    var element = this[0];
    if(doc.body.createTextRange)
    {
      var range = document.body.createTextRange();
      range.moveToElementText(element);
      range.select();
    } else if(window.getSelection)
    {
      var selection = window.getSelection();
      var range = document.createRange();
      range.selectNodeContents(element);
      selection.removeAllRanges();
      selection.addRange(range);
    }
  }
  $(".selectTextOnClick").click(function()
  {
    $(this).selectText();
  });
});

/* Interactive map */
$(function()
{
  var mapDialog = null;
  var blocks = $(".interactiveMapBlock");
  if(blocks.length > 0) mw.loader.load('jquery.ui.dialog');
  blocks.each(function(blockIndex, blockElement)
  {
    var block = $(blockElement);
    var innerBlock = block.find(".interactiveMapInnerBlock");
    var container = block.find(".interactiveMapContainer");
    var link = container.data("link");
    var mapFrame = $('<iframe src="http://aadb.info/map/?link=' + link +
        '&action=frame&logo=no" width="360" height="270"></iframe>');
    container.empty();
    container.append(mapFrame);

    var enlargeLink = $('<a href="#">' +
        '<img src="http://aa.mail.ru/wiki/images/4/41/Увеличить.png" width="16" height="16" /> Увеличить карту</a>');
    var enlargeLinkDiv = $('<div style="text-align: right;"></div>')
    enlargeLinkDiv.append(enlargeLink)
    innerBlock.append(enlargeLinkDiv);

    if(mapDialog == null)
    {
      mapDialog = $('<div id="interactiveMapDialog" title="Карта"></div>');
      $(document.body).append(mapDialog);
      $('.ui-widget-overlay').live("click",function(){
        mapDialog.dialog("close");
      });
    }

    enlargeLink.on('click', function(event)
    {
      var win = $(window);
      mw.loader.using('jquery.ui.dialog', function()
      {
        mapDialog.empty();
        var mapDialogWidth = (win.width() - 170)
        var largeMapFrame = $('<iframe src="http://aadb.info/map/?link=' + link +
            '&action=frame&logo=no" width="' + mapDialogWidth + '" height="' + (win.height() - 170) +
            '"></iframe>');
        mapDialog.append(largeMapFrame);
        mapDialog.dialog({
          width: mapDialogWidth + 35,
          modal: true,
          resizable: false
        })
      });
      return false;
    });
  });

});

/* Simple craft calculator */

$(function()
{
  var resultCountInput = '<input type="text" size="4" maxlength="4"/>';
  $(".simpleCraftCalcResultCount").empty().append(resultCountInput);
  var craftCountSpans = ' (<span class="simpleCraftCalcCraftCount">1</span> &times; ' +
      '<span class="simpleCraftCalcInitialCount">1</span> = <span class="simpleCraftCalcProduct">1</span>) <sup>' +
      '<abbr title="Кол-во крафтов &times; кол-во предметов, изготавливаемых за 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);
  }
});


/* Item stat calc */
var ITEM_RARITY = {
  0: {
    "color": "#949293",
    "name": "Бесполезный предмет",
    "dps": 0.8,
    "stat": 0.8
  },
  1: {
    "color": "#000000",
    "name": "Обычный предмет",
    "dps": 1,
    "stat": 1
  },
  2: {
    "color": "#77b064",
    "name": "Необычный предмет",
    "dps": 1.05,
    "stat": 1.08
  },
  3: {
    "color": "#558fd7",
    "name": "Редкий предмет",
    "dps": 1.1,
    "stat": 1.16
  },
  4: {
    "color": "#cb72d8",
    "name": "Уникальный предмет",
    "dps": 1.15,
    "stat": 1.24
  },
  5: {
    "color": "#d78b06",
    "name": "Эпический предмет",
    "dps": 1.2,
    "stat": 1.32
  },
  6: {
    "color": "#e17853",
    "name": "Легендарный предмет",
    "dps": 1.25,
    "stat": 1.4
  },
  7: {
    "color": "#f95252",
    "name": "Реликвия",
    "dps": 1.35,
    "stat": 1.5
  },
  8: {
    "color": "#cf7d5d",
    "name": "Предмет эпохи чудес",
    "dps": 1.45,
    "stat": 1.6
  },
  9: {
    "color": "#8fa5ca",
    "name": "Предмет эпохи сказаний",
    "dps": 1.55,
    "stat": 1.7
  },
  10: {
    "color": "#bf7900",
    "name": "Предмет эпохи легенд",
    "dps": 1.65,
    "stat": 1.8
  },
  11: {
    "color": "#c90b0b",
    "name": "Предмет эпохи мифов",
    "dps": 1.75,
    "stat": 1.9
  },
  100: {
    "color": "#000000",
    "name": "Нет",
    "dps": 0,
    "stat": 0
  }
};

var Collections = {
  find: function(collection, closure) {
    var result = null;
    $.each(collection, function(index, it)
    {
      if(closure(it))
      {
        result = it;
        return false;
      }
    });
    return result;
  },
  sum: function(collection, closure) {
    if(closure == null) closure = function(it)
    {
      return it;
    }
    var sum = 0;
    $.each(collection, function(index, it)
    {
      sum += closure(it);
    });
    return sum;
  }
}

function ItemStatCalcBase(itemBlock, rarityContainerSelector)
{
  var self = this;

  this.recalcStats = function(rarityIndex)
  {
  };

  var block = itemBlock;
  this.block = block;

  var selectContainer = block.find(rarityContainerSelector);
  var select = $('<select class="itemStatCalcRaritySelect" style="color:#000000;"></select>');
  $.each(ITEM_RARITY, function(rarityIndex, rarity)
  {
    var option = $('<option></option>').attr("value", rarityIndex).text(rarity.name).css("color", rarity.color);
    select.append(option);
  })
  this.select = select;
  selectContainer.append(select);

  var initialRarityIndex = findRarityIndexByName(selectContainer.data("initial-rarity"));
  select.val(initialRarityIndex);

  select.on('change', function(event)
  {
    var rarityIndex = $(this).val();
    self.updateSelectedColor(rarityIndex);
    self.recalcStats(rarityIndex);
  })

  this.init = function()
  {
    this.updateSelectedColor(initialRarityIndex);
    this.recalcStats(initialRarityIndex);
  }

  this.setRarityIndex = function(rarityIndex)
  {
    select.val(rarityIndex);
    self.updateSelectedColor(rarityIndex);
    self.recalcStats(rarityIndex);
  }

  function findRarityIndexByName(name)
  {
    var result = 1;
    $.each(ITEM_RARITY, function(rarityIndex, rarity)
    {
      if(rarity.name == name)
      {
        result = rarityIndex;
        return false;
      }
    })
    return result;
  }

  this.updateSelectedColor = function(rarityIndex)
  {
    select.css("color", ITEM_RARITY[rarityIndex].color);
  }

  this.formatValue = function(value, dataType)
  {
    var result;

    if(dataType == "double")
    {
      result = value.toFixed(1);
    } else
    {
      result = value.toFixed(0);
    }
    return result;
  }

  this.makeCalculatedValue = function(value, dataType)
  {
    var result;

    if(dataType == "double")
    {
      result = value;
    } else
    {
      result = Math.round(value);
    }
    return result;
  }
}

function ItemStatCalcItem(itemBlock, rarityContainerSelector)
{
  var self = this;
  var superObj = new ItemStatCalcBase(itemBlock, rarityContainerSelector);

  superObj.recalcStats = function(rarityIndex)
  {
    var rarity = ITEM_RARITY[rarityIndex];
    var dpsStats = self.block.find(".itemStatCalcDps");
    var dpsMultiplier = rarity.dps;
    dpsStats.each(function(index, element)
    {
      var el = $(element);
      var baseValue = parseFloat(el.data("base-value"));
      var value = baseValue * dpsMultiplier;
      var dataType = el.data("type");
      var resultValueString = self.formatValue(value, dataType);
      el.data("calculatedValue", self.makeCalculatedValue(value, dataType));
      el.text(resultValueString);
    })

    var statMultiplier = rarity.stat;
    var baseStats = self.block.find(".itemStatCalcBaseStat");
    var statsSum = 0;
    var ratioSum = 0;
    baseStats.each(function(index, element)
    {
      var el = $(element);
      var baseValue = parseFloat(el.data("base-value"));
      statsSum += baseValue;
      var ratio = parseInt(el.data("ratio"));
      ratioSum += ratio;
    })
    statsSum *= statMultiplier;
    baseStats.each(function(index, element)
    {
      var el = $(element);
      var ratio = parseInt(el.data("ratio"));
      var value = statsSum * ratio / ratioSum;
      var dataType = el.data("type");
      var resultValueString = self.formatValue(value, dataType);
      el.data("calculatedValue", self.makeCalculatedValue(value, dataType));
      el.text(resultValueString);
    })

    var extraStats = self.block.find(".itemStatCalcExtraStat");
    extraStats.each(function(index, element)
    {
      var el = $(element);
      var baseValue = parseFloat(el.data("base-value"));
      var value = baseValue * statMultiplier;
      var dataType = el.data("type");
      var resultValueString = self.formatValue(value, dataType);
      el.text(resultValueString);
    })

  }

  $.extend(this, superObj);
  self.init();
}

function ItemStatCalcSet(itemBlocks, sumItem, rarityContainerSelector)
{
  var ITEM_SET_SUMMED_STAT_NAMES = ["pdef", "mdef", "str", "dex", "sta", "int", "spi"];

  var self = this;
  var superObj = new ItemStatCalcBase(sumItem, rarityContainerSelector);

  var items = itemBlocks.map(function() {
    return new ItemStatCalcItem($(this), rarityContainerSelector);
  });
  var itemSelects = items.map(function() {
    return this.select;
  })

  superObj.recalcStats = function(rarityIndex)
  {
    items.each(function(index, it) {
      it.setRarityIndex(rarityIndex);
    });
    recalcSum();
  }

  $.extend(this, superObj);
  self.init();

  itemSelects.each(function(index, it) {
    $(it).on('change', recalcSum);
  });

  function recalcSum()
  {
    $.each(ITEM_SET_SUMMED_STAT_NAMES, function(index, statName) {
      var statValues = items.map(function() {
        var v = 0;
        var el = findElementByStatName(this.block, statName);
        if(el)
        {
          var elValue = $(el).data("calculatedValue");
          if(isFinite(elValue)) v = elValue;
        }
        return v;
      })
      var sum = Collections.sum(statValues);
      var sumEl = $(findElementByStatName(self.block, statName));
      if(sumEl)
      {
        sumEl.text(self.formatValue(sum));
        var sumRow = sumEl.parents(".itemSetStatCalcStatSumRow");
        sumRow.css("display", sum > 0 ? "block" : "none");
      }
    })
  }

  function findElementByStatName(item, statName)
  {
    return Collections.find(item.find(".itemStatCalcDps, .itemStatCalcBaseStat"), function(el) {
      return $(el).data("stat-name") == statName;
    });
  }
}

$(function()
{
  if($(".itemStatCalcBlock").length > 0) new ItemStatCalcItem($(".itemStatCalcBlock"),
      ".itemStatCalcRaritySelectContainer");
  if($(".itemSetStatCalcBlock").length > 0) new ItemStatCalcSet($(".itemSetStatCalcBlock .itemSetStatCalcItem"),
      $(".itemSetStatCalcSum"), ".itemSetStatCalcRaritySelectContainer");
});

/* Editor toolbar customization */
var customizeToolbar = function()
{
  //item icon
  $('#wpTextbox1').wikiEditor('addToToolbar', {
    'section': 'main',
    'group': 'insert',
    'tools': {
      'itemIcon': {
        label: 'Иконка предмета',
        type: 'button',
        icon: '//aa.mail.ru/wiki/images/a/aa/Иконка_предмета_кнопка.png',
        action: {
          type: 'encapsulate',
          options: {
            pre: "{{иконка предмета|",
            peri: "",
            post: "}}"
          }
        }
      }
    }
  });
};
/* Check if view is in edit mode and that the required modules are available. Then, customize the toolbar . . . */
if($.inArray(mw.config.get('wgAction'), ['edit', 'submit']) !== -1)
{
  mw.loader.using('user.options', function()
  {
    if(mw.user.options.get('usebetatoolbar'))
    {
      mw.loader.using('ext.wikiEditor.toolbar', function()
      {
        $(document).ready(customizeToolbar);
      });
    }
  });
}
// Add the customizations to LiquidThreads' edit toolbar, if available
mw.hook('ext.lqt.textareaCreated').add(customizeToolbar);